diff --git a/internal/constant/constant.go b/internal/constant/constant.go index f7cbe57..63fedc3 100644 --- a/internal/constant/constant.go +++ b/internal/constant/constant.go @@ -48,7 +48,8 @@ const ( KeySecret = "secret" // System Settings Key 常量 - KeyInitialized = "initialized" + KeyInitialized = "initialized" + KeyLogRetention = "log_retention" // Scheduler Settings Key 常量 KeyWorkerCount = "worker_count" @@ -158,3 +159,6 @@ var DefaultSettings = map[string]map[string]string{ KeyRateInterval: "200", }, } + +// DefaultLogRetention 默认日志清理配置 +var DefaultLogRetention = `{"system_notice":{"days":30,"max_count":500},"push_log":{"days":15,"max_count":5000}}` diff --git a/internal/controllers/settings_controller.go b/internal/controllers/settings_controller.go index af70ee6..33d25ab 100644 --- a/internal/controllers/settings_controller.go +++ b/internal/controllers/settings_controller.go @@ -106,6 +106,25 @@ func (sc *SettingsController) GetSiteSettings(c *gin.Context) { } } + // 获取日志清理配置 + logRetentionJson := sc.settingsService.Get(constant.SectionSystem, constant.KeyLogRetention) + if logRetentionJson != "" { + var configs map[string]struct { + Days int `json:"days"` + MaxCount int `json:"max_count"` + } + if err := json.Unmarshal([]byte(logRetentionJson), &configs); err == nil { + if cfg, ok := configs[constant.LogCategorySystemNotice]; ok { + settings["system_notice_days"] = fmt.Sprintf("%d", cfg.Days) + settings["system_notice_max_count"] = fmt.Sprintf("%d", cfg.MaxCount) + } + if cfg, ok := configs[constant.LogCategoryPushLog]; ok { + settings["push_log_days"] = fmt.Sprintf("%d", cfg.Days) + settings["push_log_max_count"] = fmt.Sprintf("%d", cfg.MaxCount) + } + } + } + utils.Success(c, settings) } @@ -124,14 +143,18 @@ func (sc *SettingsController) GetPublicSiteSettings(c *gin.Context) { // UpdateSiteSettings 更新站点设置 func (sc *SettingsController) UpdateSiteSettings(c *gin.Context) { var req struct { - Title string `json:"title"` - Subtitle string `json:"subtitle"` - Icon string `json:"icon"` - PageSize string `json:"page_size"` - CookieDays string `json:"cookie_days"` - OpenapiEnabled bool `json:"openapi_enabled"` - OpenapiToken string `json:"openapi_token"` - OpenapiTokenExpire string `json:"openapi_token_expire"` + Title string `json:"title"` + Subtitle string `json:"subtitle"` + Icon string `json:"icon"` + PageSize string `json:"page_size"` + CookieDays string `json:"cookie_days"` + OpenapiEnabled bool `json:"openapi_enabled"` + OpenapiToken string `json:"openapi_token"` + OpenapiTokenExpire string `json:"openapi_token_expire"` + SystemNoticeDays int `json:"system_notice_days"` + SystemNoticeMaxCount int `json:"system_notice_max_count"` + PushLogDays int `json:"push_log_days"` + PushLogMaxCount int `json:"push_log_max_count"` } if err := c.ShouldBindJSON(&req); err != nil { @@ -165,6 +188,21 @@ func (sc *SettingsController) UpdateSiteSettings(c *gin.Context) { return } + // 保存日志清理配置 + logRetentionConfig := map[string]interface{}{ + constant.LogCategorySystemNotice: map[string]int{ + "days": req.SystemNoticeDays, + "max_count": req.SystemNoticeMaxCount, + }, + constant.LogCategoryPushLog: map[string]int{ + "days": req.PushLogDays, + "max_count": req.PushLogMaxCount, + }, + } + if logRetentionJson, err := json.Marshal(logRetentionConfig); err == nil { + sc.settingsService.Set(constant.SectionSystem, constant.KeyLogRetention, string(logRetentionJson)) + } + utils.SuccessMsg(c, "保存成功") } diff --git a/internal/services/settings_service.go b/internal/services/settings_service.go index 9f68bfd..8714135 100644 --- a/internal/services/settings_service.go +++ b/internal/services/settings_service.go @@ -32,6 +32,21 @@ func (s *SettingsService) InitSettings() error { } } } + + // 初始化日志清理配置 + var logRetentionCount int64 + database.DB.Model(&models.Setting{}).Where("section = ? AND `key` = ?", constant.SectionSystem, constant.KeyLogRetention).Count(&logRetentionCount) + if logRetentionCount == 0 { + if err := database.DB.Create(&models.Setting{ + ID: utils.GenerateID(), + Section: constant.SectionSystem, + Key: constant.KeyLogRetention, + Value: models.BigText(constant.DefaultLogRetention), + }).Error; err != nil { + return err + } + } + // 初始化或获取 JWT Secret 密码 var secCount int64 database.DB.Model(&models.Setting{}).Where("section = ? AND `key` = ?", constant.SectionSecurity, constant.KeySecret).Count(&secCount) diff --git a/web/src/api/index.ts b/web/src/api/index.ts index 029b038..d2f186c 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -450,6 +450,10 @@ export interface SiteSettings { openapi_enabled?: boolean openapi_token?: string openapi_token_expire?: string + system_notice_days?: string + system_notice_max_count?: string + push_log_days?: string + push_log_max_count?: string } export interface SchedulerSettings { diff --git a/web/src/views/notify/components/PushLog.vue b/web/src/views/notify/components/PushLog.vue index 4ef1add..2b5a79a 100644 --- a/web/src/views/notify/components/PushLog.vue +++ b/web/src/views/notify/components/PushLog.vue @@ -200,13 +200,13 @@ function onDialogClose(open: boolean) { @click="showDetail(log)"> #{{ getLogIndex(index) }} {{ log.title }} -