108 lines
3.2 KiB
PHP
108 lines
3.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Service;
|
||
|
|
|
||
|
|
use App\Models\UserModel;
|
||
|
|
use App\Service\common\JWTService;
|
||
|
|
use App\Service\common\UtilsService;
|
||
|
|
use Illuminate\Support\Str;
|
||
|
|
|
||
|
|
class LoginService
|
||
|
|
{
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @var mixed 单例实例,确保该类只有一个全局实例
|
||
|
|
*/
|
||
|
|
private static mixed $_instance;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取实例
|
||
|
|
* @return null|static
|
||
|
|
*/
|
||
|
|
public static function getInstance(): null|static
|
||
|
|
{
|
||
|
|
$name = get_called_class();
|
||
|
|
if (!isset(self::$_instance[$name])) {
|
||
|
|
self::$_instance[$name] = new static();
|
||
|
|
}
|
||
|
|
|
||
|
|
return self::$_instance[$name];
|
||
|
|
}
|
||
|
|
|
||
|
|
public function login($account, $password)
|
||
|
|
{
|
||
|
|
$userModel = UserModel::where('account', $account)->first();
|
||
|
|
if (empty($userModel)) {
|
||
|
|
return $this->register($account, $password);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!password_verify($password, $userModel->password)) {
|
||
|
|
UtilsService::getInstance()->errorThrow('用户或密码错误!');
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($userModel->ip !== get_ip()) {
|
||
|
|
$ipTable = json_decode($userModel->ip_table, true);
|
||
|
|
if (!in_array(get_ip(), $ipTable)) {
|
||
|
|
$ipTable[] = get_ip();
|
||
|
|
}
|
||
|
|
$update = UserModel::where('id', $userModel->id)->update([
|
||
|
|
'ip' => get_ip(),
|
||
|
|
'ip_table' => json_encode($ipTable),
|
||
|
|
'updated_at' => get_time()
|
||
|
|
]);
|
||
|
|
|
||
|
|
if (!$update) {
|
||
|
|
UtilsService::getInstance()->errorThrow('更新失败!');
|
||
|
|
}
|
||
|
|
|
||
|
|
$userModel = UserModel::where('id', $userModel->id)->first();
|
||
|
|
}
|
||
|
|
$result = [
|
||
|
|
'id' => $userModel->id,
|
||
|
|
'account' => $userModel->account,
|
||
|
|
'nick_name' => $userModel->nick_name,
|
||
|
|
'avatar' => $userModel->avatar,
|
||
|
|
'ip' => $userModel->ip,
|
||
|
|
'ip_table' => $userModel->ip_table,
|
||
|
|
];
|
||
|
|
$token = JWTService::getInstance()->generateToken($result);
|
||
|
|
$result['token'] = $token;
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
|
||
|
|
public function register($account, $password)
|
||
|
|
{
|
||
|
|
$userModel = UserModel::where('account', $account)->first();
|
||
|
|
if ($userModel) {
|
||
|
|
UtilsService::getInstance()->errorThrow('账号已被占用!');
|
||
|
|
}
|
||
|
|
|
||
|
|
$createModel = UserModel::create([
|
||
|
|
'account' => $account,
|
||
|
|
'password' => password_hash($password, PASSWORD_DEFAULT),
|
||
|
|
'nick_name' => '新用户'. Str::random(),
|
||
|
|
'avatar' => 'https://pic.rmb.bdstatic.com/bjh/80852bfe7c321988191838517ba64e309354.jpeg@h_1280',
|
||
|
|
'ip' => get_ip(),
|
||
|
|
'ip_table' => json_encode([get_ip()]),
|
||
|
|
'created_at' => get_time()
|
||
|
|
]);
|
||
|
|
|
||
|
|
if (!$createModel) {
|
||
|
|
UtilsService::getInstance()->errorThrow('注册失败!');
|
||
|
|
}
|
||
|
|
|
||
|
|
$result = [
|
||
|
|
'id' => $createModel->id,
|
||
|
|
'account' => $createModel->account,
|
||
|
|
'nick_name' => $createModel->nick_name,
|
||
|
|
'avatar' => $createModel->avatar,
|
||
|
|
'ip' => $createModel->ip,
|
||
|
|
'ip_table' => $createModel->ip_table,
|
||
|
|
];
|
||
|
|
$token = JWTService::getInstance()->generateToken($result);
|
||
|
|
$result['token'] = $token;
|
||
|
|
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
}
|