Files
Scoreboard/devdocs
..

运动会积分榜系统 · 开发文档集

项 内容
项目 一拖二运动会积分榜:一个服务端 + 实时积分大屏 + 裁判长管理面板
仓库 ssh://git@git.yeij.top:2222/AskaEth/Scoreboard.git
作者 AskaEth
文档版本 v0.1(讨论稿) · 2026-09-09
状态 待确认:第 D1–D13 项未拍板前,不进入编码

本目录取代了早期的单文件《开发规划.md》。内容按模块拆开,改哪块就动哪份,避免一份文档越滚越长。


文档地图

编号 文档 内容 主要读者
— README 索引、决策清单、阅读顺序 全部
01 需求与范围 目标/非目标、名词表、角色、赛事时间线、核心流程 主办方、产品
02 积分与排名规则 积分表、并列、双倍、破纪录、tie-break 裁判长、开发
03 技术选型与架构 选型对比、模块划分、数据流、目录结构、编码规范 开发
04 数据模型 表结构、约束、索引、积分流水原则 开发
05 接口与实时协议 REST API、Socket.IO 事件、断线重连 开发
06 大屏端设计 页面、轮播、动效、分辨率、无人值守 设计、开发
07 管理面板设计 信息架构、成绩录入、审核发布、导出 裁判长、开发
08 安全与可靠性 权限、审计、备份、容灾预案 运维、开发
09 测试策略 测试分层、积分引擎用例矩阵、彩排 开发、测试
10 部署与现场方案 绿色部署包、kiosk 模式、现场网络 现场运维
11 开发计划与里程碑 M0–M8、关键路径、交付物 全部
12 风险登记册 风险、影响、概率、对策 全部

阅读顺序

01 需求 → 02 规则 → 03 架构 → 04 数据模型 → 05 接口 → 06/07 界面 → 08 可靠性 → 09 测试 → 10 部署 → 11 计划 → 12 风险

规则先行:02 篇是整个系统的心脏,规则定不下来,数据模型和积分引擎都不能动工。

文档维护约定

改动内容 要同步更新的文档
积分规则、排名规则 02(必须)→ 04(表结构)→ 09(用例)
新增业务角色 01 → 08
新增接口 / 实时事件 05 → 04
大屏页面增减 06 → 05(事件载荷)
现场环境变化 10 → 03(选型)→ 08(容灾)
决策清单拍板 README(勾掉 🔴)→ 对应模块

决策清单(🔴 待主人拍板)

「✅建议」是推荐默认值。主人可以只回复「按建议」,或逐条改。

D1 赛事规模与结构

项 ✅建议默认
参赛单位数 7 个(初估,以实际报名为准)
大项数 3 类:团队项目 / 个人项目 / 球类项目
小项数 26 个(8 团队 + 12 个人 + 6 球类)
运动员数量级 ≤300 人
是否多年办赛 是,需要保留历届数据(为纪录榜服务)

🔴 请确认:实际参赛单位数量与项目结构?是否会有多个「组别」(如职工组/青年组/女子组)?

D2 积分规则

项 ✅建议默认
名次积分表 前 8 名:9 / 7 / 6 / 5 / 4 / 3 / 2 / 1
并列名次 名次顺延:并列第 2 → 两人各得第 2 名分值,无第 3 名,下一名是第 4 名
团体/接力项目 双倍积分(multiplier = 2)
球类项目 双倍积分
报名不足 8 人 按实际名次取分,空缺名次分值作废
弃权 / DNS / DSQ 0 分,且不占名次(名次顺延)
破纪录加分 赛会纪录 +2、市级 +5、省级 +8(取最高一条,不累加)
扣分 / 处罚 支持人工调整,必须填理由,记入审计

🔴 请确认:积分表分值、是否双倍、破纪录加分档位与规则。详见 02-积分与排名规则。

D3 排名规则

项 ✅建议默认
主榜 总积分榜(总分降序)
同分 tie-break 金牌数 → 银牌数 → 铜牌数 → 单位编码
是否要奖牌榜 要(金/银/铜计数)
是否要个人积分榜 要(个人总分榜,用于大屏展示)
并列奖牌计数 两人并列第 1 → 各记 1 金,无银牌(即名次顺延)

