Files
hms/docs/audits/v3-beta/04-miniprogram.md
iven 1e59007bd5 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
2026-05-24 11:32:40 +08:00

147 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 小程序功能测试报告
> 测试工具: weapp-local MCP | 环境: 微信开发者工具, iPhone 12/13 Pro 模拟器
> iOS 10.0.1, 390×844 | 分支: feat/media-library-banner
## 1. 连接与认证
| 项目 | 结果 | 说明 |
|------|------|------|
| MCP 连接 | PASS | ws://localhost:9420 连接成功 |
| inject_auth | PASS_WITH_ISSUES | 报告"注入成功"但存在集成问题C-01 |
| Auth 手动恢复 | PASS | 通过 `__hms` bridge 手动 restoreAuth 成功 |
## 2. Tab 页面测试
### 2.1 首页 (pages/index/index) — PASS
| 检查项 | 结果 | 详情 |
|--------|------|------|
| 问候语 | PASS | "晚上好,系统管理员" + "5月21日周四" |
| 消息铃铛 | PASS | 可点击 |
| 签到卡片 | PASS | 进度环 0%4 个 capsule血压/心率/血糖/体重) |
| 今日体征 | PASS | 4 张卡片,值"---",标签"未记录" |
| 操作按钮 | PASS | "记录体征" + "预约挂号" |
| SOS 按钮 | PASS | 存在 |
| 访客模式 | PASS | 未登录显示轮播图 + 健康资讯 + 注册 CTA |
| Console 错误 | PASS | 无 |
### 2.2 健康 Tab (pages/health/index) — PASS_WITH_ISSUES
| 检查项 | 结果 | 详情 |
|--------|------|------|
| 页面加载 | PASS | 分段选项卡(血压/心率/血糖/体重) |
| 录入表单 | PASS | 收缩压+舒张压输入框 + 参考范围提示 |
| 趋势图 | PASS | 空状态"暂无趋势数据"正确显示 |
| **保存功能** | **FAIL** | 日志 `[health] 保存体征数据失败: {}`C-01 |
### 2.3 助手 Tab / AI 聊天 (pages/messages/index) — PASS
| 检查项 | 结果 | 详情 |
|--------|------|------|
| 页面加载 | PASS | 标题"健康助手 . 小华" |
| 在线状态 | PASS | 绿色圆点 + "24小时在线" |
| 输入框 | PASS | placeholder "输入您的问题..." |
| 发送按钮 | PASS | 存在,无输入时 disabled |
### 2.4 我的 Tab (pages/profile/index) — PASS
| 检查项 | 结果 | 详情 |
|--------|------|------|
| 用户卡片 | PASS | 头像"系" + "系统管理员" |
| 统计数据 | PASS | 健康积分 0 + 连续打卡 0 天 |
| 功能菜单 | PASS | 5 大分组 17 个菜单项完整 |
| 退出登录 | PASS | 红色按钮存在 |
| Console 错误 | PASS | 无 |
### 2.5 商城 Tab — 不在 TabBar 内,需导航访问
## 3. 非 Tab 页面测试
### 3.1 积分商城 (pages/mall/index) — PASS_WITH_ISSUES
| 检查项 | 结果 | 详情 |
|--------|------|------|
| 页面加载 | PASS | 积分头部 + 签到按钮 |
| 空状态 | PASS | "暂无商品" + "更多好物即将上架" |
| **签到功能** | **FAIL** | 日志 `[points] 签到失败: {}`C-01 |
### 3.2 咨询列表 (pages/consultation/index) — PASS_WITH_ISSUES
| 检查项 | 结果 | 详情 |
|--------|------|------|
| 页面导航 | PASS | 成功导航 |
| 骨架屏 | PASS | 4 个 loading card |
| **数据加载** | **FAIL** | 永久 loading 状态无超时提示C-01 + BUG-03 |
## 4. 核心功能 API 验证(绕过小程序 request 层)
| API | 方法 | 结果 | 详情 |
|-----|------|------|------|
| 积分账户 | GET /health/points/account | **PASS** | 余额 40总获得 50总消费 10 |
| 血压保存 | POST /health/patients/{id}/vital-signs | **PASS** | 200返回完整记录 |
| 每日签到 | POST /health/points/checkin | **PASS** | 200checked_in_today=true连续 2 天 |
| 咨询列表 | GET /health/consultation-sessions | **PASS** | 2001 条 active 会话 |
**结论:** 后端 API 全部正常,所有功能性问题源于小程序端 token 读取。
## 5. BUG 详细分析
### C-01: inject_auth 与 request.ts 的 storage 键不匹配
- **严重性:** CRITICAL
- **文件:** `services/request.ts:23-29`
- **现象:** `inject_auth` 写入明文键(`access_token``request.ts``safeGet()` 只调用 `secureGet()`(读 `_es_` 前缀加密键),不 fallback 到明文键
- **根因:** `safeGet``secureGet` 返回空字符串时不 fallback空字符串不抛异常只在 catch 中 fallback。而 `auth.ts``storageGet``secureGet` 返回 falsy 时正确 fallback
- **影响:** 所有需要认证的功能不可用(体征保存、签到、咨询、数据加载)
- **修复:** 统一 `safeGet``storageGet` 的 fallback 逻辑,或让 `inject_auth` 写入加密键
- **预计工时:** 1h
### C-02: secure-storage.ts UTF-16 截断中文字符
- **严重性:** CRITICAL
- **文件:** `utils/secure-storage.ts:13-23`
- **现象:** `toBase64` 使用 `Uint8Array` 截断 UTF-16 高位字节
- **根因:** `charCodeAt` 返回的 UTF-16 编码值超过 255 时被截断为 8 位
- **影响:** 任何含中文的数据(如 `display_name`="系统管理员")经 encrypt-decrypt 循环后损坏,`JSON.parse` 失败
- **修复:** 使用 `TextEncoder`/`TextDecoder` 进行 UTF-8 编解码
- **预计工时:** 2h
### BUG-03: 咨询列表无超时处理
- **严重性:** MEDIUM
- **文件:** `pages/consultation/index`
- **现象:** API 失败时无用户反馈,页面永远显示骨架屏
- **修复:** 添加加载超时和错误状态 UI
- **预计工时:** 1h
### BUG-04: 错误日志输出空对象
- **严重性:** MEDIUM
- **现象:** 签到/体征保存失败时 `catch` 输出 `{}`
- **修复:** 使用 `JSON.stringify(err, Object.getOwnPropertyNames(err))` 输出完整错误
- **预计工时:** 30min
## 6. 测试统计
| 类别 | 测试项 | PASS | FAIL | PASS_WITH_ISSUES |
|------|--------|------|------|------------------|
| 连接与认证 | 3 | 1 | 0 | 2 |
| Tab 页面 | 4 | 3 | 0 | 1 |
| 非 Tab 页面 | 2 | 0 | 0 | 2 |
| UI 元素 | 38 | 38 | 0 | 0 |
| 核心功能API 直测) | 4 | 4 | 0 | 0 |
| 核心功能(应用内) | 3 | 0 | 3 | 0 |
| **合计** | **54** | **46** | **3** | **5** |
**UI 渲染通过率:** 100% (38/38)
**API 直测通过率:** 100% (4/4)
**应用内功能通过率:** 0% (0/3) — 全部因 C-01 失败
**综合通过率:** 85.2% (46/54)
## 7. 评价
**UI 层质量:** 优秀A 级)— 所有页面正确渲染,空状态处理完善,设计系统一致性好。
**功能层质量:** 失败F 级)— 但根因集中在一个 CRITICAL 问题C-01 token 读取),修复后预计 100% 通过。后端 API 经独立验证全部正常。