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

+49
View File
@@ -0,0 +1,49 @@
// Package auth 提供用户、会话与权限模型。
//
// 角色是包含关系:admin ⊇ recorder ⊇ guest;guest 是「未登录」的默认身份,
// 不落库(见 devdocs/08-安全与可靠性 第 2 节)。
package auth
import "strings"
// Role 是权限角色。
type Role string
const (
// RoleGuest 未登录访客:只读赛事数据,禁读系统配置。
RoleGuest Role = "guest"
// RoleRecorder 记录员:guest 全部 + 录入、发布、撤销、大屏控制。
RoleRecorder Role = "recorder"
// RoleAdmin 管理员:recorder 全部 + 系统配置、审计、备份。
RoleAdmin Role = "admin"
)
func roleRank(r Role) int {
switch r {
case RoleAdmin:
return 2
case RoleRecorder:
return 1
default:
return 0
}
}
// Allows 报告 r 是否覆盖 need,即 admin ⊇ recorder ⊇ guest。
func (r Role) Allows(need Role) bool {
return roleRank(r) >= roleRank(need)
}
// ParseRole 把数据库里的角色字符串收敛成已知角色;未知值按最低权限处理。
func ParseRole(s string) Role {
switch Role(strings.ToLower(strings.TrimSpace(s))) {
case RoleAdmin:
return RoleAdmin
case RoleRecorder:
return RoleRecorder
default:
return RoleGuest
}
}
func (r Role) String() string { return string(r) }