低代码平台表单引擎与业务事件设计实践

  • 低代码平台表单引擎与业务事件设计实践
    • 一、什么是低代码?它能做什么?
    • 二、请假系统案例介绍
      • 2.1 主要功能
      • 2.2 业务流程
    • 三、表单元数据、实例数据与业务事件联动设计
      • 3.1 表单元数据(Meta)如何设计
      • 3.2 表单实例数据(Data)如何保存(宽表结构)
      • 3.3 业务事件与数据节点的联动
    • 四、业务事件与原子策略的实现(详细Java代码)
      • 4.1 业务事件类型举例
      • 4.2 详细Java实现
        • 4.2.1 事件上下文对象
        • 4.2.2 原子策略接口
        • 4.2.3 具体策略实现
        • 4.2.4 策略工厂
        • 4.2.5 事件配置对象
        • 4.2.6 事件引擎
        • 4.2.7 事件驱动示例
    • 五、架构设计总结
    • 六、常见业务事件场景举例
    • 七、数据结构建议(最终版)
      • 7.1 表单元数据(MongoDB)
      • 7.2 表单实例数据(MySQL,宽表结构)
      • 7.3 业务事件(MongoDB)
    • 八、结语

低代码平台表单引擎与业务事件设计实践

一、什么是低代码?它能做什么?

低代码(Low-Code)是一种通过可视化拖拽、配置和少量代码开发应用的方式。它极大地降低了开发门槛,让业务人员也能参与到应用搭建中。低代码平台通常具备以下能力:

  • 可视化表单设计:通过拖拽组件快速搭建业务表单。
  • 流程编排:配置化定义审批流、业务流转。
  • 业务规则配置:通过“事件-动作-条件”方式实现复杂业务逻辑。
  • 数据集成:对接外部系统、数据库,实现数据互通。
  • 快速上线与迭代:大幅缩短开发周期,支持敏捷变更。

低代码平台适用于OA审批、报销、请假、合同、CRM等大量表单驱动的业务场景。


二、请假系统案例介绍

为了更好地理解低代码平台的能力,我们以“请假申请系统”为例,介绍其功能和业务逻辑。

2.1 主要功能

  • 员工提交请假申请,填写请假人、请假时间、请假原因等信息。
  • 系统自动带出直属领导作为审批人。
  • 请假天数超过3天时,自动增加二级、三级审批人。
  • 审批人可在系统中审批,审批结果自动流转到下一级。
  • 审批通过/拒绝后,自动通知相关人员。

2.2 业务流程

  1. 员工发起请假申请,填写表单。
  2. 系统根据申请人自动带出一级审批人。
  3. 若请假天数>3天,自动增加二级、三级审批人。
  4. 审批人依次审批,全部通过后流程结束。
  5. 审批拒绝则流程回退,通知申请人。

三、表单元数据、实例数据与业务事件联动设计

3.1 表单元数据(Meta)如何设计

表单元数据描述了表单的结构、字段、字段属性和字段事件。每个字段可以挂载多个业务事件(如 onChange、onBlur、onSubmit 等),事件与字段通过 eventId 关联。

表单元数据(MongoDB示例):

{"_id": "form_001","appId": "app_001","name": "请假申请表","fields": [{"fieldId": "f1","name": "applicant","type": "input","label": "请假人","required": true,"events": [{"eventId": "event_001"}]},{"fieldId": "f2","name": "manager1","type": "input","label": "第一审批人","required": true},{"fieldId": "f3","name": "manager2","type": "input","label": "第二审批人","required": true},{"fieldId": "f4","name": "manager3","type": "input","label": "第三审批人","required": false},{"fieldId": "f5","name": "reason","type": "textarea","label": "请假原因","required": true},{"fieldId": "f6","name": "startTime","type": "datetime","label": "请假开始时间","required": true},{"fieldId": "f7","name": "endTime","type": "datetime","label": "请假结束时间","required": true},{"fieldId": "f8","name": "result1","type": "select","label": "第一审批结果","required": false},{"fieldId": "f9","name": "result2","type": "select","label": "第二审批结果","required": false},{"fieldId": "f10","name": "result3","type": "select","label": "第三审批结果","required": false}],"formEvents": [{"eventId": "event_002"}],"createdAt": "...","updatedAt": "..."
}

说明:

  • 每个字段可配置 events,events 里存 eventId,eventId 指向业务事件配置。
  • formEvents 是表单级别的事件(如提交时触发)。

3.2 表单实例数据(Data)如何保存(宽表结构)

表单实例数据采用宽表结构,每个字段单独一列,便于查询和统计。

MySQL表结构(宽表):

