Blogger Information
Blog 128
fans 9
comment 5
visits 241305
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1.【商城后台管理系统】基于TP6开发后台管理员登陆页面渲染部署
 一纸荒凉* Armani
Original
2106 people have browsed it

【商城后台管理系统】基于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. }

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post