一、创建管理员数据表与模型
创建数据库tp5并创建管理员数据表及添加一个管理员账户:
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '管理员用户名',
`password` char(32) NOT NULL DEFAULT '管理员密码',
`email` varchar(200) NOT NULL DEFAULT '管理员邮箱',
`login_count` int(4) NOT NULL DEFAULT '0', #登陆次数
`last_time` int(11) NOT NULL DEFAULT '0', #最后登陆时间
PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
# Data for table "admin"
INSERT INTO `admin` VALUES (1,'admin','e10adc3949ba59abbe56e057f20f883e','admin@qq.com',0,1577107268);
创建管理员模型:
>php think make:model admin/Admin
二、创建登录控制器与界面渲染
创建登陆控制器
>php think make:controller admin/Login
<?php
namespace app\admin\controller;
use app\admin\common\Base;
class Login extends Base
{
//渲染登陆界面
public function index()
{
return $this->fetch('login');
}
}
三、[重点]管理员登录验证与安全退出
Login.php
<?php
namespace app\admin\controller;
use app\admin\common\Base;
use think\Request;
use app\admin\model\Admin;
use think\Session;
class Login extends Base
{
/**
渲染登陆界面
*/
public function index()
{
return $this->fetch('login');
}
/**
验证用户身份
*/
public function check(Request $request)
{
//设置status
$status = 0;
//获取提交表单的数据,并保存变量中
$data = $request->param();
$username = $data['username'];
$password = md5($data['password']);
//在admin表中进行查询:以用户为条件
$map = ['username'=>$username];
$admin = Admin::get($map);
//将用户名与密码分开验证
//如果没有查询到该用户
if(is_null($admin)){
//设置返回信息
$message='用户名不正确';
}elseif($admin->password != $password){
//设置一下密码不正常的提示信息
$message='密码不正确';
}else{
//如果用户名和密码都通过了验证,表明是合法用户
//修改一下返回信息
$status = 1;
$message = '验证通过,请点击确定进入后台';
//更新表中登录次数与最后登陆时间
$admin -> setInc('login_count');
$admin->save(['last_time'=>time()]);
//讲用户登陆的信息保存到session中,供其他控制器进行登陆判断
Session::set('user_id',$username);
Session::set('user_info',$data);
}
return ['status'=>$status,'message'=>$message];
}
/**
退出登陆
*/
public function logout()
{
//清除session值,退出登陆
Session::delete('user_id');
Session::delete('user_info');
//退出之后跳转到登陆页面
$this->success('成功退出,正在跳转...','login/index');
}
}
Login.html
<!DOCTYPE html>
<html>
{include file="public/header" /}
<body style="background-color: #393D49">
<div class="x-box">
<div class="x-top">
<i class="layui-icon x-login-close">
ဇ
</i>
<ul class="x-login-right">
<li style="background-color: #F1C85F;" color="#F1C85F">
</li>
<li style="background-color: #EA569A;" color="#EA569A">
</li>
<li style="background-color: #393D49;" color="#393D49">
</li>
</ul>
</div>
<div class="x-mid">
<div class="x-avtar">
<img src="__STATIC__/images/logo.png" alt="">
</div>
<div class="input">
<form class="layui-form">
<div class="layui-form-item x-login-box">
<label for="username" class="layui-form-label">
<i class="layui-icon"></i>
</label>
<div class="layui-input-inline">
<input type="text" id="username" name="username" required="" placeholder="username" class="layui-input">
</div>
</div>
<div class="layui-form-item x-login-box">
<label for="password" class="layui-form-label">
<i class="layui-icon"></i>
</label>
<div class="layui-input-inline">
<input type="password" id="password" name="password" required="" placeholder="******" class="layui-input">
</div>
</div>
<div class="layui-form-item" id="loginbtn">
<button class="layui-btn" lay-filter="save" lay-submit="" type="button" id="loginbtn">
登 录
</button>
</div>
</form>
</div>
</div>
</div>
<p style="color:#fff;text-align: center;">Copyright © 2017.Company name All rights X-admin </p>
<script src="__STATIC__/lib/layui/layui.js" charset="utf-8">
</script>
<script src="__STATIC__/js/jquery.min.js"></script>
<script>
layui.use(['form'],
function() {
$ = layui.jquery;
var form = layui.form(),
layer = layui.layer;
$('.x-login-right li').click(function(event) {
color = $(this).attr('color');
$('body').css('background-color', color);
});
});
</script>
<script>
$(function(){
$("#loginbtn").on('click',function(){
$.ajax({
type: 'POST',
url: "{:url('login/check')}",
data: $(".layui-form").serialize(),
dataType: "json",
success: function(data){
if (data.status == 1) {
alert(data.message);
window.location.href = "{:url('index/index')}";
} else {
alert(data.message);
window.location.href = "{:url('login/index')}";
}
}
})
})
})
</script>
</body>
</html>
四、防止用户非法访问或重复登录
基础控制器Base.php
<?php
namespace app\admin\common;
use think\Controller;
use think\Session;
class Base extends Controller
{
protected function _initialize()
{
parent::_initialize();
//在公共控制的初始化方法中,创建一个常量来判断管理员是否已经登陆
define('USER_ID',Session::get('user_id'));
}
//判断管理员是否登陆,如果没有则返回登陆界面
protected function isLogin()
{
if(is_null(USER_ID)){
$this->error('未登录,无权访问~','login/index');
}
}
//如果用户已经登陆则不需要重复登陆
protected function alreadyLogin()
{
if(!is_null(USER_ID)){
$this->error('已登录,请勿重复登陆~','index/index');
}
}
}
在Login.php控制器渲染界面之前添加
$this->isLogin();
在Index.php制器渲染界面之前添加
$this->alreadyLogin();