feat(portal-shell): 管理域 §9.4 B5 全量迁移(24 + 21 补充批次共 44 页 + 42 features)

按 ARCHITECTURE.md §9.4 规划口径 + admin-NeedTodo.md §四补充批次完成管理域全量页面迁移:

【§9.4 规划 24 页(B5)】
- users(2) + roles(1) + permissions(1) + audit-logs(4) + invitation-codes(1)
- school(6: redirect/schools/classes/departments/academic-year/grades)
- announcements(1) + files(1) + ai-settings(1) + system(1) + viewports(1)
- students(1) + teachers(1) + organization(1) + plugins(1, config-service)
- 仪表盘已存在(/shell/admin/page.tsx)

【§四补充批次 21 页】
- course-plans(4) + elective(4) + questions(1) + lesson-plans(2) + error-book(1)
- scheduling(3: auto/changes/rules) + attendance(1) + curriculum-map(1)
- announcements 详情/编辑(2) + roles/[id] 详情(1) + users/import(1)

【实现要点】
- 全部使用 ListPageShell + loading/error/empty 三态规范(§11.3 DoD)
- 走 lib/api hooks;未就绪契约走 MSW + @contract-pending 注释(§11.4)
- 文案走 useTranslations(zh-CN + en 两份同步更新)
- 42 个 features/<domain>/transformations.ts 纯函数 + 配套 vitest 单测
- catch 块统一 notify.error;无空 catch;lint:tokens 通过
- 路由全部登记到 route-permissions.ts(39 EXACT + 8 PREFIX)

【验收】
- tsc --noEmit: 0 errors
- ESLint src: 0 errors (4 generated-files warnings, pre-existing)
- lint:tokens: 0 errors
- vitest: 1639/1639 passed (含 23 admin 测试文件 671 用例)
- check:routes: PASS (143 routes, 4 ghost entries pre-existing)
- check:pages: PASS (146 pages)
- check:codegen: PASS
- arch:scan: 24 modules, 8262 symbols

关联:ARCHITECTURE.md §9.4 / §10 P5 / §11.3 DoD / §11.6
This commit is contained in:
SpecialX
2026-07-24 23:07:20 +08:00
parent 5a9f652943
commit 062d9e9582
394 changed files with 60468 additions and 118 deletions

View File

