架构问题
上一篇【【vue2.7.16系列】手把手教你搭建后台系统__登录接口调通(8)】虽然把登录接口调通了,但是还有许多需要改进的地方。比如view/admin
每次调接口都要打包(跨域问题,对本地开发不友好),账号密码校验,密码hash,返回管理员信息token,dao层设置的model
每次去处理数据都要去实例化等等,我们一个一个去优化下。
解决跨域问题
只需要在view/admin
目录下vue.config.js
中配置代理来实现接口的转发。
devServer: {open: true,proxy: 'http://xkadmin.com'
}// 注意,在src/utils/request.js中修改基础路径
const instance = axios.create({// 设置默认的基础URLbaseURL: '/adminapi',timeout: 5000,
});
账号密码校验
这里需要打开验证器官方手册。然后在adminapi
应用目录下添加validate/system/SystemAdminValidate.php
文件,内容如下:
<?phpnamespace app\adminapi\validate\system;use think\Validate;class SystemAdminValidate extends Validate
{/*** 定义验证规则* 格式:'字段名' => ['规则1','规则2'...]* @var array*/protected $rule = ['account' => ['require', 'alphaDash'],'conf_pwd' => 'require','pwd' => 'require','real_name' => 'require','roles' => ['require', 'array'],];/*** 定义错误信息* 格式:'字段名.规则名' => '错误信息'* @var array*/protected $message = ['account.require' => '请填写管理员账号','account.alphaDash' => '管理员账号只能是字母、数字和下划线_及破折号-','conf_pwd.require' => '请输入确认密码','pwd.require' => '请输入密码','real_name.require' => '请输管理员姓名','roles.require' => '请选择管理员身份','roles.array' => '身份必须为数组',];protected $scene = ['get' => ['account', 'pwd'],'update' => ['account', 'roles'],];
}
?>
然后在控制器Login.php
的login
方法中验证参数
public function login(){$account = $this->request->post('username');$password = $this->request->post('password');// 验证参数validate(\app\adminapi\validate\system\SystemAdminValidate::class)->scene('get')->check(['account' => $account,'pwd' => $password]);return json($this->services->login($account, $password, 'admin'));}
添加这之后,username输入admin@
后,点击登录后,如下图所示:
如果没有任何响应,可以设置项目跟目录下的.env
文件中的app_debug
字段为false
。
或者可以使用异常处理接管,直接接管验证不通过抛出的错误信息,然后json
响应,在app
目录下的ExceptionHandle.php
文件中的render方法中添加自定义异常处理机制:
/*** Render an exception into an HTTP response.** @access public* @param \think\Request $request* @param Throwable $e* @return Response*/public function render($request, Throwable $e): Response{// 添加自定义异常处理机制if ($e instanceof ValidateException) {return json(['code' => $e->getCode(), 'message' => $e->getMessage()]);}// 其他错误交给系统处理return parent::render($request, $e);}
密码hash
一般我们数据库中是不允许存储明文密码的,因此我们需要做加密处理。我们使用PHP系统函数password_hash
进行密码处理。先更改数据库中存储的明文密码。
在SystemAdminServices
中
// 这里如果不对用户输入的密码做hash处理,再与数据库中存储的密码进行比对,会抛出错误。
if ($password !== $adminInfo->pwd) {throw new AdminException('账号或密码错误,请重新输入');
}// 修改后
if (!password_verify($password, $adminInfo->pwd)) {throw new AdminException('账号或密码错误,请重新输入');
}
还有一点需要注意的,就是自定义异常处理机制需要调整
,已确保前端接收到的错误是json
数据,可以很好处理。
/*** Render an exception into an HTTP response.** @access public* @param \think\Request $request* @param Throwable $e* @return Response*/public function render($request, Throwable $e): Response{// 添加自定义异常处理机制if ($e instanceof ValidateException) {return json(['code' => $e->getCode(), 'msg' => $e->getMessage()]);}if ($e instanceof AdminException) {return json(['code' => $e->getCode(), 'msg' => $e->getMessage()]);}// 其他错误交给系统处理return parent::render($request, $e);}
返回管理员信息token
未完…