低代碼平臺(tái)應(yīng)該具備哪些基本的特征?
市面上的低代碼平臺(tái)一般具備幾個(gè)特征:
- 基本的權(quán)限管理功能
- 具備代碼生成器
- 前端UI的設(shè)計(jì)
- 后端數(shù)據(jù)接口服務(wù)
有些定位自己為無(wú)代碼平臺(tái)的產(chǎn)品還具備在線表單設(shè)計(jì)和直接預(yù)覽的功能,然后配以基本的插件或者腳本的開(kāi)發(fā)方式來(lái)達(dá)到不寫代碼或者少寫代碼的目的崇呵。
記得若干年前盛行的三層架構(gòu)或者SSH或者SSM框架配以代碼生成器的方式其實(shí)也是一種低代碼的方式,低代碼比較抽象的概念馅袁,代碼多少稱之為低沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)域慷,如果框架具備一定的抽象的能力,并且采用了的DDD的設(shè)計(jì)理念將核心業(yè)務(wù)都采用領(lǐng)域模型進(jìn)行封裝汗销,簡(jiǎn)單的CRUD功能通過(guò)框架去完成犹褒,而開(kāi)發(fā)人員只需要生成簡(jiǎn)單的數(shù)據(jù)庫(kù)表的映射即實(shí)體(Entity),那么這樣的框架我們可以稱之為低代碼的弛针。有些無(wú)代碼框架將業(yè)務(wù)實(shí)體再抽象為字典表叠骑,然后采用前后端通過(guò)JSON動(dòng)態(tài)交互業(yè)務(wù)實(shí)體元數(shù)據(jù)的方式來(lái)消除了實(shí)體的生成,這樣可以把產(chǎn)品定位為“無(wú)代碼”钦奋。
但是理想很美好座云,現(xiàn)實(shí)很骨感,現(xiàn)實(shí)生活中我們很少業(yè)務(wù)是只有單實(shí)體的CRUD功能的付材,所以這樣的低代碼或者無(wú)代碼平臺(tái)無(wú)法完全覆蓋到現(xiàn)實(shí)業(yè)務(wù)朦拖,比如常見(jiàn)的一對(duì)多和多對(duì)多的關(guān)系是業(yè)務(wù)實(shí)體的常態(tài),所以低代碼平臺(tái)還需要做更高的抽象才能滿足現(xiàn)實(shí)的需求厌衔,所以有些商業(yè)軟件抽象了這些基本的模型璧帝,比如:?jiǎn)螌?shí)體模型,一對(duì)多模型富寿,多對(duì)多模型睬隶,甚至有些ERP產(chǎn)品的低代碼平臺(tái)還抽象出了行業(yè)模型的業(yè)務(wù)模型,從而提供更高的業(yè)務(wù)開(kāi)發(fā)和擴(kuò)展能力页徐。
jeecg如何定位苏潜?
jeecg把自己定位為低代碼平臺(tái),但是同時(shí)也具備了在線表單和在線報(bào)表的能力变勇,但是不具備商業(yè)軟件的模型抽象能力恤左,然而它麻雀雖小但五臟俱全,同時(shí)具備了商業(yè)軟件的微服務(wù)部署搀绣,流程設(shè)計(jì)飞袋,消息中心,任務(wù)中心链患,監(jiān)控中心巧鸭,以及移動(dòng)端的設(shè)計(jì)能力。
jeecg與ruoyi對(duì)比
jeecg開(kāi)源大部分功能麻捻,但是在線表單設(shè)計(jì)模塊未提供開(kāi)發(fā)纲仍,不管是前后端都采用了組件開(kāi)發(fā)的方式,并且商業(yè)授權(quán)不明確贸毕。rouyi是一款基于代碼代碼生成器的低代碼框架巷折,它有多個(gè)版本,我們對(duì)比的是它的前后端分離版本崖咨,從技術(shù)角度來(lái)說(shuō)它和jeecg才有對(duì)比性锻拘。
相同點(diǎn):
1.前端都是基于VUE實(shí)現(xiàn)的
2.后端都使用spring boot+mybatis框架
3.都具有代碼生成器
4.都具有權(quán)限和部門管理功能
不同點(diǎn):
1. 前端組件方面rouyi使用的是Elment UI,jeecg為自己封裝的組件
2. jeecg具備在線表單開(kāi)發(fā)功能击蹲,rouyi只是簡(jiǎn)單的前后端代碼生成
3. jeecg具有流程設(shè)計(jì)署拟,消息中心,任務(wù)中心歌豺,移動(dòng)開(kāi)發(fā)能力,以及套打等功能
4. rouyi版本較多推穷,不光有前后端分離架構(gòu),還有其他版本
5. rouyi開(kāi)源性比jeecg更好
jeecg的在線表單功能的實(shí)現(xiàn)原理
前端
jeece目前的版本使用Vue 2.0實(shí)現(xiàn)类咧,路由使用Vue Router實(shí)現(xiàn)馒铃,入口main.js蟹腾,引用permission.js,這里調(diào)用router的beforeEach來(lái)獲取當(dāng)前用戶有權(quán)限的菜單区宇,里面調(diào)用Vue Store 的dispatch方法,本質(zhì)是調(diào)用store/user的GetPermissionList方法娃殖,最終是調(diào)用到后端的api接口的queryPermissionsByUser方法。
router.beforeEach((to, from, next) => {
NProgress.start() // start progress bar
if (Vue.ls.get(ACCESS_TOKEN)) {
/* has token */
if (to.path === '/user/login' || to.path === OAUTH2_LOGIN_PAGE_PATH) {
next({ path: INDEX_MAIN_PAGE_PATH })
NProgress.done()
} else {
if (store.getters.permissionList.length === 0) {
store.dispatch('GetPermissionList').then(res => {
...
}
}
}
}
}
后端存儲(chǔ)數(shù)據(jù)在sys_permission表议谷,通過(guò)該表知道Online表單開(kāi)發(fā)的對(duì)應(yīng)的組件路徑是modules/online/cgform/OnlCgformHeadList炉爆,但是在源代碼中并沒(méi)有這個(gè)路徑,經(jīng)過(guò)搜到知道在utils/util的工具類中g(shù)enerateChildRouters方法對(duì)在線表單做了特殊處理卧晓,其實(shí)是替換到了外部組件包
let componentPath
if(item.component=="modules/online/cgform/OnlCgformHeadList"){
componentPath = onlineCommons.OnlCgformHeadList
}else if(item.component=="modules/online/cgform/OnlCgformCopyList"){
componentPath = onlineCommons.OnlCgformCopyList
}else if(item.component=="modules/online/cgform/auto/OnlCgformAutoList"){
componentPath = onlineCommons.OnlCgformAutoList
}else if(item.component=="modules/online/cgform/auto/OnlCgformTreeList"){
componentPath = onlineCommons.OnlCgformTreeList
}else if(item.component=="modules/online/cgform/auto/erp/OnlCgformErpList"){
componentPath = onlineCommons.OnlCgformErpList
}else if(item.component=="modules/online/cgform/auto/tab/OnlCgformTabList"){
componentPath = onlineCommons.OnlCgformTabList
}else if(item.component=="modules/online/cgform/auto/innerTable/OnlCgformInnerTableList"){
componentPath = onlineCommons.OnlCgformInnerTableList
}else if(item.component=="modules/online/cgreport/OnlCgreportHeadList"){
componentPath = onlineCommons.OnlCgreportHeadList
}else if(item.component=="modules/online/cgreport/auto/OnlCgreportAutoList"){
componentPath = onlineCommons.OnlCgreportAutoList
}else{
componentPath = resolve => require(['@/' + component+'.vue'], resolve)
}
@jeecg/antd-online-mini,這個(gè)包是jeece提供的專門用來(lái)在線開(kāi)發(fā)的組件包芬首,并沒(méi)有開(kāi)源。
后端
后端實(shí)體元數(shù)據(jù)主要是兩個(gè)表:
- onl_cgform_head 實(shí)體元數(shù)據(jù)主表
- onl_cgform_field 實(shí)體元數(shù)據(jù)字段表
后端API提供方式也是采用jar包組件的方式提供逼裆,主要邏輯在org.jeecgframework.boot郁稍,反編譯后可以看到API只是c.a這個(gè)類,采用Spring Boot方式提供API訪問(wèn)接口胜宇,底層取數(shù)使用的是mybatis plus艺晴,crud使用的sql通過(guò)從元數(shù)據(jù)表取得的表名和字段名,然后通過(guò)拼sql的方式實(shí)現(xiàn)掸屡,實(shí)現(xiàn)還是比較簡(jiǎn)單的封寞。
總結(jié)
jeecg在低代碼這塊實(shí)現(xiàn)完整度方面還是不錯(cuò),只不過(guò)在開(kāi)源方面還有所欠缺仅财,同時(shí)缺少行業(yè)模板狈究,在定制和擴(kuò)展方面還有待加強(qiáng),開(kāi)發(fā)方式封裝度感覺(jué)還不是太夠盏求,比較的原始抖锥,缺少對(duì)實(shí)體邏輯的基本抽象和封裝。