低代码平台 jeecg介绍

2022-02-20  本文已影响0人  gregoriusxu

低代码平台应该具备哪些基本的特征?

市面上的低代码平台一般具备几个特征:

有些定位自己为无代码平台的产品还具备在线表单设计和直接预览的功能,然后配以基本的插件或者脚本的开发方式来达到不写代码或者少写代码的目的。

记得若干年前盛行的三层架构或者SSH或者SSM框架配以代码生成器的方式其实也是一种低代码的方式,低代码比较抽象的概念,代码多少称之为低没有统一的标准,如果框架具备一定的抽象的能力,并且采用了的DDD的设计理念将核心业务都采用领域模型进行封装,简单的CRUD功能通过框架去完成,而开发人员只需要生成简单的数据库表的映射即实体(Entity),那么这样的框架我们可以称之为低代码的。有些无代码框架将业务实体再抽象为字典表,然后采用前后端通过JSON动态交互业务实体元数据的方式来消除了实体的生成,这样可以把产品定位为“无代码”。

但是理想很美好,现实很骨感,现实生活中我们很少业务是只有单实体的CRUD功能的,所以这样的低代码或者无代码平台无法完全覆盖到现实业务,比如常见的一对多和多对多的关系是业务实体的常态,所以低代码平台还需要做更高的抽象才能满足现实的需求,所以有些商业软件抽象了这些基本的模型,比如:单实体模型,一对多模型,多对多模型,甚至有些ERP产品的低代码平台还抽象出了行业模型的业务模型,从而提供更高的业务开发和扩展能力。

jeecg如何定位?

jeecg把自己定位为低代码平台,但是同时也具备了在线表单和在线报表的能力,但是不具备商业软件的模型抽象能力,然而它麻雀虽小但五脏俱全,同时具备了商业软件的微服务部署,流程设计,消息中心,任务中心,监控中心,以及移动端的设计能力。

jeecg与ruoyi对比

jeecg开源大部分功能,但是在线表单设计模块未提供开发,不管是前后端都采用了组件开发的方式,并且商业授权不明确。rouyi是一款基于代码代码生成器的低代码框架,它有多个版本,我们对比的是它的前后端分离版本,从技术角度来说它和jeecg才有对比性。

相同点:

1.前端都是基于VUE实现的
2.后端都使用spring boot+mybatis框架
3.都具有代码生成器
4.都具有权限和部门管理功能

不同点:
1. 前端组件方面rouyi使用的是Elment UI,jeecg为自己封装的组件
2. jeecg具备在线表单开发功能,rouyi只是简单的前后端代码生成
3. jeecg具有流程设计,消息中心,任务中心,移动开发能力,以及套打等功能
4. rouyi版本较多,不光有前后端分离架构,还有其他版本
5. rouyi开源性比jeecg更好

jeecg的在线表单功能的实现原理

前端

jeece目前的版本使用Vue 2.0实现,路由使用Vue Router实现,入口main.js,引用permission.js,这里调用router的beforeEach来获取当前用户有权限的菜单,里面调用Vue Store 的dispatch方法,本质是调用store/user的GetPermissionList方法,最终是调用到后端的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 => {
       ...
       }
     }
   }
 }
}

后端存储数据在sys_permission表,通过该表知道Online表单开发的对应的组件路径是modules/online/cgform/OnlCgformHeadList,但是在源代码中并没有这个路径,经过搜到知道在utils/util的工具类中generateChildRouters方法对在线表单做了特殊处理,其实是替换到了外部组件包


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,这个包是jeece提供的专门用来在线开发的组件包,并没有开源。

后端

后端实体元数据主要是两个表:

后端API提供方式也是采用jar包组件的方式提供,主要逻辑在org.jeecgframework.boot,反编译后可以看到API只是c.a这个类,采用Spring Boot方式提供API访问接口,底层取数使用的是mybatis plus,crud使用的sql通过从元数据表取得的表名和字段名,然后通过拼sql的方式实现,实现还是比较简单的。

总结

jeecg在低代码这块实现完整度方面还是不错,只不过在开源方面还有所欠缺,同时缺少行业模板,在定制和扩展方面还有待加强,开发方式封装度感觉还不是太够,比较的原始,缺少对实体逻辑的基本抽象和封装。

上一篇下一篇

猜你喜欢

热点阅读