feat: 分批发布 + 实时赛况页 + 显式批次层 + 成绩框实时提示 + 窄屏适配 + 版本号单一真相
## 分批发布(现场:100 米跑道只有 8 条,不能等所有人跑完才发) - 空成绩从"错误"降级为"提示",不再阻塞发布;真会算错(写法无法识别、秒位 ≥ 60、 手动名次缺名次)仍挡住。发布确认框说明"只发已填的 M 人,其余保持未发布"。 - 服务端核实:publishResults/computeEventScore 本就不会因缺成绩报错 (collectCandidates 直接跳过没有 results 的报名项),根因在前端防呆。 ## 实时赛况(新大屏页 + 定向接口) - 新增 `GET /api/display/live`(guest 可读):返回「当前项目」判定 + 该项目**全量**已发布成绩 (不受快照 latestResults 的 20 行截断)。回退链:manual 指定 > 排期命中 > 最近发布。 设置键 display.live_events / display.live_source。 - 大屏新页 `live`「实时赛况」:1 个项目单栏、2 个自动左右分栏;失败保留上一次画面 (下一场开始前持续显示上一场);30s 轮询(判定依赖当前时间)+ 快照变更触发。 - 管理端「大屏控制」新增「实时赛况」卡;该卡走 PUT /api/settings(admin-only), 故对非管理员整组置灰 + 提示条(不新增角色)。 ## 显式批次层(组别之下) - 迁移 0019 `entries.heat`;批次仅是录入/展示分组,**不参与算分**(有"分批与不分批结果 完全一致"的断言守住)。批量设置接口 + 导入 CSV 可选列 heat + 录入页批次下拉 + 一键均分(按 N 人切片,已有批次号接着往后排)。 ## 成绩输入框实时悬浮提示 - 聚焦格旁的浮动气泡:pointer-events:none、不占布局不改行高、贴底自动上翻; 合法显示解析结果(1:06 → = 66 秒)、可疑/不合法显示原因并带那一格原文; 与发布防呆共用同一套纯函数(entryGuards.ts),口径不会分叉。 ## 窄屏 / 手机端布局 - 真浏览器(Playwright + chromium)在 1440/1024/768/390 四宽度逐页审计 + 溢出探针, 四轮迭代修复;桌面端 1440 前后像素差异 < 0.25%(无回归);修掉如「修改密码」输入框 塌成 22px 这类真问题。 ## 版本号单一真相 - 新增仓库根 `VERSION`:构建时注入二进制(-X main.version)并同步 console/package.json 的版本(产物名跟随)。源码里不再有人工维护的版本号(兜底值改为 `dev`,故意不写数字)。 测试:服务端 13 包全绿;前端 vue-tsc 通过、249 例全过;Console 18 文件。 docs/ 与 devdocs/ 同步(FAQ 到 Q80、新增 devdocs/16 自定义大屏模板设计文档)。
This commit is contained in:
1 parent
e5e0944d26
commit
08a5740fb2
64 files changed
+4968
-270
No files matched your search
+33
-3
@@ -37,7 +37,7 @@
|
||||
撤销发布 → 修改 → 重新发布。撤销会作废该组积分流水,大屏回退到发布前状态,过程可在「变更历史」查看。
|
||||
|
||||
**Q9:为什么「发布」是灰的?**
|
||||
常见原因:未登录、服务端断开、示例数据模式,或存在阻止发布的校验错误(成绩为空、秒位 ≥ 60、成绩写法无法识别、手动名次项目缺名次)。成绩格的报错现在会把**那一格的实际内容**打出来并对症给改法,照着提示改即可(见 Q75、Q76)。
|
||||
常见原因:未登录、服务端断开、示例数据模式,或存在**会阻止发布**的校验错误(秒位 ≥ 60、成绩写法无法识别、手动名次项目缺名次)。**没录成绩不算错误、不挡发布**(见 Q77)。成绩格的报错会把**那一格的实际内容**打出来并对症给改法(见 Q75、Q76)。
|
||||
|
||||
**Q10:并列名次怎么处理?**
|
||||
成绩相同(或手动名次相同)自动按并列处理,显示同一名次。默认口径是「顺延」:并列第 3 各得第 3 名的分,无第 4 名,下一名第 5 名;奖牌同样并列(并列第 1 各记 1 金、无银)。具体口径由规则包配置决定。
|
||||
@@ -428,10 +428,10 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点
|
||||
|
||||
别和 Console 自己的 `logs\console.log`(在安装目录里)混淆:那个装的是 Console 与服务端的控制台输出;服务端日志文件在数据目录。
|
||||
|
||||
**Q75:为什么我明明填了成绩,发布却说缺少成绩?**
|
||||
**Q75:为什么我明明填了成绩,那一行还是被当成「还没录」?**
|
||||
最可能是把格子里的**灰字示例文本**当成了已填内容。过去成绩格的示例是 `1:06.33`,没有样式区分,看起来就像已经填好;现在示例统一带「例」字(时间 `例 1:06.33`、距离 `例 12.34`、计数 `例 12`、得分 `例 96.5`,备注格是 `可留空`),并且是**更淡的斜体灰字**,和真实输入明显不一样。灰字不会被提交,那一格仍然是空的。
|
||||
|
||||
新版报错也会自证:会写 `第 3 行 张三:成绩为空(当前「(空)」),请填写成绩`,把那一格的实际内容原样打出来。填了但写法不认的是另外两条:`秒位不能 ≥ 60(当前「1:70」)…` 或 `成绩写法无法识别(当前「约1分06秒」)…`,各自带内容与可用写法(见 Q76)。
|
||||
那空着会不会发不出去?**不会**。空格子在防呆校验里只是**提醒**,文案是 `第 3 行 张三:还没录成绩(当前「(空)」),本次发布不计入这一行`,**不挡发布**;点发布会只发已填的行,其余保持未发布,补录后再发一次即可(见 Q77)。真正挡发布的只有写错:`秒位不能 ≥ 60(当前「1:70」)…` 或 `成绩写法无法识别(当前「约1分06秒」)…`(见 Q76)。
|
||||
|
||||
**Q76:成绩能怎么填?**
|
||||
按项目单位填(工具栏会显示当前单位:秒 / 米 / 次 / 分):
|
||||
@@ -442,3 +442,33 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点
|
||||
- 成绩格已经加宽,四位数也能看全。
|
||||
|
||||
有未保存的成绩时,切到别的菜单页面会先弹确认框,不会静默丢弃。
|
||||
|
||||
**Q77:100 米要分好几场跑,必须等所有人跑完才能发布吗?**
|
||||
不用。跑道只有 8 条、一个项目分好几场时,**每跑完一批就能先发一批**,没跑到的先空着:
|
||||
|
||||
1. 这一批跑完,把已出的成绩填上,其他还没跑的行保持空白;
|
||||
2. 点「发布」(该组已有发布过的成绩、还有没发的已填行时,按钮显示为「**发布本批**」);
|
||||
3. 确认框会写明 `本组还有 N 人没有成绩,本次将发布已填的 M 人;其余保持未发布,补录后再发布即可`——确认后系统只发布已填的 M 人,**不会把没成绩的人当成 0 分发出去**;
|
||||
4. 这批成绩立即上屏,名次与积分先按已发布的这部分算;
|
||||
5. 下一批跑完补录后,再点一次「发布本批」,系统会把两批放在一起**自动重算**名次与积分。
|
||||
|
||||
防呆校验里的「还没录成绩」只是提醒,**不挡发布**;只有写错(秒位 ≥ 60、写法无法识别)或手动名次项目缺名次才挡(见 Q75、Q76)。审核页的「发布整组」也是同一套口径。
|
||||
|
||||
**Q78:为什么有的成绩还没录就发布成功了?会不会发漏?**
|
||||
不会发漏,也不会算错:分批发布**只发布已经填了成绩的那部分**,没录的行本次**跳过**、保持未发布状态,确认框和发布后的提示都会写明「本次发布 M 人;其余 N 人保持未发布,补录后再次发布即可」。
|
||||
|
||||
要留意的是「跳过」不等于「算 0 分」——没成绩的人这一批根本不参与排名,不会占名次也不会拉低别人。等下一批补录后再发布一次,系统会把两批合起来重算;先前发布的那部分名次与积分会跟着一起更新。所以只要最后把所有人补录并发布完整,结果与一次性发布是一致的。
|
||||
|
||||
**Q79:大屏上的「实时赛况」显示的是哪个项目?**
|
||||
按三条依据**依次**判定,先满足的优先:
|
||||
|
||||
1. **人工指定**:管理端「大屏控制 → 实时赛况」卡片里指定的项目(最多 2 个);
|
||||
2. **排期命中**:小项的排期时间落在当前时间**前后 30 分钟内**;
|
||||
3. **最近发布过成绩的项目**:以上都没有时,显示最近一次发布过成绩的项目——所以**下一场开始之前,这一页会一直保持显示上一场**。
|
||||
|
||||
当前实际显示哪个项目、为什么选中,可以在卡片里的「当前生效」一行看到,格式如 `男子 100 米(排期命中)`;没有可显示的项目时显示「当前没有可显示的项目」。选「人工指定」模式时只认第 1 条,不做任何回退。该页只显示**已发布**的成绩,所以配合分批发布,发一批它就更新一批。
|
||||
|
||||
**Q80:两个项目同时进行,实时赛况页怎么显示?**
|
||||
会**自动左右分栏**,每个项目一栏,最多 2 栏(一个项目时单栏铺开,不会分栏)。每栏显示该项目的名次、运动员 / 队、单位(带单位 logo)与成绩,按名次升序、最多列前 10 个名次;同一个小项分了多个组别时,栏里显示最近发布的那一组,标题旁用「另有 N 组」标注。
|
||||
|
||||
场地上两个项目时间撞在一起、自动判定没选中你想看的组合时,让管理员到「大屏控制 → 实时赛况」把模式切到「人工指定」,把这两个项目分别选进「项目 1」「项目 2」并保存即可(该设置只有管理员能保存)。
|
||||
Reference in new issue
Block a user