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 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
php session 检测和注销
Mar 16 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
php的ZipArchive类用法实例
Oct 20 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
PHP批量生成图片缩略图的方法
Jun 18 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
PHP抽象类和接口用法实例详解
Jul 20 PHP
tp5.1 框架查询表达式用法详解
May 25 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
PHP的分页功能
2007/03/21 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
js中less常用的方法小结
2017/08/09 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
python下载图片实现方法(超简单)
2017/07/21 Python
python实现远程控制电脑
2019/05/23 Python
实例详解Python装饰器与闭包
2019/07/29 Python
python add_argument()用法解析
2020/01/29 Python
浅谈Python __init__.py的作用
2020/10/28 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
小摄影师教学反思
2014/04/27 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
画展观后感
2015/06/17 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Java Socket实现多人聊天系统
2021/07/15 Java/Android