CREATE TABLE form_leave (id BIGINT PRIMARY KEY AUTO_INCREMENT,app_id VARCHAR(64),form_id VARCHAR(64),user_id VARCHAR(64),applicant VARCHAR(64),manager1 VARCHAR(64),manager2 VARCHAR(64),manager3 VARCHAR(64),reason VARCHAR(255),start_time DATETIME,end_time DATETIME,result1 VARCHAR(32),result2 VARCHAR(32),result3 VARCHAR(32),status VARCHAR(32),current_node VARCHAR(64),created_at DATETIME,updated_at DATETIME
);

示例数据:

idapp_idform_iduser_idapplicantmanager1manager2manager3reasonstart_timeend_timeresult1result2result3statuscurrent_nodecreated_atupdated_at
1app_001form_001u_001张三李四王五赵六家中有事2024-06-01 09:00:002024-06-03 18:00:00同意同意pendingmanager12024-06-10 10:00:002024-06-10 10:00:00

3.3 业务事件与数据节点的联动

业务事件是低代码平台的核心,描述了“何时触发、触发什么、如何处理”。

业务事件配置(MongoDB示例):

{"_id": "event_001","formId": "form_001","trigger": "onChange","sourceField": "applicant","action": "setValue","targetField": "manager1","strategy": "fromEmployeeTable","params": {"sourceField": "applicant","lookupTable": "employee","lookupField": "manager1"}
}

说明:

  • trigger:事件触发时机(如 onChange、onSubmit、onApprove 等)
  • sourceField:事件源字段
  • action:动作类型(如 setValue、validate、block、branch、aggregate 等)
  • targetField:目标字段
  • strategy:具体的原子策略(如 fromEmployeeTable、calculate、validateRule 等)
  • params:策略参数

字段与事件的联动:

  • 在表单元数据的字段 events 中,配置 eventId。
  • 前端监听字段变化,触发事件,后端根据 eventId 查找事件配置,执行对应策略。

四、业务事件与原子策略的实现(详细Java代码)

4.1 业务事件类型举例

  • 字段赋值(setValue):如 applicant 变更时自动填充 manager1/manager2
  • 字段校验(validate):如请假天数不能超过 10 天
  • 节点新增(addNode):如并签时动态增加审批节点
  • 节点聚合(aggregate):如并签节点全部通过后流转
  • 流程推进(advance):如审批通过后流转到下一个节点
  • 流程阻塞(block):如审批未通过阻塞流程
  • 分支判断(branch):如请假天数大于 3 天需三级审批
  • 消息通知(notify):如审批人收到待办通知
  • 数据计算(calculate):如自动计算请假天数
  • 回退(rollback):如审批拒绝回退到上一步

4.2 详细Java实现

