package config import ( "os" "strconv" "time" ) // Config 全局配置 type Config struct { // 服务配置 Server ServerConfig // 数据库配置 Database DatabaseConfig // Redis配置 Redis RedisConfig // JWT配置 JWT JWTConfig // 安全配置 Security SecurityConfig // OAuth配置 OAuth OAuthConfig // 应用信息 App AppConfig } type ServerConfig struct { Host string Port int Mode string // debug/release } type DatabaseConfig struct { Type string // mysql/postgres/sqlite DSN string MaxOpenConns int MaxIdleConns int ConnMaxLifetime time.Duration } type RedisConfig struct { Addr string Password string DB int Enabled bool } type JWTConfig struct { Secret string AccessExpiry time.Duration RefreshExpiry time.Duration Issuer string } type SecurityConfig struct { BcryptCost int MaxLoginAttempts int CaptchaEnabled bool } type OAuthConfig struct { AuthorizationExpiry time.Duration AccessExpiry time.Duration RefreshExpiry time.Duration } type AppConfig struct { ID string Name string InitAdmin InitAdminConfig } type InitAdminConfig struct { Username string Password string Email string } var C *Config func init() { C = &Config{ Server: ServerConfig{ Host: getEnv("SERVER_HOST", "0.0.0.0"), Port: getEnvInt("SERVER_PORT", 8080), Mode: getEnv("SERVER_MODE", "debug"), }, Database: DatabaseConfig{ Type: getEnv("DB_TYPE", "mysql"), DSN: getEnv("DB_DSN", "root:123456@tcp(127.0.0.1:3306)/vbase?charset=utf8mb4&parseTime=True&loc=Local"), MaxOpenConns: getEnvInt("DB_MAX_OPEN", 100), MaxIdleConns: getEnvInt("DB_MAX_IDLE", 10), ConnMaxLifetime: time.Hour, }, Redis: RedisConfig{ Enabled: getEnvBool("REDIS_ENABLED", true), Addr: getEnv("REDIS_ADDR", "localhost:6379"), Password: getEnv("REDIS_PASSWORD", ""), DB: getEnvInt("REDIS_DB", 0), }, JWT: JWTConfig{ Secret: getEnv("JWT_SECRET", "your-secret-key-change-in-production-min-32-characters"), AccessExpiry: getEnvDuration("JWT_ACCESS_EXPIRY", time.Hour), RefreshExpiry: getEnvDuration("JWT_REFRESH_EXPIRY", 30*24*time.Hour), Issuer: getEnv("JWT_ISSUER", "vbase"), }, Security: SecurityConfig{ BcryptCost: getEnvInt("BCRYPT_COST", 12), MaxLoginAttempts: getEnvInt("MAX_LOGIN_ATTEMPTS", 5), CaptchaEnabled: getEnvBool("CAPTCHA_ENABLED", true), }, OAuth: OAuthConfig{ AuthorizationExpiry: getEnvDuration("OAUTH_AUTH_EXPIRY", 10*time.Minute), AccessExpiry: getEnvDuration("OAUTH_ACCESS_EXPIRY", time.Hour), RefreshExpiry: getEnvDuration("OAUTH_REFRESH_EXPIRY", 30*24*time.Hour), }, App: AppConfig{ ID: getEnv("APP_ID", "vbase"), Name: getEnv("APP_NAME", "VBase IAM"), InitAdmin: InitAdminConfig{ Username: getEnv("INIT_ADMIN_USERNAME", "admin"), Password: getEnv("INIT_ADMIN_PASSWORD", ""), // 为空时随机生成 Email: getEnv("INIT_ADMIN_EMAIL", "admin@example.com"), }, }, } } func getEnv(key, defaultVal string) string { if v := os.Getenv(key); v != "" { return v } return defaultVal } func getEnvInt(key string, defaultVal int) int { if v := os.Getenv(key); v != "" { if i, err := strconv.Atoi(v); err == nil { return i } } return defaultVal } func getEnvBool(key string, defaultVal bool) bool { if v := os.Getenv(key); v != "" { if b, err := strconv.ParseBool(v); err == nil { return b } } return defaultVal } func getEnvDuration(key string, defaultVal time.Duration) time.Duration { if v := os.Getenv(key); v != "" { if d, err := time.ParseDuration(v); err == nil { return d } } return defaultVal }