# =========================================== # 班级操行分管理系统 - 配置管理 # # 开发者: Canglan # 联系方式: admin@sea-studio.top # 版权归属: Sea Network Technology Studio # 许可证: MIT License # # 版权所有 © Sea Network Technology Studio # =========================================== import os from dotenv import load_dotenv from typing import List load_dotenv() class Settings: APP_NAME: str = os.getenv("APP_NAME", "班级操行分管理系统") APP_ENV: str = os.getenv("APP_ENV", "production") DEBUG: bool = os.getenv("DEBUG", "False").lower() == "true" SECRET_KEY: str = os.getenv("SECRET_KEY", "") API_VERSION: str = os.getenv("API_VERSION", "v1") DB_HOST: str = os.getenv("DB_HOST", "127.0.0.1") DB_PORT: int = int(os.getenv("DB_PORT", "3306")) DB_USER: str = os.getenv("DB_USER", "root") DB_PASSWORD: str = os.getenv("DB_PASSWORD", "") DB_NAME: str = os.getenv("DB_NAME", "classmanagerdb") DB_POOL_SIZE: int = int(os.getenv("DB_POOL_SIZE", "10")) DB_MAX_OVERFLOW: int = int(os.getenv("DB_MAX_OVERFLOW", "20")) REDIS_HOST: str = os.getenv("REDIS_HOST", "127.0.0.1") REDIS_PORT: int = int(os.getenv("REDIS_PORT", "6379")) REDIS_PASSWORD: str = os.getenv("REDIS_PASSWORD", "") REDIS_DB: int = int(os.getenv("REDIS_DB", "0")) REDIS_MAX_CONNECTIONS: int = int(os.getenv("REDIS_MAX_CONNECTIONS", "50")) @property def REDIS_URL(self) -> str: if self.REDIS_PASSWORD: return f"redis://:{self.REDIS_PASSWORD}@{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}" return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}" JWT_SECRET_KEY: str = os.getenv("JWT_SECRET_KEY", "") JWT_ALGORITHM: str = os.getenv("JWT_ALGORITHM", "HS256") JWT_EXPIRE_MINUTES: int = int(os.getenv("JWT_EXPIRE_MINUTES", "30")) PASSWORD_SALT: str = os.getenv("PASSWORD_SALT", "") DEBUG_PATH: str = os.getenv("DEBUG_PATH", "/debug_add_admin") DEDUCTION_HOMEWORK_NOT_SUBMIT: int = int(os.getenv("DEDUCTION_HOMEWORK_NOT_SUBMIT", "2")) DEDUCTION_HOMEWORK_LATE: int = int(os.getenv("DEDUCTION_HOMEWORK_LATE", "1")) DEDUCTION_ATTENDANCE_ABSENT: int = int(os.getenv("DEDUCTION_ATTENDANCE_ABSENT", "5")) DEDUCTION_ATTENDANCE_LATE: int = int(os.getenv("DEDUCTION_ATTENDANCE_LATE", "2")) DEDUCTION_ATTENDANCE_LEAVE: int = int(os.getenv("DEDUCTION_ATTENDANCE_LEAVE", "1")) LABOR_POINTS_ADD: int = int(os.getenv("LABOR_POINTS_ADD", "1")) LABOR_POINTS_SUBTRACT: int = int(os.getenv("LABOR_POINTS_SUBTRACT", "-1")) MONITOR_MAX_ADD: int = int(os.getenv("MONITOR_MAX_ADD", "5")) MONITOR_MAX_SUBTRACT: int = int(os.getenv("MONITOR_MAX_SUBTRACT", "-5")) LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO") LOG_MAX_BYTES: int = int(os.getenv("LOG_MAX_BYTES", "104857600")) LOG_BACKUP_COUNT: int = int(os.getenv("LOG_BACKUP_COUNT", "30")) LOG_RETENTION_DAYS: int = int(os.getenv("LOG_RETENTION_DAYS", "365")) @property def CORS_ORIGINS(self) -> List[str]: origins = os.getenv("CORS_ORIGINS", "") return [origin.strip() for origin in origins.split(",") if origin.strip()] MAX_UPLOAD_SIZE: int = int(os.getenv("MAX_UPLOAD_SIZE", "5242880")) ALLOWED_EXTENSIONS: set = set(os.getenv("ALLOWED_EXTENSIONS", "json").split(",")) STUDENT_INITIAL_POINTS: int = int(os.getenv("STUDENT_INITIAL_POINTS", "60")) def validate(self) -> None: required = ["SECRET_KEY", "JWT_SECRET_KEY", "PASSWORD_SALT"] for name in required: if not getattr(self, name): raise ValueError(f"配置 {name} 不能为空") settings = Settings()