Files
QWQLwToo 079ee4eaeb
build-winui / winui (push) Has been cancelled
Add server components
2026-06-26 13:28:09 +08:00

116 lines
2.4 KiB
Go

package utils
import (
"encoding/json"
"os"
"path/filepath"
"sync"
)
// ConfigCache 配置缓存
type ConfigCache struct {
mu sync.RWMutex
toolStatus map[string]interface{}
updateInfo map[string]interface{}
mediaTypes map[string]interface{}
}
var configCache = &ConfigCache{}
// LoadConfig 加载配置文件
func LoadConfig(filename string) (map[string]interface{}, error) {
filePath := filepath.Join("public", filename)
data, err := os.ReadFile(filePath)
if err != nil {
return nil, err
}
var config map[string]interface{}
if err := json.Unmarshal(data, &config); err != nil {
return nil, err
}
return config, nil
}
// SaveConfig 保存配置文件并更新缓存
func SaveConfig(filename string, config map[string]interface{}) error {
filePath := filepath.Join("public", filename)
// 转换为 JSON
jsonData, err := json.MarshalIndent(config, "", " ")
if err != nil {
return err
}
// 保存文件
if err := os.WriteFile(filePath, jsonData, 0644); err != nil {
return err
}
// 更新缓存
configCache.mu.Lock()
defer configCache.mu.Unlock()
switch filename {
case "tool-status.json":
configCache.toolStatus = config
case "update-info.json":
configCache.updateInfo = config
case "media-types.json":
configCache.mediaTypes = config
}
return nil
}
// GetCachedConfig 获取缓存的配置
func GetCachedConfig(filename string) (map[string]interface{}, bool) {
configCache.mu.RLock()
defer configCache.mu.RUnlock()
switch filename {
case "tool-status.json":
if configCache.toolStatus != nil {
return configCache.toolStatus, true
}
case "update-info.json":
if configCache.updateInfo != nil {
return configCache.updateInfo, true
}
case "media-types.json":
if configCache.mediaTypes != nil {
return configCache.mediaTypes, true
}
}
return nil, false
}
// ReloadConfig 重新加载配置
func ReloadConfig(filename string) error {
config, err := LoadConfig(filename)
if err != nil {
return err
}
return SaveConfig(filename, config)
}
// InitConfigCache 初始化配置缓存
func InitConfigCache() error {
files := []string{"tool-status.json", "update-info.json", "media-types.json"}
for _, file := range files {
if _, err := os.Stat(filepath.Join("public", file)); err == nil {
config, err := LoadConfig(file)
if err == nil {
SaveConfig(file, config)
}
}
}
return nil
}