Files
Scoreboard/docs/常见问题.md
T
AskaEth 9d4ee0946c feat: 运动员彻底删除(真物理删除 + 重算积分)+ 报名表 status 容错 + 部署包带导入规范
## 运动员「彻底删除」= 真删除
`DELETE /api/athletes/{id}?purge=1`(不带参数仍是「停用」软删除)。在一个事务里:
删积分流水(含已作废历史流水)→ 删破纪录登记 → 删成绩 → 删报名 → 删人员 →
对受影响的 (小项, 组别) 调 recomputeLedgerTx + applyComputedRanks 重算流水与名次 →
bumpEvent/bumpStandings 推大屏 → 审计 athlete.purge(含删除规模)。
响应带 {deletedEntries, deletedResults, deletedLedger, deletedBreaks, recomputedEvents}。
必须先删 results 再删 entries(results.entry_id 无 ON DELETE);流水按 athlete_id / entry_id /
result_id 三种引用一把清,漏一种就留悬挂。

管理端「运动员」行加「彻底删除」按钮 + 危险确认框(如实写明报名与成绩一并删除、
相关小项排名与积分会重算),成功 toast 报出删除规模。

## 报名表 status 列容错
新增 entry_status.go 的 normalizeImportStatus:大小写不敏感(DNS/Registered 都认),
认「正常/退赛/弃赛/请假/取消资格/犯规/未出场/未到/缺席」等中文别名,留空即 registered,
认不出则给中文行级错误并跳过该行。此前原样入库,撞 entries.status 的 CHECK 约束后
抛原始 SQLite 错误,填表人看不懂。

## 修 isUniqueViolation 把 CHECK 失败误报成「已存在」
SQLite 的 CHECK / NOT NULL 失败也带 "constraint failed",旧匹配把「小项 status 取值非法」
报成 409「小项编码已存在」,现场会去找一个根本不存在的重名编码。收紧为只认
"unique constraint failed"。实测:重复编码仍 409;非法 status 不再误报。

## 安装包平铺《报名名单导入规范》
deploy/prepare-extra.mjs 改清单式,部署包根目录除 使用说明.txt 外新增
报名名单导入规范.txt。

测试:服务端 12 包全绿(新增 athlete_purge_test.go、entry_status_test.go);
前端 vue-tsc 通过、166 例全过;Console 语法检查 17 文件。
另在真二进制 + 真 SQLite 上跑通破坏性路径:删人后本人痕迹全为 0、他人不受影响、
榜单按新排序重算、foreign_key_check 无悬挂。docs/ 与 devdocs/ 同步更新。
2026-09-10 22:37:25 +08:00

