##一、实验目的   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)是用户登录入口,如图所示。    ![](https://box.kancloud.cn/1ba9bb654f46e3a2c2ad7b40ca53db6d_553x422.jpg)   实验流程如下所示:   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,公众号名称为“豆豆咨询”。扫描以下二维码,关注“豆豆咨询”。 ![](https://box.kancloud.cn/541e0b698446c38ba398b183c361fe0d_430x430.jpg) 技术QQ群名称:豆豆咨询,群号:625686304 微信公众号名称:豆豆咨询,微信公众号:douAsk 彩蛋号:1208(在公众号里输入彩蛋号即可得到源码)。