# webview-preview Specification ## Purpose 提供统一 WebView、PDF/文档、图片/影像、EMR HTML 和外部资源安全预览契约,供报告、眼健康档案、个人中心、订单和内容模块复用,避免各业务模块重复实现预览底层或绕过 host 白名单、下载打开和错误兜底规则。 ## Requirements ### Requirement: REQ-COMMON-002-01 COMMON-002 WebView/PDF/外部预览契约 系统 MUST 按 PRI-MP-COMMON-002 上下文包、功能点专项矩阵和集成队列裁定口径实现本模块能力,并保留跨模块契约、真实接口边界和人工联调边界。 - 历史追溯:本模块最初从 `develop@9a529fc` 的 `feature/PRI-MP-COMMON-002-webview-preview` 分支开发;该记录不构成当前业务或验收要求。 - MUST:覆盖当前模块功能点专项矩阵,并对每个功能点给出已实现、暂缓、划归其他模块、待确认或不属于本模块的结论。 - MUST:记录契约与依赖闭环,未完成依赖必须使用待开放、禁用态或安全兜底。 - MUST:自检报告包含新版设计基线、旧源码功能基线、视觉布局基线、真实接口与禁止模拟业务数据检查。 - MUST:提交待集成时列出共享文件清单、固定检查结果和人工联调项。 - MUST NOT:子 Agent 自行合并或推送 `develop`。 - MUST NOT:使用 mock、本地假接口、硬编码业务返回或静态业务数据替代真实接口。 - MUST NOT:主动触发真实支付、医保、退款、订单创建、预约提交、实名/OCR/人脸、IM/TRTC 等高风险真实动作;涉及本模块的真实动作必须列为人工联调。 #### Scenario: 模块提交待集成 - Given PRI-MP-COMMON-002 模块开发完成 - When 子 Agent 提交待集成材料 - Then OpenSpec strict、功能点矩阵闭环、契约与依赖闭环、共享文件清单、禁止 mock/硬编码扫描、人工联调项和固定检查结果 MUST 齐全。 ### Requirement: REQ-COMMON-002-02 安全 WebView 打开 系统 MUST 提供统一 WebView 页面和安全 URL 校验。 - MUST:注册 `pages/common/webview/webview`。 - MUST:兼容 query `url/title/source` 和 `eventChannel.openUrl`/`previewPayload` 入参。 - MUST:对 URL 进行 decode、http/https 协议校验和 host 白名单校验。 - MUST:拒绝空 URL、`javascript:`、`file:`、`data:`、非 http/https 和未登记 host。 - MUST:加载中、加载失败、返回、重试状态稳定展示。 - MUST:CONTENT-001 首页科普、科普列表和 EYE-001 眼健康文章外链 MUST 复用该契约。 #### Scenario: 未登记 host 被拒绝 - Given 调用方传入一个未登记业务域名的 H5 链接 - When WebView 页面加载 - Then 系统 MUST 显示服务暂不可用,不得渲染 web-view。 ### Requirement: REQ-COMMON-002-03 PDF/文档下载打开 系统 MUST 提供统一文档预览页和下载后打开能力。 - MUST:注册 `pages/common/preview/preview`。 - MUST:支持 `url` 直开和 `filename/fileName/path` 拼接。 - MUST:复原旧 PDF 路径规则:`filename` 不含 `/h` 且未声明跳过院区路径时,使用 `hisHospID.toLowerCase()` 拼接。 - MUST:复用 COMMON-001 `utils/resource.downloadFile`。 - MUST:处理非 2xx、空 `tempFilePath`、下载失败、文件类型不支持和 `wx.openDocument` fail。 - MUST NOT:生成本地假 PDF 或静态文件。 #### Scenario: hisHospID 缺失 - Given 调用方只传入相对 `filename` - And 当前医院态缺少 `hisHospID` - When 用户打开文档预览 - Then 系统 MUST 显示文件路径缺失或医院配置缺失错误态,不得拼接空路径。 ### Requirement: REQ-COMMON-002-04 图片/影像预览 系统 MUST 提供统一图片预览契约。 - MUST:支持 `current/url/urls[]`。 - MUST:过滤空 URL、异常 URL 和未通过白名单校验的 URL。 - MUST:全部为空时不得调用 `wx.previewImage`。 - MUST:订单已有发票资源预览 MUST 复用本契约;生成发票不属于本模块。 #### Scenario: 发票图片预览 - Given 订单存在真实 `invoiceUrl` - When 用户点击查看发票 - Then 系统 MUST 进入统一预览契约并调用 `wx.previewImage` 打开真实资源。 ### Requirement: REQ-COMMON-002-05 动态路由与跨模块边界 系统 MUST 保留动态路由白名单和跨模块复用边界。 - MUST:新增 common 页面进入 `homeRoute` 白名单。 - MUST:`jumpPages/routePath/sourceUrl` 只能解析为已登记小程序路由或安全 WebView。 - MUST:EMR HTML 只提供真实 URL 打开契约,不解析、不伪造病历内容。 - MUST:`tempCommon/activityform/routeHospital` 旧缺口本模块只承接安全展示壳或划出,不实现业务提交、电子签名、地图真机授权或支付类逻辑。 #### Scenario: 消息 jumpPages 未命中 - Given 消息 `jumpPages` 解析后不在小程序白名单 - When 调用方尝试打开 - Then 系统 MUST 显示安全兜底,不得直接透传到 web-view。