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中使用与Perl兼容的正则表达式
Nov 26 PHP
谈谈新手如何学习PHP
Dec 14 PHP
隐性调用php程序的方法
Mar 09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
PHP实现数组递归转义的方法
Aug 28 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
PHP实现递归目录的5种方法
Oct 27 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
PHP 的 __FILE__ 常量
2007/01/15 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
JS实现拼图游戏
2021/01/29 Javascript
vue点击标签切换选中及互相排斥操作
2020/07/17 Javascript
用Python抢过年的火车票附源码
2015/12/07 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
python中import reload __import__的区别详解
2017/10/16 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
使用tensorflow实现线性回归
2018/09/08 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
Django实现发送邮件功能
2019/07/18 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
共产党员公开承诺践诺书
2014/05/28 职场文书
安全生产先进个人总结
2015/02/15 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
放假通知格式
2015/04/14 职场文书
搞笑欢迎词大全
2015/09/30 职场文书