feat: 补齐第一批已知缺口(关闭握手 / 定时备份 / Origin 白名单 / DTO 收敛)
- httpapi:新增 POST /api/shutdown(admin 会话或 X-Shutdown-Token 常量时间比对) 与 GET /api/rules/switches(recorder 可读,只回布尔开关);settings/standings 的 重复 DTO 收敛到 internal/dto;standings.showIndividualMedals 贯通到设置读写与前端 - export:抽出 export.Service,新增自动备份定时任务(backup.intervalMinutes/keep), 自动、手动、发布前三类备份共用同一把互斥锁与滚动清理 - realtime:/ws 去掉 InsecureSkipVerify,改用 OriginPatterns(同源与无 Origin 放行, 跨站需命中 server.allowedOrigins) - console:停止服务改走 POST /api/shutdown 优雅关闭(5 秒宽限后回退强杀), 服务管理器新增「已连接的大屏实例」卡片 - deploy:build.bat 改用 for /f 读内部署名——set /p 在 chcp 65001 下返回空, 导致最近这次构建的 exe 里根本没注入署名 - docs:备份策略、关闭超时、Origin 配置的说明与实现对齐
This commit is contained in:
1 parent
4d56c73ae6
commit
2c9ff65fc4
42 files changed
+1271
-275
No files matched your search
@@ -43,6 +43,18 @@ type EventSettingsStandings struct {
|
||||
IndividualToTeamWeight float64 `json:"individualToTeamWeight"`
|
||||
RankingMode string `json:"rankingMode"`
|
||||
ShowIndividualBoard bool `json:"showIndividualBoard"`
|
||||
ShowIndividualMedals bool `json:"showIndividualMedals"`
|
||||
}
|
||||
|
||||
// RuleSwitches 是 GET /api/rules/switches 的线上结构:只暴露规则包里的布尔开关,
|
||||
// 不包含任何规则内容、模板明细或文件路径,供录入员判断相关功能是否启用。
|
||||
type RuleSwitches struct {
|
||||
RecordBonusEnabled bool `json:"recordBonusEnabled"`
|
||||
AdjustmentsEnabled bool `json:"adjustmentsEnabled"`
|
||||
AdjustmentReasonRequired bool `json:"adjustmentReasonRequired"`
|
||||
MedalCountsTeamEvents bool `json:"medalCountsTeamEvents"`
|
||||
ShowIndividualBoard bool `json:"showIndividualBoard"`
|
||||
ShowIndividualMedals bool `json:"showIndividualMedals"`
|
||||
}
|
||||
|
||||
// ParseEventSettings 把 settings 表的点号键聚合成嵌套对象。
|
||||
@@ -74,8 +86,10 @@ func ParseEventSettings(values map[string]string) EventSettings {
|
||||
|
||||
out.Standings.IndividualToTeamWeight = atofDefault(values["standings.individual_to_team_weight"], 1)
|
||||
out.Standings.RankingMode = orDefault(values["standings.mode"], "points")
|
||||
// showIndividualBoard 是历史别名:未单独配置时沿用旧的 show_individual_medals 取值。
|
||||
out.Standings.ShowIndividualBoard = boolDefault(
|
||||
firstNonEmpty(values["standings.show_individual_board"], values["standings.show_individual_medals"]), true)
|
||||
out.Standings.ShowIndividualMedals = boolDefault(values["standings.show_individual_medals"], true)
|
||||
|
||||
out.RequireApproval = boolDefault(values["results.review_required"], false)
|
||||
return out
|
||||
|
||||
Reference in new issue
Block a user