高達(dá)平臺 - 全鏈路低代碼解決方案
本期作者

背景
建設(shè)低代碼平臺的目的,就是通過可視化的方式,加上可復(fù)用的建設(shè)能力,用較少的投入、以較快的速度來交付應(yīng)用程序。
我們通過aPaaS架構(gòu)思路,復(fù)用已經(jīng)實現(xiàn)了的開發(fā)能力,解構(gòu)業(yè)務(wù)模型,形成更通用的能力,對業(yè)務(wù)進(jìn)行快速編排。實現(xiàn)低代碼,甚至部分無代碼的快速定制應(yīng)用。將開發(fā)模式從做加法,改進(jìn)為做乘法,48小時內(nèi)快速定制大部分基礎(chǔ)應(yīng)用。
我們不單需要解決今天的可見需求,同時還需要解決明天潛在的問題。實現(xiàn)更少的投入,更聰明的辦法,建設(shè)更好的產(chǎn)品,產(chǎn)生更大的價值。
整體架構(gòu)
我們一直在思考,如何通過簡單的架構(gòu)圖,來方便的描述出高達(dá)的整體架構(gòu),看了一眼我們現(xiàn)有的復(fù)雜架構(gòu)圖,我們認(rèn)為貼出這樣一張圖不會讓大家更加清楚我們的架構(gòu),反而會變得非常迷茫,因此考慮到高達(dá)的組件過于龐大,中間的邏輯實在過多,我們使用一張非常簡單的架構(gòu)圖來進(jìn)行描述。
就像所有的網(wǎng)站一樣,高達(dá)分為三個部分:頁面,邏輯,數(shù)據(jù)用戶通過頁面,訪問API接口,APi接口一方面處理大量的業(yè)務(wù)邏輯,另一方面對內(nèi)部和外部的數(shù)據(jù)進(jìn)行處理

更進(jìn)一步的:在實現(xiàn)了基本的?可搭建?能力之外,高達(dá)提供了大量?好搭,易搭,速搭的能力,包括內(nèi)外部數(shù)據(jù)管理,服務(wù)編排等重要能力

高達(dá)平臺-六大引擎

我們改變了原有的開發(fā)模式
一些業(yè)務(wù)的單個頁面,我們僅通過10分鐘即可完成該頁面從數(shù)據(jù)庫建設(shè),后端邏輯搭建,前端頁面搭建,到最終的發(fā)布上線

核心邏輯
?1. 數(shù)據(jù)管理-元數(shù)據(jù)

后端邏輯
高達(dá)的數(shù)據(jù)管理我們使用業(yè)務(wù)模型進(jìn)行列的管理,而并非數(shù)據(jù)庫模型的方式,例如varchar,int,datetime等,因為配置的同學(xué)可能并不了解這是什么意思。因此,我們決定使用一種更加容易理解的業(yè)務(wù)模型進(jìn)行數(shù)據(jù)的管理。
同時業(yè)務(wù)模型也可以將大量的業(yè)務(wù)邏輯進(jìn)行封裝,讓用戶不會感知,舉個例子:
員工類型:會底層會將選擇的員工轉(zhuǎn)換為員工ID,整個高達(dá)全鏈路的數(shù)據(jù)傳遞中,用戶并不會感知有這個ID的存在。


地理位置類型:會通過高德地圖的組件進(jìn)行坐標(biāo)的管理,將最終的經(jīng)緯度存儲在數(shù)據(jù)庫里,但是用戶全程看到的都是一個坐標(biāo)。


附件類型:會自動向BFS進(jìn)行上傳,并記錄下文件下載路徑,整個邏輯都是自動化完成的,用戶只會看到最終文件的上傳與下載


前端邏輯
同時最終界面的搭建,可以直接生成最終的界面表單,來提升整體的效率。將一個后端數(shù)據(jù)表,自動生成前端的增刪改查,是一個非常容易的步驟,只需要將增刪改查組件拖入界面中,選擇對應(yīng)的元數(shù)據(jù)表即可。


我們也可以針對頁面做字段做更細(xì)化的管理