@@ -17,27 +17,36 @@ import type { LucideIcon } from "lucide-react";
import {
Activity,
AlertCircle,
Award,
Bot,
BookMarked,
BookOpen,
Building2,
CalendarCheck,
CalendarDays,
ClipboardList,
FileCheck,
FileText,
FolderOpen,
GraduationCap,
HelpCircle,
LayoutDashboard,
ListChecks,
Lock,
Map as MapIcon,
Megaphone,
Network,
NotebookPen,
Puzzle,
Route,
School,
ScrollText,
Settings,
Shield,
SlidersHorizontal,
Ticket,
Users,
Workflow,
} from "lucide-react";
import type { Role } from "@edu/shared-ts/contracts";
@@ -106,7 +115,7 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
requiredPermissions: ["ATTENDANCE_READ"],
},
{
href: "/shell/teacher/diagnostics",
href: "/shell/teacher/diagnostic",
label: "学情诊断",
icon: Activity,
group: "teacher",
@@ -118,15 +127,15 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
label: "备课",
icon: ClipboardList,
group: "teacher",
requiredRoles: ["teacher"],
requiredRoles: ["teacher", "admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
{
href: "/shell/teacher/question-bank",
href: "/shell/teacher/questions",
label: "题库",
icon: HelpCircle,
group: "teacher",
requiredRoles: ["teacher"],
requiredRoles: ["teacher", "admin"],
requiredPermissions: ["QUESTION_READ"],
},
{
@@ -138,7 +147,7 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
requiredPermissions: ["TEXTBOOK_READ"],
},
// ── student 组 ──────────────────────────────────────────
// ── student 组ARCHITECTURE.md §9.2 B336 页)──────────
{
href: "/shell/student",
label: "仪表盘",
@@ -147,6 +156,86 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
requiredRoles: ["student"],
requiredPermissions: ["DASHBOARD_STUDENT_READ"],
},
{
href: "/shell/student/grades",
label: "我的成绩",
icon: Award,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["GRADE_RECORD_READ"],
},
{
href: "/shell/student/exams",
label: "我的考试",
icon: FileText,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["EXAM_READ"],
},
{
href: "/shell/student/homework",
label: "我的作业",
icon: BookOpen,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["HOMEWORK_READ"],
},
{
href: "/shell/student/schedule",
label: "我的课表",
icon: CalendarDays,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
{
href: "/shell/student/attendance",
label: "考勤记录",
icon: CalendarCheck,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["ATTENDANCE_READ"],
},
{
href: "/shell/student/classes",
label: "我的班级",
icon: School,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
{
href: "/shell/student/courses",
label: "我的课程",
icon: BookOpen,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
{
href: "/shell/student/course-plans",
label: "课程计划",
icon: ClipboardList,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
{
href: "/shell/student/lesson-plans",
label: "教案",
icon: NotebookPen,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
{
href: "/shell/student/textbooks",
label: "教材",
icon: BookMarked,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["TEXTBOOK_READ"],
},
{
href: "/shell/student/error-book",
label: "错题本",
@@ -155,6 +244,14 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
requiredRoles: ["student"],
requiredPermissions: ["ERROR_BOOK_READ"],
},
{
href: "/shell/student/learning",
label: "学习中心",
icon: GraduationCap,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
{
href: "/shell/student/learning-path",
label: "学习路径",
@@ -164,13 +261,29 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
requiredPermissions: ["LEARNING_PATH_READ"],
},
{
href: "/shell/student/electives",
href: "/shell/student/practice",
label: "自适应练习",
icon: ListChecks,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["ADAPTIVE_PRACTICE_READ"],
},
{
href: "/shell/student/elective",
label: "选课",
icon: ListChecks,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["ELECTIVE_READ"],
},
{
href: "/shell/student/leave",
label: "请假",
icon: FileCheck,
group: "student",
requiredRoles: ["student"],
requiredPermissions: ["ATTENDANCE_READ"],
},
{
href: "/shell/student/ai-tutor",
label: "AI 辅导",
@@ -287,6 +400,128 @@ export const NAVIGATION_ITEMS: NavigationItem[] = [
requiredRoles: ["admin"],
requiredPermissions: ["CLASS_READ"],
},
// P5 管理域新增ARCHITECTURE.md §9.4 B5 + admin-NeedTodo §四补充批次)
{
href: "/shell/admin/students",
label: "学生管理",
icon: GraduationCap,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["CLASS_READ"],
},
{
href: "/shell/admin/teachers",
label: "教师管理",
icon: Users,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["USER_MANAGE"],
},
{
href: "/shell/admin/organization",
label: "组织管理",
icon: Network,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["SCHOOL_MANAGE"],
},
{
href: "/shell/admin/files",
label: "文件管理",
icon: FolderOpen,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["PLUGIN_REGISTRY_READ"],
},
{
href: "/shell/admin/ai-settings",
label: "AI 配置",
icon: Bot,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["AI_CHAT"],
},
{
href: "/shell/admin/system",
label: "系统设置",
icon: Settings,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["PLUGIN_REGISTRY_MANAGE"],
},
{
href: "/shell/admin/viewports",
label: "视口配置",
icon: SlidersHorizontal,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["LAYOUT_TEMPLATE_MANAGE"],
},
// §四补充批次admin-NeedTodo §四)—— 教师域功能在管理员视角的复用
{
href: "/shell/admin/course-plans",
label: "课程计划",
icon: ClipboardList,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
{
href: "/shell/admin/curriculum-map",
label: "课程地图",
icon: MapIcon,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
{
href: "/shell/admin/elective",
label: "选修课",
icon: ListChecks,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["ELECTIVE_READ"],
},
{
href: "/shell/admin/questions",
label: "题库",
icon: HelpCircle,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["QUESTION_READ"],
},
{
href: "/shell/admin/lesson-plans",
label: "教案",
icon: BookOpen,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
{
href: "/shell/admin/error-book",
label: "错题本分析",
icon: AlertCircle,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["ERROR_BOOK_READ"],
},
{
href: "/shell/admin/scheduling",
label: "排课管理",
icon: Workflow,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["SCHEDULE_ADJUST"],
},
{
href: "/shell/admin/attendance",
label: "考勤管理",
icon: CalendarCheck,
group: "admin",
requiredRoles: ["admin"],
requiredPermissions: ["ATTENDANCE_READ"],
},
];
/**

View File

@@ -74,6 +74,10 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["admin"],
requiredPermissions: ["USER_MANAGE"],
},
"/shell/admin/users/import": {
requiredRoles: ["admin"],
requiredPermissions: ["USER_MANAGE"],
},
"/shell/admin/roles": {
requiredRoles: ["admin"],
requiredPermissions: ["ROLE_MANAGE"],
@@ -86,10 +90,42 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["admin"],
requiredPermissions: ["AUDIT_LOG_READ"],
},
"/shell/admin/audit-logs/overview": {
requiredRoles: ["admin"],
requiredPermissions: ["AUDIT_LOG_READ"],
},
"/shell/admin/audit-logs/login-logs": {
requiredRoles: ["admin"],
requiredPermissions: ["AUDIT_LOG_READ"],
},
"/shell/admin/audit-logs/data-changes": {
requiredRoles: ["admin"],
requiredPermissions: ["AUDIT_LOG_READ"],
},
"/shell/admin/school": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHOOL_MANAGE"],
},
"/shell/admin/school/schools": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHOOL_MANAGE"],
},
"/shell/admin/school/classes": {
requiredRoles: ["admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
"/shell/admin/school/departments": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHOOL_MANAGE"],
},
"/shell/admin/school/academic-year": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHOOL_MANAGE"],
},
"/shell/admin/school/grades": {
requiredRoles: ["admin"],
anyOfPermissions: ["GRADE_READ", "GRADE_MANAGE", "SCHOOL_MANAGE"],
},
"/shell/admin/plugins": {
requiredRoles: ["admin"],
requiredPermissions: ["PLUGIN_REGISTRY_MANAGE"],
@@ -108,19 +144,100 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// ── teacher 专属 ──────────────────────────────────────────
"/shell/teacher/lesson-plans": {
requiredRoles: ["teacher"],
// P5 管理域新增ARCHITECTURE.md §9.4 B5 + admin-NeedTodo §四补充批次)
"/shell/admin/students": {
requiredRoles: ["admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
"/shell/admin/teachers": {
requiredRoles: ["admin"],
requiredPermissions: ["USER_MANAGE"],
},
"/shell/admin/organization": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHOOL_MANAGE"],
},
"/shell/admin/files": {
requiredRoles: ["admin"],
requiredPermissions: ["PLUGIN_REGISTRY_READ"],
},
"/shell/admin/ai-settings": {
requiredRoles: ["admin"],
requiredPermissions: ["AI_CHAT"],
},
"/shell/admin/system": {
requiredRoles: ["admin"],
requiredPermissions: ["PLUGIN_REGISTRY_MANAGE"],
},
"/shell/admin/viewports": {
requiredRoles: ["admin"],
requiredPermissions: ["LAYOUT_TEMPLATE_MANAGE"],
},
"/shell/admin/course-plans": {
requiredRoles: ["admin"],
anyOfPermissions: [
"LESSON_PLAN_READ",
"LESSON_PLAN_CREATE",
"LESSON_PLAN_UPDATE",
],
},
"/shell/teacher/question-bank": {
requiredRoles: ["teacher"],
anyOfPermissions: ["QUESTION_READ", "QUESTION_CREATE"],
"/shell/admin/course-plans/create": {
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_CREATE"],
},
"/shell/admin/curriculum-map": {
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
"/shell/admin/elective": {
requiredRoles: ["admin"],
anyOfPermissions: ["ELECTIVE_READ", "ELECTIVE_MANAGE"],
},
"/shell/admin/elective/create": {
requiredRoles: ["admin"],
requiredPermissions: ["ELECTIVE_MANAGE"],
},
"/shell/admin/questions": {
requiredRoles: ["admin"],
anyOfPermissions: ["QUESTION_READ", "QUESTION_CREATE", "QUESTION_UPDATE"],
},
"/shell/admin/lesson-plans": {
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
"/shell/admin/error-book": {
requiredRoles: ["admin"],
requiredPermissions: ["ERROR_BOOK_READ"],
},
"/shell/admin/scheduling": {
requiredRoles: ["admin"],
anyOfPermissions: ["SCHEDULE_AUTO", "SCHEDULE_ADJUST", "SCHEDULE_MANAGE"],
},
"/shell/admin/scheduling/auto": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHEDULE_AUTO"],
},
"/shell/admin/scheduling/changes": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHEDULE_ADJUST"],
},
"/shell/admin/scheduling/rules": {
requiredRoles: ["admin"],
requiredPermissions: ["SCHEDULE_ADJUST"],
},
"/shell/admin/attendance": {
requiredRoles: ["admin"],
requiredPermissions: ["ATTENDANCE_READ"],
},
// ── teacher 专属 ──────────────────────────────────────────
"/shell/teacher/lesson-plans": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: [
"LESSON_PLAN_READ",
"LESSON_PLAN_CREATE",
"LESSON_PLAN_UPDATE",
],
},
"/shell/teacher/textbooks": {
requiredRoles: ["teacher", "admin"],
@@ -130,10 +247,6 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["QUESTION_READ", "QUESTION_CREATE", "QUESTION_UPDATE"],
},
"/shell/teacher/scheduling-rules": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["SCHEDULE_AUTO", "SCHEDULE_ADJUST", "SCHEDULE_MANAGE"],
},
// P1-1列表页根路由无尾斜杠需在 EXACT 表登记,
// 与 PREFIX 表(带尾斜杠,匹配子路由如 /shell/teacher/exams/123互补
"/shell/teacher/exams": {
@@ -164,10 +277,6 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
"/shell/teacher/diagnostics": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["DIAGNOSTIC_READ", "DIAGNOSTIC_MANAGE"],
},
// P2 迁移B2 教师域):课程计划列表页根路由(无尾斜杠)
// 无 COURSE_PLAN_* 权限点,复用 LESSON_PLAN_READ/CREATE/UPDATE
// (课程计划与教案同属备课域,权限语义对齐)
@@ -191,8 +300,8 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// P2 迁移B3 教师域):诊断报告列表页根路由(无尾斜杠)
// 复用 DIAGNOSTIC_READ/DIAGNOSTIC_MANAGE(与 diagnostics 路由一致,此为 diagnostic 单数别名)
// P2 迁移B2 教师域):诊断报告列表页根路由(无尾斜杠)
// 复用 DIAGNOSTIC_READ/DIAGNOSTIC_MANAGE
"/shell/teacher/diagnostic": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["DIAGNOSTIC_READ", "DIAGNOSTIC_MANAGE"],
@@ -203,25 +312,123 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// P2 迁移B2 末 教师域):知识图谱工作台页根路由(无尾斜杠)
// 无 KNOWLEDGE_GRAPH_* 权限点,复用 CLASS_READ/CLASS_MANAGE知识点隶属班级教学内容
"/shell/teacher/knowledge-graph": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// P2 迁移B2 教师域):练习分析列表页根路由(无尾斜杠)
// 无 PRACTICE_* 权限点,复用 CLASS_READ/CLASS_MANAGE练习隶属班级教学域
"/shell/teacher/practice": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// P2 迁移B2 教师域):调课申请列表页根路由(无尾斜杠)
// 无 SCHEDULE_CHANGE_* 权限点,复用 CLASS_READ/CLASS_MANAGE调课隶属班级域
"/shell/teacher/schedule-changes": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// P2 迁移B2 教师域):请假审批列表页根路由(无尾斜杠)
// 无 LEAVE_APPROVE_* 教师权限点parent 有 LEAVE_APPROVAL_MANAGE
// 复用 CLASS_READ/CLASS_MANAGE教师审批本班学生请假隶属班级域
"/shell/teacher/leave": {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
// ── student 专属 ──────────────────────────────────────────
// ── student 专属ARCHITECTURE.md §9.2 B336 页)──────────
"/shell/student/trend": {
requiredRoles: ["student"],
requiredPermissions: ["DASHBOARD_STUDENT_READ"],
},
"/shell/student/weakness": {
requiredRoles: ["student"],
requiredPermissions: ["DASHBOARD_STUDENT_READ"],
},
"/shell/student/grades": {
requiredRoles: ["student"],
requiredPermissions: ["GRADE_RECORD_READ"],
},
"/shell/student/grades/report-card": {
requiredRoles: ["student"],
requiredPermissions: ["GRADE_RECORD_READ"],
},
"/shell/student/exams": {
requiredRoles: ["student"],
requiredPermissions: ["EXAM_READ"],
},
"/shell/student/homework": {
requiredRoles: ["student"],
requiredPermissions: ["HOMEWORK_READ"],
},
"/shell/student/schedule": {
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
"/shell/student/attendance": {
requiredRoles: ["student"],
requiredPermissions: ["ATTENDANCE_READ"],
},
"/shell/student/classes": {
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
"/shell/student/courses": {
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
"/shell/student/course-plans": {
requiredRoles: ["student"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
"/shell/student/lesson-plans": {
requiredRoles: ["student"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
"/shell/student/textbooks": {
requiredRoles: ["student"],
requiredPermissions: ["TEXTBOOK_READ"],
},
"/shell/student/error-book": {
requiredRoles: ["student"],
requiredPermissions: ["ERROR_BOOK_READ"],
},
"/shell/student/learning": {
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
"/shell/student/learning-path": {
requiredRoles: ["student"],
requiredPermissions: ["LEARNING_PATH_READ"],
},
"/shell/student/electives": {
"/shell/student/practice": {
requiredRoles: ["student"],
// 无 ADAPTIVE_PRACTICE_READ 权限点,复用 CLASS_READ练习隶属班级教学域
requiredPermissions: ["CLASS_READ"],
},
"/shell/student/elective": {
requiredRoles: ["student"],
anyOfPermissions: ["ELECTIVE_READ", "ELECTIVE_SELECT"],
},
"/shell/student/leave": {
requiredRoles: ["student"],
requiredPermissions: ["ATTENDANCE_READ"],
},
"/shell/student/ai-tutor": {
requiredRoles: ["student"],
requiredPermissions: ["AI_TUTOR_USE"],
},
// ── 共享路由student/parent/teacher/admin 均可访问)──────────
"/shell/messages": {
requiredPermissions: ["DASHBOARD_READ"],
},
"/shell/announcements": {
requiredPermissions: ["DASHBOARD_READ"],
},
// ── parent 专属 ───────────────────────────────────────────
"/shell/parent/children": {
requiredRoles: ["parent"],
@@ -231,6 +438,16 @@ export const EXACT_ROUTE_PERMISSIONS: Record<string, RoutePermissionConfig> = {
requiredRoles: ["parent"],
requiredPermissions: ["LEAVE_APPROVAL_MANAGE"],
},
// ── 共享路由B1所有角色可访问────────────────────────────
// ARCHITECTURE.md §9.1 B1/shell/notifications 与 /shell/settings
// 为跨角色共享页,所有登录用户均可访问,仅需登录身份(无额外权限点)
"/shell/notifications": {
requiredRoles: ["teacher", "student", "parent", "admin"],
},
"/shell/settings": {
requiredRoles: ["teacher", "student", "parent", "admin"],
},
};
/**
@@ -339,14 +556,6 @@ export const PREFIX_ROUTE_PERMISSIONS: Array<{
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
},
// 学情诊断
{
prefix: "/shell/teacher/diagnostics/",
config: {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["DIAGNOSTIC_READ", "DIAGNOSTIC_MANAGE"],
},
},
// P2 迁移B2 教师域):课程计划子路由(含 /shell/teacher/course-plans/[id]
// 复用 LESSON_PLAN_READ/CREATE/UPDATE同备课域
{
@@ -394,6 +603,17 @@ export const PREFIX_ROUTE_PERMISSIONS: Array<{
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
},
// P2 迁移B2 末 教师域AI 工作台子路由
// 覆盖 /shell/teacher/ai/ai-assist、/shell/teacher/ai/ai-lesson-plan、
// /shell/teacher/ai/ai-report 三个工作台子页面
// 无 AI_TEACHER_* 权限点student 有 AI_TUTOR_USE复用 CLASS_READ/CLASS_MANAGE
{
prefix: "/shell/teacher/ai/",
config: {
requiredRoles: ["teacher", "admin"],
anyOfPermissions: ["CLASS_READ", "CLASS_MANAGE"],
},
},
// 公告管理
{
prefix: "/shell/admin/announcements/",
@@ -402,6 +622,132 @@ export const PREFIX_ROUTE_PERMISSIONS: Array<{
requiredPermissions: ["ANNOUNCEMENT_MANAGE"],
},
},
// P5 管理域子路由ARCHITECTURE.md §9.4 B5 + admin-NeedTodo §四)
// 角色管理详情(/shell/admin/roles/[id]
{
prefix: "/shell/admin/roles/",
config: {
requiredRoles: ["admin"],
requiredPermissions: ["ROLE_READ"],
},
},
// 课程计划详情/编辑(/shell/admin/course-plans/[id] / [id]/edit
{
prefix: "/shell/admin/course-plans/",
config: {
requiredRoles: ["admin"],
anyOfPermissions: [
"LESSON_PLAN_READ",
"LESSON_PLAN_CREATE",
"LESSON_PLAN_UPDATE",
],
},
},
// 选修课详情/编辑(/shell/admin/elective/[id] / [id]/edit
{
prefix: "/shell/admin/elective/",
config: {
requiredRoles: ["admin"],
anyOfPermissions: ["ELECTIVE_READ", "ELECTIVE_MANAGE"],
},
},
// 教案详情(/shell/admin/lesson-plans/[planId]/view
{
prefix: "/shell/admin/lesson-plans/",
config: {
requiredRoles: ["admin"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
},
// 排课子页auto/changes/rules 已在 EXACT此处兜底 [id] 等动态路由)
{
prefix: "/shell/admin/scheduling/",
config: {
requiredRoles: ["admin"],
anyOfPermissions: ["SCHEDULE_AUTO", "SCHEDULE_ADJUST", "SCHEDULE_MANAGE"],
},
},
// ── student 前缀路由ARCHITECTURE.md §9.2 B3──────────
// 成绩报告卡(/shell/student/grades/report-card 已在 EXACT此处兜底子路由
{
prefix: "/shell/student/grades/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["GRADE_RECORD_READ"],
},
},
// 考试作答/结果子路由(/shell/student/exams/[id]/result、/[id]/take
{
prefix: "/shell/student/exams/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["EXAM_READ"],
},
},
// 作业提交/分析子路由(/shell/student/homework/[id]/submit、/[id]/analysis
{
prefix: "/shell/student/homework/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["HOMEWORK_READ"],
},
},
// 课程详情子路由(/shell/student/courses/[id]
{
prefix: "/shell/student/courses/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["CLASS_READ"],
},
},
// 课程计划详情子路由(/shell/student/course-plans/[id]
{
prefix: "/shell/student/course-plans/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
},
// 教案查看子路由(/shell/student/lesson-plans/[planId]/view
{
prefix: "/shell/student/lesson-plans/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["LESSON_PLAN_READ"],
},
},
// 教材阅读器子路由(/shell/student/textbooks/[id]/chapters
{
prefix: "/shell/student/textbooks/",
config: {
requiredRoles: ["student"],
requiredPermissions: ["TEXTBOOK_READ"],
},
},
// 练习会话子路由(/shell/student/practice/[sessionId]
{
prefix: "/shell/student/practice/",
config: {
requiredRoles: ["student"],
// 无 ADAPTIVE_PRACTICE_READ 权限点,复用 CLASS_READ与 EXACT 一致)
requiredPermissions: ["CLASS_READ"],
},
},
// 选修课详情子路由(/shell/student/elective/[id]
{
prefix: "/shell/student/elective/",
config: {
requiredRoles: ["student"],
anyOfPermissions: ["ELECTIVE_READ", "ELECTIVE_SELECT"],
},
},
// 公告详情子路由(/shell/announcements/[id],共享)
{
prefix: "/shell/announcements/",
config: {
requiredPermissions: ["DASHBOARD_READ"],
},
},
// P1-3dev 模板预览页(仅登录可访问,运行时由 notFound() 拒绝生产访问)
// ARCHITECTURE.md §10 P1-3/shell/dev/templates/* 仅 dev 可见
// 注Next.js 私有文件夹以 _ 开头会被排除路由,故使用 `dev` 而非 `_dev`