| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 | <?phpnamespace addons\exam\controller;use addons\exam\library\CacheService;use addons\exam\library\WechatService;use addons\exam\model\UserInfoModel;use addons\exam\model\UserModel;use app\common\library\Token;use think\Validate;/** * 会员接口 */class User extends Base{    protected $noNeedLogin = ['login', 'userLogin', 'register'];    protected $noNeedRight = '*';    protected $visibleFields = ['id', 'avatar', 'gender', 'nickname', 'mobile', 'birthday', 'status', 'createtime', 'logintime'];    /**     * 授权登录     * @ApiMethod   (POST)     * @param string $code     授权code     * @param string $userInfo 授权后拿到的用户信息     */    public function login()    {        $user_info    = input('userInfo/a', []);        $code         = input('code/s', '');        $from_user_id = input('from_user_id/d', 0);        if (!$code) {            fail('缺少小程序参数code');        }        if (!$user_info) {            fail('缺少小程序参数userInfo');        }        $service     = new WechatService();        $wechat_user = $service->miniLogin($code);        if (!isset($wechat_user['openid'])) {            fail('获取小程序用户信息失败');        }        $open_id     = $wechat_user['openid'];        $session_key = $wechat_user['session_key'] ?? '';        $user = UserModel::get(['username' => $open_id]);        if (empty($user)) {            $user = UserModel::fastRegister($open_id, $user_info['nickName'] ?? '', $user_info['avatarUrl'] ?? '', $user_info['gender'] ?? 0);            if (!$user) {                fail('注册用户失败');            }        } else {            $data = [                // 'nickname'  => $user_info['nickName'],                // 'avatar'    => $user_info['avatarUrl'],                'logintime' => time(),            ];            // if (!$user->parent_id) {            //     $data['parent_id'] = $from_user_id;            // }            $user->isUpdate(true)->save($data);        }        // 记录session_key,用于后续获取手机号码等功能        CacheService::setWechatUserSessionKey($user->id, $session_key);        // 清除之前的token        Token::clear($user->id);        // 直接登录        $this->auth->direct($user->id);        // 用户扩展信息        $info = UserInfoModel::getUserInfo($user->id);        $this->success('', [            'token' => $this->auth->getToken(),            'user'  => array_merge($user->only($this->visibleFields), ['info' => $info->toArray()]),        ]);    }    /**     * 用户信息     */    public function info()    {        $user         = $this->auth->getUser()->visible($this->visibleFields)->toArray();        $user['info'] = UserInfoModel::getUserInfo($this->auth->id);        $this->success('', $user);    }    /**     * 获取微信绑定的手机号码     */    public function getWechatPhone()    {        $iv            = input('iv/s', '');        $encryptedData = input('encryptedData/s', '');        if (!$iv) {            fail('缺少小程序参数iv');        }        if (!$encryptedData) {            fail('缺少小程序参数encryptedData');        }        if (!$session_key = CacheService::getWechatUserSessionKey($this->auth->id)) {            fail('微信sessionKey丢失,请重新登录再试');        }        // try {        $service = new WechatService();        $data    = $service->decryptedData($session_key, $iv, $encryptedData);        succ($data);        // } catch (\Exception $exception) {        //     fail('sessionKey失效,请重新登录再试:' . $exception->getMessage());        // }    }    /**     * 保存个人信息     */    public function save()    {        $update_fields = ['avatar', 'nickname', 'mobile', 'gender', 'birthday'];        $data          = ['updatetime' => time()];        foreach ($update_fields as $field) {            $value = input("{$field}/s", '');            if ($value !== '') {                $data[$field] = $value;            }        }        $user = $this->auth->getUser();        if ($user->save($data)) {            succ(['user' => $user->visible($this->visibleFields)]);        }        fail('保存失败,请重试');    }    /**     * 账号密码注册     */    public function register()    {        if (!$username = input('username/s')) {            fail('请填写登录账号');        }        if (!$password = input('password/s')) {            fail('请填写登录密码');        }        if (!$nickname = input('nickname/s')) {            fail('请填写昵称');        }        if (!$mobile = input('mobile/s')) {            fail('请填写手机号码');        }        if ($mobile && !Validate::regex($mobile, "^1\d{10}$")) {            fail(__('Mobile is incorrect'));        }        $gender = input('gender/d', 1);        // 注册        $user = UserModel::fastRegister($username, $nickname, '', $gender, $password, $mobile);        // 用户扩展信息        $info = UserInfoModel::getUserInfo($user->id);        // 接口层登录        $this->auth->direct($user->id);        succ([            'user'  => array_merge($user->only($this->visibleFields), ['info' => $info->toArray()]),            'token' => $this->auth->getToken()        ]);    }    /**     * 账号密码登录     */    public function userLogin()    {        if (!$username = input('username/s')) {            fail('请填写登录账号');        }        if (!$password = input('password/s')) {            fail('请填写登录密码');        }        if (!$username || !$password) {            $this->error(__('Invalid parameters'));        }        $user = UserModel::get(['username' => $username]);        if (!$user) {            fail('登录失败,账号或密码错误');        }        if ($user->password != $this->auth->getEncryptPassword($password, $user->salt)) {            fail('登录失败,账号或密码错误');        }        if ($user->status != 1) {            fail('登录失败,账号已被禁用登录');        }        // 用户扩展信息        $info = UserInfoModel::getUserInfo($user->id);        // 接口层登录        $this->auth->direct($user->id);        succ([            'user'  => array_merge($user->only($this->visibleFields), ['info' => $info->toArray()]),            'token' => $this->auth->getToken()        ]);    }    /**     * 保存用户常用题库设置     */    // public function saveMyCate()    // {    //     if (!$cate_id = input('cate_id/d', 0)) {    //         fail('请选择常用题库类型');    //     }    //     if (!$cate = CateModel::get($cate_id)) {    //         fail('题库类型不存在,请重新选择');    //     }    //    //     $cate_ids   = [$cate['id']];    //     $cate_names = [$cate['name']];    //    //     // 上级    //     if ($cateParent1 = CateModel::where('id', $cate['parent_id'])->find()) {    //         array_unshift($cate_ids, $cateParent1['id']);    //         array_unshift($cate_names, $cateParent1['name']);    //    //         // 上上级    //         if ($cateParent2 = CateModel::where('id', $cateParent1['parent_id'])->find()) {    //             array_unshift($cate_ids, $cateParent2['id']);    //             array_unshift($cate_names, $cateParent2['name']);    //         }    //     }    //    //     $info                     = UserInfoModel::getUserInfo($this->auth->id);    //     $info->default_cate_ids   = $cate_ids;    //     $info->default_cate_names = $cate_names;    //    //     if ($info->save()) {    //         succ($info->toArray());    //     }    //    //     fail('保存失败,请重试');    // }}
 |