Files
CICD/docs/architecture/002_role_based_routing.md
SpecialX e7c902e8e1
Some checks failed
CI / build-and-test (push) Failing after 1m31s
CI / deploy (push) Has been skipped
Module Update
2025-12-30 14:42:30 +08:00

4.2 KiB

Architecture RFC: Role-Based Routing & Directory Structure

Status: PROPOSED Date: 2025-12-23 Context: Next_Edu supports multiple roles (Admin, Teacher, Student, Parent) with distinct UI/UX requirements.

1. 核心问题 (The Problem)

目前项目结构中,页面与角色耦合不清。

  • /dashboard 目前硬编码为教师视图。
  • 不同角色的功能模块(如“课程”)可能有完全不同的视图和逻辑(教师管理课程 vs 学生学习课程)。
  • 缺乏统一的路由规范指导开发人员“把页面放哪里”。

2. 解决方案:基于角色的路由策略 (Role-Based Routing Strategy)

我们采用 "Hybrid Routing" (混合路由) 策略:

  1. Explicit Dashboard Routing: Dashboards are separated by role in the file structure (e.g., /teacher/dashboard).
  2. Explicit Role Scopes (显式角色域): 具体的业务功能页面放入 /teacher, /student, /admin 专属路径下。

2.1 目录结构 (Directory Structure)

src/app/(dashboard)/
├── layout.tsx                # Shared App Shell (Sidebar, Header)
├── dashboard/
│   └── page.tsx              # [Redirector] Redirects to role-specific dashboard
│
├── teacher/                  # 教师专属路由域
│   ├── dashboard/            # Teacher Dashboard
│   │   └── page.tsx
│   ├── classes/
│   │   └── page.tsx
│   ├── exams/
│   │   └── page.tsx
│   └── textbooks/
│       └── page.tsx
│
├── student/                  # 学生专属路由域
│   ├── dashboard/            # Student Dashboard
│   │   └── page.tsx
│   ├── learning/
│   │   └── page.tsx
│   └── schedule/
│       └── page.tsx
│
└── admin/                    # 管理员专属路由域
    ├── dashboard/            # Admin Dashboard
    │   └── page.tsx
    ├── users/
    └── school/

2.2 Dashboard Routing Logic

/dashboard 页面现在作为一个 Portal (入口)Redirector (重定向器),而不是直接渲染内容。

Example: src/app/(dashboard)/dashboard/page.tsx

import { redirect } from "next/navigation";
import { auth } from "@/auth";

export default async function DashboardPage() {
  const session = await auth();
  const role = session?.user?.role;

  switch (role) {
    case "teacher":
      redirect("/teacher/dashboard");
    case "student":
      redirect("/student/dashboard");
    case "admin":
      redirect("/admin/dashboard");
    default:
      redirect("/login");
  }
}

3. 模块化组织 (Module Organization)

为了避免 src/app 变得臃肿,具体的业务组件必须存放在 src/modules 中。

src/modules/
├── teacher/                  # 教师业务领域
│   ├── components/           # 仅教师使用的组件 (e.g., GradebookTable)
│   ├── hooks/
│   └── actions.ts
│
├── student/                  # 学生业务领域
│   ├── components/           # (e.g., CourseProgressCard)
│   └── ...
│
├── shared/                   # 跨角色共享
│   ├── components/           # (e.g., CourseCard - if generic)

4. 路由与导航配置 (Navigation Config)

src/modules/layout/config/navigation.ts 已经配置好了基于角色的菜单。

  • 当用户访问 /dashboard 时,根据角色看到不同的 Dashboard 组件。
  • 点击侧边栏菜单(如 "Exams")时,跳转到显式路径 /teacher/exams

5. 优势 (Benefits)

  1. Security: 可以在 Middleware 或 Layout 层级轻松对 /admin/* 路径实施权限控制。
  2. Clarity: 开发者清楚知道“教师的试卷列表页”应该放在 src/app/(dashboard)/teacher/exams/page.tsx
  3. Decoupling: 教师端和学生端的逻辑完全解耦,互不影响。

6. Action Items (执行计划)

  1. Refactor Dashboard: 将 src/app/(dashboard)/dashboard/page.tsx 重构为 Dispatcher。
  2. Create Role Directories: 在 src/app/(dashboard) 下创建 teacher, student, admin 目录。
  3. Move Components: 确保 src/modules 结构清晰。