第一章 King
如果您是非資訊技術人員,可以略過關於技術說明的相關章節,建議您先看第一、二、五、六這幾章的說明即可。當然,我們也盡量用淺顯易懂的文字,簡要的說明技術相關背景,有興趣的話也歡迎瞧瞧。
簡單來說,低代碼開發平台是提供一套開發環境,它能夠通過介面設定(而非手寫電腦程式),來生成應用程式。它是一種軟體開發的方式,實際上,市面上已經有相關的產品出現,包括 outSystems,大陸也有宜搭、微搭等對應的產品。
這個新平台最大的願景,是在產品快速更新的數位化時代,提供一個能夠可以迅速開發、快速驗證、並上線新應用的有效方式,而不用極大程度地依靠強大的技術團隊,通過長時間的反覆運算才能夠完成,最終達到一個降本增效的結果。
關於最近低代碼所引起的一些風潮,基本上這是一個標準的舊瓶裝新酒的觀念。
包括之前搞了非常久的所謂程式生器或是 Wizard 都是屬於 Low-Code 這個平台的一個前身。
簡單的說,是因為當前開發軟體資訊系統所用的方式,實在太過於原始、太過於粗獷,簡單的說就是
需要依賴開發人員有極強大的開發能力,才能寫出還可以用的系統。
所以不同的程式設計師所設計出來的系統,不管是他的功能、效能、美工等各方面,都差異非常大。
所以很多人都把程式設計師當成是一種類似於藝術的範疇。
為什麼會一直會有這種所謂的產生器的概念? 主要是因為基本上在某些特定範圍內,有一些系統跟功能
的確是需要非常高等級的研發能力才能搞定,比如 AI 的核心演算法,這聽起來就不是一般人類能搞定的事情。
但是在另一方面,某些通用的後台管理資訊系統、行事曆管理或是客戶關係管理,這類的資料庫系統程式,
基本上它的功能是大同小異的。在這個一定範疇內的資訊系統,經過一定時間的累積經驗後,是可以用工具來
協助加速系統開發、並讓程式的品質及穩定度,這是絕對可行的。
百度的這個平台也就應運而生。它的底層是用 Facebook 的 React 的前端框架開發,amis 是純粹的前端框架,
也就是說,基本上他主要是處理使用者操作系統時所看到的畫面。和其他框架不同的是,她最大的亮點,
就是不用你寫程式,而是透過特殊的設定,用 JSON (簡單的說是一種特定格式的文字檔) 的定義,
來描述畫面要長怎樣。
很早以前我們就希望能透過類似的方法,就是透過定義去設計、設定畫面,然後在裡面,留一些接口,
可以跟後端資料庫連接,來達到一些基本的操作。當然,一旦使用這樣的架構,基本上就沒有辦法隨心所欲,
因為一旦使用框架,就一定會被框架限制,這是沒有辦法的事情。
可是如果撇開這個問題,如果考慮到它能提高的生產力,那麼除非系統必須要強調非常個性化的設計,
否則這個平台就非常適合。
聊完了前端的部分,那後端商業邏輯該如何解決?
所謂的後端,更多指的是商業邏輯、分析報表等。這個部分從來就不是產生器能解決的,但是他卻是系統的靈魂。
我們之前花了很多的時間去整理、去思考、反省,也參考了很多的 ORM 等框架,也在超過20年的實際開發領域,
下了很大的功夫,累積資料庫相關的開發經驗。最終提出了 [以資料庫為開發核心],這個開發理念。
基本上,這個概念就可以跟百度的這個前端框架,完美的整合。用這樣的方式打通的前後端,而且真正達到
所謂的低代碼,只用最少的技術(但還是要有很深的功底),就可以完成功能相當完整的資訊系統。在稍後的章節會有更詳細的說明。
如果看完相關的介紹後,想更進一步的了解我們的系統或報價,歡迎與我們聯絡
快速指引
透過上面幾個原則的判斷,企業就可以依照自己的需求,選擇合適的系統,
挑選系統和交女朋友並沒有太大的區別,
有些人一定要顏值高、身材好、家境優渥,但是可能要忍受她可能會有的公主病。
有些人認為娶妻娶賢,外貌並非優先。
每個人的標準都不一樣,慎思明辨,選擇最適合自己的才是最重要的。
基本概念和架構說明
開發資訊系統從來都不是一件簡單的事,所牽扯到的相關知識非常複雜。千萬不要被廠商的宣傳語誤導,這絕對是專業才能搞定的事。
如果您之前沒有太直觀的完整概念,建議您可以自行在網上搜尋相關的文章,也可以參考下文,此處就不在贅述。
一直以來,只要是有相關開發經驗的程式設計師,在經過多次反覆的、類似的程式開發之後,都會試圖開始根據所累積的經驗,然後想辦法把重複性的工作,整理成一些,不管是工具、還是輔助的設計程式、或是用最簡單的複製貼上法,來加快開發的效能、並提高開發的品質。
最早,我們們所採用的方式,基本上是程式產生器的概念,這個概念非常多人實作過,每個人的方式也有所不同。經過幾次反覆的辯證修改,最後我個人所採用的方式,我稱之為樣板程式產生法。這個方式基本上是經過下面幾個開發的步驟:
聊完了以上的概念,在我們麒麟(Kylin) 的開發平台上,我們是採用 Wizard 架構三部曲的概念來開發,簡單的說, 所謂的三部曲,就是 Project(專案)、Function(功能) 及 Field (欄位定義)。
前面我們談完了 Wizard 架構的三部曲,基本上這是一個標準開發框架的實作。早期,有很多類似的系統,都有資料庫字典(Data Dictornary) 這樣的概念,我們也是基於類似的概念實作而成。
Server 端基礎設計
我先寫了一支 test_getUserData 的 store procedure,程式內容如下
create proc test_getUserData
(
@userid varchar(100)
)
as
begin
select * from sys_users where userid = @userid
end


