UserLoginLogic.php 6.0 KB
<?php

namespace App\Http\Logic\Bside\User;

use App\Enums\Common\Code;
use App\Exceptions\AsideGlobalException;
use App\Exceptions\BsideGlobalException;
use App\Helper\Common;
use App\Http\Logic\Aside\Project\ProjectLogic;
use App\Models\SmsLog;
use App\Models\User\ProjectRole as ProjectRoleModel;
use App\Models\User\User;
use Illuminate\Support\Facades\Cache;

class UserLoginLogic
{
    const USER_STATUS = 0;

    protected $model;
    protected $param;

    public function __construct()
    {
        //验证账号密码
        $this->param = request()->all();
        $this->model = new User();

    }

    /**
     * @remark :登录接口
     * @name   :login
     * @author :lyh
     * @method :post
     * @time   :2023/6/17 16:43
     */
    public function login(){
        //验证账号密码是否正确
        $info = $this->verifyAccount();
        //验证角色是否被禁用+获取项目详情
        $info = $this->verifyRole($info);
        if(isset($info['token']) && !empty($info['token'])){
            //清除上一次用户缓存
            Cache::pull($info['token']);
        }
        //生成新token
        $token = md5(uniqid().$info['id']);
        //存储缓存
        $info['token'] = $token;
        Cache::add($token,$info);
        //更新用户信息
        $rs = $this->model->edit(['token'=>$token],['id'=>$info['id']]);
        if($rs === false){
            $this->fail('系统错误,请联系管理员');
        }
        //写入日志
        Common::set_user_login(['user_id'=>$info['id'],'ip'=>request()->ip(),'project_id'=>$info['project_id']]);
        return $this->success($info);
    }

    /**
     * 自动登录
     * @author zbj
     * @date 2023/7/25
     */
    public function autologin($data)
    {
        //项目自动登录
        if(isset($data['project_id']) && !empty($data['project_id'])){
            $has_user = $this->model->read(['project_id'=>$data['project_id'],'role_id'=>0]);
        }
        //根据特定用户自动登录
        if(isset($data['user_id']) && !empty($data['user_id'])){
            $has_user = $this->model->read(['id'=>$data['user_id']]);
        }
        if ($has_user === false) {
            $this->fail('该项目未找到注册账号');
        }
        $info = $this->verifyRole($has_user);
        if(!Cache::get($info['token'])){
            //生成新token
            $token = md5(uniqid().$info['id']);
            //存储缓存
            $info['token'] = $token;
            $info['manager_id'] = $data['manager_id'];//代表自动登录写入日志
            Cache::add($token,$info,3600);
        }
        Common::set_user_login(['user_id'=>$info['id'],'ip'=>request()->ip(),'project_id'=>$info['project_id'], 'type'=>1 ,'remark' => '自动登录,操作管理员为:'.$data['manager_id']]);
        return $info;
    }

    /**
     * @name   :(验证账号、密码或验证码是否正确)verifyAccount
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 15:31
     */
    public function verifyAccount(){
        //密码加密
        $password = base64_encode(md5($this->param['password']));
        $info = $this->model->read(['mobile'=>$this->param['mobile'],'password'=>$password,'status'=>$this::USER_STATUS],
            ['id','mobile','role_id','token','name','project_id']);
        if($info === false){
            $info = $this->verifyCode($this->param['mobile'],$this->param['password']);
        }
        return $this->success($info);
    }

    /**
     * @remark :验证验证码是否正确或是否过期
     * @name   :verifyCode
     * @author :lyh
     * @method :post
     * @time   :2023/7/25 17:17
     */
    public function verifyCode($mobile,$password){
        //账号密码没通过时,验证验证码
        $smsModel = new SmsLog();
        $smsInfo = $smsModel->formatQuery(['mobile'=>$mobile,'type'=>$smsModel::TYPE_LOGIN])->orderBy('id','desc')->first();
        if(($password != $smsInfo['code']) || ($smsInfo['created_at']  < date('Y-m-d H:i:s',time() - 300))){
            $this->fail('账号密码错误/验证码错误',Code::USER_REGISTER_ERROE);
        }
        $info = $this->model->read(['mobile'=>$this->param['mobile']],['id','mobile','status','role_id','token','name','project_id']);
        if($info === false){
            $this->fail('当前用户不存在',Code::USER_REGISTER_ERROE);
        }
        if($info['status'] != self::USER_STATUS){
            $this->fail('当前用户被禁用',Code::USER_REGISTER_ERROE);
        }
        return $info;
    }
    /**
     * @name   :(验证角色是否禁用)verifyRole
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 15:34
     */
    public function verifyRole($info){
        //当前用户角色是否被禁用
        $projectRoleModel = new ProjectRoleModel();
        if($info['role_id'] != 0){
            $role_info = $projectRoleModel->read(['id'=>$info['role_id'],'status'=>$this::USER_STATUS]);
            if($role_info === false){
                $this->fail('当前用户角色被禁用',Code::USER_REGISTER_ERROE);
            }
        }
        $project = (new ProjectLogic())->getProjectInfo($info['project_id']);
        $info['company'] = $project['company'] ?? '';
        $info['plan'] = $project['deploy_build']['plan'][0] ?? '';
        $info['domain'] = !empty($project['deploy_optimize']['domain']) ?
            $project['deploy_optimize']['domain'] : ($project['deploy_build']['test_domain'] ?? '');
        return $this->success($info);
    }


    /**
     * @notes: 请简要描述方法功能
     * @param array $data
     * @return array
     */
    public function success($data = [])
    {
        return $data;
    }
    /**
     * @notes: 错误抛出
     * @param string $code
     * @param string $message
     * @throws AsideGlobalException|BsideGlobalException
     */
    public function fail(string $message = "", string $code = Code::SYSTEM_ERROR)
    {
        if((request()->path()[0]) == \App\Enums\Common\Common::B){
            throw new BsideGlobalException($code, $message);
        }
        throw new AsideGlobalException($code, $message);
    }
}