15管理员管理及管理员登录的实现

15管理员管理及管理员登录的实现

涩相硼颗红档效朽柔驳兄嚷完


管理员管理的实现

新建User.php模型类

15管理员管理及管理员登录的实现第1张

<?php
namespace app\common\model;
use think\Model;

class User extends Model
{
    //配置数据库连接参数
    protected $connection = 'db_qiye';
    //配置模型绑定的数据表
    protected $table = 'user';
    //配置数据表的主键id
    protected $pk = 'user_id';
    //开启自动时间戳功能
    protected $autoWriteTimestamp = true;
    //设置自动更新的字段名称
    protected $update_time = 'update_time';

}

新建User.php控制类

15管理员管理及管理员登录的实现第2张

<?php
namespace app\admin\controller;
use app\common\controller\Base;
use app\common\model\User as UserModel;

class User extends  Base
{
    //用户信息列表
    public function index()
    {
        //获取管理员信息
        $user=UserModel::get(1);
        //模板赋值
        $this->view->assign('user',$user);
        //渲染模板
        return $this->view->fetch();
    }

    public function adminEdit()
    {
        //接收user_id
        $user_id=$this->request->param('user_id');

        //获取信息
        $user=UserModel::get($user_id);
        //模板赋值
        $this->view->assign('user',$user);
        //渲染模板
        return $this->view->fetch();

    }

    //处理对管理员信息的修改
    public function doEdit()
    {
        $user_id=$this->request->param('user_id');
        $user_name=$this->request->param('user_name');
        $email=$this->request->param('email');
        $password=$this->request->param('password');

        $password=md5($password);



        //设置更新的字段
        $data=['user_name'=>$user_name,'email'=>$email,'password'=>$password];
        $where=['user_id'=>$user_id];
        if(UserModel::update($data,$where))
        {
            return ['status'=>0,'msg'=>'修改成功'];
        }


    }
}

创建index.html和admin_edit.html

15管理员管理及管理员登录的实现第3张

index.html

{include file="common@header"}
<div class="x-nav">
      <span class="layui-breadcrumb">
        <a href="">首页</a>
        <a href="">会员管理</a>
        <a>
          <cite>管理员列表</cite></a>
      </span>
    <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right" href="javascript:location.replace(location.href);" title="刷新">
        <i class="layui-icon" style="line-height:30px">ဂ</i></a>
</div>
<div class="x-body">
    <table class="layui-table">
        <thead>
        <tr>

            <th>ID</th>
            <th>用户名</th>
            <th>邮箱</th>
            <th>登录IP</th>
            <th>登录次数</th>
            <th>更新时间</th>
            <th>操作</th>
        </thead>
        <tbody>
        <tr>
            <td>{$user.user_id}</td>
            <td>{$user.user_name}</td>
            <td>{$user.email}</td>
            <td>{$user.login_addr}</td>
            <td>{$user.login_count}</td>
            <td>{$user.update_time}</td>
            <td class="td-manage">
                <a title="编辑"  onclick="x_admin_show('编辑','{:url(\'adminEdit\')}?user_id={$user.user_id}')" href="javascript:;">
                    <i class="layui-icon">&#xe642;</i>
                </a>
            </td>
        </tr>
        </tbody>
    </table>


</div>
<script>
    layui.use('laydate', function(){
        var laydate = layui.laydate;

        //执行一个laydate实例
        laydate.render({
            elem: '#start' //指定元素
        });

        //执行一个laydate实例
        laydate.render({
            elem: '#end' //指定元素
        });
    });

</script>
</body>

</html>

admin_edit.html

{include file="common@header"}
<div class="x-body">
    <form class="layui-form">
        <div class="layui-form-item">
            <label for="user_name" class="layui-form-label">
                <span class="x-red">*</span>用户名
            </label>
            <div class="layui-input-inline">
                <input type="text" id="user_name" name="username" required="" lay-verify="required"
                       autocomplete="off" value="{$user.user_name}" class="layui-input">
            </div>
        </div>

        <div class="layui-form-item">
            <label for="email" class="layui-form-label">
                <span class="x-red">*</span>邮箱
            </label>
            <div class="layui-input-inline">
                <input type="text" value="{$user.email}" id="email" name="email" required="" lay-verify="email"
                       autocomplete="off" class="layui-input">
            </div>
            <div class="layui-form-mid layui-word-aux">
            </div>
        </div>
        <div class="layui-form-item">
            <label for="password" class="layui-form-label">
                <span class="x-red">*</span>密码
            </label>
            <div class="layui-input-inline">
                <input type="password" id="password" name="password" required="" lay-verify="pass"
                       autocomplete="off" class="layui-input">
            </div>
            <div class="layui-form-mid layui-word-aux">
                6到16个字符
            </div>
        </div>
        <div class="layui-form-item">
            <label for="repassword" class="layui-form-label">
                <span class="x-red">*</span>确认密码
            </label>
            <div class="layui-input-inline">
                <input type="password" id="repassword" name="repassword" required="" lay-verify="repass"
                       autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <button  class="layui-btn" lay-filter="add" lay-submit="">
                修改
            </button>
        </div>
    </form>