alter proc test_getUserData
(
@userid varchar(100)
)
as
begin
select userid,username,email,token from sys_users where userid = @userid
end

在這個過程中,我們完全沒有更改任何一行 server 端的程式。
這只是一個非常簡單的範例,可是這樣的解決方案,可以讓您或是貴公司,很輕易的透過撰寫 Store Procedure 就完成數十隻甚至成百上千支的 API,這在很大的程度上大幅提升後端的開發效率。當然,如果你所在的組織已經有寫了一堆的 store procedure,那恭喜您,接下來要考慮的只是要開放哪些 API 而已。
Store Procedure 是一個已經存在超過 20 年以上的技術,我從早期在 MS-SQL 2005 上寫的程式,到目前的最新版本都能執行。即使是在 Opensource 赫赫有名,使用者滿坑滿谷的 MySQL,也從 5.0 版以後完整支援 Store Procedure。更令人欣賞的是 SQL 語法自從 ANSI 92 後就有一個國際標準,讓我們在跨不同資料庫時,雖不能直接 Copy 使用,但是總是有跡可循,是可以修改部分語法後移植到其他資料庫。
本文主要的目的是在展示,透過一支通用的 Server 端程式,配合使用 Store Procedure 就能提供一個快速開發 API 的有效方法。您也許會有疑問,這個所謂的通用 Server 端程式,只能用在 Node.js 嗎? Of Course Not! 事實上我的通用 Server 端的第一個版本,是用 ASP.NET 寫成的,所以如果您想用 PHP、RoR、Python 等等現有的 Server 程式語言,都沒有問題,只要該工具能連接資料庫即可。
如果您不熟悉 Postman 的操作,可以上網 Google 一下就有很多的教學文,或是參考下文
http://kainors.github.io/2017/03/19/api-testing-with-postman/
實際上在使用 API 時,雖然可以使用 GET 或 POST,不過除非有特殊的原因,一般都是建議使用 POST 方法。
如果要提供 API 讓前端呼叫,一般而言我們會先提供一份 API 的使用說明文檔,主要的內容應該會有下列部分

