TP5.1用户登录成功处理存储用户信息Session优化

author:咔咔

wechat:fangkangfk

源码:https://download.csdn.net/download/fangkang7/10749294

在用户登录成功后,我们会将用户的信息存储到session中

步骤:

我们在用户登录后会储存很多的用户信息,也会设置很多的session的key,后期项目不方便维护和管理

这就需要创建一个工具类来管理我们的SESSION储存用户信息(app\util\SC),将我们需要处理的所有的存储操作放置里边

在下来就是创建门面类(facade\SC)代理这个工具类,在这一步我们需要创建config\facade。放置facade的配置

下来就需要创建钩子初始化

源码:

<?php

namespace app\service;

use app\model\user\User;
use Session;

class UserService
{
    // 定义多种登录方式
    private $loginWay = [
        // 用户名
        'user_name',
        // 邮箱
        'user_emal',
        // 电话
        'user_tel'
    ];

    public function login($username,$password)
    {   
        // 使用循环方式判断用户名是否存在
        foreach($this->loginWay as $k=>$v){
            $user = User::where([$v=>$username])->find();
            // 如果存在就有这个用户,跳出
            if($user){
                break;
            }
        }

        if(!$user){
            //用户名不存在
           return ERROR_NO_USER;
        }
        if($user->user_status != 1){
            // 用户是否被封
            return ERROR_USER_START;
        }
        if(!password_verify($password,$user->user_password)){
            // 密码错误,登录失败
            return ERROR_PASSWORD;
        }

        // 用户登录成功后操作存储用户信息
        $data = [
            'uid' => $user->uid,
            'user_name'=>$user->user_name,
            'is_system'=>$user->is_system,
            'nick_name'=>$user_name,
            'role_id'=>$user->role_id
        ];
        
        Session::set('USER_INFO_SESSION',$data);

        //登录成功
        return SUCCESS;
    }
}

很明显为了保障方法的单一原则,我们需要对用户登录后的存储信心数据进行分离

我们就可以创建一个方法来专门处理存储用户信息的操作

源码:

<?php

namespace app\service;

use app\model\user\User;
use Session;

class UserService
{
    // 定义多种登录方式
    private $loginWay = [
        // 用户名
        'user_name',
        // 邮箱
        'user_emal',
        // 电话
        'user_tel'
    ];

    public function login($username,$password)
    {   
        // 使用循环方式判断用户名是否存在
        foreach($this->loginWay as $k=>$v){
            $user = User::where([$v=>$username])->find();
            // 如果存在就有这个用户,跳出
            if($user){
                break;
            }
        }

        if(!$user){
            //用户名不存在
           return ERROR_NO_USER;
        }
        if($user->user_status != 1){
            // 用户是否被封
            return ERROR_USER_START;
        }
        if(!password_verify($password,$user->user_password)){
            // 密码错误,登录失败
            return ERROR_PASSWORD;
        }

        // 用户登录后的操作
        $this->initLogin($user);

        //登录成功
        return SUCCESS;
    }


    // 登入初始化
    public function initLogin()
    {

        // 用户登录成功后操作存储用户信息
        $data = [
            'uid' => $user->uid,
            'user_name'=>$user->user_name,
            'is_system'=>$user->is_system,
            'nick_name'=>$user_name,
            'role_id'=>$user->role_id
        ];
        // 存储用户信息
        Session::set('USER_INFO_SESSION',$data);
        // 存储用户角色
        Session::set('USER_ROLE_SESSION',$user->role_id);
        // 存储是否是系统后台的用户
        Session::set('USER_IS_SYSTEM',$user->is_system);

    }

}

我们就会发现需要存储的信息是比较多的,这里只是做了存储用户信息,用户退出后我们还是需要在写一遍,这是不合适的

所以我们就创建一个工具类SC

源码: 

<?php

namespace app\util;

use Session;
/**
 * 工具类
 * 用户缓存 facade代理 SC
 */
class SC
{
      /**
       * 用户登录的session key
       */
      CONST LOGIN_MARK_SESSION_KEY = 'LOGIN_MARK_SESSION';
      /**
       * 权限信息
       * @var string
       */
      CONST USER_ROLE_SESSION = 'USER_ROLE_SESSION';
      /**
       * USER用户信息
       * @var string
       */
      CONST USER_INFO_SESSION = 'USER_INFO_SESSION';
      // /**
      //  * 是否设置用户登入的有效时间
      //  * @var string
      //  */
      // CONST CHECK_TIME_SESSION = 'CHECK_TIME_SESSION';
      //
      // private $checkTime = false;

      //---------------------------设置和判断用户的是否登入
      // 设置用户登入token
      public function setLogin($value)
      {
          Session::set(self::LOGIN_MARK_SESSION_KEY, password_hash($value, 1));
      }
      // 判断用户是否登入成功
      public function getLogin()
      {
          Session::get(self::LOGIN_MARK_SESSION_KEY);
      }
      //---------------------------设置用户和获取用户的登入信息
      // 设置用户的信息
      public function setUserInfo($value)
      {
          Session::set(self::USER_INFO_SESSION, $value);
      }
      // 获取用户的信息
      public function getUserInfo()
      {
          Session::get(self::USER_INFO_SESSION);
      }
      //--------------------------设置和获取用户的权限
      // 设置用户的信息
      public function setUserRole($value)
      {
          Session::set(self::USER_ROLE_SESSION, $value);
      }
      // 获取用户的信息
      public function getUserRole()
      {
          Session::get(self::USER_ROLE_SESSION);
      }
      //-------------------------用户退出清空用户缓存信息
      // 退出登入
      public function clear()
      {
          Session::del(self::USER_INFO_SESSION);
          Session::del(self::USER_ROLE_SESSION);
          Session::del(self::LOGIN_MARK_SESSION_KEY);
      }
}

创建门面类代理工具类SC

配置门面类

创建门面类SC

 创建钩子

源码:

<?php

namespace app\behavior;

use Config;
use think\Facade;
use think\Loader;

class LoadBehavior
{
    public function run()
    {
        // 门面类facade注册
        Facade::bind(Config::get('facade.facade'));
        // 别名注册
        Loader::addClassAlias(Config::get('facade.alias'));
    }
}

初始化钩子

下来就可以直接在service/UserService中使用了

这样就解决了登入后信息储存的方便,还有一个方法就是用户退出后清除session的存储信息,也只需要一个方法即可,在项目中给我们提供了很大的方便性 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咔咔-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值