目前我們已經(jīng)支持的字段類型如下:
1.??基礎(chǔ)類型:單行文本,多行文本,數(shù)字,日期,單選,多選,布爾
2.??業(yè)務(wù)類型:人員,部門,地理位置,附件
3.??關(guān)聯(lián)類型:單向關(guān)聯(lián),雙向關(guān)聯(lián)
4.??系統(tǒng)字段:編號,創(chuàng)建人,創(chuàng)建時間,更新人,更新時間
當(dāng)然未來根據(jù)業(yè)務(wù)場景,我們還會繼續(xù)增加各種各樣的數(shù)據(jù)類型
數(shù)據(jù)表關(guān)聯(lián)
當(dāng)配置關(guān)聯(lián)類型字段時,我們會在底層創(chuàng)建中間表,來實現(xiàn)表之間關(guān)聯(lián),包括一對多,多對多,多對一等關(guān)系

外部數(shù)據(jù)源管理
管理數(shù)據(jù)庫:高達(dá)為達(dá)到連接外部數(shù)據(jù)能力的需求,對外部數(shù)據(jù)源進(jìn)行了管理,這里的賬號密碼部分都為AES2.0逐行秘鑰進(jìn)行加密。

數(shù)據(jù)表關(guān)聯(lián):在添加完數(shù)據(jù)源后,可以數(shù)據(jù)管理中添加進(jìn)行數(shù)據(jù)表關(guān)聯(lián),便于后續(xù)直接對外部數(shù)據(jù)進(jìn)行管理。

數(shù)據(jù)管理:外部數(shù)據(jù)添加后,在增刪改查空間中選擇外部數(shù)據(jù)源,可以在用戶端一鍵完成增刪改查的需求

?2. 服務(wù)編排
我們整體通過邏輯編排的方式進(jìn)行管理


接口管理
首先針對API,我們可以管理他的分組,名字,請求類型,以及服務(wù)間認(rèn)證方式,其中服務(wù)間調(diào)用認(rèn)證我們目前支持JWT,OAuth2,bilibiliToken三種方式

實現(xiàn)邏輯:我們會分別針對這三種不同的認(rèn)證方式,開啟三個不同的入口,并將開啟三種認(rèn)證方式的接口注冊到分別的入口上

編排邏輯
創(chuàng)建接口之后,我們將所有的代碼邏輯,區(qū)分了六大塊類型:
邏輯控制:循環(huán),分之,退出循環(huán),繼續(xù)循環(huán),退出程序
變量管理:設(shè)置變量,編碼轉(zhuǎn)換
數(shù)據(jù)管理:針對數(shù)據(jù)的增刪改查
服務(wù)調(diào)用:連接器,調(diào)用流程(待開發(fā))
消息通知:短信,企微,郵件
高級:自定義腳本,加密(待開發(fā)),多線程(待開發(fā)),文件操作(待開發(fā)),SQL管理(待開發(fā))

其中,只有邏輯控制類型的節(jié)點,才會對整條鏈路的走向造成改變,除此之外,所有節(jié)點都是從上往下運行。

圖形的方案
為什么我們選擇樹形圖?
DAG-有向圖:如果不使用樹形圖,可以隨意拖動節(jié)點的位置,看似靈活,但實際上,我們每個節(jié)點在圖中的位置會隨著管理員的不同,變得越發(fā)混亂。
空間利?率低,復(fù)雜邏輯難以看懂
隨意連線容易導(dǎo)致邏輯混亂(goto)
容易死循環(huán)

樹形圖:經(jīng)過大量的討論于研究,決定在服務(wù)編排中使用樹形圖,樹形圖有以下優(yōu)點
展現(xiàn)簡潔,不會出現(xiàn)交叉連線
可折疊分?,容易實現(xiàn)復(fù)雜邏輯
可以轉(zhuǎn)成等價的代碼,開發(fā)者易懂

DSL編碼
我們并不會將配置的邏輯,直接轉(zhuǎn)換成代碼,我們會在配置后,生成DSL編碼作為中間層進(jìn)行存儲,DSL可以向上轉(zhuǎn)換為界面上的配置顯示,也可以向下轉(zhuǎn)換為真實的運行代碼。
這里源代碼的顯示我們會將用于處理錯誤,和日志記錄的代碼進(jìn)行隱藏,但是點擊【顯示完整代碼】的按鈕后,將會顯示完整代碼


DSL轉(zhuǎn)換邏輯:通過DSL作為中間層進(jìn)行轉(zhuǎn)換

