新增作文区与 AI 解读开关,修复 CSV 导出。

系统设置可关闭成绩复盘 AI;学生详情增加作文区(OCR/手动题目、方案与范文、历史与 MD 下载);导出改用 UTF-8 文件名响应。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-28 17:42:17 +08:00
parent aaa08cdf38
commit 1cb3c7fad5
20 changed files with 1441 additions and 555 deletions
+12 -7
View File
@@ -1,9 +1,10 @@
import csv
import io
import uuid
from urllib.parse import quote
from fastapi import APIRouter, Depends
from fastapi.responses import StreamingResponse
from fastapi.responses import Response
from sqlalchemy.orm import Session, joinedload
from app.core.database import get_db
@@ -34,10 +35,11 @@ def export_scores_csv(
writer.writerow(["考试日期", "考试类型", "标题", "科目", "总分", "得分", "占比"])
type_map = {"weekly": "周考", "monthly": "月考", "final": "期末"}
for exam in exams:
exam_type = exam.exam_type.value if hasattr(exam.exam_type, "value") else str(exam.exam_type)
for score in exam.scores:
writer.writerow([
exam.exam_date.isoformat(),
type_map.get(exam.exam_type.value, exam.exam_type.value),
type_map.get(exam_type, exam_type),
exam.title or "",
score.subject.name if score.subject else "",
float(score.total_score),
@@ -45,10 +47,13 @@ def export_scores_csv(
f"{float(score.ratio) * 100:.2f}%",
])
output.seek(0)
content = output.getvalue().encode("utf-8-sig")
filename = f"{student.name}_scores.csv"
return StreamingResponse(
iter([output.getvalue().encode("utf-8-sig")]),
media_type="text/csv",
headers={"Content-Disposition": f'attachment; filename="{filename}"'},
encoded = quote(filename)
return Response(
content=content,
media_type="text/csv; charset=utf-8",
headers={
"Content-Disposition": f'attachment; filename="scores.csv"; filename*=UTF-8\'\'{encoded}'
},
)