ThinkPHP6.0如何利用自定義驗(yàn)證規(guī)則規(guī)范的實(shí)現(xiàn)登陸
1.寫在前面
這學(xué)期因?yàn)楦鞣N課內(nèi)考試,競(jìng)賽活動(dòng),項(xiàng)目,(和女朋友約會(huì) )🤭等消耗了大量時(shí)間,博客沒怎么更新,上次更新博客還是2個(gè)月之前
實(shí)現(xiàn)效果如圖
2.ThinkPHP中的MVC
M: Model 模型層(與數(shù)據(jù)庫交互的持久層)
V: View 視圖層(前端html,css,js)
C: Controller 控制器層
這里可以再單獨(dú)封裝一層 common 公共層,用于處理公用業(yè)務(wù),或者是封裝統(tǒng)一返回給前端的JSON數(shù)據(jù)格式。
控制器層 的正確寫法是只接受參數(shù),然后交給Model層去處理業(yè)務(wù);
3.登陸思路
controller層接受username,password參數(shù),交給Model層處理,Model層先將接受的username,password交給我們的自定義驗(yàn)證器去驗(yàn)證,驗(yàn)證通過后返回成功登陸標(biāo)志, 這個(gè)標(biāo)志可以任意,登陸成功就返回1,否則返回錯(cuò)誤消息,返回給 controller 層,controller 層簡(jiǎn)單判斷這個(gè)標(biāo)志后,就傳遞JSON數(shù)據(jù)給前端,前端利用 controller 層傳遞過去的JSON數(shù)據(jù)中的 url 地址進(jìn)行跳轉(zhuǎn)即可
4.前端發(fā)起請(qǐng)求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0;"> <link rel="stylesheet" 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形式執(zhí)行 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 // 應(yīng)用公共文件 //show方法封裝統(tǒng)一返回給前端的JSON數(shù)據(jù)格式 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 為一個(gè)數(shù)組類型 ]; $flag = $user->login($data); // $flag != 1 則返回錯(cuò)誤消息 if($flag != 1){ //show 方法在common.php 中,封裝統(tǒng)一返回前端數(shù)據(jù)格式{"code":-1,"msg":$flag,"data":null} return show(-1,$flag,null); } //能到這一步說明驗(yàn)證通過,將用戶信息存入 Session 中存儲(chǔ)起來 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 是登陸驗(yàn)證器 validate(\app\validate\Login::class)->check($data); } catch (ValidateException $e) { // 驗(yàn)證不通過則返回錯(cuò)誤消息 // 錯(cuò)誤消息比如: "用戶名不能為空!","用戶名或密碼錯(cuò)誤!"等 return $e->getError(); } //驗(yàn)證通過返回1,也可以是其他數(shù)字,任意,只要和 controller層對(duì)接好就行 return 1; } }
8.LoginValidate.php
<?php declare (strict_types = 1); namespace app\validate; use app\model\User; use think\Validate; class Login extends Validate { /** * 定義驗(yàn)證規(guī)則 * 格式:'字段名' => ['規(guī)則1','規(guī)則2'...] * * @var array */ protected $rule = [ 'username|用戶名' => 'require', 'password|密碼' => 'require', 'dto|用戶名或密碼' => 'checkUserExist', //checkUserExist為自定義驗(yàn)證方法 ]; /** * 定義錯(cuò)誤信息 * 格式:'字段名.規(guī)則名' => '錯(cuò)誤信息' * * @var array */ protected $message = [ 'dto.checkUserExist' => '用戶名或密碼錯(cuò)誤!' ]; // $value 為 [ // "username" => username, // "password" => password, // ] public function checkUserExist($value){ $model = new User(); $user = $model->getUserByUserName($value['username']); if($user == null){ return false; } //前端傳過來的密碼需要 加密后 才可以正確與數(shù)據(jù)庫中的密碼匹配 if($user['password'] != md5($value['password'])){ return false; } return true; } }
結(jié)尾
ThinkPHP6.0使用了嶄新的門面設(shè)計(jì)模式,對(duì)于設(shè)計(jì)模式具體在應(yīng)用到工程代碼中的能力還需要進(jìn)一步的提高
到此這篇關(guān)于ThinkPHP6.0如何利用自定義驗(yàn)證規(guī)則規(guī)范的實(shí)現(xiàn)登陸的文章就介紹到這了,更多相關(guān)ThinkPHP驗(yàn)證登陸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- thinkphp6中Redis 的基本使用方法詳解
- Thinkphp6.0中間件的具體使用
- ThinkPHP6.0前置、后置中間件區(qū)別
- thinkphp6使用mysql悲觀鎖解決商品超賣問題的實(shí)現(xiàn)
- ThinkPHP6通過Ucenter實(shí)現(xiàn)注冊(cè)登錄的示例代碼
- 基于thinkphp6.0的success、error實(shí)現(xiàn)方法
- 使用composer安裝使用thinkphp6.0框架問題【視頻教程】
- windows?server?2012?r2?服務(wù)器部署tp6?項(xiàng)目
- ThinkPHP5中如何使用redis
- 寶塔中ThinkPHP框架使用Redis的一系列教程
- ThinkPHP自定義Redis處理SESSION的實(shí)現(xiàn)方法
- Thinkphp6 配置并使用redis圖文詳解
相關(guān)文章
ThinkPHP5.1+Ajax實(shí)現(xiàn)的無刷新分頁功能示例
這篇文章主要介紹了ThinkPHP5.1+Ajax實(shí)現(xiàn)的無刷新分頁功能,結(jié)合實(shí)例形式詳細(xì)分析了ThinkPHP5.1+Ajax無刷新分頁具體原理、前臺(tái)數(shù)據(jù)發(fā)送與后臺(tái)處理相關(guān)操作技巧,需要的朋友可以參考下2020-02-02PHP讀取Excel內(nèi)的圖片(phpspreadsheet和PHPExcel擴(kuò)展庫)
今天接到了一個(gè)從Excel內(nèi)讀取圖片的需求,這里介紹一下分別使用phpspreadsheet和PHPExcel擴(kuò)展庫來實(shí)現(xiàn)讀取Excel內(nèi)圖片的功能,感興趣的朋友一起看看吧2019-11-11php獲取數(shù)組長(zhǎng)度的方法(有實(shí)例)
php獲取數(shù)組長(zhǎng)度的方法,php為我們提供了兩個(gè)函數(shù)可以計(jì)算一維數(shù)組長(zhǎng)度,如count,sizeof都可以直接統(tǒng)計(jì)數(shù)組長(zhǎng)度,還有獲取二維數(shù)組的方法。2013-10-10apache php mysql開發(fā)環(huán)境安裝教程
這篇文章主要為大家詳細(xì)介紹了apache php mysql開發(fā)環(huán)境安裝教程,感興趣的小伙伴們可以參考一下2016-07-07在Laravel中使用GuzzleHttp調(diào)用第三方服務(wù)的API接口代碼
今天小編就為大家分享一篇在Laravel中使用GuzzleHttp調(diào)用第三方服務(wù)的API接口代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10PHP實(shí)現(xiàn)QQ、微信和支付寶三合一收款碼實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用PHP如何實(shí)現(xiàn)QQ、微信和支付寶三合一收款碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02thinkphp中字符截取函數(shù)msubstr()用法分析
這篇文章主要介紹了thinkphp中字符截取函數(shù)msubstr()用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了thinkPHP中字符截取函數(shù)msubstr()的功能、定義使用技巧與注意事項(xiàng),需要的朋友可以參考下2016-01-01Zend Framework使用Zend_Loader組件動(dòng)態(tài)加載文件和類用法詳解
這篇文章主要介紹了Zend Framework使用Zend_Loader組件動(dòng)態(tài)加載文件和類用法,結(jié)合實(shí)例形式分析了Zend_Loader組件實(shí)現(xiàn)文件自動(dòng)加載與屬性判斷的相關(guān)使用技巧,需要的朋友可以參考下2016-12-12