// Package config 应用配置 package config import ( "fmt" "os" "gopkg.in/yaml.v3" ) // AppConfig 应用配置 var AppConfig = &appConfig{} type appConfig struct { Log LogConfig `yaml:"log"` Security SecurityConfig `yaml:"security"` RateLimit RateLimitConfig `yaml:"rate_limit"` Swagger SwaggerConfig `yaml:"swagger"` Database DatabaseConfig `yaml:"database"` Redis RedisConfig `yaml:"redis"` } // LogConfig 日志配置 type LogConfig struct { Level string `yaml:"level"` // 日志级别 Dir string `yaml:"dir"` // 日志目录 Console bool `yaml:"console"` // 是否输出到控制台 } // SecurityConfig 安全配置 type SecurityConfig struct { Enable bool `yaml:"enable"` // 是否启用 HeaderKey string `yaml:"header_key"` // 请求头字段名 SecretKey string `yaml:"secret_key"` // 签名密钥 } // RateLimitConfig 限流配置 type RateLimitConfig struct { Enable bool `yaml:"enable"` // 是否启用 Default RateLimitRule `yaml:"default"` // 默认规则 Rules map[string]RateLimitRule `yaml:"rules"` // 特定路径规则 } // RateLimitRule 限流规则 type RateLimitRule struct { Interval int `yaml:"interval"` // 时间间隔(秒) MaxRequests int `yaml:"max_requests"` // 最大请求次数 } // SwaggerConfig Swagger文档认证配置 type SwaggerConfig struct { User string `yaml:"user"` Password string `yaml:"password"` } // DatabaseConfig 数据库配置 type DatabaseConfig struct { Driver string `yaml:"driver"` Host string `yaml:"host"` Port int `yaml:"port"` Database string `yaml:"database"` Username string `yaml:"username"` Password string `yaml:"password"` Charset string `yaml:"charset"` MaxIdleConns int `yaml:"max_idle_conns"` MaxOpenConns int `yaml:"max_open_conns"` ConnMaxLifetime int `yaml:"conn_max_lifetime"` // 小时 LogMode bool `yaml:"log_mode"` // 是否开启SQL日志 } // RedisConfig Redis配置 type RedisConfig struct { Addr string `yaml:"addr"` Password string `yaml:"password"` DB int `yaml:"db"` } // LoadConfig 加载配置 func LoadConfig() { env := os.Getenv("GO_ENV") if env == "" { env = "dev" } configFile := fmt.Sprintf("config/config.%s.yaml", env) // 如果是测试环境,可能需要从上级目录查找,这里简单处理,如果找不到尝试从根目录找 if _, err := os.Stat(configFile); os.IsNotExist(err) { // 尝试在当前目录下找 (比如在 server 目录下运行) configFile = fmt.Sprintf("config.%s.yaml", env) if _, err := os.Stat(configFile); os.IsNotExist(err) { // 如果是单元测试,可能在 tests 目录下 configFile = fmt.Sprintf("../config/config.%s.yaml", env) } } fmt.Printf("正在加载配置文件: %s\n", configFile) data, err := os.ReadFile(configFile) if err != nil { fmt.Printf("读取配置文件失败: %v, 使用默认配置\n", err) return } err = yaml.Unmarshal(data, AppConfig) if err != nil { fmt.Printf("解析配置文件失败: %v\n", err) panic(err) } }