代碼模板化
偽代碼層,我們通過MagicScript(https://github.com/magic-script)引擎來實現(xiàn),可以將我們預(yù)編寫好的代碼,進(jìn)行實時執(zhí)行。
早期我們使用字符串拼接的方式來拼接MagicScript代碼,但是經(jīng)過一段時間的嘗試,我們發(fā)現(xiàn)這種方式開發(fā)成本過高,使用起來也非常麻煩。

因此我們開始轉(zhuǎn)向模板化的方式,我們研究了freeMaker(http://freemarker.foofun.cn/)的方式,并通過參數(shù)來傳入對應(yīng)的關(guān)鍵字,這樣,我們代碼本體的開發(fā),就與正常寫代碼沒有區(qū)別,可以大大提升我們的開發(fā)效率,以及后期的使用效率。

變量管理
所有的代碼邏輯,對變量的管理,無論是類型,還是公式的計算,都是非常核心的部分。
公式計算器:我們精心設(shè)計了整個公式計算器,來非常方便的通過鼠標(biāo)來完成核心計算邏輯的運行,我們可以在左邊預(yù)設(shè)的邏輯中選擇需要運行的邏輯,然后在中間【字段】列表中,選擇當(dāng)前上下文環(huán)境的所有變量,這里我們會對字典&映射類型,進(jìn)行結(jié)構(gòu),直接獲取字典下某個key的值,右邊可以看到最終的公式,也可以通過鍵盤來手動輸入

編碼的轉(zhuǎn)換:我們單獨抽出了節(jié)點來進(jìn)行轉(zhuǎn)換,其中包括base64編碼,URI編碼,JSON編碼的轉(zhuǎn)換

數(shù)據(jù)映射
我們可以針對數(shù)據(jù)進(jìn)行三種類型的映射,當(dāng)需要將1替換為啟用,2替換為禁用:
1.??字符串映射:"121" 需要替換為 "啟用禁用啟用"
2.??數(shù)組映射:[1,2,1]需要替換為[ "啟用", " 禁用", "啟用"]
3.??字典映射:{a: 1, b: 2}需要替換為{a: "啟用", b: "禁用"}
我們將這類映射邏輯進(jìn)行抽象,抽出單獨節(jié)點,用于解決該類數(shù)據(jù)映射邏輯
調(diào)試
項目早期,我們針對調(diào)試功能做了大量的討論,為了可以在整個API配置的過程中,可以進(jìn)行充分的測試以及排錯,我們大量的設(shè)計了調(diào)試的能力,來便于配置著進(jìn)行調(diào)試。
其中除了看到調(diào)試的結(jié)果之外,我們會針對流程中每個節(jié)點的成功失敗,耗時,當(dāng)前的上下文作用域變量,進(jìn)行管理。
當(dāng)鼠標(biāo)放在運行日志的每一行時,該行日志實際運行節(jié)點,都會進(jìn)行交互提示。



其他
1.??節(jié)點的復(fù)制與粘貼:我們經(jīng)常會對一段代碼進(jìn)行復(fù)制功能


2.??行列切換:由于正常顯示器的尺寸,寬度是比高度要大的,當(dāng)出現(xiàn)大部分單條路線的邏輯時,分支較少情況,可以進(jìn)行橫向的顯示。

3.??注釋:我們可以一鍵顯示/隱藏全量的日志

4.??操作日志:我們分別針對當(dāng)前的本次操作,以及歷史保存的版本進(jìn)行了日志的保存,可以隨時進(jìn)行回滾,以及發(fā)布
當(dāng)前本地:可以通過右上角的【操作日志】按鈕,查看每一次變更的內(nèi)容

版本:當(dāng)每次右上角點擊【保存】按鈕后,都會生成一個版本,可以通過【歷史版本】按鈕對某一次版本進(jìn)行發(fā)布

5.??接口文檔
通過【接口文檔】按鈕,可以針對接口,自動化的生成接口的文檔,方便前端,或者外部系統(tǒng)對API進(jìn)行調(diào)用

連接器
術(shù)語說明
連接器:先解釋一下什么是連接器,連接器是用于連接外部資源,包括HTTP,HTTPS,discovery等外部API,我們可以提前定義好外部API的認(rèn)證方式
動作:單個連接器下我們可以定義大量動作,每個動作相當(dāng)于該調(diào)用方的多個API的地址
例如:我們可以針對企業(yè)微信開發(fā)一個連接器,其中發(fā)送文本消息就是該連接器的一個動作

基本信息
創(chuàng)建連接器之后,我們需要分別設(shè)置連接器的基本信息,包括說明,域名,協(xié)議,認(rèn)證方式

認(rèn)證方式可以獲取獲取到一串token,并且可以在未來的訪問中,定義token放在哪個位置,包括header頭,URL參數(shù),body體中

動作
我們可以為一個連接器定義多個動作,每個動作代表一個請求接口,定義URL,請求方式,入?yún)⒌?,同時可以提前定義好入?yún)⒌闹担部梢远x為動態(tài)值,在后續(xù)調(diào)用側(cè)(頁面,服務(wù)編排)中進(jìn)行傳入

