package config import ( "crypto/md5" "encoding/hex" "fmt" "github.com/spf13/viper" ) type AppConfig struct { AppEnv string AppPort string RedisAddr string MySQLDSN string PostgresDSN string MongoDSN string MinIoEndpoint string MinioAccessKey string MinioSecretKey string MinioBucketName string } type FwhApiConfig struct { FwhEnergy string FwhOss string FwhUser string FwhPassword string } type FwhMqttConfig struct { FwhMqttBroker string FwhMqttCaUrl string FwhMqttCertUrl string FwhMqttKeyUrl string } type Config struct { App AppConfig FwhApi FwhApiConfig FwhMqtt FwhMqttConfig } // 需先执行LoadConfig后才能读取ENV // var APP_ENV string = "dev" // var FWH_ENERGY string = "energy.franklinwh.com" // var FWH_OSS string = "oss.franklinwh.com" // var FWH_USER string = "" // var FWH_PASSWORD string = "" // MD5 - PASSWORD // LoadConfig 读取配置文件和环境变量 func LoadConfig() (*Config, error) { v := viper.New() // 默认值(避免缺省时崩溃) // APP v.SetDefault("APP_ENV", "dev") v.SetDefault("APP_PORT", "8080") v.SetDefault("REDIS_ADDR", "localhost:6379") v.SetDefault("MYSQL_DSN", "") v.SetDefault("POSTGRES_DSN", "host=localhost user=fwh_toolbox password=fwh_toolbox dbname=fwh_toolbox_db port=5432 sslmode=disable") v.SetDefault("MONGO_DSN", "mongodb://localhost:27017/FwhToolboxDbDev") v.SetDefault("MINIO_ENDPOINT", "localhost:9198") v.SetDefault("MINIO_ACCESS_KEY", "fwh-toolbox") v.SetDefault("MINIO_SECRET_KEY", "fwh-toolbox") v.SetDefault("MINIO_BUCKET_NAME", "fwh-toolbox") // FWH API v.SetDefault("FWH_ENERGY", "energy.fwh-toolbox.top") v.SetDefault("FWH_OSS", "energy-oss.fwh-toolbox.top") // FWH MQTT // 多文件路径支持 paths := []string{"./.env", "./config.env"} var readErr error for _, path := range paths { v.SetConfigFile(path) if err := v.ReadInConfig(); err == nil { fmt.Printf("✅ Using config file: %s\n", path) readErr = nil break } else { readErr = err } } // 环境变量覆盖文件配置 v.AutomaticEnv() // 如果两个文件都没读到,也没关系,直接用默认值 if readErr != nil { fmt.Println("⚠️ No config file found, using default values & environment variables") } // APP_ENV = v.GetString("APP_ENV") // FWH_ENERGY = v.GetString("FWH_ENERGY") // FWH_OSS = v.GetString("FWH_OSS") // FWH_USER = v.GetString("FWH_USER") // FWH_PASSWORD = v.GetString("FWH_PASSWORD") h := md5.New() h.Write([]byte(v.GetString("FWH_PASSWORD"))) fwhApiPassword := hex.EncodeToString(h.Sum(nil)) return &Config{ App: AppConfig{ AppEnv: v.GetString("APP_ENV"), AppPort: v.GetString("APP_PORT"), RedisAddr: v.GetString("REDIS_ADDR"), MySQLDSN: v.GetString("MYSQL_DSN"), PostgresDSN: v.GetString("POSTGRES_DSN"), MongoDSN: v.GetString("MONGO_DSN"), MinIoEndpoint: v.GetString("MINIO_ENDPOINT"), MinioAccessKey: v.GetString("MINIO_ACCESS_KEY"), MinioSecretKey: v.GetString("MINIO_SECRET_KEY"), MinioBucketName: v.GetString("MINIO_BUCKET_NAME"), }, FwhApi: FwhApiConfig{ FwhEnergy: v.GetString("FWH_ENERGY"), FwhOss: v.GetString("FWH_OSS"), FwhUser: v.GetString("FWH_USER"), FwhPassword: fwhApiPassword, }, FwhMqtt: FwhMqttConfig{ FwhMqttBroker: v.GetString("FWH_MQTT_BROKER"), FwhMqttCaUrl: v.GetString("FWH_MQTT_CA"), FwhMqttCertUrl: v.GetString("FWH_MQTT_CERT"), FwhMqttKeyUrl: v.GetString("FWH_MQTT_KEY"), }, }, nil }