登录  /  注册
博主信息
博文 128
粉丝 9
评论 5
访问量 233628
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
1.【商城后台管理系统】基于TP6开发后台管理员登陆页面渲染部署
 一纸荒凉* Armani
原创
2035人浏览过

【商城后台管理系统】基于TP6开发后台管理员登陆页面渲染部署

预览地址:http://padmin.easys.ltd/admin/account/login

一、后台登陆页面渲染

创建admin应用,controller/Account.php控制器

  1. <?php
  2. namespace app\admin\controller;
  3. use app\BaseController;
  4. use think\facade\Session;
  5. use think\facade\Db;
  6. use think\facade\View;
  7. /**
  8. * 后台账号管理
  9. */
  10. class Account extends BaseController
  11. {
  12. // 登陆页面
  13. public function login(){
  14. return View::fetch('/account/login');
  15. }
  16. }

登陆页面视图 view/Account/login.php

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>后台登陆</title>
  5. <link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css">
  6. <script type="text/javascript" src="/static/layui/layui.js"></script>
  7. <style type="text/css">
  8. .body_bg{background: url(http://zhsh520.com/hero-bg.jpg);}
  9. .login_contain{position: absolute;left: 50%;top: 50%;width: 500px;transform: translate(-50%,-50%);}
  10. .login_main{background: rgba(255,255,255,0.8);padding: 20px;border-radius: 5px;box-shadow: 5px 5px 20px #444}
  11. .veriCode{cursor: pointer;border: 1px solid #f1f1f1;width: 126px;height: 35px;}
  12. </style>
  13. </head>
  14. <body class="body_bg">
  15. <div class="login_contain">
  16. <div class="login_main">
  17. <div class="layui-form">
  18. <div class="layui-form-item" style="color: gray">
  19. <h2>后台管理系统</h2>
  20. </div>
  21. <hr/>
  22. <div class="layui-form-item">
  23. <label class="layui-form-label">用户名</label>
  24. <div class="layui-input-block">
  25. <input type="text" class="layui-input" name="username" placeholder="请输入用户名" value="admin">
  26. </div>
  27. </div>
  28. <div class="layui-form-item">
  29. <label class="layui-form-label">密码</label>
  30. <div class="layui-input-block">
  31. <input type="password" class="layui-input" name="password" placeholder="请输入密码" value="1234">
  32. </div>
  33. </div>
  34. <div class="layui-form-item">
  35. <label class="layui-form-label">验证码</label>
  36. <div class="layui-input-inline">
  37. <input type="text" class="layui-input" name="vericode" placeholder="请输入验证码">
  38. </div>
  39. <img src="/admin/Account/veriCode" onclick="reloadveriimg()" class="veriCode">
  40. </div>
  41. <div class="layui-input-block">
  42. <input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
  43. <button class="layui-btn" onclick="dologin()">登陆</button>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </body>
  49. </html>

二、登陆页面渲染效果

三、生成验证码并验证

这里未使用tp提供的验证码类库,我们通过原生php的GD库自己生成的,下面介绍了tp的验证码安装与使用,但是要想达到预期效果,可能还需一定配置,具体使用详见官方手册。

首先使用Composer安装think-captcha扩展包:

  1. composer require topthink/think-captcha

验证码库需要开启Session才能生效。

验证码使用

扩展包内定义了一些常见用法方便使用,可以满足大部分常用场景,以下示例说明。

在模版内添加验证码的显示代码

  1. <div>{:captcha_img()}</div>

验证码生成类

  1. // 验证码生成
  2. class VeriCode{
  3. // 获取验证码配置
  4. private static function _getCodeConfig(){
  5. return [
  6. // 验证码字符集
  7. 'codeStr' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
  8. // 验证码个数
  9. 'codeCount' => 4,
  10. // 字体大小
  11. 'fontsize' =>16,
  12. // 验证码的宽度
  13. 'width' => 100,
  14. // 验证码高度
  15. 'height' => 36,
  16. // 是否有干扰点?true有,false没有
  17. 'disturbPoint' => true,
  18. // 干扰点个数,disturbPoint开启后生效
  19. 'pointCount' => 200,
  20. // 是否有干扰条?true有,false没有
  21. 'disturbLine' => true,
  22. // 干扰条个数,disturbLine开启后生效
  23. 'lineCount' => 3
  24. ];
  25. }
  26. // 创建图片验证码
  27. public static function create(){
  28. // 配置
  29. $config = self::_getCodeConfig();
  30. //创建画布
  31. $image = imagecreatetruecolor($config['width'],$config['height']);
  32. //背景颜色
  33. $bgcolor=imagecolorallocate($image,255,255,255);
  34. imagefill($image,0,0,$bgcolor);
  35. $captch_code = '';//存储验证码
  36. $captchCodeArr = str_split($config['codeStr']);
  37. //随机选取4个候选字符
  38. for($i=0;$i<$config['codeCount'];$i++){
  39. $fontsize = $config['fontsize'];
  40. $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));//随机颜色
  41. $fontcontent = $captchCodeArr[rand(0,strlen($config['codeStr'])-1)];
  42. $captch_code.=$fontcontent;
  43. $_x = $config['width']/$config['codeCount'];
  44. $x=($i*(int)$_x)+rand(5,10); //随机坐标
  45. $y=rand(5,10);
  46. imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); // 水平地画一行字符串
  47. //imagefttext($im, $size, 2, $size * (0.5 + $i * 1.1), $size * 1.2, $font, Env::get('root_path') . 'public/static/fonts/COOPBL.TTF', $authnum);
  48. }
  49. session_start();
  50. $_SESSION['code']=$captch_code;
  51. //增加干扰点
  52. if($config['disturbPoint']){
  53. for($i=0;$i<$config['pointCount'];$i++){
  54. $pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
  55. imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
  56. }
  57. }
  58. //增加干扰线
  59. if($config['disturbLine']){
  60. for($i=0;$i<$config['lineCount'];$i++){
  61. $linecolor=imagecolorallocate($image,rand(80,280),rand(80,220),rand(80,220));
  62. imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
  63. }
  64. }
  65. //输出格式
  66. header('content-type:image/png');
  67. imagepng($image);
  68. //销毁图片
  69. imagedestroy($image);
  70. }
  71. }

我们只需要将其放置到我们的控制器中调用即可

  1. <?php
  2. namespace app\admin\controller;
  3. use app\BaseController;
  4. use think\facade\Session;
  5. use think\facade\Db;
  6. use think\facade\View;
  7. /**
  8. * 后台账号管理
  9. */
  10. class Account extends BaseController
  11. {
  12. // 登陆页面
  13. public function login(){
  14. return View::fetch('/account/login');
  15. }
  16. // 验证码
  17. public function veriCode(){
  18. VeriCode::create();
  19. }
  20. }
  21. // 验证码生成……将什么复制到此处即可

页面中引入img标签,链接为生成验证码控制器方法即可

  1. <img src="/admin/Account/veriCode" onclick="reloadveriimg()" class="veriCode">

定义reloadveriimg方法实现点击刷新验证码操作

  1. <script type="text/javascript">
  2. $ = layui.jquery;
  3. // 重新加载验证码图片
  4. function reloadveriimg(){
  5. $('.veriCode').attr('src','/admin/Account/veriCode?rand='+Math.random());
  6. }
  7. </script>

四、实现登陆验证功能

前端页面采用Ajax发送后台验证信息,状态后台通过Session存储进行保持

前端登陆页面发送请求

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>后台登陆</title>
  5. <link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css">
  6. <script type="text/javascript" src="/static/layui/layui.js"></script>
  7. <style type="text/css">
  8. .body_bg{background: url(http://zhsh520.com/hero-bg.jpg);}
  9. .login_contain{position: absolute;left: 50%;top: 50%;width: 500px;transform: translate(-50%,-50%);}
  10. .login_main{background: rgba(255,255,255,0.8);padding: 20px;border-radius: 5px;box-shadow: 5px 5px 20px #444}
  11. .veriCode{cursor: pointer;border: 1px solid #f1f1f1;width: 126px;height: 35px;}
  12. </style>
  13. </head>
  14. <body class="body_bg">
  15. <div class="login_contain">
  16. <div class="login_main">
  17. <div class="layui-form">
  18. <div class="layui-form-item" style="color: gray">
  19. <h2>后台管理系统</h2>
  20. </div>
  21. <hr/>
  22. <div class="layui-form-item">
  23. <label class="layui-form-label">用户名</label>
  24. <div class="layui-input-block">
  25. <input type="text" class="layui-input" name="username" placeholder="请输入用户名" value="admin">
  26. </div>
  27. </div>
  28. <div class="layui-form-item">
  29. <label class="layui-form-label">密码</label>
  30. <div class="layui-input-block">
  31. <input type="password" class="layui-input" name="password" placeholder="请输入密码" value="1234">
  32. </div>
  33. </div>
  34. <div class="layui-form-item">
  35. <label class="layui-form-label">验证码</label>
  36. <div class="layui-input-inline">
  37. <input type="text" class="layui-input" name="vericode" placeholder="请输入验证码">
  38. </div>
  39. <img src="/admin/Account/veriCode" onclick="reloadveriimg()" class="veriCode">
  40. </div>
  41. <div class="layui-input-block">
  42. <input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
  43. <button class="layui-btn" onclick="dologin()">登陆</button>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </body>
  49. </html>
  50. <script type="text/javascript">
  51. $ = layui.jquery;
  52. // 重新加载验证码图片
  53. function reloadveriimg(){
  54. $('.veriCode').attr('src','/admin/Account/veriCode?rand='+Math.random());
  55. }
  56. // 用户名控件获取焦点
  57. $('input[name="username"]').focus();
  58. // 回车登录
  59. $('input').keydown(function(e){
  60. if(e.keyCode == 13){
  61. dologin();
  62. }
  63. });
  64. // 向后台发送登陆信息
  65. function dologin(){
  66. // 获取表单值并清除两端空格
  67. var username = $.trim($('input[name="username"]').val());
  68. var password = $.trim($('input[name="password"]').val());
  69. var vericode = $.trim($('input[name="vericode"]').val());
  70. var remember = $('input[name="remember"]').is(':checked')?1:0;
  71. // 校验数据是否为空
  72. if(username==''){
  73. return layer.alert('用户名不能为空',{title:'错误提示',icon:2});
  74. }
  75. if(password==''){
  76. return layer.alert('密码不能为空',{title:'错误提示',icon:2});
  77. }
  78. if(vericode==''){
  79. return layer.alert('验证码不能为空',{title:'错误提示',icon:2});
  80. }
  81. $.post('/admin/account/dologin',{username,password,vericode},function(res){
  82. if(res.code>0){
  83. // 刷新验证码
  84. reloadveriimg();
  85. return layer.alert(res.msg,{title:'错误提示',icon:2});
  86. }
  87. layer.alert(res.msg,{title:'成功提示',icon:1});
  88. setTimeout(function(){
  89. window.location.href="/";
  90. },1000)
  91. },'json');
  92. }
  93. </script>

执行登陆操作的控制器方法

  • 这里密码处理使用password_hash进行散列处理,也可以通过md5进行散列处理,但为了保证绝对的安全可以通过密码+用户名的方式进行加盐处理。解密对应这加密,登陆时通过原有方式加密然后对数据库中进行比较即可。
  • password_hash — 创建密码的散列
  • password_verify — 验证密码是否和散列值匹配
  • 登陆成功将用户信息存储至Session中持久化保存
  1. // 执行登陆
  2. public function dologin(){
  3. session_start();
  4. // 接受登陆传递的信息
  5. $username = input('post.username');
  6. $password = input('post.password');
  7. $vericode = input('post.vericode');
  8. $remember = input('post.remember');
  9. // password_hash 创建密码的散列
  10. // echo $pwd = password_hash("1234",PASSWORD_DEFAULT);
  11. // 校验是否为空
  12. if(empty($username)){
  13. exit(json_encode(['code'=>1,'msg'=>'用户名不能为空']));
  14. }
  15. if(empty($password)){
  16. exit(json_encode(['code'=>1,'msg'=>'密码不能为空']));
  17. }
  18. if(empty($vericode)){
  19. exit(json_encode(['code'=>1,'msg'=>'验证码不能为空']));
  20. }
  21. if(strcasecmp($_SESSION['code'],$vericode)!==0){
  22. exit(json_encode(['code'=>1,'msg'=>'验证码不正确']));
  23. }
  24. // 校验用户
  25. $admin = Db::table('admin')->where('username',$username)->find();
  26. if(empty($admin)){
  27. exit(json_encode(['code'=>1,'msg'=>'用户名或密码错误']));
  28. }
  29. // password_verify — 验证密码是否和散列值匹配
  30. if(!password_verify($password,$admin['password'])){
  31. exit(json_encode(['code'=>1,'msg'=>'用户名或密码错误']));
  32. }
  33. // 校验用户是否被禁用
  34. if($admin['status']!=0){
  35. exit(json_encode(['code'=>1,'msg'=>'账号已被禁用,请联系管理员']));
  36. }
  37. // 判断是否记住密码
  38. if($remember==1){
  39. // 设置用户session 7天以后过期
  40. session_set_cookie_params('60*60*24*7');
  41. Session::set('admin',$admin);
  42. }else{
  43. // 设置用户session
  44. Session::set('admin',$admin);
  45. }
  46. Db::table('admin')->where('username',$username)->update(['lastlogin'=>time()]);
  47. echo json_encode(['code'=>0,'msg'=>'登陆成功']);
  48. // 这里通过再用exit的话,在别的控制器中获取不到session的值
  49. // exit(json_encode(['code'=>0,'msg'=>'登陆成功']));
  50. }

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学