from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.core.config import settings from app.core.database import Base, SessionLocal, engine from app.routers import auth, exams, export, students, subjects, wrong_questions from app.services.migrate import run_migrations from app.services.seed import seed_subjects @asynccontextmanager async def lifespan(app: FastAPI): Path(settings.UPLOAD_DIR).mkdir(parents=True, exist_ok=True) Base.metadata.create_all(bind=engine) run_migrations() db = SessionLocal() try: seed_subjects(db) finally: db.close() yield app = FastAPI(title="中学成绩档案", version="1.0.0", lifespan=lifespan) 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, prefix="/api") app.include_router(students.router, prefix="/api") app.include_router(subjects.router, prefix="/api") app.include_router(exams.router, prefix="/api") app.include_router(wrong_questions.router, prefix="/api") app.include_router(export.router, prefix="/api") @app.get("/api/health") def health(): return {"status": "ok"}