# =========================================== # 班级操行分管理系统 - 后端服务 # # 开发者: 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配置 ========== 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: """获取Redis连接URL""" 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配置 ========== 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")) # ========== CORS配置 ========== CORS_ORIGINS: List[str] = os.getenv("CORS_ORIGINS", "http://localhost:8080").split(",") # ========== 上传配置 ========== 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_configs = [ ("SECRET_KEY", self.SECRET_KEY), ("JWT_SECRET_KEY", self.JWT_SECRET_KEY), ("PASSWORD_SALT", self.PASSWORD_SALT), ] for name, value in required_configs: if not value: raise ValueError(f"配置 {name} 不能为空") settings = Settings()