Files
Scoreboard/docs/常见问题.md
T
AskaEth 9c52dc4b38 feat(display): 大屏「赛事日程侧边栏」(手填日程 + 竖向进度轴 + 热开关 + 每屏覆盖);版本 dev_0.5.16
主人点名要的功能:大屏控制页加一个**可热开关**的侧边栏,在**指定的屏幕**上(不管它当前在哪一页)叠一个
**手填的赛事日程列表**,带**竖向进度条**;日程**不与登记的小项时间关联**、完全手填;竖向时间轴要好看,
**字多时字号自动缩放与换行**要做到位(不能过小、不能过大)。

设计口径(主人逐条拍板):放不下时**围绕当前项开窗**;进度条是**一条竖向时间轴 + 三态节点**;
**深色半透明 + 毛玻璃**;已完成的项**淡化保留**;备注**默认上屏 + 一个总开关**;
明细覆盖层 / 全屏公告期间**自动收起**、结束后自动回来;编辑权限**录入员及以上**;单屏覆盖按**实例 id**。

服务端(走大屏公告那条路 —— PUT /api/settings 是 admin-only,会与「录入员可改」冲突)
- 新增 `schedule` 动作 + 白名单;`POST /api/display/command` 同一个 handler:**先校验 → 再转发 → 最后落库**
  (校验排在转发前,非法配置不会在大屏上闪一帧)
- 落库到赛事库 settings 的 `display.schedule`(**不新建表、不写迁移**,随赛事包走);
  与公告共用那份「写设置键 + bumpVersion」的实现
- **读写不对称容错**:写侧严格 400(含中文提示与第几条),读侧坏数据一律静默当空 —— 老数据 / 手改库不会炸大屏
- 上限:40 条;time ≤20 / title ≤40 / note ≤60(按字符,清洗控制字符);宽度夹 15–40;覆盖 ≤50 条
- 口径收口三处:**时间允许为空**(与管理端同口径)、**showNote 缺键 = true**(区分「键不存在」与「显式 false」)、
  **`inherit` 不落库**(不再白占覆盖预算)

大屏端
- 新增 `ScheduleSidebar.vue` + `schedulePanel.ts`(纯函数:开窗 / 三态 / 整体进度 / 字号与行数 / 按显示宽度截断 /
  单屏覆盖 / 抑制 / 指纹去重)
- 字号是**舞台设计坐标**(1920×1080),靠 `.stage` 的 `transform: scale()` 整体缩放,**不做二次缩放**
  (wiring 断言禁止出现 `window.`/`innerWidth`/`vh`);复用既有的 `fitRowFontPx`(**16–56px 硬上下限**)与 `textEm`;
  固定点迭代 ≤4 轮;**贴下限时宁可行数少也不缩字**;标题 ≤3 行、备注 ≤2 行,超出截断
- 容器 `position:absolute; inset:0; z-index:50`(**不用 fixed** —— `.stage` 带 transform,是 fixed 后代的包含块);
  **独立于 detail 状态机**(goto 会关明细、明细会停轮播,侧边栏必须不受影响)
- 深色半透明 + `backdrop-filter`,并带 `@supports not (backdrop-filter: blur(1px))` 退化为更不透明的深底
- 关着时**不留任何 DOM**(逐字节等同于没有这个功能);`prefers-reduced-motion` 下不做动效

管理端
- 大屏控制页(左列、公告之后)新增「赛事日程」卡片:条目表格(时间/标题/备注/已完成 + 上移/下移/删除)、
  总开关、备注上屏、位置与宽度、**每块屏三态覆盖**(跟随 / 强制开 / 强制关;切回「跟随」会真删掉那条键)
- 保存走 `adminApi.displayCommand`(**不走 admin-only 的设置接口**);本地校验不过**一个请求都不发**
- 排序只有上移 / 下移(该页面禁止挂 pointerdown/mousedown 监听,有既有测试钉着)

测试
- 服务端 16 个包全绿;前端 **1174 例**全过(基线 1096,本批 +78:大屏端 44 + 管理端 34)
- 大屏端另有 **40 项 playwright 实机**(用 `page.routeWebSocket` 假造实时通道):开/关后 DOM 无残留、
  五个页面下都在、`lock=0` 真等轮播翻页且侧边栏不掉、明细与公告期间自动收起并自动回来、
  **1080p 与 4K 字号完全相同**、`reducedMotion` 下无动画;并钉住两条硬指标(真机列表高度 ≥ 纯函数预算、
  容量×行高 ≤ 真机高度)

文档:`docs/升级说明` 新增 `dev_0.5.16`;`使用手册` 9.2 + 17.6;`常见问题` Q108–Q111;`上线检查清单`/`部署指南`
各一条;`devdocs/05·07·13` 同步。

⚠️ 一条**既有边界**(本版故意没改,按主人「兼容性最大化」的要求):导出的名次口径是「通道名次优先」、
屏幕是「成绩行名次优先」,只在「先按决赛计分发布、之后又只更新名次发布一次」这种序列下分叉
(导出显示上次计分的名次)。正常赛程遇不到;遇到时对该组再「按决赛成绩发布」一次即恢复一致。
已写进《升级说明》④ 与《常见问题》Q111。
2026-09-17 20:04:50 +08:00

