设计器变量和数组绑定交互验收
本次变化
画布文字编辑区和检查器正文工具条提供“插入变量”,按当前 XML 节点的词法作用域列出字段路径与类型,并支持手写路径。模板保留 ${patient.name} 原文,预览和导出使用独立 JSON 数据绑定。数据列表和数据表格通过数组路径、迭代变量及初始内容字段创建;两处插入菜单统一分组,表格、数据表格、数据列表、正文分栏和独立图文栅格归入“布局与容器”。
本次没有合并这些元素的底层模型。单个列表项不会自动重复;表格保留行列语义,栅格保留独立区域语义,连续正文仍使用正文分栏。限制及操作见设计器指南。
自动验证
Windows、JDK 21、Node.js 24 和 Chrome 环境中执行:
.\gradlew.bat --max-workers=1 --no-parallel :export4j-designer:test :export4j-designer:installDist :export4j-designer:distZip
$env:EXPORT4J_STUDIO_OUTPUT='build/verification/designer-bindings-ux/full-browser'
Push-Location export4j-designer/frontend
node --test tests/studio.test.mjs tests/grid.test.mjs tests/bindings.test.mjs
Pop-Location设计器 55 项 Java 测试通过。前端包括 42 个实际浏览器交互场景、18 个栅格 XML 场景及 16 个变量元数据场景,加上 3 个父测试,共 79 项通过,无失败或跳过。浏览器场景启动独立临时服务,不在正在编辑的工作区上执行写入测试。
新增交互场景检查:
- 单个列表项插入根字段,数据列表正文插入当前项字段;容器属性保留数组路径和别名。
- 动态表格表头不显示本表当前行别名,正文单元格显示并可插入;保存 ZIP、重开并重新加载 JSON 后,变量原文保持一致。
- 画布插入变量保留光标位置;撤销仅移除变量,先前输入仍在;重做恢复变量;取消不改正文。
- 顶部及画布插入菜单均显示分组、数据列表、数据表格与独立图文栅格;取消数组选择不创建节点,980 px 视口没有横向溢出。
- 在
each内插入时列出当前别名下的数组;仅含空对象的数组不会自动生成不可绑定的对象正文,须明确填写字段。 - 无数组时,确认默认示例路径才同时写入模板和示例 JSON;一次撤销同时恢复两者。
元数据场景另行检查嵌套作用域、同名别名遮蔽、空数组、非法 JSON、原文模式提示、预算及声明拒绝。返回结果只包含字段路径、类型和作用域,不返回测试数据值。
文件与视觉检查
从实际浏览器保存的 binding-ux-template.zip 检查 ZIP CRC、原 XML、数组路径及两种别名。PDF 使用 pypdf 6.10.0 独立检查:共 1 页,患者姓名出现一次,两种药名分别在列表和表格中各出现一次,顺序正确,没有未绑定变量原文。
Poppler 26.07.0 和 PDFium(pypdfium2 5.13.0)以 192 DPI 渲染同一页,固定 blur2 比较:平均通道误差 0.297259、变化像素比例 0.000944,小于既有阈值 4 和 0.06。已目视检查 PDF 页面、变量选择器和分组菜单截图。原始报告、文件及截图保留在忽略目录 build/verification/designer-bindings-ux/。
实际启动服务另行检查首页包含新入口,6 个所服务脚本/样式的 SHA-256 与本次构建一致;恢复的模板和 JSON 与旧服务中已提交的副本一致,4 页预览成功,浏览器未报告脚本错误。旧进程及页面保留,浏览器尚未提交的草稿不属于服务端副本。
验证边界
本轮验证设计器编辑、XML/ZIP 保留及 PDF 绑定闭环,没有新增 Word 原生公式或跨格式布局的验收。字段建议来自有限预算内的测试数据;没有列出的路径仍可手写,合法性由模板引擎继续检查。修改已有别名不会自动重写正文,静态表格也不会自动转为按数组重复的动态表格。