fix:修复注册逻辑和HTTP状态码问题

核心修复:
- 调整注册流程检查顺序,先验证用户存在性再验证验证码
- 修复HTTP状态码问题,业务失败时返回正确的错误状态码
- 优化错误处理逻辑,提供更准确的错误信息

主要变更:
- 登录核心服务:重构注册方法,优化检查顺序避免验证码无效消费
- 用户服务:分离用户创建和重复检查逻辑,提高代码复用性
- 登录控制器:修复HTTP状态码处理,根据业务结果返回正确状态码
- API文档:更新注册接口说明和错误响应示例
- 测试脚本:优化测试逻辑和注释说明

修复效果:
- 用户已存在时立即返回正确错误信息,不消费验证码
- API响应状态码准确反映业务执行结果
- 错误信息更加用户友好和准确
- 验证码使用更加合理和高效

测试验证:
- 所有核心功能测试通过
- 注册逻辑修复验证成功
- HTTP状态码修复验证成功
- 限流功能正常工作
This commit is contained in:
moyin
2025-12-24 20:39:23 +08:00
parent e537e782a9
commit 404ef5d3e0
5 changed files with 297 additions and 66 deletions

View File

@@ -32,7 +32,6 @@ export class UsersService {
*
* @param createUserDto 创建用户的数据传输对象
* @returns 创建的用户实体
* @throws ConflictException 当用户名、邮箱或手机号已存在时
* @throws BadRequestException 当数据验证失败时
*/
async create(createUserDto: CreateUserDto): Promise<Users> {
@@ -47,6 +46,32 @@ export class UsersService {
throw new BadRequestException(`数据验证失败: ${errorMessages}`);
}
// 创建用户实体
const user = new Users();
user.username = createUserDto.username;
user.email = createUserDto.email || null;
user.phone = createUserDto.phone || null;
user.password_hash = createUserDto.password_hash || null;
user.nickname = createUserDto.nickname;
user.github_id = createUserDto.github_id || null;
user.avatar_url = createUserDto.avatar_url || null;
user.role = createUserDto.role || 1;
user.email_verified = createUserDto.email_verified || false;
user.status = createUserDto.status || UserStatus.ACTIVE;
// 保存到数据库
return await this.usersRepository.save(user);
}
/**
* 创建新用户(带重复检查)
*
* @param createUserDto 创建用户的数据传输对象
* @returns 创建的用户实体
* @throws ConflictException 当用户名、邮箱或手机号已存在时
* @throws BadRequestException 当数据验证失败时
*/
async createWithDuplicateCheck(createUserDto: CreateUserDto): Promise<Users> {
// 检查用户名是否已存在
if (createUserDto.username) {
const existingUser = await this.usersRepository.findOne({
@@ -87,21 +112,8 @@ export class UsersService {
}
}
// 创建用户实体
const user = new Users();
user.username = createUserDto.username;
user.email = createUserDto.email || null;
user.phone = createUserDto.phone || null;
user.password_hash = createUserDto.password_hash || null;
user.nickname = createUserDto.nickname;
user.github_id = createUserDto.github_id || null;
user.avatar_url = createUserDto.avatar_url || null;
user.role = createUserDto.role || 1;
user.email_verified = createUserDto.email_verified || false;
user.status = createUserDto.status || UserStatus.ACTIVE;
// 保存到数据库
return await this.usersRepository.save(user);
// 调用普通的创建方法
return await this.create(createUserDto);
}
/**

View File

@@ -174,6 +174,29 @@ export class LoginCoreService {
async register(registerRequest: RegisterRequest): Promise<AuthResult> {
const { username, password, nickname, email, phone, email_verification_code } = registerRequest;
// 先检查用户是否已存在,避免消费验证码后才发现用户存在
const existingUser = await this.usersService.findByUsername(username);
if (existingUser) {
throw new ConflictException('用户名已存在');
}
// 检查邮箱是否已存在
if (email) {
const existingEmail = await this.usersService.findByEmail(email);
if (existingEmail) {
throw new ConflictException('邮箱已存在');
}
}
// 检查手机号是否已存在
if (phone) {
const users = await this.usersService.findAll();
const existingPhone = users.find((u: Users) => u.phone === phone);
if (existingPhone) {
throw new ConflictException('手机号已存在');
}
}
// 如果提供了邮箱,必须验证邮箱验证码
if (email) {
if (!email_verification_code) {