TP5.1用戶登陸成功處理存儲用戶信息Session優化

author:咔咔

wechat:fangkangfk

 

源碼:https://download.csdn.net/download/fangkang7/10749294php

 

在用戶登陸成功後,咱們會將用戶的信息存儲到session中緩存

 

步驟:session

咱們在用戶登陸後會儲存不少的用戶信息,也會設置不少的session的key,後期項目不方便維護和管理app

這就須要建立一個工具類來管理咱們的SESSION儲存用戶信息(app\util\SC),將咱們須要處理的全部的存儲操做放置裏邊工具

在下來就是建立門面類(facade\SC)代理這個工具類,在這一步咱們須要建立config\facade。放置facade的配置ui

下來就須要建立鉤子初始化this

 

源碼:url

<?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;
    }
}

很明顯爲了保障方法的單一原則,咱們須要對用戶登陸後的存儲信心數據進行分離spa

咱們就能夠建立一個方法來專門處理存儲用戶信息的操做.net

源碼:

<?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的存儲信息,也只須要一個方法便可,在項目中給咱們提供了很大的方便性 

相關文章
相關標籤/搜索