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安全编程之加密功能
Oct 09 PHP
PHP 面向对象 PHP5 中的常量
May 05 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
php实现rc4加密算法代码
Apr 25 PHP
php字符串过滤与替换小结
Jan 26 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
PHP时间处理类操作示例
Sep 05 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 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 if 想到的些问题
2008/03/22 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
javascript实现文字跑马灯效果
2020/06/18 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
Django中的Signal代码详解
2018/02/05 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
物理研修随笔感言
2014/02/14 职场文书
法人代表授权委托书
2014/04/08 职场文书
安全施工标语
2014/06/07 职场文书
绿色环保标语
2014/06/12 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书