proxy-go/internal/initapp/config_migration_20250322.go
wood chen cc45cac622 feat(config): 更新配置管理和扩展名规则处理
- 在配置中添加新的扩展名规则支持,允许用户定义文件扩展名与目标URL的映射
- 优化配置加载逻辑,确保路径配置的扩展名规则在初始化时得到处理
- 更新前端配置页面,支持添加、编辑和删除扩展名规则
- 增强错误处理和用户提示,确保用户体验流畅
2025-03-22 18:17:30 +08:00

138 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package initapp
import (
"encoding/json"
"log"
"os"
)
// 旧配置结构
type OldPathConfig struct {
DefaultTarget string `json:"DefaultTarget"`
ExtensionMap interface{} `json:"ExtensionMap"`
SizeThreshold int64 `json:"SizeThreshold,omitempty"`
MaxSize int64 `json:"MaxSize,omitempty"`
Path string `json:"Path,omitempty"`
}
// 新配置结构
type NewPathConfig struct {
DefaultTarget string `json:"DefaultTarget"`
ExtensionMap []ExtRuleConfig `json:"ExtensionMap"`
}
type ExtRuleConfig struct {
Extensions string `json:"Extensions"`
Target string `json:"Target"`
SizeThreshold int64 `json:"SizeThreshold"`
MaxSize int64 `json:"MaxSize"`
}
type CompressionConfig struct {
Gzip CompressorConfig `json:"Gzip"`
Brotli CompressorConfig `json:"Brotli"`
}
type CompressorConfig struct {
Enabled bool `json:"Enabled"`
Level int `json:"Level"`
}
type Config struct {
MAP map[string]interface{} `json:"MAP"`
Compression CompressionConfig `json:"Compression"`
}
// MigrateConfig 检查并迁移配置文件,确保使用新格式
func MigrateConfig(configPath string) error {
// 读取配置文件
data, err := os.ReadFile(configPath)
if err != nil {
return err
}
// 解析为通用配置结构
var config Config
if err := json.Unmarshal(data, &config); err != nil {
return err
}
configChanged := false
// 遍历所有路径配置
for path, rawPathConfig := range config.MAP {
// 将接口转换为JSON
rawData, err := json.Marshal(rawPathConfig)
if err != nil {
log.Printf("[Init] 无法序列化路径 %s 的配置: %v", path, err)
continue
}
// 尝试解析为旧格式
var oldPathConfig OldPathConfig
if err := json.Unmarshal(rawData, &oldPathConfig); err != nil {
log.Printf("[Init] 无法解析路径 %s 的配置: %v", path, err)
continue
}
// 创建新格式配置
newPathConfig := NewPathConfig{
DefaultTarget: oldPathConfig.DefaultTarget,
ExtensionMap: []ExtRuleConfig{},
}
// 检查ExtensionMap类型
if oldPathConfig.ExtensionMap != nil {
// 尝试将ExtensionMap解析为旧格式的map
oldFormatMap := make(map[string]string)
if rawExtMap, err := json.Marshal(oldPathConfig.ExtensionMap); err == nil {
if json.Unmarshal(rawExtMap, &oldFormatMap) == nil && len(oldFormatMap) > 0 {
// 是旧格式的map转换为数组
for exts, target := range oldFormatMap {
rule := ExtRuleConfig{
Extensions: exts,
Target: target,
SizeThreshold: oldPathConfig.SizeThreshold,
MaxSize: oldPathConfig.MaxSize,
}
newPathConfig.ExtensionMap = append(newPathConfig.ExtensionMap, rule)
}
configChanged = true
log.Printf("[Init] 路径 %s 的配置已从旧版格式迁移到新版格式", path)
}
}
// 尝试将ExtensionMap解析为新格式的数组
if len(newPathConfig.ExtensionMap) == 0 {
var newFormatArray []ExtRuleConfig
if rawExtMap, err := json.Marshal(oldPathConfig.ExtensionMap); err == nil {
if json.Unmarshal(rawExtMap, &newFormatArray) == nil {
newPathConfig.ExtensionMap = newFormatArray
}
}
}
}
// 更新配置
config.MAP[path] = newPathConfig
}
// 如果有配置变更,保存回文件
newData, err := json.MarshalIndent(config, "", " ")
if err != nil {
return err
}
if err := os.WriteFile(configPath, newData, 0644); err != nil {
return err
}
if configChanged {
log.Printf("[Init] 配置文件已成功迁移到新格式并保存: %s", configPath)
} else {
log.Printf("[Init] 配置文件格式已规范化: %s", configPath)
}
return nil
}