@@ -3,6 +3,8 @@ package admin
33import (
44 "fmt"
55 "log"
6+ "net/http"
7+ "regexp"
68 "strings"
79 "time"
810
@@ -15,6 +17,9 @@ import (
1517 "github.com/gin-gonic/gin"
1618)
1719
20+ // semverPattern 预编译 semver 格式校验正则
21+ var semverPattern = regexp .MustCompile (`^\d+\.\d+\.\d+$` )
22+
1823// SettingHandler 系统设置处理器
1924type SettingHandler struct {
2025 settingService * service.SettingService
@@ -93,6 +98,7 @@ func (h *SettingHandler) GetSettings(c *gin.Context) {
9398 OpsRealtimeMonitoringEnabled : settings .OpsRealtimeMonitoringEnabled ,
9499 OpsQueryModeDefault : settings .OpsQueryModeDefault ,
95100 OpsMetricsIntervalSeconds : settings .OpsMetricsIntervalSeconds ,
101+ MinClaudeCodeVersion : settings .MinClaudeCodeVersion ,
96102 })
97103}
98104
@@ -159,6 +165,8 @@ type UpdateSettingsRequest struct {
159165 OpsRealtimeMonitoringEnabled * bool `json:"ops_realtime_monitoring_enabled"`
160166 OpsQueryModeDefault * string `json:"ops_query_mode_default"`
161167 OpsMetricsIntervalSeconds * int `json:"ops_metrics_interval_seconds"`
168+
169+ MinClaudeCodeVersion string `json:"min_claude_code_version"`
162170}
163171
164172// UpdateSettings 更新系统设置
@@ -293,6 +301,14 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
293301 req .OpsMetricsIntervalSeconds = & v
294302 }
295303
304+ // 验证最低版本号格式(空字符串=禁用,或合法 semver)
305+ if req .MinClaudeCodeVersion != "" {
306+ if ! semverPattern .MatchString (req .MinClaudeCodeVersion ) {
307+ response .Error (c , http .StatusBadRequest , "min_claude_code_version must be empty or a valid semver (e.g. 2.1.63)" )
308+ return
309+ }
310+ }
311+
296312 settings := & service.SystemSettings {
297313 RegistrationEnabled : req .RegistrationEnabled ,
298314 EmailVerifyEnabled : req .EmailVerifyEnabled ,
@@ -334,6 +350,7 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
334350 FallbackModelAntigravity : req .FallbackModelAntigravity ,
335351 EnableIdentityPatch : req .EnableIdentityPatch ,
336352 IdentityPatchPrompt : req .IdentityPatchPrompt ,
353+ MinClaudeCodeVersion : req .MinClaudeCodeVersion ,
337354 OpsMonitoringEnabled : func () bool {
338355 if req .OpsMonitoringEnabled != nil {
339356 return * req .OpsMonitoringEnabled
@@ -420,6 +437,7 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
420437 OpsRealtimeMonitoringEnabled : updatedSettings .OpsRealtimeMonitoringEnabled ,
421438 OpsQueryModeDefault : updatedSettings .OpsQueryModeDefault ,
422439 OpsMetricsIntervalSeconds : updatedSettings .OpsMetricsIntervalSeconds ,
440+ MinClaudeCodeVersion : updatedSettings .MinClaudeCodeVersion ,
423441 })
424442}
425443
@@ -562,6 +580,9 @@ func diffSettings(before *service.SystemSettings, after *service.SystemSettings,
562580 if before .OpsMetricsIntervalSeconds != after .OpsMetricsIntervalSeconds {
563581 changed = append (changed , "ops_metrics_interval_seconds" )
564582 }
583+ if before .MinClaudeCodeVersion != after .MinClaudeCodeVersion {
584+ changed = append (changed , "min_claude_code_version" )
585+ }
565586 return changed
566587}
567588
0 commit comments