企业级通用低代码开发平台——一二三应用开发平台发布4.2开源版本,回顾与展望

2023-06-26 08:00:00

背景

今年三月初,确定了自己将来很长一段时间要做的事情,再启程,从头开始,研发一套应用开发平台,完全开源,详见https://blog.csdn.net/seawaving/article/details/129334330

从头开始,不是从零开始,大量的技术选型工作,平台设计与实现工作,都已实现,需要的大多是迁移和优化。

用了四个月的时间,基本完成了多年来设计与实现的平台功能迁移,正式发布4.2版本。
今天来做一个回顾和总结,说一说都做了哪些,以及未来的展望,规划后面要做哪些。

先放一张整体架构图
1.png

后端模块

后端做的主要工作是模块化重构,重构过程中不可避免会进行架构的调整与优化,比如某些功能需要下沉到底层公共基础模块,某些功能需要拆分为更小的颗粒度来提升复用。
到目前为止,整个工程项目,后端共计16个模块,架构图和依赖关系如下图所示:

这16个模块分成三类,一类是平台内核模块,命名规则是platform+模块功能名称,图中用蓝色标示;一类是能力扩展模块,命名规则是platform-boot-starter+模块功能名称,图中用绿色标示;剩下的一类是接口平台,命名规则是cip+模块功能名称,图中用紫色标示,相对平台独立,但又作为平台的重要组成部分。

下面来具体说一说各模块的职责以及包含的功能。

平台内核模块

platform-common作为公用基础模块,主要包括工具类、公用注解、公共父类、公共常量、公共枚举值,与前端UI交互定义的vo类,该模块为最基础的模块,无前置依赖。

platform-system是平台最核心的模块,主要包括组织机构、人员、角色(用户组)、权限、日志、系统参数、模块这些实体和服务的实现,需要注意的是,权限控制、日志记录,并不是在该模块实现,而是在platform-framework平台框架中实现,该模块依赖于platform-common。

platform-framework是平台框架,负责身份认证、权限控制、全局配置、数据分页、日志处理、自动填充(创建人、创建时间、修改人、修改时间),因为身份认证、权限控制等功能,不可避免需要使用处于platform-system模块中的人员、用户组等实体和服务,因此依赖于platform-system。

platform-support是一个业务支撑模块,基于技术组件进行功能设计与封装,实现一些通用的功能设计,更方便业务逻辑的实现,提供附件管理、通知公告、内容模板(用于短信、邮件、消息)、单据流水号、门户等功能。这些支撑模块同样需要位于platform-system模块中的人员、组织机构等实体和服务,因此依赖于platform-system。

platform-entityconfig属于低代码配置范畴,定义了业务实体的元数据,通过模块、实体、模型、视图多级配置,结合模板技术,实现细粒度的代码生成控制。

platform-boot-starter:平台启动项目,整合平台基础功能,类似于spring-boot-starter,业务系统引入该包进行依赖。该模块自身没有实体与服务,而是汇总整合,把platform-framework引用进来,同时进行配置。配置分两方面,一方面是做一个配置类,加一些注解(如:@EnableRetry、@ServletComponentScan、@EnableTransactionManagement),使用开发平台实现的业务系统,就不需要在启动类上重复添加这些注解;另一方面,是位于yml配置文件中的配置信息,也分为两部分,一部分是三方组件自身的,如数据源、连接池、redis、quartz、logback,另一方面是自定义的系统参数,如用户默认密码、导出excel数据的批次最大行数量。

platform-boot-starter-demo:示例项目,实际是模拟业务系统如何使用开发平台,用于平台自身功能开发与调试。

能力扩展模块

绿色标示的四个模块,比较好理解,通常是对第三方组件的封装与整合,依赖于公共基础模块platform-common,这些模块可以不断扩展的,业务系统按需引入即可,这样就实现了核心模块必选、扩展模块可选的目的。
platform-boot-starter-mail:邮件,集成springmail组件,实现邮件的发送功能封装
platform-boot-starter-oss: 对象存储,用于文件存储封装,底层可基于多种模式,如本地磁盘、对象存储系统等
platform-boot-starter-scheduler:任务调度,集成quartz组件,实现任务调度可视化配置
platform-boot-starter-notification:消息通知,基于netty实现的websocket,用于系统内置消息

