UserLoginLogic.php
6.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?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);
}
}