feat(dashboard): 新增分区 Error Boundary + Suspense 骨架屏(P2)

新增 components/dashboard-section.tsx,包含:

- DashboardSectionErrorBoundary:分区级 Error Boundary,单区块崩溃仅替换该区块不波及整页

- DashboardSectionSkeleton:5 种骨架变体(stats/card/chart/table/list),匹配不同数据区块布局

- DashboardSection:组合 Error Boundary + Suspense + 骨架屏的包装器

将 admin/teacher/student 三个仪表盘视图的每个独立数据区块用 DashboardSection 包裹,i18n 补充 sectionLoadFailed/sectionLoadFailedDesc 翻译键,同步更新架构图 004/005 文档
This commit is contained in:
SpecialX
2026-06-22 15:58:49 +08:00
parent 868ac5f9cf
commit 21c1e7a286
8 changed files with 454 additions and 167 deletions

View File

@@ -5822,6 +5822,29 @@
"purpose": "根据当前小时返回问候语时段 key"
}
],
"components": [
{
"name": "DashboardSection",
"path": "components/dashboard-section.tsx",
"purpose": "分区 Error Boundary + Suspense + 骨架屏包装器,包裹每个独立数据区块",
"variants": ["stats", "card", "chart", "table", "list"],
"usedBy": [
"admin-dashboard.tsx",
"teacher-dashboard-view.tsx",
"student-dashboard-view.tsx"
]
},
{
"name": "DashboardSectionErrorBoundary",
"path": "components/dashboard-section.tsx",
"purpose": "仪表盘分区级 Error Boundaryclass component单区块崩溃仅替换该区块"
},
{
"name": "DashboardSectionSkeleton",
"path": "components/dashboard-section.tsx",
"purpose": "分区骨架屏5 种变体匹配不同数据区块布局"
}
],
"dataAccess": [
{
"name": "getAdminDashboardData",
@@ -9830,9 +9853,9 @@
"requirePermission",
"data-access.getAttendanceRecords"
],
"usedBy": [
"teacher/attendance/page.tsx",
"admin/attendance/page.tsx"
"usedBy": [],
"issues": [
"P0: 无调用方——admin/teacher 页面绕过 Action 直接调用 data-access.getAttendanceRecords违反三层架构"
]
},
{
@@ -9844,9 +9867,9 @@
"requirePermission",
"data-access-stats.getStudentAttendanceSummary"
],
"usedBy": [
"student/attendance/page.tsx",
"parent/attendance/page.tsx"
"usedBy": [],
"issues": [
"P0: 无调用方——student/parent 页面绕过 Action 直接调用 data-access-stats.getStudentAttendanceSummary"
]
},
{
@@ -9858,8 +9881,9 @@
"requirePermission",
"data-access-stats.getClassAttendanceStats"
],
"usedBy": [
"teacher/attendance/stats/page.tsx"
"usedBy": [],
"issues": [
"P0: 无调用方——teacher/attendance/stats 页面绕过 Action 直接调用 data-access-stats.getClassAttendanceStats"
]
},
{
@@ -9994,6 +10018,9 @@
],
"usedBy": [
"attendance-sheet.tsx"
],
"issues": [
"P0: 跨模块直查 classEnrollments 表,违反模块间只能通过对方 data-access 通信的规则(应改为调用 classes data-access"
]
},
{
@@ -10061,6 +10088,9 @@
],
"usedBy": [
"admin/attendance/page.tsx"
],
"issues": [
"P0: 统计失真——调用 getAttendanceRecords默认 pageSize=20后对 items 聚合,仅基于前 20 条记录计算总览数据,班级/状态/日期筛选后仍只统计前 20 条"
]
}
],
@@ -11643,9 +11673,9 @@
"requirePermission(ELECTIVE_READ)",
"data-access.getElectiveCourses (scope, currentUserId)"
],
"usedBy": [
"admin/elective/page.tsx",
"teacher/elective/page.tsx"
"usedBy": [],
"issues": [
"P0: 无调用方——admin/teacher 页面绕过 Action 直接调用 data-access.getElectiveCourses违反三层架构"
]
},
{
@@ -11658,8 +11688,9 @@
"requirePermission(ELECTIVE_READ)",
"data-access-selections.getStudentSelections"
],
"usedBy": [
"待扩展"
"usedBy": [],
"issues": [
"P0: 无调用方——页面绕过 Action 直接调用 data-access-selections.getStudentSelections"
]
},
{
@@ -11672,8 +11703,9 @@
"requirePermission(ELECTIVE_SELECT)",
"data-access-selections.getAvailableCoursesForStudent"
],
"usedBy": [
"待扩展"
"usedBy": [],
"issues": [
"P0: 无调用方——student/elective 页面绕过 Action 直接调用 data-access-selections.getAvailableCoursesForStudent"
]
}
],
@@ -12763,8 +12795,8 @@
}
],
"messages": [
"src/shared/i18n/messages/zh-CN/{common,auth,onboarding,classes,errors}.json",
"src/shared/i18n/messages/en/{common,auth,onboarding,classes,errors}.json"
"src/shared/i18n/messages/zh-CN/{common,auth,onboarding,classes,errors,dashboard,examHomework,announcements,messages}.json",
"src/shared/i18n/messages/en/{common,auth,onboarding,classes,errors,dashboard,examHomework,announcements,messages}.json"
]
},
"routes": {},
@@ -13214,7 +13246,8 @@
],
"attendance": [
"data-access-stats.getStudentAttendanceSummary",
"components.student-attendance-view"
"components.student-attendance-view",
"types.StudentAttendanceSummary (⚠️ 跨模块 UI 类型依赖parent-attendance-warning.tsx / parent-attendance-rate-card.tsx / parent-attendance-calendar.tsx 直接 import)"
]
}
},