docs: T40 UI 审计报告 + wiki 更新 + Docker 配置

- T40 UI 审计计划和结果文档(docs/qa/)
- wiki 更新:miniprogram 设计系统合规审计记录 + index 关键数字更新
- 审计 V2 完整报告(docs/audits/v2/)
- 讨论记录文档(docs/discussions/)
- 设计规格和实施计划(docs/superpowers/)
- 角色测试计划和结果(docs/qa/role-test-*)
- Docker 生产部署配置
This commit is contained in:
iven
2026-05-13 23:29:42 +08:00
parent 212c08b7ae
commit df1d85bfde
78 changed files with 10345 additions and 39 deletions

View File

@@ -1,6 +1,6 @@
---
title: 架构决策记录
updated: 2026-04-28
updated: 2026-05-07
status: stable
tags: [architecture, decisions, design-principles]
---
@@ -22,8 +22,8 @@ HMS 继承 ERP 底座的所有基础模块,`erp-health` 作为原生 Rust 模
```
HMS 平台
├── 基础模块(继承 ERP: auth, config, workflow, message, plugin
├── 核心业务模块: erp-health原生 Rust46 实体/39 权限/25+ 页面)★ 已实现
├── AI 模块: erp-ai6 实体SSE 流式分析Phase 1 MVP
├── 核心业务模块: erp-health原生 Rust46 实体/39 权限/179 文件/31 事件)★ 已实现
├── AI 模块: erp-ai6 实体/45 文件/22 路由SSE 流式分析4 AI ProviderPhase 1 MVP
├── 透析模块: erp-dialysis已拆分为独立 crate
└── 可选插件: crm, inventory, freelance, itops, assessmentWASM
```

View File

@@ -1,6 +1,6 @@
---
title: Web 前端
updated: 2026-04-28
updated: 2026-05-10
status: stable
tags: [frontend, react, antd, vite, spa]
---
@@ -12,7 +12,7 @@ tags: [frontend, react, antd, vite, spa]
## 1. 设计决策
- **组件库优先** — Ant Design 6不自造轮子
- **状态集中** — Zustand 管理全局状态(5 个 store
- **状态集中** — Zustand 管理全局状态(6 个 store
- **API 层分离** — HTTP 调用封装到 `src/api/`(含 health/ 和 ai/ 子目录),组件不直接 fetch
- **代理开发** — Vite 代理 `/api` 到后端 3000 端口
- **HashRouter** — 不需要服务端 fallback 配置,部署更稳健
@@ -132,7 +132,7 @@ React 19.2.4 / Ant Design 6.3.5 / React Router 7.14.0 / Zustand 5.0.12 / Vite 8.
| `/plugins/:pluginId/:entityName` | 插件 CRUD动态生成 |
| `/plugins/:pluginId/tabs|tree|graph|dashboard|kanban/:name` | 插件多视图页面 |
**健康管理路由22 条)**:
**健康管理路由25 条)**:
| 路径 | 页面 |
|------|------|
@@ -158,8 +158,10 @@ React 19.2.4 / Ant Design 6.3.5 / React Router 7.14.0 / Zustand 5.0.12 / Vite 8.
| `/health/ai-analysis` | AI 分析历史 |
| `/health/ai-prompts` | AI Prompt 管理 |
| `/health/ai-usage` | AI 用量统计 |
| `/health/media-library` | 媒体库管理(上传/文件夹/网格浏览) |
| `/health/banners` | 轮播图管理(表格+Drawer 表单+排序) |
### 健康模块共享组件11 个)
### 健康模块共享组件13 个)
| 组件 | 用途 |
|------|------|
@@ -174,6 +176,8 @@ React 19.2.4 / Ant Design 6.3.5 / React Router 7.14.0 / Zustand 5.0.12 / Vite 8.
| `HealthRecordsTab` | 患者详情-健康档案标签页 |
| `FollowUpTab` | 患者详情-随访标签页 |
| `ImagePreview` | 图片预览组件 |
| `MediaPicker` | 媒体库选图组件(复用于轮播图选图、文章封面选图) |
| `resolveMediaUrl()` | 媒体 URL 工具函数(`src/utils/media.ts`):自动处理路径前缀 + JWT token 拼接 |
### 集成契约
@@ -196,7 +200,7 @@ React 19.2.4 / Ant Design 6.3.5 / React Router 7.14.0 / Zustand 5.0.12 / Vite 8.
| `message.ts` | unreadCount, recentMessages, SSE 实时推送连接, 请求去重 |
| `plugin.ts` | plugins 列表, 动态菜单, schema 缓存, 请求去重 |
### 健康模块 API 文件10 个)
### 健康模块 API 文件12 个)
| 文件 | 覆盖端点 |
|------|---------|
@@ -207,6 +211,8 @@ React 19.2.4 / Ant Design 6.3.5 / React Router 7.14.0 / Zustand 5.0.12 / Vite 8.
| `followUp.ts` | 随访任务 + 记录 |
| `consultations.ts` | 咨询会话 + 消息 + 导出 |
| `articles.ts` | 健康文章 |
| `media.ts` | 媒体库 CRUD + 文件夹管理 + 批量操作 |
| `banners.ts` | 轮播图 CRUD + 排序 |
| `points.ts` | 积分系统 |
| `deviceReadings.ts` | 设备数据采集 |
| `alerts.ts` | 健康预警 |
@@ -250,8 +256,9 @@ React 19.2.4 / Ant Design 6.3.5 / React Router 7.14.0 / Zustand 5.0.12 / Vite 8.
### 代理配置
```
http://localhost:5174/api/* → http://localhost:3000/* (API)
ws://localhost:5174/ws/* ws://localhost:3000/* (WebSocket)
http://localhost:5174/api/* → http://localhost:3000/* (API)
http://localhost:5174/uploads/* → http://localhost:3000/* (媒体文件,需 JWT)
ws://localhost:5174/ws/* → ws://localhost:3000/* (WebSocket)
```
## 5. 活跃问题 + 陷阱
@@ -271,6 +278,7 @@ ws://localhost:5174/ws/* → ws://localhost:3000/* (WebSocket)
| 日期 | 变更 |
|------|------|
| 2026-05-10 | **媒体库 + 轮播图管理**:新增 MediaLibrary 页面(上传/文件夹/网格浏览、BannerManage 页面(表格+Drawer+排序、MediaPicker 组件(复用于轮播图和文章封面选图);新增 `resolveMediaUrl()` 工具函数统一处理媒体 URLVite 代理新增 `/uploads`;健康路由 22→25 条,共享组件 11→13 个API 文件 10→12 个 |
| 2026-05-01 | 审计发现更新CRITICAL 权限码拼写错误alert→alerts、前端测试极低、AI SSE 无入口 |
| 2026-04-28 | UI/UX 重构 Phase 5小程序端 8 项优化):首页健康资讯+空状态引导、Hub sparkline bar+打卡合并、日常监测 3 分组折叠+异常高亮、预约时段灰显、咨询消息日期分组+图片预览、医护异常横幅+搜索、趋势图骨架屏 |
| 2026-04-28 | UI/UX 重构 Phase 44 个表单 Modal→DrawerForm患者 4 分组/预约 3 分组+排班校验/随访 2 分组/积分商品 2 分组) |

