"""全局配置:从 .env 读取,Pydantic v2 settings 风格。""" from functools import lru_cache from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", case_sensitive=False, ) # ---------- 应用 ---------- APP_NAME: str = "沃林学生管理系统" APP_DESC: str = "基于 FastAPI + SQLAlchemy 2.0 + MySQL 的教务管理系统" VERSION: str = "1.0.0" DEBUG: bool = True # ---------- 数据库 ---------- DB_DRIVER: str = "mysql+pymysql" # mysql+pymysql | sqlite DB_HOST: str = "127.0.0.1" DB_PORT: int = 3306 DB_USER: str = "root" DB_PASSWORD: str = "123456" DB_NAME: str = "wolin_sms" SQLITE_PATH: str = "./wolin_sms.db" DB_ECHO: bool = False DB_POOL_SIZE: int = 10 DB_POOL_RECYCLE: int = 3600 # ---------- 鉴权 ---------- JWT_SECRET: str = "wolin-sms-dev-secret-change-me" JWT_ALGORITHM: str = "HS256" JWT_EXPIRE_MINUTES: int = 720 AUTH_ENABLED: bool = True # 关闭后所有接口免登录(本地排错用) # ---------- 初始管理员 ---------- ADMIN_USERNAME: str = "admin" ADMIN_PASSWORD: str = "admin123" # ---------- 业务规则 ---------- SCORE_PASS_LINE: float = 60.0 # 及格线 SCORE_WARN_LINE: float = 60.0 # 红线预警线(低于即标记"需重点关注") HIGH_SALARY_LINE: float = 10000.0 # 高薪线 STU_NO_PREFIX: str = "WL" # 学号前缀 @property def database_url(self) -> str: if self.DB_DRIVER.startswith("sqlite"): return f"sqlite:///{self.SQLITE_PATH}" return ( f"{self.DB_DRIVER}://{self.DB_USER}:{self.DB_PASSWORD}" f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}?charset=utf8mb4" ) @property def server_url_without_db(self) -> str: """用于首次自动建库(数据库还不存在时)。""" return ( f"{self.DB_DRIVER}://{self.DB_USER}:{self.DB_PASSWORD}" f"@{self.DB_HOST}:{self.DB_PORT}/?charset=utf8mb4" ) @lru_cache def get_settings() -> Settings: return Settings() settings = get_settings()