一.登录流程
- 正常:登录页面,登录成功跳转到后端页面,登录失败(密码错误or 用户不错在 or …)回到登录页面
- 未登录:用户没登录的情况下,跳回登录页面
- 已登录:已经登录(再次访问登录页面,sessio等有记录),直接跳转到后端页面
二.后端登陆-ajax登录(流程)
js代码
var show_num = [];
layui.use(['form'], function () {
var form = layui.form,
layer = layui.layer;
// 登录过期的时候,跳出ifram框架
if (top.location != self.location) top.location = self.location;
// 进行登录操作
form.on('submit(login)', function (data) {
data = data.field;
if (data.username == '') {
layer.msg('用户名不能为空');
return false;
}
if (data.password == '') {
layer.msg('密码不能为空');
return false;
}
if (data.captcha == '') {
layer.msg('验证码不能为空');
return false;
}
$(".input-val").val('');
//url,url,data,type等重要数据
url ="/admin/login/check";
$.ajax({
url,
data,
type:"POST",
success(res){
if(res.status == 1){
layer.msg('登录成功', function () {
window.location = '/admin/index/index';
});
}else{
layer.msg(res.message);
return false;
}
}
})
return false;
});
});
$(function(){
// location.href = "http://www.baidu.com";
draw(show_num);
$("#canvas").on('click',function(){
draw(show_num);
})
})
后台index代码,模拟登录
//模拟登录成功
namespace app\admin\controller;
use app\BaseController;
use think\facade\View;
class Login extends BaseController{
public function index(){
return View::fetch();
}
public function check(){
return show(config("status.success),"登录成功");
}
}
三,登录逻辑过程如图
在check()进行参数校验
完成此功能需要在中间件里开启session初始化
public function check(){
//是否为post请求
if($this->request->isPost()){
return show(config("status.error"),"请求方式错误");
}
//参数检验,
$username = $this->request->param("username", "", "trim");
$password = $this->request->param("password", "", "trim");
$captcha = $this->request->param("captcha", "", "trim");
//原生传递的值是否为空
if (empty($username) || empty($password) || empty($captcha)) {
return show(config("status.error"), "参数不能为空");
}
//判断验证码是否为空
if(!captcha_check($capthcha)){
return show(config("status.error"), "验证码不正确".$captcha);
}
return show(config("status.success"), "登陆成功");
}
获取用户信息
- 创建model层
<?php
//model
namespace app\common\model\mysql;
use think\model;
class AdminUser extends Model {
//根据用户名,获取后端表的数据
public function getAdminUserByUsername($username){
if(empty($username)){
return false;
}
$where = [
"username" => trim($username),
];
$result = $this->where($where)->find();
return $result;
}
//根据主键id更新数据表数据
public function updateById($id, $data){
$id = intval($id);
if(empty($id) || empty($data) || !is_array($data)){
return false;
}
$where = [
"id" => $id,
];
return $this->where($where)->save($data);
}
}
需要知道config下面的status.php文件
//获取model数据
$adminUserObj =new AdminUser();
$adminUser = $adminUserObj->getAdminUserByUsername($username);
//判断在数据库中,该登录用户是否存在
//判断用户是否存在
if(empty($adminUser) || $adminUser->status != config("status.mysql.table_normal")){
return show(config("status.error"), "不存在该用户");
}
$adminUser = $adminUser->toArray();
//判断密码
if(($adminUser['password']) != md5($password."_singwa_abc")){
return show(config("status.error"),"密码错误");
}
//将登陆信息记录到session中
session("adminUser",$adminuser);
//要记录表的信息
$updateData =[
"last_login_time" =>time(),
"last_login_ip" =>request()->ip(),
"update_time" =>time(),
];
//记录信息到mysql表中,$adminUserObj模型里的
$res = $adminUserObj->updateById($adminUser['id'],$updateData);
if(empty($res)){
return show(config("status.error"),'登陆失败');
}
return show(config("status.success"), "登陆成功");
}
用base方式处理登录流(别忘了配置)
- 新建立的方法验证登录流
<?php
namespace app\admin\controller;
use app\Basecontroller;
use think\exception\HttpResponseException;
class AdminBase extends BaseController{
public $adminUser =null;
public function initialize(){
parent::initialize();
//判断是否登陆
if(empty($this->isLogin())){//判断是否登录切换到中间件中
return $this->redirect(url("login/index"),302);
}
}
//判断是否登录具体方法
public function isLogin(){
//获取session数据
$this->adminUser = session(config("admin.session_admin"));
if(empty($this->adminUser)){
return false;
}
return true;
}
//定义一个新方法,返回后端页面
public function redirect(...$args){
throw new HttpResponseException(redirect(...$args));
}
}
- 利用中间件判断登录流
//中间件,Auth文件
<?php
declare (string_type =1);
namespace app\admin\middleware;
class Auth{
//中间件开始调度
public function handle($request, \Closure $next){
//前置中间件
if(empty(session(config("admin.session_admin"))) && !preg_match("/login/",$request->pathinfo())){
return redirect(url((string)"login/index"));
}
$response = $next($request);
//后置中间件,里面的有些方法会被执行,不安全或者没有意义
// if(empty(session(config("admin.session_admin"))) && $request->controller()!= "Login"){
// return redirect(url((string)"login/index"));
// }
return $next($request);
}
public function end(\think\Response $response){
}
}
validate验证机制
- 创建一个validate文件
<?php
namespace app\admin\validate;
use think\Validate;
class AdminUser extends Validate{
protected $rule = [
'username' =>'require',
'password' =>'require',
'captcha' =>'require|checkCapcha',
];
protected $message =[
'username' =>'用户必须存在1',
'password' =>'密码必须存在2',
'captcha' =>'验证码必须存在3',
];
protected function checkCapcha($value, $url, $data =[]){
if(!captcha_check($value)){
return "您输入的验证码不正确啊";
}
return true;
}
}
login.php文件
//validate验证机制
$validate = new \app\admin\validate\AdminUser();
if(!$validate->check($data)){
return show(config("status.error"),$validate->getError());
}