View File

@@ -4,7 +4,7 @@
## 关键数字
> 最后更新: 2026-05-11 | 数据截止: commit c716cc0 (feat/media-library-banner 分支)
> 最后更新: 2026-05-13 | 数据截止: feat/media-library-banner 分支
| 指标 | 值 |
|------|-----|
@@ -31,8 +31,9 @@
| 系统分析评分 | **6.9/10 (B)**六维度全面均衡分析2026-05-11 |
| 审计状态 | V1: 83% → V2: 85%P0 安全修复已完成V2 CRITICAL 全清零 |
| 角色测试 | R01-R05 全角色验证完成86.5% 通过率5 个 BUG 已修复;小程序 MP 多角色 96.2% 通过率 |
| Design Token | 10 级字号 + 4 结构 token68 SCSS 文件全面接入,关怀模式 CSS 变量级联自动生效 |
| Design Token | 11 级字号(含 `--tk-font-display`+ 4 结构 token68 SCSS 文件全面接入,关怀模式 CSS 变量级联自动生效 |
| 长者模式 | 58/58 页面 100% 覆盖 |
| UI 合规审计 | T40: 60 页面全覆盖PASS 31 / PASS_WITH_ISSUES 27 / NEEDS_WORK 2HIGH×2 + MEDIUM×6 + LOW×67 全部修复 |
| 项目阶段 | **功能完善**(媒体库+轮播图+文章编辑器上线6 模块冻结待解冻) |
## 症状导航

View File

@@ -1,6 +1,6 @@
---
title: 微信小程序(患者端)
updated: 2026-05-08
updated: 2026-05-10
status: active
tags: [miniprogram, taro, wechat, patient]
---
@@ -308,6 +308,10 @@ POST /auth/wechat/login { code }
| 调用 → | [[erp-server]] | `POST /auth/wechat/bind-phone` | 手机号绑定 |
| 调用 → | [[erp-health]] | `/api/v1/health/*` | 健康数据查询 |
| 调用 → | [[erp-server]] | `/api/v1/auth/refresh` | Token 刷新 |
| 调用 → | [[erp-health]] | `GET /public/banners` | 访客首页轮播图(无需认证) |
| 调用 → | [[erp-health]] | `GET /public/banner-image/{id}` | 轮播图图片下载(`wx.downloadFile`,无需认证) |
| 调用 → | [[erp-health]] | `GET /public/articles` | 访客首页文章列表(无需认证) |
| 调用 → | [[erp-health]] | `GET /public/articles/{id}` | 访客文章详情(无需认证) |
## 3. 代码逻辑
@@ -320,6 +324,7 @@ defineConstants: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
'process.env.TARO_APP_API_URL': JSON.stringify(process.env.TARO_APP_API_URL || 'http://localhost:3000/api/v1'),
'process.env.TARO_APP_ENCRYPTION_KEY': JSON.stringify(process.env.TARO_APP_ENCRYPTION_KEY || ''),
'process.env.TARO_APP_DEFAULT_TENANT_ID': JSON.stringify(process.env.TARO_APP_DEFAULT_TENANT_ID || ''),
},
```
@@ -444,6 +449,7 @@ secret = "<通过环境变量 ERP__WECHAT__SECRET 设置>"
```bash
cd apps/miniprogram
echo 'TARO_APP_API_URL=http://localhost:3000/api/v1
TARO_APP_DEFAULT_TENANT_ID=019d80da-7a2c-7820-b0a3-3d5266a3a324
TARO_APP_ENCRYPTION_KEY=' > .env
NODE_ENV=development npx taro build --type weapp
```
@@ -591,6 +597,37 @@ curl -X POST http://localhost:3000/api/v1/auth/login \
| **require() 在 evaluate 不可用** | webpack 用数字 ID 注册模块 | 直接用 `wx.setStorageSync` / `wx.getStorageSync` |
| **auth 重定向** | request interceptor 检测 401 后跳转 login 并清空 storage | 确保 token 有效reLaunch 后等待 2-3 秒 |
| **生产构建 decrypt 抛异常** | 空密钥 + `NODE_ENV=production` 时 `decrypt()` 直接 throw | 使用 `NODE_ENV=development` 构建 |
| **DevTools 频繁卡死** | Electron 多进程累积文件描述符泄漏14+ 进程 3.5GB+ 内存 | 见下方 §6.9 DevTools 性能优化 |
### 6.9 DevTools 性能优化
微信开发者工具基于 Electron多进程架构主进程 + 渲染进程 + GPU + 插件)在长时间运行后会出现 `EMFILE: too many open files` 导致卡死。
**常见触发场景:**
- 频繁 MCP 调用evaluate/reLaunch导致 fd 累积
- Taro 热重载文件监视器与 DevTools 自带监视器重叠
- 长时间(>2 小时)不重启 DevTools
**优化措施:**
```powershell
# 1. 定期清理 DevTools 进程(推荐每 30 分钟或卡顿时执行)
taskkill /F /IM wechatdevtools.exe
# 然后重新打开项目
# 2. 检查进程资源占用
Get-Process wechatdevtools | Measure-Object WorkingSet64 -Sum | Select Count, @{N='MB';E={[math]::Round($_.Sum/1MB)}}
# 正常:< 1500MB | 需要重启:> 3000MB
# 3. 关闭不必要的 DevTools 功能
# 设置 → 编辑器设置 → 取消勾选「文件保存时自动编译」
# 设置 → 代理 → 关闭(不用代理时)
```
**MCP 联调最佳实践:**
- 每轮 MCP 测试结束后 `disconnect` 断开连接
- 批量测试分批执行,每批 ≤ 10 页后重启 DevTools
- 避免在 DevTools 编辑器中同时打开多个文件
### 6.7 MCP 服务器架构
@@ -655,6 +692,40 @@ node scripts/audit-pages.mjs --role doctor --batch-size 8
### 6.9 审计结果
#### 2026-05-13 T40 UI 设计系统合规审计60 页面)
基于 `docs/qa/T40-miniprogram-ui-audit-plan.md` 对全部 60 个页面进行设计系统合规审计,覆盖 Design Token、SCSS 变量、色彩/圆角/字号/组件规范。
**审计结果汇总:**
| 级别 | 页面数 | 占比 |
|------|--------|------|
| PASS | 31 | 52% |
| PASS_WITH_ISSUES | 27 | 45% |
| NEEDS_WORK | 2 | 3% |
**发现并修复的问题(全部已修复):**
| 类别 | 数量 | 修复内容 |
|------|------|----------|
| HIGH | 2 | 趋势页缺 Loading/EmptyState文章列表缺 mixins 导入 |
| MEDIUM | 6 | 硬编码字号(72px→`--tk-font-display`)ErrorState 图标字号AI报告离调色板颜色(#7c3aed/#f0e6ff→`$pri`/`$pri-l`);医生患者列表 inline style咨询页 GuestGuard 统一3处 TSX inline 颜色提取为 SCSS 类 |
| LOW — `#fff` 统一 | 44 | 新增 `$white` 变量,所有 `color: #fff` → `$white``background: #fff` → `$card` |
| LOW — 圆角统一 | 14 | `8px` → `$r-xs`7文件`20px` → `$r-lg`2文件`16px` → `$r`1文件 |
| LOW — 静默 catch | 2 | article/health 的空 catch 块添加状态清理 |
| LOW — ErrorBoundary 重构 | 1 | 6 个 inline style 硬编码提取为 SCSS 类 + Design Token |
| LOW — 离调色板颜色 | 2 | `#0284C7`(冷蓝) → `$tx2``#94A3B8`(冷灰) → `$tx3` |
| LOW — `#FFFFFF` 统一 | 4 | index/exchange/mixins/variables 中 `#FFFFFF` → `$white` |
**设计系统新增:**
- `variables.scss`: 新增 `$white: #FFFFFF` 语义变量
- `tokens.scss`: 新增 `--tk-font-display` Token72px/80px大数字装饰用
- `ErrorBoundary`: 新增 SCSS 文件,从 inline style 迁移到设计系统
**影响文件:** 25 个 SCSS + 10 个 TSX + 1 个新增 SCSS + 2 个样式系统文件
报告文件:`docs/qa/role-test-results/T40-ui-audit-results.md`
#### 2026-05-08 多角色自动化审计59 页面 × 4 角色)
使用分批审计脚本对全部 59 个页面进行 4 角色全面审计236 次页面探测):
@@ -692,7 +763,9 @@ node scripts/audit-pages.mjs --role doctor --batch-size 8
| 日期 | 变更 |
|------|------|
| 2026-05-09 | **Design Token 全面接入**68 SCSS 文件59 页面 + 9 组件)全面迁移 `font-size: Npx` → `var(--tk-*)`;重写 `tokens.scss` 校准 10 级字号 + 4 结构 token 匹配实际设计值;更新 `mixins.scss` 4 个 mixin 引用 token清理 12 个页面的本地 mixin 重复定义;`elder-mode.scss` 从 530 行缩减至 ~120 行(删除所有字号/颜色覆写仅保留结构布局634 token 引用 / 3 个特殊硬编码;新增 §1.1 Design Token 系统文档 |
| 2026-05-13 | **T40 UI 设计系统合规审计+修复**60 页面全覆盖审计PASS 31 / PASS_WITH_ISSUES 27 / NEEDS_WORK 2修复 HIGH×2 + MEDIUM×6 + LOW×67新增 `$white` 变量 + `--tk-font-display` Token44 处 `#fff` 统一为 `$white`14 处圆角硬编码统一为变量3 处 TSX inline 颜色提取为 SCSS 类ErrorBoundary 重构为 SCSS2 处静默 catch 修复2 处离调色板颜色修正 |
| 2026-05-10 | **访客首页改造**:轮播图接入 `/public/banners` API + `wx.downloadFile` 下载图片到本地临时路径;文章列表接入 `/public/articles` API文章详情页根据登录状态选择认证/公开 API`getPublicArticleDetail``.env` 新增 `TARO_APP_DEFAULT_TENANT_ID`;集成契约新增 4 个公开端点 |
| 2026-05-09 | **Design Token 全面接入**68 SCSS 文件全面迁移 `font-size: Npx` → `var(--tk-*)`634 token 引用 / 3 个特殊硬编码;新增 §1.1 Design Token 系统文档 |
| 2026-05-08 | **多角色自动化审计**4 角色admin/doctor/nurse/operator× 59 页面 = 236 次探测,综合通过率 96.2%;更新 §2 页面结构为 59 页面完整列表(含医生端 dialysis/prescription/action-inbox + 患者端 dialysis-records/prescriptions/consents/health-records/diagnoses更新 §5 审计发现(透析/知情同意/诊断/健康记录标记为已修复);更新 §6.5 TabBar 为 3 个;新增 §6.8 分批审计脚本;更新 §6.9 多角色审计结果 |
| 2026-05-08 | **MCP 联调全面重写**:自建 MCP 服务器 `@hms/weapp-mcp` 替代 `@yfme/weapp-dev-mcp`;基于 `@weapp-vite/miniprogram-automator@1.1.0`;新增 §6.2 启动步骤(登录+单实例铁律);更新工具列表为 weapp-local 25 个工具;新增 inject_auth 一键注入;新增 §6.7 MCP 服务器架构说明多实例冲突、CLI 登录、SummerCompiler 等已知限制 |
| 2026-05-01 | 审计发现更新CRITICAL 晚间血压丢失 / HIGH 透析+知情同意完全空白 / 功能域完成度矩阵 |