<div class="truth"> 作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具 </div> <blockquote class="default"> <p>知识点<br> 1.session 的使用<br> 2.tp 请求与响应<br> 3.隐藏index.php<br /> 4.重新设置视图目录<br /> 5.验证码的实现 </p> <div class="env">版本:thinkphp5.07</div> </blockquote> <div class="step">1.修改站点根目录</div> <div class="info"> <p>(1).TP5 版本的默认自带的入口文件位于public/index.php,这里我们将默认的入口文件放在网站根目录。 </p> <p>(2).修改index.php 代码如下</p> ~~~ // [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/application/'); // 加载框架引导文件 require __DIR__ . '/thinkphp/start.php'; ~~~ <div class="step">2.隐藏index.php</div> <span class="url">请参考:[隐藏index.php](315259)</span> <div class="step">3.重新设置视图目录</div> <span class="url">具体步骤请参考:[重新设置视图目录](315955)</span> <div class="info">这里我们把视图目录跟静态资源放在同一个目录下(/public/)</div> <div class="step">4.创建用户表</div> | 字段 | 注释 | | --- | --- | | id | 主键(自增) | | username|用户名 (登录账号) | | password |密码 | | nickname| 昵称 | <div class="info"> 这里选择mysql数据库,具体创建数据库+表请自己手动完成。创建完成后,手动添加用户名和密码,为了方便演示,这里密码不在加密。添加数据 username:admin password:admin </div> <div class="step">5.链接mysql数据库</div> <span class="url"> 请参考:[连接数据库](315956) </span> <div class="step">6.创建公共模板</div> <div class="info"> <p>这里使用了模板继承去实现整个站点的布局,如果对模板继承不熟悉的朋友,可以参考<a href="http://www.kancloud.cn/manual/thinkphp5/125014">《thinkphp5完全开发手册》模板继承</a> </p> <p>注意:这里不写样式。需要的同学可以在下载的源码包中找到</p> <p>公共模板默认在视图文件的模块根目录下。本案例的公共模板在 【public\default\auth.html】 源码如下:</p> </div> ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>用户认证-{block name="title"}{/block}</title> <link href="__ROOT__/public/static/boot/css/bootstrap.min.css" rel="stylesheet"> <link href="__ROOT__/public/static/auth.css" rel="stylesheet"> </head> <body> <div class="auth"> <form action="" method="post" id="userform"> <div class="ahead"> {block name="auth-title"}认证标题{/block} </div> <div class="abody"> <!-- 自定义页面提示,通过session来输出失败信息。 message_info.title ;输出错误内容 message_info.content --> {if condition="$Request.session.message_info.title neq false"} <div class="message_info"> <div class="alert alert-danger alert-dismissible fade in" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button> <h4>{$Request.session.message_info.title}</h4> <p>{$Request.session.message_info.content}</p> </div> </div> <!-- 清除session --> {:clear_session('message_info')} {/if} {block name="auth-form"} 认证表单 {/block} </div> <!-- edn abody --> <div class="atools"> <button type="submit" class="btn btn-primary">{block name="auth-submit"}提交{/block}</button> <button type="reset" class="btn btn-info">重置</button> </div> </form> </div> <script src="__ROOT__/public/static/boot/js/jquery.min.js"></script> <script src="__ROOT__/public/static/boot/js/bootstrap.min.js"></script> <script src="__ROOT__/public/static/jqvalidation/dist/jquery.validate.js"></script> {block name="script"} {/block} </body> </html> ~~~ <div class="step">7.创建登录页面</div> <div class="info"> <p>登录页面继承了公共模板。位置:【public\default\auth\login.html】,源码如下</p> </div> ~~~ {extend name="auth" /} {block name="title"}登录{/block} {block name="auth-title"}用户登录{/block} {block name="auth-form"} <div class="form-group"> <label for="username">用户名:</label> <input type="text" class="form-control" id="username" name="username" placeholder="用户名"> </div> <div class="form-group"> <label for="password">密码:</label> <input type="password" class="form-control" id="password" name="password" placeholder="密码"> </div> <div class="form-group"> <label for="yzm">验证码:</label> <input type="text" class="form-control" id="yzm" name="yzm" placeholder="验证码"> <div class="yzm"><img src="{:captcha_src()}" id="codeimage" alt="captcha" onclick="javascript:this.src = '/captcha.html?time=' + Math.random();" /></div> </div> {/block} {block name="auth-submit"}登录{/block} {block name="script"} <script type="text/javascript"> $("#userform").validate({ rules: { username: { required: true, }, password: { required: true, }, yzm: { required: true, }, }, messages: { username: { required: "请输入用户名", }, password: { required: "请输入密码", }, yzm: { required: "请输入验证码", }, } }); </script> {/block} ~~~ <div class="info"> 登录验证中,有两个地方需要说下。 <p>1.登录后台验证提示。在登录中,如果控制器端认证失败,会将信息暂时保存在 session下的message_info 数组中。当跳转回登陆页面后,立即提示登录失败的缘由。同时将该session再次注销</p> <p>2.验证码,这里涉及到验证码的设置,显示,以及刷新。需要深入了解的朋友可以参考 </p> </div> 《[验证码](316872)》章节。 <div class="step">8.创建User模型</div> <div class="info"> ThinkPHP5.0的模型是一种对象-关系映射(Object/Relation Mapping,简称ORM)的封装,并且提供了简洁的ActiveRecord实现。一般来说,每个数据表会和一个“模型”对应。 </div> <span class="url"> 需要深入学习模型和关联,可以参考[模型和关联](http://http://www.kancloud.cn/thinkphp/thinkphp5_quickstart/147283) 或者 [模型操作](317174)。 </span> <div class="info"> 在【application\index\model\User.php】中,写入如下代码(手动创建目录和文件,或者通过composer创建,这里不再详细说明): </div> ~~~ <?php namespace app\index\model; use think\Model; class User extends Model { } ~~~ <div class="note">因为是简单的模型化,这里并没有写其他处理数据的逻辑</div> <div class="step">9.登录控制器</div> <div class="info"> 控制器位置:【application\index\controller\Auth.php】,代码如下 </div> ~~~ <?php namespace app\index\controller; use think\Controller; use app\index\model\User; use think\Session; // use think\Db; // 该页面应该继承基控制器 class Auth extends Controller { public function _initialize() { } public function index() { $this->redirect('index/auth/login'); } //登录 public function login() { if (input('post.')) { $map=array(); // 获取用户名和密码,这里跟tp3的方式不一样 $map['username']=input('post.username'); $map['password']=input('post.password'); $user = User::get($map);//用get方法去判断。如果获得到数据,说明登录成功! // 首先验证验证码: $captcha = new \think\captcha\Captcha(); if (!$captcha->check(input('post.yzm'))) { //注意,如果session设置为二维数组,必须在赋值的时候,将他一维数组session清空。tp5session中存在bug,session不能当数组来使用! session('message_info',null); Session::set('message_info.title','登录失败'); Session::set('message_info.content','验证码错误'); $this->redirect(url('/index/auth/login')); } if ($user) { //登录成功,设置session。 Session::set('user.username',$user['username']); Session::set('user.nickname',$user['nickname']); Session::set('message_info','恭喜你,登录成功'); //因为保存的是session,所以,会在页面中session调用的地方显示出来 $this->redirect('/'); } else{ // 登录失败,将错误信息保存到session,并且重定向到登录,如果不采用重定向,页面刷新会提示,表单有数据的提示框。 Session::set('message_info.title','登录失败'); Session::set('message_info.content','用户名或者密码错误。'); $this->redirect(url('/index/auth/login')); } } return $this->fetch(); } public function get_yzm() { return captcha_src(); } //注册 public function register() { // 这里是注册逻辑,本例可以不实现 return $this->fetch(); } //退出 未实现 public function logout() { Session::clear(); $this->redirect(url('/index/auth/login')); } public function plug() { $user_lists=array( '1'=>'王八蛋', '2'=>'张三丰', ); $form=array( array('title'=>'编号','plug'=>'form_text','field'=>'id','default'=>"未定义"), array('title'=>'账号','plug'=>'form_select','field'=>'username','default'=>"2",'config'=>$user_lists), array('title'=>'密码','plug'=>'form_text','field'=>'password','default'=>"未定义"), array('title'=>'昵称','plug'=>'form_text','field'=>'nickname','default'=>"未定义"), ); $this->assign(['form'=>$form]); return $this->fetch(); } } ~~~ <div class="step">10.登录成功后,首页代码</div> <div class="info"> 【application\index\controller\Index.php】代码如下: </div> ~~~ <?php namespace app\index\controller; class Index { public function index() { return '首页<a href="/index/Auth/logout">注销</a>'; } } ~~~ <div class="info"> <p>至此,整个完整登录已经完成。</p> <p>源码下载地址:https://pan.baidu.com/s/1bo7ejQf</p> <p>thinkphp5学习交流群:536633782</p> </div>