AskaEth
1b8a37ff8c
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/ 五份(使用手册 / 报名名单导入规范 / 升级说明 / 部署指南 / 上线检查清单)同步。
2026-09-14 01:10:16 +08:00
..
2026-09-11 23:46:59 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 23:46:59 +08:00
2026-09-10 22:37:25 +08:00
2026-09-11 19:26:36 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 21:47:07 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 17:14:02 +08:00
2026-09-11 23:46:59 +08:00
2026-09-13 15:20:18 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 21:47:07 +08:00
2026-09-14 01:10:16 +08:00
2026-09-14 01:10:16 +08:00
2026-09-14 01:10:16 +08:00
2026-09-11 04:05:02 +08:00
2026-09-11 23:46:59 +08:00
2026-09-10 22:37:25 +08:00
2026-09-10 22:37:25 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 15:35:42 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 17:14:02 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-14 01:10:16 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 15:35:42 +08:00
2026-09-10 17:45:11 +08:00
2026-09-10 17:45:11 +08:00
2026-09-11 01:59:58 +08:00
2026-09-14 01:10:16 +08:00
2026-09-14 01:10:16 +08:00
2026-09-11 15:35:42 +08:00
2026-09-10 17:45:11 +08:00
2026-09-11 15:35:42 +08:00
2026-09-12 01:27:09 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 01:59:58 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-09 22:16:58 +08:00
2026-09-09 22:16:58 +08:00
2026-09-10 12:02:00 +08:00
2026-09-11 15:35:42 +08:00
2026-09-13 15:20:18 +08:00
2026-09-12 01:27:09 +08:00
2026-09-11 04:05:02 +08:00
2026-09-11 04:05:02 +08:00
2026-09-11 04:05:02 +08:00
2026-09-11 23:46:59 +08:00
2026-09-14 01:10:16 +08:00
2026-09-12 18:30:46 +08:00
2026-09-12 18:30:46 +08:00
2026-09-12 18:30:46 +08:00
2026-09-11 15:35:42 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 04:05:02 +08:00
2026-09-12 01:27:09 +08:00
2026-09-11 19:26:36 +08:00
2026-09-13 15:20:18 +08:00
2026-09-10 09:47:06 +08:00
2026-09-10 09:47:06 +08:00
2026-09-10 09:47:06 +08:00
2026-09-11 15:35:42 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 19:26:36 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 19:26:36 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 21:47:07 +08:00
2026-09-12 01:27:09 +08:00
2026-09-12 01:27:09 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-14 01:10:16 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-13 15:20:18 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 23:46:59 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 23:46:59 +08:00
2026-09-12 01:27:09 +08:00
2026-09-09 22:16:58 +08:00
2026-09-13 15:20:18 +08:00
2026-09-13 15:20:18 +08:00
2026-09-11 23:46:59 +08:00
2026-09-13 15:20:18 +08:00
2026-09-14 01:10:16 +08:00
2026-09-11 23:46:59 +08:00
2026-09-11 17:14:02 +08:00
2026-09-11 17:14:02 +08:00
2026-09-13 15:20:18 +08:00
2026-09-13 15:20:18 +08:00
2026-09-10 23:48:28 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 21:47:07 +08:00
2026-09-11 21:47:07 +08:00
2026-09-12 01:27:09 +08:00
2026-09-09 22:16:58 +08:00