下面是 orm_api 的註解說明,請參考
呼叫範例: url/orm_api/2/

| POST 參數 | 參數說明 |
|---|---|
| para01 | TableName,如 zen_department |
| para02 | Primary Key,如 did (如果是複合主鍵,用逗號區隔即可) |
| para03 | C 代表新增、U 代表修改、D 代表刪除、P 代表分頁查詢、R 代表單筆資料查詢 |
| para04 | args,api 所需的實際參數,主要分為2大類,CUD 為一類,內容為 json,是將欄位的內容組成 json,另外是分頁查詢,最多有6個參數,利用 ^ 為字串的分隔符號。 |
下面是前端使用 Vue.js 呼叫的片段程式碼,請參考
表單基礎設計
在第三章中,有簡單說明 Wizard 三部曲的內容,接下來就延續前面的主題,再更詳細的說明。
基本上所謂的三部曲,只是將開發一套完整的系統,由上而下的細分,以方便管理(三層架構)
以我們開發的 Kylin EIS(Enterprise Information System) 為例,大致的架構如下(簡化版本)
主要是將整個完整的系統,分成幾個較小的模組,方便管理。並可以指定 API 主機及資料庫名稱。可以盡量多的整合不同的資源。
點選 >> 後,可以進入 Function 的設定。我們在此以 bas 為例
這裡會列出指定專案下的所有功能列表,除了一般的名稱設定外,他有幾個重要的欄位設定,以及重要的核心功能



設定最佳化
設定區塊抬頭

產生程式
查看 JSON 內容

設定欄位名稱及使用元件












單檔作業顧名思義,指的是針對單一主檔,提供維護作業,在麒麟低代碼的平台中,我們的做法是提供了多種不同的常用程式樣板(通常是依照欄位數的多寡來區分),快速的產生類似的程式。


其中 SingleTab 和 SinglePanels 的設定完全相同,差別是利用 Tab 或是 Panel 來安排畫面的顯示,請參考下圖


而 SingleEntry 等於是 Block=0 的 SinglePanels,所有的欄位由上而下展開

所以到說明到此,您應該已經了解,前3種範本都是類似的操作,只不過是針對欄位的多寡,提供不同的布局顯示方式。
基本的操作是相同的。
至於 SingleGrid 通常是針對欄位較少的表單(通常低於10個欄位),我們會提供直接編輯的功能,方便快速維護資料,這會在下一個章節說明。
Transfer 是一個非常方便且好用的元件(請參見上圖 - 部門選擇),可以應用的範圍很廣,凡是需要多選的場景,都可以使用本元件,舉凡
使用本元件時,有下列的注意事項
因為是多選的功能,所以一般而言,我們都會設計一個 [1-多] 的關聯資料表來存放資料,如


但是 Transfer 元件必須對應到主檔的某一個欄位,所以我們會在 Role(主檔) 新增一個 Owned(max) 的欄位配合。這個欄位只是一個中繼欄位,實際並不會使用。

為了配合這個機制,所以我們在 orm_api 中加入一個機制,在存檔時,會去讀取 sys_transaction 這個系統表的設定,如果 Table 名稱存在,會去執行對應的預存程式

所以要使用這個元件,必須手工撰寫相關的 [預存程式],可以參考目前系統已撰寫的 sys_transfer_owned2userroles、sys_transfer_owned2rolemenusecurity






Query Wizard Project(和表單共用相同的模組定義)

Query Wizard Function

Query Wizard Fields,查詢欄位的設定

Query Wizard Filter,查詢條件的設定(必須配合預存程式的參數)

將 [預存程式] 的參數及欄位匯入 Kylin Wizard 中,這個工具是提供一個將 [預存程式] 和 Wizard 快速整合的機制。如果沒有這個工具,那只能逐一將欄位及條件手動輸入到 Wizard 中,效率相對就低效很多。看到這裡,您應該就能深深的體會麒麟低代碼平台,無時不刻、想方設法提高開發效率的努力。
匯入 [預存程式] 的參數


