diff --git a/app/admin/controller/v1/Login.php b/app/admin/controller/v1/Login.php index f3bb1710..64aaeabb 100644 --- a/app/admin/controller/v1/Login.php +++ b/app/admin/controller/v1/Login.php @@ -3,6 +3,9 @@ declare (strict_types = 1); namespace app\admin\controller\v1; +use apiret\Ret; +use app\admin\exception\InvalidLoginException; +use app\admin\model\v1\UserLoginLogModel; use app\admin\model\v1\UserModel; use app\admin\validate\v1\LoginValidate; use thans\jwt\facade\JWTAuth; @@ -23,38 +26,57 @@ class Login 'captcha' ]); - // 验证参数 - $validate = new LoginValidate(); - if (!$validate->check($post)) { - return error($validate->getError()); - } + $user = new UserModel(); + $msg = ''; + try { + // 验证参数 + $validate = new LoginValidate(); + if (!$validate->check($post)) { + throw new InvalidLoginException($validate->getError()); + } - // 校验验证码 - $code = Cache::get('captcha:token.' . $post['token']); - if (!$code) { - return error('验证码不存在或已过期!'); - } - Cache::delete('captcha:token.' . $post['token']); + // 校验验证码 + $code = Cache::get('captcha:token.' . $post['token']); + if (!$code) { + throw new InvalidLoginException('验证码不存在或已过期!'); + } + Cache::delete('captcha:token.' . $post['token']); - // 校验 - if (!password_verify($post['captcha'], $code)) { - return error('验证码错误!'); - } - - // 验证用户 - $user = UserModel::usernameOrMobile($post['username'])->find(); - if (!$user) { - return error('用户不存在!'); - } + // 校验 + if (!password_verify($post['captcha'], $code)) { + throw new InvalidLoginException('验证码错误!'); + } + + // 验证用户 + $user = UserModel::usernameOrMobile($post['username'])->find(); + if (!$user) { + throw new InvalidLoginException('用户不存在!'); + } - // 验证密码 - if ($user['password'] != password_with_salt($post['password'], $user['salt'])) { - return error('密码错误!'); - } + // 验证密码 + if ($user['password'] != password_with_salt($post['password'], $user['salt'])) { + throw new InvalidLoginException('密码错误!'); + } - // 验证用户状态 - if ($user['status'] == -1) { - return error('用户已禁用,请联系管理员!'); + // 验证用户状态 + if ($user['status'] == -1) { + throw new InvalidLoginException('用户已禁用,请联系管理员!'); + } + } catch (InvalidLoginException $e) { + $msg = $e->getMessage(); + return error($msg); + } catch (\Throwable $th) { + $msg = $th->getMessage(); + return error('登录失败!'); + } finally { + // 记录登录日志 + UserLoginLogModel::create([ + 'user_id' => $user['id'], + 'ip' => ip2long(request()->ip()), + 'user_agent' => request()->header('user-agent'), + 'message' => $msg, + 'status' => !$msg ? 1 : -1, + ]); } // 生成 jwt token diff --git a/app/admin/exception/InvalidLoginException.php b/app/admin/exception/InvalidLoginException.php new file mode 100644 index 00000000..7ea6c99d --- /dev/null +++ b/app/admin/exception/InvalidLoginException.php @@ -0,0 +1,10 @@ + 'int', + 'user_id' => 'int', + 'ip' => 'string', + 'user_agent' => 'string', + 'message' => 'string', + 'status' => 'int', + 'created_at' => 'datetime', + ]; +} diff --git a/app/common.php b/app/common.php index eaa9309d..24018caf 100644 --- a/app/common.php +++ b/app/common.php @@ -3,7 +3,7 @@ // 接口错误返回 if (!function_exists('error')) { - function error($msg = '', $data = []) + function error($msg = '', $data = []): \think\Response { return \apiret\Api::error($msg, $data); } @@ -12,7 +12,7 @@ if (!function_exists('error')) { // 接口成功返回 if (!function_exists('success')) { - function success($msg = '', $data = []) + function success($msg = '', $data = []): \think\Response { return \apiret\Api::success($msg, $data); } @@ -20,7 +20,7 @@ if (!function_exists('success')) { // 接口调结果返回 if (!function_exists('result')) { - function result($errno, $msg = '', $data = []) + function result($errno, $msg = '', $data = []): \think\Response { return \apiret\Api::result($errno)->message($msg)->response($data); }