package config import ( "fmt" "os" "strconv" ) // Config 网关配置 type Config struct { Server ServerConfig Dubbo DubboConfig JWT JWTConfig OSS OSSConfig Segment SegmentConfig Dify DifyConfig Minimax MinimaxConfig LaserCompositor LaserCompositorConfig Redis RedisConfig DB DBConfig WebSocket WebSocketConfig Root string } // MinimaxConfig MiniMax 图像生成配置 type MinimaxConfig struct { APIKey string // MiniMax API 密钥 APIURL string // 默认 https://api.minimaxi.com/v1/image_generation } // LaserCompositorConfig laser-compositor 合成服务配置 type LaserCompositorConfig struct { URL string // 默认 http://127.0.0.1:7000 } // DifyConfig Dify 工作流配置 type DifyConfig struct { APIBase string APIKey string } // RedisConfig Redis 配置 type RedisConfig struct { Host string Port int Password string DB int } // DBConfig 数据库配置 type DBConfig struct { Host string Port int User string Password string DBName string SSLMode string TimeZone string } // ServerConfig 服务器配置 type ServerConfig struct { Port string Mode string // debug, release, test } // DubboConfig Dubbo 服务配置 type DubboConfig struct { UserServiceURL string SocialServiceURL string AssetServiceURL string GalleryServiceURL string ActivityServiceURL string TaskServiceURL string StarbookServiceURL string AIChatServiceURL string } // JWTConfig JWT 配置 type JWTConfig struct { Secret string } // SegmentConfig 人像抠图(服务端代理) type SegmentConfig struct { Provider string // auto | imageseg | viapi | ivpd | http InferenceURL string // 自部署 rembg 等 HTTP 地址,如 http://127.0.0.1:7000/api/remove } // OSSConfig OSS 配置 type OSSConfig struct { Region string BucketName string RoleArn string AccessKeyID string AccessKeySecret string AvatarDir string // 头像上传目录,如 "avatar/" AssetDir string // 资产上传目录,如 "asset/" TokenExpireTime int // Token 过期时间(秒),默认 3600 } // GetUploadDir 根据类型获取上传目录 func (c *OSSConfig) GetUploadDir(uploadType string) string { switch uploadType { case "avatar": return c.AvatarDir case "asset": return c.AssetDir default: return c.AssetDir // 默认使用 asset 目录 } } // WebSocketConfig WebSocket 配置 type WebSocketConfig struct { AIChatPath string // WebSocket 路径,默认 /ws/ai-chat } // Load 加载配置 func Load() *Config { root, _ := os.Getwd() return &Config{ Root: root, Server: ServerConfig{ Port: getEnv("SERVER_PORT", "8080"), Mode: getEnv("GIN_MODE", "debug"), }, Dubbo: DubboConfig{ UserServiceURL: getEnv("DUBBO_USER_SERVICE_URL", "tri://127.0.0.1:20000"), SocialServiceURL: getEnv("DUBBO_SOCIAL_SERVICE_URL", "tri://127.0.0.1:20002"), AssetServiceURL: getEnv("DUBBO_ASSET_SERVICE_URL", "tri://127.0.0.1:20003"), GalleryServiceURL: getEnv("DUBBO_GALLERY_SERVICE_URL", "tri://127.0.0.1:20004"), ActivityServiceURL: getEnv("DUBBO_ACTIVITY_SERVICE_URL", "tri://127.0.0.1:20005"), TaskServiceURL: getEnv("DUBBO_TASK_SERVICE_URL", "tri://127.0.0.1:20006"), StarbookServiceURL: getEnv("DUBBO_STARBOOK_SERVICE_URL", "tri://127.0.0.1:20007"), AIChatServiceURL: getEnv("DUBBO_AI_CHAT_SERVICE_URL", "tri://127.0.0.1:20008"), }, JWT: JWTConfig{ Secret: getEnv("JWT_SECRET", ""), }, OSS: OSSConfig{ Region: getEnv("OSS_REGION", "cn-shanghai"), BucketName: getEnv("OSS_BUCKET_NAME", ""), RoleArn: getEnv("OSS_STS_ROLE_ARN", ""), AccessKeyID: getEnv("OSS_ACCESS_KEY_ID", ""), AccessKeySecret: getEnv("OSS_ACCESS_KEY_SECRET", ""), AvatarDir: getEnv("OSS_AVATAR_DIR", "avatar/"), AssetDir: getEnv("OSS_ASSET_DIR", "asset/"), TokenExpireTime: getEnvInt("OSS_TOKEN_EXPIRE_TIME", 3600), }, Segment: SegmentConfig{ Provider: getEnv("SEGMENT_PROVIDER", "imageseg"), InferenceURL: getEnv("SEGMENT_INFERENCE_URL", ""), }, Dify: DifyConfig{ APIBase: getEnv("DIFY_API_BASE", ""), APIKey: getEnv("DIFY_API_KEY", ""), }, Minimax: MinimaxConfig{ APIKey: getEnv("MINIMAX_API_KEY", ""), APIURL: getEnv("MINIMAX_API_URL", "https://api.minimaxi.com/v1/image_generation"), }, LaserCompositor: LaserCompositorConfig{ URL: getEnv("LASER_COMPOSITOR_URL", "http://127.0.0.1:7000"), }, Redis: RedisConfig{ Host: getEnv("REDIS_HOST", "127.0.0.1"), Port: getEnvInt("REDIS_PORT", 6379), Password: getEnv("REDIS_PASSWORD", ""), DB: getEnvInt("REDIS_DB", 0), }, DB: DBConfig{ Host: getEnv("DB_HOST", "localhost"), Port: getEnvInt("DB_PORT", 5432), User: getEnv("DB_USER", "postgres"), Password: getEnv("DB_PASSWORD", ""), DBName: getEnv("DB_NAME", "top-fans"), SSLMode: getEnv("DB_SSLMODE", "disable"), TimeZone: getEnv("DB_TIMEZONE", "Asia/Shanghai"), }, WebSocket: WebSocketConfig{ AIChatPath: getEnv("WS_AI_CHAT_PATH", "/ws/ai-chat"), }, } } // getEnv 获取环境变量,如果不存在则返回默认值 func getEnv(key, defaultValue string) string { value := os.Getenv(key) if value == "" { return defaultValue } return value } // getEnvInt 获取整型环境变量,如果不存在或解析失败则返回默认值 func getEnvInt(key string, defaultValue int) int { value := os.Getenv(key) if value == "" { return defaultValue } intValue, err := strconv.Atoi(value) if err != nil { return defaultValue } return intValue } // Validate 验证配置 func (c *Config) Validate() error { if c.Server.Port == "" { return fmt.Errorf("server port is required") } if c.Dubbo.UserServiceURL == "" { return fmt.Errorf("dubbo user service URL is required") } if c.Dubbo.SocialServiceURL == "" { return fmt.Errorf("dubbo social service URL is required") } if c.Dubbo.AssetServiceURL == "" { return fmt.Errorf("dubbo asset service URL is required") } if c.Dubbo.GalleryServiceURL == "" { return fmt.Errorf("dubbo gallery service URL is required") } if c.Dubbo.ActivityServiceURL == "" { return fmt.Errorf("dubbo activity service URL is required") } if c.Dubbo.TaskServiceURL == "" { return fmt.Errorf("dubbo task service URL is required") } if c.JWT.Secret == "" { return fmt.Errorf("JWT secret is required") } return nil }