Files
NextEdu/bugs/others_bug_v4.md
SpecialX 27db170c0a docs: update architecture docs, audit reports, and bug tracking
- Update architecture impact map, data, feature checklist, gap audit

- Add audit reports for dashboard, exam-homework, grades-diagnostic, settings-profile, textbooks

- Update bug reports (admin, teacher, lesson-preparation, others, shared)

- Update coding standards, DR plan, design docs, and README
2026-06-23 17:36:18 +08:00

511 lines
33 KiB
Markdown
Raw Permalink 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.
# 前端功能模块与用户体验深度审查报告 v4
> 审查范围:`src/app/(dashboard)/{announcements,dashboard,management,messages,profile,settings}` 及相关 `modules/*/components`
> 审查维度:功能模块合理性、页面布局、用户使用习惯、同类产品对比、缺陷与不足
> 审查日期2026-06-20
> 审查方法5 个子代理并行深度审查 + 同类产品对比分析
---
## 一、总体结论
本次审查覆盖 6 大模块、50+ 页面、100+ 组件,共发现 **201 个问题**,分布如下:
| 严重程度 | 数量 | 占比 |
|----------|------|------|
| P0阻断/安全) | 14 | 7% |
| P1重要功能缺失 | 52 | 26% |
| P2体验/功能不完整) | 81 | 40% |
| P3优化建议 | 54 | 27% |
### 核心发现
1. **安全漏洞集中爆发**14 个 P0 问题中有 12 个是权限校验缺失,涉及 admin 下几乎所有页面,任何登录用户可访问管理后台数据
2. **功能完整性严重不足**:消息模块处于 MVP 阶段,缺草稿/群发/搜索/附件/实时推送;公告模块定向推送完全失效;设置模块缺 2FA/登录历史/设备管理
3. **用户体验与同类产品差距显著**:对比钉钉/企业微信/飞书/Google Classroom/PowerSchool在实时性、批量操作、搜索筛选、数据可视化等方面全面落后
4. **中英文混排严重**:管理后台页面标题中文、组件 UI 英文、注释中文,缺乏统一 i18n 策略
5. **基础设施缺失**:大量路由缺少 loading.tsx/error.tsx列表页缺少分页/搜索/批量操作
---
## 二、Dashboard 仪表盘模块31 个问题)
### 2.1 P0 严重问题4 个)
#### D-P0-1 多角色用户重定向逻辑存在优先级冲突
- **文件**`src/app/(dashboard)/dashboard/page.tsx` 第 10-15 行
- **问题**:用户同时拥有多角色(如 admin+teacher`admin → student → parent → teacher` 硬编码优先级重定向,用户无法选择以其他角色进入。`app-sidebar.tsx` 第 35-42 行同样逻辑重复
- **同类对比**:钉钉/企业微信均支持角色切换器
- **改进建议**SiteHeader 增加角色切换下拉菜单,所选角色持久化到 cookie
- **严重程度**P0
#### D-P0-2 StudentStatsGrid 接收的 props 与实际渲染不一致
- **文件**`src/modules/dashboard/components/student-dashboard/student-stats-grid.tsx` 第 6-16 行
- **问题**:组件声明 5 个 propsenrolledClassCount、dueSoonCount、overdueCount、gradedCount、ranking但只渲染 3 个。`enrolledClassCount``gradedCount` 完全未使用,学生仪表盘缺失"已选课程数"和"已评分作业数"
- **改进建议**:补全 4 个 StatCard 渲染
- **严重程度**P0
#### D-P0-3 Teacher/Parent 仪表盘缺少 loading.tsx 和 error.tsx
- **文件**`src/app/(dashboard)/teacher/dashboard/``src/app/(dashboard)/parent/dashboard/``src/app/(dashboard)/dashboard/` 三个目录
- **问题**:对比 student/dashboard 有 loading.tsxteacher/parent 仪表盘在网络慢或数据加载失败时白屏。teacher/dashboard 并行请求 6 个数据源,任一失败整页崩溃
- **改进建议**:三个目录各添加 loading.tsx骨架屏和 error.tsx错误边界+重试)
- **严重程度**P0
#### D-P0-4 TeacherDashboardHeader 硬编码"Good morning"问候语
- **文件**`src/modules/dashboard/components/teacher-dashboard/teacher-dashboard-header.tsx` 第 18 行
- **问题**:标题始终显示 `Good morning`,未根据时间动态切换。而 student-dashboard-header.tsx 第 9-13 行和 parent-dashboard.tsx 第 13-17 行都正确实现了按时段问候
- **改进建议**:复用 student 的问候逻辑,抽取到 `shared/lib/greeting.ts`
- **严重程度**P0
### 2.2 P1 重要问题7 个)
| 编号 | 文件 | 问题 | 改进建议 |
|------|------|------|----------|
| D-P1-1 | admin-dashboard.tsx 第 13-31 行 | AdminDashboard 缺少快捷操作入口(创建用户/发公告/调课表) | PageHeader actions 增加 Button |
| D-P1-2 | admin-dashboard.tsx 全文 | 缺少"待办事项""系统健康""今日关键事件""最近登录日志"模块 | 增加 Pending Approvals 和 System Health 卡片 |
| D-P1-3 | teacher-dashboard-view.tsx 第 36-42 行 | 未清理的注释和 `a.submittedAt!` 非空断言违反项目规则 | 清理注释,改为显式过滤 |
| D-P1-4 | student-dashboard-view.tsx 第 31-39 行 | Student 仪表盘布局比例失衡col-span 嵌套混乱,缺少课程进度/出勤率/学习时长 | 修正 col-span增加 Attendance Summary 卡片 |
| D-P1-5 | parent-dashboard.tsx 全文 | Parent 仪表盘缺少多子女对比视图、学校通知摘要、家长会预约、子女今日课表 | 增加 "Today at a Glance" 聚合区域 |
| D-P1-6 | app-sidebar.tsx 第 35-42 行 vs dashboard/page.tsx 第 12-15 行 | 角色判断逻辑重复且 fallback 到 teacher 导航可能展示无权限菜单 | 抽取 getPrimaryRole 工具函数fallback 返回空数组 |
| D-P1-7 | site-header.tsx 第 70 行 | 面包屑过滤基于 title 而非 segment逻辑脆弱 | 改为基于 segment 过滤 |
### 2.3 P2/P3 问题20 个,略)
详见子报告主要包括col-span 冲突、ScrollArea 固定高度违反任意值规则、animate-pulse 可访问性、Avatar src 硬编码 undefined、metadata 不一致、toWeekday 函数重复、空状态文案语言不一致、缺少 focus-visible 样式、status 未本地化、缺少返回顶部、移动端搜索隐藏、表格无横向滚动、无数据刷新机制等。
### 2.4 同类产品对比
| 功能 | Google Classroom | 钉钉教育 | PowerSchool | 本项目 | 差距 |
|------|------------------|----------|-------------|--------|------|
| 首屏待办聚合 | ✅ | ✅ | ✅ | 部分角色有 | Parent 缺失 |
| 快速创建按钮 | ✅ "+" 浮动 | ✅ | ✅ | 仅 Teacher | Admin/Student 缺失 |
| 多子女对比 | N/A | ✅ | ✅ | ❌ | 缺失 |
| 出勤率热力图 | ❌ | ✅ | ✅ | ❌ | 缺失 |
| 数据大屏 | ❌ | ✅ | ✅ | 基础统计 | 不如图表化 |
| 课表打印 | ❌ | ✅ | ✅ | ❌ | 缺失 |
---
## 三、Announcements 公告模块31 个问题)
### 3.1 P0 严重问题4 个)
#### A-P0-1 管理端列表页缺失权限校验
- **文件**`src/app/(dashboard)/admin/announcements/page.tsx` 第 20-32 行
- **问题**:未调用 `requirePermission(Permissions.ANNOUNCEMENT_MANAGE)`,任何登录用户可访问 `/admin/announcements` 查看所有状态公告(含草稿)和全部年级数据
- **对比**:同目录 `/admin/audit-logs/page.tsx` 第 27 行、`/admin/files/page.tsx` 第 20 行均有权限校验
- **改进建议**:增加 `await requirePermission(Permissions.ANNOUNCEMENT_MANAGE)`
- **严重程度**P0
#### A-P0-2 管理端编辑页缺失权限校验
- **文件**`src/app/(dashboard)/admin/announcements/[id]/page.tsx` 第 16-28 行
- **问题**:任何登录用户可查看任意公告完整内容(含草稿)及编辑表单
- **改进建议**:同上
- **严重程度**P0
#### A-P0-3 公告定向推送完全失效——无受众过滤
- **文件**`src/modules/announcements/data-access.ts` 第 50-88 行
- **问题**`getAnnouncements` 仅按 status 和 type 过滤,完全不根据用户年级/班级过滤 `targetGradeId``targetClassId`。学生 A高一能看到定向给"高二"的年级公告,定向推送名存实亡
- **改进建议**:增加 `audience?: { gradeId?, classId?, roles? }` 参数,查询条件增加 `(type='school') OR (type='grade' AND target_grade_id=:userGradeId) OR (type='class' AND target_class_id=:userClassId)`
- **严重程度**P0
#### A-P0-4 dashboard 布局无认证守卫admin 路由无布局级权限拦截
- **文件**`src/app/(dashboard)/layout.tsx``src/app/(dashboard)/admin/` 无 layout.tsx
- **问题**dashboard 布局仅渲染 Sidebar/Header无认证检查。admin/ 目录无 layout.tsx 做统一 admin 角色守卫。项目根目录无 middleware.ts 做路由级拦截
- **改进建议**:新增 `src/app/(dashboard)/admin/layout.tsx` 增加 `await requireRole("admin")`,或新增 `middleware.ts``/admin/*` 拦截
- **严重程度**P0
### 3.2 P1 重要问题8 个)
| 编号 | 文件 | 问题 | 改进建议 |
|------|------|------|----------|
| A-P1-1 | announcements/ 目录 | 用户端无公告详情页,用户只能看标题+3行摘要无法查看完整正文 | 新增 `/announcements/[id]/page.tsx` |
| A-P1-2 | actions.ts 第 164-184 行 | 发布公告时不触发任何通知,通知基础设施已就绪但未接入 | publishAnnouncementAction 成功后调用 sendBatchNotifications |
| A-P1-3 | announcement-form.tsx | 定时发布功能完全不可用publishedAt 无 UI 输入,无调度器 | 表单增加日期时间选择器,新增 Vercel Cron Job |
| A-P1-4 | admin/announcements/page.tsx 第 29-32 行 | 班级定向公告完全不可用classes 数据未传递,班级下拉为空 | 并行调用 getClasses() 传入 |
| A-P1-5 | data-access.ts 第 50-88 行 | 无分页 UIdata-access 支持但页面未传入 page 参数,超过 20 条看不到 | 增加分页控件 |
| A-P1-6 | data-access.ts | 无关键词搜索 | 增加 keyword 参数和搜索框 |
| A-P1-7 | announcement-form.tsx 第 102-112 行 | 无富文本编辑,仅纯文本 Textarea | 集成 TipTap/LexicalDOMPurify 清洗 |
| A-P1-8 | schema.ts 第 3-21 行 | 表单未校验定向目标,可创建 type=grade 但 targetGradeId=null 的无效公告 | Zod superRefine 条件校验 |
### 3.3 P2/P3 问题19 个,略)
主要包括:无置顶功能、无阅读回执/已读统计、无附件/图片支持、无预览功能、无评论/反馈、不支持按角色定向、无法撤回已发布、客户端过滤与服务端过滤重复、无模板功能、无 loading.tsx、无分类标签、hidden input 冗余、formatDate 不显示时间、UI 中英文混杂、架构图与代码不一致、isWorking 状态未阻止重复提交、Dialog 关闭表单状态残留等。
### 3.4 同类产品对比
| 功能 | 钉钉公告 | 企业微信 | 飞书公告 | 本项目 | 差距 |
|------|---------|---------|---------|--------|------|
| 富文本编辑 | ✅ | ✅ | ✅ | 仅纯文本 | P1 |
| 附件/图片 | ✅ | ✅ | ✅ | ❌ | P2 |
| 置顶 | ✅ | ✅ | ✅ | ❌ | P2 |
| 阅读回执 | ✅ | ✅ | ✅ | ❌ | P2 |
| 定向推送 | ✅ | ✅ | ✅ | 仅年级/班级且过滤失效 | P0+P2 |
| 定时发布 | ✅ | ✅ | ✅ | 字段存在但无 UI | P1 |
| 预览 | ✅ | ✅ | ✅ | ❌ | P2 |
| 消息通知联动 | ✅ | ✅ | ✅ | ❌(基础设施已就绪) | P1 |
| 评论/反馈 | 部分 | ❌ | ✅ | ❌ | P2 |
| 撤回 | ✅ | ✅ | ✅ | 仅归档/删除 | P2 |
| 模板 | ✅ | ❌ | ✅ | ❌ | P2 |
---
## 四、Messages 消息模块38 个问题)
### 4.1 P0 严重问题3 个)
#### M-P0-1 缺少草稿箱
- **文件**`src/modules/messaging/data-access.ts``src/shared/db/schema.ts` 第 898-914 行
- **问题**`messages` 表无 `isDraft`/`status` 字段,无草稿相关 Action。用户在 MessageCompose 中输入内容后点击"取消"直接丢弃,无自动保存
- **改进建议**:新增 `status` 字段draft/sent/trash/archived撰写组件添加自动保存每 30 秒)和"存为草稿"按钮
- **严重程度**P0
#### M-P0-2 缺少群发消息、班级消息
- **文件**`src/modules/messaging/components/message-compose.tsx` 第 85 行;`src/modules/messaging/schema.ts` 第 3-9 行
- **问题**`receiverId` 是单个字符串,使用单选 Select无法群发。K12 场景下教师给全班学生发消息是高频需求
- **改进建议**`receiverId` 改为 `receiverIds: string[]`,使用多选 Combobox支持按班级/年级批量选择
- **严重程度**P0
#### M-P0-3 完全无实时推送机制
- **文件**:全项目 Grep `websocket|socket.io|sse|EventSource|realtime` 在 messaging/notifications 模块无任何匹配
- **问题**:消息和通知完全依赖页面刷新或手动 router.refresh()。教师发消息后学生看不到,除非主动刷新。与 IM 类产品实时性预期严重不符
- **改进建议**:引入 SSEServer-Sent Events或 WebSocket实现新消息实时推送、未读计数实时更新、在线状态指示
- **严重程度**P0
### 4.2 P1 重要问题14 个)
| 编号 | 文件 | 问题 | 改进建议 |
|------|------|------|----------|
| M-P1-1 | messages/page.tsx 第 22-34 行 | 消息列表与通知列表垂直堆叠,信息架构混乱 | 三栏布局或通知拆分独立 Tab |
| M-P1-2 | messages/page.tsx 第 18 行 | 无分页 UI仅加载前 50 条getMessagesAction 返回 totalPages 未消费 | 添加分页器或无限滚动 |
| M-P1-3 | message-detail.tsx 全文 | 无会话线程视图getMessageThread 已实现但未使用 | 改为会话视图,底部固定回复输入框 |
| M-P1-4 | message-list.tsx 第 18 行 | 缺少星标、垃圾箱、归档deleteMessage 是硬删除不可恢复 | 扩展表结构,改为软删除 |
| M-P1-5 | message-list.tsx 全文 | 缺少搜索、筛选、排序 | getMessages 增加 keyword/isRead/dateFrom/sortBy 参数 |
| M-P1-6 | schema.ts / message-compose.tsx | 缺少附件支持messages 表无 attachments 字段 | 新增 message_attachments 表,集成 FileUpload |
| M-P1-7 | message-detail.tsx 第 85-100 行 | 缺少消息撤回、转发 | 新增 recallMessageAction限时 2 分钟),转发入口 |
| M-P1-8 | navigation.ts 第 96-99 行 | 导航栏 Messages 无未读红点getUnreadMessageCount 已实现但未调用 | 在 sidebar 渲染未读数 Badge轮询或 SSE 推送 |
| M-P1-9 | message-compose.tsx 第 85-97 行 | 收件人选择体验差,原生 Select 无搜索无分组all scope 一次性返回所有用户 | 改用 Combobox + 搜索,后端支持分页 |
| M-P1-10 | 全模块 | 对比同类产品缺失群聊、@提及、消息反应、置顶、模板、定时发送、已读详情、引用回复、语音消息 | 按优先级分批实现 |
| M-P1-11 | notification-dropdown.tsx 第 41-54 行 | 通知下拉仅加载一次无实时刷新unreadCount 只计算初始 10 条 | 添加轮询或 SSE从专门接口获取未读总数 |
| M-P1-12 | preferences.ts 第 47-56 行 | 缺少免打扰模式和安静时段22:00-07:00K12 家长晚间不希望被打扰是强需求 | 新增 quietHoursStart/quietHoursEnd/vacationMode 字段 |
| M-P1-13 | data-access.ts 第 157-161 行 | 发送方删除消息会导致接收方也丢失(硬删除) | 改为软删除 + senderDeletedAt/receiverDeletedAt |
| M-P1-14 | data-access.ts | 无历史消息搜索,家长可能需要搜索上学期教师发的通知 | getMessages 增加 keyword 参数 |
### 4.3 P2/P3 问题21 个,略)
主要包括:撰写页是整页跳转非抽屉、列表项缺少星标/附件/分类标识、缺少富文本、已读回执不完整、回复 subject 通过 URL 传递、通知类型映射语义错误、通知偏好无法按类别选择渠道、微信渠道形同虚设users 表无 wechat_open_id、通知列表与下拉内容重复、权限粒度过粗、学生互发限制未在 UI 提示、管理员删除消息权限矛盾、无归档功能、无 loading.tsx/error.tsx、客户端过滤导致数据不一致、parentMessageId 无外键约束、getMessageThread 仅一层非递归、notification-dropdown 归属 messaging 模块错误、receiverId 状态管理冗余、无键盘快捷键、notFound() 后无自定义 404 等。
### 4.4 同类产品对比
| 功能 | 钉钉消息 | 企业微信 | 飞书邮件 | 本项目 | 差距 |
|------|---------|---------|---------|--------|------|
| 群聊/群组 | ✅ | ✅ | ✅ | ❌ | P0 |
| 草稿箱 | ✅ | ✅ | ✅ | ❌ | P0 |
| 实时推送 | ✅ | ✅ | ✅ | ❌ | P0 |
| 消息搜索 | ✅ | ✅ | ✅ | ❌ | P1 |
| 附件支持 | ✅ | ✅ | ✅ | ❌ | P1 |
| 消息撤回 | ✅ | ✅ | ✅ | ❌ | P1 |
| @提及 | ✅ | ✅ | ✅ | ❌ | P2 |
| 消息模板 | ✅ | 部分 | ✅ | ❌ | P2 |
| 定时发送 | ✅ | ❌ | ✅ | ❌ | P2 |
| 已读详情 | ✅ | ✅ | ✅ | ❌ | P2 |
| 免打扰时段 | ✅ | ✅ | ✅ | ❌ | P1 |
---
## 五、Management 管理模块52 个问题)
### 5.1 P0 严重问题1 类,涉及 10 个页面)
#### MG-P0-1 多个 admin 页面缺少权限校验
- **涉及文件**10 个):
- `admin/school/schools/page.tsx`
- `admin/school/academic-year/page.tsx`
- `admin/school/classes/page.tsx`
- `admin/school/departments/page.tsx`
- `admin/school/grades/page.tsx`
- `admin/school/grades/insights/page.tsx`
- `admin/users/import/page.tsx`
- `admin/scheduling/auto/page.tsx`
- `admin/scheduling/changes/page.tsx`
- `admin/scheduling/rules/page.tsx`
- **问题**:以上页面均未调用 `requirePermission()`,任何登录用户可直接访问所有 admin 管理页面,查看/操作学校、年级、班级、部门、学年、用户导入、排课等敏感数据
- **对比**`admin/audit-logs/page.tsx``admin/files/page.tsx``management/grade/classes/page.tsx` 均正确实现了权限校验
- **改进建议**:各页面函数体首行添加对应 `requirePermission()` 调用
- **严重程度**P0
### 5.2 P1 重要问题9 个)
| 编号 | 文件 | 问题 | 改进建议 |
|------|------|------|----------|
| MG-P1-1 | 全模块 | 中英文混排严重不一致,页面标题中文、组件 UI 英文、注释中文 | 统一为中文(面向 K12 中文用户) |
| MG-P1-2 | navigation.ts | 文件管理页面未在导航中注册,用户无法通过侧边栏访问 | admin 配置添加 Files 菜单项 |
| MG-P1-3 | navigation.ts 第 58 行 | 用户导入入口放在"School Management"下,且整个系统无用户管理主页面 | 创建独立 "Users" 一级菜单 |
| MG-P1-4 | 多个子路由 | 子路由缺少 loading.tsx 和 error.tsxmanagement/grade/ 完全不在 admin 路由树下 | 为每个子路由添加定制边界 |
| MG-P1-5 | 多个列表页 | 除审计日志外,几乎所有列表页面一次性加载全部数据,无服务端分页 | 添加 page/pageSize 参数和分页控件 |
| MG-P1-6 | 多个列表页 | 大部分列表页面缺少批量操作(批量删除/导出/编辑) | 添加复选框列和批量操作工具栏 |
| MG-P1-7 | 多个列表页 | 大部分列表页面缺少搜索和筛选 | 参考 grades-view.tsx 的实现 |
| MG-P1-8 | admin/school/page.tsx 第 6 行 | 重定向到 /admin/school/classes 跳过学校管理,层级不合理 | 改为 redirect("/admin/school/schools") |
| MG-P1-9 | admin-classes-view.tsx 第 233、247 行 | 学校和年级为自由文本输入,导致数据完整性问题 | 改为从 schools/grades 表查询的 Select |
### 5.3 P2/P3 问题42 个,略)
主要包括:原生 select 而非 shadcn Select、工具函数重复、formatDate 调用不一致、admin/files 硬编码 200 条上限、排课变更缺少筛选 UI、新建申请按钮链接到 teacher 页面、schedule-change-list 无分页、scheduling-rules-form 缺少表单验证、user-import-dialog 缺少文件大小校验、预览仅显示前 50 行、不支持拖拽上传、审计日志缺少用户搜索、数据变更日志显示原始 JSON 无 diff 视图、文件管理缺少上传者信息、缺少排序功能、使用原生 a 标签、无批量审批、部门管理功能简陋、学校管理缺少搜索、学年管理缺少日期校验、admin-classes-view 与 grade-classes-view 代码重复、formatSubjectTeachers join 符号不一致、缺少面包屑导航、提交模式不一致、常量未提取、JSON.stringify 传递复杂数据、申请可提交空内容、无自动刷新、无导出功能、无重置按钮、统计仅显示前 N 项、UA 被截断、缺少空状态插图、无排序功能、缺少 dataScope 控制、缺少操作日志记录、缺少键盘快捷键、缺少数据导出、缺少数据可视化等。
### 5.4 同类产品对比
| 功能 | 钉钉管理后台 | 企业微信管理 | PowerSchool | 本项目 | 差距 |
|------|------------|------------|-------------|--------|------|
| 权限校验 | ✅ | ✅ | ✅ | 10 页面缺失 | P0 |
| 批量操作 | ✅ | ✅ | ✅ | 仅文件管理 | P1 |
| 搜索筛选 | ✅ | ✅ | ✅ | 仅年级管理 | P1 |
| 分页 | ✅ | ✅ | ✅ | 仅审计日志 | P1 |
| 数据导出 | ✅ | ✅ | ✅ | 仅审计日志 | P3 |
| 数据可视化 | ✅ | ✅ | ✅ | 基础统计 | P3 |
| 面包屑导航 | ✅ | ✅ | ✅ | ❌ | P2 |
| dataScope | ✅ | ✅ | ✅ | ❌ | P3 |
| 键盘快捷键 | 部分 | ❌ | ❌ | ❌ | P3 |
### 5.5 正面发现(值得保持的良好实践)
1. **grades-view.tsx 是优秀范例**:完整的搜索/筛选/排序、表单校验、去重校验、isDirty 检测、nuqs URL 状态管理
2. **admin-files-view.tsx 批量删除实现良好**:复选框、全选/反选、indeterminate 状态
3. **file-upload.tsx 上传体验优秀**:拖拽上传、进度条、文件校验、多文件并行
4. **审计日志分页实现正确**:分页控件和 "Showing X-Y of Z" 信息
5. **Promise.all 并行查询**:多个页面使用 Promise.all 并行查询,性能良好
6. **AlertDialog 用于 destructive 操作**:所有删除操作都使用 AlertDialog 确认
---
## 六、Profile 个人资料模块(部分问题)
### 6.1 P0 严重问题1 个)
#### P-P0-1 缺少 loading.tsx 与 error.tsx
- **文件**`src/app/(dashboard)/profile/`
- **问题**:项目硬约束要求所有路由包含 loading.tsx 和 error.tsx但 profile 目录只有 page.tsx
- **改进建议**:新增 loading.tsx骨架屏和 error.tsx错误边界+重试)
- **严重程度**P0
### 6.2 P1 重要问题5 个)
| 编号 | 文件 | 问题 | 改进建议 |
|------|------|------|----------|
| P-P1-1 | profile/page.tsx 行 50-118、215-300 | 页面职责混乱,混入大量仪表盘逻辑(学生学业概览+教师教学概览303 行中 180 行是仪表盘逻辑 | 移除 Student/Teacher Overview聚焦个人资料 |
| P-P1-2 | profile/page.tsx 行 132-213 | 缺少头像展示users 表有 image 字段但未展示 | 在 PageHeader 下方展示头像 |
| P-P1-3 | profile-settings-form.tsx 全文 | 缺少头像上传功能UpdateUserProfileInput 不包含 image | 增加头像上传区,扩展类型 |
| P-P1-4 | 整个 settings 模块 | 缺少隐私设置(数据可见性、第三方授权、活动记录) | 新增 Privacy Tab |
| P-P1-5 | profile/page.tsx 行 37settings/page.tsx 行 17 | 使用 requireAuth() 而非 requirePermission(),违反项目规则 | 改为 requirePermission(USER_PROFILE_UPDATE) |
### 6.3 P2/P3 问题8 个,略)
主要包括信息展示不完整缺监护人、教育背景、最后登录、Edit Profile 未深链到 Tab、Age 字段应改为 Birth Date、死代码 redirect("/login")、PageHeader 未复用等。
---
## 七、Settings 设置模块(部分问题)
### 7.1 P0 严重问题1 个)
#### S-P0-1 缺少 loading.tsx 与 error.tsx
- **文件**`src/app/(dashboard)/settings/``src/app/(dashboard)/settings/security/`
- **问题**:同 profile违反项目硬约束
- **改进建议**:两个目录均新增 loading.tsx 和 error.tsx
- **严重程度**P0
### 7.2 P1 重要问题9 个)
| 编号 | 文件 | 问题 | 改进建议 |
|------|------|------|----------|
| S-P1-1 | settings/page.tsx 行 27-33 | 角色路由缺失 parent 分支parent 用户被错误渲染为 TeacherSettingsView | 显式处理 parent 角色 |
| S-P1-2 | settings-view.tsx 行 63-81 | Tab 分类不齐全,缺少 AI Providers、Privacy、Account、Language & Region | 扩展为 6 个 Tab |
| S-P1-3 | settings/security/page.tsx 全文 | 缺少两步验证2FA、登录设备管理、登录历史 | 新增 2FA 设置区、设备管理卡片、登录历史卡片 |
| S-P1-4 | settings-view.tsx 行 83-86 | AiProviderSettingsCard 已存在但未在 SettingsView 中使用 | 在 General 或新增 AI Tab 中渲染 |
| S-P1-5 | notification-preferences-form.tsx 全文 | 缺少免打扰时段DND设置 | 新增 DND 卡片 |
| S-P1-6 | settings-view.tsx 行 63 | Tab 切换无 URL 持久化,刷新回到 General无法分享特定 Tab 链接 | useSearchParams 实现 URL 同步 |
| S-P1-7 | password-change-form.tsx 行 22-24 | 使用任意值 Tailwind 类 `[&>div]:bg-red-500`,违反项目规则 | 在 globals.css 定义工具类 |
| S-P1-8 | 整个 settings 模块 | 无快捷键自定义功能 | 新增 Keyboard Shortcuts 设置区 |
| S-P1-9 | settings-view.tsx 行 63-81 | Tabs 缺少键盘箭头导航验证 | 确认 Radix Tabs ARIA 实现 |
### 7.3 P2/P3 问题17 个,略)
主要包括Appearance Tab 内容单薄(无字体大小/密度/语言/时区、settings/security 与 SettingsView Security Tab 内容重复、邮箱不可修改、Age 应改为 BirthDate、密码修改后未登出其他会话、缺少密码历史检查、缺少邮件摘要频率、缺少按类别渠道覆盖、缺少删除 AI Provider、AI Provider 强制测试才能保存、Tab 切换无未保存变更警告、通知偏好无即时反馈、登出无二次确认、错误信息泄露用户存在性、AI Provider 测试无频率限制、ProfileSettingsForm 无错误状态展示、AiProviderSettingsCard 加载失败无重试、bcrypt salt rounds 偏低、主题描述硬编码 "admin console"、ProfileSettingsForm 无 Cancel/Reset、中文错误信息、中文注释等。
### 7.4 同类产品对比
| 功能 | Google 账户 | GitHub Settings | 钉钉设置 | 本项目 | 差距 |
|------|------------|----------------|---------|--------|------|
| 头像上传 | ✅ | ✅ | ✅ | ❌ | P1 |
| 2FA | ✅ | ✅ | ✅ | ❌ | P1 |
| 登录设备管理 | ✅ | ✅ | ✅ | ❌ | P1 |
| 登录历史 | ✅ | ✅ | ✅ | ❌ | P1 |
| 通知免打扰 | ✅ | ✅ | ✅ | ❌ | P1 |
| 语言切换 | ✅ | ✅ | ✅ | ❌ | P2 |
| 时区设置 | ✅ | ✅ | ✅ | ❌ | P2 |
| 第三方授权管理 | ✅ | ✅ | ✅ | ❌ | P1 |
| 数据导出 | ✅ | ✅ | ✅ | ❌ | P2 |
| 删除账户 | ✅ | ✅ | ✅ | ❌ | P2 |
| Tab URL 持久化 | ✅ | ✅ | ✅ | ❌ | P1 |
| 未保存变更警告 | ✅ | ✅ | ✅ | ❌ | P2 |
---
## 八、跨模块共性问题
### 8.1 安全问题集中爆发
**12 个 P0 权限校验缺失**
- announcements 模块 2 个admin 列表页+编辑页)
- management 模块 10 个admin/school/* 6 个 + admin/users/import 1 个 + admin/scheduling/* 3 个)
- dashboard 布局无认证守卫
**根因分析**:项目缺少统一的 admin 路由守卫机制。建议在 `src/app/(dashboard)/admin/layout.tsx` 增加统一 `requireRole("admin")``requirePermission()` 检查,或新增 `middleware.ts``/admin/*` 路径拦截。
### 8.2 中英文混排严重
| 模块 | 页面标题 | 组件 UI | 注释 |
|------|----------|---------|------|
| Dashboard | 英文 | 英文 | 英文 |
| Announcements | 中文metadata | 英文 | 英文 |
| Messages | 英文 | 英文 | 英文 |
| Management | 中文(大部分) | 中英混排 | 中文 |
| Profile | 英文 | 英文 | 英文 |
| Settings | 英文 | 英文 | 中英混排 |
**改进建议**:建立统一 i18n 策略,推荐统一为中文(面向 K12 中文用户),或接入 next-intl。
### 8.3 loading.tsx / error.tsx 大面积缺失
| 模块 | 缺失目录 |
|------|----------|
| Dashboard | teacher/dashboard、parent/dashboard、dashboard |
| Announcements | announcements、admin/announcements |
| Messages | messages、messages/[id]、messages/compose |
| Management | admin/school/*、admin/scheduling/*、admin/users/import、management/grade/* |
| Profile | profile |
| Settings | settings、settings/security |
**改进建议**:为所有缺失目录添加 loading.tsx骨架屏和 error.tsx错误边界+重试按钮)。
### 8.4 列表页分页/搜索/批量操作三件套缺失
| 模块 | 分页 | 搜索 | 批量操作 |
|------|------|------|----------|
| Announcements | ❌ | ❌ | N/A |
| Messages | ❌ | ❌ | N/A |
| Managementschool/* | ❌ | 仅 grades-view | ❌ |
| Managementaudit-logs | ✅ | ❌ | ✅(导出) |
| Managementfiles | ❌ | ✅ | ✅(删除) |
**改进建议**:以 `grades-view.tsx`(搜索/筛选/排序)和 `admin-files-view.tsx`(批量操作)为范例,统一补齐。
### 8.5 实时性全面缺失
全项目无 WebSocket/SSE 实现,消息、通知、仪表盘数据均依赖页面刷新。对比钉钉/企业微信/飞书等 IM 类产品,实时性是核心差距。
**改进建议**:引入 SSEServer-Sent EventsNext.js 14+ 支持 Route Handler 实现 SSE成本低于 WebSocket。优先实现消息实时推送和通知实时刷新。
---
## 九、优先级修复建议
### 9.1 立即修复P014 个)
1. **权限校验**12 个页面):为所有缺失 `requirePermission()` 的 admin 页面添加权限校验
2. **admin 布局守卫**:新增 `src/app/(dashboard)/admin/layout.tsx` 统一守卫
3. **公告定向推送**:修复 `getAnnouncements` 增加受众过滤
4. **消息草稿箱**:扩展 messages 表 status 字段
5. **消息群发**:支持多收件人
6. **实时推送**:引入 SSE
7. **StudentStatsGrid**:补全 props 渲染
8. **loading/error 边界**:为 teacher/parent/dashboard 添加
9. **TeacherDashboardHeader 问候语**:修复硬编码
### 9.2 短期修复P152 个)
1. **Dashboard**AdminDashboard 快捷操作、Parent 多子女对比、角色切换器、col-span 修复
2. **Announcements**:用户端详情页、通知联动、定时发布、班级数据传递、分页、搜索、富文本、表单校验
3. **Messages**:会话线程、软删除、搜索筛选、附件、撤回转发、未读红点、收件人 Combobox、免打扰时段、通知实时刷新
4. **Management**中英文统一、文件管理导航、用户管理主页面、loading/error 边界、分页、批量操作、搜索筛选、学校年级 Select
5. **Profile/Settings**职责拆分、头像展示上传、parent 角色路由、Tab 分类扩展、2FA/设备管理/登录历史、AiProvider 集成、DND、URL 持久化、权限校验
### 9.3 中期修复P281 个)
富文本编辑、附件支持、置顶、阅读回执、预览、评论、按角色定向、撤回、模板、归档、@提及、消息反应、定时发送、已读详情、引用回复、通知类型映射重构、组件归属迁移、批量审批、表单校验、代码重复提取、面包屑导航等。
### 9.4 长期优化P354 个)
数据可视化、dataScope 控制、键盘快捷键、数据导出、空状态插图、focus-visible 样式、返回顶部、移动端适配、i18n、架构图同步等。
---
## 十、架构图同步提醒
根据项目规则"改码必同步图",以下修复完成后需要同步更新架构文档(`004_architecture_impact_map.md``005_architecture_data.json`
1. 新增 `admin/layout.tsx` → 更新 app 路由结构
2. 新增 `announcements/[id]/page.tsx` → 更新 announcements 路由
3. messages 表新增 status/isStarred/isArchived 字段 → 更新 dbTables
4. 新增 `ParentSettingsView` → 更新 settings 模块 exports
5. `AiProviderSettingsCard` 集成到 SettingsView → 更新组件依赖
6. 新增 `deleteAiProviderAction` → 更新 settings 模块 actions
7. 新增 privacy/2FA 相关 action → 更新 settings 模块职责
8. `notification-dropdown.tsx` 迁移到 notifications 模块 → 更新模块归属
9. `insertAnnouncement` 返回类型 `Promise<{ announcementId: string }>` → 实际为 `Promise<string>`,需修正文档
10. 抽取 `getPrimaryRole` 工具函数 → 更新 shared/lib exports
---
## 附录:审查文件清单
### Dashboard 模块
- `src/app/(dashboard)/dashboard/page.tsx`
- `src/app/(dashboard)/admin/dashboard/page.tsx`
- `src/app/(dashboard)/teacher/dashboard/page.tsx`
- `src/app/(dashboard)/student/dashboard/page.tsx`
- `src/app/(dashboard)/parent/dashboard/page.tsx`
- `src/modules/dashboard/components/` 下所有组件
- `src/modules/layout/components/app-sidebar.tsx`
- `src/modules/layout/components/site-header.tsx`
- `src/modules/layout/config/navigation.ts`
### Announcements 模块
- `src/app/(dashboard)/announcements/page.tsx`
- `src/app/(dashboard)/admin/announcements/page.tsx`
- `src/app/(dashboard)/admin/announcements/[id]/page.tsx`
- `src/modules/announcements/` 下所有文件
### Messages 模块
- `src/app/(dashboard)/messages/page.tsx`
- `src/app/(dashboard)/messages/[id]/page.tsx`
- `src/app/(dashboard)/messages/compose/page.tsx`
- `src/modules/messaging/` 下所有文件
- `src/modules/notifications/` 下所有文件
### Management 模块
- `src/app/(dashboard)/management/grade/` 下所有页面
- `src/app/(dashboard)/admin/school/` 下所有页面
- `src/app/(dashboard)/admin/users/import/page.tsx`
- `src/app/(dashboard)/admin/audit-logs/` 下所有页面
- `src/app/(dashboard)/admin/files/page.tsx`
- `src/app/(dashboard)/admin/scheduling/` 下所有页面
- `src/modules/classes/components/` 下相关组件
- `src/modules/school/components/` 下所有组件
- `src/modules/audit/components/` 下所有组件
- `src/modules/files/components/` 下所有组件
- `src/modules/scheduling/components/` 下所有组件
- `src/modules/users/components/` 下所有组件
### Profile & Settings 模块
- `src/app/(dashboard)/profile/page.tsx`
- `src/app/(dashboard)/settings/page.tsx`
- `src/app/(dashboard)/settings/security/page.tsx`
- `src/modules/settings/components/` 下所有组件
- `src/modules/settings/` 下所有文件
- `src/modules/users/data-access.ts`
- `src/modules/users/user-service.ts`
---
**本报告由 5 个子代理并行深度审查整合生成,覆盖 6 大模块、50+ 页面、100+ 组件,共发现 201 个问题。建议按 P0 → P1 → P2 → P3 优先级分四个迭代周期完成核心功能补齐,每个迭代同步更新架构图 004/005 文档。**