对于扩展模块,平台的核心模块实际也可能会用到,例如platform-support中的附件功能,就会用到platform-boot-starter-oss;platform-system中的自动解锁用户功能,就会用到platform-boot-starter-scheduler。

接口平台

之前开源了一套通用接口平台,详见专栏https://blog.csdn.net/seawaving/category_11610162.html
现在,将通用接口平台作为一个模块,整合到新的应用开发平台当中来,由通用接口平台统一对外暴露应用系统的API数据接口,以及推送事件消息。
之前的的通用接口平台,主要由两个模块组成,一个是platform-cip(cip是common interface platform缩写),即接口平台的主体,另外一个是platform-cip-common,被platform-cip依赖。
实际上,接口平台的主体,platform-cip,里面包含了三块内容:
1.对外提供API数据接口,提供API服务
2.基于netty的web socket服务端提供消息服务
3.平台自身基础数据的维护,如应用、API服务清单、消息服务清单、订阅等。
本次整合,不是简单的迁移,而是包括重构优化,将platform-cip进一步拆分为三个模块,一共4个模块:
platform-cip-common:公共基础
platform-cip-api:API服务
platform-cip-message:消息服务
platform-cip-manage:平台管理
4个模块内关系为manage依赖common,api和manage相互独立,但都依赖于manage。

前端升级改造

首先是vue2.x升级vue3.x,变化最大的其实是v-model进行了调整,如下:
用于自定义组件时,v-model prop 和事件默认名称已更改:

  • prop:value -> modelValue;
  • 事件:input -> update:modelValue;

几乎所有的自己封装的自定义组件,都要进行相应调整。

此外,vue3兼容了原来的选项式API,新增了组合式API。虽然组合式API更简练,可以将相关的内容集中放在一起,避免来回拖动滚动条,但实际体验不咋样,特别是一些功能组件太随意,相关内容分散到了整个文件各个地方,修改的时候反而需要通过搜索功能才能定位,个人认为不如vue2的选项式API风格,直接去固定的块里找就好了。

其次是element ui升级element plus。总体来说,这块也还好,大部分沿用了旧版本的属性、方法和事件,个别需要调整,工作量还好,印象中涉及到插槽slot的较多,不做相应调整直接就会报错无法正常显示。

最后是vue-element-admin升级vue-element-plus-admin,这块变化挺大。实际上最主要的一点是,这两个都是前端框架,跟后端整合,需要做大量改造,包括登录、获取菜单和路由、会话失效处理、自动附加token等等。
此外,框架附带了部分封装的组件,实际使用过程中发现,比element plus原生组件更好用一点,但同时封装过程中也把部分element plus原生组件的属性、事件和方法给移除掉了,从而影响到了灵活性和扩展性,因此建议慎用。

实际最麻烦的一块,是第三方组件,或者说是vue3的生态。vue3是2020年9月发布的,到现在都快三年了,第三方组件,普遍面临没支持或支持不足的局面,比较尴尬,如前端文件上传组件vue-simple-uploader、v-charts等,自己动手改造和适配难度不小,工作量很大。

未来规划

客观地说,目前开发平台已经实现了大部分常用常见功能,可以投入使用了。由于是一路狂奔模式,速度提升,时间缩短,但不可避免一些功能遗留了待办项,以及未充分测试导致存在bug,后面需要再循着功能过一遍,进行重构、测试,完善功能,输出设计。特别是低代码配置部分,需要持续完善与改进,简化配置,进一步提升开发效率。

后面几块是平台欠缺的,需要补全和完善,每一块都是硬骨头,难度和工作量都不小,做了一些简单初步的了解,具体如下:

