feat(import): 报名模板按「小项 × 组别」分工作表;号码布判重改认证件号;备份改原子落盘

三件事合成一次提交(其中两件都落在 handlers_config.go,无法按文件拆开):

一、分工作表报名模板(新增能力)
- 新增 GET /api/entries/template.xlsx:按当前赛事的「小项 × 组别」生成模板,
  一个小项组别一张工作表,工作表名 = <小项>@<组别>(31 字符上限、重名自动去重)。
- 导入解析器认工作表名还原小项 + 组别;若与表内列冲突则报错,不静默取其一。
- 小项名与组别名禁用 @,基础数据界面 / 规则包导入 / 服务端校验三处一并拦截。
- 单表 CSV/XLSX 导入路径不回归。

二、号码布判重(修误判)
- 旧逻辑依赖证件号本身,而证件号是可选字段 → 同一个人报多个项目会被整块拦下。
- 改为:号码布相同且证件号相同 → 判定为同一人报多项,放行;
  号码布相同且证件号都能填且不同 → 仍报错(真抢号);一方证件号为空 → 放行并给提示。
- 团体行的号码布一并纳入查重。

三、自动备份的关停与落盘(修数据安全隐患)
- export.Service 增加 Wait():StartAuto 的协程进 WaitGroup,关停时 join(10 秒上限,
  超时只记 WARN 不拖死关闭),不再在备份写到一半时退出。
- vacuumInto 改为先写 <最终名>.tmp-<随机> 再 rename,失败则删临时文件;
  Backup / SafetySnapshot / ExportProjectZip 三个调用方一并受益。
- 新增 isFinalBackupName,ListBackups / safetyCopies / KindOfBackupName 统一过滤中间文件,
  避免半截 .db 被列进备份列表、进而被「一键恢复」选中。

文档:docs/ 五份(使用手册 / 报名名单导入规范 / 升级说明 / 部署指南 / 上线检查清单)同步。
This commit is contained in:
AskaEth committed 2026-09-14 01:10:16 +08:00
1 parent b74768b7d5
commit 1b8a37ff8c
32 files changed
+3302 -233

No files matched your search

+4 -3
View File
@@ -18,15 +18,16 @@
- [ ] Windows 10/11 x64,接市电(建议接 UPS)
- [ ] 端口 **19540** 未被占用:`netstat -ano | findstr 19540`
- [ ] **防火墙已放行入站 19540**(局域网设备才能连上)—— **自检口径:用另一台设备(平板 / 手机)浏览器打开 `http://<主机IP>:19540/display` 能出画面,就算放行过了**;打不开时先确认装的时候选的是哪一项:
- 装的时候选了**「为所有用户安装」**:安装程序提权时**已经自动放行**(防火墙里能看到规则 `Scoreboard Console (TCP 19540)`),不用再手工加;
- 装的时候选了**「仅为我安装」**:不申请提权、装不了规则,在**管理员** cmd 里手工放行一次
- 装的时候选了**「为所有用户安装」**:那一档提权时装好规则,**已经自动放行**(防火墙里能看到规则 `Scoreboard Console (TCP 19540)`),不用再手工加;
- 装的时候选了**「仅为我安装」**(含**受限账户**的机器 —— 新版安装器会自动降到这一档):**不加规则**,在**管理员** cmd 里手工放行一次
`netsh advfirewall firewall add rule name="Scoreboard 19540" dir=in action=allow protocol=TCP localport=19540`
(也可以改用「为所有用户安装」重跑一次安装程序,让它自动放行)
—— 临时「关闭防火墙」只用于**验证**是不是它挡的,验证完要恢复;正式开赛前一定放行,不要一直关着防火墙。改过端口就把 `19540` 换成实际端口,安装程序只会自动放行默认端口 `19540`,改过端口的一律手工放行
- [ ] 数据/配置目录可写:默认 `%LOCALAPPDATA%\ScoreboardConsole\`(数据在 `data\`,配置与规则是 `console\config.json`、`config.yaml`、`rules\`;都在安装目录之外,升级/卸载都不会删),需要放行杀毒/防火墙
- [ ] 大屏通过 HDMI 接在**同一台机器**上(系统显示模式设为「扩展」)
- [ ] 显示器数量确认:只接一块屏时大屏只能窗口化(按 F11 可切全屏);要每屏一个 kiosk 全屏窗口就得接第二块屏(见部署指南 7.3、7.5)
- [ ] **安装目录不要选 `C:\Program Files`**(那里普通用户没写权限,日志会写不进去);装到 D 盘等普通目录即可,向导里可以改路径
- [ ] **安装位置与装法符合预期**:向导里**默认是「为所有用户安装」**(装到 `C:\Program Files\Scoreboard_Console`,并自动放行防火墙);只给当前账户用、或这台机器装不了 Program Files 时选**「仅为我安装」**(装到用户目录、防火墙要手工放行)。装完**右键桌面「赛事积分榜」快捷方式 →「属性」→ 看「目标」**核对实际装到哪个目录。⚠️ Console 自己的 `console.log` 写在**安装目录**的 `logs\` 下 —— 如果装完「运行日志」面板一直空着 / 安装目录里没有 `logs\console.log`,多半是那个目录当前账户写不进去,**改装到 `D:\Scoreboard` 这类普通目录**(向导里可以改;手工改过路径后切换装法也不会被冲掉)重装一次
- [ ] **升级(覆盖安装)前确认旧版本程序已关闭**:新版安装程序**会自动关掉**在跑的旧版本(含它拉起的 `scoreboard.exe` 服务端进程),但动手前自己在托盘 / 任务管理器确认一遍更稳(有正在录入的现场就别在赛中升级);装完启动,确认打开的还是原来那个数据目录(「运行日志」里的 `数据目录:`)
## 3. 首次启动