From 7b3d8135e87418017576a56bbb21f1aa0bb14b37 Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Thu, 2 Jan 2025 18:10:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/v1/Login.php | 78 ++++++++++++------- app/admin/exception/InvalidLoginException.php | 10 +++ app/admin/model/v1/UserLoginLogModel.php | 29 +++++++ app/common.php | 6 +- 4 files changed, 92 insertions(+), 31 deletions(-) create mode 100644 app/admin/exception/InvalidLoginException.php create mode 100644 app/admin/model/v1/UserLoginLogModel.php 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); }