# `src/app/(dashboard)/{announcements,dashboard,management,messages,profile,settings}` 规范核查报告 > 核查日期:2026-06-18 > 核查范围:`src/app/(dashboard)/` 下的 announcements、dashboard、management、messages、profile、settings 子路由及其直接依赖的模块组件 > 依据文档: > - [项目规则](../.trae/rules/project_rules.md) > - [编码规范](../docs/standards/coding-standards.md) > - [架构影响地图 004](../docs/architecture/004_architecture_impact_map.md) > - [架构数据 005](../docs/architecture/005_architecture_data.json) > 应用技能:`vercel-react-best-practices`、`web-design-guidelines`(`web-artifacts-builder` 加载失败,界面优化建议已合并至 web-design-guidelines 章节) --- ## 一、核查文件清单 | 文件 | 行数 | 类型 | 用途 | |------|------|------|------| | [announcements/page.tsx](../src/app/(dashboard)/announcements/page.tsx) | 20 | RSC 页面 | 公告列表(普通用户) | | [dashboard/page.tsx](../src/app/(dashboard)/dashboard/page.tsx) | 18 | RSC 页面 | 角色路由分发 | | [management/grade/classes/page.tsx](../src/app/(dashboard)/management/grade/classes/page.tsx) | 31 | RSC 页面 | 年级班级管理 | | [management/grade/insights/page.tsx](../src/app/(dashboard)/management/grade/insights/page.tsx) | 243 | RSC 页面 | 年级作业洞察 | | [messages/page.tsx](../src/app/(dashboard)/messages/page.tsx) | 31 | RSC 页面 | 消息+通知列表 | | [messages/[id]/page.tsx](../src/app/(dashboard)/messages/[id]/page.tsx) | 30 | RSC 页面 | 消息详情 | | [messages/compose/page.tsx](../src/app/(dashboard)/messages/compose/page.tsx) | 34 | RSC 页面 | 撰写消息 | | [profile/page.tsx](../src/app/(dashboard)/profile/page.tsx) | 305 | RSC 页面 | 个人资料(学生/教师视图) | | [settings/page.tsx](../src/app/(dashboard)/settings/page.tsx) | 32 | RSC 页面 | 设置入口(按角色分发) | | [settings/security/page.tsx](../src/app/(dashboard)/settings/security/page.tsx) | 50 | RSC 页面 | 安全设置 | | [layout.tsx](../src/app/(dashboard)/layout.tsx) | 21 | RSC 布局 | Dashboard 通用布局 | | [error.tsx](../src/app/(dashboard)/error.tsx) | 22 | 客户端组件 | 错误边界 | | [not-found.tsx](../src/app/(dashboard)/not-found.tsx) | 23 | RSC 组件 | 404 页面 | | [modules/announcements/components/announcement-list.tsx](../src/modules/announcements/components/announcement-list.tsx) | 108 | 客户端组件 | 公告列表(含筛选) | | [modules/announcements/components/announcement-card.tsx](../src/modules/announcements/components/announcement-card.tsx) | 79 | 客户端组件 | 公告卡片 | | [modules/announcements/components/announcement-detail.tsx](../src/modules/announcements/components/announcement-detail.tsx) | 206 | 客户端组件 | 公告详情 | | [modules/messaging/components/message-list.tsx](../src/modules/messaging/components/message-list.tsx) | 117 | 客户端组件 | 消息列表 | | [modules/messaging/components/message-detail.tsx](../src/modules/messaging/components/message-detail.tsx) | 153 | 客户端组件 | 消息详情 | | [modules/messaging/components/message-compose.tsx](../src/modules/messaging/components/message-compose.tsx) | 146 | 客户端组件 | 撰写消息表单 | | [modules/messaging/components/notification-list.tsx](../src/modules/messaging/components/notification-list.tsx) | 141 | 客户端组件 | 通知列表 | | [modules/settings/components/admin-settings-view.tsx](../src/modules/settings/components/admin-settings-view.tsx) | 129 | 客户端组件 | 管理员设置视图 | | [modules/settings/components/teacher-settings-view.tsx](../src/modules/settings/components/teacher-settings-view.tsx) | 132 | 客户端组件 | 教师设置视图 | | [modules/settings/components/student-settings-view.tsx](../src/modules/settings/components/student-settings-view.tsx) | 120 | 客户端组件 | 学生设置视图 | | [modules/settings/components/password-change-form.tsx](../src/modules/settings/components/password-change-form.tsx) | 180 | 客户端组件 | 修改密码表单 | | [modules/settings/components/profile-settings-form.tsx](../src/modules/settings/components/profile-settings-form.tsx) | 198 | 客户端组件 | 资料编辑表单 | | [modules/settings/components/notification-preferences-form.tsx](../src/modules/settings/components/notification-preferences-form.tsx) | 260 | 客户端组件 | 通知偏好表单 | | [modules/settings/components/theme-preferences-card.tsx](../src/modules/settings/components/theme-preferences-card.tsx) | 60 | 客户端组件 | 主题偏好 | | [modules/settings/components/ai-provider-settings-card.tsx](../src/modules/settings/components/ai-provider-settings-card.tsx) | 405 | 客户端组件 | AI Provider 配置 | | [modules/classes/components/grade-classes-view.tsx](../src/modules/classes/components/grade-classes-view.tsx) | 455 | 客户端组件 | 年级班级管理视图 | --- ## 二、违规问题清单 ### 2.1 [announcements/page.tsx](../src/app/(dashboard)/announcements/page.tsx) — 严重度:高 #### BUG-A01:缺少权限校验(违反 Server Action 规范) - **位置**:`src/app/(dashboard)/announcements/page.tsx:6-7` - **问题**:页面直接调用 `getAnnouncements({ status: "published" })`,未通过 `requirePermission()` 或 `requireAuth()` 进行任何权限校验 - **规范依据**:项目规则「Server Action 必须使用 `requirePermission()` 进行权限校验」;架构文档 004 已记录此问题(P2-12) - **影响**:未登录用户可直接访问 `/announcements` 路由获取公告数据,存在信息泄露风险 - **改进建议**: ```typescript import { requirePermission } from "@/shared/lib/auth-guard" import { Permissions } from "@/shared/types/permissions" export default async function AnnouncementsPage() { await requirePermission(Permissions.ANNOUNCEMENT_READ) const announcements = await getAnnouncements({ status: "published" }) // ... } ``` #### BUG-A02:缺少 `metadata` 导出 - **位置**:`src/app/(dashboard)/announcements/page.tsx` - **问题**:未导出 `metadata`,浏览器标签页无标题 - **规范依据**:Web Interface Guidelines — Metadata & SEO - **改进建议**:补充 `export const metadata = { title: "Announcements" }` --- ### 2.2 [dashboard/page.tsx](../src/app/(dashboard)/dashboard/page.tsx) — 严重度:中 #### BUG-D01:使用权限反推角色(硬编码反模式) - **位置**:`src/app/(dashboard)/dashboard/page.tsx:14-16` - **问题**:使用 `permissions.includes(HOMEWORK_SUBMIT) && !permissions.includes(EXAM_CREATE)` 反推学生身份,应使用 `hasRole("student")` - **规范依据**:项目规则「前端组件禁止使用 `role === "xxx"` 硬编码,统一使用 `usePermission().hasPermission()`」;架构文档 004 已标记此为 P2 问题 - **影响**:当学生被授予 `EXAM_CREATE` 权限(如助教)时会被错误路由到教师页面 - **改进建议**:服务端应使用 `session.user.roles` 判断 ```typescript const roles = session.user.roles ?? [] if (roles.includes("admin")) redirect("/admin/dashboard") if (roles.includes("student")) redirect("/student/dashboard") if (roles.includes("parent")) redirect("/parent/dashboard") redirect("/teacher/dashboard") ``` #### BUG-D02:多重 `redirect` 调用难以维护 - **位置**:`src/app/(dashboard)/dashboard/page.tsx:14-17` - **问题**:4 个连续 `if + redirect` 缺乏优先级文档说明,新增角色时易遗漏 - **改进建议**:抽取为 `resolveDefaultPath(roles)` 单一函数(`proxy.ts` 已有类似实现),保持单一职责 --- ### 2.3 [management/grade/classes/page.tsx](../src/app/(dashboard)/management/grade/classes/page.tsx) — 严重度:高 #### BUG-M01:缺少权限校验 - **位置**:`src/app/(dashboard)/management/grade/classes/page.tsx:7-15` - **问题**:仅调用 `auth()` 获取 session,未调用 `requirePermission()` 校验 `CLASS_MANAGE` 权限 - **规范依据**:项目规则「Server Action 必须使用 `requirePermission()` 进行权限校验」 - **影响**:无 `CLASS_MANAGE` 权限的用户可访问页面并获取教师列表、年级数据 - **改进建议**: ```typescript import { requirePermission } from "@/shared/lib/auth-guard" import { Permissions } from "@/shared/types/permissions" export default async function GradeClassesPage() { const ctx = await requirePermission(Permissions.CLASS_MANAGE) const userId = ctx.userId // ... } ``` #### BUG-M02:`userId` 兜底为空字符串存在隐患 - **位置**:`src/app/(dashboard)/management/grade/classes/page.tsx:9` - **问题**:`const userId = session?.user?.id ?? ""` 在未登录时返回空字符串,下游 `getGradeManagedClasses("")` 会查询无意义数据 - **改进建议**:未登录应直接 `redirect("/login")`,不应继续执行 --- ### 2.4 [management/grade/insights/page.tsx](../src/app/(dashboard)/management/grade/insights/page.tsx) — 严重度:高 #### BUG-MI01:缺少权限校验 - **位置**:`src/app/(dashboard)/management/grade/insights/page.tsx:25-34` - **问题**:页面直接调用 `getTeacherIdForMutations()` 和 `getGradesForStaff()`,未调用 `requirePermission()` - **规范依据**:项目规则「Server Action 必须使用 `requirePermission()` 进行权限校验」 - **改进建议**:增加 `requirePermission(Permissions.HOMEWORK_READ)` 或对应年级负责人权限校验 #### BUG-MI02:使用原生 `` 元素,与项目其他页面使用的 shadcn `Select` 组件风格不一致 - **规范依据**:Web Interface Guidelines — Consistency;项目组件规范 - **影响**:视觉风格不统一,无障碍特性差异,主题切换时原生 select 样式无法跟随 - **改进建议**:替换为 shadcn `Select` 组件 #### BUG-MI03:`