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 相关文章推荐
网友原创的PHP模板类代码
Sep 07 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
详细分析PHP 命名空间(namespace)
Jun 30 PHP
PHP接入支付宝接口失效流程详解
Nov 10 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
sphinx增量索引的一个问题
2011/06/14 PHP
destoon二次开发入门示例
2014/06/20 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
详解PHP归并排序的实现
2016/10/18 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python批量发送post请求的实现代码
2018/05/05 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
python tkinter canvas使用实例
2019/11/04 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
存储过程和sql语句的优缺点
2014/07/02 面试题
组织生活会表态发言材料
2014/10/17 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
Django如何与Ajax交互
2021/04/29 Python
浅谈react useEffect闭包的坑
2021/06/08 Javascript
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle