实时保存方式
项目访问链接
https://zion.functorz.com/tool/rmLyJ0ZAv8e/WEB?code=kGwL9xCMUKmLi&ref=4857164
简介
- 目标:实现具备防冗余创建、实时保存的表单草稿功能。
- 适用场景:长文本创作、多步骤政务审批、在线考试系统等需要防止因非正常退出导致数据丢失的表单场景。
- 核心逻辑:新建按钮 -> 预检索数据源判断(有空行则复用,无空行则创建) -> 唤醒弹窗并接管 ID -> 输入组件失去焦点时 -> 空输入拦截校验 -> 修改数据。
实现步骤
本教程基于预置的常用组件样式模板 模板进行演示。模板页中仅预设了基础的常用组件的样式,不包条件状态、数据绑定或行为配置。在实际搭建时,可以选择直接从模板页复制所需组件到工作页,以节省样式调整时间,专注于核心逻辑的构建。
数据存储
要实现草稿系统,我们需要在数据库中建立一个专门的表来映射用户数据及其处理状态。
数据模型
表名:表单
| 字段名 | 类型 | 备注 |
|---|---|---|
| id | 长整数 | 自动生成,唯一标识 |
| 状态 | 文本 | 枚举值:空白草稿、已填草稿、已提交、已删除 |
| 字段1 | 文本 | 业务输入内容 1 |
| 字段2 | 长整数 | 业务输入内容 2 |
| 帐户_id | 长整数 | 外键,关联 帐户 表的 id |
关系映射:帐户 表与 表单 表存在 一对多 关系(一个帐户拥有多条表单/草稿记录)。

逻辑与状态配置
预检索空白草稿数据源
在 页面 表单草稿 级别配置数据源,用于实时检索当前用户名下是否已存在未填写的草稿。
- 数据源名称:
source_form_empty_draft - 目标数据表:
表单 - 请求类型:查询
- 数据限额:1
- 数据筛选条件:
帐户_id等于当前用户/id且 (AND)状态等于空白草稿。

“新建”按钮嵌套行为流配置
配置 按钮 新建 的 点击时 事件触发器,实现登录校验与草稿查重。
- 登录检查:添加条件节点,配置
分支 未登录。条件设置为是否登录状态为假。- 动作:显示提示 ->
请先登录。
- 动作:显示提示 ->
- 空白草稿检查:在
分支 已登录下添加条件节点,配置分支 无空白草稿。条件设置为source_form_empty_draft/id为空。


- 执行新建占位逻辑(无空白草稿分支):
- 添加数据:目标表为
表单。状态赋值为空白草稿;帐户_id绑定为当前用户/id。 - 打开自定义弹窗:选择
弹窗 表单填写。入参empty_draft_form_id绑定为上一步“添加数据”节点的id出参。 - 刷新数据源:选择页面级数据源
source_form_empty_draft。
- 添加数据:目标表为


- 执行复用重定向逻辑(有空白草稿分支):
- 打开自定义弹窗:选择
弹窗 表单填写。入参empty_draft_form_id直接绑定为source_form_empty_draft/id。 - 刷新数据源:选择页面级数据源
source_form_empty_draft。
- 打开自定义弹窗:选择

弹窗状态接管与变量转储
- 变量声明:在
弹窗 表单填写数据面板中创建输入参数empty_draft_form_id、变量form_id,类型选择 长整数。 页面加载时:- 设置变量:作用域选择
页面和组件-> 变量指定为form_id-> 值绑定为外部传入的入参empty_draft_form_id。
- 设置变量:作用域选择


UI 构建与交互
示例中在弹窗内使用文本组件展示了 form_id 的当前值,目的是方便实时观察变量在操作过程中的变化;实际应用时时,可根据需要移除。
输入组件配置
- 输入框 字段1:输入值类型保持文本。
- 输入框 字段2:输入值类型 切换为 长整数。

失焦实时保存与空值保护校验
- 配置“输入框 字段1”的自动保存:在组件的
失去焦点时事件下添加条件判断行为。- 空值拦截:添加条件节点,配置
分支 输入为空。组合条件设为输入框 字段1/组件输出为空且 (AND)输入框 字段2/组件输出为空。- 动作:显示提示
至少填写一项。
- 动作:显示提示
- 非空时:配置
分支 输入非空。- 修改数据:选择
表单表。数据筛选设置条件为id等于变量/弹窗 表单填写/form_id。字段追加配置中,将状态赋值为常量字符串已填草稿;将字段1绑定为当前组件输出值。 - 成功时动作:显示提示
成功存储草稿。
- 修改数据:选择
- 空值拦截:添加条件节点,配置


- 配置“输入框 字段2”的自动保存:在组件的
失去焦点时事件下添加相似的条件判断行为。- 分支逻辑差异:在非空分支下的
修改 表单节点中,将业务字段字段2绑定为当前组件输出值。
- 分支逻辑差异:在非空分支下的
历史草稿箱列表与交互逻辑
- 草稿总数看板:
文本 当前草稿数量组件的内容直接绑定当前用户/表单/数量,过滤条件为状态状态等于已填草稿。

当用户数据加载或刷新时,“当前用户/表单/数量”更新。为了在添加或删除草稿时保持计数准确,请确保在列表的“订阅成功时”事件中添加“刷新当前用户数据”操作。
- 草稿列表数据源绑定:
- 弹窗内
列表组件的数据源请求类型指定为 订阅,绑定目标为表单表。数据筛选行条件设置为:帐户_id等于当前用户/id且 (AND)状态等于已填草稿。- 成功时添加动作:刷新数据源 -> 目标指向页面级全局查询
source_form_empty_draft。
- 成功时添加动作:刷新数据源 -> 目标指向页面级全局查询
- 弹窗内

- 视图展开/收起状态控制:
- 选中组件
条件容器 草稿箱。 - 展开配置:
条件 未展开视图下的按钮 草稿箱点击时 -> 切换条件式容器状态 -> 目标容器指定为条件容器 草稿箱,切换至条件 展开。同时将下方列表切换至条件 列表展开。 - 收起配置:
条件 展开视图下的按钮 草稿箱点击时 -> 切换条件式容器状态 -> 目标容器重置回条件 未展开。同时将下方列表重置为条件 列表闭合。
- 选中组件


- 历史草稿应用反填逻辑:选中列表行内组件
文本 应用,绑定其点击时事件行为。- 设置变量:将变量
form_id的值重新赋值为数据源/列表/当前项/id。 - 设置输入型组件值:将组件
输入框 字段1的值赋值为数据源/列表/当前项/字段1。 - 设置输入型组件值:将组件
输入框 字段2的值赋值为数据源/列表/当前项/字段2。
- 设置变量:将变量

- 历史草稿删除与正在编辑锁保护:选中行内组件
文本 删除,绑定其点击时事件行为。- 编辑态自锁判定:添加条件节点,配置
分支 当前表单id为删除项id。判定条件设置为变量/弹窗 表单填写/form_id等于数据源/列表/当前项/id。- 拦截动作:显示提示
不能删除正在编辑的草稿。
- 拦截动作:显示提示
- 物理软删除:配置
分支 当前表单id非删除项id。- 修改数据:选择
表单表。数据筛选设置条件为id等于数据源/列表/当前项/id。在字段映射表中将状态直接赋值重写覆盖为常量字符串已删除。- 成功时动作:显示提示
删除草稿成功。
- 成功时动作:显示提示
- 修改数据:选择
- 编辑态自锁判定:添加条件节点,配置


正式提交与弹窗关闭
- “提交”按钮配置:选中组件
按钮 提交,绑定其点击时事件行为。- 修改数据:选择
表单表。数据筛选设置条件为id等于变量/弹窗 表单填写/form_id。在字段映射中将控制草稿生命周期的状态字段赋值变更为已提交。- 成功时:添加提示
成功提交。执行 UI 退出动作,选择关闭最上层。
- 成功时:添加提示
- 修改数据:选择
- “关闭”按钮配置:选中组件
按钮 关闭,点击时添加动作 关闭弹窗(选择关闭最上层),由于系统在之前的输入失焦时已保存草稿,直接关闭弹窗不会丢失数据。


验证
步骤 1:验证“空白草稿”复用逻辑
- 点击底部的 模拟登录 选择一个帐户。
- 点击页面上的 新建 按钮,弹出填写表单的弹窗。
- 预期结果:保持两个输入框完全空白,点击弹窗底部的 取消 按钮。再次点击 新建,检查:系统未产生第二条记录,两次弹窗顶部反显的当前表单 id 完全一致,证明数据源成功执行了复用逻辑。
步骤 2:验证组件失去焦点时保存草稿
- 在弹窗的
字段1输入框中键入测试文本。 - 点击弹窗任意空白非交互区域,使组件触发失去焦点行为。
- 预期结果:屏幕上方弹出提示
成功存储草稿。查看数据表,该行记录的状态列已由空白草稿变更为已填草稿。
- 预期结果:屏幕上方弹出提示
- 手动将
字段1内容完全清空并保持整个表单双空,再次点击空白处使其失焦。- 预期结果:行为流内双空判定表达式生效,顶部弹出提示
至少填写一项,覆盖动作被成功拦截。
- 预期结果:行为流内双空判定表达式生效,顶部弹出提示
步骤 3:验证历史草稿箱恢复与正在编辑锁
- 展开草稿箱,在列表中选择任意一条历史草稿,点击行内的 应用。
- 预期结果:输入框组件内部的数值与文本更新为该历史记录的内容,且当前弹窗内部状态变量
form_id被赋值为对应id。
- 预期结果:输入框组件内部的数值与文本更新为该历史记录的内容,且当前弹窗内部状态变量
- 在下方的草稿箱列表中点击当前正处于编辑状态的这一行记录旁的 删除。
- 预期结果:自锁保护逻辑生效,屏幕上方弹出提示
不能删除正在编辑的草稿。
- 预期结果:自锁保护逻辑生效,屏幕上方弹出提示
Last updated on