gengx
This commit is contained in:
@@ -3,11 +3,14 @@
|
||||
namespace app\controller\api;
|
||||
|
||||
use app\model\User;
|
||||
use app\model\InvitationCode;
|
||||
use app\model\MembershipLevel;
|
||||
use app\model\Role;
|
||||
use app\service\JwtService;
|
||||
use app\service\SettingsService;
|
||||
use app\service\UserContextService;
|
||||
use think\exception\HttpResponseException;
|
||||
use think\facade\Db;
|
||||
|
||||
class Auth extends BaseApi
|
||||
{
|
||||
@@ -51,6 +54,8 @@ class Auth extends BaseApi
|
||||
return $this->error('游客访问暂不可用', 403);
|
||||
}
|
||||
|
||||
$user->save(['last_login_at' => date('Y-m-d H:i:s')]);
|
||||
|
||||
$token = JwtService::generateToken(['user_id' => $user->id]);
|
||||
|
||||
return $this->success([
|
||||
@@ -70,6 +75,7 @@ class Auth extends BaseApi
|
||||
$username = trim($input['username'] ?? '');
|
||||
$email = trim($input['email'] ?? '');
|
||||
$password = $input['password'] ?? '';
|
||||
$invitationCode = strtoupper(preg_replace('/\s+/', '', trim((string) ($input['invitation_code'] ?? ''))));
|
||||
|
||||
if (strlen($username) < 3 || strlen($username) > 50) {
|
||||
return $this->error('用户名长度需 3-50 个字符');
|
||||
@@ -80,21 +86,59 @@ class Auth extends BaseApi
|
||||
if (strlen($password) < 6) {
|
||||
return $this->error('密码至少 6 位');
|
||||
}
|
||||
if ($invitationCode === '') {
|
||||
return $this->error('请输入邀请码', 422);
|
||||
}
|
||||
|
||||
if (User::where('username', $username)->whereOr('email', $email)->find()) {
|
||||
return $this->error('用户名或邮箱已存在');
|
||||
}
|
||||
|
||||
$defaultRoleId = \app\model\Role::where('slug', 'user')->value('id');
|
||||
$defaultRoleId = Role::where('slug', 'user')->value('id');
|
||||
$membershipId = MembershipLevel::where('slug', 'free')->value('id') ?: 1;
|
||||
|
||||
$user = User::create([
|
||||
'username' => $username,
|
||||
'email' => $email,
|
||||
'password_hash' => password_hash($password, PASSWORD_BCRYPT),
|
||||
'nickname' => $username,
|
||||
'membership_level_id' => 1,
|
||||
'role_id' => $defaultRoleId ?: null,
|
||||
]);
|
||||
$user = Db::transaction(function () use (
|
||||
$invitationCode,
|
||||
$username,
|
||||
$email,
|
||||
$password,
|
||||
$defaultRoleId,
|
||||
$membershipId
|
||||
) {
|
||||
$invitation = InvitationCode::where('code', $invitationCode)->lock(true)->find();
|
||||
if (!$invitation) {
|
||||
$this->abortRegistration('邀请码不存在', 422);
|
||||
}
|
||||
if ($invitation->status !== 'active') {
|
||||
$this->abortRegistration($invitation->status === 'used' ? '邀请码已被使用' : '邀请码已作废', 422);
|
||||
}
|
||||
if ($invitation->expires_at && strtotime((string) $invitation->expires_at) <= time()) {
|
||||
$this->abortRegistration('邀请码已过期', 422);
|
||||
}
|
||||
if (User::where('username', $username)->whereOr('email', $email)->find()) {
|
||||
$this->abortRegistration('用户名或邮箱已存在', 422);
|
||||
}
|
||||
|
||||
$user = User::create([
|
||||
'username' => $username,
|
||||
'email' => $email,
|
||||
'password_hash' => password_hash($password, PASSWORD_BCRYPT),
|
||||
'nickname' => $username,
|
||||
'role' => 'user',
|
||||
'role_id' => $defaultRoleId ?: null,
|
||||
'department_id' => $invitation->department_id ?: null,
|
||||
'membership_level_id' => $membershipId,
|
||||
'status' => 'active',
|
||||
]);
|
||||
|
||||
$invitation->save([
|
||||
'status' => 'used',
|
||||
'used_by' => $user->id,
|
||||
'used_at' => date('Y-m-d H:i:s'),
|
||||
]);
|
||||
|
||||
return $user;
|
||||
});
|
||||
|
||||
$token = JwtService::generateToken(['user_id' => $user->id]);
|
||||
|
||||
@@ -157,4 +201,13 @@ class Auth extends BaseApi
|
||||
{
|
||||
return UserContextService::formatPublicUser($userId);
|
||||
}
|
||||
|
||||
private function abortRegistration(string $message, int $httpCode): never
|
||||
{
|
||||
throw new HttpResponseException(json([
|
||||
'code' => 1,
|
||||
'message' => $message,
|
||||
'data' => null,
|
||||
], $httpCode));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user