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