</div>
<script>
    layui.use(['form','layer'], function(){
        $ = layui.jquery;
        var form = layui.form
            ,layer = layui.layer;

        //自定义验证规则
        form.verify({
            nikename: function(value){
                if(value.length < 5){
                    return '昵称至少得5个字符啊';
                }
            }
            ,pass: [/(.+){6,12}$/, '密码必须6到12位']
            ,repass: function(value){
                if($('#password').val()!=$('#repassword').val()){
                    return '两次密码不一致';
                }
            }
        });

        //监听提交
        //监听提交
        form.on('submit(add)', function(data){
            console.log(data);
            //发异步,把数据提交给php
            //以post方式提交到服务器
            $.post("{:url('doEdit')}",{
                    'user_id':{$user.user_id},
                    'user_name':$('#user_name').val(),
                    'email':$('#email').val(),
                    'password':$('#password').val()
            },function(data){
                if(data.status==0)
                {
                    layer.alert(data.msg, {icon: 6},function () {
                        // 获得frame索引
                        var index = parent.layer.getFrameIndex(window.name);
                        //关闭当前frame
                        parent.layer.close(index);
                    });
                }
                else
                {
                    layer.alert("保存失败", {icon: 6},function () {
                        // 获得frame索引
                        var index = parent.layer.getFrameIndex(window.name);
                        //关闭当前frame
                        parent.layer.close(index);
                    });
                }
            })




            return false;
        });


    });
</script>
</body>

</html>

效果:

15管理员管理及管理员登录的实现第4张


管理员登录的实现

控制器User.php中创建login()方法

15管理员管理及管理员登录的实现第2张

<?php
namespace app\admin\controller;
use app\common\controller\Base;
use app\common\model\User as UserModel;
use think\Session;

class User extends  Base
{

    //用户登录
    public function login()
    {
        return $this->view->fetch();
    }

    //处理用户登录的操作
    public function doLogin()
    {
        $email=trim($this->request->param('email'));
        $password=md5(trim($this->request->param('password')));

        $user=UserModel::get(1);
        if($email!=$user['email'])
        {
            return ['status'=>1,'msg'=>'邮箱错误'];
        }
        elseif ($password!=$user['password'])
        {
            return ['status'=>2,'msg'=>'密码错误'];
        }
        else
        {
            return ['status'=>0,'msg'=>'登录成功'];
        }

        //登录成功,将用户名设置到session会话中
        Session::set('user_name',$user['user_name']);

    }

    //用户信息列表
    public function index()
    {
        //获取管理员信息
        $user=UserModel::get(1);
        //模板赋值
        $this->view->assign('user',$user);
        //渲染模板
        return $this->view->fetch();
    }

    public function adminEdit()
    {
        //接收user_id
        $user_id=$this->request->param('user_id');

        //获取信息
        $user=UserModel::get($user_id);
        //模板赋值
        $this->view->assign('user',$user);
        //渲染模板
        return $this->view->fetch();

    }

    //处理对管理员信息的修改
    public function doEdit()
    {
        $user_id=$this->request->param('user_id');
        $user_name=$this->request->param('user_name');
        $email=$this->request->param('email');
        $password=$this->request->param('password');

        $password=md5($password);



        //设置更新的字段
        $data=['user_name'=>$user_name,'email'=>$email,'password'=>$password];
        $where=['user_id'=>$user_id];
        if(UserModel::update($data,$where))
        {
            return ['status'=>0,'msg'=>'修改成功'];
        }


    }
}

创建login.html登录模板文件

15管理员管理及管理员登录的实现第6张

{include file="common@header"}
<body class="login-bg">

<div class="login layui-anim layui-anim-up">
    <div class="message">管理员登录</div>
    <div id="darkbannerwrap"></div>

    <form method="post" class="layui-form" >
        <input name="username" placeholder="邮箱"  type="text" lay-verify="required" class="layui-input" id="email">
        <hr class="hr15">
        <input name="password" lay-verify="required" placeholder="密码"  type="password" class="layui-input" id="password">
        <hr class="hr15">
        <input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
        <hr class="hr20" >
    </form>
