Files
NextEdu/docs/architecture/002_role_based_routing.md
SpecialX f8dfd1dddd docs: 全项目架构审查与文档体系重写
- 全项目逐文件审查: 4 份审计报告(shared/core-business/management/new-modules)
- 重写 004 架构影响地图: 图优先 + 模块依赖图 + 数据流 + 调用链 + 问题分级
- 更新 005 结构化数据: 新增 architectureOverview/moduleDependencyGraph/knownIssues/dbTables 节点
- 更新 006 功能清单: 143 项功能标注实现状态, P0 覆盖率 80%->92%
- 更新 007 差距审计: v2->v3, P0 完成 69%->84%, 新增架构技术债章节
- 更新 001 项目概览: 6 角色/54 权限/26 模块/54 表
- 新增 docs/README.md 文档索引
- 归档 11 份过时文档(002x2/003/designx8) 标注
- 更新 work_log
2026-06-17 21:51:32 +08:00

135 lines
5.1 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.
> ⚠️ **已归档文档**
> 本文档是 2025-12-23 提出的角色路由 RFCStatus: PROPOSED描述的是路由策略提案。
> 当前该提案已全部实现——`/admin`、`/teacher`、`/student`、`/parent`、`/management` 角色域路由已落地,详见 [004 架构影响地图](./004_architecture_impact_map.md) 的 routes 章节。
> 保留用于历史参考,不再维护。
---
# 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仅可查看自己被分配的学科相关内容。
- 实现要点:
- 数据访问层通过“会话用户身份”与“学科分配表”联合过滤,防止越权。
- 页面与组件保持不变,由后端/数据访问层保证返回范围正确的聚合数据。