請求測試
可以針對請求進(jìn)行測試,并針對返回信息進(jìn)行解構(gòu),并定義多個返回參數(shù)的中文含義,最終在頁面,或者服務(wù)編排中調(diào)用時,將會直接使用該中文定義進(jìn)行操作,并且無需關(guān)注該字段在返回JSON中的位置。

前端頁面
我們定義了企微發(fā)送消息的連接器,需要接受兩個參數(shù),1接受用戶,2發(fā)送內(nèi)容,我們可以在按鈕上綁定一個連接器事件,并將兩個入?yún)⒔壎ǖ阶罱K的頁面元素上,即可完成綁定

4. 頁面搭建
創(chuàng)建頁面
頁面管理中,我們可以針對目錄和頁面進(jìn)行管理,同時也可以通過拖動,對整個菜單的位置進(jìn)行調(diào)整。

我們可以創(chuàng)建本地頁面,也可以通過iframe嵌入外部頁面


頁面配置
前端組件層面,我們分成了三種類型
定制組件:經(jīng)過開發(fā),高度整合的整套組件
原子組件:按鈕,輸入框,文本等50+個最基本單元的組件,可以通過這類組件搭建出幾乎所有頁面效果
自定義組件:與其他部門合作實現(xiàn)的前端組件庫,以及

搭建模塊
頁面核心模塊,底層為阿里的Low-Code Engine:https://lowcode-engine.cn/site/docs/guide/quickStart/intro
依賴于通過該組件,封裝了大量底層搭建邏輯,同時我們針對組件,事件,數(shù)據(jù)等模塊進(jìn)行了大量的二開,來滿足我們更高封裝度的低代碼要求




發(fā)布管理
高達(dá)我們可以針對頁面與接口進(jìn)行發(fā)布,但是數(shù)據(jù)層面,類似于我們生產(chǎn)的開發(fā)模式,表和列修改都會立刻生效。
頁面發(fā)布
頁面發(fā)布管理中,我們可以看到當(dāng)前
線上的版本:最后一次發(fā)布的版本
可發(fā)布頁面:基于線上版本,出現(xiàn)修改的頁面
歷史版本:歷史上每一次發(fā)布的頁面
針對這些版本和頁面,我們可以進(jìn)行發(fā)布和回滾操作

接口發(fā)布
服務(wù)編排中,可以針對接口進(jìn)行版本的發(fā)布與回滾

高度封裝的可搭建能力
1. 觸發(fā)器
往往我們在數(shù)據(jù)進(jìn)行變更的時候,都會進(jìn)行一些外部接口的同步,因此我們提供了數(shù)據(jù)觸發(fā)器的能力,在數(shù)據(jù)變更的前后進(jìn)行服務(wù)編排或者連接器的調(diào)用

觸發(fā)時機(jī):我們可以配置觸發(fā)器觸發(fā)的表,以及時機(jī),目前支持新增,修改,刪除三種場景
觸發(fā)條件:我們可以提供過濾器,來過濾觸發(fā)時候的判斷條件
觸發(fā)動作:我們可以分別選擇觸發(fā)的連接器還是服務(wù)編排,并將當(dāng)前本次數(shù)據(jù)變更的內(nèi)容作為參數(shù)傳入觸發(fā)動作

出參管理:最后,我們可以根據(jù)服務(wù)編排與連接器的返回信息,再次將內(nèi)容回寫到數(shù)據(jù)表中

2. 數(shù)據(jù)視圖
往往我們并不會直接調(diào)用單獨一張表的數(shù)據(jù),我們會需要對多張表進(jìn)行整合,匯總,行列計算等操作,形成一張數(shù)據(jù)更加全面的表,因此我們提供了數(shù)據(jù)視圖的能力,整體原理類似于數(shù)據(jù)庫的存儲過程。

