OneCode 基于“真實代碼”代碼的建模設計,無縫整合二次開發(fā)
在很多優(yōu)秀的低代碼平臺中都支持了本地代碼導出的設計,方便開發(fā)者二次集成,但能夠?qū)С龅那疤崾且呀?jīng)通過低代碼平臺進行了初步的數(shù)據(jù)建模,界面繪制等基礎性的操作。這些導出的代碼雖然很大程度上減輕了開發(fā)者的代碼量,但在項目的迭代過程中,遇到數(shù)據(jù)或需求變更。這些代碼就又會成為開發(fā)者巨大的負擔,重新由低代碼平臺建模會產(chǎn)生代碼上的沖突無法解決,而重新用code編寫這一步代碼則又面臨手工代碼與“機器代碼”的整合問題。而更為致命的問題是項目上線后,當直接用戶希望通過低代碼工具進行維護系統(tǒng)時更是“閃崩”。這也是低代碼平臺在直接用戶叫好不叫座的根本原因。
本文將結(jié)合OneCode的底層編譯原理來講解 OneCode基于真實代碼的建模解決方案。
一,OneCode編譯設計原理
(1)OneCode宿主語言(Java)一體化設計
OneCode 本身基于JAVA語言體系,是在Java Spring 注解基礎上的一套擴展子集,混合編譯引擎器通過擴展注解構(gòu)建完整的Domain模型,通過讀取標準Spring 注解完成普通Web數(shù)據(jù)交付及調(diào)度過程,通過Domin域模型動態(tài)渲染JS文件輸出為JSON交付給前端引擎構(gòu)建頁面。
(2)設計優(yōu)勢:
這種設計將數(shù)據(jù)結(jié)構(gòu)和業(yè)務應用進行了合理的捆綁,但又通過語言體系的不同進行了有機的解耦,使得OneCode可以將設計“元數(shù)據(jù)文件”和到導出給開發(fā)者的“源代碼”合二為一。開發(fā)者可以通過本地代碼的方式進行二次開發(fā),而OneCode 卻仍然可以在開發(fā)者修改過的代碼上讀取最原始的建模信息。而二者在代碼上的沖突則可以通過,合理的分層架構(gòu),通過IOC反轉(zhuǎn)控制,將手工代碼與元數(shù)據(jù)代碼有機的分離。同時再利用不同的AOP切面達到各自的目的。
(3)OneCode代碼示例:
在OneCode提供的開發(fā)示例中提供了一種簡單的分層方式:
onecode/onecode-plugins
@FormAnnotation(customService = IPersonAPI.class, col = 2)public interface IPersonForm { @Uid public String getPersonId(); @Pid public String getRoleId(); @Pid public String getOrgId(); @CustomAnnotation(caption = "郵箱") public String getEmail(); @Required @CustomAnnotation(caption = "賬戶信息") public String getAccount(); @Required @InputAnnotation(inputType = InputType.password) @CustomAnnotation(caption = "密碼") public String getPassword(); @Required @CustomAnnotation(caption = "用戶名") public String getName(); @ComboNumberAnnotation @CustomAnnotation(caption = "手機") public String getMobile();}
手工:
@EsbbeanAnnotationpublic class PersonForm implements IPersonForm { String personId; String orgId; String roleId; String name; String account; String email; String password; String mobile; String orgName; public PersonForm() { } public PersonForm(Person person) { this.personId = person.getID(); this.orgId = person.getOrgId(); this.name = person.getName(); this.account = person.getAccount(); this.password = person.getPassword(); this.mobile = person.getMobile(); this.email = person.getEmail(); } public String getPersonId() { return personId; } public void setPersonId(String personId) { this.personId = personId; } public String getOrgName() { return orgName; } public void setOrgName(String orgName) { this.orgName = orgName; } public String getRoleId() { return roleId; } public void setRoleId(String roleId) { this.roleId = roleId; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getOrgId() { return orgId; } public void setOrgId(String orgId) { this.orgId = orgId; }}
(3)運行結(jié)果三端讀取展示
OneCode建模工具讀取配置:
可視化編輯器讀取結(jié)果:
開發(fā)者也可以同步使用idea等專業(yè)的開發(fā)工具編輯
二,手工代碼 DDD建模 拖拽 三種模式的相互轉(zhuǎn)換
(1),手工代碼變化向設計層通知轉(zhuǎn)換:
在實際開發(fā)的過程中,最常見的一種操作就是增加一些表單字段或者列表展現(xiàn)列,這些行為多數(shù)發(fā)生在導出代碼后。程序員在傳統(tǒng)的操作中通常修改bean實體代碼和增加頁面的代碼輸入域即可。但在低代碼應用中則需要重新返回視圖設計界面以及數(shù)據(jù)模型設計進行多出修改,然后重新生成代碼才能完成。這些操作不但費時費力而且極易產(chǎn)生代碼沖突。在OneCode的方案中允許用戶直接在OneCode上添加一個接口描述,并聲明基本的注解類型。然后在OneCode 領域工具中找到對應的代碼地址點擊重置應用。
然后再表單子域中就會發(fā)現(xiàn)新增加的字段屬性
在領域工具中初步進行元數(shù)據(jù)配置后重新編譯視圖便可同步更新頁面。
同理除了我們增加字段這樣的需求外我們還可以通過OneCode代碼直接聲明一個,樹形視圖、列表視圖、表單視圖等等。聲明完成后再利用OneCode建模工具進行相應的展示和交互設計即可。
(2),模型設計器向OneCode源代碼的轉(zhuǎn)換
對于程序員而言代碼是最友好的,他們希望通過代碼來打通應用創(chuàng)建簡單易用的程序。但在整個項目實施過程中,必不可少的會有一些更關注產(chǎn)品以及應用需求本身的角色參與,如:產(chǎn)品經(jīng)理、項目經(jīng)理、以及項目實施人員。
(3),可視化設計器向OneCode源代碼的轉(zhuǎn)換
用戶通過,拖拽完成頁面建模序列化為按標準協(xié)議序列化JSON文件,后端OneCode服務支撐系統(tǒng)解析JSON文件并混合DSM建模信息以及后端服務邏輯后,通過混合編譯,通過代碼工廠指定出碼模板,完成前后端一體的編譯文件。
原型原理
三,混合編譯與動態(tài)切面支持
三種編程方式混搭使用在設計器為團隊提供了很好的協(xié)作支持,但一旦項目上線任然會面臨一定的風險。特別是低代碼編譯部分重新上線修改會帶來的風險更大。OneCode針對這以問題,在架構(gòu)上提供了一層虛擬的運行支持層。在Studio中找到運行期配置
進入到運行期配置,我們可以看到所有可配置的OneCode屬性,這些屬性與代碼中注解一一對應的可視化配置
四,可視化設計器頁面調(diào)整維護
在項目上線后,大幅修改往往會集中在一些樣式以及用戶交互的細節(jié)上。OneCode 在設計之初,變將頁面文件作為獨立的后綴為.cls文件進行管理,在運行期動態(tài)轉(zhuǎn)換為js 供前端按需加載。同時利用Stuido開發(fā)工具也可以方方便的直接連接到當前服務容器,進行在線修改調(diào)整,并利用版本工具控制測試數(shù)據(jù)。
OneCode 設計器提供了強大的編輯修改功能:
(1)OneCode樣式
DOM樹透視樣式盒
動態(tài)樣式盒
(2)OneCode動作事件
動作(邏輯)概覽則是針對邏輯片段可視化的入口工具。打開任意頁面便可以直觀的將該頁面的代碼片段以直觀的方式展現(xiàn)出來。并且可以直接插入,編輯事件,修改動作。同時也可以在調(diào)試期動態(tài)的中斷、跳出終止等功能。