This commit is contained in:
2026-08-05 15:56:08 +08:00
parent 01729b1e0b
commit 2d9e2376b6
106 changed files with 10007 additions and 253 deletions
+62 -9
View File
@@ -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));
}
}