搜索
首页php框架ThinkPHPThinkphp6 + layui 实现后台登录(验证码刷新)

一、登录所用到组件

1、视图模板:安装:composer require topthink/think-view

2、验证码:安装:composer require topthink/think-captcha

3、session:需要开启session:打开app下的middeware.php文件,内部有个全局中间件 ,最后一行去掉注释即可。

准备基本完毕,手动开启教程。

二、前台搭建(layui框架)

2.1、你得先获取layui,去layui官网下载或者百度搜一下layui 的cdn

2.2、引入,我是放在tp6>public>static文件夹下。如图2-1.

XO(J}B3J1(PF8T[~DM@`$~0.png

图2-1 layui所在文件夹图

2.3:登录界面:界面图如2-2;

%1DG)EKGZ(A4C1VPYSN68%C.png

图2-2:登录界面图

代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/layui/css/layui.css">
</head>
<body>
<div class="layui-container">
    <div class="layui-row">
        <div class="layui-col-md4 layui-col-md-offset4" style="margin-top: 100px; box-shadow: 2px 2px 5px #ccc">
            <div style="height: 80px;
                           text-align: center;
                           font-size:30px;
                    ">后台登录</div>
            <form class="layui-form layui-form-pane" action="">
                <div class="layui-form-item" pane>
                    <label class="layui-form-label">用户名</label>
                    <div class="layui-input-block">
                        <input type="text" name="name" required lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">密码</label>
                    <div class="layui-input-block">
                        <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item" pane>
                    <label class="layui-form-label">验证码</label>
                    <div class="layui-input-inline">
                        <input type="text" name="yzm" style="width:60%" required lay-verify="required" placeholder="请输入验证码" autocomplete="off" class="layui-input">
                        <div style="display: inline" class="layui-form-mid layui-word-aux"><img id=&#39;captcha&#39; style="display: inline" src="{:captcha_src()}" alt="captcha" /></div>
                    </div>
                </div>
                <div class="layui-form-item">
                    <div class="layui-input-block">
                        <input type="button" class="layui-btn" lay-submit lay-filter="formDemo" value="立即提交"></input>
                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                    </div>
                </div>
            </form>
        </div>
    </div>

<script src="/static/layui/layui.all.js"></script>
<script>
    //只需要引入layui.all.js就ok
    //这里我们需要用到form表单,jquery的ajax提交,layui的弹弹窗
    //所以需要引用,下面数组就是引入的组件。
    layui.use([&#39;form&#39;, &#39;jquery&#39;, &#39;layer&#39;], function(){
        var form = layui.form;
        var $ = layui.jquery;
        //上两行就是引用form 和$ ,下面需要用到

        //监听表单提交,获取表单信息:submit(formDemo)数据对应这个lay-filter="formDemo"
        form.on(&#39;submit(formDemo)&#39;, function(data){
        //从表单中获取相应数据
            var name = data.field.name;
            var password = data.field.password;
            var yzm = data.field.yzm;
            $.ajax({
                url:"userLogin",//请求地址,当前在admin/user/userLogin下,提交给当前方法即可
                data: {//发送给服务器的数据
                    &#39;name&#39;:name,
                    &#39;password&#39;:password,
                    &#39;yzm&#39;:yzm
                },
                type:"Post",//提交方式
                dataType:"json",
                success:function(data){//成功回调
                    if(data.status==0){//登录失败,status后台自定义状态码
                        layer.msg(data.msg);//layer自带的弹窗,msg后台自定义消息,
                        \\emm 就是最开始layui.use中引用的layer,不然这里没法使用。
                    }else{//登录成功 msg后台自定义消息
                        layer.msg(data.msg);
                        //行吧,这里是自定义跳转,登录成功过后直接跳到主页
                        window.location.href = "{:url(&#39;admin/index/index&#39;)}"
                    }
                     return false;
                },
                error:function(data){
                    console.log(&#39;==错误信息==&#39;);
                    return false;
                }
            });


            return false;
        });
        //提交数据结束
        // 验证码刷新,,通过jquery获取图片dom,并实现点击功能。
        $("#captcha").click(function(event){
        // jqery中获取id是上面这样的,如果是获取class就是 $(".captcha")
        // 当然我这里不涉及类名。
            console.log(&#39;我被点击了&#39;);控制台输出这鬼东西被点击了没有
            console.log(event);
            //给当前图片的src换一个新的url,后面带上一个随机数。
            //虽然我还不知道原理,
            //但是这样就能让验证码刷新,
            //请求tp6这个captcha_src()方法,如果不加后面那串估计后台认为
            //什么也不给你请求个锤子,原来那个给你
            this.src = "{:captcha_src()}?"+Math.random();

            console.log(this.src);//我打印了一下值得变化,事实上只有后面随机数变了
        })
    });
</script>

</body>
</html>

前台代码基本上是这样:验证码哪一行有毛病,我不想解决。

三、后台逻辑实现。

需要用到一张数据表:我这是admin表,包含了以下字段如图3-1

)@$G%JOCEQ`9RSXJ{~[G[W6.png

图3-1 数据库设计表

其实登录 不需要group_id last_login_time 等字段。这里我是有其他功能要实现。如果我开心过两天发张博客。

我没用模型,你也可以用模型:这里我建立一个模型吧:

admin模型如下:

创建模型命令php think make:mode admin@UserModel

我这里开启了多应用模式,admin是我的应用,如果你没有使用多应用模式,把admin@去掉,当然,你也可以手动创建哈。

得到以下模型::图3-2

W9T{JUSF_)L6KCDS@PYT%NC.png

图3-2 模型位置图:UserModel

模型代码:

<?php
declare (strict_types = 1);
namespace app\admin\model;
use think\Model;

class UserModel extends Model
{
    //绑定主键
    protected $pk = &#39;id&#39;;
    //绑定表 表名
    protected $table=&#39;msg_admin&#39;;
    //开启自动时间戳
    protected $autoWriteTimestamp =true;
    // 设置字段信息。。虽然可以不用,但文档说可以减少一次查询,还是用吧
    protected $schema = [
        &#39;id&#39; => &#39;int&#39;,
        &#39;name&#39; => &#39;string&#39;,
        &#39;password&#39; => &#39;string&#39;,
        &#39;status&#39; => &#39;tinyint&#39;,
        &#39;group_id&#39; => &#39;int&#39;,
        &#39;create_time&#39; => &#39;datetime&#39;,
        &#39;update_time&#39; => &#39;datetime&#39;,
        &#39;last_login_time&#39; => &#39;datetime&#39;,
    ];
    // 模型初始化
    protected static function init()
    {
        //TODO:初始化内容
    }
}

对:在这之前你去要配置一下ENV变量,能链接数据库::自己去配置吧。

3-2:登录逻辑及代码::

第一步:检查session是否存在用户,存在直接跳到后台,否则就执行下一步

第二步:检查是不是post请求,如果是执行登录操作:不是渲染视图,将登录界面返回给用户;

第三步:登录中:获取用户传入数据,检查是否为空,(验证数据:我没写验证,懒);根据用户用户名查找用户信息,匹配密码,写入session,完成登录

代码如下:::

<?php
namespace app\admin\controller;
use app\BaseController;
use think\facade\Db;
use think\Request;
use app\validate\UserValidate;
use think\facade\View;
use think\facade\session;

class User extends BaseController
{
        protected $request;
   
    /**
     * 检查用户登录
     * 有登录提交时,进入登录功能,没有登录请求返回页面
     * 获取用户信息 校验 查询数据库
     * @param Request $request
     * @return string|\think\response\Json
     * @throws \Exception
     */
    public function userLogin(Request $request){
        if(!empty(session(&#39;adminAccount&#39;)) ){
            //如果用户已经登录,跳转到后台首页
            return redirect((string)url(&#39;index/index&#39;));
        }
        if($request->isPost()){
            $name= $request->param(&#39;name&#39;);
            $password = $request->param(&#39;password&#39;);
            $yzm = $request->param(&#39;yzm&#39;);

            //判断是否没有数据
            if(empty($name)&&empty($password)||empty($yzm)){
                return json([&#39;status&#39;=>0,&#39;msg&#39;=>&#39;未提交数据&#39;]);
            }
            //数据不为空,查询用户是否存在

            $adminInfo = Db::name(&#39;msg_admin&#39;)->where(&#39;name&#39;,&#39;=&#39;,$name)->find();
            //halt($adminInfo);
            if(!empty($adminInfo) && $adminInfo[&#39;status&#39;]!=1){
                return json([&#39;statsu&#39;=>0,&#39;msg&#39;=>&#39;用户不存在&#39;]);
            }
            if(!captcha_check($yzm)){
                return json([&#39;status&#39;=>0,&#39;msg&#39;=>&#39;验证码不正确&#39;]);
            }
            //md5加密密码::password_salt是一个自定义密码加密具体
            //具体是在common.php中实现,具体如下:::
            /**
            <?php
                        // 应用公共文件

                        //通用密码加密
                        function password_salt($str){
                            $salt=&#39;sttr&#39;;
                            return md5($str.$salt);
                        }
            */
           // if($adminInfo[&#39;password&#39;]!=password_salt($password)){
           //这里数据库信息是手动添加,所以没有使用加密。
           if($adminInfo[&#39;password&#39;]!=$password){
                return json([&#39;status&#39;=>0,&#39;msg&#39;=>&#39;密码不正确&#39;]);
            }
            //将用户存入session中 
            session(&#39;adminAccount&#39;,$adminInfo);

            return json([&#39;status&#39;=>1,&#39;msg&#39;=>&#39;登录成功&#39;]);
        }else{
            return View::fetch();
        }
    }
    //退出登录  
    public function loginOut(){
        session::clear();
        //重定向到登录界面》》》》
        return redirect(&#39;userLogin&#39;);
    }
}

这就是登录逻辑了:::

这里我还有一个问题:就是进入后台首页后,通过tp51,tp5方法,通过模板语法无法获取session,不知小伙伴们有没有解决方法,有的话告诉我一声。谢谢。

我的解决办法是:在首页index.html和index控制器中:

index控制器中:::

<?php
declare (strict_types = 1);
namespace app\admin\controller;
use think\facade\View;
class Index
{
    public function index()
    {
        View::assign(&#39;user&#39;,session(&#39;adminAccount&#39;));
        return View::fetch();
    }
}

我将他送个session的值给了user,前台从user中取出::T_T

前台代码::

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/layui/css/layui.css">
</head>
<body>
<div class="layui-layout layui-layout-admin">
    <div class="layui-header">
        <div class="layui-logo">XXX后台管理系统</div>
        <!-- 头部区域(可配合layui已有的水平导航) -->
        <ul class="layui-nav layui-layout-left">
            <li class="layui-nav-item"><a href="">主页</a></li>
            <li class="layui-nav-item"><a href="">商品管理</a></li>
            <li class="layui-nav-item"><a href="">用户管理</a></li>
            <li class="layui-nav-item">
                <a href="javascript:;">其它</a>
                <dl class="layui-nav-child">
                    <dd><a href="">邮件管理</a></dd>
                    <dd><a href="">消息管理</a></dd>
                    <dd><a href="">授权管理</a></dd>
                </dl>
            </li>
        </ul>
        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item">
                <a href="javascript:;">
                    <img src="" class="layui-nav-img">
                    {$user.name}
                    <!--
                        具体看这里,取出session的值:::::
                    
                    -->
                </a>
                <dl class="layui-nav-child">
                    <dd><a href="">个人资料</a></dd>
                    <dd><a href="">安全设置</a></dd>
                </dl>
            </li>
            <li class="layui-nav-item"><a href="{:url(&#39;user/loginOut&#39;)}">安全退出</a></li>
        </ul>
    </div>

    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
            <ul class="layui-nav layui-nav-tree"  lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:;">商品管理</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;">商品列表</a></dd>
                        <dd><a href="javascript:;">添加商品</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item">
                    <a href="javascript:;">订单管理</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;">订单列表</a></dd>
                        <dd><a href="javascript:;">待审核</a></dd>
                        <dd><a href="javascript:;">配送中</a></dd>
                        <dd><a href="javascript:;">完成订单</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item"><a href="">其他功能</a></li>
            </ul>
        </div>
    </div>

    <div class="layui-body">
        <!-- 内容主体区域 -->

     
    </div>
    <div class="layui-footer">
        <!-- 底部固定区域 -->
        © layui.com - 底部固定区域
    </div>
</div>
<script src="/static/layui/lay/modules/jquery.js"></script>
<script src="/static/layui/layui.all.js"></script>
<script>
    //JavaScript代码区域
    layui.use(&#39;element&#39;, function(){
        var element = layui.element;

    });
</script>
</body>
</html>

后台主页界面图3-3

`74BUVT36{PNAJPDCYO0J)L.png

图3-3 后台主页界面图

具体内容就这样,有问题呢百度,还是有问题还是百度。

以上是Thinkphp6 + layui 实现后台登录(验证码刷新)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具