From 7b3c7540d7fb42ffe3c6a16e1bb3917acf05e594 Mon Sep 17 00:00:00 2001 From: tikkhun Date: Sat, 29 Nov 2025 09:23:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=9B=B4=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增用户信息更新功能,支持修改用户名、密码、权限和角色字段 添加用户名唯一性校验和密码加密处理 --- src/controller/user.controller.ts | 17 ++++++++++++++ src/service/user.service.ts | 38 +++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/controller/user.controller.ts b/src/controller/user.controller.ts index 662c253..b3359c3 100644 --- a/src/controller/user.controller.ts +++ b/src/controller/user.controller.ts @@ -62,6 +62,23 @@ export class UserController { return this.userService.toggleUserActive(body.userId, body.isActive); } + // 中文注释:更新用户(支持用户名/密码/权限/角色更新) + @Post('/update/:id') + async updateUser( + @Body() body: { username?: string; password?: string; isSuper?: boolean; isAdmin?: boolean; permissions?: string[] }, + @Query('id') id?: number + ) { + try { + // 条件判断:优先从路径参数获取 ID(兼容生成的 API 文件为 POST /user/update/:id) + const userId = Number((this.ctx?.params?.id ?? id)); + if (!userId) throw new Error('缺少用户ID'); + const data = await this.userService.updateUser(userId, body); + return successResponse(data); + } catch (error) { + return errorResponse(error?.message || '更新失败'); + } + } + @ApiOkResponse() @Get() async getUser(@User() user) { diff --git a/src/service/user.service.ts b/src/service/user.service.ts index dede862..984e709 100644 --- a/src/service/user.service.ts +++ b/src/service/user.service.ts @@ -113,6 +113,44 @@ export class UserService { return this.userModel.save(user); } + // 中文注释:更新用户信息(支持用户名唯一校验与可选密码修改) + async updateUser( + userId: number, + payload: { + username?: string; + password?: string; + isSuper?: boolean; + isAdmin?: boolean; + permissions?: string[]; + } + ) { + // 条件判断:查询用户是否存在 + const user = await this.userModel.findOne({ where: { id: userId } }); + if (!user) { + throw new Error('User not found'); + } + + // 条件判断:若提供了新用户名且与原用户名不同,校验唯一性 + if (payload.username && payload.username !== user.username) { + const exist = await this.userModel.findOne({ where: { username: payload.username } }); + if (exist) throw new Error('用户名已存在'); + user.username = payload.username; + } + + // 条件判断:若提供密码则进行加密存储 + if (payload.password) { + user.password = await bcrypt.hash(payload.password, 10); + } + + // 条件判断:更新布尔与权限字段(若提供则覆盖) + if (typeof payload.isSuper === 'boolean') user.isSuper = payload.isSuper; + if (typeof payload.isAdmin === 'boolean') user.isAdmin = payload.isAdmin; + if (Array.isArray(payload.permissions)) user.permissions = payload.permissions; + + // 保存更新 + return await this.userModel.save(user); + } + async getUser(userId: number) { return plainToInstance( User,