# config/settings.py import os import urllib.parse from typing import Dict, Any from dotenv import load_dotenv # 加载.env文件 load_dotenv() class Settings: """配置管理器""" def __init__(self): # 从环境变量加载配置 self.HOST = os.getenv('HOST', '0.0.0.0') self.PORT = int(os.getenv('PORT', '8000')) self.DEBUG = os.getenv('DEBUG', 'false').lower() == 'true' # 文件处理配置 self.UPLOAD_DIR = os.getenv('UPLOAD_DIR', './uploads') self.MAX_FILE_SIZE = int(os.getenv('MAX_FILE_SIZE', '104857600')) self.ALLOWED_EXTENSIONS = os.getenv('ALLOWED_EXTENSIONS', '.stp,.step,.stp.gz') # 几何处理配置 self.POINTCLOUD_SAMPLE_COUNT = int(os.getenv('POINTCLOUD_SAMPLE_COUNT', '10000')) self.MESH_QUALITY = os.getenv('MESH_QUALITY', 'high') self.PARALLEL_PROCESSING = os.getenv('PARALLEL_PROCESSING', 'true').lower() == 'true' # RustFS 对象存储配置 (S3v4 API) self.RUSTFS_ENDPOINT = os.getenv('RUSTFS_ENDPOINT', 'http://localhost:8080') self.RUSTFS_ACCESS_KEY = os.getenv('RUSTFS_ACCESS_KEY', 'your-access-key') self.RUSTFS_SECRET_KEY = os.getenv('RUSTFS_SECRET_KEY', 'your-secret-key') self.RUSTFS_TIMEOUT = int(os.getenv('RUSTFS_TIMEOUT', '30')) # 预签名URL过期时间(秒) self.RUSTFS_PRESIGNED_URL_EXPIRES = int(os.getenv('RUSTFS_PRESIGNED_URL_EXPIRES', '3600')) # 数据库配置 - 必须来自环境变量 # 先检查所有配置是否存在 db_host = os.getenv('DB_HOST') db_port_str = os.getenv('DB_PORT') db_name = os.getenv('DB_NAME') db_user = os.getenv('DB_USER') db_password = os.getenv('DB_PASSWORD') missing_configs = [] if not db_host: missing_configs.append("DB_HOST") if not db_port_str: missing_configs.append("DB_PORT") if not db_name: missing_configs.append("DB_NAME") if not db_user: missing_configs.append("DB_USER") if not db_password: missing_configs.append("DB_PASSWORD") if missing_configs: raise ValueError(f"数据库配置缺失,请在.env文件中设置: {', '.join(missing_configs)}") # 所有配置都存在,进行赋值 self.DB_HOST = db_host self.DB_PORT = int(db_port_str) self.DB_NAME = db_name self.DB_USER = db_user self.DB_PASSWORD = db_password # JWT配置 self.SECRET_KEY = os.getenv('SECRET_KEY', 'your-secret-key-change-in-production') self.ALGORITHM = os.getenv('ALGORITHM', 'HS256') self.ACCESS_TOKEN_EXPIRE_MINUTES = int(os.getenv('ACCESS_TOKEN_EXPIRE_MINUTES', '1440')) # 管理员账户配置 self.ADMIN_USERNAME = os.getenv('ADMIN_USERNAME', 'admin') self.ADMIN_PASSWORD = os.getenv('ADMIN_PASSWORD', 'admin123') self.ADMIN_EMAIL = os.getenv('ADMIN_EMAIL', 'admin@gemold.com') self.ADMIN_FULL_NAME = os.getenv('ADMIN_FULL_NAME', '系统管理员') # FreeCAD 验证配置 self.ENABLE_FREECAD_VERIFICATION = os.getenv('ENABLE_FREECAD_VERIFICATION', 'false').lower() == 'true' self.FREECAD_VERIFICATION_TIMEOUT = int(os.getenv('FREECAD_VERIFICATION_TIMEOUT', '120')) @property def DATABASE_URL(self) -> str: """动态生成数据库连接URL""" # 安全编码密码 if self.DB_PASSWORD: safe_password = urllib.parse.quote(self.DB_PASSWORD.encode('utf-8'), safe='') else: safe_password = "" return f"postgresql+asyncpg://{self.DB_USER}:{safe_password}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" @property def allowed_extensions_set(self) -> set: """将ALLOWED_EXTENSIONS字符串转换为set""" return set(ext.strip() for ext in self.ALLOWED_EXTENSIONS.split(',')) # 创建全局配置实例 settings = Settings()