validate([ 'type' => ['bail', 'filled'], ], [], [ 'type' => '登录类型', ]); $type = strtolower($request->input('type', 'password')); $method = 'loginUsing'.Str::studly($type); if (! method_exists($this, $method)) { throw new BizException('登录类型 非法'); } $user = $this->{$method}($request); $user->checkStatus(); 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(); $device = Device::UNIAPP; // 清理此用户的商城端令牌 $user->tokens()->where('name', $device)->delete(); // 颁发新的商城端令牌 $token = $user->createToken($device, ['mall']); return response()->json([ '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(); } }