package utils import ( "encoding/json" "fmt" "os" "path/filepath" "sync" "time" ) type ConfigVersion struct { Version int `json:"version"` UpdatedAt time.Time `json:"updated_at"` UpdatedBy string `json:"updated_by"` Comment string `json:"comment"` } type ConfigWithVersion struct { Config *Config `json:"config"` Version ConfigVersion `json:"version"` } var ( configMutex sync.RWMutex configFile = "config/config.json" // JSON格式更适合动态更新 ) // SaveConfig 保存配置到文件 func SaveConfig(config *Config, updatedBy, comment string) error { configMutex.Lock() defer configMutex.Unlock() // 读取当前版本 currentVersion := 0 if existing, err := LoadPersistedConfig(); err == nil { currentVersion = existing.Version.Version } // 创建新的配置版本 configWithVersion := ConfigWithVersion{ Config: config, Version: ConfigVersion{ Version: currentVersion + 1, UpdatedAt: time.Now(), UpdatedBy: updatedBy, Comment: comment, }, } // 确保配置目录存在 configDir := filepath.Dir(configFile) if err := os.MkdirAll(configDir, 0755); err != nil { return err } // 备份旧配置 if err := backupConfig(); err != nil { return err } // 将配置转换为JSON data, err := json.MarshalIndent(configWithVersion, "", " ") if err != nil { return err } // 写入文件 return os.WriteFile(configFile, data, 0644) } // LoadPersistedConfig 加载持久化的配置 func LoadPersistedConfig() (*ConfigWithVersion, error) { configMutex.RLock() defer configMutex.RUnlock() // 检查配置文件是否存在 if _, err := os.Stat(configFile); os.IsNotExist(err) { // 如果不存在,创建默认配置 config, err := LoadConfig() if err != nil { return nil, err } return &ConfigWithVersion{ Config: config, Version: ConfigVersion{ Version: 1, UpdatedAt: time.Now(), UpdatedBy: "system", Comment: "初始配置", }, }, nil } // 读取配置文件 data, err := os.ReadFile(configFile) if err != nil { return nil, err } // 解析JSON配置 var configWithVersion ConfigWithVersion if err := json.Unmarshal(data, &configWithVersion); err != nil { return nil, err } return &configWithVersion, nil } // MergeConfig 合并配置(环境变量优先) func MergeConfig(persisted, env *Config) *Config { if env.Server.Port != "" { persisted.Server.Port = env.Server.Port } if env.Server.Mode != "" { persisted.Server.Mode = env.Server.Mode } // ... 其他配置项的合并 ... return persisted } // backupConfig 备份配置文件 func backupConfig() error { if _, err := os.Stat(configFile); os.IsNotExist(err) { return nil } // 确保备份目录存在 backupDir := "config/backups" if err := os.MkdirAll(backupDir, 0755); err != nil { return err } // 读取当前配置 data, err := os.ReadFile(configFile) if err != nil { return err } // 创建备份文件名 backupFile := filepath.Join(backupDir, fmt.Sprintf("config_%s.json", time.Now().Format("20060102150405"))) // 写入备份文件 return os.WriteFile(backupFile, data, 0644) }