diff --git a/internal/service/alarm_collector.go b/internal/service/alarm_collector.go index 593c51c..69a2b06 100644 --- a/internal/service/alarm_collector.go +++ b/internal/service/alarm_collector.go @@ -56,6 +56,13 @@ func (c *AlarmCollector) SetRetention(days int) { c.retentionDays = days } +func (c *AlarmCollector) GetRetention() int { + if c == nil { + return 30 + } + return c.retentionDays +} + func (c *AlarmCollector) cleanupLoop() { c.cleanupOldAlarms() ticker := time.NewTicker(24 * time.Hour) diff --git a/internal/web/ui.go b/internal/web/ui.go index 6daab68..c380ae1 100644 --- a/internal/web/ui.go +++ b/internal/web/ui.go @@ -111,6 +111,8 @@ type PageData struct { UnacknowledgedAlarmCount int DetectionChannelCount int StaleCount int + SystemAlarmRetention int + SystemConcurrency int AlarmFilterDevices []string AlarmFilterRuleTypes []string SelectedAlarmDevice string @@ -793,6 +795,7 @@ func (u *UI) Routes() (chi.Router, error) { r.Get("/assets/overlays/{name}/export", u.pageAssetOverlayExport) r.Get("/audit", u.pageAudit) r.Get("/system", u.pageSystem) + r.Post("/system/config", u.actionSystemConfig) r.Get("/system/db-backup", u.pageSystemDBBackup) r.Get("/resources", u.pageResources) r.Post("/system/db-restore", u.actionSystemDBRestore) @@ -4258,13 +4261,36 @@ func (u *UI) pageSystemDBBackup(w http.ResponseWriter, r *http.Request) { func (u *UI) renderSystemPage(w http.ResponseWriter, r *http.Request, status int, message string, errText string) { w.WriteHeader(status) - u.render(w, r, "system", PageData{ - Title: "系统状态", - Devices: u.registry.GetDevices(), - DBPath: u.dbPath, - Message: message, - Error: errText, - }) + data := PageData{ + Title: "系统状态", + Devices: u.registry.GetDevices(), + DBPath: u.dbPath, + Message: message, + Error: errText, + SystemAlarmRetention: 30, + SystemConcurrency: 5, + } + if u.alarmCollector != nil { + data.SystemAlarmRetention = u.alarmCollector.GetRetention() + } + u.render(w, r, "system", data) +} + +func (u *UI) actionSystemConfig(w http.ResponseWriter, r *http.Request) { + _ = r.ParseForm() + if days, err := strconv.Atoi(strings.TrimSpace(r.FormValue("alarm_retention_days"))); err == nil && days >= 0 { + if u.alarmCollector != nil { + u.alarmCollector.SetRetention(days) + } + msg := "告警保留已设为 " + strconv.Itoa(days) + " 天" + if days == 0 { + msg = "告警将永久保留" + } + msg += "(运行时生效,重启后需在配置文件 safesightd.json 中修改 alarm_retention_days 持久化)" + u.renderSystemPage(w, r, http.StatusOK, msg, "") + return + } + u.renderSystemPage(w, r, http.StatusBadRequest, "", "请输入有效的保留天数") } func (u *UI) actionSystemDBRestore(w http.ResponseWriter, r *http.Request) { diff --git a/internal/web/ui/templates/system.html b/internal/web/ui/templates/system.html index 8e55d4e..8dda8e2 100644 --- a/internal/web/ui/templates/system.html +++ b/internal/web/ui/templates/system.html @@ -36,6 +36,20 @@ +
+
+

{{icon "system"}}系统配置

+
+
+ +
+
+ +
+
+
+
+