79 lines
2.4 KiB
PHP
79 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Endpoint\Api\Http\Controllers\Auth;
|
|
|
|
use App\Constants\Device;
|
|
use App\Endpoint\Api\Http\Controllers\Controller;
|
|
use App\Exceptions\BizException;
|
|
use App\Models\User;
|
|
use App\Models\UserInfo;
|
|
use Illuminate\Http\Request;
|
|
|
|
class LoginController extends Controller
|
|
{
|
|
/**
|
|
* 登录
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function __invoke(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'phone' => ['bail', 'required', 'string'],
|
|
'password' => ['bail', 'required', 'string'],
|
|
]);
|
|
|
|
$user = User::where('phone', $validated['phone'])->first();
|
|
|
|
if (! $user?->verifyPassword($validated['password'])) {
|
|
throw new BizException(__('Incorrect account or password'));
|
|
}
|
|
|
|
if ($user->old_password) {
|
|
$user->password = $validated['password'];
|
|
$user->old_password = null;
|
|
}
|
|
$user->last_login_at = now();
|
|
$user->last_login_ip = $request->realIp();
|
|
$user->save();
|
|
|
|
// 获取登录设备
|
|
$device = $request->header('client-app', Device::UNIAPP);
|
|
|
|
switch ($device) {
|
|
case Device::MERCHANT:
|
|
if ($user->userInfo?->agent_level < UserInfo::AGENT_LEVEL_VIP) {
|
|
throw new BizException('账户没有权限');
|
|
}
|
|
|
|
// 清理此用户的商户端令牌
|
|
$user->tokens()->where('name', $device)->delete();
|
|
// 颁发新的商户端令牌
|
|
$token = $user->createToken($device);
|
|
break;
|
|
case Device::DEALER:
|
|
if (!$user->isDealer()) {
|
|
throw new BizException('账户没有权限');
|
|
}
|
|
|
|
// 清理此用户的商户端令牌
|
|
$user->tokens()->where('name', $device)->delete();
|
|
// 颁发新的商户端令牌
|
|
$token = $user->createToken($device);
|
|
break;
|
|
default:
|
|
$device = Device::UNIAPP;
|
|
// 清理此用户的商城端令牌
|
|
$user->tokens()->where('name', $device)->delete();
|
|
// 颁发新的商城端令牌
|
|
$token = $user->createToken($device, ['mall']);
|
|
break;
|
|
}
|
|
|
|
return response()->json([
|
|
'token' => $token->plainTextToken,
|
|
]);
|
|
}
|
|
}
|