<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>