集成图表组件

图表展现能力是平台需具备的基础能力,目前echarts是最佳选择。
在早期版本的百度图表中,不同的图表样式,需要不同的数据格式,需要进行复杂封装才能易于使用。百度官方也意识到这个问题,在echarts 4.0版本提供了dataset属性支持,提供了统一的数据格式,也曾考虑基于这一新特性将常用图表进行封装。
后来,发现了饿了么团队出品的开源组件v-charts,统一提供了一种对前后端都友好的数据格式,只需设置简单的配置项,便可轻松生成常见的图表。
但v-charts停留在了vue2.x版本,vue3.x完全没有动静。百度官方自己出了vue-echarts,待进一步做技术预研后集成。

集成工作流

2021年左右,选择了activiti的分支comunda。当时的情况是activiti主分支已落寞,在comunda和flowable这两个分支中选择了前者。集成原生工作流引擎工作量很大,当时投入了几个月,实现了主要功能,效果不是很满意。
简单看了下近况,市面上最多的依旧是基于comunda或flowable进行的二开。
看好国产自研的济南驰骋的JFlow,

表单可视化

虽然平台自身实现的低代码配置部分,可以配置生成前端vue页面,但表单客户端配置这块,对于非标准化的复杂表单,依旧有价值,特别是对于工作流流程中携带的表单的配置。市面上有些表单配置组件,如form-generator,纯前端,跟后端难以集成与整合,实用性有限。比较看好的模式是FormMaking,有接口来集成后端数据,基于vue3和element plus组件,可惜的是需要商务授权。
还有一个方向是上文提到的驰骋JFlow也附带了表单可视化设计,或许能一起解决,还省了自定义表单和流程的集成工作,待进一步了解和评估。

移动端实现

uni-app,无可争议的多端开发框架,vue开发语言和微信api的组合,巧妙而强大,生态已经做起来了。
这块技术难度一般,工作量比较大。

自定义查询

允许用户自己配置查询条件,单表查询比较容易实现,多表连接查询难度大。

实现数据权限

数据权限是一个非常复杂的问题,如何兼顾灵活性和性能的情况下落地,难度很大。目前市面上很多所谓的数据权限实际没有真正实现,要么是预设了组织机构单一维度,给角色设置只看本部门等所谓的数据权限,首先方向就错了,真正的数据权限控制,应该是给要控制的对象设置权限控制策略。
虽然业务系统对于数据权限的控制需求,或者说控制维度是多种多样的,很难标准化,但是还是有一些常用的。
首先,组织机构是最常见,使用频率最高的一个的控制维度。对于一个集团公司,北京分公司与上海分公司,业务数据在公司范围内可见;公司内部不同部门,如采购部门和销售部门,业务数据在部门内范围内可见。
其次,角色也是经常会用到的,用于跨组织机构或没有系统内部的数据从属关系,例如,公司的几个高管,每人分管几个部门,某个高管,跟分管的部门之间从系统看是没有关联的,但客观又存在业务上的需要,高管能看到自己分管的部门数据。
再次,是与当前用户相关,如要求只有发帖人才能修改帖子内容。
最后,就是跟业务实体的具体属性相关了,例如,业务类型是采购还是销售,配送方式是自提还是送到,合同金额超过100万等。
需要注意的是,以上各维度不是单选,而是存在组合情况。

此外,还需要输出平台使用手册,没有文档的平台,做得再好,也是难以熟悉和使用的。

开发平台资料

平台名称:一二三开发平台
简介: 企业级通用开发平台
设计资料:csdn专栏
开源地址:Gitee
开源协议:MIT
开源不易,欢迎收藏、点赞、评论。

更多推荐

Ceph入门到精通-CEPH故障以其处理方法

1.SlowOSDheartbeats#ceph-shealth:HEALTH_WARNSlowOSDheartbeatsonback(longest6181.010ms)SlowOSDheartbeatsonfront(longest5953.232ms)OSDs之间会相互测试(ping)访问速度,若两个OSDs之间

