| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | <?phpnamespace app\api\controller\inspection;use app\common\Enum\UserEnum;use app\common\library\Sms;use think\Env;use app\api\controller\inspection\Base;use app\common\Enum\StatusEnum;use app\common\Service\InspectionService;use app\common\model\inspection\InspectionApplication;use app\common\Service\SupplierService;use app\common\model\User as UserModel;/** * 会员 */class User extends Base{    protected $noNeedLogin = ['mobilelogin'];    public function _initialize()    {        parent::_initialize();    }       /**     * 手机验证码登录     *     * @param string $mobile 手机号     * @param string $captcha 验证码     */    public function mobilelogin()    {        $params = $this->request->param();        $mobile = $params['mobile'] ?? '';        $captcha = $params['captcha'] ?? '';        // 验证器        $validate = new \app\api\validate\User();        if (!$validate->check($params, [], 'mobilelogin')) {            $this->error($validate->getError());        }        // 这里需要处理 测试环境 env('app_debug') 为 true 时,不进行验证码验证 校验 验证码固定为env的配置 DEFAULT_SMSCODE: 123456        if (!Env::get('app.app_debug') && $captcha != Env::get('app.DEFAULT_SMSCODE')) {            if (!Sms::check($mobile, $captcha, 'mobilelogin')) {                $this->error(__('Captcha is incorrect'));            }        }        $user = UserModel::getByMobile($mobile);        if(!$user){            $this->error(__('Account does not exist'));        }        if ($user) {            if ($user->status != StatusEnum::ENABLED) {                $this->error(__('Account is locked'));            }            $isInspection = InspectionService::getUserApplication($user->id);            if (!$isInspection) {            $this->error('您不是审核员');            }            //  验证是否 通过            if ($isInspection->audit_status !== InspectionApplication::AUDIT_STATUS_PASSED) {            $this->error('您的验货员申请未通过');            }             // 验证是否 绑定供应商            if (!$isInspection->supplier_id) {                $this->error('您未绑定供应商');            }            //如果已经有账号则直接登录            $ret = $this->auth->direct($user->id);        }           if ($ret) {            Sms::flush($mobile, 'mobilelogin');            $user = $this->auth->getUserinfo();            $user['avatar'] = cdnurl($user['avatar'], true);            $data = ['token' => $this->auth->getToken(), 'user' => $user];            $this->success(__('Logged in successful'), $data);        } else {            $this->error($this->auth->getError());        }    }    /**     * 个人中心     */    public function index()    {        $info = $this->auth->getUserInfo();        $info['avatar'] = cdnurl($info['avatar'], true);        $info['gender_text'] = UserEnum::getGenderText($this->auth->getUser()->gender ?? 0);        $info['age'] = $this->auth->getUser()->age ?? 0;        //查询验货员申请信息        $inspectionApplication = InspectionService::getUserApplication($this->auth->id);        $info['inspection_application'] = $inspectionApplication;        $info['supplier'] = null;        // 查询供应商信息        $supplierId = $this->application->supplier_id;        if($supplierId){            // 查询供应商信息            $supplier = SupplierService::getFactoryById($supplierId);            $info['supplier'] = $supplier;        }        $this->success('', $info);    }    /**     * 个人资料     */    public function profile()    {        $user = $this->auth->getUser();        $params = $this->request->param();                // 只处理实际传递的参数        $updateData = [];                // 处理用户名        if (isset($params['username']) && $params['username'] !== '') {            $username = $params['username'];            // 检查用户名是否已存在            $exists = UserModel::where('username', $username)->where('id', '<>', $this->auth->id)->find();            if ($exists) {                $this->error(__('Username already exists'));            }            $updateData['username'] = $username;        }                // 处理头像        if (isset($params['avatar'])) {            $avatar = $params['avatar'];            // 替换有域名的头像            $avatar = str_replace(cdnurl('', true), '', $avatar);            $updateData['avatar'] = $avatar;        }                // 处理昵称        if (isset($params['nickname'])) {            $updateData['nickname'] = $params['nickname'];        }                // 处理个人简介        if (isset($params['bio'])) {            $updateData['bio'] = $params['bio'];        }                // 处理年龄        if (isset($params['age'])) {            $updateData['age'] = $params['age'];        }                // 处理性别        if (isset($params['gender'])) {            $updateData['gender'] = $params['gender'];        }                // 如果没有任何要更新的数据        if (empty($updateData)) {            $this->error('没有要更新的数据');        }                // 验证器 - 只验证传递的参数        $validate = new \app\api\validate\inspection\User();        $validateParams = array_merge($params, isset($updateData['avatar']) ? ['avatar' => $updateData['avatar']] : []);        if (!$validate->check($validateParams, [], 'profile')) {            $this->error($validate->getError());        }                // 批量更新用户信息        foreach ($updateData as $field => $value) {            $user->$field = $value;        }        $user->save();        $this->success('修改成功!');    }    /**     * 保存头像     */    public function avatar()    {        $user = $this->auth->getUser();        $avatar = $this->request->post('avatar');        if (!$avatar) {            $this->error("头像不能为空");        }        $avatar = str_replace(cdnurl('', true), '', $avatar);        $user->avatar = $avatar;        $user->save();        $this->success('修改成功!');    }    /**     * 注销登录     */    public function logout()    {        $this->auth->logout();        $this->success(__('Logout successful'), ['__token__' => $this->request->token()]);    }    /**     * 换绑手机号     */    public function changeMobile()    {        $params = $this->request->param();        $mobile = $params['mobile'] ?? '';        $captcha = $params['captcha'] ?? '';        // 验证器        $validate = new \app\api\validate\inspection\User();        if (!$validate->check($params, [], 'changeMobile')) {            $this->error($validate->getError());        }        $user = $this->auth->getUser();        if ($user->mobile == $mobile) {            $this->error(__('手机号不能与当前手机号相同'));        }        // 换绑手机号        $user = UserModel::getByMobile($mobile);        if ($user) {            $this->error(__('手机号已存在'));        }        if (!Env::get('app.app_debug') && $captcha != Env::get('app.DEFAULT_SMSCODE')) {            $ret = Sms::check($mobile, $captcha, 'resetpwd');            if (!$ret) {                $this->error(__('Captcha is incorrect'));            }        }        Sms::flush($mobile, 'resetpwd');        $this->auth->getUser()->save(['mobile' => $mobile]);        $this->success(__('换绑手机号成功'));    }    /**     * 修改密码     */    public function changePassword()    {        $params = $this->request->param();        $oldpassword = $params['oldpassword'] ?? '';        $newpassword = $params['newpassword'] ?? '';        $confirmpassword = $params['confirmpassword'] ?? '';                // 验证器        $validate = new \app\api\validate\inspection\User();        if (!$validate->check($params, [], 'changePassword')) {            $this->error($validate->getError());        }                $user = $this->auth->getUser();                // 验证原密码是否正确        if ($user->password != $this->auth->getEncryptPassword($oldpassword, $user->salt)) {            $this->error(__('原密码错误'));        }                // 检查新密码是否与原密码相同        if ($oldpassword === $newpassword) {            $this->error(__('新密码不能与原密码相同'));        }                // 使用 Auth 类的 changepwd 方法修改密码        $ret = $this->auth->changepwd($newpassword, $oldpassword);        if ($ret) {            $this->success(__('密码修改成功'));        } else {            $this->error($this->auth->getError());        }    }}
 |