##一、實驗目的
1、掌握ThinkPHP5.0登錄與驗證原理,實現用戶登錄功能。
##二、實驗內容
1、建立ThinkPHP5.0用戶登錄與驗證功能頁面。
##三、實驗步驟及過程
ThinkPHP登錄是應用系統網站的一個基本功能。我們借鑒nango代碼,增加了一些用戶輸入驗證功能,實現了用戶登錄功能。
1、創建登錄界面
我們下載nango開源項目文件,創建了weixin模塊,并增加了validate文件夾的AdminLogin.php文件,(http://127.0.0.1/noneCms/public/index.php/weixin/login/index)是用戶登錄入口,如圖所示。

實驗流程如下所示:
1)安裝程序:(http://127.0.0.1/noneCms/public/install)安裝數據庫程序,可以參看上一個實驗的內容,不同的是可以設置數據庫的用戶名和密碼,可采用phpStudy環境下安裝數據庫;
2)創建weixin模塊:在根目錄下使用命令php think build –module weixin,創建weixin模塊;
3)創建控制類及方法:建立Login控制類及index方法,實現登錄控制類。
4)創建view層的顯示頁面以及驗證類。
2、關鍵代碼解析
Login.php為控制模塊文件,即通過(http://127.0.0.1/noneCms/index.php/weixin/login/index)訪問網站的用戶登錄頁面,調用weixin模塊的login控制器的index方法。該文件還可以采用不同的方法實現引導用戶登錄頁面,我們采用weixin模塊,以login控制器的index方法引導登錄頁面顯示,以login控制類的login方法完成登錄功能。
1)Login.php文件
Login.php是login控制器文件,其中index方法主要完成登錄頁面顯示,login完成用戶密碼驗證及輸入的驗證,代碼如下:
~~~
<?php
namespace app\weixin\controller;
use think\Controller;
use think\Db;
use think\Request;
use think\Session;
class Login extends Controller
{
//登錄界面
public function index(){
//驗證是否登錄成功
if (Session::has('userinfo')) {
$this->redirect('index/index');
}
return $this->fetch();//按照系統的默認規則定位模板文件到:[模板文件目錄]/當前控制器名(小寫+下劃線)/當前操作名(小寫).html,即view/login_index.html
}
//登錄操作
public function login(){
if(!request()->isPost()){
$this->redirect('index/index');
}
$name = input('post.username');
$passwd = input('post.password');
$captcha = input('post.captcha');
$data1 = [
'username'=>$name,
'password'=>$passwd
];
$validate = \think\Loader::validate('AdminLogin');
if(!$validate->check($data1)){//驗證數據
exit(json_encode(array('status' => 0, 'msg' => $validate->getError())));
}
if (!$name || !$passwd) {
exit(json_encode(array('status' => 0, 'msg' => '用戶名和密碼不能為空')));
}
if(!captcha_check($captcha)){
exit(json_encode(array('status' => 0, 'msg' => '請輸入正確的驗證碼')));
}
$info = Db::name('admin')->where('username',$name)->find();
$md5_passwd = md5(md5(trim($passwd)).$info['encrypt']);
if (!$info || $md5_passwd != $info['password']) {
exit(json_encode(array('status' => 0, 'msg' => '用戶名或密碼錯誤,請重新輸入')));
}
if ($info['islock'] == 1) {
exit(json_encode(array('status' => 0, 'msg' => '您的賬戶已被鎖定,請聯系超級管理員')));
}
//寫入日志
$data['ip'] = $login['loginip'] = request()->ip();
$data['userid'] = $info['id'];``````
$data['datetime'] = $login['logintime'] = time();
Db::name('log')->insert($data);
Db::name('admin')->where('id',$info['id'])->update($login);
//登入成功,存入session
Session::set('userinfo',['name' => $name,'id' => $info['id'],'login_time' => time()]);
exit(json_encode(array('status' => 1, 'msg' => '登錄成功', 'url' => url('index/index'))));
}
}
~~~
2)validate/AdminLogin.php文件
該文件輔助Login控制器的login方法驗證用戶登錄數據,在Login.php文件中采用代碼``$validate = \think\Loader::validate('AdminLogin')``;調用AdminLogin驗證器驗證。
AdminLogin.php文件如下所示。
~~~
<?php
namespace app\weixin\validate;
use think\Validate;
class AdminLogin extends Validate {
protected $rule = [
'username' => 'require|max:25|min:4',
'email' => 'email',
'password' => 'require|max:25|min:6',
'repassword'=>'repassword'
];
protected $message = [
'username.require' => '用戶名必須',
'username.max' => '用戶名最多不能超過25個字符',
'username.min' => '用戶名最少4個字符',
'password.require' => '密碼必須',
'password.min' => '密碼長度至少六位',
'email' => '郵箱格式錯誤',
//'repassword.require' => '確認密碼必須',
'repassword.confirm' => '兩次密碼必須一致'
];
}
~~~
##四、技術服務
1、如果有疑問或者需要幫助,請加入QQ群(群名稱:豆豆咨詢,群號:625686304);或者公眾號douAsk,公眾號名稱為“豆豆咨詢”。掃描以下二維碼,關注“豆豆咨詢”。

技術QQ群名稱:豆豆咨詢,群號:625686304
微信公眾號名稱:豆豆咨詢,微信公眾號:douAsk
彩蛋號:1208(在公眾號里輸入彩蛋號即可得到源碼)。