視圖數(shù)據(jù):我們可以對一張或者多張關(guān)聯(lián)表的數(shù)據(jù)進(jìn)行拼接整合


行列計算:這個過程中,我們可以將一列,或者一行的數(shù)據(jù)進(jìn)行行列計算,具體行列計算的含義如下:

行列計算字段我們也提供了豐富的數(shù)據(jù)庫計算公式,提升開發(fā)效率

過濾篩選:視圖底部,我們提供了視圖的篩選能力,同時篩選的參數(shù),可以當(dāng)場指定,也可以從調(diào)用視圖的接口處進(jìn)行獲取

實現(xiàn)原理:與服務(wù)編排的理念一致,我們會將這段配置生成一段DSL,通過DSL可以生成最終的SQL,也可以還原微最初的視圖配置。

頁面端:當(dāng)我們創(chuàng)建一個餅圖時,我們可以再右側(cè)選擇對應(yīng)的視圖來選擇數(shù)據(jù)源,同時設(shè)定對應(yīng)的分類字段和值字段,最后我們可以在左上角,添加篩選控件,對視圖本身進(jìn)行篩選。

3. 定時任務(wù)
定時任務(wù)可以對服務(wù)編排的接口做定時任務(wù)處理,可以方便的配置定時器,失敗通知等功能。


應(yīng)用配置
應(yīng)用配置是對高達(dá)當(dāng)前應(yīng)用的整體性配置,包括基礎(chǔ)信息維護(hù)、菜單管理、字典管理、權(quán)限管理、通知管理、外部數(shù)據(jù)源管理
?1. 基礎(chǔ)信息
基礎(chǔ)信息中可以對項目名稱、圖標(biāo)和描述等信息進(jìn)行修改,同時支持對前端SDK(lunar,oa醬,水?。┙尤胱雠渲茫?/p>

2. 菜單管理
菜單管理里可以對搭建項目的整體外層框架進(jìn)行配置,包括:
菜單位置:可以是左右模式,上下模式,也可以是頂部菜單欄
主題配色:目前支持暗色系主題和明亮主體
logo:左上角的顯示logo,默認(rèn)為bilibili
首頁信息:設(shè)置不輸入PATH的情況首頁地址

3. 字典管理
在高達(dá)項目中,可以創(chuàng)建K/V類型字典,也可以創(chuàng)建樹狀結(jié)構(gòu)字典


字典管理分為兩個部分:全局字典與項目字典
1.??全局的字典:全局字典可以被項目關(guān)聯(lián),例如性別,國家,銀行等通用字典,都可以作為全局字典使用。

2.??項目層級的字典:項目中可以套用全局字典,也可以創(chuàng)建項目自身的字典,項目字典不會被其他項目所調(diào)用。

4. 權(quán)限管理
對于高達(dá)配置的C端頁面,可以進(jìn)行全量頁面的權(quán)限配置,高達(dá)默認(rèn)會提供兩種角色:超級管理員、默認(rèn)角色,同時也可以添加其他更多自定義角色的管理。
超級管理員:擁有所有頁面的權(quán)限且頁面權(quán)限不可更改,用戶可以添加;
默認(rèn)角色:用戶是全體員工且不可更改,對應(yīng)的頁面權(quán)限可以修改;

5. 通知管理
服務(wù)編排等多個場景中,發(fā)送短信、郵件、企微消息的通知,此處維護(hù)了各類通知的模板。


業(yè)務(wù)接入
高達(dá)自從上線至今,已經(jīng)承接?26?個平臺的搭建任務(wù),其中包括包括人事,財務(wù),法務(wù),采購,行政,主站等各類系統(tǒng),按照頁面和接口數(shù)量結(jié)算,節(jié)約了300~400人日的資源投入。高達(dá)在一定程度上證明了全鏈路低代碼系統(tǒng)的可行性,其中包含:
增刪改查表單類:

通知管理類的系統(tǒng):HR通知系統(tǒng)


問卷調(diào)研類系統(tǒng):晉升問卷

中臺管理+接口API類型:節(jié)假日管理

高達(dá)自己搭建自己的頁面:高達(dá)項目管理

企微工具:服務(wù)號側(cè)邊欄

