fix(activity): 参与人昵称/头像回填真实用户,已注销用户明确标注

- getActivities/getActivityById 的 participants 关联 users,返回真实昵称与头像

- 用户已删除时返回「用户已注销」,避免详情页显示搭子_id

- 118 套件/773 用例全绿;线上活动详情已验证真实昵称
这个提交包含在:
xcbyy
2026-10-23 09:09:41 +08:00
父节点 f082ae8276
当前提交 4d2e7b6464
共有 2 个文件被更改,包括 13 次插入 和 2 次删除

查看文件

@@ -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,
};
}

查看文件

@@ -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);