Profile.php 3.8 KB
<?php
declare(strict_types=1);

namespace app\controller\api;

use app\BaseController;
use app\service\AuthContext;
use think\facade\Db;

class Profile extends BaseController
{
    public function get()
    {
        $u = AuthContext::mpUser();
        if (!$u) {
            return json(['code' => 401, 'msg' => '未授权', 'data' => []]);
        }

        return json([
            'code' => 0,
            'msg'  => 'ok',
            'data' => [
                'nickname'  => $u['nickname'],
                'avatarUrl' => $u['avatar'],
                'bio'       => $u['bio'],
                'gender'    => (int) $u['gender'],
                'phone'     => trim((string) ($u['phone'] ?? '')),
            ],
        ]);
    }

    public function save()
    {
        $u = AuthContext::mpUser();
        if (!$u) {
            return json(['code' => 401, 'msg' => '未授权', 'data' => []]);
        }

        $nickname = trim((string) $this->request->param('nickname', ''));
        $avatar   = trim((string) $this->request->param('avatarUrl', ''));
        $bio      = trim((string) $this->request->param('bio', ''));
        $gender   = $this->request->param('gender', 0);

        if ($nickname !== '' && mb_strlen($nickname) > 32) {
            return json(['code' => 400, 'msg' => '昵称过长', 'data' => []]);
        }
        if (mb_strlen($bio) > 200) {
            return json(['code' => 400, 'msg' => '简介过长', 'data' => []]);
        }

        $data = ['update_time' => date('Y-m-d H:i:s')];
        if ($nickname !== '') {
            $data['nickname'] = $nickname;
        }
        if ($this->request->has('avatarUrl')) {
            $data['avatar'] = $avatar;
        }
        if ($this->request->has('bio')) {
            $data['bio'] = $bio;
        }
        if ($this->request->has('gender')) {
            $data['gender'] = (int) $gender;
        }

        Db::name('mp_user')->where('id', $u['id'])->update($data);

        return json(['code' => 0, 'msg' => '已保存', 'data' => []]);
    }

    public function myWorks()
    {
        $u = AuthContext::mpUser();
        if (!$u) {
            return json(['code' => 401, 'msg' => '未授权', 'data' => []]);
        }

        $rows = Db::name('work')
            ->where('user_id', (int) $u['id'])
            ->order('id', 'desc')
            ->select()
            ->toArray();

        $list = [];
        foreach ($rows as $w) {
            $st = strtolower(trim((string) ($w['status'] ?? '')));
            $apiSt = match ($st) {
                'approved' => 'approved',
                'rejected' => 'rejected',
                default    => 'pending',
            };
            $list[] = [
                'id'            => (int) $w['id'],
                'imageUrl'      => $w['cover_image'],
                'title'         => $w['title'],
                'likes'         => (int) $w['likes_count'],
                'status'        => $apiSt,
                'rejectReason'  => $st === 'rejected' ? trim((string) ($w['reject_reason'] ?? '')) : '',
                'publishedAt'   => $w['publish_date'] ?: date('Y-m-d', strtotime((string) $w['create_time'])),
            ];
        }

        return json(['code' => 0, 'msg' => 'ok', 'data' => ['list' => $list]]);
    }

    public function stats()
    {
        $u = AuthContext::mpUser();
        if (!$u) {
            return json(['code' => 401, 'msg' => '未授权', 'data' => []]);
        }

        $uid = (int) $u['id'];

        $photos = Db::name('work')->where('user_id', $uid)->count();
        $likes  = (int) Db::name('work')->where('user_id', $uid)->where('status', 'approved')->sum('likes_count');

        return json([
            'code' => 0,
            'msg'  => 'ok',
            'data' => [
                'photos' => $photos,
                'likes'  => $likes,
            ],
        ]);
    }
}