Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 12 additions & 35 deletions src/usercenter/dto/create-usercenter.dto.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,21 @@
import { IsEmail, IsOptional, IsString, Length, IsInt } from 'class-validator';
import { IsEmail, IsString, Length, Matches } from 'class-validator';

export class CreateUsercenterDto {
@IsEmail({}, { message: '无效的邮箱格式' })
userEmail: string; // 用户邮箱

@IsOptional()
@IsString()
@Length(10, 20, { message: '手机号长度应在 10 到 20 个字符之间' })
userPhoneNumber?: string; // 用户手机号,可为空

@IsInt({ message: '用户权限必须是整数' })
userAuth: number; // 用户权限,默认值为 1

@IsInt({ message: '用户简历 ID 必须是整数' })
userResumeId: number; // 用户简历 ID

@IsInt({ message: '用户状态必须是整数' })
userStatus: number; // 用户状态,默认值为 1

@IsInt({ message: '用户邮箱 ID 必须是整数' })
userEmailId: number; // 用户邮箱 ID

@IsOptional()
@IsString()
@Length(7, 30, { message: 'IP 地址长度应在 7 到 30 个字符之间' })
lastLoginIp?: string; // 最后登录 IP,可为空

@IsString()
@Length(1, 20, { message: '创建人长度应在 1 到 20 个字符之间' })
createBy: string; // 创建人

@IsString()
@Length(1, 20, { message: '更新人长度应在 1 到 20 个字符之间' })
updateBy: string; // 更新人

@IsString()
@Length(4, 20, { message: '用户名长度应在 4 到 20 个字符之间' })
userName: string; // 用户名

@IsString()
@Length(6, 30, { message: '用户密码长度应在 6 到 30 个字符之间' })
@Length(6, 30, { message: '密码长度应在 6 到 30 个字符之间' })
@Matches(/((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, {
message: '密码必须包含大小写字母和数字',
})
userPassword: string; // 用户密码

@IsString()
@Length(6, 30, { message: '确认密码长度应在 6 到 30 个字符之间' })
confirmPassword: string; // 确认密码

@IsEmail({}, { message: '无效的邮箱格式' })
userEmail: string; // 用户邮箱
}
8 changes: 4 additions & 4 deletions src/usercenter/entities/usercenter.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ export class UserEntity {
@Column({
type: 'int',
name: 'user_resume_id',
nullable: false,
nullable: true,
})
userResumeId: number; // 用户简历 ID
userResumeId?: number; // 用户简历 ID

@Column({
type: 'int',
Expand All @@ -89,9 +89,9 @@ export class UserEntity {
@Column({
type: 'int',
name: 'user_email_id',
nullable: false,
nullable: true,
})
userEmailId: number; // 用户邮箱 ID
userEmailId?: number; // 用户邮箱 ID

@Column({
type: 'varchar',
Expand Down
18 changes: 13 additions & 5 deletions src/usercenter/usercenter.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { QueryUsercenterDto } from './dto/query-usercenter.dto';

@Controller('usercenter')
export class UsercenterController {
constructor(private readonly usercenterService: UsercenterService) {}
constructor(private readonly usercenterService: UsercenterService) { }

@Post()
createUser(@Body() createUsercenterDto: CreateUsercenterDto) {
Expand All @@ -43,15 +43,23 @@ export class UsercenterController {
*/
@Get('list')
@UseGuards(AuthGuard, AdminGuard)
findUsersByRole(@Query() query: QueryUsercenterDto) {
async findUsersByRole(@Query() query: QueryUsercenterDto) {
// 确保传递给服务方法的是所需类型
const { page = 1, limit = 10, role } = query;
return this.usercenterService.findUsersByRole({ page, limit, role });
const data = await this.usercenterService.findUsersByRole({ page, limit, role });
// 删除密码字段
const { data: users, ...rest } = data;
return { ...rest, data: users.map(user => ({
...user,
userPassword: undefined
})) };
}

@Get(':identifier')
findOne(@Param('identifier') identifier: string) {
return this.usercenterService.findOne(identifier);
async findOne(@Param('identifier') identifier: string) {
const data = await this.usercenterService.findOne(identifier);
const { userPassword, ...userWithoutPassword } = data;
return userWithoutPassword;
}

@Patch(':id')
Expand Down
38 changes: 34 additions & 4 deletions src/usercenter/usercenter.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,51 @@ export class UsercenterService {
private readonly userRepository: Repository<UserEntity>,
) { }
async createUser(createUsercenterDto: CreateUsercenterDto) {
// 验证密码是否匹配
if (createUsercenterDto.userPassword !== createUsercenterDto.confirmPassword) {
throw new BadRequestException('两次输入的密码不匹配');
}

// 检查用户名是否已存在
const existingUser = await this.userRepository.findOne({
where: [{ userName: createUsercenterDto.userName }],
});
if (existingUser) {
throw new BadRequestException('用户名已存在');
}

// 检查邮箱是否已存在
const existingEmail = await this.userRepository.findOne({
where: [{ userEmail: createUsercenterDto.userEmail }],
});
if (existingEmail) {
throw new BadRequestException('邮箱已被注册');
}

await validateOrReject(createUsercenterDto);

// 创建新用户,设置默认值
const { confirmPassword, ...userData } = createUsercenterDto;
const newUser = this.userRepository.create({
...createUsercenterDto,
createTime: new Date(), // 自动设置创建时间
updateTime: new Date(), // 自动设置更新时间
...userData,
userAuth: 1, // 默认为普通用户
userStatus: 1, // 默认为正常状态
createTime: new Date(),
updateTime: new Date(),
createBy: createUsercenterDto.userName, // 创建人为用户自己
updateBy: createUsercenterDto.userName, // 更新人为用户自己
});

if (!newUser) {
throw new BadRequestException('创建失败,请检查参数');
}

const data = await this.userRepository.save(newUser);

// 删除密码字段
const { userPassword, ...userWithoutPassword } = data;
const newData = userWithoutPassword as UserEntity;
return newData
return newData;
}

async findAll(page: number, limit: number) {
Expand Down
Loading