> ⚠️ **已归档文档**
> 本文档是 2025-12-23 提出的角色路由 RFC（Status: 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）：仅可查看自己被分配的学科相关内容。
- 实现要点：
  - 数据访问层通过“会话用户身份”与“学科分配表”联合过滤，防止越权。
  - 页面与组件保持不变，由后端/数据访问层保证返回范围正确的聚合数据。
