feat: 系统配置持久化到DB settings表,重启不丢

This commit is contained in:
tian 2026-07-25 13:26:33 +08:00
parent e55b1e8389
commit eb2252f055
5 changed files with 36 additions and 5 deletions

View File

@ -6,6 +6,7 @@ import (
"net/http"
"os"
"path/filepath"
"strconv"
"safesight-control/internal/api"
"safesight-control/internal/config"
@ -75,9 +76,14 @@ func main() {
log.Printf("load persisted tasks: %v", err)
}
alarmCollector := service.NewAlarmCollector(store.DB(), agentClient, regSvc)
if cfg.AlarmRetentionDays > 0 {
alarmCollector.SetRetention(cfg.AlarmRetentionDays)
// Load retention from DB (UI-persisted), fallback to config file
retention := cfg.AlarmRetentionDays
if persisted, err := storage.LoadSetting(store.DB(), "alarm_retention_days"); err == nil && persisted != "" {
if v, err := strconv.Atoi(persisted); err == nil && v >= 0 {
retention = v
}
}
alarmCollector.SetRetention(retention)
alarmCollector.Start()
tplSvc := service.NewTemplateService(cfg)
h := api.NewHandler(discoSvc, regSvc, agentClient, taskSvc, tplSvc)

View File

@ -480,6 +480,10 @@ CREATE TABLE IF NOT EXISTS config_versions (
config_id TEXT NOT NULL DEFAULT '',
config_json TEXT NOT NULL,
created_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL DEFAULT ''
)
`)
return err

View File

@ -0,0 +1,15 @@
package storage
import "database/sql"
func LoadSetting(db *sql.DB, key string) (string, error) {
if db == nil {
return "", nil
}
var value string
err := db.QueryRow("SELECT value FROM settings WHERE key = ?", key).Scan(&value)
if err == sql.ErrNoRows {
return "", nil
}
return value, err
}

View File

@ -4281,12 +4281,18 @@ func (u *UI) actionSystemConfig(w http.ResponseWriter, r *http.Request) {
if days, err := strconv.Atoi(strings.TrimSpace(r.FormValue("alarm_retention_days"))); err == nil && days >= 0 {
if u.alarmCollector != nil {
u.alarmCollector.SetRetention(days)
// Trigger immediate cleanup with new retention
go u.alarmCollector.RunCleanup()
}
msg := "告警保留已设为 " + strconv.Itoa(days) + " 天,立即生效"
// Persist to DB so it survives restart
if strings.TrimSpace(u.dbPath) != "" {
if store, err := storage.OpenSQLite(u.dbPath); err == nil {
store.DB().Exec("INSERT OR REPLACE INTO settings(key,value) VALUES('alarm_retention_days',?)", strconv.Itoa(days))
store.Close()
}
}
msg := "告警保留已设为 " + strconv.Itoa(days) + " 天,已持久化"
if days == 0 {
msg = "告警将永久保留,立即生效"
msg = "告警将永久保留,已持久化"
}
u.renderSystemPage(w, r, http.StatusOK, msg, "")
return

Binary file not shown.