feat(dashboard): 实现所有长期问题修复(P2-1/P2-5/P2-7/P2-9)

P2-9: TeacherSchedule 重复渲染优化
- 将移动端(lg:hidden)和桌面端(hidden lg:block)的双实例渲染改为单实例
- 使用 CSS flex order + grid col-start/row-start 实现响应式布局重排序
- 消除服务端 HTML 负载翻倍问题

P2-5: StudentTodayScheduleCard 时间过时修复
- 新增 useCurrentTime hook(src/shared/hooks/use-current-time.ts)
- 每分钟自动更新当前时间,useMemo 依赖 [items, now] 确保徽章不过时
- SSR 安全:初始渲染用 new Date(),挂载后 setInterval 更新

P2-1: 流式/Suspense 架构改造
- 新增 getAdminDashboardStreams(streams.ts):返回各独立数据源的未解析 Promise
- Admin dashboard:7 个分区组件用 React use() 独立消费 Promise,各 Suspense 边界独立流式渲染
- Teacher/Student/Parent dashboard:传入未解析 Promise,视图用 use() 消费,启用 Suspense 流式
- 页面外壳(标题 + 快捷操作)立即渲染,数据到达后各分区按各自速度填充

P2-7: 组件测试 + 路由测试修复
- 修复 dashboard-routing.test.ts:移除误导性的 permissions 字段(实际用 resolvePermissions(roles))
- 新增 fallback 路由测试(未知角色 → teacher dashboard)
- 新增 DashboardSection 组件测试(6 个测试:骨架屏变体 + 错误边界 + 正常渲染)
- 新增 useCurrentTime hook 测试(3 个测试:初始值 + 间隔更新 + 清理)

同步更新:
- docs/architecture/005_architecture_data.json 新增 7 个流式组件 + useCurrentTime hook + getAdminDashboardStreams 条目
This commit is contained in:
SpecialX
2026-06-23 09:04:40 +08:00
parent e2e0487a3b
commit 2c0f81391b
16 changed files with 649 additions and 230 deletions

View File

@@ -1096,6 +1096,12 @@
"signature": "useLocalStorage<T>(key: string, initialValue: T): [T, (value: T | ((prev: T) => T)) => void]",
"purpose": "localStorage持久化Hook"
},
{
"name": "useCurrentTime",
"file": "hooks/use-current-time.ts",
"signature": "useCurrentTime(intervalMs?: number): Date",
"purpose": "V4P2-5新增返回当前时间并按指定间隔自动更新的 Hook用于需要随时间刷新的 UI如课表'进行中'徽章),避免 useMemo 依赖 [items] 导致过时"
},
{
"name": "usePermission",
"file": "hooks/use-permission.ts",
@@ -6650,6 +6656,23 @@
"usedBy": [
"dashboard/actions.getAdminDashboardAction"
]
},
{
"name": "getAdminDashboardStreams",
"signature": "() => Promise<AdminDashboardStreams>",
"deps": [
"auth-guard.requirePermission",
"users/data-access.getUsersDashboardStats",
"classes/data-access.getClassesDashboardStats",
"textbooks/data-access.getTextbooksDashboardStats",
"questions/data-access.getQuestionsDashboardStats",
"exams/data-access.getExamsDashboardStats",
"homework/stats-service.getHomeworkDashboardStats"
],
"purpose": "V4P2-1新增管理员仪表盘流式数据源返回各独立数据源的未解析 Promise供各分区组件用 React use() 独立消费实现流式渲染",
"usedBy": [
"app/(dashboard)/admin/dashboard/page.tsx"
]
}
],
"types": [
@@ -6814,6 +6837,41 @@
"name": "DashboardErrorFallback",
"file": "dashboard-error-fallback",
"purpose": "V3 新增:仪表盘共享错误边界组件,含 i18n + reset() 重试,消除 5 个 error.tsx 路由文件的重复代码"
},
{
"name": "AdminStatsBar",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员顶部统计栏流式组件用 React use() 独立消费 usersStats/classesStats/homeworkStats Promise"
},
{
"name": "AdminContentCard",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员内容统计卡片流式组件用 React use() 消费 textbooksStats/questionsStats/examsStats Promise"
},
{
"name": "AdminHomeworkActivityCard",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员作业活跃度卡片流式组件用 React use() 消费 homeworkStats Promise"
},
{
"name": "AdminUserRolesCard",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员用户角色分布卡片流式组件用 React use() 消费 usersStats Promise"
},
{
"name": "AdminRecentUsersTable",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员最近注册用户表流式组件用 React use() 消费 usersStats Promise + getLocale"
},
{
"name": "AdminTrendCharts",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员趋势图表组件静态趋势数据待接入"
},
{
"name": "AdminHeaderBadges",
"file": "admin-dashboard/admin-sections",
"purpose": "V4P2-1新增管理员页头徽章流式组件用 React use() 消费 usersStats Promise"
}
]
}
@@ -7425,10 +7483,13 @@
{
"name": "SecurityCenterCard",
"file": "components/security-center-card.tsx",
"purpose": "安全中心卡片P2-9 新增v2 增强:2FA 开关改为禁用状态显示'即将推出'、新增'登出所有其他会话'按钮、通过 currentDeviceLabel 标记当前会话、纯函数抽取到 lib/security-utils.ts2FA 状态存储在 system_settings 表;登录历史来自 login_logs 表i18nsettings.security.center",
"purpose": "安全中心卡片P2-9 新增v2 增强:会话远程登出、currentDeviceLabel、纯函数抽取v3 增强:完整 TOTP 2FA 流程 — 启用(QR码+验证码+备份码)/关闭/重新生成备份码,三个 Dialog2FA 状态存储在 system_settings 表;登录历史来自 login_logs 表i18nsettings.security.center",
"deps": [
"getSecurityCenterAction",
"toggleTwoFactorAction",
"setupTwoFactorAction",
"verifyTwoFactorAction",
"disableTwoFactorAction",
"regenerateBackupCodesAction",
"revokeAllOtherSessionsAction",
"lib/security-utils.parseUserAgent",
"lib/security-utils.formatRelativeTime"