4.2.1 事件上下文对象
public class EventContext {private Map<String, Object> fieldValues = new HashMap<>();private Map<String, Object> extra = new HashMap<>();public Object getFieldValue(String fieldName) {return fieldValues.get(fieldName);}public void setFieldValue(String fieldName, Object value) {fieldValues.put(fieldName, value);}public Map<String, Object> getAllFieldValues() {return fieldValues;}public void setExtra(String key, Object value) {extra.put(key, value);}public Object getExtra(String key) {return extra.get(key);}
}
4.2.2 原子策略接口
public interface AtomicStrategy {void execute(EventContext context, Map<String, Object> params);
}
4.2.3 具体策略实现
// 字段赋值策略:根据申请人自动带出直属领导
public class SetValueStrategy implements AtomicStrategy {@Overridepublic void execute(EventContext context, Map<String, Object> params) {String sourceField = (String) params.get("sourceField");String targetField = (String) params.get("targetField");String lookupTable = (String) params.get("lookupTable");String lookupField = (String) params.get("lookupField");String applicant = (String) context.getFieldValue(sourceField);// 假设EmployeeService.getManager(applicant)能查到直属领导String manager = EmployeeService.getManager(applicant);context.setFieldValue(targetField, manager);}
}// 字段校验策略:请假天数不能超过10天
public class ValidateStrategy implements AtomicStrategy {@Overridepublic void execute(EventContext context, Map<String, Object> params) {String startField = (String) params.get("startField");String endField = (String) params.get("endField");int maxDays = (int) params.getOrDefault("maxDays", 10);LocalDateTime start = (LocalDateTime) context.getFieldValue(startField);LocalDateTime end = (LocalDateTime) context.getFieldValue(endField);long days = Duration.between(start, end).toDays();if (days > maxDays) {throw new RuntimeException("请假天数不能超过" + maxDays + "天");}}
}// 分支判断策略:请假天数大于3天需三级审批
public class BranchStrategy implements AtomicStrategy {@Overridepublic void execute(EventContext context, Map<String, Object> params) {String startField = (String) params.get("startField");String endField = (String) params.get("endField");int threshold = (int) params.getOrDefault("threshold", 3);LocalDateTime start = (LocalDateTime) context.getFieldValue(startField);LocalDateTime end = (LocalDateTime) context.getFieldValue(endField);long days = Duration.between(start, end).toDays();if (days > threshold) {context.setFieldValue("needManager3", true);} else {context.setFieldValue("needManager3", false);}}
}// 消息通知策略
public class NotifyStrategy implements AtomicStrategy {@Overridepublic void execute(EventContext context, Map<String, Object> params) {String userField = (String) params.get("userField");String message = (String) params.get("message");String userId = (String) context.getFieldValue(userField);NotificationService.send(userId, message);}
}// 更多策略可按需扩展...
4.2.4 策略工厂
public class StrategyFactory {private static final Map<String, AtomicStrategy> STRATEGY_MAP = new HashMap<>();static {STRATEGY_MAP.put("setValue", new SetValueStrategy());STRATEGY_MAP.put("validate", new ValidateStrategy());STRATEGY_MAP.put("branch", new BranchStrategy());STRATEGY_MAP.put("notify", new NotifyStrategy());// ...注册其他策略}public static AtomicStrategy getStrategy(String strategyName) {return STRATEGY_MAP.get(strategyName);}
}
4.2.5 事件配置对象
public class EventConfig {private String strategy;private Map<String, Object> params;// ...getter/setter
}
4.2.6 事件引擎
public class EventEngine {public void handleEvent(EventConfig eventConfig, EventContext context) {String strategyName = eventConfig.getStrategy();Map<String, Object> params = eventConfig.getParams();AtomicStrategy strategy = StrategyFactory.getStrategy(strategyName);if (strategy != null) {strategy.execute(context, params);} else {throw new RuntimeException("未找到策略: " + strategyName);}}
}
4.2.7 事件驱动示例
// 假设前端触发 applicant 字段 onChange,后端收到事件
EventConfig eventConfig = eventConfigRepository.findById("event_001");
EventContext context = new EventContext();
context.setFieldValue("applicant", "张三");
EventEngine engine = new EventEngine();
engine.handleEvent(eventConfig, context);
// manager1 字段会被自动赋值

五、架构设计总结

  1. 表单元数据:存储表单结构、字段、字段事件,字段与事件通过 eventId 关联,支持灵活扩展。
  2. 表单实例数据:采用宽表结构,每个字段单独一列,便于查询和统计。
  3. 业务事件:存储事件触发条件、动作、目标、策略、参数等,支持灵活配置和复用。
  4. 原子策略:每个业务事件由一个或多个原子策略组成,策略可扩展、可复用,解耦业务逻辑。
  5. 事件引擎:根据事件配置,动态组装并执行策略链,实现“配置即逻辑”,大幅提升开发效率。
  6. 工厂+策略模式:Java 端通过工厂+策略模式实现原子策略的注册与调用,保证系统高扩展性和解耦性。

六、常见业务事件场景举例

