关联 SRS:
docs/superpowers/specs/2026-11-09-signature-canvas2d-rewrite.md(需求编号DOC-2026-11-09-signature-canvas2d-rewrite,状态:待开发)。 取代:docs/superpowers/specs/2026-11-08-signature-landscape-fix.md(整份作废,见 §历史)与旧台账(横屏 TC-SIG-01~05 系列已作废归档)。 能力键:signature.canvas2d.rewrite(前端 UI 纵切,无独立后端接口)。 涉改文件:cfc-frontend/pages/signature/signature.vue(S4-1 竖屏直签)、cfc-frontend/pages/signature/components/hand-signature/hand-signature.vue(S4-2 canvas 2d,位于 signature 子包内)。 派生自user-scenarios/的家长/孩子签名回传场景(health-plan-summary / checkout / consignee-edit 跳转进入)。
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-SIG2D-01 | SIG-1 | 签名·去横屏化 | 家长/孩子 | P0 | 功能 | 进入签名页(任意机型) | 1. 检查 signature.vue script | 不再存在 enterLandscape()/restorePortrait() 方法及其 onLoad/onUnload 调用(S4-1) |
S4-1 删除横屏方法 | — |
| TC-SIG2D-01b | SIG-1 | 签名·去横屏化 | 家长/孩子 | P0 | 功能 | 进入签名页 | 1. 检查模板与样式 | 无 h5DegradeHint / .rotate-hint 模板块与样式(S4-1 删除 H5 降级提示) |
S4-1 删除降级提示 | — |
| TC-SIG2D-01c | SIG-1 | 签名·去横屏化 | 家长/孩子 | P0 | 功能 | 进入签名页 | 1. 检查源码 | 不再调用 wx.setPageOrientation / screen.orientation.lock(不再依赖不可靠横屏能力) |
S4-1 去横屏依赖 | — |
| TC-SIG2D-02 | SIG-1 | 签名·竖屏布局 | 家长/孩子 | P0 | 兼容 | 竖屏进入签名页 | 1. 竖屏下查看画布高度 | computeCanvasHeight() 保留竖屏计算:windowHeight − reserved(requireAgree 214 / 否则 174),且不低于 160 下限 |
S4-1 保留 computeCanvasHeight | — |
| TC-SIG2D-03 | SIG-2 | 签名·canvas 2d | 家长/孩子 | P0 | 功能 | 渲染签名组件 | 1. 检查组件模板 | <canvas :id="canvasId" type="2d">,不再使用 canvas-id 旧式绑定 |
S4-2 模板 2d 化 | — |
| TC-SIG2D-03b | SIG-2 | 签名·canvas 2d | 家长/孩子 | P0 | 功能 | 渲染签名组件 | 1. 检查组件 data | `canvasId: 'hsCanvas_'+(this._uid | 0)多实例唯一;_canvasNode: null`(导出用 2d 节点) |
|
| TC-SIG2D-04 | SIG-2 | 签名·canvas 2d | 家长/孩子 | P0 | 功能 | mounted 初始化 | 1. 检查 mounted 逻辑 | 走 createSelectorQuery().in(this).select('#'+canvasId).fields({node:true,size:true,rect:true}),不再用 .select('.signature-canvas').boundingClientRect 缓存 rect |
S4-2 初始化 | — |
| TC-SIG2D-05 | SIG-2 | 签名·坐标修复 | 家长/孩子 | P0 | 功能 | 触摸书写 | 1. 书写签名 | 触摸坐标优先 t.x/t.y(type=2d 相对画布,不再依赖缓存 rect);兜底 t.clientX − _rectLeft/_rectTop |
S4-2 触摸坐标 | — |
| TC-SIG2D-06 | SIG-2 | 签名·笔迹可见 | 家长/孩子 | P0 | 功能 | 书写签名 | 1. 书写时观察笔迹 | onTouchMove 用 ctx.stroke() 同步绘制,无异步 ctx.draw()(笔迹实时可见,根因 R2 修复) |
S4-2 同步绘制 | — |
| TC-SIG2D-07 | SIG-2 | 签名·导出/清空 | 家长/孩子 | P0 | 功能 | 已绘制 | 1. 确认导出 2. 重写清空 | 导出 canvasToTempFilePath({canvas:this._canvasNode,...})(2d 节点,非 canvasId);清空 ctx.clearRect 同步,无 ctx.draw() |
S4-2 导出/清空 | — |
| TC-SIG2D-08 | SIG-3 | 签名·契约不回归 | 家长/孩子 | P1 | 回归 | 三调用方跳转 | 1. 从 health-plan-summary / checkout / consignee-edit 进入 2. 签名回传 | 组件对外契约不变:props(value/strokeColor/strokeWidth/height/requireAgree/agreeText)+ emit(confirm/clear/agree-change)保持,调用方无感 | S4-3 不回归 | — |
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-SIG2D-01-E | SIG-2 | 签名·2d 初始化失败 | 家长/孩子 | P2 | 异常 | fields size/rect 均无效 | 1. 初始化失败路径 | 失败时 console.log + 定时器重试一次;_destroyed 时停止(参照 RadarChart,不静默) |
S4-2 初始化防御 | — |
| TC-SIG2D-02-E | SIG-2 | 签名·导出降级 | 家长/孩子 | P2 | 异常 | H5 / 无文件系统 | 1. H5 端确认导出 | H5 直接传 dataURL;小程序 fs.readFile 转 base64 既有链路保持不变 | S4-2 导出保持既有链路 | — |
本特性为纯前端 UI 纵切,无独立权限维度;权限沿用进入签名页的上游角色(家长/孩子),不单列权限流。
| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
|---|---|---|---|---|---|---|---|---|---|---|
| TC-SIG2D-N01 | SIG-2 | 签名·多端兼容 | 家长/孩子 | P1 | 兼容 | iOS / 安卓真机或等效工具 | 1. 两平台(含无法自动横屏的机型)竖屏进入签名页 2. 书写 | 任意机型竖屏可签,无横屏依赖;笔迹实时可见 | S4-1/S4-2 | — |
| TC-SIG2D-N02 | SIG-2 | 签名·既有 2d 组件不回归 | 家长/孩子 | P1 | 回归 | 雷达图/沙盘/趋势图/mbti 页面 | 1. 抽查项目内既有 2d 组件 | 未触碰(radar/trend/family/wuxing/mbti/ability 等 10+ 处不受影响) | S4-3 不回归 | — |
DOC-2026-11-09-signature-canvas2d-rewrite(2026-11-09)重写,取代 11-08 横屏方案(R2 根因:旧式 uni.createCanvasContext 触摸坐标依赖缓存 rect → 坐标漂移字迹不显示;R1 根因:setPageOrientation 部分机型不可靠)。c0db9643c(feat(DOC-2026-11-09-signature-canvas2d-rewrite))已于 2026-11-09 09:07 经 ff76e1607 合入 cfclub;signature.vue 已去横屏依赖、hand-signature.vue 已改 type="2d" + ctx.stroke() 同步绘制。cfc-frontend/__tests__/pages/signature/signature.canvas2d.test.js 覆盖全部 S4-1/S4-2 契约(11 例:9 RED 契约 + 2 保留 GREEN 基线)。npx jest __tests__/pages/signature → 14/14 全绿(含 9 例原 RED 契约转 GREEN),前端全量 383/40 中不再含签名相关红例 → 与 B-81-Update 的「实现已验证(11/11)」+「待合入 cfclub」两项前置双双达成,B-81 可闭环。cfc-frontend/__tests__/pages/signature/signature.landscape.superseded.js(7 例验证已作废 S1/S2/S3,改名不参与 jest 匹配,保留审计)。