当前位置:首页 > CMS教程 > Thinkphp > 列表

ThinkPHP6.0如何利用自定义验证规则规范的实现登陆

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-06 12:15:53 浏览: 评论:0 

这篇文章主要介绍了ThinkPHP6.0如何利用自定义验证规则规范的实现登陆,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

1.写在前面

这学期因为各种课内考试,竞赛活动,项目,(和女朋友约会 )🤭等消耗了大量时间,博客没怎么更新,上次更新博客还是2个月之前

实现效果如图

ThinkPHP6.0如何利用自定义验证规则规范的实现登陆

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.前端发起请求

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.  <meta charset="UTF-8"
  5.  <meta name="viewport" content="width=device-width, initial-scale=1.0;"
  6.  <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.css" rel="external nofollow" > 
  7.  <link rel="stylesheet" type="text/css" href="/static/css/me.css" rel="external nofollow" > 
  8.  <script src="/static/js/jquery-3.5.1.min.js"></script> 
  9.  <script src="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.js"></script> 
  10.  <title>博客管理登陆</title> 
  11. </head> 
  12. <body> 
  13. <input id="username" type="text" name="username" placeholder="登陆用户名"
  14. <input id="password" type="password" name="password" placeholder="密码"
  15. <script> 
  16.  $('#loginBtn').click(function () { 
  17.   let username = $('#username').val(); 
  18.   let password = $('#password').val(); 
  19.   $.ajax({ 
  20.    url:"{:url('admin.login/login')}"
  21.    type: 'post'
  22.    data: {"username":username,"password":password}, 
  23.    dataType: 'JSON'
  24.    success: function (data) { 
  25.     let realData = JSON.stringify(data) 
  26.     data=eval("("+realData+")");//通过eval将()中的字符串以json形式执行 
  27.     if(data.code != 1) { 
  28.      alert(data.msg); 
  29.     } else { 
  30.         window.location.href = data.data 
  31.     } 
  32.    }, 
  33.    error: function (e) { 
  34.     window.location.href='/error/to500Page' 
  35.    } 
  36.   }) 
  37.  }) 
  38. </script> 
  39. </body> 
  40. </html> 

5.Common.php

  1. <?php 
  2. // 应用公共文件 
  3. //show方法封装统一返回给前端的JSON数据格式 
  4. function show($code$msg = 'error'$data = [],$httpStatus = 200){ 
  5.  $result = [ 
  6.   "code" => $code
  7.   "msg" => $msg
  8.   "data" => $data 
  9.  ]; 
  10.  return json($result,$httpStatus); 

6.LoginController.php

  1. <?php 
  2.  
  3.  
  4. namespace app\controller\admin; 
  5.  
  6. use app\BaseController; 
  7. use think\facade\Session; 
  8. use think\Request; 
  9. use \app\model\User; 
  10.  
  11. class Login extends BaseController 
  12.  protected $request
  13.  
  14.  public function index(){ 
  15.   return view('admin/login'); 
  16.  } 
  17.  
  18.  public function toAdminIndex(){ 
  19.   return view('admin/index'); 
  20.  } 
  21.  
  22.  public function logout(){ 
  23.   Session::delete('user'); 
  24.   return view('admin/login'); 
  25.  } 
  26.  
  27.  public function __construct(Request $request){ 
  28.   $this->request = $request
  29.   $this->request->header('Content-Type:text/html; charset=utf-8'); 
  30.  } 
  31.  
  32.  public function login(){ 
  33.   $user = new User(); 
  34.   $username = $this->request->param('username'); 
  35.   $password = $this->request->param('password'); 
  36.   $data = [ 
  37.    'username' => $username
  38.    'password' => $password
  39.    'dto'  => ['username'=>$username,'password'=>$password], // dto 为一个数组类型 
  40.   ]; 
  41.   $flag = $user->login($data); // $flag != 1 则返回错误消息 
  42.   if($flag != 1){ 
  43.   //show 方法在common.php 中,封装统一返回前端数据格式{"code":-1,"msg":$flag,"data":null} 
  44.    return show(-1,$flag,null);  
  45.   } 
  46.   //能到这一步说明验证通过,将用户信息存入 Session 中存储起来 
  47.   Session::set('user',$user->getUserByUserName($username)); 
  48.   // url: '/admin.login/toAdminIndex' 
  49.   return show(1,'登陆成功!','/admin.login/toAdminIndex'); 
  50.  } 
  51.  

7.UserModel.php

  1. <?php 
  2. namespace app\model; 
  3.  
  4. use think\exception\ValidateException; 
  5. use think\facade\Db; 
  6. use think\Model; 
  7.  
  8. class User extends Model 
  9.  
  10.  protected $table = 'user'
  11.  
  12.  public function getUserByUserName($username){ 
  13.   return Db::table('user')->where('username','=',$username)->find(); 
  14.  } 
  15.  
  16.  public function login($data){ 
  17.   try{ 
  18.   //Login 是登陆验证器 
  19.    validate(\app\validate\Login::class)->check($data); 
  20.   } catch (ValidateException $e) { 
  21.   // 验证不通过则返回错误消息 
  22.   // 错误消息比如: "用户名不能为空!","用户名或密码错误!"等 
  23.    return $e->getError(); 
  24.   } 
  25.     //验证通过返回1,也可以是其他数字,任意,只要和 controller层对接好就行 
  26.   return 1; 
  27.  } 
  28.  

8.LoginValidate.php

  1. <?php 
  2. declare (strict_types = 1); 
  3.  
  4. namespace app\validate; 
  5.  
  6. use app\model\User; 
  7. use think\Validate; 
  8.  
  9. class Login extends Validate 
  10.  /** 
  11.   * 定义验证规则 
  12.   * 格式:'字段名' => ['规则1','规则2'...] 
  13.   * 
  14.   * @var array 
  15.   */ 
  16.  protected $rule = [ 
  17.   'username|用户名' => 'require'
  18.   'password|密码' => 'require'
  19.   'dto|用户名或密码' => 'checkUserExist'//checkUserExist为自定义验证方法 
  20.  ]; 
  21.  
  22.  /** 
  23.   * 定义错误信息 
  24.   * 格式:'字段名.规则名' => '错误信息' 
  25.   * 
  26.   * @var array 
  27.   */ 
  28.  protected $message = [ 
  29.   'dto.checkUserExist' => '用户名或密码错误!' 
  30.  ]; 
  31.  
  32.     // $value 为 [ 
  33.     //           "username" => username, 
  34.     //   "password" => password, 
  35.     //   ] 
  36.  public function checkUserExist($value){ 
  37.   $model = new User(); 
  38.   $user = $model->getUserByUserName($value['username']); 
  39.   if($user == null){ 
  40.    return false; 
  41.   } 
  42.   //前端传过来的密码需要 加密后 才可以正确与数据库中的密码匹配 
  43.   if($user['password'] != md5($value['password'])){ 
  44.    return false; 
  45.   } 
  46.   return true; 
  47.  } 
  48.  

结尾

ThinkPHP6.0使用了崭新的门面设计模式,对于设计模式具体在应用到工程代码中的能力还需要进一步的提高

Tags: ThinkPHP6.0自定义验证规则

分享到: