提前准备:wamp64集环境配置域名配置等、php安装composer 管理工具 ,认真研读过thinkphp6.*官网 :https://doc.thinkphp.cn/v6_1/default.html
登录流程三个业务场景:
场景一:访问登录界面且sesseion未保存用户数据,登录成功后跳转主页;
场景二:登录完成后session记录登录用户数据且有效时间范围内,此时访问登录界面直接跳转主页;
场景三:session过期或清除,此时访问主页或其他页面跳转登录页重新登录
下载tp6及依赖库:
1.Tp6框架安装:composer create-project topthink/think 项目名称;
2.通过composer创建的框架在根目录有“.example.env”文件,把文件名称改成“.env”开启本地调试机制;
3.开启多应用:composer require topthink/think-multi-app;多应用开启后要把原来app下的 controller文件删了,不然系统入口文件会默认进入该控制器;
4.下载view引擎 :composer require topthink/think-multi-app
5.下载验证器机制:composer require topthink/think-captcha
场景 一(原生:只在controller&model中操作数据 ,未用到中间件):账号+密码+captcha验证码(tp6)登录
1.文件创建:
app目录下创建admin应用:
①common公共文件:app/admin/common/model/mysql/AdminUser.php
AdminUuser交互管理员数据表:
<?php
namespace app\admin\common\model\mysql;
use think\Model;
class AdminUser extends Model
{
/**
* 通过用户名搜索
* getAdminUserByUserName
* @param $username
* @return array|false|mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getAdminUserByUserName($username){
if(empty($username)) {
return false;
}
$where = [
"username" => trim($username),
];
$result = $this->where($where)->find();
return $result;
}
/**
* 根据主键ID更新数据库
* @param $id
* @param $data
* @return bool
*/
public function updateAdminUserData($id,$data){
if(empty($id) || empty($data) || !is_array($data)){
return false;
}
$where = [
"id" => $id,
];
self::where($where)->update($data);
return true;
}
}
②config文件:app/config/admin.php
③controller:app/controller/LoginController.php
<?php
namespace app\admin\controller;
use app\admin\common\model\mysql\AdminUser as AdminUserModel;
use app\BaseController;
use think\facade\View;
/**
* 后台登录控制器
*/
class LoginController extends AdminBaseController
{
/**
* 登录界面
* @return string
*/
public function index(){
return View::fetch();
}
/**
* 用户登录数据校验
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function check(){
if(!$this->request->isPost()){
return $this->jsonError("请求错误");
}
$username = $this->request->param("username","","trim");
$password = $this->request->param("password","","trim");
$captcha = $this->request->param("captcha","","trim");
// 参数校验 1原生验证 2tp6验证机制
if(!$username || !$password || !$captcha){
return $this->jsonError("用户名|登录密码|验证码不能为空");
}
// 验证码校验
if(!captcha_check($captcha)){
return $this->jsonError("验证码错误");
}
try{
$adminUserObject = new AdminUserModel();
$adminUser = $adminUserObject->getAdminUserByUserName($username);
if(empty($adminUser) || $adminUser->status != config("status.mysql.table_normal")){
return $this->jsonError("用户不存在或用户状态不正常");
}
if($adminUser->password != md5($password)){
return $this->jsonError("用户密码错误!");
}
$data = [
"last_login_time" => time(),
"last_login_ip" => $this->request->ip(),
"update_time" => time(),
"create_time" => time(),
"operate_user" => $adminUser->username,
];
$result = $adminUserObject->updateAdminUserData($adminUser->id,$data);
if(!$result) $this->jsonError("用户数据更新失败");
session(config("admin.session_admin"),$adminUser);
}catch (\Exception $e){
// todo 记录日志 $e->getMessage()
return $this->jsonError("系统异常,登录失败");
}
return $this->jsonSuccess();
}
}
④view视图文件:app/admin/view/login/index.html
前端文件判断登录成功后跳转主页
注:session服务需要在app/middleware.php中打开才生效
场景二&&场景三:
①app/admin/controller/AdminBaseController.php:
创建admin基础控制器来判断管理员登录状态 LoginController继承AdminBaseController
<?php
namespace app\admin\controller;
use app\BaseController;
use think\exception\HttpResponseException;
/**
* admin基础控制器
*/
class AdminBaseController extends BaseController
{
public $adminUser = null;
public function initialize()
{
parent::initialize(); // TODO: Change the autogenerated stub
// 判断是否登录
if(empty($this->isLogin())){ // 未登录跳转登录界面
return $this->redirect(url("/admin/login/index"),302);
}
}
/**
* 判断是否登录
* @return bool
*/
public function isLogin(){
$this->adminUser = session(config("admin.session_admin"));
if(empty($this->adminUser)){
return false;
}
return true;
}
/**
* 抛出重定向路由对象
* @param ...$args
* @return mixed
*/
public function redirect(...$args){
throw new HttpResponseException(redirect(...$args));
}
}
登录控制器做如下修改
class LoginController extends AdminBaseController
{
public function initialize()
{
if($this->isLogin()){ // 如果登录跳转主页
return $this->redirect(url("/admin/index/index"));
}
}
}
最后退出登录清空session:
<?php
namespace app\admin\controller;
class LogoutController extends AdminBaseController
{
public function index(){
// 清空session
session(config("admin.session_admin"),null);
// 跳转到登录界面
return redirect(url("/admin/login"));
}
}
后续持续更新!
需要资源和交流的小伙伴评论区留V!!!