ThinkPHP6.0开发:如何利用自定义验证规则实现登陆?
1.想要实现效果如图

2.ThinkPHP中的MVC
M: Model 模型层(与数据库交互的持久层)
V: View 视图层(前端html,css,js)
C: Controller 控制器层
这里可以再单独封装一层 common 公共层,用于处理公用业务,或者是封装统一返回给前端的JSON数据格式。
控制器层 的正确写法是只接受参数,然后交给Model层去处理业务;
3.登陆思路
controller层接受username,password参数,交给Model层处理,Model层先将接受的username,password交给我们的自定义验证器去验证,验证通过后返回成功登陆标志, 这个标志可以任意,登陆成功就返回1,否则返回错误消息,返回给 controller 层,controller 层简单判断这个标志后,就传递JSON数据给前端,前端利用 controller 层传递过去的JSON数据中的 url 地址进行跳转即可
4.前端发起请求
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0;"><link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.css"><link rel="stylesheet" type="text/css" href="/static/css/me.css"><script src="/static/js/jquery-3.5.1.min.js"></script><script src="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.js"></script><title>博客管理登陆</title></head><body><input id="username" type="text" name="username" placeholder="登陆用户名"><input id="password" type="password" name="password" placeholder="密码"><script>$('#loginBtn').click(function () {let username = $('#username').val();let password = $('#password').val();$.ajax({url:"{:url('admin.login/login')}",type: 'post',data: {"username":username,"password":password},dataType: 'JSON',success: function (data) {let realData = JSON.stringify(data)data=eval("("+realData+")");//通过eval将()中的字符串以json形式执行if(data.code != 1) {alert(data.msg);} else {window.location.href = data.data}},error: function (e) {window.location.href='/error/to500Page'}})})</script></body></html>
5.Common.php
// 应用公共文件//show方法封装统一返回给前端的JSON数据格式function show($code, $msg = 'error', $data = [],$httpStatus = 200){$result = ["code" => $code,"msg" => $msg,"data" => $data];return json($result,$httpStatus);}
6.LoginController.php
namespace app\controller\admin;use app\BaseController;use think\facade\Session;use think\Request;use \app\model\User;class Login extends BaseController{protected $request;public function index(){return view('admin/login');}public function toAdminIndex(){return view('admin/index');}public function logout(){Session::delete('user');return view('admin/login');}public function __construct(Request $request){$this->request = $request;$this->request->header('Content-Type:text/html; charset=utf-8');}public function login(){$user = new User();$username = $this->request->param('username');$password = $this->request->param('password');$data = ['username' => $username,'password' => $password,'dto' => ['username'=>$username,'password'=>$password], // dto 为一个数组类型];$flag = $user->login($data); // $flag != 1 则返回错误消息if($flag != 1){//show 方法在common.php 中,封装统一返回前端数据格式{"code":-1,"msg":$flag,"data":null}return show(-1,$flag,null);}//能到这一步说明验证通过,将用户信息存入 Session 中存储起来Session::set('user',$user->getUserByUserName($username));// url: '/admin.login/toAdminIndex'return show(1,'登陆成功!','/admin.login/toAdminIndex');}}
7.UserModel.php
namespace app\model;use think\exception\ValidateException;use think\facade\Db;use think\Model;class User extends Model{protected $table = 'user';public function getUserByUserName($username){return Db::table('user')->where('username','=',$username)->find();}public function login($data){try{//Login 是登陆验证器validate(\app\validate\Login::class)->check($data);} catch (ValidateException $e) {// 验证不通过则返回错误消息// 错误消息比如: "用户名不能为空!","用户名或密码错误!"等return $e->getError();}//验证通过返回1,也可以是其他数字,任意,只要和 controller层对接好就行return 1;}}
8.LoginValidate.php
declare (strict_types = 1);namespace app\validate;use app\model\User;use think\Validate;class Login extends Validate{/*** 定义验证规则* 格式:'字段名' => ['规则1','规则2'...]** @var array*/protected $rule = ['username|用户名' => 'require','password|密码' => 'require','dto|用户名或密码' => 'checkUserExist', //checkUserExist为自定义验证方法];/*** 定义错误信息* 格式:'字段名.规则名' => '错误信息'** @var array*/protected $message = ['dto.checkUserExist' => '用户名或密码错误!'];// $value 为 [// "username" => username,// "password" => password,// ]public function checkUserExist($value){$model = new User();$user = $model->getUserByUserName($value['username']);if($user == null){return false;}//前端传过来的密码需要 加密后 才可以正确与数据库中的密码匹配if($user['password'] != md5($value['password'])){return false;}return true;}}
9.结尾
ThinkPHP6.0使用了崭新的门面设计模式,对于设计模式具体在应用到工程代码中的能力还需要进一步的提高
THE END




