feat(display): 分项成绩与个人榜也显示单位 logo(个人榜在姓名前)

- 服务端补下发:dto.EventResultRow 与 athleteStandingDTO 各加 logoPath,
  分别取「该行单位」与「该运动员所属单位」的 teams.logo_path;空串统一收敛为 null
- 大屏抽出 TeamLogo.vue(1em / object-fit:contain / 加载失败保留占位、@load 复原),
  原先在积分榜与团体奖牌榜各写一遍的逻辑收敛成一份,四处复用
- 分项成绩页:单位列名字前显示 logo;个人积分榜:运动员姓名前显示其单位 logo
- guards/mock 同步解析与补字段;补 11 条测试(类型解析 + SFC 模板断言)

顺带修:管理端示例数据 athleteStandings 缺新必填字段导致的 vue-tsc 报错。

自检:服务端 11 包全绿;前端 vue-tsc + build、node --test 80/80。
This commit is contained in:
AskaEth committed 2026-09-10 10:32:19 +08:00
1 parent 6f47849e1e
commit 8c74a82da4
17 files changed
+391 -51

No files matched your search

+2
View File
@@ -135,6 +135,7 @@ function buildRows(seeds: readonly ResultSeed[], unit: string): EventResultRow[]
teamCode: team?.code ?? '',
teamName: team?.name ?? '',
shortName: team?.shortName ?? null,
logoPath: team?.logoPath ?? null,
athleteId: index + 1,
athleteName: seed.athlete,
memberNames: null,
@@ -236,6 +237,7 @@ function buildAthletes(): AthleteStanding[] {
teamCode: item?.code ?? '',
teamName: item?.name ?? '',
shortName: item?.shortName ?? null,
logoPath: item?.logoPath ?? null,
totalPoints,
gold,
silver,