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


Posted in PHP onDecember 16, 2020

1.写在前面

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

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

实现效果如图

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

<!DOCTYPE html>
<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" rel="external nofollow" >
 <link rel="stylesheet" type="text/css" href="/static/css/me.css" rel="external nofollow" >
 <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

<?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

<?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

<?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

<?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;
 }

}

结尾

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

到此这篇关于ThinkPHP6.0如何利用自定义验证规则规范的实现登陆的文章就介绍到这了,更多相关ThinkPHP验证登陆内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php类声明和php类使用方法示例分享
Mar 29 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
PHP的new static和new self的区别与使用
Nov 27 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
Dec 16 #PHP
TP5多入口设置实例讲解
Dec 15 #PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 #PHP
php在linux环境中如何使用redis详解
Dec 15 #PHP
PHP文件操作简单介绍及函数汇总
Dec 11 #PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 #PHP
PHP生成随机密码4种方法及性能对比
Dec 11 #PHP
You might like
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
php实现用户登陆简单实例
2017/04/04 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
angular4自定义表单控件[(ngModel)]的实现
2018/11/23 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
新手常见6种的python报错及解决方法
2018/03/09 Python
Python3.6简单反射操作示例
2018/06/14 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
python验证身份证信息实例代码
2019/05/06 Python
利用python求积分的实例
2019/07/03 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
技校教师求职简历的自我评价
2013/10/20 职场文书
酒店管理毕业生自荐信
2013/10/24 职场文书
社区学习十八大感想
2014/01/22 职场文书
法律进社区实施方案
2014/03/21 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
质量承诺书格式范文
2015/04/28 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
黄河绝恋观后感
2015/06/08 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers