fix(mp): DevTools 卡死 + 主包 2MB→766KB + 代码质量 4 项全通过

根因:主包 2MB 全量组件注入导致 DevTools 渲染引擎内存渐增,
叠加离线时固定 3s 抑制期后的请求洪泛。

修复:
- app.config.ts 添加 lazyCodeLoading: requiredComponents
  主包 2.0MB→766KB,taro.js 526→131KB,vendors.js 230→28KB
- request.ts 离线抑制改为指数退避(3s→6s→12s→30s cap)
  后端不可达时自动延长抑制,防止请求风暴
- SegmentTabs Tab 接口改为 readonly,修复 TS 编译错误
- AbortController polyfill 补齐小程序运行时缺失
- 健康首页/设备同步/健康档案/报告/设置页 UI 重构
- 文章页公开端点适配游客访问
- 健康首页 Swiper 间隔优化 4s→5s,动画 500→300ms
This commit is contained in:
iven
2026-05-24 11:32:40 +08:00
parent 675f8a4b10
commit 1e59007bd5
58 changed files with 4950 additions and 494 deletions

View File

@@ -0,0 +1,104 @@
# 小程序上线前五专家组深度审计 + 头脑风暴
> 日期: 2026-05-20 | 参与者: UX/UI 审计 / 性能稳定性 / 安全审计 / 产品架构 / 代码质量
## 背景
小程序62 页面 + 34 组件 + 38 service即将交付用户测试。启动 5 个并行专家组进行全方位深度审计,确保交付版本的质量和可用性。
## 五专家组综合评分
| 专家组 | 评分 | CRITICAL | HIGH | MEDIUM | LOW | 总问题数 |
|--------|------|----------|------|--------|-----|----------|
| UX/UI 审计 | 6.2/10 B- | 3 | 8 | 14 | 9 | 34 |
| 性能稳定性 | 6.5/10 B- | 1 | 4 | 10 | 8 | 25 |
| 安全审计 | 5.1/10 D+ | 2 | 5 | 8 | 6 | 21 |
| 产品架构 | 6.0/10 C+ | 2 | 6 | 8 | 5 | 21 |
| 代码质量 | — | 0 | 2 | 3 | 0 | 134 空 catch + 10 any |
| **综合** | **6.0/10 C+** | **8** | **25** | **43** | **28** | **~135+** |
## CRITICAL 汇总(必须修复,阻断用户测试)
| # | 来源 | 问题 | 影响 |
|---|------|------|------|
| 1 | 产品 | 咨询创建页缺失,"发起咨询"按钮导航失败 | 核心咨询流程阻断 |
| 2 | 产品 | 随访流程不闭环(患者无触发入口 + 医生无执行页面) | 医疗质量核心链路断裂 |
| 3 | 安全 | 硬编码管理员凭据 `admin/Admin@2026` 在源码中 | 反编译可获取管理员权限 |
| 4 | 安全 | Token 明文存储在 Storagesecure-storage 实际无加密) | 设备丢失 = 身份冒用 |
| 5 | UX | AI 聊天页 13 处硬编码字号,长者模式完全失效 | TabBar 核心页老年用户不可用 |
| 6 | UX | 咨询详情页 14 处硬编码字号 | 医患沟通场景老年患者无法阅读 |
| 7 | UX | Loading 文字 28px 过大,误认为标题 | 视觉层级混乱 |
| 8 | 性能 | 咨询页长轮询可能永远不启动dataLoadedRef 时序竞争) | 咨询消息收不到 |
## HIGH 汇总(严重影响体验,应在上线前修复)
| # | 来源 | 问题 |
|---|------|------|
| 1 | 产品 | "消息" Tab 实为 AI 聊天,非消息中心,命名误导 |
| 2 | 产品 | 预约创建未选就诊人,多就诊人场景不可用 |
| 3 | 产品 | 趋势图仅 7 天柱状图,缺长期趋势和对比 |
| 4 | 产品 | 日常监测/设备同步入口层级过深 |
| 5 | UX | 87 处页面硬编码字号,长者模式系统性失效 |
| 6 | UX | StatusTag 色值与设计系统不一致 |
| 7 | UX | 44 个页面缺少 ErrorState |
| 8 | UX | AI 聊天页未使用 PageShell 组件 |
| 9 | 安全 | X-Patient-Id/X-Tenant-Id Header 可能导致越权 |
| 10 | 安全 | openid 明文存储和跨网络传输 |
| 11 | 安全 | RichText XSS 绕过风险 |
| 12 | 性能 | 主包 12 页面可能超 2MB无法发布 |
| 13 | 性能 | 无虚拟滚动,长列表性能差 |
| 14 | 性能 | 首页 4 个并行 API 无批量优化 |
| 15 | 代码 | 134 处空 catch 静默吞错 |
## 头脑风暴 — 上线策略
### 方案 A: 保守上线(修复所有 CRITICAL + 安全加固)
**时间**: 3-4 天
**范围**: 8 个 CRITICAL + 安全 TOP 3
**风险**: HIGH 级别问题可能影响用户第一印象
### 方案 B: 全面打磨(修复 CRITICAL + HIGH + 关键 MEDIUM
**时间**: 7-10 天
**范围**: 全部 CRITICAL + HIGH + 选定 MEDIUM
**风险**: 延迟用户测试,但交付质量更高
### 方案 C: 分层交付(推荐)
**时间**: 分 3 批,每批 2-3 天
**范围**:
- **Batch 1 (P0, 2天)**: 安全 CRITICAL + 功能 CRITICAL + 性能 CRITICAL
- **Batch 2 (P1, 2天)**: UX 一致性 + 长者模式修复 + HIGH 级产品问题
- **Batch 3 (P2, 3天)**: MEDIUM 级优化 + 性能优化 + 代码质量
## 决策
采用**方案 C 分层交付**,优先确保安全和功能完整,然后打磨体验。
### Batch 1 修复清单P0, 预估 2 天)
1. 移除硬编码凭据 → 环境变量注入1h
2. 确认后端不信任前端 Header2h
3. 咨询创建页缺失 → 新增页面或移除入口按钮4h
4. 咨询页长轮询启动时序修复2h
5. Loading 文字 token 修正0.5h
6. Token 存储安全加固4h— 可延至 Batch 2
### Batch 2 修复清单P1, 预估 2 天)
7. AI 聊天页 + 咨询详情页字号 token 替换4h
8. 医生端核心页面字号 token 替换3h
9. StatusTag 色值对齐设计系统1h
10. AI 聊天页接入 PageShell2h
11. 移除 forceSetAuth bridge0.5h
12. 随访流程闭环补全4h— 可延至 Batch 3
### Batch 3 修复清单P2, 预估 3 天)
13. 全局 87 处硬字号 → token 批量替换
14. 74 处硬 padding → token 批量替换
15. 44 个页面补充 ErrorState
16. 主包瘦身 + splitChunks 配置
17. 空 catch 添加日志
18. AI 聊天历史持久化(接后端 API

View File

@@ -0,0 +1,92 @@
# 小程序"我的"页面子页面必要性分析
> 日期: 2026-05-22 | 参与者: 产品经理 / UX 研究员 / UX 架构师 / 医疗业务专家 / 前端技术专家
## 背景
小程序患者端"我的"页面当前有 5 个分组共 19 个菜单入口 + 1 个消息通知独立入口 = 20 个可点击项。远超移动端认知负荷上限7±2需要从全局角度分析各子页面的存在必要性。
## 讨论要点
### 核心问题诊断
1. **功能堆砌**:把所有没有找到更好归属的功能都塞进"我的",导致它变成了"功能大全"而非"个人中心"
2. **入口重复**4 个入口在其他 Tab 已有更自然的路径(积分商城、用药记录、在线咨询、我的报告)
3. **透析噪音**:透析管理 3 个入口对所有用户无条件展示80%+ 非透析用户看到无关功能
4. **语义模糊**:健康记录/我的报告/诊断记录三入口,患者分不清区别
5. **性能浪费**:消息未读数请求 50 条列表而非 count 接口
6. **静态菜单**:无法按患者画像动态显示
### 各入口使用频率评估
| 频率 | 入口 |
|------|------|
| 高频(日活) | 消息通知、用药记录(慢病) |
| 中频(周活) | 我的预约、我的随访、在线咨询、积分商城 |
| 低频(月活) | 我的报告、健康记录、AI 分析、诊断记录、就诊人管理 |
| 极低频 | 透析处方、知情同意、线下活动、长辈模式、设备同步、设置 |
### 患者画像与功能需求矩阵
| 功能 | 普通体检者(50-60%) | 慢病患者(20-25%) | 透析患者(5-8%) | 术后随访(10-15%) |
|------|:---:|:---:|:---:|:---:|
| 我的报告 | 高 | 高 | 高 | 高 |
| 我的预约 | 高 | 中 | 中 | 中 |
| AI 分析 | 高 | 高 | 中 | 高 |
| 健康记录 | 中 | 高 | 中 | 高 |
| 用药记录 | 低 | 高 | 高 | 中 |
| 我的随访 | 低 | 高 | 中 | 高 |
| 透析管理 | 无 | 无 | 高 | 无 |
| 诊断记录 | 低 | 中 | 中 | 高 |
## 结论
### 共识意见
1. **入口数应从 20 缩减到 9-11 个**(常驻 9 + 动态 1-2
2. **移除 4 个重复入口**积分商城TabBar已有、用药记录健康Tab已有、在线咨询助手Tab可达、我的报告"我的"保留但健康Tab快捷入口改为AI分析
3. **透析管理按需显示**:仅透析患者可见,三入口合并为一
4. **健康数据合并**:健康记录+诊断记录合并为"健康档案"Tab切换
5. **长辈模式降级**:从一级入口移入设置页
### 优化后菜单结构
```
[消息通知] ← 优化为 getUnreadCount()
健康档案
├── 我的报告Tab: 检查报告 / AI 解读)
└── 健康档案Tab: 体检记录 / 诊断记录)
就诊服务
├── 我的预约
├── 我的随访
└── 在线咨询
透析管理 ← 仅透析患者可见
└── (内页 Tab: 透析记录 / 透析处方 / 同意书)
账号
├── 就诊人管理
├── 设备同步
└── 设置(含长辈模式开关)
```
### 行动优先级
| 优先级 | 行动 | 预期效果 | 工期 |
|--------|------|---------|------|
| P0 | 未读消息改用 getUnreadCount() | 节省 500ms+ | 0.5天 |
| P0 | 移除 3 个重复入口 | 减少 3 个入口 | 0.5天 |
| P1 | 透析管理条件显示 | 80%用户减少3个无关入口 | 1-2天 |
| P1 | 透析三页合并为一 | 节省 20-30KB | 1-2天 |
| P1 | 抽取 usePaginatedList hook | 消除 300 行重复代码 | 1天 |
| P2 | 健康记录/诊断合并为健康档案 | 减少 2 个入口 | 1-2天 |
| P2 | 长辈模式降级到设置页 | 减少 1 个入口 | 0.5天 |
| P2 | 线下活动改为消息推送触达 | 减少 1 个入口 | 0.5天 |
### 待定
- 后端 `patient` 表是否已有 `patient_type` 字段?需确认才能实现动态菜单
- AI 分析是否应完全合并到"我的报告"Tab还是保留独立入口
- 设备同步最终放在"账号"组还是"健康"Tab