4.2 KiB
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" (混合路由) 策略:
- Explicit Dashboard Routing: Dashboards are separated by role in the file structure (e.g.,
/teacher/dashboard). - 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)
- Security: 可以在 Middleware 或 Layout 层级轻松对
/admin/*路径实施权限控制。 - Clarity: 开发者清楚知道“教师的试卷列表页”应该放在
src/app/(dashboard)/teacher/exams/page.tsx。 - Decoupling: 教师端和学生端的逻辑完全解耦,互不影响。
6. Action Items (执行计划)
- Refactor Dashboard: 将
src/app/(dashboard)/dashboard/page.tsx重构为 Dispatcher。 - Create Role Directories: 在
src/app/(dashboard)下创建teacher,student,admin目录。 - Move Components: 确保
src/modules结构清晰。