import { notFound } from "next/navigation" import { getTranslations } from "next-intl/server" import { BookOpen } from "lucide-react" import { getTextbookById, getChaptersByTextbookId } from "@/modules/textbooks/data-access" import { TextbookReader } from "@/modules/textbooks/components/textbook-reader" import { getSubjectLabelKey, getGradeLabelKey } from "@/modules/textbooks/constants" import { Badge } from "@/shared/components/ui/badge" import { EmptyState } from "@/shared/components/ui/empty-state" import { getCurrentStudentUser } from "@/modules/users/data-access" import { getGradeNameById } from "@/modules/school/data-access" export const dynamic = "force-dynamic" export default async function StudentTextbookDetailPage({ params, }: { params: Promise<{ id: string }> }) { const t = await getTranslations("textbooks") const student = await getCurrentStudentUser() if (!student) return notFound() const { id } = await params const [textbook, chapters] = await Promise.all([ getTextbookById(id), getChaptersByTextbookId(id), ]) if (!textbook) notFound() // P1-1 数据范围过滤:校验教材年级与学生年级匹配 // student.gradeId 是 grades 表 id,需解析为年级名称后才能与 textbooks.grade 字符串比较 const studentGradeName = student.gradeId ? await getGradeNameById(student.gradeId) : null if (studentGradeName && textbook.grade && textbook.grade !== studentGradeName) { notFound() } return (