diff --git a/server/src/db/repository.ts b/server/src/db/repository.ts index cf02c20..9c57735 100644 --- a/server/src/db/repository.ts +++ b/server/src/db/repository.ts @@ -174,7 +174,7 @@ export class MysqlRepository { id: p.id, activityId: p.activityId, userId: p.userId, - nickname: p.nickname || '', + nickname: p.nickname || '用户已注销', avatar: p.avatar || '', payAmountCents: p.payAmountCents, checkinStatus: Boolean(p.checkinStatus), @@ -238,7 +238,11 @@ export class MysqlRepository { return { ...act, allowDynamicPrice: Boolean(act.allowDynamicPrice), - participants: ptRows.map((p: any) => ({ ...p, checkinStatus: Boolean(p.checkinStatus) })), + participants: ptRows.map((p: any) => ({ + ...p, + nickname: p.nickname || '用户已注销', + checkinStatus: Boolean(p.checkinStatus), + })), joinedCount: ptRows.length, }; } diff --git a/server/tests/activity-list-content.spec.ts b/server/tests/activity-list-content.spec.ts index b78bdb3..d3883c6 100644 --- a/server/tests/activity-list-content.spec.ts +++ b/server/tests/activity-list-content.spec.ts @@ -30,6 +30,13 @@ describe('ActivityListContent(活动大厅真实数据与内容规范)', () expect(page).toContain('creatorNickname'); }); + it('活动参与者必须返回真实昵称与头像,而不是只显示搭子_id', () => { + const repo = fs.readFileSync(path.join(root, 'server', 'src', 'db', 'repository.ts'), 'utf-8'); + expect(repo).toContain('LEFT JOIN users u ON u.id = p.user_id'); + expect(repo).toContain('nickname: p.nickname ||'); + expect(repo).toContain('avatar: p.avatar ||'); + }); + it('页面严禁包含任何系统 Emoji 字符', () => { const emojiRegex = /(?:\p{Extended_Pictographic}|\p{Emoji_Presentation}|[\u2600-\u27BF])/u; expect(emojiRegex.test(page)).toBe(false);