feat(admin-portal): 完整实现 admin-portal 管理端微前端

包含 src 全部实现、Dockerfile、配置文件等
This commit is contained in:
SpecialX
2026-07-10 19:09:12 +08:00
parent 02d09c47fa
commit b3511910d1
69 changed files with 11955 additions and 693 deletions

View File

@@ -501,3 +501,27 @@
| P3 MF 降级与版本协商 | Remote `remoteEntry.js` 加载失败 → fallback 独立页面 + 错误提示;共享依赖版本不匹配 → 运行时协商降级 |
| P3 AI 答疑 SSE 流式P5 | `POST /student/ai/stream-chat` SSE 流式响应 + `streamingText` 逐字渲染 + 打字机效果 + AbortController 取消 |
| P3 权限点命名 | 与 student-bff §3.2 对齐 `STUDENT_*_READ` 风格(`STUDENT_DASHBOARD_READ`/`STUDENT_EXAM_READ`/`STUDENT_HOMEWORK_SUBMIT`/`STUDENT_GRADE_READ` 等) |
### 2.16 admin-portal管理端微前端 RemoteP2-P6
> admin-portal 复用 teacher-portal Shell 暴露的 AppShell / usePermission / ApiClient / 设计令牌,本节仅记录 admin-portal **特有**的"场景→技术"映射,通用前端映射见 §2.12。
| 场景 | 技术/规则 |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| P2 端口分配 | admin-portal = **4003**004 §1.2 强制 4 端 4000-4003初稿误用 3003 与 data-ana 冲突,修订对齐仲裁 ARB-003 |
| P2 GraphQL admin 命名空间 | 复用 teacher-bff GraphQL endpoint`POST /api/admin/graphql`),不新建 admin-bffARB-001urql client standalone 自建MF 模式复用 Shell 单例 |
| P2 权限点 ADMIN_ 前缀 | admin 自身资源用 `ADMIN_` 前缀(如 `ADMIN_DASHBOARD_VIEW`/`ADMIN_AUDIT_READ`),跨服务资源保留原前缀(如 `IAM_USER_READ`);路由权限映射在 `lib/permissions.ts` ROUTE_PERMISSIONS |
| P2 MSW mock 全量拦截 | `NEXT_PUBLIC_API_MOCKING=enabled` 时 MSW 拦截所有 GraphQL/HTTP`mocks/handlers.ts` 实现 18 个 GraphQL operation + `/api/auth/login` mockfixtures 内存可变副本支持增删改 |
| P2 WebSocket 实时通知 | 接入 push-gateway `GET /ws`ARB-006开发期 `use-websocket.ts` 用定时器模拟推送30s/条3 类通知:`audit_alert`/`abnormal_login`/`system_error` |
| P2 MF Remote 入口 | `next.config.js` 暴露 `./AdminApp`exposes: `./src/app/admin-app.tsx``NEXT_PUBLIC_MF_ENABLED` 控制启用standalone 默认 falseShell 就绪后设 true |
| P3 用户管理 CRUD | `useUsers`/`useUser`/`useCreateUser`/`useUpdateUser`/`useToggleUserStatus` hooks`UserManagementTable` + `UserFormModal` 组件mock 登录 admin@edu.test/admin123 |
| P3 角色权限矩阵 | `RolePermissionMatrix` 组件按 resource 分组、支持全选/半选/单选;`useUpdateRolePermissions` 提交权限码列表;系统预置角色不可删除 |
| P3 视口拖拽排序 | `@dnd-kit/sortable` 实现拖拽排序 + `useSortable` hook`SortableViewportItem` 每行可编辑 label/permission/visible保存时批量调用 `updateViewport` |
| P4 组织树递归加载 | `OrganizationTree` 递归组件 + `useOrganization(parentId)` 按需加载子节点;展开/折叠状态本地管理A11y `role="tree"`/`role="treeitem"`/`aria-expanded`/`aria-selected` |
| P5 审计日志 CSV 导出 | `exportAuditLogsCsv` 生成 BOM + UTF-8 CSV`useAuditLogs` 支持 search/action 过滤;审计日志经 teacher-bff GraphQL 消费ARB-005 不直连 Kafka |
| P5 仪表盘服务健康 | `AdminDashboardViewModel.serviceHealth` 含 serviceName/status/latencyMs`Badge` 组件映射 healthy/degraded/down 状态色 |
| P6 A11y WCAG 2.2 AA | `eslint-plugin-jsx-a11y` flat configESLint 9skip-link + focus-visible + aria-* 完整;`@next/eslint-plugin-next` 14.x 与 ESLint 9 不兼容,暂用 jsx-a11y + tseslint 替代 |
| P6 Web Vitals 采集 | `web-vitals` 包LCP/CLS/FCP/INP/TTFB`WebVitalsInitializer` 组件仅 production 启用;`navigator.sendBeacon` 上报到 `/api/admin/web-vitals` |
| P6 健康检查端点 | `/api/health`liveness 200+ `/api/ready`readiness 检查 gateway 可达性2s 超时mock 模式直接 ready |
| P6 Dockerfile no-push | 多阶段构建 `node:22-alpine`builder 阶段 `pnpm install --frozen-lockfile` + `next build`runner 阶段 `standalone` 输出 + EXPOSE 4003 |
| P6 urql 类型断言 | urql `useQuery`/`useMutation` 泛型与纯字符串 query 兼容性有限;`use-graphql.ts` 用 `as unknown as` 从 unknown 转换(项目规则允许从 unknown 断言) |