From f0b0ecec96666e5346af5b3144485d4100498733 Mon Sep 17 00:00:00 2001 From: minorcell Date: Wed, 23 Apr 2025 20:06:42 +0800 Subject: [PATCH] Remove password field from user data in findUsersByRole and findOne responses --- src/usercenter/dto/create-usercenter.dto.ts | 47 +++++--------------- src/usercenter/entities/usercenter.entity.ts | 8 ++-- src/usercenter/usercenter.controller.ts | 18 +++++--- src/usercenter/usercenter.service.ts | 38 ++++++++++++++-- 4 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/usercenter/dto/create-usercenter.dto.ts b/src/usercenter/dto/create-usercenter.dto.ts index c2829a0..22977e7 100644 --- a/src/usercenter/dto/create-usercenter.dto.ts +++ b/src/usercenter/dto/create-usercenter.dto.ts @@ -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; // 用户邮箱 } diff --git a/src/usercenter/entities/usercenter.entity.ts b/src/usercenter/entities/usercenter.entity.ts index fc4c4d8..22f3bda 100644 --- a/src/usercenter/entities/usercenter.entity.ts +++ b/src/usercenter/entities/usercenter.entity.ts @@ -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', @@ -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', diff --git a/src/usercenter/usercenter.controller.ts b/src/usercenter/usercenter.controller.ts index ed9459f..0a2effa 100644 --- a/src/usercenter/usercenter.controller.ts +++ b/src/usercenter/usercenter.controller.ts @@ -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) { @@ -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') diff --git a/src/usercenter/usercenter.service.ts b/src/usercenter/usercenter.service.ts index cea0acc..e93c1c9 100644 --- a/src/usercenter/usercenter.service.ts +++ b/src/usercenter/usercenter.service.ts @@ -17,21 +17,51 @@ export class UsercenterService { private readonly userRepository: Repository, ) { } 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) {