feat: 系统配置持久化到DB settings表,重启不丢
This commit is contained in:
parent
e55b1e8389
commit
eb2252f055
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
15
internal/storage/settings.go
Normal file
15
internal/storage/settings.go
Normal 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
|
||||
}
|
||||
@ -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.
Loading…
Reference in New Issue
Block a user