Docker 常用命令

帮助启动类命令1、启动docker:systemctlstartdocker2、停l止docker:systemctlstopdocker3、重启docker:systemctlrestartdocker4、查看docker状态:systemctlstatusdocker5、开机启动:systemctlenabledo

【Flink实战】Flink对接Kafka Connetor使用docker部署kafka

🚀作者:“大数据小禅”🚀文章简介:Flink对接KafkaConnetor第一步使用docker部署kafka🚀欢迎小伙伴们点赞👍、收藏⭐、留言💬目录导航什么是DockerDocker常用命令Docker安装过程Docker部署kafka什么是DockerDocker是一个开源的容器化平台,用于将应用程序和其

Kafka消费一致性和幂等性分析

1、前言在分布式系统中,消息队列被广泛用于数据的传输和处理。其中,Kafka因其高吞吐量、可扩展性和容错性而备受关注。然而,在处理海量数据时,确保消息的一致性和幂等性十分重要。本文将通过代码示例,对Kafka消费一致性和幂等性进行分析。2、问题背景在Kafka消费过程中,消费者从消息队列中获取消息并处理。然而,在某些场

分布式面试题

文章目录前言一、大型网站系统的特点二、拆分VS集群三、微服务VSSOA四、前后端完全分离与Rest规范总结前言大型网站系统的特点拆分VS集群微服务VSSOA前后端完全分离与Rest规范一、大型网站系统的特点高并发,大流量需要面对高并发用户,大流量访问。Google日均PV35亿,日IP访问数3亿;腾讯QQ的最大在线用户

简述现代加油站的智能防雷设计及其解决措施

随着经济的发展,人民群众生活水平不断提高,汽车已经成为非常普通的代步工具,与其配套的汽车加油站也越来越多。据统计,目前,我国各种类型加油加气站将近10万座,其中中石油约有18000座,中石化约有28000多座,其他国有、民营和外资等约有46000多座。与此同时,加油站的安全问题显得更加重要。加油站是易燃易爆场所,属于第

Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

目录1.窗口最大化2.单选框操作3.复选框操作4.下拉列表5.selenium三种等待6.键盘操作7.截屏8.断言9.Selenium操作JS弹窗控件10.鼠标悬停与释放1.窗口最大化driver.maximize_window()2.单选框操作driver.find_element_by_xpath("//input

【TCP】三次握手 与 四次挥手 详解

三次握手与四次挥手1.三次握手2.四次挥手三次握手和四次挥手的区别在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接1.三次握手服务端状态转化:[CLOSED->LISTEN]服务器端调用listen后进入LISTEN状态,等待客户端连接;[LISTEN->SYN_RCVD]一旦监听到连接请求(同步报文段SY

【Go 基础篇】Windows 开发常用 Dos 命令

介绍在计算机开发领域,命令行工具是开发者的得力助手,能够快速、高效地完成各种任务。在Windows操作系统中,DOS(DiskOperatingSystem)命令是一组强大的命令行工具,用于进行文件操作、目录管理、进程控制等各种操作。虽然现代开发环境提供了图形界面和可视化工具,但掌握常用的DOS命令仍然是一项必要的技能

SpringMVC中的自定义注解

目录简介注解(Annotation)在Java编程中的作用SpringMVC中的自定义注解Java注解是什么?为什么在Java开发中注解变得如此重要?Java注解分类1.标准注解(JDK基本注解)2.自定义注解JDK基本注解JDK元注解自定义注解如何使用自定义注解?案例1:获取类与方法上的注解值案例二:获取类属性上的注

前端构建工具 webpack 笔记

1、了解webpack1、定义:本质上,webpack是一个用于现代JavaScript应用程序的静态模块打包工具,当webpack处理应用它会在内部从一个或多个入口点构建一个依赖图(dependencygraph),然后将你项目中所程序时,需的每一个模块组合成一个或多个bundles,它们均为静态资源,用于展示你的内

热文推荐