853 lines
103 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.
# 常见问题(FAQ)
> 更完整的操作步骤见 [使用手册](./使用手册.md),部署与排障见 [部署指南](./部署指南.md)。
---
## 账号与权限
**Q1:初始密码是多少?**
首次启动时随机生成、只打印一次。用 Console 启动时,在 `logs\console.log` 里搜索「初始密码」即可找到,方法见 [部署指南 · 首次登录](./部署指南.md#5-首次登录)。
**Q2:忘记密码怎么办?**
先停止服务,然后执行(配置在用户数据目录,不要用部署目录里那份模板):
`scoreboard.exe passwd -config "%LOCALAPPDATA%\ScoreboardConsole\config.yaml" -data "%LOCALAPPDATA%\ScoreboardConsole\data"`
会打印新的随机密码,并要求下次登录强制改密。
**Q3:访客和录入员有什么区别?**
访客只能只读查看;录入员可以录入、存草稿、发布、撤销发布、确认破纪录、做积分调整、控制大屏;管理员在此基础上还能管理用户、备份、看审计日志、导入规则包和赛事包。
**Q4:为什么登录后还是只读?**
可能未登录成功、会话已过期(登录有效期默认 24 小时、可配 1–720 小时,见 Q89),或页面处于示例数据模式。看右上角是否显示账号名与角色。
**Q5:可以建「访客账号」吗?**
不可以。访客是未登录时的默认身份,不需要也不允许建账号;可落库的角色只有管理员和录入员。
**Q6:管理员能改用户名吗?**
管理界面里账号创建后不可改;命令行可用 `scoreboard.exe passwd -user 旧名 -new-username 新名` 修改。
---
## 成绩与积分
**Q7:为什么录入后大屏没变化?**
草稿不上屏。需要「发布」(或 `Alt+Enter`),发布后 1 秒内大屏更新。
**Q8:发布错了怎么改?**
撤销发布 → 修改 → 重新发布。撤销会作废该组积分流水,大屏回退到发布前状态,过程可在「变更历史」查看。**只错了一条成绩时不必撤销整组**,点那一格(或那一行的「修改本条」)退回草稿改完重发即可,见 Q98。
若想让这一组 / 这一批**回到「没录过」的样子**(**连成绩内容一起清掉**),用工具栏上的「**清空本组 / 清空本批**」:同样收回分、退榜并记进「变更历史」,区别只在**成绩内容留不留**(撤销发布保留、清空清掉)。它是危险操作,确认框里要勾选一行字才点得动,清整组时还会一并清掉按单位录的「团体名次」。两者对照见《使用手册》4.7。
**Q9:为什么「发布」是灰的?**
常见原因:未登录、服务端断开、示例数据模式,或存在**会阻止发布**的校验错误(秒位 ≥ 60、成绩写法无法识别、手动名次项目缺名次)。**没录成绩不算错误、不挡发布**(见 Q77)。成绩格的报错会把**那一格的实际内容**打出来并对症给改法(见 Q75、Q76)。
**Q10:并列名次怎么处理?**
成绩相同(或手动名次相同)自动按并列处理,显示同一名次。默认口径是「顺延」:并列第 3 各得第 3 名的分,无第 4 名,下一名第 5 名;奖牌同样并列(并列第 1 各记 1 金、无银)。具体口径由规则包配置决定。
**Q11:状态里的 DNS / DQ / DNF / 退赛有什么区别?**
都是不参与名次与积分计算的异常状态:DNS = 弃赛,DQ = 取消资格,DNF = 未完赛,退赛 = 主动退出。正常成绩选「有效」。
唯一例外:「个人+团体」小项若把平均值口径选成「全部报名人员都计入」,这些人在队内平均里会按 0 分占一个分母名额(见 Q15)。
**Q12:时间类成绩怎么写?**
按 `分:秒.毫秒` 形式输入最直观,例如 `1:06.33`;工具栏会显示当前项目的单位。实际上能接受的写法比过去多,中文输入法下的全角冒号 `1:06`、全角数字也认,完整清单见 Q76。成绩格里的 `例 1:06.33` 是**更淡的斜体灰字**,只是示例、不是已填内容(见 Q75)。
**Q13:能批量录入吗?**
可以。支持从 Excel 复制后粘贴:两列及以上时第一列按单位名称 / 简称匹配行、最后一列作为成绩;单列时从当前行向下依次填充。也可以用 `Tab` / `Enter` 在格子间移动,`Ctrl+Enter` 存草稿。
**Q14:为什么「个人+团体」小项的个人分没进单位总分?**
这是「个人+团体」小项的默认口径,不是漏算。这类小项的一条报名会同时走两条计分通道:
- **个人通道**:按个人成绩排名、套个人积分模板给分,分只记在个人积分榜;
- **团体通道**:按团体成绩排名、套团体积分模板给分,计入单位总分。
个人通道的「计入单位总分」关掉了才不进单位总分:按规则包里的「个人+团体」模板生成的通道,个人通道默认就是不勾的。**手工新建通道时的默认值也按小项类型给**:普通个人项目 / 团体项目默认勾选;**「个人 + 团体」项目的个人通道默认不勾**——所以**以页面上实际的勾选状态为准**。到「基础数据 → 计分通道」选中该小项就能看到每行通道的勾选状态,关掉的行在「大项 / 小项」的通道摘要里带「不计入单位总分」徽标。
想让个人分也折算进单位总分,把个人通道那一行勾上并「保存全部」,然后对该组成绩**撤销发布 → 重新发布**——积分流水是发布时按当时的通道配置生成的,不重新发布不会变。规则包对个别小项写了例外配置时以例外为准。
**Q15:队内平均的团体成绩怎么算?平均值口径在哪改?**
团体成绩 = **该单位在本组别各条报名成绩的平均值**。系统拿这个平均值和其他单位比名次(并列按积分模板的并列口径处理,默认顺延),再套团体积分模板给分,计入单位总分。大屏与管理端只显示算出来的数值,不显示「平均」字样。
- 正常做法是给每个参赛人员各报一条(「基础数据 → 报名导入 → 个人报名」),成绩照常录到每个人那一行;团体那一行即便也报了,也不用填成绩。
- 平均值的分母有两种口径,选中该小项后在「成绩录入」页的工具栏下方用**「平均值口径」**单选切换,点选即保存(小项级设置,该小项的组别共用,不用重新点保存):
- `只算有效成绩`(默认):分母是有有效成绩的人数;
- `全部报名人员都计入`:分母是该单位在本组别的报名条数,没成绩的按 0 计入。
- **团体成绩怎么汇总**:到「基础数据 → 计分通道」选中该小项,那条团体通道的**「聚合口径」**列可选 **`平均`**(默认,团体成绩 = 该单位成员成绩的平均值)或 **`总和`**(团体成绩 = 该单位成员成绩的总和)。点一下即选中,点「保存全部」生效、该小项立即重算。**各队人数相同时两种口径排出来的名次完全相同**,人数不同时可能不同;上面那条「平均值口径」只对 `平均` 有意义——换成 `总和` 后,它只决定「一个人都没有成绩的单位算不算 0 分参与排名」。
- 改完口径、要让已发布的成绩按新口径重算,需要对该组**撤销发布 → 重新发布**(草稿不受影响,改口径本身在点选时就已保存);发布之前可以先看右侧「实时积分预览」,它已经按新口径显示各单位的分数变化。改「聚合口径」不用这一步——它保存时就重算。
- 报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消资格)既不算分子也不算分母。
**Q16:某个单位一个人都没有效成绩,团体项目怎么算?**
看该小项的「平均值口径」:
- `只算有效成绩`(默认):这个单位不参与团体排名、不得分(不会按 0 分排到最后、占掉一个名次);
- `全部报名人员都计入`:按平均 0 参加排名,通常排最后;这个名次若不在团体积分模板的录取范围内,同样不得分,但会占掉一个名次、影响后面单位的录取。
**Q17:团体项目可以只给单位报名、不填队员吗?**
可以。「基础数据 → 报名导入 → 从已有名单勾选报名」分成「个人报名」「团体报名」两个页签,团体 / 对抗 / 「个人+团体」小项默认停在「团体报名」:从已配置的参赛单位里勾选参加本组别的单位(默认一个都不勾),每个勾选的单位各建一条报名,**一个队员都不勾就是纯单位报名**,队员名单之后还能再补。
- 要登记队员就点该行的「登记队员」展开勾选(可按姓名 / 工号搜索),提交时队员名单按列表顺序写入;
- 勾选已报名的单位时该行会提示「提交将清空原名单」:再次提交是用本次登记的队员覆盖原名单,一个队员都不勾就等于清空;
- 「全选」只勾启用中且还没报名的单位,已停用的单位要单独勾;
- 选中小项后页签会自动切到与该小项类型相符的一边,也可以手动切换,页面会提示「生成的报名行以当前部分为准」。
**Q18:改了「榜单口径」的折算系数,为什么单位总分没变 / 变了?**
「基础数据 → 积分模板 → **榜单口径(全局)**」里的**个人项目得分折算系数**(键名 `standings.individual_to_team_weight`,默认 1)作用在汇总环节:`单位总分 = Σ 只记单位的流水 + 系数 × Σ 记到个人的流水`。流水里存的是原始分、折算在生成榜单时做,所以点「保存榜单口径」后单位总分与单位积分明细**立刻按新系数变化,不需要重新发布**,大屏也会跟着刷新。
改完看不出变化,通常是这几种情况:
- 单位总分里本来就没有「记到个人的流水」:团体 / 对抗项目走单位通道,或者该小项的个人通道被关掉了「计入单位总分」(「个人+团体」的个人通道就是这样),这些分不受系数影响;
- 只有部分单位有个人得分,变的只是那几家;
- 系数没存上:系数必须大于 0(0 与负数服务端会直接拒绝),输入框允许 0–100、步进 0.1,保存成功会提示「榜单口径已保存」;
- 当前账号不是管理员:赛事设置接口只对管理员开放,非管理员读不到当前系数,卡片上会写明是只读。
导入规则包时,规则包里的同名配置会覆盖这里的取值。
**Q19:破纪录加分为什么点不了?**
规则包里破纪录加分默认关闭(`recordBonus.enabled = false`)时按钮不可用;若当前角色读不到规则包,页面显示「未知」,可提交,由服务端校验决定是否加分。
> 这个开关只管「**确认加分**」能不能点,不影响的:疑似破纪录照样列出,「**拒绝**」照样能用(它不会加分),以及 **已批准但批错了的登记可以「作废」**(会撤回加分并恢复上一条纪录,见 Q99)。
**Q20:人工调整为什么点不了?**
规则包里人工调整默认关闭(`manualAdjustment.enabled = false`)时不可用;以页面顶部显示的开关状态为准。
---
## 大屏
**Q21:大屏不亮 / 只有桌面怎么办?**
检查 HDMI、扩展显示模式、Console「大屏窗口」状态,点「重新排布」;服务端未就绪时最多等 20 秒才开屏;单屏窗口化时按 `F11` 切全屏。详见 [部署指南 · 故障排查](./部署指南.md#9-故障排查)。
**Q22:单屏和多屏的显示方式有什么不同?**
单屏时大屏以窗口化方式打开,按 `F11` 切全屏;多屏时除内置屏外每块屏一个 kiosk 全屏窗口,各锁一页,不响应 F11,**默认吞掉鼠标点击、不穿透**(点击不会漏到后面的窗口或桌面,被别的窗口盖住后点一下就能回到最前);确实要穿透时在配置里显式写 `display.allowClickThrough: true`(旧键 `display.ignoreMouse` 已废弃、不再生效),详见 [部署指南 6.2](./部署指南.md)。
**Q23:大屏为什么不自动轮播?**
Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点「解锁」后开始轮播,每 20 秒一页;公告页不参与轮播。
**Q24:推送的积分明细怎么关?**
60 秒后自动关闭;也可以点「积分榜」页的「关闭大屏明细」立即关闭。
**Q25:推送的公告撤下后,大屏底部为什么还有字?**
因为「推送公告」只是一次**全屏展示**,不是公告的生命周期:设好滚动时长(5–120 秒,即全屏展示的秒数)点「推送公告」后,大屏先全屏显示这条公告,到时间自动退回原来的页面,**公告正文会留在底部信息栏的「公告」槽位继续显示**,直到被下一条公告替换或你点「清除公告」。底栏这个槽位是一直都在的,没有公告时显示占位「暂无公告」。
- 要撤下:到「大屏控制 → 公告」点「清除公告」,底栏随即回到「暂无公告」;
- 卡片右上角的徽标显示「当前公告:有 / 无」,下方一行就是当前公告正文,可以先确认再清;
- 公告保存在赛事设置里(`display.announce_text` / `display.announce_seconds`),所以服务端重启、大屏窗口重开、断线重连之后仍然显示;重开的大屏会先把当前公告全屏播 15 秒,再留在底栏。
**Q26:大屏上的单位图标显示在哪?没显示怎么办?**
配了 logo 的参赛单位会在这几处显示单位图标:总积分榜(单位名左侧)、单位奖牌榜(单位名左侧)、分项成绩(单位列名字左侧)、个人积分奖牌榜(运动员姓名左侧)。图标按行内文字大小缩放(1em),不会撑开行距;没有 logo 的单位不占位,图片临时加载不出来时保留占位、不会出现破图,队名不会跳动。
没显示就去「基础数据 → 参赛单位 → 编辑 → Logo 路径」上传或填写该单位的 logo(管理端页面本身不显示 logo,只在大屏上显示)。上传的图片存在该赛事的 `data\event_projs\<项目名>\uploads\` 里,会随赛事项目包一起导出 / 导入。
**Q27:「实例 x · 屏 x」这个标识怎么不见了?**
它只是**调试标识**:只在窗口化的调试窗口里、并且**没有全屏**时显示,用来分辨这块屏是哪个实例。正式上屏(多屏 kiosk 全屏,或单屏窗口化后按 `F11` 全屏)都不显示——按 F11 时它会和自绘标题栏一起收起来,再按一次就回来。
以前右上角还有一个 `vN` 数据版本号角标,**现在已经去掉,任何情况下都不再显示**。要核对某块屏有没有跟上服务端,看管理端仪表盘「实时连接」里的「版本 N」。
**Q28:大屏控制页的「在线大屏」列表显示的是什么?**
显示的是**真实**的在线大屏实例,直接读服务端 `GET /api/display/instances`,打开页面时每 5 秒自动刷新一次:本机用 Console 打开的大屏窗口、局域网设备打开 `/display` 连上的浏览器都在里面(后者没有屏号,标记为「局域网浏览器」),每行显示实例 ID、在线 / 离线、当前所在页、来源地址与最后心跳,服务端判定落后时还会多一个「落后」徽标。以前这里确实是本机占位、恒显示「未知」,**那个占位现在已经被真实列表取代了**。离线实例会在服务端保留一段时间;列表读不到时页面提示「读取在线大屏失败」,并保留上一次的结果,不会清空。
**Q29:安卓电视能用吗?**
可以,用电视自带浏览器访问 `http://<主机IP>:19540/display`。但它不受 Console 的 kiosk、防熄屏控制,字体与动画表现以实际设备为准。
**Q30:大屏时间不对怎么办?**
系统没有外网时间同步,以主机时间为准。校准 Windows 时间与时区即可。
**Q31:大屏的字体在哪里改?**
在「系统设置 → 赛事信息 → **字体**」区块(需要管理员):**标题字体**与**正文字体**两个下拉,第一项是「默认(跟随系统)」,后面是四款内置字体与已上传的字体;区块底部的「预览」会按所选字体实时渲染一行中文,选完点页面上的「保存」生效。这两个设置**只影响大屏画面**,管理端界面的字体不变。
四款内置字体随程序分发,不用上传:`Noto Sans SC(思源黑体同源)`、`Noto Serif SC(思源宋体同源)`、`MiSans`、`Source Han Sans CN(思源黑体)`。
**Q32:怎么上传自己的字体?**
1. 到「系统设置 → 赛事信息 → 字体 → 字体库」,点「上传字体」选择本地字体文件;
2. 上传成功后,新字体立刻出现在两个下拉里(按文件名显示,文件名里的中文会保留,其他特殊字符会换成下划线);
3. 在「标题字体」「正文字体」下拉里选上它,再点页面上的「保存」——下拉的改动要保存才生效;
4. 字体文件存在当前赛事项目的 `data\event_projs\<项目名>\uploads\fonts\` 里,列表里会显示它的地址 `/uploads/fonts/<文件名>`。
**Q33:字体支持哪些格式?有大小限制吗?**
只支持 `.ttf` / `.otf` / `.woff` / `.woff2`,**单个文件不超过 20 MiB**;格式不符或超过上限,会在上传前就直接提示,不会传到服务端。同一个文件名再传一次会被拒绝(提示「已存在,请先删除或重命名后再上传」),所以换字体请先删掉旧的、或把文件改成别的名字。上传的字体不做格式解析,损坏的文件传得上去,但大屏加载不了会回落到默认字体(见 Q34)。
**Q34:为什么上传的字体在大屏上没生效?**
按这个顺序排查:
- **保存了吗**:「赛事信息」里的下拉选完要点页面上的「保存」,没保存时页面显示「未保存」徽标;保存时服务端会校验字体是否存在,选了不存在的字体会直接报错;
- **看错地方了**:这两个设置只作用于**大屏**,管理端界面的字体不受影响,别拿管理端的显示效果判断;
- **字体文件加载失败**:大屏是无人值守的,字体只是外观,加载失败时会**静默回落到默认字体**(不会出现方块或空白)。检查 `data\event_projs\<项目名>\uploads\fonts\` 下的文件是否还在(被手工删掉就会出现这种情况),必要时重新上传并保存一次;
- **大屏还没刷新**:保存会立刻下发给在线大屏;仍没变化可以重开大屏窗口,或等大屏自动重载。
**Q35:为什么删不掉某个字体?**
**正在被标题字体或正文字体使用的字体不允许删除**,会提示「正在被大屏使用,请先在赛事信息里改掉标题/正文字体」。先把这两个下拉改成别的字体并**保存**,再回「字体库」点该行的「删除」(会有二次确认,删除前请确认大屏上已不再使用它)。
**Q36:换一台机器还要重新传字体吗?**
不用。字体文件就在当前赛事项目的 `uploads\fonts\` 里,所以**导出赛事项目包(zip)会连字体一起带走**,导入到另一台机器后直接可用、不用重新上传;字体设置存在赛事库里,也随包走(见 Q43)。
只有一个小陷阱:`backups\` 里的 `.db` 快照**不含**字体这些上传文件(见 Q37),如果只拷数据库快照换机器,字体就没了——记得把 `event_projs\<项目名>\uploads\` 一起拷(见 Q41)。
---
## 数据与备份
**Q37:备份在哪里?**
在数据目录下的 `backups\`,默认即 `%LOCALAPPDATA%\ScoreboardConsole\data\backups\`(数据目录改过就按改后的路径找,见 Q54)。
文件是数据库快照,命名形如 `system-<原因>-<时间戳>.db` 与 `event-<原因>-<时间戳>.db`:`system` 是系统库(账号、会话),`event` 是赛事库(成绩、积分、报名、基础数据),原因是 `auto` / `manual` / `publish`,时间戳是「年月日-时分秒」,例如 `event-publish-20260910-120500.db`。
> 备份里只有数据库,**上传的图片与字体**(赛事会标、大屏背景图、单位 logo、自定义字体)不在其中,它们在 `data\event_projs\<项目名>\uploads\` 里(字体在 `uploads\fonts\`),需要另外归档。部署目录下的 `deploy\backup.bat` 除了 `.db` 快照,**还会把每个项目的 `uploads\` 打成 `<项目名>-uploads-<时间戳>.zip`**;该 zip **不在 20 份滚动清理范围内**(清理只认 `.db`),要手工删旧的(见 Q39)。「一键恢复」也只换数据库文件,不会带回图片。
**Q38:多久备份一次?**
服务端会自动备份,默认每 5 分钟一次(`config.yaml` 的 `backup.intervalMinutes`,设成 `0` 可关闭)。也可以手动触发:管理端「系统设置 → 备份 → 立即备份」,或执行 `scoreboard.exe backup -config "%LOCALAPPDATA%\ScoreboardConsole\config.yaml" -data "%LOCALAPPDATA%\ScoreboardConsole\data"`(部署目录下的 `deploy\backup.bat` 已经带好这些路径)。另外每次发布成绩前会自动备一份。
**Q39:备份会自动删除旧的么?**
会。自动、手动、命令行三种方式都按 `backup.keep`(默认 20 份)滚动保留,`system` 库与赛事库各自计算。⚠️ 但 `deploy\backup.bat` 另外产出的 `*-uploads-*.zip`(上传图片与字体)**不在这个滚动清理里**,不会被自动删,需要手工清理,建议每个项目至少留最新一份。
**Q40:怎么恢复备份?**
**管理端有一键恢复(仅管理员)**:到「系统设置 → 备份」,在列表里找到要退回到的那份(`pre-restore-…` 是系统自动留的「恢复前安全副本」),点该行的**「恢复」**并过危险确认框。服务端会先给当前库拍一份安全副本(**每类库只保留最近 5 份**,更旧的会被后续恢复自动清理),再替换库文件并优雅重启,页面自动等待刷新。「恢复系统库」会连账号与会话一起换掉,重启后需要用那个时间点的账号重新登录;**恢复不会带回上传的图片与字体**(它们在 `uploads\` 里,不在 `.db` 内)。恢复是覆盖式的,备份时间点之后的改动都会丢。
没有 Console 或恢复不了时的兜底是停机手工替换数据库文件:在 Console 里停止服务,到 `<数据目录>\event_projs\<项目名>\` 把目标备份复制为 `event.db`(覆盖原文件),删掉同目录的 `event.db-wal` 与 `event.db-shm`,再启动服务,详见 [部署指南 · 备份与恢复](./部署指南.md#8-备份与恢复)。
**Q41:换一台电脑怎么迁移?**
用户数据目录和安装目录都要带走:
- **用户数据目录** `%LOCALAPPDATA%\ScoreboardConsole\`(里面是 `data\` + `config.yaml` + `console\config.json` + `rules\`):整个拷到新机器的同一位置即可,赛事数据、账号、配置、规则包原样接管,`data\` 里自然也包括上传的图片与字体;
- **安装目录**(`Scoreboard_Console.exe`、`scoreboard.exe` 等):按同样路径放好,或用新机器上的安装包装一遍(安装目录里那几份配置与规则只是模板,拷不拷都行)。
只拷安装目录会丢数据——成绩、账号、配置、规则包都在用户数据目录里。若数据目录放到了别处,还要同步改 `console\config.json` 的 `server.dataDir`。详见部署指南第 8.4 节。
**Q42:怎么切换赛事项目?**
启动时服务端会自动打开**上次打开的赛事**,不用改启动参数。切换在页面里完成:管理面板「导出 → 赛事项目包 → **赛事项目列表**」里找到目标项目(带「当前」徽标的就是正在打开的那一项),点「切换为当前赛事」。服务端会退出并由服务管理窗口自动拉起,页面显示「正在重启服务端…」,恢复后自动刷新;最多等 60 秒,超时就打开服务管理窗口确认服务端状态,待其显示「运行中」后手动刷新本页。
- 导入赛事包**不会**自动切换当前赛事,导入完成的结果框里直接给了「立即切换并重启服务端」按钮;
- 切换需要服务管理窗口(Console)在运行,否则服务端退出后没人拉起,得手动启动一次;
- 比赛进行中请避开切换;
- 账号与会话存在数据目录下的 `system.db` 里,属于整个系统而不属于某个赛事库(赛事包里也只带赛事数据、不带账号),所以切换赛事不会动它,一般不用重新登录;万一重启后页面是只读访客视图,登录一次即可,忘记密码用 `scoreboard.exe passwd` 重置。
> 不要用启动参数 `-project` 来切换赛事:给 Console 的 `config.json` 里 `server.args` 加上 `-project <项目名>` 后,服务端每次启动都会优先打开这个项目并把它写回「上次打开的赛事」,在页面里切换完、重启后又被拉回它。只有「刻意固定只开某一个项目」时才会这么用。
---
## 导出与导入
**Q43:能导出哪些文件?**
「导出 → 结果导出」页有六类 Excel:**总表**(`总积分榜.xlsx`)、**全部**(`赛事成绩总表.xlsx`,多 sheet)、**全部(单页)**(`赛事成绩总表(单页).xlsx`,单张表平铺)、**分项成绩表**(`分项成绩表.xlsx`)、**单位积分明细**(`单位积分明细.xlsx`),以及可筛选的**报名名单**(`报名名单.xlsx`,见 Q87;同一张卡片里另有「导入格式」的两个版本 `报名名单(导入格式).xlsx` / `报名名单(导入格式·分小项).xlsx`,见 Q104)。「积分榜」页另有四项:单位总分榜卡片头的**导出总明细**(`单位积分总明细.xlsx`)、单位奖牌榜卡片头的**导出奖牌明细**(`单位奖牌明细.xlsx`)、个人积分榜卡片头的**导出个人明细**(`个人积分总明细.xlsx`),以及展开单位后明细卡头的**导出该单位明细**(`单位积分明细.xlsx`)。另外可导出赛事项目包(zip)、**基础数据包**(xlsx,见 Q88)与规则包(YAML)。
**Q44:导出文件保存在哪?**
浏览器默认下载目录。服务端生成的临时包位于 `data\exports\`,下载完成后自动删除。
**Q45:谁能导入规则包 / 赛事项目包 / 基础数据包?**
三者都只有管理员能导入。规则包导入后全量重算积分且不能一键撤销;赛事包覆盖同名项目前会二次确认;**基础数据包**按编码「存在就更新、不存在就新建」,**绝不删除**(见 Q88)。
**Q46:导入赛事包后为什么看不到数据?**
因为导入只把包解到数据目录,**不会自动切换当前赛事**。服务端启动时只打开一个赛事项目(启动参数 `-project` 指定的那个;没带参数时用上次切换记下的,从未切换过则是 `default`),页面上看到的是它的数据——通常是导入前那个空赛事,所以看着像「没导进去」。
处理办法:在「导出 → 赛事项目包」的**赛事项目列表**里找到刚导入的项目(导入完成的结果框里也直接给了「立即切换并重启服务端」按钮),点「切换为当前赛事」。服务端会退出并由服务管理窗口自动拉起,页面显示「正在重启服务端…」,恢复后自动刷新,数据就出来了。超过 60 秒仍未恢复时,请打开服务管理窗口确认服务端状态,待其显示「运行中」后手动刷新本页。
> 切换会让服务端重启,比赛进行中请避开操作。账号与会话不在赛事库里(见 Q42),一般不用重新登录;万一回到只读访客视图,登录一次即可,若原密码登不上就用 `scoreboard.exe passwd` 重置。导入的赛事包里如果带了自定义字体,切换过去后大屏直接可用,不用重新上传(见 Q36)。
**Q47:导入规则包后积分变了,能撤销吗?**
不能一键撤销。纠错需要重新导入旧规则包,或逐项修正后重新发布。导入前请务必先「预览差异」。
**Q48:报名表里的证件号重复了怎么办?**
先分清三种「重复」,处理方式完全不同:
- **同一份表里同一个证件号出现多次**:**不报错**,照常导入——证件号是**人员的唯一标识**,同一个证件号就是同一个人(同一个人报多个组别时本来就会重复)。导入结果里会给一条提示:`证件号 XXXX 在本表中出现 N 次(同一人报名多个组别)`,只是在提醒你别把不同的人写成同一个证件号。
- **同一证件号 + 同一个小项同一个组别**:这才是**真重复**(同一个人在同一组里被写了两遍)。这一行会进「冲突」列表,由你选**保留已有**(已导入的那条报名不动)或**使用新数据**(用这一行覆盖它)。
- **证件号已经登记在系统里另一个人名下**:这一行会**按证件号认到那个人**,姓名 / 单位等对不上就进「冲突」列表让你决定;只有实在认不到(例如同时又给了别人的号码布)时才会报 `第 N 行:证件号 X 已被另一个人占用(姓名 Y,号码布 Z)` 并**跳过该行**。处理办法:先核对证件号是不是抄错了——不是这个人的,把这一格留空即可(只填号码布也能导入);确实是他的,先到「基础数据 → 运动员」把另一条档案里的证件号清掉或改对,再重新上传。
- **在「运动员」里新增 / 编辑时提示证件号重复**:同上,说明该证件号已属于另一个人。是同一个人的话直接用已有记录;证件号填错就改对。已有历史数据可以没有证件号。
详细步骤见 [使用手册 · 报名导入](./使用手册.md#107-报名导入)。
**Q49:人员没有身份证,只有号码布,能报名吗?**
可以。证件号是系统认人的**第一依据**,但没有身份证的人只填号码布也能用:号码布此时**顶替证件号认人**。在「运动员」里只填号码布也能保存;报名表里有姓名的行,`id_card` 与 `bib` 至少填一个就能导入;从已有名单勾选报名时,两项里有一项就能勾选。号码布会同时写入人员档案与报名记录。因为没有证件号,认人就全看号码布了——能编上号码布就编上,重名重姓、号码布还必须写成同一个人每次都用的那个号。
**Q50:号码布重复了怎么办?**
两个人**不能**共用同一个号码布(同一个人报多个组别时可以重复)。
- **在「运动员」里新增 / 编辑时提示重复**:说明该号码布已属于另一个人员。请先核对是不是同一个人:是,就直接用已有记录;不是,请检查号码布是否填错。
- **同一份报名表里,同一个号码布给了两个不同的人**:重复的那一行会报错并跳过,改好后重新上传。(同一个人报多个组别、号码布写成同一个,不报错。)
- **号码布在系统里已有、但表里这个人跟他对不上**(姓名 / 性别 / 年龄 / 单位不同):会列为「冲突」,本次不写入(报名也不会创建),需要在导入结果里勾选后决定「保留已有数据」还是「使用新数据」。表里同时给了**别人的证件号**时,会先按证件号认人,同样是进「冲突」列表。
- **表里某人的证件号(或号码布)与库里「同名 + 同单位」的人不同**:系统按「**同名的另一个人**」给他**新建档案**(不报错),并在导入结果里单独列出 `姓名(单位):证件号 XXX → XXX;号码布 XXX → XXX` 提醒核对。多半是证件号或号码布写错了:到「基础数据 → 运动员」把档案里的号改回来、删掉多出来的那条档案即可。
详细步骤见 [使用手册 · 报名导入](./使用手册.md#107-报名导入)。
**Q51:导入 CSV 时中文变成乱码,或者提示「报名表缺少列 event_code」怎么办?**
**不用转码,直接传原文件就行。** 服务端会自己识别编码:UTF-8、带 BOM 的 UTF-8(Excel 的「CSV UTF-8」)、GBK / GB18030(中文 Windows 上 Excel「另存为 CSV」的默认编码)、UTF-16(PowerShell `Export-Csv` 的默认编码)都能正常导入。
- 这两种症状以前长这样:GBK 文件的中文单位名、运动员名**变成乱码**;带 BOM 的文件报「**报名表缺少列 event_code**」——看着像表头写错,其实是 BOM 粘在了第一列表头上。现在都已修好,两种文件都直接传。
- 如果还是报「报名表缺少列 xxx」,那就是表头真的不对:第一行必须是英文列名(`event_code,category,team_code,athlete_name,…`),不能是中文标题行,上面也不要有多余的标题行或合并单元格。最稳妥的做法是下载页面上的「CSV 模板」照着填,格式细节见 [报名名单导入规范](./报名名单导入规范.md)。
- xlsx 不受影响,它自带编码信息。
---
## 其他
**Q52:系统需要联网吗?**
不需要。完全离线运行,不依赖外网,也不需要在现场安装任何运行时。
**Q53:页面提示「示例数据」是什么意思?**
表示后端未就绪,此时所有改动只停留在界面,不会写入真实赛事。恢复连接后刷新即可。
> 注意区分:顶部若只是显示「连接中断」,说明实时推送断了(数据可能不是最新),但写操作仍会照常提交给服务端并做校验。
**Q54:为什么登录 / 写操作偶尔被拒绝?**
系统有频率限制:登录每 IP 每分钟 5 次,写操作每用户每分钟 **120 次**。稍等一分钟再试。
**Q55:数据目录在哪?**
默认 `%LOCALAPPDATA%\ScoreboardConsole\data`(当前用户的本地应用数据目录,升级 / 覆盖安装 / 卸载都不会删)。里面是 `system.db`(账号、会话)、`event_projs\<项目名>\`(每个赛事的 `event.db` 与上传资源 `uploads\`,图片与自定义字体都在里面,字体在 `uploads\fonts\`)、`backups\`、`exports\`。
同一层还有 `config.yaml`(服务端配置)、`console\config.json`(Console 配置)与 `rules\`(规则包目录),也都在安装目录之外,同样不会被覆盖安装或卸载删掉。
要换位置:改 `%LOCALAPPDATA%\ScoreboardConsole\console\config.json` 里的 `server.dataDir`(支持绝对路径,相对路径按安装目录解析),重启 Console 生效。Console 会把这个目录用 `-data` 传给服务端,**它优先于 `config.yaml` 里的 `dataDir`**,所以只改 `config.yaml` 是不生效的。详见部署指南第 3.4 节与第 3.5 节。
**Q56:运动员为什么删不掉?怎么彻底删掉一个人?**
「基础数据 → 运动员」每行有三个动作:**编辑**、**停用**(已停用的人显示为「启用」)、**彻底删除**。以前只提供「停用」,所以看着像「删不掉」;现在点该行右侧红色的「彻底删除」,在二次确认框里再点一次「彻底删除」即可,删完页面会给出规模提示,例如「已彻底删除「张伟」:报名 1 条、成绩 1 条、积分流水 2 条,已重算 1 个小项的积分与名次」。它删掉什么、为什么会让榜单变化,见 Q57。
**Q57:停用和彻底删除有什么区别?**
| 动作 | 人员列表里 | 还能被报名选中吗 | 他名下的报名 / 成绩 / 积分 | 能恢复吗 |
| --- | --- | --- | --- | --- |
| 停用 | 还在(标「已停用」) | 不能 | 保留 | 点「启用」即可 |
| 彻底删除 | **不在了** | 不能 | **一并删除** | 恢复不了 |
- **停用**是软删除:人还留在名单里,只是不再出现在新报名的选择里;历史报名、成绩与积分全部保留;随时可以再启用。只是想暂时不让他报名,用它就够了。
- **彻底删除是真删除**:人员档案,以及他名下的报名、成绩、由这些成绩产生的积分流水(含已作废的历史流水)与破纪录记录,都会从库里删掉,界面上无法恢复。删完他也就不再出现在人员列表、报名选择和各类榜单里。
- **删人会改动榜单**:删掉成绩会改变同组其他人的名次与得分,所以系统会在删除的同时**按新排序重算受影响小项的排名与积分**并推送到大屏。已经有成绩的比赛,删人后原来的第二名可能升到第一、得分跟着变,删完请核对一下榜单。
- 已经发布的比赛要改人,更稳妥的做法是撤销发布、改好成绩再重新发布(见 Q8);「彻底删除」是给「这个人根本不该出现在系统里」的情况用的。
**Q58:删掉的人怎么又出现在名单里了?**
彻底删除之后,如果又在报名表里导入同一个人(同一个证件号、或同一个号码布、或同一「单位 + 姓名」),他会以**全新的档案**重新出现在运动员名单里——因为旧档案已经连同他的报名与成绩一起删掉了,系统按「证件号 → 号码布 → 姓名 + 单位」都找不到他,就当作新人员建档。所以名单里突然多出一个「以前删过的人」,通常就是某次导入带回来的。
- 新出现的这条是**全新的记录**:以前的报名、成绩与积分不会回来,需要重新录;
- 不想他再出现,就让各单位不要把这个人填进报名表;确实不该有的,再「彻底删除」一次即可。
**Q59:报名表的 status 能填中文吗?**
能。`status` 列**大小写不敏感**(`DNS`、`Registered`、`registered` 都认),也认这些中文别名:
- `正常` / `正常参赛` / `参赛` → 正常参赛;
- `退赛` / `弃赛` / `请假` → 退赛;
- `取消资格` / `犯规` → 取消资格;
- `未出场` / `未到` / `缺席` → 未出场。
留空就是「正常参赛」。这四个是**报名**状态,和「成绩录入」里每个成绩的状态(有效 / DNS / DQ / DNF / 退赛,见 Q11)是两回事。逐列说明见 [报名名单导入规范](./报名名单导入规范.md)。
**Q60:为什么导入报 status「xxx」无法识别?**
说明那一行的 `status` 填了系统不认的词(例如「已报到」「未参赛」)。这一行会被跳过并给出中文提示,其余行照常导入:
> 第 12 行:status「已报到」无法识别,只能填 registered / scratched / dq / dns(或留空)
改法:换成四个标准词之一(`registered` / `scratched` / `dq` / `dns`,大小写都行)或 Q59 里的中文别名,也可以直接留空(= 正常参赛),改完重新上传即可。对照表见 [报名名单导入规范 · 常见报错怎么办](./报名名单导入规范.md#六常见报错怎么办)。
**Q61:参赛单位怎么彻底删除?和删运动员一样吗?**
不一样,两个按钮同名、行为完全不同,现场别按错。「基础数据 → 参赛单位」每行有三个动作:**编辑**、**停用**(已停用的单位显示为「启用」)、**彻底删除**。点该行右侧红色的「彻底删除」,在确认框里核对提示后再点一次「彻底删除」即可,完成后该单位从默认列表里消失,页面提示「已彻底删除「XX」」。
一句话概括:**删运动员是真删,删单位是假删**。
| | 运动员的「彻底删除」(见 Q57) | 参赛单位的「彻底删除」 |
| --- | --- | --- |
| 数据 | 人员档案连同报名、成绩、积分流水、破纪录记录**一并从库里删掉** | **一条都不删**,报名 / 成绩 / 积分 / 人工调整 / 纪录 / 名下运动员全部保留 |
| 榜单 | **重算**受影响小项的排名与积分,删完榜单会变 | **积分榜不变**,不触发任何重算 |
| 列表 | 从运动员名册里消失 | 从参赛单位列表里消失 |
| 恢复 | 恢复不了 | **管理员**可在参赛单位页勾选「显示已彻底删除的单位」,再点该行「恢复」(见 Q62);再次导入用到它的编码也会自动回来 |
想让某个单位暂时不参赛,用「停用」就够了:单位还在列表里,历史数据保留,随时能再启用。详细说明见[使用手册 · 10.1 参赛单位](./使用手册.md#101-参赛单位)。
**Q62:删掉的单位怎么又出现在列表里了?**
两种常见原因:**管理员恢复了它**,或者**导入把它带回来了**。
- **恢复**:只有**管理员**能在参赛单位页勾选「**显示已彻底删除的单位**」把已删除的单位翻出来(标「已删除」),点该行的「**恢复**」即可原样放回列表;录入员(recorder)界面上看不到这个开关,删错了要**找管理员恢复**。恢复是幂等的,本来就还在时会提示「本就未被彻底删除」;若该编码已被另一个可见单位占用(只能来自手工改库),会拒绝并说明原因。
- **导入带回**:报名表里再次用到这个单位的编码(`team_code`),系统会把它**原样复活**——清掉删除标记、恢复成启用,重新出现在参赛单位列表里。因为单位编码是唯一的,系统按编码找到的就是原来那一行,所以**不会新建第二个同名单位**,原有的报名、成绩与积分也都还在。(**注意**:这只针对**报名表**导入;用**基础数据包**导入不会复活它,见 Q88。)
这和人员的规则**看着像、结果不同**:删掉的人再次导入是**以全新档案建档**,旧数据不会回来(见 Q58);删掉的单位再次导入是**原来那个单位直接复活**,旧数据一直都在。
- 不想让它回来,就别在报名表里填这个单位编码;
- 名单里「突然多出一个以前删过的单位」,通常就是这么来的。
**Q63:为什么积分榜里还能看到已删除的单位?**
这是**刻意设计**,不是 bug。「彻底删除」只是把单位从参赛单位列表里移除的假删除——它的报名、成绩与积分流水**一条都没删**。既然分数还在,积分榜(总积分榜、单位奖牌榜、分项成绩表)就会照旧列出这个单位的名字与分数,否则总分和名次就对不上了。
所以「单位列表里没有它」不等于「它的历史成绩不存在」,两处不一致是正常的。如果确实希望它的分数不再影响榜单,那不是「彻底删除单位」能解决的事——它动的只有列表里的条目,不碰任何成绩数据。
**Q64:单位下面还有运动员,能删吗?**
能。单位被彻底删除时,名下的运动员**不会**被一起删掉:他们仍在「运动员」名册里,报名、成绩与积分全部保留。但有两处会变得不好操作,删之前最好先处理:
- 运动员列表的「所属单位」列会显示成**未知单位**(那个单位已经不在列表里,名字查不到了);按单位筛选时也筛不到这些运动员,只有在「全部单位」下才看得到;
- 编辑这些运动员时,「所属单位」下拉里没有这个单位,**必须改选另一个单位才能保存**。
所以更稳妥的做法是:先把名下运动员调到别的单位(或者干脆用「停用」代替「彻底删除」),再决定要不要彻底删除这个单位。
**Q65:大屏控制页为什么看不到局域网那台电视?**
先确认那台设备真的打开了 `http://<主机IP>:19540/display` 并且能连上主机(同一局域网、服务端端口 19540 已放行)。连上后它会出现在「大屏控制 → 在线大屏」列表里——这个列表每 5 秒自动刷新一次,刚打开时等几秒即可。另外注意:
- 列表里在线实例排在前,离线实例也会保留一段时间(挂在后面),别只看第一屏就以为没有;
- 页面提示「读取在线大屏失败」时是列表没读出来,按提示刷新或检查登录状态(该接口需要记录员及以上),不是那台设备没连上;
- 本机「显示器」卡片只列**本机接的显示器**,局域网设备没有屏号,不会出现在那张卡片里,只会在「在线大屏」列表里显示为「局域网浏览器」。
**Q66:怎么给某一块屏单独切页?**
在「大屏控制 → 在线大屏」列表里找到那一行,用「当前页」旁的下拉选好页名,点「切到此页」——**只切这一台**,其他屏不受影响。本机显示器也可以直接在「显示器」卡片对应那一行的下拉 + 「切到此页」切。要让**所有大屏一起切**,才用上方「切页」卡片选页后点「立即跳转」。离线实例的下拉和按钮是灰的,切不了。
**Q67:切页时提示「目标大屏已离线」怎么办?**
这条提示只在**点名切页、但一块屏都没收到指令**时出现,说明目标实例已经离线或实例 ID 失效。处理办法:
1. 在「在线大屏」列表里看那一行的状态与「最后心跳」,确认大屏窗口 / 浏览器还开着、网络正常;
2. 等它重连(列表每 5 秒一刷,重连后会变回「在线」)再切;
3. 列表里根本没有它时,说明大屏没连上服务端,先解决连接再切页。
离线实例切不动是正常的:指令发不到它,系统不会谎报「已切换」。
**Q68:导出里「全部」和「全部(单页)」有什么区别?**
两者内容同源,覆盖的都是全部小项的全部报名 / 成绩,区别在排版:
- **全部**(`赛事成绩总表.xlsx`):一个工作簿里每个小项一张分表(多 sheet),适合归档打印;
- **全部(单页)**(`赛事成绩总表(单页).xlsx`):一个工作簿**只有一张表**,把所有单位、所有项目、所有成绩平铺在一起;每行前面带「大项 / 小项 / 组别」三列,脱离分表也能看懂。列是:大项、小项、组别、名次、号码、单位、运动员/队、成绩、积分、状态、备注。适合筛选、排序与二次统计。
**Q69:怎么把一个单位的积分明细导出成表格?**
两种方式:
1. **只导一个单位**:到「积分榜」页展开该单位的明细,点右侧明细面板头部的「导出该单位明细」,得到 `单位积分明细.xlsx`(逐条列出每一分的来源,末行是「合计」);
2. **一次导全部单位**:在「积分榜 → 单位总分榜」的**卡片头**点「导出总明细」,得到 `单位积分总明细.xlsx`——一张带「单位」列的总表,外加每个**有数据**的单位一张分表(没有积分的单位不出分表)。
单位奖牌榜那一列的「明细」展开的仍是**同一个单位积分明细面板**,所以想按单位看时也可以在那上面点「导出该单位明细」;但单位奖牌榜本身另有专属的逐枚奖牌导出(卡片头「导出奖牌明细」,见 Q71),个人积分榜也有专属的逐条得分导出(卡片头「导出个人明细」,见 Q70、Q72)。另外「导出 → 结果导出」里的「单位积分明细」也能先选一个单位再导出。这些导出都是只读下载,访客也能用。
> 明细面板与这份导出里的列:**运动员**(团体项目、按队内平均的团体分、人工调整这几类显示单位名或 `—`)、**来源**(`成绩` / `破纪录加分` / `人工调整`),以及**被改过的成绩**:面板上带「已修订 ×N」角标(悬停看最后一次修订的时间、原因与操作人),导出的**备注列**写「已修订 ×N;最后一次 <时间> <原因>」。没改过的行没有角标、备注留空。
**Q70:个人积分榜能导出明细吗?**
能。个人积分榜的**卡片头**有「导出个人明细」按钮,导出 `个人积分总明细.xlsx`:第一张总表逐条列出「单位 / 运动员 / 大项 / 小项 / 组别 / 名次 / 成绩 / 得分 / 来源」,其后每个**有得分**的单位一张分表(按单位分,不按人分;没有得分流水的人不出现在表里)。`得分` 是记到个人的原始分,与「个人积分榜」逐个数字一致,**不受榜单口径里的个人项目得分折算系数影响**(那个系数只作用于单位总分),详见 Q72。
**Q71:单位奖牌榜能导出每一块奖牌的来源吗?**
能。到「积分榜 → 单位奖牌榜」,点**卡片头**的「导出奖牌明细」,得到 `单位奖牌明细.xlsx`:
- 第一张总表逐枚列出「单位 / 大项 / 小项 / 组别 / 名次 / 奖牌 / 运动员、队」,`奖牌` 列是 `金牌` / `银牌` / `铜牌`;
- 其后每个**有奖牌**的单位一张分表,列与总表相同但去掉「单位」,末尾多一行小计 `金 X / 银 Y / 铜 Z`;没有奖牌的单位不出分表;
- 口径与「单位奖牌榜」一致:同一个报名项在「个人+团体」这类双计通道下只记一枚奖牌,导出不会重复计数。
**Q72:个人积分明细导出的数字跟个人积分榜对得上吗?会不会受榜单口径系数影响?**
对得上,而且**不受系数影响**。「导出个人明细」(`个人积分总明细.xlsx`)里的 `得分` 是**记到个人的原始分**,与「个人积分榜」逐个数字一致;「基础数据 → 积分模板 → 榜单口径」里的个人项目得分折算系数(键名 `standings.individual_to_team_weight`,默认 1)只在汇总环节把个人分折算进单位总分,**不会改变个人明细里的数字**——比如把系数改成 0.5,个人明细的得分仍是原始分,只有单位总分变小(见 Q18)。
**Q73:操作被拒绝了,怎么查是谁在什么时候、因为什么被拦的?**
服务端把「主动拦截」单独记到数据目录的拦截日志里(默认 `%LOCALAPPDATA%\ScoreboardConsole\data\logs\interceptions\`):
1. 找当天的 `interceptions-YYYYMMDD.log`(同一天有续写文件时按 `.1`、`.2` 往后看);
2. 搜 `请求被拦截`(WARN)那一行,它已经带齐:`reason` 中文原因、`origin` **拦截点**(形如 `internal/httpapi/repo_events.go:231 normalizeAvgMode`,直接看出是哪个函数的哪一行拦下的)、`code` / `method` / `path`,以及 `actor`(`用户名#id`,未登录是 `guest`)/ `role` / `requestId`;
3. 想定位得更准:浏览器开发者工具 **Network** 面板点开那条失败请求,复制响应头 `X-Request-Id`,拿它去日志文件里搜;同值的 DEBUG 行「拦截上下文」还会补 `detail` 与来源 IP;
4. 想对照同一时间有没有成功的操作,去 `operations\` 里搜同一个 `requestId`(放行日志带 action / 实体 / 操作人)。
中间件层的拦截(未登录 401、无权限 403、CSRF 校验失败、未改初始密码、操作过于频繁 429)同样记在这里。完整说明见部署指南第 10 节。
**Q74:日志文件在哪?会不会把盘写满?**
服务端日志在**数据目录**下的 `logs\`,分两类:
- `operations\`(放行类):放行的写操作(`操作已放行`,含 action / 实体 / 操作人 / requestId)+ 启动、数据库迁移等常规运行日志,按 `log.level` 过滤(默认 `info`);
- `interceptions\`(拦截类):我们主动拦下的报错 + 服务端异常(5xx),**固定按 debug 采集,不受 `log.level` 影响**。
不会写满:文件名按天(`interceptions-20260911.log`),同一天写满一个文件后续写 `.1`、`.2`…;每类保留份数**含当前文件**,超出自动删最旧的。单文件上限与保留份数由 `config.yaml` 的 `log.maxSizeMB`(默认 20 MB)、`log.keepFiles`(默认 10)决定,两类合计最多约 `2 × keepFiles × maxSizeMB`(默认约 400 MB);目录可用 `log.dir` 改(留空 = `<数据目录>\logs`)。日志目录不可写时,服务端只告警一次并降级为只写控制台,不影响业务。
别和 Console 自己的 `logs\console.log`(在安装目录里)混淆:那个装的是 Console 与服务端的控制台输出;服务端日志文件在数据目录。
**Q75:为什么我明明填了成绩,那一行还是被当成「还没录」?**
最可能是把格子里的**灰字示例文本**当成了已填内容。过去成绩格的示例是 `1:06.33`,没有样式区分,看起来就像已经填好;现在示例统一带「例」字(时间 `例 1:06.33`、距离 `例 12.34`、计数 `例 12`、得分 `例 96.5`,备注格是 `可留空`),并且是**更淡的斜体灰字**,和真实输入明显不一样。灰字不会被提交,那一格仍然是空的。
那空着会不会发不出去?**不会**。空格子在防呆校验里只是**提醒**,文案是 `第 3 行 张三:还没录成绩(当前「(空)」),本次发布不计入这一行`,**不挡发布**;点发布会只发已填的行,其余保持未发布,补录后再发一次即可(见 Q77)。真正挡发布的只有写错:`秒位不能 ≥ 60(当前「1:70」)…` 或 `成绩写法无法识别(当前「约1分06秒」)…`(见 Q76)。
**Q76:成绩能怎么填?**
按项目单位填(工具栏会显示当前单位:秒 / 米 / 次 / 分):
- **时间类(秒)**:`66`、`66.33`、`1:06`、`1:06.33`、`1:6`、`1分06秒`、`1分6秒`、`1分06`、`1小时2分3秒` 都认;中文输入法下的**全角冒号 `1:06` 与全角数字**也认;
- **距离 / 计数 / 得分类**:按提示填数字,例如米 `12.34`、次 `12`、分 `96.5`;无法识别时的提示会换成对应的数字说明,不会拿时间格式去教距离项目;
- **秒位 ≥ 60 会被拒**(`1:70` 不是 70 秒),但原因写明:`秒位不能 ≥ 60(当前「1:70」),请写成 1:06 或 66 这类`;
- 成绩格已经加宽,四位数也能看全。
有未保存的成绩时,切到别的菜单页面会先弹确认框,不会静默丢弃。
**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」并保存即可(该设置只有管理员能保存)。
**Q81:批次是什么?和组别、名次有关系吗?**
批次是**组别之下**的一层**录入 / 展示分组**,层级是「大项 → 小项 → 组别 → 批次」。它**不参与算分**:名次与积分仍然按「小项 + 组别」整体计算,一个人分到第几批不会改变他的名次、分数,也不会变成「按批排名」。批次只影响「成绩录入」页里表格显示哪些行(批次下拉筛选)与录入时的查找,发布、积分榜与大屏都不受它影响。
- 批次号是 **1–999 的整数**;**留空 = 未分批**(以前导入的报名没有批次,就是未分批);
- 批次在**成绩录入页**设置(见 Q82)或由报名表的 `heat` 列带进来(见 Q83),不在「基础数据 → 组别」里配;
- 切换组别后批次筛选会重置(批次是组别之下的概念);
- 分项成绩表与导出**暂不**按批次分块,导出的仍是整组成绩。
**Q82:怎么把 30 个人分成每 8 人一批?**
到「成绩录入」页选中该小项与组别,工具栏里填「每批 8 人」(默认就是 8),点「一键均分」,确认框会先说明将编排多少行、共几批、从第几批到第几批,确认即可。规则是:
- 只对**未分批**的行、按当前表格显示顺序切片;
- **已分批的行一个都不动**,手工编好的批次不会被冲掉;
- 新批次号**接着已有最大号往后排**(已有第 1、2 批时,从第 3 批开始);
- 列表里没有未分批的行时按钮不可用,鼠标停上去会说明原因。
也可以手动分批:勾选若干行 → 在「已选 N 行」工具栏里填批次号(留空会提示推荐的下一个号)→ 点「设为第 N 批」;点「清除批次」把选中的行改回未分批。
**Q83:报名表要加批次怎么填?**
报名表新增了可选列 `heat`:填 **1–999 的正整数**,同一小项 + 组别里号相同的就是同一批;**留空 = 未分批**,不报错。列的先后顺序可以随便调,列名写 `heat`(大小写不敏感)。
- 填了非整数、0 或超过 999(如 `第1批`、`一组`、`1000`)的行会被跳过,提示「heat 需要是 1-999 的整数(留空表示未分批)」,其余行照常导入;
- ⚠️ **重新上传同一份表会整条覆盖**:表里 `heat` 留空会把这一行原来的批次清掉,手工调整过批次的话重传前要在表里写清楚;
- 完整说明见[报名名单导入规范](./报名名单导入规范.md)。
**Q84:成绩格旁边那个小提示是什么?**
那是**聚焦成绩格时的实时提示**:光标停在某个成绩格里打字时,格子旁边会浮出一个小气泡,边打边告诉你系统怎么理解它。
- **合法** → 显示**解析结果**,例如打 `1:06` 显示 `= 66 秒`(米 / 次 / 分项目显示对应单位),让你确认系统理解的和你想的是同一个数;
- **可疑** → 例如 `成绩 ≤ 0,疑似录入错误`,放行但提个醒;
- **不合法** → 说明原因并**带出那一格的实际内容**,例如 `秒位不能 ≥ 60(当前「1:70」),请写成 1:06 或 66 这类`、`成绩写法无法识别(当前「约1分06秒」),可用 66、66.33、1:06、1:06.33、1分06秒`;
- **空格子不提示**;气泡不接收点击、不占布局、不改变行高,继续打字不受影响;靠屏幕底部时会自动翻到格子上方显示。
它和发布前的「防呆校验」用**同一套判定**,不会「打字时说没事、发布时被拦下」。
**Q85:手机上能打开管理面板吗?**
可以。管理面板已适配窄窗口与手机浏览器:在**同一局域网**内用手机浏览器打开 `http://<主机IP>:19540/admin` 即可(与电脑访问同一个地址)。窄屏下:
- 左侧导航收成抽屉,点顶栏的**菜单按钮**展开;
- 宽表格可以**左右滑动**查看(表头保留);
- 对话框不会超出屏幕,按钮与分页的点击区域也放大了,触屏点得中。
录入、发布、看榜这些日常操作手机上都能做;赛事配置这类条目较多的操作仍建议在电脑上完成。如果某台手机上仍显示不全,请把**机型、浏览器与屏幕宽度**(或截图)告诉维护人员——目前适配覆盖到 390px 宽的窄屏,桌面端布局不受影响。
**Q86:号码布和证件号,哪个才是系统认人的依据?**
**证件号。** 报名导入时的匹配顺序是「证件号 → 号码布 → 姓名 + 单位」:先按证件号认人;证件号为空、或库里的档案还没登记证件号时按号码布认;两者都没命中才按「姓名 + 单位」找,并把表里给的证件号 / 号码布**回填**进档案。系统里**一个证件号只能属于一个人**,撞上别人的证件号会按证件号认到那个人并进「冲突」列表(见 Q48)。号码布不再单独充当唯一标识,但仍然**不能给两个人共用**(同一个人报多个组别可以重复)。完整匹配规则见[报名名单导入规范](./报名名单导入规范.md)。
**Q87:怎么把报名名单导出来?**
到「导出 → 结果导出」页,往下找**「报名名单」**卡片:先按**小项 / 组别 / 单位 / 批次**筛选(都可以留空 = 不筛,即导全部),再点「导出报名名单」,得到 `报名名单.xlsx`。表里有 13 列:小项编码、小项名、组别、单位编码、单位名、姓名、证件号、号码布、批次、性别、年龄、状态(中文:正常参赛 / 已退赛 / 取消资格 / 未出场)、备注;号码布按文本导出,前导零不会丢。访客也能导出(只读)。
> 这份是**给人看的报表,不能导回去**。同一张卡片下面还有「**导出(汇总·导入格式)**」「**导出(分小项·导入格式)**」两个按钮,导出的 13 列与报名导入模板逐列一致、可以直接重新导入(见 Q104)。
**Q88:基础数据(单位 / 大项 / 小项 / 组别)能批量导入导出吗?**
能。到「导出 → 基础数据」页:
- **导出**:一个工作簿四张工作表(单位 / 大项 / 小项 / 组别,组别表带所属小项编码);
- **导入**(**仅管理员**,只认 `.xlsx`):按编码匹配,**存在就更新、不存在就新建,绝不删除**(表里没有的行不会被删、也不会被停用)。先点「预览差异」看「新增 / 更新 / 无变化 / 错误」与逐行变化,确认后再点「**确认写入**」;**有错的行会跳过、合法的行照常写入**,行级错误是中文并带真实 Excel 行号(如 `单位 第 3 行:单位编码必填`)。已「彻底删除」的单位不在导出件里,命中它的编码那一行会**整行跳过并报错**(不更新它的任何字段、也不会把它恢复出来,想让单位回来先用「参赛单位」页的「恢复」,见 Q62)。
要点:**列不在表里 = 不动该字段**(**布尔列也一样**,缺整列 ≠ 取默认值);**列在表里但格子空**:文本列与年龄上下限清空,权重按 1、布尔列(启用 / 计分等)按「是」,**排序留空保持原值**(**四张表口径一致**,单位 / 大项留空同样不会被改写)。**只有枚举列例外:列在表里但格子空 = 不改动**(小项的类型 / 结果模式 / 结果类型 / 比较 / 状态 / 平均口径、组别的性别),留空就沿用原来的值,只有**新建的行**才用默认值(新建组别时性别留空 = 不限)——这样误清一格不会把已发布小项打回「待录入」、也不会把「团体」改成「个人」。表头行在第 4 行(导出件)或第 1 行(手工表)都能识别;枚举列要填英文规范值、布尔列填「是 / 否」。**最稳的做法是从系统导出、改完再导回**。详见使用手册 11.4。
**Q89:登录会不会用着用着被踢下线?「登录有效期」怎么设?**
默认有效期 **24 小时**,管理员可在「系统设置 → 登录有效期」里改成 **1–720 小时**(最长 30 天);比赛期间建议设成 **72 小时**。会话是**滑动续期**的:只要在有效期内继续操作(页面开着也会定期自动续期),到期时间就往后顺延——**不会因为「登录满 N 小时」被踢**。当前到期时间在右上角用户菜单与系统设置页都写着「当前会话将于 X 过期」。
⚠️ 但它不是「永不掉线」:超过设定的有效期一直没操作(浏览器关掉、机器关机过夜),再打开仍要重新登录。改设置不会把正在用的会话当场踢下线:已登录会话的到期时间不会在改设置的一刻改变,它会在**下一次操作时按新的有效期续期**(调长立即顺延,例如 12 小时改 72 小时后,正在用的会话下次有请求就顺延成 72 小时;调短也只影响之后的续期)。
**Q90:发布后成绩上屏了,为什么积分榜没变、名次还是「—」?**
多半是管理员把「榜单口径」里的**「分批发布时实时更新榜单」关掉了**(默认是开的),也就是**延迟结算**:分批发布时只把成绩上屏,**积分与名次等该项目该组所有批次都录完才一次性结算**(报名状态不是「正常参赛」的人——退赛 / 取消资格 / 未出场——不算在等待里)。未结算组的**名次显示 `—`**(成绩照常显示)是有意的,免得出现「有金牌但 0 分」这种自相矛盾的画面。导出的「分项成绩表」「全部」「全部(单页)」对这类行也是**名次与积分列写 `—`、状态列写「未结算」**(成绩照常打印),见使用手册 11.1。
想让榜单立刻跟上:等该组录完会自动结算;确实有人永远录不出成绩时,在**成绩录入页**点 **「立即结算」**,按当前已发布成绩先结算一次。想改回实时结算:管理员到「基础数据 → 积分模板 → 榜单口径」,把「分批发布时实时更新榜单」勾上并点「保存结算方式」(见使用手册 10.5)。
**Q91:能不能一次把多个人退赛 / 恢复 / 移出报名?**
能,在「成绩录入」页操作:表格每行最左边勾选(表头是全选,**只作用于当前筛选范围**),选中后工具栏出现 **批量退赛** / **批量恢复** / **批量移出报名**。
- **批量退赛**:标记弃权(0 分、不占名次),**随时可以批量恢复**;已经是「取消资格 / 未出场」的行会被跳过、不覆盖原判定;
- **批量移出报名**:**物理删除**报名项连同他的成绩与积分流水,**不可恢复**,确认框会列出将被删的人与将重算的小项 / 组别;
- **移出后想加回来**:还在「成绩录入」页,点工具栏右侧的 **「补报名」**——打开的是「基础数据 → 报名导入」里的同一套勾选界面,并预选当前小项与组别,勾完点「加入报名」本组名单立刻刷新(见使用手册 4.8 / 10.7)。**退赛**的人不用走这条路:直接「批量恢复」即可。
- 一次最多 500 条;有未保存的成绩修改时请先「存草稿」再操作。
- 这三个动作(以及**撤销发布**、**作废单条成绩**、**改积分模板 / 组别权重 / 计分通道**)都**立即重算并推榜**,**不受「分批发布时实时更新榜单」这个延迟结算开关影响**——它们改的是「谁还算数」「按什么规则算」,不是「录了多少」,留着旧分就会变成「榜上还有分、成绩却撤了」。延迟结算只作用于**发布成绩**这一步(见 Q90)。
运动员列表也有类似的多选与**批量停用 / 批量彻底删除**(见使用手册 10.6)。
**Q92:新建单位 / 大项 / 小项时没填「启用」「计分」这类开关,会不会被静默关掉?**
不会。**漏传这些开关时会取默认值,而不是按「关」处理**:
- **单位 / 大项**:漏传「启用」= **默认启用**(以前会静默建成「停用」,在界面上等于不存在);**更新**时漏传则沿用原来的状态,不会顺手把它停掉;
- **小项**:漏传「计分」「计破纪录」= **两个都默认打开**(以前会被静默建成「只排名不计分、不能破纪录」);更新时漏传同样沿用原值。
用**基础数据包**导入时同理:「启用 / 计分 / 计破纪录」列留空 = 「是」,这些列**不在表里 = 不改动**该字段(见 Q88)。
**Q93:换了大屏背景图 / 单位 logo 之后,旧图片还占着地方,能删掉吗?**
能,管理员到「**系统设置 → 图片资源**」页签清理:那里列出 `uploads\` 里**没有被任何配置引用**的图片(孤儿),可以单张「删除」或勾选后「删除选中」,删除前有危险确认框、**删掉不可恢复**。
「被引用」指被下面四处任意一处用着——**赛事会标 / 大屏会标 / 大屏背景图 / 任一参赛单位的单位图标**(**已被「彻底删除」的单位也算**,因为它还能恢复,logo 得留着)。所以想清掉一张旧图,正确顺序是:
1. 先在「赛事信息」(或参赛单位)里把那个字段换成新图、或清空,并**保存**——这一步做完旧图才「没人引用」;
2. 再回「图片资源」页签点「刷新」,旧图就会出现在孤儿列表里;
3. 核对预览后删除。若某张图在你打开页面之后刚被配到别处,服务端会**拒删并说明被谁引用**(宁可漏删、不误删)。
注意:这个页签**只管图片**,上传的字体在「赛事信息 → 字体库」里各自删除(被标题 / 正文字体引用的不能删);这些图片和字体都是文件,**备份的 `.db` 快照和「一键恢复」都不含它们**(见 Q37),要清点或搬迁请到 `data\event_projs\<项目名>\uploads\`。
**Q94:奖牌榜上一个牌都没有,或者金牌数不对,怎么查?**
按下面顺序一项项排除(都不需要改数据,改完保存会自动重算榜单):
1. **是不是刚升级完、第一次启动**?→ 见 Q96,那是升级后的正常现象,服务端会自己补齐;
2. **该小项关了「该项启用奖牌结算」吗**?到「基础数据 → 大项 / 小项」编辑这个小项,看「选项」里的**「该项启用奖牌结算」**有没有被取消勾选——取消后这个小项**只出积分、不发奖牌**(见使用手册 10.2);
3. **该小项的通道关了「发奖牌」吗**?到「基础数据 → 计分通道」选中该小项,看「奖牌通道」列里这条通道的**「发奖牌」**有没有被取消——取消后这条通道的名次只出积分、不发牌(见使用手册 10.4);关掉的通道在「大项 / 小项」页的通道摘要里会标出 `不发奖牌`;
4. **个人项目的牌子是不是被排除在单位金牌榜之外**?同一列的**「个人奖牌并入单位金牌榜」**被取消时,这些个人奖牌仍进**个人积分榜**的奖牌列,但**不进单位金牌榜**——所以「某单位的金牌数比现场数的少」多半是这一条;
5. **这个小项本身计分吗**?标记为「不计分」(只排名不计分)的小项**从来不发奖牌**,这是它本来的口径,不用去动上面那些开关;
6. **名次是不是还没结算**?如果管理员开了**延迟结算**(Q90),未结算的组名次显示 `—`,自然也没有奖牌;等该组录完,或在录入页点「立即结算」;
7. **奖牌只发给前三名**,而且**并列第 1 各记 1 金、不发银牌**(名次顺延口径,见 Q10)——「牌数比名次人数少」通常就是这个原因;
8. 还有一条**全局开关**在规则包里(`standings.medalCountsTeamEvents`,默认**计入**团体项目的奖牌),界面上没有勾选框;本赛会的规则包是「计入」,一般不需要动。只有导入过别的规则包时才会把它改掉,检查办法见 Q47。
**Q95:团体名次在哪里录?为什么有时候录入页没有那一块?**
团体名次在**「成绩录入」页**录:选中项目与组别后,成绩表格下面会有一块 **「团体名次」** 卡片,按**单位**一行一个输入框,填完点「保存团体名次」。**留空就清空该单位的名次**;名次重复允许并列(会提示确认,不挡保存);**个人名次不受影响**——它是另一套数据,每个人的名次仍然在成绩列表里录。
**录入页没有这一块是正常的**,说明这个项目**没有配「团体名次 + 手动名次」的计分通道**。常见情况:
- 纯团体项目(篮球、拔河等):团体名次就是那条**团体报名行上的名次**,仍在成绩列表里照常录,不需要这块卡片;
- 「个人+团体」项目:团体名次是**按队内成绩平均**算出来的,也不在这里录;
- 真的需要按单位手填名次(例如「团体引体向上」):到「基础数据 → 计分通道」给这个小项加一条**名次范围 = 团体名次、名次来源 = 手动名次**的通道并「保存全部」,回录入页就会出现这块卡片。
完整说明见使用手册 4.9。
**Q96:升级到新版本后,奖牌榜是空的(全是 0),怎么办?**
这是升级后的**正常现象,会自己好**。原因:本版把奖牌统计的数据来源换成了一张新的「通道名次」表,而升级脚本只**建表、不回填**历史名次——所以升级完成到第一次重算之间,奖牌榜会短暂是 0。
服务端**下一次启动时**会自动做一次全量重算把名次补齐(重算在对外提供服务之前跑完,所以大屏不会先亮出一帧全 0)。在 Console「运行日志」或 `logs\operations\` 当天文件里能看到这两行,**是正常的,不是报错**:
```
检测到通道名次为空但已有已发布成绩,正在执行一次性全量重算
一次性全量重算完成,通道名次与奖牌榜已补齐(events=… ledgerRows=… elapsed=…)
```
- 通常**几秒内**跑完(数据量大时稍久,日志里会写耗时);跑完后刷新管理端/大屏即可看到奖牌;
- 它**只在需要时跑一次**:表里已经有名次(说明重算过)时不会再触发;
- 如果看到的是 `通道名次自愈失败,奖牌榜可能仍为空`,那不是"坏了"而是重算没做完:**随便发布一次成绩**、或**重新导入一次规则包**都会触发重算,重算完奖牌就回来了;
- 想立刻确认数据没问题,也可以手动**重新导入一次规则包**(会全量重算)。
**Q97(已知限制):双计项目回看历史版本时,积分跟当时现场对不上?**
有这种可能,属于**已知限制,不影响当前榜单**。
- **哪些项目**:配了「团体名次 + 手动名次」通道的项目(也就是录入页会出现「团体名次」卡片的那类,例如「团体引体向上」);
- **什么现象**:在「变更历史」里展开某个历史版本时,页面会按**那一版保存下来的成绩**重新算一遍各单位分数。而**按单位录入的「团体名次」不在历史版本快照里**,所以回看时这些组别的团体分算不出来,各单位的分数增减可能与当时现场看到的略有差异;
- **不影响什么**:**当前榜单、大屏、导出全部是对的**(它们读的是库里现存的团体名次,与历史快照无关);只有「历史版本详情」里那一列**分数增减**(以及它影响的单位数)会因此偏小或对不上;
- 想核对当时的真实分数,以**当时的导出件**(成绩总表 / 单位积分明细)为准。
**Q98:成绩填错了怎么改?**
先看是**只错一条**还是**整组都要改**——两条路的影响面完全不同:
**① 只错一条(最常见)**:到「成绩录入」找到那一行,**点成绩格(或点状态格),也可以点最右端「操作」列的「修改本条」**:
1. 点下去会弹出确认框,写明「这一条会退回草稿、榜单先把它退下来、改完需重新发布本组」,并要你填 **「修改原因」**(必填,留空点了不提交)——**点「取消」则什么都不做**(成绩、榜单、大屏都不动);
2. 确认后这一条退回草稿,名次与积分先按「没有这条成绩」重算,**大屏立即更新**;原来填的成绩还在格里,直接改就行;
3. 把成绩改对,再点页头的 **「发布」**(该组还有别的已发布成绩时显示为「发布本批」,见 Q77)。同组别人的成绩一直在榜上,不会被翻下来。
**② 这一条根本不该算**(成绩无效、重复录入等):同一行点 **「作废本条」**,填 **「作废原因」**(必填)→ 确认。这一条不再计入名次与积分,同组其它人重新排名、**大屏立即更新**;成绩文字还留在格里,录入列变成红徽标「已作废」,状态格变成「退赛」。以后要让它重新算数,用同一行的 **「重新录入」** 退回草稿改完再发布。**只是填错了要用 ① 的「修改」,不要用「作废」**——「作废」会在榜上留下一条作废痕迹。
**③ 整组都要改**(例如整组被判罚、名次口径整体调整):点「撤销发布」→ 修改 → 重新发布(见 Q8)。它会把该组已产生的积分流水整体作废再重发,大屏先回退一次。
三个入口的细节:
- **已发布的行仍然锁着**(名次、备注改不了),但**成绩格与状态格点得动**:点一下只弹出与「修改本条」同一个确认框,不确认就什么都不会发生——这是有意的,已发布就意味着已经上屏、已经计分,**绝不能「点一下成绩就悄悄从榜上退下去」**;要改必须先明确地把它退回来,所以给了「修改本条 / 作废本条」这一对按钮,而不是直接解锁;
- **「修改」与「作废」的区别**:**修改**是「这一条填错了,退回草稿改一改再发」,不会把这一条标成「已作废」;**作废**是「这一条不算了」,成绩留在表里但不再计分。改错字用「修改」,别用「作废」;
- 修改 / 作废 / 退回都**立即重算并推大屏**,**不受「分批发布时实时更新榜单」这个延迟结算开关影响**(它们改的是「这条成绩算不算数」,不是「录了多少」);
- 三者都会**留痕**:审计日志(见使用手册第 13 节)里的动作分别是 `result.reopen`(修改 / 重新录入)与 `result.void`(作废),含操作人、时间与填写的原因。「变更历史」记的是**发布 / 撤销发布**这类整组版本,单条的修改 / 作废 / 退回不会在那里新增一个节点;
- 有个前提:点之前先把未保存的编辑「存草稿」——修改 / 作废 / 退回会重算并整表刷新,页面会拦下并提示。
**Q99:误批准了破纪录怎么办?**
到「破纪录」页,下面有 **「已批准的破纪录」** 卡片(需要**录入员及以上**才能看),找到那一条,点右端的 **「作废」**:
1. 确认框会写清后果并给一个 **「作废原因」** 输入框(必填);
2. 确认后服务端在同一件事里做完三样:**撤回该笔加分**、**重算并推榜**(榜单回退)、**把该级别的当前纪录恢复为上一条**;
3. 完成提示「加分已撤回,该级别纪录已恢复上一条」。
注意两点:
- 如果**该级别本来就没有更早的纪录**,撤下后就留空——「无纪录」是事实,不会留一条刚被作废的纪录充数;
- **撤回的是「加分」**:这条成绩本身的积分(名次分)不受影响,它当初是按正常成绩算的。
顺带纠正一个旧说法:点「拒绝」现在**不是**只在本机隐藏了——系统会在服务端**先登记一条破纪录记录、再立即驳回**(原因固定写「现场判定不是破纪录」),所以**刷新后不会再出现**,谁在什么时候否掉了哪一条也能在审计日志里查到。只有示例数据模式 / 服务端连不上时才退回本机隐藏,并会如实提示「刷新页面后该条会重新出现」。
> 升级提醒:**升级前在本机「拒绝」过的疑似破纪录,升级后刷新会重新出现一次**——那次拒绝没有写到服务端,重新点一次「拒绝」即可。
**Q100:历史纪录怎么录?**
到「破纪录」页的 **「纪录库」** 卡片,点卡片头部的 **「新增历史纪录」**:
1. 选 **小项**(必选)与 **级别**(赛会 / 市级 / 省级 / 全国,默认赛会);
2. 填 **成绩值**(数字)与 / 或 **成绩文本**(如 `11.20`、`1:06.33`)——**至少填一个**,都填时比较与破纪录判断以成绩值为准;
3. 可选填 **保持人姓名**、**保持单位**、**创造日期**(都可以留空,老资料常常只有一部分,留空不会逼你编数据);
4. 点「保存纪录」,提示「已新增历史纪录 · 来源记为「历史」」。
新录的这条会成为该小项该级别的**当前纪录**,原来那条自动变成非当前(仍留在库里)。纪录库的 **「来源」列**因此有了两种值:**历史** = 赛前手工登记的旧资料,**本届** = 本场赛事批准破纪录时自动写入的(以前没有历史录入入口,实际只会看到「本届」)。
**删除**:每行右端有「删除」(需**录入员及以上**)。确认框会说明「若它是当前纪录,会恢复上一条」,并注明「删除只影响纪录库,不会改动任何已发布的成绩与积分」;删除不会触发重算。
**Q101:大屏控制页显示「未检测到局域网地址」怎么办?**
先说结论:这多半不是故障,而是主机此刻没有「别的设备能连上」的地址被系统枚举出来。按下面顺序排查:
1. **先看卡片列出的「已检查」原因**:新版空态会逐条列出检查过的网卡与各自被跳过的原因,例如「没找到可用的局域网地址。已检查:以太网(接口未连接)、WLAN(只有 IPv6 地址)。」——原因有「**接口未连接**」「**只有 IPv6 地址**」「**接口没有地址**」「**回环接口**」四种;最多列 5 条,网卡更多时其余折叠成「**等共 N 块网卡**」。照着原因去修那一张网卡(插好网线 / 给它一个 IPv4 地址 / 看看 DHCP)。如果看到的仍是旧句「未检测到局域网地址(可能是没插网线 / 只有回环)。」,说明这台机器上的前后端还没更新到最新版,按下面几步照样能排查;
2. **`ipconfig` 确认有没有 IPv4 地址**:在 cmd / PowerShell 里跑 `ipconfig`。注意 **Windows 里「网线插着、网卡显示 Up」不等于拿到了 IP**;如果只看到 `169.254.x.x`,说明**本网段没有 DHCP**,地址是设备自配的——这在**独立小网络**(没有路由器、设备直连或只接一台交换机)里是**正常用法,不是故障**,同网段的平板 / 手机照样能访问;
3. **手动添加地址**:自动检测不到、或者列出来的不是你要的那个网段时,把 `ipconfig` 里那条 IPv4 地址填进卡片下方的「手动添加地址」再点「添加」——立刻出链接和二维码(排第一条、带「手动」徽标、刷新不丢,最多 10 个);
4. **放行防火墙入站 19540**:地址对了、别的设备还是打不开,多半是主机防火墙挡了。装的时候选的是**「为所有用户安装」**的话,安装程序提权时**已经自动放行**(防火墙里能看到规则 `Scoreboard Console (TCP 19540)`),不用再手工加;选「仅为我安装」的机器要手工放行——在**管理员** cmd 里执行 `netsh advfirewall firewall add rule name="Scoreboard 19540" dir=in action=allow protocol=TCP localport=19540`(改过端口就换成实际端口;也可以改用「为所有用户安装」重跑一次安装程序让它自动放行,但自动放行只认默认端口 19540);临时关闭防火墙只用于**验证**是不是它挡的,验证完要恢复;
5. **还不行就跑自检**:运行 `debug\诊断\局域网地址自检.exe`,把它的输出发回给我们。
**Q102:我改了小项的显示名称,回到录入页发现「撤销发布」按钮不见了?**
**先说结论:不是改名弄坏的。** 改名那条路一直是干净的:录入页加载报名名单、读成绩、算分,**全都按小项的编号(ID)关联,不看名字**。
**真正的原因是「回到录入页时被切到了另一个小项」**:进入「成绩录入」页时,系统**不记得你上次录的是哪个小项**,兜底挑**第一个「待录入」的小项**;而**刚发布完的小项状态已经是「已发布」**,正好被这条兜底排除——所以你离开一趟(例如去基础数据改个名字)再回来,右侧看的是**另一个小项**;而「撤销发布」按钮是**按当前这张表里有没有已发布的行**显示的,换到那个还没发过的小项上,按钮自然就不在。
所以现场看到的那几条**本来不矛盾,它们说的是两个不同的小项**:
| 你看到的 | 说的是哪个小项 |
| --- | --- |
| 左栏那个小项仍写着「已发布」 | 你**原来**录的那个(左栏是项目列表,全部小项都在,不会因为你切走而变) |
| 单位成绩仍有加分 / 榜上还有分 | 还是**原来**那个——分没丢,也没被撤 |
| 「撤销发布」按钮不见了 | **右侧表里现在显示的那个**——是另一个还没发布过的小项 |
**怎么办**:从 `dev_0.5.12` 起,录入页会**记住你上次录的那个小项**,离开再回来还是它,按钮就在。想确认自己看的是哪个小项,看**右侧表格上方选中的那个小项名**、以及表里的人是不是你刚才那一组;也可以从仪表盘「当前赛程」点那一项的 **「录入」** 直接进到指定小项。记忆失效时(那个小项被删了、或浏览器不允许存本机数据,例如隐私模式)会**自动退回原来的默认挑法**,不影响使用。详见使用手册 4.1 / 4.7。
**Q103:大屏上的分数为什么过一会儿才变?有时候干脆一直不变?**
**先说结论:分早就变了,卡住的只是屏幕上那一格数字的画法。**
服务端在你点下确认的那一刻就把分算完并写库了——**积分榜接口、导出件、别的电脑上打开同一个榜单,看到的都是新值**。大屏上「**单位总分**」那一格是**逐帧滚动**过去的,而浏览器对**被别的窗口完全盖住的窗口**会**停掉逐帧绘制**,于是数字停在旧值上,**卡多久 = 被盖住多久**。
**怎么一眼认出来**:把盖住大屏的那个窗口挪开(或者按一下 Alt+Tab)——数字会**「啪」地一下跳到新值**,而不是慢慢滚过去。
**为什么只有这一格**:全场只有「单位总分」是**滚动显示**的,**单位奖牌榜、分项成绩、实时赛况里的数字都是直接写上去的**,所以它们一直是立刻变的。
**怎么办**:
- 从 `dev_0.5.13` 起已经修好:就算一帧都画不出来,**最迟约 1.3 秒**也会直接落到新值;大屏窗口**重新露出来 / 被点活**时立刻是正确值,不会再补滚一遍过时动画;
- 日常使用上:**别用别的窗口把大屏盖住**(尤其别把管理面板拖到接大屏的那块显示器上);大屏那块屏播放中**不要切走输入源或关屏**,那也会让它判定为「看不见」而停止绘制;
- 升级前的旧版本遇到这个现象时,**挪一下盖在它上面的窗口**即可立刻恢复显示,**不需要重新发布成绩、也不需要重算**。详见《升级说明》的 `dev_0.5.13` 一节。
> 顺带分清另一件事:「**撤销发布**」**保留**成绩内容(只把分收回来,改完重新发布即可);要**连成绩内容一起清掉**,那是工具栏上另一对按钮「**清空本组 / 清空本批**」(危险操作,要勾选确认,清整组时还会一并清掉按单位录的团体名次)。两者的对照见使用手册 4.7。
**Q104:导出的报名名单为什么和导入模板不一样?能不能直接导回去?**
**先说结论:以前导出的那份不能,现在报名名单卡片里多了两个能导回去的按钮——挑对按钮就行。**
原来「导出报名名单」导出的是一张**给人看的报表**:额外有小项名称、单位名称与备注三列,**姓名列拼了队员**、状态写「已退赛」、单位名后面还拼着队名。**导入器不认这份表**(列对不上,状态那个写法也不认),拿它去「基础数据 → 报名导入」重导会被拦下——所以那份只能看、不能导回去。
现在同一个**报名名单卡片**里多了一组「**导入格式**」导出,与「基础数据 → 报名导入」里下载的模板**逐列一致**,可以直接导回去:
| 按钮 | 导出来是什么 | 文件名 |
| --- | --- | --- |
| 导出(汇总·导入格式) | 13 列汇总在**一张工作表**里 | `报名名单(导入格式).xlsx` |
| 导出(分小项·导入格式) | 13 列,按「小项名称@组别名称」**分成多张工作表** | `报名名单(导入格式·分小项).xlsx` |
- 13 列是:项目编码 / 组别 / 单位编码 / 姓名 / 证件号 / 性别 / 年龄 / 号码布 / 种子 / 批次 / 状态 / 队员名单 / 队伍(顺序就是这个,没有小项名称 / 单位名称 / 备注那三列);
- **团体报名的「姓名」列是空的**、队员写在「队员名单」列(「姓名」列填了就会被当成个人报名);「**队伍**」是**独立的一列**(报表件里是拼在单位名后面的);「状态」写的是导入器认的四个中文说法:`正常参赛` / `退赛` / `取消资格` / `未出场`;
- 筛选与权限跟报表一样:小项 / 组别 / 单位 / 批次都可留空(留空 = 不筛),**访客也能导**;
- 上方的**表头语言**(中文表头 / 英文表头)**只管这两个导出**,改它不会动上面那份报表(界面上写明了);
- **往返已经测过**:这两种导出件原样喂回导入接口,零错误、行数一致、13 列逐项一致,**团体行不会被变成个人报名**(队员关联还在)。想自己验一遍:导出 → **一个字都不改** → 在「基础数据 → 报名导入」原样上传,结果应当是「新增 0 / 更新 N / 错误 0」。
**重导前要知道的三条限制**(它不是"完全无损"):
1. **号码布可能进冲突面板**:导出件写的是**报名上登记的号码布**,导入时对个人行会拿它跟**运动员档案里的号码布**比;两边都非空且不同,这一行就进「冲突」列表等你逐条决定(库里两者一致是常态,那时是静默幂等);
2. **联队的份额会变成均分**:13 列里联队只能写 `A+B`,重导回去是**各 50%**;当初设成 `2:1` 这种非均分的会变均分——表格本身表达不了,要保权重只能在界面上改;
3. **「队员名单」只增不减**:导出时会把界面上后来补进这支队的队员一并补上,所以重导后这支队的队员**不会少**,但个别名单的**顺序 / 写法**可能与最初上传的那张表不完全一样。
**一句话**:给人看的用「导出报名名单」;**要拿回去重导,用「导出(汇总·导入格式)」或「导出(分小项·导入格式)」**,导出的文件**不要改表头、不要插删列**。详见[使用手册 §11.1](./使用手册.md)与[报名名单导入规范 · 第九节](./报名名单导入规范.md#九导出的名单怎么导回去)。
**Q105:大屏上某个团体项目的名次显示 `-`,是不是没算出来?**
**先说结论:名次早就算出来了——导出件与积分明细里一直是对的,以前只是大屏那一处没读它。新版起来刷新一下大屏就有了,不用重发、不用重算。**
以前会这样的原因:纯团体项目的名次(例如团体 4×100 接力的单位名次)只写在**发布时算出来的那份名次(通道名次)**上;而成绩行上的「个人名次」这一列是**有意收窄的**——它只记个人名次,**对团体主体一直是空的**。大屏原来只读「个人名次」、没有兜底,于是团体行画出来就是一个 `-`;导出件与积分明细下钻**早就带了兜底**,所以当时是「导出的文件有名次、屏幕上没有」。录入页也一直看得见名次。
现在大屏的两个读者(分项成绩 / 底栏「最新完成项目」,以及实时赛况)都改成 **「个人名次」优先、为空时回落到「通道名次」**,**算分与写回一行没动**。
- **已经发布过的数据不用重发、不用重算**:新版起来大屏下一次刷新就显示出来;
- **为什么不干脆让「通道名次」优先**:「**只更新名次**」的发布只写「个人名次」、**不重建通道名次**,通道名次一优先,个人项目在那种发布之后会显示**上一次的旧名次**(见使用手册 4.5 / 5 与《升级说明》`dev_0.5.15` 的 ④);
- ⚠️ **还有一类项目仍然显示 `-`(已知限制)**:**只在「团体名次」卡片里按单位录了名次、成绩行上一个数都没填**的项目(例如拔河只用卡片录)——那类名次只存在「按单位录入的团体名次」里、**没有对应的成绩行**,大屏上仍然没有名次可画(团体名次本身照常算分,见 Q95)。要上屏就得在成绩行上也有成绩。
详见《升级说明》`dev_0.5.15` 的 ①。
**Q106:分项成绩页第 3 栏看不到第 1 名、名次看着是跳的,是不是算错了?**
**先说结论:没算错,是那一栏被「截断」过。这个毛病跟着栏位走、不跟着项目走——同一批项目放在前两栏就没事,落到第 3 栏就少人。**
原因:服务端快照里「最新成绩」的窗口原来是**按行取 20 行**,而屏上是「一组一栏」——窗口的切口**只能落在最旧的那一栏(通常就是第 3 栏)内部**,把那一组里**建号最早的行**(手录项目通常就是第 1 名)挤了出去;剩下能画的行名次自然是跳的。
现在窗口改成 **「最近 8 组 × 每组 10 行」**:先按每组最近一次发布时间取**最近 8 组**,再在每组里**按名次保底取前 10 行**。名次的切口不再落在某一栏内部,**第 3 栏从第 1 名开始画**;**底栏那条「最新完成项目」也一起吃这个修复**。
- ⚠️ **取舍**:单组**超过 10 行**的部分**不再下发**。前端每栏只画 6 行、「实时赛况」上限也是 10 行,所以三个页面都看不出来;**将来若把每栏的行数上限调到 10 以上,必须同步调这个「每组 10 行」**;
- 想核对某一组的**完整**名次:看「导出 → 结果」里的分项成绩表,或切到大屏的「实时赛况」页(当前项目下发的是完整名单,本来就不受这个窗口限制)。
详见《升级说明》`dev_0.5.15` 的 ②。
**Q107:大屏控制页「在线大屏」里的设备名看不懂、两台一样的平板分不出来,能改名吗?**
能。列表里每条都有「**改名**」入口(**录入员及以上**可用,与切页同一档)。
- 现在显示的是**自动设备标签**,形如 `安卓 13 · Chrome 120 · 1080×2400 @3x · 手机`——写法是 **系统 + 版本 · 浏览器 · 分辨率 · 形态(手机 / 平板 / 桌面)**,取不到的段会自动跳过(例如 `iPadOS 17 · Safari 17 · 2048×2732 @2x · 平板`、`Windows 10 · Edge 120 · 1920×1080 · 桌面`、`安卓 13 · 微信 8 · 1080×2340 @2.75x · 手机`);
- ⚠️ **自动标签认不出「哪台机器」**:浏览器**没有**读主机名 / 设备名的 API(这是安全边界),所以**拿不到 `XIAOMI-PAD-05` 那种真机名**;两台同型号设备只能靠**手动改名**或**来源 IP** 分辨;
- **怎么改**:点该行的「改名」→ 就地填一个现场看得懂的名字(例如 `二号楼平板`)→「保存」(`Enter` 也可);旁边的**「清除」**回到自动标签、**「取消」**什么都不改。名字**存在服务端**,**重启服务端与切换赛事项目都不丢**(最长 40 个字符)。显示优先级是 **手动名 → 自动标签 → 那个随机实例 id**(id 降级成小字,排障时还在);鼠标停在设备名上能看到设备标签、**原始 UA**、实例 id、来源 IP、屏号(取不到的整行不出现);
- **上限 200 条**:满了会**拒绝新增并提示先清理**,不会悄悄顶掉别的设备;
- 别名跟着**设备**走:设备太久没连、条目被服务端清理之后,**别名仍然留着**,同一台设备再连上来还是那个名字;
- **以前给某台设备切页后,列表底部会多出一个该设备的离线条目**(根因是翻页会补发一次握手,而浏览器没有稳定 id、服务端每次都新开一条实例),**现在已经修好**:浏览器本机记住自己的实例 id,服务端也做了兜底(同一条连接重复握手复用原实例),升级后不会再出现这种重复条目。
顺带一句:「局域网大屏」卡片里**每一条地址**都能出二维码了——第一条是常驻二维码,其余每条点「**二维码**」按钮临时出码(再点一次 / 按 Esc / 点空白处收起,同一时刻只留一个),不用为别的网段再手敲地址。详见《使用手册》第 9 节、《部署指南》7.5。
**Q108:大屏上那条「赛事日程」侧边栏怎么开?为什么有一块屏没有?**
到管理端「**大屏控制**」页**左列、公告卡下面**那张「**赛事日程**」卡片(**录入员及以上**就能改,与大屏公告同档):
- **先加日程**:点「新增一条」,填**时间**(自由文本,`08:30` / `上午` / `待定` 都行,最长 20 字)、**标题**(必填,最长 40 字)、**备注**(可留空,最长 60 字),最多 **40 条**;顺序用**上移 / 下移**调(只有这两个按钮,**不能拖拽**);
- **再开开关**:把「**侧边栏默认开启**」打开(开 = 所有大屏默认显示;关 = 都不显示),选**位置**(默认右侧)与**宽度**(15–40 %,默认 22 %),点「**保存**」;
- **保存后就生效,不用刷新大屏**:侧边栏是**叠在当前页之上**的,不改当前页、也不停轮播——所以那块屏本来在轮播就继续轮,锁着就继续锁着。
**某一块屏没有,多半是这三件事之一**:
1. 卡片下半部分「**每块屏单独设置**」里,那一块屏被设成了「**强制关**」——下拉切回「跟随总开关」再保存即可(切回「跟随总开关」会把那条设置**真的删掉**);
2. 那块屏**当时没连上**(大屏窗口被关掉过、或网络断过)——它重连 / 刷新后就会带上侧边栏(**配置存在赛事库里**,刷新、重启服务端、切赛事都不丢);还看不到就先点一次管理端的「强制刷新」让它重拉快照;
3. 「侧边栏默认开启」本来就是关的,而那块屏没有单独的「强制开」。
⚠️ 另外两个常见误会:**「当前项」看的是勾选、不是时间**——它就是**第一个没勾「已完成」的条目**;**顺序就是你排的顺序**,系统**不按时间自动排序**(手填的时间是自由文本,`上午` / `待定` 没法可靠解析,所以**不做、也不会做**)。详见《使用手册》9.2 / 17.6。
**Q109:侧边栏上为什么看不到全部日程?字会不会太小或太大?**
**先说结论:它不是「完整日程公示」,是「围绕现在进行到哪一项」的现场提示。**
- 条目**放不下**时,面板会**围绕当前项开窗**:当前项固定在显眼位置、前后各显示若干条,**已完成的与很靠后的条目会滚出视图**(被截住的方向上会写一句「上方 / 下方还有 N 项」)。要**完整公示**日程,请用轮播页或另行打印,别指望这条侧边栏;
- 想让它一次显示更多条:把**宽度**调大一点(最大 40 %),或**精简标题 / 备注**(长文本会占掉行数)——**最多 40 条**是硬上限,但放不下时**绝不会**把字缩到看不清。
**字号**:按文本长度与可用高度**自适应**,且有**硬上下限**——**宁可少显示几行,也不缩到看不清**;长标题最多 3 行、长备注最多 2 行,超出**省略**(按显示宽度算,中文与字母各自计宽);时间与备注比标题小一档(0.8 倍,同样有下限)。**1080p 与 4K 都按屏幕等比缩放**:4K 上字与面板**一起**放大,不会出现「4K 上字特别小」或「字特别大」。
**Q110:打开积分明细或推公告的时候,侧边栏不见了,是坏了吗?**
没坏,这是**故意的**:
- **明细覆盖层**开着期间(「推送到大屏」那块半屏明细);
- **全屏公告**正在播期间。
这两种情况下侧边栏会**自动收起**,**开关状态一个字节都不动**——明细关掉 / 公告退场后**它自己就回来了**,不用重新保存、也不用重新开开关。为什么要这样:这两件事都是「临时要在整块屏上讲另一件事」,被侧边栏压住会看不全。
**Q111:导出件上的名次和大屏上的名次为什么不一样?**
**先说结论:这是一条既有口径**(屏幕上和导出件上「名次取谁」的优先级**故意不同**),**正常赛程遇不到**;真遇到了,**按决赛发布一次**就能让两边一致。
| 看哪 | 名次取谁 |
| --- | --- |
| **屏幕**(大屏的分项成绩 / 实时赛况 / 底栏「最新完成项目」) | **成绩行上的名次优先**,为空时回落「通道名次」 |
| **导出件**(「导出 → 结果」的分项成绩表) | **「通道名次」优先**,为空时回落成绩行上的名次 |
**什么时候两边会分叉**:只有一种序列——**先「按决赛成绩发布」**(会重建通道名次),**之后又只发了一次「只更新名次」**(只写成绩行上的名次、**不重建通道名次**)。这时**导出件显示的是上一次计分的名次,屏幕显示的是新名次**。
**为什么这么设计**:屏幕侧必须「成绩行优先」——因为「只更新名次」的发布**只写成绩行上的名次、不重建通道名次**,一旦让通道名次优先,个人项目在那种发布之后会**显示上一次的旧名次**(见 Q105 与《升级说明》`dev_0.5.15` 的 ①/④)。导出侧则是**既有口径、有测试钉着**,本版按「兼容性最大化、不动已交付的东西」**原样保留**(见《升级说明》`dev_0.5.16` 的 ④)。
**遇到了怎么办**:对该小项 + 组别**再按「按决赛成绩发布」发布一次**即可(通道名次会按当前成绩重建,两边立刻一致),**不用改库、不用重导、也不用重算整场**。正常赛程(预赛只排名次 → 决赛才计分)两边名次本来就是同一个值,不会遇到。