匯入 [預存程式] 的所有欄位,目前程式只會取得最後一個 Select 的結果,特殊情況下只能手工新增到 Wizard






Query Wizard Project(和表單共用相同的模組定義)

Query Wizard Function

Query Wizard Fields,在 Chart 中欄位是固定的(請參考 [預存程式] 內容),所以無須設定欄位資訊
Query Wizard Filter,查詢條件的設定(必須配合預存程式的參數)


進階功能設計



前端元件如下
要加入 aside 需要2個部份的配合


在表單基本操作時,常會有一種需求,需要按按鈕查詢(或設定) 關聯資料


參數必須指定 functiontag(程式代號),開窗時才能根據參數過濾並取得正確的資料。因為 AMIS 都是 JSON 設定,只能在少數地方寫 code,所以此處我們是利用呼叫 zen_showsource 這支系統預存程式的接口來傳遞參數(para02=beta@xxx)。
這支系統預存程式主要的功能是呼叫應用程式並載入到平台架構內執行,凡是要執行類似的作業,請參考本處的作法。如果不需要傳遞參數,將 para02 設為空白即可。

要在被呼叫程式的 crud 的 _@_query_filter 設定 @ls:query_id

Project To Function,利用網址傳參數


Fields To Function,不傳遞參數


Function To Field,因為無法用網址傳 ProjectID,故改用 Local Storage 傳遞(請注意名稱不要重複)


執行 [設定最佳化], 直接更新資料庫內容

執行 [產生程式], 用 Local Storage 和 Domain 變數傳值

執行 [查詢 JSON 內容], 將 api 回傳值當參數



Query Wizard Project(和表單共用相同的模組定義)

Query Wizard Function

Query Wizard Fields,查詢欄位的設定

Query Wizard Filter,查詢條件的設定(必須配合預存程式的參數)







權限架構說明
https://zh.wikipedia.org/wiki/以角色為基礎的存取控制






首先定義角色許可權,使用者與角色間是多對多的關係。使用者許可權繼承自角色許可權。
附錄







(以下是用壓縮版解壓縮後直接測試,如果無法直接用壓縮版,可以等安裝完成後,再使用同樣的方式測試是否正確安裝)
| seq | Description |
|---|---|
| 1 | http://127.0.0.1:5050/xapi/v2/zenBusiness/get\\\\_keyvalue/2/ |
| 2 | Headers Content-Type application/x-www-form-urlencoded |
| 3 | Body -> x-www-form-urlencoded Para01=xxxx Para02=flowtitle |



將開發環境的程式壓縮後,直接解壓縮,可以直接執行。只要 Win Server和Node.js 的版本沒有太大的差異,通常都可以直接解壓縮後執行。路徑如果非預設,只要修改 api-server.bat 內的路徑即可。

DbClick捷徑後即可啟動,在網址輸入 localhost:5050即可執行

node\\\\_modules\\\\ 是本專案會使用的3-party module(由npm 自動安裝)

請參考 http://blogs.uuu.com.tw/Articles/post/2018/06/27/在NodeJs存取SQL-Server資料庫.aspx
的內容
新增目錄
mkdir test-api
cd 到該目錄
cd test-api




* npm install fs multer body-parser nodemailer cors




由於在本機(或VM虛擬機) 無法設定固定 IP(這個動作應該都是在Server端進行),所以以下是擷取 GCP-VM 的畫面。


https://github.com/azure/iisnode/wiki/iisnode-releases

https://www.iis.net/downloads/microsoft/url-rewrite




http://api.gex.com.tw:5050/xapi/v2/zenBusiness/get_keyvalue/2/
因為目前已知都是執行 api,而在 api 的 【requestAdaptor】 可以執行一些不要太複雜的 js,可以參考













