package conf import ( "ego/internal/cache" "ego/internal/conf/locales" "ego/internal/util" "ego/pkg/logger" "fmt" "os" "github.com/joho/godotenv" "go.uber.org/zap" ) // Init 初始化所有配置 func Init() error { // 1. 加载环境变量 if err := loadEnvironmentVariables(); err != nil { // 这里不能使用logger,因为还没初始化 return fmt.Errorf("环境变量加载失败: %w", err) } // 2. 初始化日志系统(在验证环境变量之前,因为后续步骤需要使用logger) if err := logger.BuildLogger(); err != nil { // 这里不能使用logger,因为初始化失败了 return fmt.Errorf("日志系统初始化失败: %w", err) } // 3. 验证必要环境变量 if err := validateRequiredEnvVars(); err != nil { logger.Error(nil, "环境变量验证失败", zap.Error(err)) return fmt.Errorf("环境变量验证失败: %w", err) } // 4. 加载翻译文件 if err := locales.LoadLocales(); err != nil { logger.Error(nil, "翻译文件加载失败", zap.Error(err)) return fmt.Errorf("翻译文件加载失败: %w", err) } // 5. 连接数据库 mysqlDSN := os.Getenv("MYSQL_DSN") if err := Database(mysqlDSN); err != nil { logger.Error(nil, "数据库初始化失败", zap.Error(err)) return fmt.Errorf("数据库初始化失败: %w", err) } // 6. 连接 Redis if err := cache.Redis(); err != nil { logger.Error(nil, "Redis初始化失败", zap.Error(err)) return fmt.Errorf("Redis初始化失败: %w", err) } // 7. 输出JWT密钥状态日志(在logger初始化完成后) util.LogJwtKeyStatus() logger.Info(nil, "所有配置初始化完成") return nil } // Close 关闭所有资源 func Close() { logger.Info(nil, "开始关闭应用程序资源...") // 关闭数据库 if err := closeDatabase(); err != nil { logger.Error(nil, "数据库关闭失败", zap.Error(err)) } else { logger.Info(nil, "数据库已关闭") } // 关闭 Redis if err := cache.Close(); err != nil { logger.Error(nil, "Redis关闭失败", zap.Error(err)) } else { logger.Info(nil, "Redis已关闭") } logger.Info(nil, "应用程序资源关闭完成") } // loadEnvironmentVariables 加载环境变量并处理错误 func loadEnvironmentVariables() error { // 尝试加载.env文件,如果文件不存在也不报错 if err := godotenv.Load(); err != nil { // 只有在文件存在但读取失败时才报错 if !os.IsNotExist(err) { return fmt.Errorf("加载 .env 文件失败: %w", err) } // .env文件不存在,使用系统环境变量 logger.Info(nil, ".env 文件不存在,使用系统环境变量") } else { logger.Info(nil, "成功加载 .env 文件") } return nil } // validateRequiredEnvVars 验证必要的环境变量 func validateRequiredEnvVars() error { requiredVars := map[string]string{ "MYSQL_DSN": "数据库连接字符串", } var missingVars []string for envVar, description := range requiredVars { if os.Getenv(envVar) == "" { missingVars = append(missingVars, fmt.Sprintf("%s (%s)", envVar, description)) } } if len(missingVars) > 0 { return fmt.Errorf("缺少必要环境变量: %v", missingVars) } return nil }