  • 字段变更自动赋值
  • 字段变更自动校验
  • 字段变更动态显示/隐藏其他字段
  • 审批节点并签/或签
  • 审批节点动态新增/聚合
  • 审批拒绝回退
  • 流程自动推进
  • 消息/通知推送
  • 数据自动计算
  • 数据自动填充(如带出员工信息)

七、数据结构建议(最终版)

7.1 表单元数据(MongoDB)

{"_id": "form_001","appId": "app_001","name": "请假申请表","fields": [{"fieldId": "f1","name": "applicant","type": "input","label": "请假人","required": true,"events": [{"eventId": "event_001"}]},{"fieldId": "f2","name": "manager1","type": "input","label": "第一审批人","required": true},{"fieldId": "f3","name": "manager2","type": "input","label": "第二审批人","required": true},{"fieldId": "f4","name": "manager3","type": "input","label": "第三审批人","required": false},{"fieldId": "f5","name": "reason","type": "textarea","label": "请假原因","required": true},{"fieldId": "f6","name": "startTime","type": "datetime","label": "请假开始时间","required": true},{"fieldId": "f7","name": "endTime","type": "datetime","label": "请假结束时间","required": true},{"fieldId": "f8","name": "result1","type": "select","label": "第一审批结果","required": false},{"fieldId": "f9","name": "result2","type": "select","label": "第二审批结果","required": false},{"fieldId": "f10","name": "result3","type": "select","label": "第三审批结果","required": false}],"formEvents": [{"eventId": "event_002"}],"createdAt": "...","updatedAt": "..."
}

7.2 表单实例数据(MySQL,宽表结构)

CREATE TABLE form_leave (id BIGINT PRIMARY KEY AUTO_INCREMENT,app_id VARCHAR(64),form_id VARCHAR(64),user_id VARCHAR(64),applicant VARCHAR(64),manager1 VARCHAR(64),manager2 VARCHAR(64),manager3 VARCHAR(64),reason VARCHAR(255),start_time DATETIME,end_time DATETIME,result1 VARCHAR(32),result2 VARCHAR(32),result3 VARCHAR(32),status VARCHAR(32),current_node VARCHAR(64),created_at DATETIME,updated_at DATETIME
);

7.3 业务事件(MongoDB)

{"_id": "event_001","formId": "form_001","trigger": "onChange","sourceField": "applicant","action": "setValue","targetField": "manager1","strategy": "fromEmployeeTable","params": {"sourceField": "applicant","lookupTable": "employee","lookupField": "manager1"}
}

八、结语

通过本案例,我们可以看到低代码平台在表单引擎、业务事件、原子策略等方面的强大能力。通过“元数据+事件+策略”驱动的架构,极大提升了业务灵活性和开发效率。未来,低代码平台将成为企业数字化转型的重要基础设施。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912386.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912386.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912386.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive SQL 快速入门指南

在大数据蓬勃发展的当下&#xff0c;处理海量数据成为企业面临的关键挑战。Hive SQL 作为一款强大的工具&#xff0c;为我们打开了高效处理大数据的大门。接下来&#xff0c;让我们一起踏上 Hive SQL 的入门之旅。​ 一、Hive SQL 是什么​ Hive 是基于 Hadoop 的数据仓库工具…

国内公司把数据湖做成了数据库

在做多年的数据仓库项目&#xff0c;数据湖也在做&#xff0c;但是做完发现&#xff0c;这个不是传统数据库里面的ODS吗&#xff1f; 好多公司做数据湖&#xff0c;就是把数据湖做成了ODS层&#xff08;贴源数据层&#xff09;&#xff0c;难道真的数据湖就是这样等于ODS吗&am…

Python 数据分析与可视化 Day 6 - 可视化整合报告实战

&#x1f3af; 今日目标 整合数据分析与可视化结果生成结构化报告用代码自动生成完整的图文分析文档熟悉 Jupyter Notebook / Markdown 图表 报告生成流程 &#x1f9e9; 一、项目背景&#xff1a;学生成绩分析报告 数据来源&#xff1a;students_cleaned.csv&#xff08;含姓…

服务器、树莓派/香橙派部署HomeAssistant与小爱音箱联动

HomeAssistant功能介绍与多平台部署实战&#xff1a;CentOS服务器、树莓派、香橙派部署及小爱音箱联动控制 一、HomeAssistant简介 HomeAssistant是一款基于Python开发的开源智能家居自动化平台&#xff0c;它最大的特点是高度集成和自定义。通过HomeAssistant&#xff0c;用…

内存泄漏系列专题分析之二十四:内存泄漏测试Camera相机进程内存指标分布report概述

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 内存泄漏系列专题分析之二十四:内存泄漏测试Camera相机进程内存指标分布report概述 目录 一、问题背景 二、:内存泄漏测试Camera相机进程内存指标分布report概述 2.1:Camera领域相机进…

华为堆叠理论及配置

一&#xff0c;堆叠基本概念 1.1交换机角色 主交换机&#xff08;Master&#xff09;&#xff1a;主交换机负责管理整个堆叠。**堆叠系统中只有一台主交换机。**备交换机&#xff08;Standby&#xff09;&#xff1a;备交换机是主交换机的备份交换机。堆叠系统中只有一台备交换…

【数字经济】数据即产品架构在数字经济时代的应用

数据即产品架构在数字经济时代的应用 在数字经济中&#xff0c;数据已成为核心生产要素&#xff0c;“数据即产品”&#xff08;Data-as-a-Product&#xff09;架构通过系统化封装原始数据&#xff0c;实现其可交易、可交付的产品化价值。以下是其架构设计与应用解析&#xff…

MySQL 中的时间序列数据分析与处理

在互联网应用和企业业务系统中&#xff0c;特别是现在当下环境电商以及跨境电商火爆的情况下&#xff0c;时间序列数据无处不在&#xff0c;如电商订单时间、用户登录日志、设备监控数据等。MySQL 作为主流数据库&#xff0c;具备强大的时间序列数据处理能力。本文将结合电商订…

STM32——MDK5编译和串口下载程序+启动模式

一、MDK5编译 1.1 编译中间文件 还可通过 .map文件计算程序大小 中间文件 > 下载到开发板中的文件 > .hex 二、串口下载 2.1 前提须知 2.2 串口硬件链接&#xff08;M3、M4系列&#xff09; M7无串口下载 PC端需安装 CH340 USB 虚拟串口驱动&#xff1a;CH340 USB 虚…

HyperWorks仿真案例:拓扑优化与激光增材制造的完美结合挖掘轻量化结构的新潜力

许多技术创新都基于自然界中生物结构的设计。通过不断进化&#xff0c;大自然在数百万年间已学会根据各种形状的功能对形状进行调整&#xff0c;从而最大程度地提高效率。当工程师设法构建坚固而轻盈的结构时&#xff0c;这些自然界中的示例可以提供重要线索。在目前的研究项目…

在Windows系统部署本地智能问答系统:基于百度云API完整教程

引言 在人工智能时代&#xff0c;搭建私有化智能问答系统能有效保护数据隐私并提升响应效率。本教程将手把手教你在Windows环境中&#xff0c;通过百度云API构建专属智能问答系统&#xff0c;全程无需服务器&#xff0c;仅需本地计算机即可运行&#xff01; 一、环境准备 系统…

Vue的watch函数实现

<script setup> import { watch, ref, reactive, toRefs } from vue;const count ref(0); const obj reactive({name: 张三,age: 18 });// 我们可以使用toRefs&#xff0c;将reactive对象中的属性转换为ref对象&#xff0c;保持响应性&#xff01;&#xff01; const {…

Tomcat 安装使用教程

&#x1f4cc; 什么是 Tomcat&#xff1f; Apache Tomcat 是一个开源的 Java Servlet 容器&#xff0c;也是运行 Java Web 应用最常用的服务器之一&#xff0c;支持 Servlet、JSP 等规范。 &#x1f9f0; 一、准备工作 1. 系统要求 操作系统&#xff1a;Windows / Linux / m…

【邀请】点击邀请链接参加阿里云训练营活动,完成学习送礼品+户外折叠凳,一个小时就能完成

点击邀请链接参加阿里云训练营活动&#xff0c;完成学习送礼品户外折叠凳&#xff0c;快的话一个小时就能完成。 7月28日23:59前完成。 OSS进阶应用与成本优化训练营 礼品如下&#xff1a; 包尖钢笔/祈福小神仙积木/雨伞/不锈钢餐具随机发放 户外折叠凳

用户行为序列建模(篇六)-【阿里】DSIN

简介 DSIN&#xff08;Deep Session Interest Network&#xff09;是阿里巴巴于2019年提出的点击率预估模型。相比于DIN、DIEN&#xff0c;考虑了用户行为序列的内在结构&#xff08;序列是由session组成的&#xff0c;在每个session内&#xff0c;用户行为是高度同构的&#…

现代Web表情选择器组件:分类系统与实现详解

你好呀&#xff0c;我是小邹。今天给博客的emoji表情进行了归类、补充&#xff0c;具体优化如下。 表情选择器的核心价值在于其分类系统。本文将深入解析表情分类体系的设计与实现&#xff0c;通过完整代码示例展示如何构建一个专业级的表情选择器组件。 一、表情分类系统设计…

华为云Flexus+DeepSeek征文 |华为云ModelArts Studio集成OpenAI Translator:开启桌面级AI翻译新时代

华为云FlexusDeepSeek征文 |华为云ModelArts Studio集成OpenAI Translator&#xff1a;开启桌面级AI翻译新时代 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、OpenAI Translator介绍openai-translator简介openai-translator主要特…

GitHub 趋势日报 (2025年06月27日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 817 twenty 655 awesome 476 free-for-dev 440 Best-websites-a-programmer-shoul…

Java语法通关秘籍:this、构造方法到String核心精粹

文章目录 &#x1f50d; **一、就近原则与this关键字**1. **成员变量**2. **局部变量** &#x1f6e0;️ **二、构造方法&#xff08;构造器&#xff09;**1. **标准格式**2. **有参构造实战**3. **灵魂三问** ❓ &#x1f4e6; **三、JavaBean黄金标准**&#x1f9e0; **四、对…

@Cacheable 等缓存注解是不是也用到了 AOP?

Spring 的声明式缓存注解&#xff08;Cacheable, CachePut, CacheEvict 等&#xff09;是 AOP 技术在实际应用中最强大、最经典的范例之一&#xff0c;其原理与 Transactional 非常相似。 核心思想&#xff1a;一个智能的“秘书” 你可以把 Cacheable 的 AOP 实现想象成一个极…