feat: M3-M7 全模块落地 + 集成接线

- M3 认证/权限/审计/限流 + 全部 REST 接口
- M4 管理面板(MIUIx + 成绩录入/积分榜下钻/大屏控制)
- M5a 大屏页面(六页 + 明细覆盖层 + 缩放适配)
- M6 WebSocket 实时同步中心
- M7 xlsx 导出 + 赛事包 zip + 备份
- 规则包 YAML 导入导出(差异预览)
- 字体 vendor 子集化(4 套 x2 字重)
- 集成:realtime/export/rules 接入 main+httpapi;backup 子命令
- 修复:中间件包装 ResponseWriter 丢失 Hijacker,导致 WS 握手 501
This commit is contained in:
AskaEth committed 2026-09-09 19:02:24 +08:00
1 parent d0e3b93e76
commit bc8b1ee6c0
145 files changed
+25159 -321

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
// Package export 负责成绩导出(xlsx)、赛事项目包(zip)与数据库备份。
//
// 本包只做三件事:把数据整理成可直接打印的表格、把整场赛事打包/解包、把库
// 备份成一致性快照。所有业务数值(积分、名次、奖牌)都来自调用方传入的
// domain 结构体或赛事库本身,这里不重新实现任何计分规则——规则只有一份,
// 在 internal/domain。
//
// 依赖方向:export → domain(只读类型)与 database/sql;domain 不认识 export。
package export
import "errors"
// 导出的哨兵错误,调用方据此把失败原因映射成 HTTP 状态码或界面提示。
var (
// ErrNoDatabase 表示调用方传入了空的数据库连接。
ErrNoDatabase = errors.New("export: 数据库连接为空")
// ErrInvalidPackage 表示赛事项目包结构非法(缺 meta.yaml、路径穿越、校验信息缺失等)。
ErrInvalidPackage = errors.New("export: 赛事项目包非法")
// ErrUnsupportedVersion 表示包内 meta.yaml 的格式版本高于当前程序能读的版本。
ErrUnsupportedVersion = errors.New("export: 赛事项目包格式版本不受支持")
// ErrChecksumMismatch 表示包内文件与 meta.yaml 记录的校验和不一致。
ErrChecksumMismatch = errors.New("export: 赛事项目包校验和不匹配")
// ErrProjectExists 表示目标目录已有同名赛事项目,且调用方未选择覆盖。
ErrProjectExists = errors.New("export: 目标赛事项目已存在")
// ErrUnsafeName 表示赛事项目名含有路径分隔符、保留名等不安全的字符。
ErrUnsafeName = errors.New("export: 赛事项目名非法")
// ErrTeamNotFound 表示导出单位积分明细时找不到该单位。
ErrTeamNotFound = errors.New("export: 单位不存在")
)