diff --git a/工作日志/2026-05-21.md b/工作日志/2026-05-21.md new file mode 100644 index 0000000..91acc6b --- /dev/null +++ b/工作日志/2026-05-21.md @@ -0,0 +1,184 @@ +# 工作日志 — 2026-05-21 + +--- + +## Admin Starter 全栈搭建 + +### 概览 + +从空壳脚手架搭建完整的知习 Admin 企业后台管理系统,前后端总计 7 个阶段。 + +--- + +## 前端(admin-projects)— 7 阶段 + +### Stage 1:基础设施 + +- 安装 `dayjs`、`echarts`、`echarts-for-react` +- 新建 `src/types/admin.ts` — AdminUser, DashboardStats, AuditLog, TrendPoint 类型 +- 新建 `src/types/api.ts` — PaginatedResult, PaginationParams, ApiError +- 新建 `src/constants/roles.ts` — 角色名映射、层级判断 `hasRole()` +- 新建 `src/services/token-store.ts` — localStorage 读写 +- 新建 `src/services/http-client.ts` — Fetch 封装(401 自动刷新队列) +- 新建 `src/services/admin-api.ts` — 类型化 API 函数(login/logout/dashboard/users/audit) +- 新建 `src/services/mock-data.ts` — DEV 模式 Dashboard / 审计日志 mock 数据 +- 配置 `@/` 路径别名(vite.config.ts + tsconfig.app.json) + +### Stage 2:认证体系重构 + +- 新建 `src/hooks/use-auth-query.ts` — useAdminUserQuery / useLoginMutation / useLogoutMutation +- 重构 `AuthContext` — 改为消费 React Query hooks,新增 `hasPermission(role)` + +### Stage 3:布局与路由 + +- 新建 `PageLoading` — 路由懒加载 Spin +- 新建 `PermissionGuard` — 角色不足重定向 /403 +- 新建 `config/menu.tsx` — 集中式菜单树,带角色过滤 `filterMenuByRole()` +- 新建 `routes/index.tsx` — 路由配置 + React.lazy 懒加载 +- 新建 `AdminLayout` — 环境标识 Tag、角色过滤菜单、面包屑、用户下拉(含角色显示) +- 新建错误页:403 / 404 / 500(antd Result) +- 重构 `App.tsx` — 懒加载 + PermissionGuard + Suspense + 404 catch-all +- 删除旧 `MainLayout.tsx` + +### Stage 4:共享组件库(7 个) + +| 组件 | 说明 | +|------|------| +| StatusTag | 彩色状态标签,支持自定义 statusMap | +| EmptyState | 空状态占位,带可选操作按钮 | +| DetailDrawer | 侧滑详情抽屉(560px,loading 态) | +| ConfirmDangerModal | 高危确认弹窗(需输入名称二次确认) | +| EChartsChartContainer | 图表容器(Card + loading/empty 态) | +| MetricCard | 指标卡(数值 + 趋势箭头 + loading) | +| AuditLogTable | 审计日志 ProTable(预设列 + 详情抽屉) | + +### Stage 5:页面 + +- **Dashboard** — 4 MetricCard + 2 ECharts(日活/AI 调用趋势)+ AuditLogTable +- **UserManagement** — ProTable(搜索/筛选/详情抽屉/删除确认) +- **Login** — 左右分栏设计(浅蓝渐变品牌面板 + 白色表单区) + +### Stage 6:后端 API + +新建 3 个 NestJS 模块: + +- **AdminDashboardModule** — `GET /admin-api/dashboard/stats`(聚合统计 + 30 天趋势) +- **AdminUsersModule** — CRUD `/admin-api/admin-users`(分页/搜索/角色筛选,SUPER_ADMIN 守卫) +- **AdminAuditLogModule** — `GET /admin-api/audit-logs`(分页/用户/操作/日期筛选) + +Prisma Schema:AdminAuditLog 新增 `adminUser` 反向关系。 + +### Stage 7:收尾 + +- index.html title → "知习 Admin" +- index.css 替换为 admin 最小重置 +- 删除 Vite 模板遗留资源(hero.png, react.svg, vite.svg) +- 修复 TS 6 `baseUrl` deprecation +- 更新 README.md(技术栈/目录结构/认证流程/角色体系) +- 新增 CHANGELOG.md + +--- + +## Bug 修复 + +### 1. structuredClone React 19 兼容性 +- **现象**:`/audit` 等页面白屏 +- **根因**:`AdminLayout` 对包含 React 元素的菜单数据使用 `structuredClone`,React 19 内部 Symbol 无法被结构化克隆:`DataCloneError: Symbol(react.transitional.element) could not be cloned` +- **修复**:`filterMenuByRole` 内部用 spread 创建新对象,不需要 deep clone,直接移除 `structuredClone` 调用 + +### 2. echarts-for-react CJS/ESM 互操作 +- **现象**:Dashboard 报错 `Element type is invalid: expected a string but got: object` +- **根因**:`echarts-for-react/lib/core` 是 CJS 产物,default export 在 Vite ESM 环境下解析失败 +- **修复**:改用 `echarts-for-react/esm/core` + +### 3. Login 页面样式优化 +- 左侧面板从深蓝黑渐变 `#001529` → 改为浅蓝色 `#e6f4ff → #bae0ff → primary` +- 去掉 DEV 环境标签 +- 去掉装饰性统计数字 +- 副标题改为"企业知识管理中台" + +### 4. MetricCard 高度不一致 +- 修复:Card 加 `height: '100%'` 配合 Row flex 等高 +- 恢复 antd 默认紧凑 padding +- 趋势区不强制占位 + +### 5. AuditLogTable 分页边距 +- 去掉 `cardProps: { bodyStyle: { padding: 0 } }` +- 标题改用 ProTable `headerTitle` 属性 +- 恢复 ProTable Card 默认内边距 + +### 6. 杂项 +- AuthGuard Spin `tip` 属性警告 → 移除 +- `useRef` 需要初始值 → 改为 `useRef(undefined)` +- `AdminRoles` 装饰器参数需用 enum 值而非字符串字面量 + +--- + +## 当前状态 + +### 前端 +- TypeScript 编译 ✅ +- Vite 生产构建 ✅ +- 所有路由可访问,权限守卫生效 +- Mock 数据在 DEV 模式下正常回退(Dashboard + AuditLog) + +### 后端 +- NestJS 编译 ✅ +- Prisma 模型就绪(AdminUser + AdminSession + AdminAuditLog 含关系) +- 3 个新模块已注册到 app.module.ts +- 待部署到生产并跑 migration + +### 待做 +- [ ] Admin API 部署到 8核32G 生产服务器 +- [ ] Prisma migrate(AdminAuditLog 新增 adminUser 关系) +- [ ] 前后端联调验证 +- [ ] Dashboard 真实数据验证 +- [ ] 管理员 CRUD 端到端测试 + +--- + +## Agent View 工作流配置(实验 → 废弃) + +### 创建 +- 根目录 CLAUDE.md + `.claude/agents/` 下 6 个 Agent 配置 +- 5 个子项目各创建 CLAUDE.md + AI_xxx_WORKSPACE.md +- `startup-plan/agent-config/` 备份目录 +- 设计完整工作流:任务分级、文件所有权、Review 触发、错误回滚、提交后归档 + +### 问题 +- Agent View 实测无法使用 +- 文档冗余:README.md + CLAUDE.md + WORKSPACE 三层重叠 + +### 清理 +- 删除所有 Agent 配置、CLAUDE.md、AI_WORKSPACE.md +- 删除 `startup-plan/agent-config/` +- 还原各 README 中 "For AI Agents" 章节 +- 推送所有仓库 + +--- + +## devops-projects 仓库 + +- 新建 `devops-projects/` 目录 +- 从 `startup-plan/凭据配置/` 迁移服务器凭据 +- 创建 `devops-projects/README.md` +- 推送到 `wangdl/devops-projects` + +--- + +## Hermes Agent 部署(4核4G 轻量云) + +| 项目 | 值 | +|------|-----| +| 镜像 | `nousresearch/hermes-agent:latest` | +| 模型 | `deepseek-v4-flash` | +| Provider | DeepSeek 官方 API | +| Thinking | `reasoning_effort: max` | +| 内网地址 | `http://10.2.0.7:9119` | +| 持久化 | `sleep infinity` 保活 + `--restart unless-stopped` | + +### 踩坑记录 +- 容器交互模式无 TTY 立即退出 → `sleep infinity` 保活 +- Dashboard 需 `HERMES_DASHBOARD=true` 开启 +- 内网访问需同时开 Lighthouse 防火墙 + iptables(lo 回环规则不覆盖 eth0) +- Gitea push 需用 `ssh://git@git.longde.cloud:2222` 格式认证为 repo 所有者