</div>

<script>
    $(function  () {
        layui.use('form', function(){
            var form = layui.form;

            form.on('submit(login)', function(data){

                //异步提交数据验证
                $.post("{:url('doLogin')}",{
                    "email":$("#email").val(),
                    "password":$("#password").val()
                },function(data){
                    if(data.status==0)
                    {
                        layer.msg(data.msg,function(){
                            //登录成功,跳转到主页
                            location.href="{:url('Index/index')}"
                        });
                    }
                    else
                    {
                        //验证失败,跳转到登录页
                        layer.msg(data.msg,function () {
                            location.href='{:url("User/login")}'
                        })
                    }
                },'json')
                return false;
            });
        });
    })


</script>


<!-- 底部结束 -->
</body>
</html>

执行登录,通过post()提交数据到User.php中的doLogin()方法

注意,如想要让layui的弹出信息显示正确,必须在post提交时显式执行传输类型为json

15管理员管理及管理员登录的实现第7张


验证用户登录的实现,即管理员必须先登录才能进行操作,管理员没有登录访问任何控制器都会跳转到User控制器下的login()方法

在Base.php创建 isLogin()方法,如果session不存在则跳转至user/login()

15管理员管理及管理员登录的实现第8张

<?php
//公共控制器
namespace app\common\controller;
// 引入系统控制器
use think\Controller;
//引入tp的session类
use think\facade\Session;

class Base extends Controller
{
    protected function initialize()
    {
        //必须先继承父类的初始化方法
        parent::initialize();

        //使用过滤函数替换 fiter里面使用闭包(匿名函数)
        $this->filter(function($content){
            //使用字符串替换函数
            return str_replace('__ADMIN__','/static/admin',$content);
        });

    }

    //判断用户是否已登录?应该放在公共控制器供所有控制器共享
    protected function isLogin()
    {
        //如果没有登录,并且当前操作不是登录,则提示用户登录并跳转到登录页面
        if(!Session::has('user_name'))
        {
            //如果不存在名为user_name的session表明没有登录,跳转到user控制器下的login方法
            $this->error('请登录','user/login');
        }
    }

    //判断用户是否已经登录了?如果已登录,应该提示用户不要重复登录
    protected function islogined()
    {
        if(Session::has('user_name'))
        {
            $this->error('不要重复登录');
        }
    }
}

注意:这里使用了tp51里面的Session类  需要在头部引入

use think\facade\Session;

在如下控制器类中添加前置方法

15管理员管理及管理员登录的实现第9张

    //前置方法
    //所有操作都必须执行'isLogin'操作:检测是否已登录
    //即所有的操作开始之前都会执行Base类中的isLogin()方法检查session是否存在
    //session存在才允许执行后续操作
    protected $beforeActionList =['isLogin'];

即在这些类中执行任何操作都必须先执行Base.php中的isLogin()方法

此时访问这些操作类中的任何方法都会自动跳转到登录页面


退出登录功能实现

user.php中创建logout()

15管理员管理及管理员登录的实现第10张

退出登录模板添加url

15管理员管理及管理员登录的实现第11张

此时点击退出登录即跳转到登录页面

15管理员管理及管理员登录的实现第12张

15管理员管理及管理员登录的实现第13张


显示站点信息:在公共文件common.php中创建getSiteName()

15管理员管理及管理员登录的实现第14张

在模板文件中调用:

15管理员管理及管理员登录的实现第15张

成功显示站点信息:

15管理员管理及管理员登录的实现第16张


Base.php检测是否重复登录的方法

//判断用户是否已经登录了?如果已登录,应该提示用户不要重复登录
    protected function islogined()
    {
        if(Session::has('user_name'))
        {
            $this->error('不要重复登录');
        }
    }

User.php前置方法的写法:

//前置方法
    protected $beforeActionList = [
        //判断用户是否已登录?
        'islogined' => ['only'=>'login']
    ];

代码解释:只有User.php控制器下的login方法才会执行islogined()方法

此时如果在登录的情况下再次进入登录界面,会提示如下信息

15管理员管理及管理员登录的实现第17张


User.php中完整前置方法的写法:

    //前置方法
    protected $beforeActionList = [
        'isLogin'=>['only'=>'index,adminEdit,doEdit'],
        //判断用户是否已登录?
        'islogined' => ['only'=>'login']
    ];

即只有index,adminEdit,doEdit执行是否登录的验证,只有login执行是否重复登录的验证


弘荡臼鞍兴确灰洞点苔山度偿