"""数学学习系统后端入口。""" from __future__ import annotations import os from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from database import REPO_ROOT, ensure_schema from routers import ( analytics, archive, auth, catalog, courses, data, ebooks, llm, knowledge_graph, overview, practice, question_bank, users, ) # 启动只对齐表结构(建表 / 补列),不写任何业务数据: # 换成自己准备好的 math.db 后,重启即原样使用,不会被种子改动。 # 种子数据与历史数据迁移只在初始化时执行: # cd backend && .venv/bin/python -m seed [--force] ensure_schema() def _cors_origins() -> list[str]: raw = os.getenv("CORS_ORIGINS", "http://localhost:5173,http://127.0.0.1:5173") return [origin.strip() for origin in raw.split(",") if origin.strip()] app = FastAPI( title="数学学习系统 API", description="个人数学学习系统后端:章节组卷判分、掌握度引擎、错题与学习档案。", version="1.0.0", ) app.add_middleware( CORSMiddleware, allow_origins=_cors_origins(), allow_credentials=True, allow_methods=["*"], allow_headers=["*"], # 阅读器依赖 Range 分段加载,需要能读到这几个响应头 expose_headers=["Accept-Ranges", "Content-Range", "Content-Length"], ) app.include_router(overview.router, prefix="/api") app.include_router(data.router, prefix="/api") app.include_router(analytics.router, prefix="/api") app.include_router(practice.router, prefix="/api") app.include_router(archive.router, prefix="/api") app.include_router(catalog.router, prefix="/api") app.include_router(courses.router, prefix="/api") app.include_router(ebooks.router, prefix="/api") app.include_router(ebooks.progress_router, prefix="/api") app.include_router(question_bank.router, prefix="/api") app.include_router(llm.router, prefix="/api") app.include_router(auth.router, prefix="/api") app.include_router(users.router, prefix="/api") app.include_router(knowledge_graph.router, prefix="/api") image_dir = REPO_ROOT / "data" / "question_images" image_dir.mkdir(parents=True, exist_ok=True) app.mount( "/api/question-images", StaticFiles(directory=image_dir), name="question-images", ) @app.get("/api/health") def health(): return {"status": "ok", "service": "math-learning-backend"}