Files
Scoreboard/README.md
T
AskaEth 782a38f82f feat: 大屏控制可看局域网设备并逐台切页 + 两种新导出(单页成绩 / 单位积分总明细)
## 大屏控制(用户:管理面板只能看到本机显示器,看不到局域网设备;也不能给某块屏单独切页)
- 服务端:`POST /api/display/command` 新增可选 `targets []string` —— 空 = 广播(公告语义不变),
  非空 = 只发给点名的实例并返回命中数;命中 0 个返回 404 +「目标大屏已离线,请刷新在线列表」
  (不落审计、公告也不落库)。`DisplaySender` 签名随之扩展,新增
  `Hub.SendCommandToInstances`(与按房间的 SendCommand 并存)。
- 服务端:WS `hello` 新增可选 `screen`,`realtime.Instance` 新增 `Screen`(不带 omitempty,
  局域网浏览器恒为空串),这样管理端能把「本机显示器」与「在线实例」精确对上。
- 管理端「大屏控制」:写死的「在线看板」占位换成真实列表(5 秒轮询、页面隐藏停表),
  列出实例 id / 在线离线 / 落后 / 屏号或「局域网浏览器」/ 当前页 / 来源 / 心跳;
  每行可单独切页;本机显示器卡片补「当前页」与逐屏切页;离线时控件置灰并说明原因。
  页面下拉改为共用大屏那份页名清单(管理端两处标签随之变为「个人积分奖牌榜」「分项成绩」)。

## 导出(用户:保留多页工作簿的同时,再要一种全平铺单页;积分榜明细也要能导出)
- 新增 `GET /api/export/all-flat.xlsx` → `赛事成绩总表(单页).xlsx`:一个工作簿一张表,
  列 = 大项/小项/组别/名次/号码/单位/运动员-队/成绩/积分/状态/备注;前三列取
  `EventSheet` 的结构化字段(不解析标题),后 8 列就是 `eventColumns` 本身(append 拼出,
  两处不可能漂移)。**既有「全部」(all.xlsx,多 sheet)一字未动。**
- 新增 `GET /api/export/teams.xlsx` → `单位积分总明细.xlsx`:一张带「单位」列的总表 +
  每个有明细行的单位一张分表;**无明细行的单位不出分表**(空表没信息量,且会把假删除的
  隐藏单位名字重新印进导出件);已隐藏但有流水的单位照常出表(它在榜单上)。
- 积分榜页:页头「导出总明细」、单位明细面板「导出该单位明细」;导出页新增「全部(单页)」。

测试:服务端 12 包全绿 / 347 个测试函数;前端 vue-tsc 通过、184 例全过;Console 18 文件。
docs/ 与 devdocs/ 同步(含新增 Q65–Q70 与两轮进度记录)。
2026-09-11 00:44:03 +08:00

55 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Scoreboard · 赛事积分榜系统
一套局域网内部署的赛事成绩与积分系统:**一个服务端 + 两个界面**,后台一改数据,前台大屏实时跟着变。
| 界面 | 地址 | 用途 |
| --- | --- | --- |
| 实时积分大屏 | `/display` | 只读、无人值守;成绩发布后 1 秒内更新 |
| 管理面板 | `/admin` | 录入、发布成绩,控制大屏;未登录可只读查看全部赛事数据 |
## 功能概览
- **四个榜**:总积分榜、团体奖牌榜、个人积分奖牌榜、分项成绩表
- **录入即上屏**:成绩录入 → 发布 → 大屏即时更新
- **可追溯、可撤销**:草稿不上屏;发布后纠错走「撤销发布 → 改 → 重新发布」,全程留痕
- **变更历史**:仿 Git 图谱,一眼看清成绩是怎么变成现在这样的
- **现场公开**:积分明细可下钻,争议时一键推送到大屏
- **全屏公告**:推送后先全屏显示(5–120 秒),随即常驻大屏底部公告栏,直到替换或清除
- **小项类型齐全**:个人 / 团体 / 对抗比赛 / **个人+团体**(同一个项目同时按个人与团体通道记分)
- **多显示器**:支持多屏各锁一页(kiosk 全屏),也能在管理端为指定显示器单独开窗或收窗;「大屏控制」页的「在线大屏」列表实时显示每个在线实例(含局域网浏览器打开的 `/display`)当前在哪一页,可逐屏 / 逐设备单独切页
- **规则可配置**:积分规则以规则包(YAML)描述,可导入导出、跨赛事复用
- **运动员名册**:启用 / 停用 / **彻底删除**三档——「停用」保留全部历史数据、随时可启用;「彻底删除」把人员档案连同他名下的报名、成绩与积分流水一起删掉且不可恢复,并自动按新排序重算受影响小项的排名与积分(大屏同步更新)
- **参赛单位名册**:启用 / 停用 / **彻底删除**三档——「停用」保留全部历史数据、随时可启用;「彻底删除」是**假删除**,只把单位从列表里移除(界面上没有恢复入口),它的报名、成绩、积分流水与名下运动员全部保留,**积分榜不会变化**;报名表里再次用到该单位编码会让它自动恢复
- **赛事独立存档**:每个赛事一个独立项目目录,整包可导出/导入(含会标、背景图、单位 logo 与上传的字体),并可在管理端页内一键切换当前赛事
- **结果导出**:Excel 总表、全部(多 sheet)、**全部(单页)**、分项成绩表、单位积分明细可分别导出;「积分榜」页还可导出**单位积分总明细**(总表 + 每个有数据的单位一张分表)与**单个单位的积分明细**
- **单位 logo**:积分榜、奖牌榜、分项成绩表与个人榜都会显示参赛单位 logo
- **大屏字体可配**:标题字体与正文字体可在「系统设置 → 赛事信息 → 字体」里从四款内置字体中选,或上传自己的字体(ttf / otf / woff / woff2,单个不超过 20 MiB);只作用于大屏,加载失败自动回落默认字体,字体文件随赛事项目包一起导出/导入
## 快速开始
1. 解压部署包
2. 双击 `Scoreboard_Console.exe`(现场推荐:守护服务端、把大屏投到扩展屏、防熄屏、开机自启)
3. 浏览器打开终端提示的地址
```
大屏 http://<主机IP>:19540/display
管理面板 http://<主机IP>:19540/admin
```
> 也可以直接双击 `scoreboard.exe`(Linux 下执行 `./scoreboard`)只跑服务端,大屏投放与进程守护需自行接管。
>
> 完全离线运行,不依赖外网,不需要安装任何运行时。
## 文档
- [上线检查清单](./docs/上线检查清单.md):比赛当天照着走一遍的核对表(含交付物、目标机、首次启动、赛事项目包与规则包导入、大屏与公告、备份与回退)
- [部署指南](./docs/部署指南.md):运行环境、安装与首次启动、端口与配置、大屏接线、赛事项目包导入/切换、备份恢复、故障排查
- [使用手册](./docs/使用手册.md):角色权限、各功能页面的操作步骤、大屏端使用、常见操作问题
- [报名名单导入规范](./docs/报名名单导入规范.md):报名表该用什么格式、11 列逐列怎么填、个人/团体/「个人+团体」三种项目的填法、常见报错对照(可直接发给各单位填表人)
- [常见问题(FAQ)](./docs/常见问题.md):账号、成绩与积分、大屏、数据备份、导出导入
- 规则包格式:见 [rules/README.md](./rules/README.md)
## 许可证
MIT