Initial qiwei secondary development handoff
This commit is contained in:
177
config/config_manager.go
Normal file
177
config/config_manager.go
Normal file
@@ -0,0 +1,177 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"qiweimanager/logger"
|
||||
)
|
||||
|
||||
var (
|
||||
// 全局配置管理器实例
|
||||
globalConfigManager *ConfigManager
|
||||
// 全局配置实例
|
||||
globalConfig *Config
|
||||
)
|
||||
|
||||
// ConfigManager 配置管理器,负责加载和保存配置
|
||||
type ConfigManager struct {
|
||||
configFilePath string
|
||||
logger *logger.Logger
|
||||
}
|
||||
|
||||
// NewConfigManager 创建配置管理器实例
|
||||
func NewConfigManager(appName string, logger *logger.Logger) (*ConfigManager, error) {
|
||||
// 获取可执行文件路径
|
||||
exePath, err := os.Executable()
|
||||
if err != nil {
|
||||
// 如果无法获取可执行文件路径,使用当前工作目录作为备选
|
||||
configDir, err := os.Getwd()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 创建配置目录
|
||||
appConfigDir := filepath.Join(configDir, "config")
|
||||
if err := os.MkdirAll(appConfigDir, 0755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 构建配置文件完整路径
|
||||
configFilePath := filepath.Join(appConfigDir, "config.json")
|
||||
|
||||
return &ConfigManager{
|
||||
configFilePath: configFilePath,
|
||||
logger: logger,
|
||||
},
|
||||
nil
|
||||
}
|
||||
|
||||
// 获取可执行文件所在目录
|
||||
exeDir := filepath.Dir(exePath)
|
||||
|
||||
// 创建应用程序配置目录(位于可执行文件同级的config目录)
|
||||
appConfigDir := filepath.Join(exeDir, "config")
|
||||
if err := os.MkdirAll(appConfigDir, 0755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 构建配置文件完整路径
|
||||
configFilePath := filepath.Join(appConfigDir, "config.json")
|
||||
|
||||
return &ConfigManager{
|
||||
configFilePath: configFilePath,
|
||||
logger: logger,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// LoadConfig 从文件加载配置
|
||||
func (cm *ConfigManager) LoadConfig() (*Config, error) {
|
||||
// 检查配置文件是否存在
|
||||
if _, err := os.Stat(cm.configFilePath); os.IsNotExist(err) {
|
||||
cm.logger.Info("配置文件不存在,使用默认配置: %s", cm.configFilePath)
|
||||
// 返回默认配置
|
||||
return NewDefaultConfig(), nil
|
||||
}
|
||||
|
||||
// 读取配置文件内容
|
||||
configData, err := os.ReadFile(cm.configFilePath)
|
||||
if err != nil {
|
||||
cm.logger.Error("读取配置文件失败: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 解析配置文件
|
||||
config := &Config{}
|
||||
if err := json.Unmarshal(configData, config); err != nil {
|
||||
cm.logger.Error("解析配置文件失败: %v", err)
|
||||
// 解析失败时返回默认配置
|
||||
return NewDefaultConfig(), nil
|
||||
}
|
||||
config.ApplyDefaults()
|
||||
|
||||
cm.logger.Info("配置文件加载成功: %s", cm.configFilePath)
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// SaveConfig 将配置保存到文件
|
||||
func (cm *ConfigManager) SaveConfig(config *Config) error {
|
||||
config.ApplyDefaults()
|
||||
// 更新最后修改时间
|
||||
config.LastUpdated = time.Now().Unix()
|
||||
|
||||
// 将配置转换为JSON
|
||||
configData, err := json.MarshalIndent(config, "", " ")
|
||||
if err != nil {
|
||||
cm.logger.Error("序列化配置失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// 写入配置文件
|
||||
if err := os.WriteFile(cm.configFilePath, configData, 0644); err != nil {
|
||||
cm.logger.Error("写入配置文件失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
cm.logger.Info("配置文件保存成功: %s", cm.configFilePath)
|
||||
return nil
|
||||
}
|
||||
|
||||
// InitGlobalConfig 初始化全局配置
|
||||
func InitGlobalConfig(appName string, logger *logger.Logger) error {
|
||||
var err error
|
||||
globalConfigManager, err = NewConfigManager(appName, logger)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 加载配置
|
||||
globalConfig, err = globalConfigManager.LoadConfig()
|
||||
return err
|
||||
}
|
||||
|
||||
// GetGlobalConfig 获取全局配置实例
|
||||
func GetGlobalConfig() *Config {
|
||||
return globalConfig
|
||||
}
|
||||
|
||||
// SaveGlobalConfig 保存全局配置
|
||||
func SaveGlobalConfig() error {
|
||||
if globalConfigManager != nil && globalConfig != nil {
|
||||
return globalConfigManager.SaveConfig(globalConfig)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateCallbackConfig 更新回调配置
|
||||
func UpdateCallbackConfig(callbackConfig CallbackConfig) error {
|
||||
if globalConfig != nil {
|
||||
globalConfig.CallbackConfig = callbackConfig
|
||||
return SaveGlobalConfig()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateAutoReplyConfig updates automatic customer-service settings.
|
||||
func UpdateAutoReplyConfig(autoReplyConfig AutoReplyConfig) error {
|
||||
if globalConfig != nil {
|
||||
globalConfig.AutoReplyConfig = autoReplyConfig
|
||||
globalConfig.ApplyDefaults()
|
||||
return SaveGlobalConfig()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReloadGlobalConfig reloads config.json from disk.
|
||||
func ReloadGlobalConfig() (*Config, error) {
|
||||
if globalConfigManager == nil {
|
||||
return nil, nil
|
||||
}
|
||||
cfg, err := globalConfigManager.LoadConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cfg.ApplyDefaults()
|
||||
globalConfig = cfg
|
||||
return globalConfig, nil
|
||||
}
|
||||
Reference in New Issue
Block a user