import { SidebarInset, SidebarProvider, SidebarTrigger, } from "@/components/ui/sidebar"; import prisma from "@/lib/prisma"; import { auth } from "@/lib/auth"; import { redirect } from "next/navigation"; import { Separator } from "@/components/ui/separator"; import { AppSidebar } from "@/components/sidebar/app-sidebar"; import { AdminSidebar } from "@/components/sidebar/admin-sidebar"; import { DynamicBreadcrumb } from "@/components/dynamic-breadcrumb"; import { TeacherSidebar } from "@/components/sidebar/teacher-sidebar"; interface LayoutProps { children: React.ReactNode; } interface WrongProblem { id: string; name: string; status: string; url?: string; } export default async function Layout({ children }: LayoutProps) { const session = await auth(); const user = session?.user; if (!user) { redirect("/sign-in"); } // 获取用户的完整信息(包括角色) const fullUser = await prisma.user.findUnique({ where: { id: user.id }, select: { id: true, name: true, email: true, image: true, role: true }, }); if (!fullUser) { redirect("/sign-in"); } // 根据用户角色决定显示哪个侧边栏 const renderSidebar = () => { switch (fullUser.role) { case "ADMIN": return ; case "TEACHER": return ; case "GUEST": default: // 学生(GUEST)需要查询错题数据 return ; } }; // 只有学生才需要查询错题数据 let wrongProblemsData: WrongProblem[] = []; if (fullUser.role === "GUEST") { // 查询未完成(未AC)题目的最新一次提交 const wrongProblems = await prisma.problem.findMany({ where: { submissions: { some: { userId: user.id }, }, NOT: { submissions: { some: { userId: user.id, status: "AC" }, }, }, }, select: { id: true, displayId: true, localizations: { where: { locale: "zh", type: "TITLE" }, select: { content: true }, }, submissions: { where: { userId: user.id }, orderBy: { createdAt: "desc" }, take: 1, select: { status: true, }, }, }, }); // 组装传递给 AppSidebar 的数据格式 wrongProblemsData = wrongProblems.map((p) => ({ id: p.id, name: p.localizations[0]?.content || `题目${p.displayId}`, status: p.submissions[0]?.status || "-", url: `/problems/${p.id}`, })); } return ( {fullUser.role === "GUEST" ? ( ) : ( renderSidebar() )}
{children}
); }