D4 审核流程

方案 说明
A(✅建议) 两级:裁判录入草稿 → 裁判长确认发布 → 上屏。发布前可随意改,发布后修改需「撤销发布」
B 一级:录入即上屏。简单但风险高,录错一个数全场都看见
C 三级:录入 → 复核 → 发布

🔴 现场只有一位裁判长操作的话,选 A 还是 B?我强烈建议 A,理由:录入必然有笔误,A 的成本只是多一次点击。

D5 用户与权限

项 ✅建议默认
账号数 3–5 个:1 个管理员 + 1–2 个裁判长 + 若干录入员
角色 admin(全部)/ chief(录入+审核+发布+调整)/ recorder(仅录入草稿)/ viewer(只读)
大屏端 不需要登录(只读),可选 display_key 防止外人误开
会话时长 12 小时(覆盖整个比赛日)

🔴 确认角色划分是否够用。

D6 成绩来源

方案 说明
A(✅建议) 纯手工录入 + 支持从 Excel/CSV 批量粘贴导入
B 对接计时设备(需设备型号与协议,本期不承诺)
C 线下 Excel 整理后整表导入

🔴 现场实际怎么产生成绩?如果是手写记录后录入,A 的「快速录入模式」是开发重点。

D7 大屏页面

页 内容 ✅建议
P1 总积分榜(全单位,含名次升降箭头) 轮播页
P2 奖牌榜 轮播页
P3 纪录榜(历史最好成绩) 轮播页
P4 最新成绩 / 刚刚产生名次的项目 轮播页
P5 单项成绩榜(当前正在进行的项目) 轮播页
P6 公告 / 图文 手动触发
— 是否自动轮播 是,每页 20s,可后台锁定某页

🔴 确认页面清单与轮播策略(自动 / 固定 / 手动)。详见 06-大屏端设计。

D8 现场部署环境

🔴 需要主人提供:

  1. 现场主机操作系统与架构(Windows / Linux;x86_64 / arm64)?
  2. 主机是笔记本、迷你主机还是服务器?有几台(是否有备机)?
  3. 大屏数量、尺寸、分辨率(设计分辨率待定,建议 3840×1920 或 1920×1080)?
  4. 现场网络:有没有外网?是否独立交换机?大屏机用什么连接(HDMI / 无线投屏)?
  5. 录入人员用什么设备(笔记本 / 平板)?平板是什么系统?

这组信息直接决定部署方案(见 10-部署与现场方案)。

D9 是否需要手机看榜

方案 说明
A(✅建议) 局域网内手机可看(大屏页自适应),不开公网
B 需要外网可访问(要额外考虑域名、HTTPS、安全加固)
C 完全不需要

D10 技术栈

方案 说明
A(✅建议) Node.js 22 + TypeScript + Fastify + Socket.IO + SQLite + Vue 3 + Vite
B Go 1.26 单二进制(chi + websocket + 纯 Go SQLite + embed 前端)

详见 03-技术选型与架构。🔴 如果现场机器装不了 Node 运行时,就选 B。

D11 历史数据

🔴 是否需要导入历届纪录(往年纪录榜)作为纪录基准?数据现在是什么格式(Excel / 纸质 / 无)?

D12 导出与打印

项 ✅建议默认
导出总积分榜 Excel 要
导出各单位积分明细(哪个项目拿了几分) 要
导出成绩册(全部小项成绩) 要
现场打印 不做打印排版,导出 Excel 后自行打印

D13 大屏视觉方案

方案 说明
A 由主人/设计方提供新的视觉稿(PSD / Figma / 参考图),我按稿实现
B(✅建议) 先按「深色底 + 高对比数据表格」的通用赛事大屏风格做一版,用真实数据投屏后再微调
C 指定某套现成主题

🔴 确认视觉方向,以及是否有现成设计稿。目前无定稿视觉,因此 06-大屏端设计 中的视觉规范标注为「占位,待定」。


下一步

  1. 主人确认 D1–D13(可以只回「按建议」,或逐条改)。
  2. 我按确认结果把文档集从 v0.1 修到 v1.0,并把 02 篇的规则整理成可执行的《积分规则细则》。
  3. 定稿后进入 M1(数据库骨架),见 11-开发计划与里程碑。