Files
CICD/docs/architecture/002_role_based_routing.md
SpecialX 538805bad0 docs
2026-03-02 12:43:38 +08:00

128 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`**
```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` 结构清晰。
---
## 7. RBAC 扩展2026-03-02
为满足班级维度的权限差异,在教师角色下新增学科粒度的访问控制:
- 班主任Class Head Teacher可查看班级内所有学科相关的数据与统计。
- 任课老师Subject Teacher仅可查看自己被分配的学科相关内容。
- 实现要点:
- 数据访问层通过“会话用户身份”与“学科分配表”联合过滤,防止越权。
- 页面与组件保持不变,由后端/数据访问层保证返回范围正确的聚合数据。