feat(web): migrate messaging and personal timetable

Complete scoped notification composition and recipient selection, and add the React personal timetable with week navigation, integrated exam and experiment entries, exports, and calendar subscription lifecycle management.
This commit is contained in:
biss authored and biss committed 2026-10-03 21:38:14 +08:00
1 parent 338006c51e
commit e926dd00f2
10 files changed
+292 -7

No files matched your search

+2 -1
View File
@@ -8,6 +8,7 @@
| `/dashboard` | 角色化首页 | 已登录用户 | 管理总览;学生课表/消息/考试/预警;教师教学班/成绩登记进度 | verification |
| `/account` | 个人账户 | 已登录用户 | TOTP、恢复码、SSO 绑定;Passkey 浏览器仪式尚未开放 | verification |
| `/users` | 用户与权限 | SuperAdmin | 列表、筛选、分页、创建、启停、重置密码、角色范围、Excel | verification |
| `/notifications` | 通知中心 | 已登录用户 | 收件箱筛选、游标分页、已读回执;已发送;定向群发暂回旧系统 | building |
| `/notifications` | 通知中心 | 已登录用户 | 收件箱筛选、游标分页、已读回执、权限范围/筛选/指定收件人群发、已发送 | verification |
| `/my-timetable` | 我的课表 | Student、Teacher | 当前学期周视图、考试/实验融合、Excel/PDF/ICS、订阅启停与密钥轮换 | verification |
后续从 `web/src/router/index.ts` 逐条补全。只有关键合同和各状态验收完整后,状态才能更新为 `complete`。
+3 -1
View File
@@ -29,6 +29,8 @@ npm.cmd run build
- 读取真实 `/api/dashboard` 数据的首个页面;
- 完整迁移 `/account` 的身份信息、TOTP 和统一身份绑定流程;
- 完整迁移 `/users` 的分页筛选、Excel、账号、角色、状态和密码管理流程。
- 迁移 `/notifications` 的收件箱、已读回执、权限范围/筛选/指定收件人群发和已发送记录;
- 迁移 `/my-timetable` 的周视图、考试与实验融合、Excel/PDF/ICS 导出和日历订阅管理。
## 迁移纪律
@@ -43,7 +45,7 @@ npm.cmd run build
| 批次 | 内容 | 状态 |
| --- | --- | --- |
| 0 | 工程、主题、会话、登录、应用外壳 | 进行中 |
| 1 | Dashboard、Users、Account、移动端代表页 | 前三项进入联调验收 |
| 1 | Dashboard、Users、Account、Notifications、个人课表、移动端代表页 | 已实现,进入联调验收 |
| 2 | 标准 CRUD 与基础数据模块 | 未开始 |
| 3 | 学生、教师与审批工作台 | 未开始 |
| 4 | 选课、排课、成绩、实验等复杂模块 | 未开始 |
+2
View File
@@ -10,6 +10,7 @@ const DashboardPage = lazy(() => import('../pages/DashboardPage'))
const AccountPage = lazy(() => import('../pages/AccountPage'))
const UsersPage = lazy(() => import('../pages/UsersPage'))
const NotificationsPage = lazy(() => import('../pages/NotificationsPage'))
const MyTimetablePage = lazy(() => import('../pages/MyTimetablePage'))
const SsoCallbackPage = lazy(() => import('../pages/SsoCallbackPage'))
const SsoBindPage = lazy(() => import('../pages/SsoBindPage'))
const AppShell = lazy(() => import('../layout/AppShell'))
@@ -54,6 +55,7 @@ function AppRoutes() {
<Route path="/account" element={<AccountPage />} />
<Route path="/users" element={<UsersPage />} />
<Route path="/notifications" element={<NotificationsPage />} />
<Route path="/my-timetable" element={<MyTimetablePage />} />
<Route path="/" element={<Navigate to="/dashboard" replace />} />
</Route>
<Route path="*" element={<Navigate to="/dashboard" replace />} />
Loaded 3 of 10 files, more files were not shown because too many files have changed in this diff. Show more