82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
"""数学学习系统后端入口。"""
|
|
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"}
|