package config import ( "encoding/json" "fmt" "os" ) type Config struct { AdminToken string `json:"adminToken"` AuthAPIURL string `json:"authApiUrl"` // 数据库 DSN,为空时回退到测试数据库。 // 格式:user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local DatabaseDSN string `json:"databaseDsn"` } // 各环境默认 DSN。 const ( TestDSN = "mengyastore-test:mengyastore-test@tcp(10.1.1.100:3306)/mengyastore-test?charset=utf8mb4&parseTime=True&loc=Local" ProdDSN = "mengyastore:mengyastore@tcp(192.168.1.100:3306)/mengyastore?charset=utf8mb4&parseTime=True&loc=Local" ) func Load(path string) (*Config, error) { var cfg Config data, err := os.ReadFile(path) if err == nil { if jsonErr := json.Unmarshal(data, &cfg); jsonErr != nil { return nil, fmt.Errorf("解析配置文件 %s 失败: %w", path, jsonErr) } } // 文件不存在时使用默认值,环境变量在下方仍优先生效。 if cfg.AdminToken == "" { cfg.AdminToken = "changeme" } // DATABASE_DSN 环境变量优先于配置文件。 if dsn := os.Getenv("DATABASE_DSN"); dsn != "" { cfg.DatabaseDSN = dsn } if cfg.DatabaseDSN == "" { cfg.DatabaseDSN = TestDSN } return &cfg, nil }