"use server"; import { revalidatePath } from "next/cache"; import { getSessionUser } from "@/lib/auth"; import { entryBySeq } from "@/content/grammar"; import { completeSeq, grade, isUnlocked, passedSet } from "@/lib/grammar"; export type QuizResult = | { score: number; passed: boolean; correct: number; total: number; detail: boolean[]; } | { error: string }; // 提交测验:服务端按标准答案计分(防篡改),达标即记进度并联动英语打卡 export async function submitQuiz(_prev: QuizResult | null, formData: FormData): Promise { const user = await getSessionUser(); if (!user || user.role !== "child") return { error: "会话无效,请重新激活设备" }; const seq = Number(formData.get("seq")); const entry = entryBySeq(seq); if (!entry) return { error: "课程不存在" }; const passed = await passedSet(user.id); if (!isUnlocked(seq, passed)) return { error: "请先完成前面的课程" }; const answers = entry.quiz.map((_, i) => Number(formData.get(`a${i}`))); const g = grade(entry.quiz, answers); await completeSeq(user.id, seq, g.score, g.passed); revalidatePath("/learn"); revalidatePath(`/learn/${seq}`); revalidatePath("/kid"); revalidatePath("/parent"); return g; }