from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from app.config import settings from app.database import Base, engine from app.routers import ( admin_graders_router, admin_import_router, attempts_router, auth_router, scores_router, settings_router, ) from app.system_settings import ensure_upload_dir app = FastAPI(title="考试阅卷系统") origins = [o.strip() for o in settings.cors_origins.split(",") if o.strip()] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(auth_router.router) app.include_router(scores_router.router) app.include_router(attempts_router.router) app.include_router(admin_import_router.router) app.include_router(admin_graders_router.router) app.include_router(settings_router.router) @app.on_event("startup") def startup(): import app.models # noqa: F401 — 注册全部 ORM 表 Path(settings.database_url.replace("sqlite:///", "")).parent.mkdir(parents=True, exist_ok=True) ensure_upload_dir() Base.metadata.create_all(bind=engine) with engine.begin() as conn: conn.exec_driver_sql("CREATE INDEX IF NOT EXISTS ix_users_role ON users (role)") try: conn.exec_driver_sql( "ALTER TABLE import_batch ADD COLUMN exam_ids_json TEXT NOT NULL DEFAULT '[]'" ) except Exception: pass from app.database import SessionLocal from app.system_settings import get_or_create_settings db = SessionLocal() try: get_or_create_settings(db) finally: db.close() dist = Path(__file__).resolve().parents[2] / "frontend" / "dist" if dist.exists(): app.mount("/", StaticFiles(directory=str(dist), html=True), name="static")