- M3 认证/权限/审计/限流 + 全部 REST 接口 - M4 管理面板(MIUIx + 成绩录入/积分榜下钻/大屏控制) - M5a 大屏页面(六页 + 明细覆盖层 + 缩放适配) - M6 WebSocket 实时同步中心 - M7 xlsx 导出 + 赛事包 zip + 备份 - 规则包 YAML 导入导出(差异预览) - 字体 vendor 子集化(4 套 x2 字重) - 集成:realtime/export/rules 接入 main+httpapi;backup 子命令 - 修复:中间件包装 ResponseWriter 丢失 Hijacker,导致 WS 握手 501
30 lines
1.8 KiB
Go
30 lines
1.8 KiB
Go
// 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: 单位不存在")
|
||
)
|