From 745ba98708753a382d3a3e6542f05dca5412ba02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Wed, 30 Mar 2022 11:35:17 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/Auth/LoginController.php | 67 ++++++++++++++++--- app/Models/SmsCode.php | 2 + app/Services/SmsCodeService.php | 1 + 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php b/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php index 7845e2a3..b26e995e 100644 --- a/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php +++ b/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php @@ -5,9 +5,12 @@ 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\SmsCode; use App\Models\User; use App\Models\UserInfo; +use App\Services\SmsCodeService; use Illuminate\Http\Request; +use Illuminate\Support\Str; class LoginController extends Controller { @@ -19,21 +22,29 @@ class LoginController extends Controller */ public function __invoke(Request $request) { - $validated = $request->validate([ - 'phone' => ['bail', 'required', 'string'], - 'password' => ['bail', 'required', 'string'], + $request->validate([ + 'type' => ['bail', 'filled'], + ], [], [ + 'type' => '登录类型', ]); - $user = User::where('phone', $validated['phone'])->first(); + $type = strtolower($request->input('type', 'password')); - if (! $user?->verifyPassword($validated['password'])) { - throw new BizException(__('Incorrect account or password')); + $method = 'loginUsing'.Str::studly($type); + + if (! method_exists($this, $method)) { + throw new BizException('登录类型 非法'); } - if ($user->old_password) { - $user->password = $validated['password']; - $user->old_password = null; + $user = $this->{$method}($request); + + if ($type === 'password') { + if ($user->old_password) { + $user->password = $request->input('password'); + $user->old_password = null; + } } + $user->last_login_at = now(); $user->last_login_ip = $request->realIp(); $user->save(); @@ -75,4 +86,42 @@ class LoginController extends Controller 'token' => $token->plainTextToken, ]); } + + protected function loginUsingPassword(Request $request) + { + $validated = $request->validate([ + 'phone' => ['bail', 'required', 'string'], + 'password' => ['bail', 'required', 'string'], + ], [], [ + 'phone' => '手机号', + 'password' => '密码', + ]); + + $user = User::where('phone', $validated['phone'])->first(); + + if (! $user?->verifyPassword($validated['password'])) { + throw new BizException(__('Incorrect account or password')); + } + + return $user; + } + + protected function loginUsingVerifyCode(Request $request) + { + $validated = $request->validate([ + 'phone' => ['bail', 'required', 'string'], + 'verify_code' => ['bail', 'required', 'string'], + ], [], [ + 'phone' => '手机号', + 'verify_code' => '验证码', + ]); + + app(SmsCodeService::class)->validate( + $validated['phone'], + SmsCode::TYPE_LOGIN, + $validated['verify_code'] + ); + + return User::where('phone', $validated['phone'])->firstOrFail(); + } } diff --git a/app/Models/SmsCode.php b/app/Models/SmsCode.php index 73d030ba..d42c333d 100644 --- a/app/Models/SmsCode.php +++ b/app/Models/SmsCode.php @@ -15,6 +15,7 @@ class SmsCode extends Model public const TYPE_REGISTER = 1; public const TYPE_RESET_PASSWORD = 2; public const TYPE_SET_WALLET_PASSWORD = 3; + public const TYPE_LOGIN = 4; /** * @var array @@ -53,6 +54,7 @@ class SmsCode extends Model self::TYPE_REGISTER, self::TYPE_RESET_PASSWORD, self::TYPE_SET_WALLET_PASSWORD, + self::TYPE_LOGIN, ]; /** diff --git a/app/Services/SmsCodeService.php b/app/Services/SmsCodeService.php index e97130e8..33e4d789 100644 --- a/app/Services/SmsCodeService.php +++ b/app/Services/SmsCodeService.php @@ -53,6 +53,7 @@ class SmsCodeService break; + case SmsCode::TYPE_LOGIN: case SmsCode::TYPE_RESET_PASSWORD: case SmsCode::TYPE_SET_WALLET_PASSWORD: if ($user === null) {