第2章 管理员登录与验证

一、创建管理员数据表与模型

创建数据库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">
                    &#x1007;
                </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">&#xe612;</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">&#xe628;</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();

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值