package config import ( "allapp/db" "allapp/utils/redisx" "bytes" _ "embed" "fmt" "os" "strings" "time" "github.com/spf13/viper" ) var ( conf *Config ) func InitConfig() error { // 加载配置 err := readConfigFile() if err != nil { return fmt.Errorf("read config file failed: %w", err) } initLogger() initUniqueId() // 加载数据库 pool, queries, err := initDB() if err != nil { return fmt.Errorf("加载数据库失败: %w", err) } db.Pool = pool db.Queries = queries // 加载 redis redis, err := initRedis() if err != nil { return fmt.Errorf("加载Redis失败: %w", err) } redisx.Client = redis return nil } func defaultConfig() *Config { return &Config{ Server: ServerConfig{ Port: "8080", BaseUrl: "/", WsUrl: "/ws", }, JWT: JwtConfig{ Secret: "qwemwddlalmskadklsdklamlkdsakld", AccessExpiry: 24 * time.Hour, }, UniqueID: UniqueIDConfig{ DataCenterID: 1, WorkerID: 1, }, Postgres: PostgresConfig{ Port: 5432, SslMode: false, TimeZone: "Asia/Shanghai", MaxOpenConns: 20, MaxIdleConns: 10, ConnMaxLifetime: 30 * time.Minute, }, Log: LogConfig{ Level: "info", Dir: "logs", MaxSize: 100, MaxBackups: 10, MaxAge: 30, Compress: true, }, Redis: RedisConfig{ Port: 6379, }, } } //go:embed resources/application.yaml var defaultYaml []byte //go:embed resources/application-dev.yaml var devYaml []byte //go:embed resources/application-build.yaml var buildYaml []byte func readConfigFile() error { conf = defaultConfig() env := GetEnv() v := viper.New() v.SetConfigType("yaml") // 读取默认配置 if err := v.ReadConfig(bytes.NewReader(defaultYaml)); err != nil { return fmt.Errorf("read default config failed: %w", err) } // 根据环境合并 switch env { case "build": if err := v.MergeConfig(bytes.NewReader(buildYaml)); err != nil { return fmt.Errorf("merge build config failed: %w", err) } default: // dev 或其他值都使用 dev if err := v.MergeConfig(bytes.NewReader(devYaml)); err != nil { return fmt.Errorf("merge dev config failed: %w", err) } } if err := v.Unmarshal(&conf); err != nil { return fmt.Errorf("unmarshal config failed: %w", err) } conf.Env = env fmt.Println("✅ 加载配置成功, 环境:", env) return nil } // GetEnv 获取 GO_ENV 环境变量,默认返回 "dev" func GetEnv() string { e := os.Getenv("GO_ENV") if len(e) == 0 { // 如果没有设置 GO_ENV,使用默认的 "dev" 配置 return "dev" } return e } // GetConf 获取配置信息 func GetConf() *Config { return conf } // GetServerPort 项目启动端口 func GetServerPort() string { port := conf.Server.Port if strings.HasPrefix(port, ":") { return port } return ":" + port }