From 0c8f2619481f7d8b743f4c0c6e851113bde7a5cb Mon Sep 17 00:00:00 2001 From: juzeon <812312770@qq.com> Date: Mon, 11 Oct 2021 19:26:44 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9Anickname=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/helpers/entity-fill.ts | 1 + src/models/post-model.ts | 2 +- src/models/user-model.ts | 12 ++++++++++++ src/routers/user-router.ts | 12 ++++++++++++ src/services/post-service.ts | 14 ++++++++++++++ src/services/user-service.ts | 9 +++++++++ src/types.ts | 1 + 7 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/helpers/entity-fill.ts b/src/helpers/entity-fill.ts index 1325d45..4ae26d9 100644 --- a/src/helpers/entity-fill.ts +++ b/src/helpers/entity-fill.ts @@ -5,6 +5,7 @@ export function fillIUser(single: any) { id: single.id, username: single.username, realName: single.realName, + nickname: single.nickname, avatar: single.avatar, role: single.role } diff --git a/src/models/post-model.ts b/src/models/post-model.ts index 5f842bd..47e4a03 100644 --- a/src/models/post-model.ts +++ b/src/models/post-model.ts @@ -13,7 +13,7 @@ export class PostModel { } async findPostsByStatus(status: TPostStatus, page: number) { - return db.query('select p.*,u.realName,u.avatar from posts p left join users u on u.id=p.userId where p.status=? order by p.time desc ' + return db.query('select p.*,u.realName,u.nickname,u.username,u.avatar from posts p left join users u on u.id=p.userId where p.status=? order by p.time desc ' + pageToLimitSqlSegment(page), [status]) } diff --git a/src/models/user-model.ts b/src/models/user-model.ts index 09629be..3114e4c 100644 --- a/src/models/user-model.ts +++ b/src/models/user-model.ts @@ -32,4 +32,16 @@ export class UserModel { async updateAvatar(id: number, avatar: string) { await db.query('update users set avatar=? where id=?', [avatar, id]) } + + async updateNickname(id: number, nickname: string) { + await db.query('update users set nickname=? where id=?', [nickname, id]) + } + + async findUserByNickname(nickname: string) { + let user = await db.query('select * from users where nickname=?', [nickname]) + if (!user.length) { + return null + } + return fillIUser(user[0]) + } } diff --git a/src/routers/user-router.ts b/src/routers/user-router.ts index 4e15495..08790c1 100644 --- a/src/routers/user-router.ts +++ b/src/routers/user-router.ts @@ -31,5 +31,17 @@ userRouter.post('/uploadAvatar', res.json(await userService.uploadAvatar(req.user as JWTUserPayload, req.files.image as UploadedFile)) }) ) +userRouter.post('/updateNickname', + body('nickname').notEmpty().withMessage('请输入昵称').isLength({max: 31}).custom((input, meta) => { + if (!/^[\u4e00-\u9fa5_a-zA-Z0-9]+$/.test(input)) { + throw new Error('昵称只能包括中文,英文字母和数字及「_」') + } + return true + }), + expressAsyncHandler(async (req: express.Request, res: express.Response) => { + if (hasValidationErrors(req, res)) return + res.json(await userService.updateNickname(req.user as JWTUserPayload, req.body.nickname)) + }) +) export {userRouter} diff --git a/src/services/post-service.ts b/src/services/post-service.ts index 9ec56fb..fef7400 100644 --- a/src/services/post-service.ts +++ b/src/services/post-service.ts @@ -22,6 +22,20 @@ export class PostService { async listPublished(page: number) { let posts = await this.postModel.findPostsByStatus(2, page) + posts = posts.map((single: any) => { + if (!single.nickname) { + let stars = '' + for (let i = 0; i < single.username.length - 6; i++) { + stars += '*' + } + single.nickname = single.username.substring(0, 4) + + stars + + single.username.substring(single.username.length - 2, single.username.length) + } + delete single.realName + delete single.username + return single + }) return resultJson.success(posts) } } diff --git a/src/services/user-service.ts b/src/services/user-service.ts index a0835cc..6ba57ff 100644 --- a/src/services/user-service.ts +++ b/src/services/user-service.ts @@ -72,4 +72,13 @@ export class UserService { await this.userModel.updateAvatar(jwtUserPayload.id, avatar) return resultJson.success(avatar) } + + async updateNickname(jwtUserPayload: JWTUserPayload, nickname: string) { + let user = await this.userModel.findUserByNickname(nickname) + if (user && user.id !== jwtUserPayload.id) { + return resultJson.error('该昵称已被使用') + } + await this.userModel.updateNickname(jwtUserPayload.id, nickname) + return resultJson.success(nickname) + } } diff --git a/src/types.ts b/src/types.ts index ff277a1..a6ed043 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,6 +9,7 @@ export interface IUser { id?: number, username: string, realName: string, + nickname?: string, avatar?: string, role: TUserRole }