構建低代碼平臺的技術解析

低代碼平臺表單引擎與業務事件設計實踐

  • 低代碼平臺表單引擎與業務事件設計實踐
    • 一、什么是低代碼?它能做什么?
    • 二、請假系統案例介紹
      • 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 實現想象成一個極…