325 lines
32 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:为什么登录后还是只读?**
可能未登录成功、会话已过期(有效期 12 小时),或页面处于示例数据模式。看右上角是否显示账号名与角色。
**Q5:可以建「访客账号」吗?**
不可以。访客是未登录时的默认身份,不需要也不允许建账号;可落库的角色只有管理员和录入员。
**Q6:管理员能改用户名吗?**
管理界面里账号创建后不可改;命令行可用 `scoreboard.exe passwd -user 旧名 -new-username 新名` 修改。
---
## 成绩与积分
**Q7:为什么录入后大屏没变化?**
草稿不上屏。需要「发布」(或 `Alt+Enter`),发布后 1 秒内大屏更新。
**Q8:发布错了怎么改?**
撤销发布 → 修改 → 重新发布。撤销会作废该组积分流水,大屏回退到发布前状态,过程可在「变更历史」查看。
**Q9:为什么「发布」是灰的?**
常见原因:未登录、服务端断开、示例数据模式,或存在阻止发布的校验错误(缺少成绩、格式无法解析、手动名次项目缺名次)。
**Q10:并列名次怎么处理?**
成绩相同(或手动名次相同)自动按并列处理,显示同一名次。默认口径是「顺延」:并列第 3 各得第 3 名的分,无第 4 名,下一名第 5 名;奖牌同样并列(并列第 1 各记 1 金、无银)。具体口径由规则包配置决定。
**Q11:状态里的 DNS / DQ / DNF / 退赛有什么区别?**
都是不参与名次与积分计算的异常状态:DNS = 弃赛,DQ = 取消资格,DNF = 未完赛,退赛 = 主动退出。正常成绩选「有效」。
唯一例外:「个人+团体」小项若把平均值口径选成「全部报名人员都计入」,这些人在队内平均里会按 0 分占一个分母名额(见 Q15)。
**Q12:时间类成绩怎么写?**
按 `分:秒.毫秒` 形式输入,例如 `1:06.33`;工具栏会显示当前项目的单位。
**Q13:能批量录入吗?**
可以。支持从 Excel 复制后粘贴:两列及以上时第一列按单位名称 / 简称匹配行、最后一列作为成绩;单列时从当前行向下依次填充。也可以用 `Tab` / `Enter` 在格子间移动,`Ctrl+Enter` 存草稿。
**Q14:为什么「个人+团体」小项的个人分没进单位总分?**
这是「个人+团体」小项的默认口径,不是漏算。这类小项的一条报名会同时走两条计分通道:
- **个人通道**:按个人成绩排名、套个人积分模板给分,分只记在个人积分榜;
- **团体通道**:按团体成绩排名、套团体积分模板给分,计入单位总分。
个人通道的「计入单位总分」关掉了才不进单位总分:按规则包里的「个人+团体」模板生成的通道,个人通道默认就是不勾的(手工新建通道时默认勾选,以页面上实际的勾选状态为准)。到「基础数据 → 计分通道」选中该小项就能看到每行通道的勾选状态,关掉的行在「大项 / 小项」的通道摘要里带「不计入单位总分」徽标。
想让个人分也折算进单位总分,把个人通道那一行勾上并「保存全部」,然后对该组成绩**撤销发布 → 重新发布**——积分流水是发布时按当时的通道配置生成的,不重新发布不会变。规则包对个别小项写了例外配置时以例外为准。
**Q15:队内平均的团体成绩怎么算?平均值口径在哪改?**
团体成绩 = **该单位在本组别各条报名成绩的平均值**。系统拿这个平均值和其他单位比名次(并列按积分模板的并列口径处理,默认顺延),再套团体积分模板给分,计入单位总分。大屏与管理端只显示算出来的数值,不显示「平均」字样。
- 正常做法是给每个参赛人员各报一条(「基础数据 → 报名导入 → 个人报名」),成绩照常录到每个人那一行;团体那一行即便也报了,也不用填成绩。
- 平均值的分母有两种口径,选中该小项后在「成绩录入」页的工具栏下方用**「平均值口径」**单选切换,点选即保存(小项级设置,该小项的组别共用,不用重新点保存):
- `只算有效成绩`(默认):分母是有有效成绩的人数;
- `全部报名人员都计入`:分母是该单位在本组别的报名条数,没成绩的按 0 计入。
- 改完口径、要让已发布的成绩按新口径重算,需要对该组**撤销发布 → 重新发布**(草稿不受影响,改口径本身在点选时就已保存);发布之前可以先看右侧「实时积分预览」,它已经按新口径显示各单位的分数变化。
- 报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消资格)既不算分子也不算分母。
**Q16:某个单位一个人都没有效成绩,团体项目怎么算?**
看该小项的「平均值口径」:
- `只算有效成绩`(默认):这个单位不参与团体排名、不得分(不会按 0 分排到最后、占掉一个名次);
- `全部报名人员都计入`:按平均 0 参加排名,通常排最后;这个名次若不在团体积分模板的录取范围内,同样不得分,但会占掉一个名次、影响后面单位的录取。
**Q17:团体项目可以只给单位报名、不填队员吗?**
可以。「基础数据 → 报名导入 → 从已有名单勾选报名」分成「个人报名」「团体报名」两个页签,团体 / 对抗 / 「个人+团体」小项默认停在「团体报名」:从已配置的参赛单位里勾选参加本组别的单位(默认一个都不勾),每个勾选的单位各建一条报名,**一个队员都不勾就是纯单位报名**,队员名单之后还能再补。
- 要登记队员就点该行的「登记队员」展开勾选(可按姓名 / 工号搜索),提交时队员名单按列表顺序写入;
- 勾选已报名的单位时该行会提示「提交将清空原名单」:再次提交是用本次登记的队员覆盖原名单,一个队员都不勾就等于清空;
- 「全选」只勾启用中且还没报名的单位,已停用的单位要单独勾;
- 选中小项后页签会自动切到与该小项类型相符的一边,也可以手动切换,页面会提示「生成的报名行以当前部分为准」。
**Q18:改了「榜单口径」的折算系数,为什么单位总分没变 / 变了?**
「基础数据 → 积分模板 → **榜单口径(全局)**」里的**个人项目得分折算系数**(键名 `standings.individual_to_team_weight`,默认 1)作用在汇总环节:`单位总分 = Σ 只记单位的流水 + 系数 × Σ 记到个人的流水`。流水里存的是原始分、折算在生成榜单时做,所以点「保存榜单口径」后单位总分与单位积分明细**立刻按新系数变化,不需要重新发布**,大屏也会跟着刷新。
改完看不出变化,通常是这几种情况:
- 单位总分里本来就没有「记到个人的流水」:团体 / 对抗项目走单位通道,或者该小项的个人通道被关掉了「计入单位总分」(「个人+团体」的个人通道就是这样),这些分不受系数影响;
- 只有部分单位有个人得分,变的只是那几家;
- 系数没存上:系数必须大于 0(0 与负数服务端会直接拒绝),输入框允许 0–100、步进 0.1,保存成功会提示「榜单口径已保存」;
- 当前账号不是管理员:赛事设置接口只对管理员开放,非管理员读不到当前系数,卡片上会写明是只读。
导入规则包时,规则包里的同名配置会覆盖这里的取值。
**Q19:破纪录加分为什么点不了?**
规则包里破纪录加分默认关闭(`recordBonus.enabled = false`)时按钮不可用;若当前角色读不到规则包,页面显示「未知」,可提交,由服务端校验决定是否加分。
**Q20:人工调整为什么点不了?**
规则包里人工调整默认关闭(`manualAdjustment.enabled = false`)时不可用;以页面顶部显示的开关状态为准。
---
## 大屏
**Q21:大屏不亮 / 只有桌面怎么办?**
检查 HDMI、扩展显示模式、Console「大屏窗口」状态,点「重新排布」;服务端未就绪时最多等 20 秒才开屏;单屏窗口化时按 `F11` 切全屏。详见 [部署指南 · 故障排查](./部署指南.md#9-故障排查)。
**Q22:单屏和多屏的显示方式有什么不同?**
单屏时大屏以窗口化方式打开,按 `F11` 切全屏;多屏时除内置屏外每块屏一个 kiosk 全屏窗口,各锁一页,不响应 F11,也不接收鼠标。
**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:「在线看板」为什么显示未知?**
页面上那一块是本地占位节点:系统不按「指令送达」推断大屏是否在线,也不展示每块屏的实际上报状态,所以「在线」列恒为未知,卡片上写着「在线状态未知(占位)」;「最近下发」只是本机下发指令的时间,**不代表大屏在线**。以现场大屏的实际画面为准。
**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\` 一起拷(见 Q54)。
---
## 数据与备份
**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\`),需要另外归档。
**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` 库与赛事库各自计算。
**Q40:怎么恢复备份?**
没有一键恢复接口,需停机手工替换数据库文件:在 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:总表、全部(多 sheet)、分项成绩表、单位积分明细;另外可导出赛事项目包(zip)与规则包(YAML)。
**Q44:导出文件保存在哪?**
浏览器默认下载目录。服务端生成的临时包位于 `data\exports\`,下载完成后自动删除。
**Q45:谁能导入规则包 / 赛事项目包?**
只有管理员。两者都会整体替换数据:规则包导入后全量重算积分且不能一键撤销;赛事包覆盖同名项目前会二次确认。
**Q46:导入赛事包后为什么看不到数据?**
因为导入只把包解到数据目录,**不会自动切换当前赛事**。服务端启动时只打开一个赛事项目(启动参数 `-project` 指定的那个;没带参数时用上次切换记下的,从未切换过则是 `default`),页面上看到的是它的数据——通常是导入前那个空赛事,所以看着像「没导进去」。
处理办法:在「导出 → 赛事项目包」的**赛事项目列表**里找到刚导入的项目(导入完成的结果框里也直接给了「立即切换并重启服务端」按钮),点「切换为当前赛事」。服务端会退出并由服务管理窗口自动拉起,页面显示「正在重启服务端…」,恢复后自动刷新,数据就出来了。超过 60 秒仍未恢复时,请打开服务管理窗口确认服务端状态,待其显示「运行中」后手动刷新本页。
> 切换会让服务端重启,比赛进行中请避开操作。账号与会话不在赛事库里(见 Q42),一般不用重新登录;万一回到只读访客视图,登录一次即可,若原密码登不上就用 `scoreboard.exe passwd` 重置。导入的赛事包里如果带了自定义字体,切换过去后大屏直接可用,不用重新上传(见 Q36)。
**Q47:导入规则包后积分变了,能撤销吗?**
不能一键撤销。纠错需要重新导入旧规则包,或逐项修正后重新发布。导入前请务必先「预览差异」。
**Q48:导入时提示证件号重复怎么办?**
证件号与号码布是人员的两项唯一标识,系统不允许两个人员共用同一个证件号,用来区分重名。
- **在「运动员」里新增 / 编辑时提示重复**:说明该证件号已属于另一个人员。请先核对是不是同一个人:是,就直接用已有记录;不是,请检查证件号是否填错。已有历史数据可以没有证件号。
- **表格导入时出现重复**:分两种情况。同一份文件里同一个证件号重复出现,重复的行会报错并跳过,改好后重新上传;证件号在系统中已存在、但姓名、性别或单位不一致的,会列为「冲突」,本次不写入(报名也不会创建),需要在导入结果里勾选后逐条或多选决定「保留已有数据」还是「使用新数据」,没有做决定的人不会被写入。详细步骤见 [使用手册 · 报名导入](./使用手册.md#107-报名导入)。
**Q49:人员没有身份证,只有号码布,能报名吗?**
可以。证件号与号码布二者取其一即可作为人员唯一标识:在「运动员」里只填号码布也能保存;报名表里有姓名的行,`id_card` 与 `bib` 至少填一个就能导入;从已有名单勾选报名时,两项里有一项就能勾选。号码布会同时写入人员档案与报名记录。
**Q50:号码布重复了怎么办?**
号码布和证件号一样是人员唯一标识,系统不允许两个人员共用同一个号码布。
- **在「运动员」里新增 / 编辑时提示重复**:说明该号码布已属于另一个人员。请先核对是不是同一个人:是,就直接用已有记录;不是,请检查号码布是否填错。
- **表格导入时出现重复**:同一份文件里同一个号码布重复出现,重复的行会报错并跳过,改好后重新上传;号码布在系统中已存在、但姓名、性别或单位不一致的,会列为「冲突」,本次不写入(报名也不会创建),需要在导入结果里勾选后决定「保留已有数据」还是「使用新数据」。详细步骤见 [使用手册 · 报名导入](./使用手册.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 次,写操作每用户每分钟 30 次。稍等一分钟再试。
**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#六常见报错怎么办)。