Files
2026-09-21 19:03:31 +08:00

75 lines
2.3 KiB
Python

"""全局配置:从 .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()