package service import ( "encoding/json" "errors" "fmt" "git.zkcoi.com/zkcoi/Meshray-Manager/internal/model" sqlite "git.zkcoi.com/zkcoi/Meshray-Manager/internal/store/sqlite" "go.uber.org/zap" "gorm.io/gorm" ) // SettingsService 系统设置服务 type SettingsService struct { store *sqlite.Store logger *zap.Logger } // NewSettingsService 创建系统设置服务 func NewSettingsService(store *sqlite.Store, logger *zap.Logger) *SettingsService { return &SettingsService{ store: store, logger: logger, } } // GetSettings 获取系统设置(单例) func (s *SettingsService) GetSettings() (*model.SystemSetting, error) { var setting model.SystemSetting // 尝试查找 ID=1 的记录 result := s.store.DB().First(&setting, 1) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { // 如果不存在,创建默认设置 setting = model.SystemSetting{ ID: 1, ServerIP: "", ServerPort: 51820, LogLevel: "info", LogFormat: "console", MaxBackups: 7, MaxAge: 30, Theme: "light", Language: "zh-CN", } if err := s.store.DB().Create(&setting).Error; err != nil { return nil, fmt.Errorf("创建默认设置失败:%w", err) } s.logger.Info("已创建默认系统设置") return &setting, nil } return nil, fmt.Errorf("查询设置失败:%w", result.Error) } return &setting, nil } // UpdateSettings 更新系统设置 func (s *SettingsService) UpdateSettings(updates map[string]interface{}) (*model.SystemSetting, error) { // 先获取现有设置 setting, err := s.GetSettings() if err != nil { return nil, err } // JSON 序列化 updates,确保数据有效 data, err := json.Marshal(updates) if err != nil { return nil, fmt.Errorf("序列化更新数据失败:%w", err) } // 反序列化到临时对象,过滤无效字段 var validUpdates map[string]interface{} if err := json.Unmarshal(data, &validUpdates); err != nil { return nil, fmt.Errorf("解析更新数据失败:%w", err) } // 移除敏感字段和不可变字段 delete(validUpdates, "id") delete(validUpdates, "created_at") delete(validUpdates, "updated_at") // 构建 GORM 的 Updates map updatesMap := make(map[string]interface{}) for key, value := range validUpdates { // 驼峰转蛇形转换(可选,这里直接使用前端传来的键名) updatesMap[key] = value } // 执行更新 if err := s.store.DB().Model(&setting).Updates(updatesMap).Error; err != nil { return nil, fmt.Errorf("更新设置失败:%w", err) } s.logger.Info("系统设置已更新", zap.Any("updates", updates)) // 返回最新数据 return s.GetSettings() } // ResetSettings 重置为默认设置 func (s *SettingsService) ResetSettings() (*model.SystemSetting, error) { _, err := s.GetSettings() if err != nil { return nil, err } defaultSetting := model.SystemSetting{ ID: 1, ServerIP: "", ServerPort: 51820, LogLevel: "info", LogFormat: "console", MaxBackups: 7, MaxAge: 30, Theme: "light", Language: "zh-CN", } if err := s.store.DB().Save(&defaultSetting).Error; err != nil { return nil, fmt.Errorf("重置设置失败:%w", err) } s.logger.Info("系统设置已重置为默认值") return &defaultSetting, nil }