# 跨部门头脑风暴 — 问题研讨与优化方案 > 日期: 2026-05-21 | 参与方: 前端/后端/小程序/安全/UX/DevOps > 基于 V3 Beta 综合测试发现 ## 1. 会议议题 基于 5 个专家团队的测试发现,识别出 **4 个 CRITICAL + 8 个 HIGH + 15 个 MEDIUM** 问题。本次头脑风暴聚焦于: 1. CRITICAL 问题修复方案与优先级 2. 移动端响应式架构决策 3. 小程序安全存储架构改进 4. 后端 DTO-Entity 映射质量管控 5. Beta 发布时间线 --- ## 2. 议题一: 小程序认证链路断裂 (C-01 + C-02) ### 问题 `inject_auth` → 明文键 → `request.ts safeGet` 只读加密键 → 所有 API 无 token `secure-storage.ts` → UTF-16 截断 → 中文数据加密后解密损坏 ### 方案讨论 | 方案 | 描述 | 优点 | 缺点 | |------|------|------|------| | **A. 统一 safeGet fallback** | `safeGet` 在 `secureGet` 返回空时 fallback 到明文键 | 改动最小(1 文件) | 认证路径依赖两套存储 | | **B. inject_auth 写加密键** | MCP 注入时直接写 `_es_` 前缀加密键 | 根因修复 | MCP 需实现加密逻辑 | | **C. 统一存储层重构** | 所有读写走单一 `storageGet/storageSet`,内部处理加密/明文 fallback | 架构最优 | 改动范围大 | ### 决策 **采用方案 A + 修复 C-02**,预计 3h: 1. `request.ts safeGet` 添加与 `auth.ts storageGet` 一致的 fallback 逻辑 2. `secure-storage.ts toBase64/fromBase64` 改用 `TextEncoder/TextDecoder` 3. 添加单元测试验证中文字符加密/解密循环 --- ## 3. 议题二: 移动端响应式 (C-03 + C-04 + H-03) ### 问题 - 375px: 表格不可用,列严重挤压 - 812×375: 内容区域空白 - 768px: 表格数据不加载 ### 方案讨论 | 方案 | 描述 | 工时 | 效果 | |------|------|------|------| | **A. Ant Design ProTable 响应式** | 使用 `responsive` 配置自动切换卡片视图 | 2d | 列表页全覆盖 | | **B. CSS Grid + 媒体查询** | 手写 `@media` 断点,表格→卡片 | 3d | 精细控制 | | **C. 独立移动端组件** | 为移动端创建 `MobilePatientCard` 等组件 | 5d | 最佳 UX | ### 决策 **采用方案 A**,Ant Design ProTable 自带 responsive 支持: 1. 为 `<768px` 启用 `cardView` 模式 2. 修复 768px 断点侧边栏折叠同步问题 3. 修复 812×375 高度不足导致懒加载未触发 **注意:** HMS 定位为 PC 管理后台,移动端支持优先级低于小程序。方案 A 满足"基本可用"即可。 --- ## 4. 议题三: 健康数据 DTO 映射 (H-06) ### 问题 日常监测 API 通过率 20%,DTO 字段(`systolic`/`diastolic`)与 Entity 列名(`morning_bp_systolic`/`morning_bp_diastolic`)不匹配,导致所有测量值存为 null。 ### 根因分析 1. DTO 设计采用通用字段名,Entity 使用具体时段字段名 2. Handler 层缺少 DTO→Entity 的显式映射逻辑 3. SeaORM 隐式匹配字段名,不匹配的静默为 null ### 修复方案 1. **DTO 重构:** 定义 `CreateDailyMonitoringReq` 明确映射到 Entity 字段 2. **Handler 添加映射:** 显式 `entity.morning_bp_systolic = dto.systolic` 等 3. **添加集成测试:** 确保写入后能正确读回 4. **值范围校验:** 血压 60-300 / 心率 30-250 / 血糖 1-50 5. **日期校验:** `record_date <= today` 预计工时: 4h --- ## 5. 议题四: 安全问题汇总 (XSS + SSRF + 输入校验) ### 发现清单 | 问题 | 位置 | 风险 | |------|------|------| | XSS 存储未消毒(患者名/咨询描述) | patient_handler / consultation_handler | Stored XSS | | dangerouslySetInnerHTML 无消毒 | ArticlePhonePreview.tsx | DOM XSS | | 空分类名被接受 | article_category_handler | 数据质量 | | 文章标题超长导致 500 | article_handler | DoS/信息泄漏 | | API limit 无上限 | 多个 list 端点 | 资源耗尽 | ### 修复优先级 1. **P0 (1h):** 文章标题添加 `#[validate(length(max=255))]` 2. **P1 (2h):** 患者名/咨询描述添加 HTML sanitize 3. **P1 (30min):** ArticlePhonePreview 引入 DOMPurify 4. **P2 (1h):** 所有 list 端点 limit 上限设为 200 5. **P2 (30min):** 分类名称添加 `#[validate(length(min=1))]` --- ## 6. 议题五: 性能优化路线图 ### 关键性能指标 | 指标 | 当前值 | 目标 | 优先级 | |------|--------|------|--------| | Dashboard LCP | 1381ms | < 1000ms | P1 | | Patient List LCP | 2643ms | < 2000ms | P1 | | API 重复调用 | ×4 | ×1 | P0 | | Antd Table Reflow | 460ms | < 100ms | P2 | | Noto Sans SC | 1.3MB | < 300KB | P2 | ### 优化方案 1. **API 去重 (P0, 4h):** 检查 AdminDashboard useEffect 依赖项,考虑 React Query 缓存 2. **字体优化 (P2, 1h):** `font-display: optional` + 预加载关键子集 3. **虚拟滚动 (P2, 2h):** Antd Table `scroll={{ virtual: true }}` 4. **固定 scroll (P2, 1h):** 设置固定 `scroll.x`/`scroll.y` 避免 `measureScrollbarSize` --- ## 7. 议题六: 代码质量提升 ### 静默吞错治理 **原则:** 所有 catch 块至少记录 `console.warn`,关键路径设置错误状态。 ```typescript // BAD .catch(() => {}) // GOOD .catch((err) => { console.warn('[PatientList] 加载统计数据失败:', err); // 可选: setErrorState(true) }) ``` ### 大文件拆分计划 | 文件 | 行数 | 拆分方案 | 优先级 | |------|------|---------|--------| | AdminDashboard.tsx | 734 | StatsCards + Charts + ModuleStatus | P2 | | ArticleManageList.tsx | 654 | FilterBar + ArticleTable + DetailDrawer | P2 | | FollowUpTaskList.tsx | 543 | TaskFilter + TaskTable + TaskDetail | P3 | --- ## 8. 行动计划与时间线 ### Phase 0: CRITICAL 修复(Day 1-2,阻塞 Beta) | 任务 | 负责方 | 工时 | 依赖 | |------|--------|------|------| | C-01: safeGet fallback | 前端 | 1h | — | | C-02: UTF-8 编码 | 前端 | 2h | — | | H-01: 患者表单验证 | 前端 | 1h | — | | H-06: DTO-Entity 映射 | 后端 | 4h | — | | H-07: 文章标题校验 | 后端 | 30min | — | | H-02: 预约列表 API | 全栈 | 2h | 需调查根因 | ### Phase 1: HIGH 修复(Day 3-4) | 任务 | 负责方 | 工时 | |------|--------|------| | C-03/C-04: 移动端卡片视图 | 前端 | 2d | | H-03: 768px 断点修复 | 前端 | 4h | | H-05: API 去重 | 前端 | 4h | | XSS sanitize (患者/咨询) | 后端 | 2h | ### Phase 2: MEDIUM + 性能优化(Day 5-7) | 任务 | 负责方 | 工时 | |------|--------|------| | 对比度修复 | 前端 | 30min | | Dark Mode 卡片 | 前端 | 4h | | 静默吞错治理 | 前端 | 2h | | 字体优化 | 前端 | 1h | | API 输入校验补全 | 后端 | 3h | ### Phase 3: LOW + 技术债(Beta 后迭代) - i18n 迁移(渐进) - 大文件拆分(渐进) - 内联样式清理(渐进) - 类型声明补全(小程序) --- ## 9. 会议结论 ### Beta 发布条件 **必须在 Phase 0 + Phase 1 完成后才能发布 Beta 版本:** 1. ✅ 4 个 CRITICAL 全部修复 2. ✅ 8 个 HIGH 全部修复 3. ✅ 所有修复通过回归测试 4. ✅ `cargo check` + `cargo test` + `pnpm build` 全部通过 5. ✅ 浏览器 + 小程序手动验证核心流程 ### 预计时间线 - **Phase 0:** Day 1-2 (CRITICAL + HIGH 后端) - **Phase 1:** Day 3-4 (移动端 + API 去重 + XSS) - **Beta 发布:** Day 4 结束 - **Phase 2:** Day 5-7 (MEDIUM + 性能) - **正式版 V1:** Day 7+ (根据 Beta 反馈)