TL;DR;
为大家介绍一个能大大提高 Java 开发管理系统效率的框架 Axelor。通过开发一个简单的订单管理系统进行实际开发的演示。内容适合具有一定开发经验的业务系统开发者观看,请初学者自酌。
演示源代码 GitHub: https://github.com/oldrev/ep009-axelor-sales-demo
如平台限制看不到链接,可以私信索取。
前言
有哪个增删改查男孩儿(CRUD Boy)不想把开发效率提高十倍呢?
开发业务管理信息系统也许是软件行业里最无聊的工作,特别是用Java。
Java本身是一门非常啰嗦的语言,却有着业界最多的使用人数,还有最多的库、文档和资料,换句话说也就是说 Java 拥有最大的生态系统。
作为一个随大流的 Java 后端程序员你有没有想过,一个严格使用著名的Spring框架开发的传统三层架构系统, 要想开发新功能是非常麻烦的。
假如要给系统增加一个表,你需要:
- 定义领域模型实体的代码
- 再编写一个和领域模型几乎一摸一样的DTO,也就是数据传输对象。
- ORM 框架,比如 Hibernate的映射配置
- 数据访问层各个 Repository 的接口和实现
- 业务逻辑层的接口和实现
- 展现层MVC的开发
还有前端,或者说客户端,各种 HTML/CSS/JS 开发。一般来说,一个UI体验良好的单页应用,前端代码有可能比后端的代码还要多。
尤其是如果需要开发手机App和微信小程序的话,一些业务逻辑层的接口还得包装成Web API。
那有没有办法能把以上的工作自动化一些呢?有的聪明人想到了用代码生成代码的操作,这里就介绍下我们的主角——自带代码生成器的Java业务管理系统开发框架 Axelor。
Axelor简介
Axelor 是法国同名公司开发的开源ERP管理系统和开发平台,由三个部分组成:
- ADK(Axelor Development Kit):一个模块化 Java Web 数据库应用快速开发框架
- ABS(Axelor Business Suite):基于 ADK 开发的 ERP 套装模块
- APS(Axelor Process Studio):Axelor 的业务流程套件模块
为了达到快速开发管理系统的目的,我们选用ADK作为我们开发的基础框架。Axelor 平台的技术架构是这样的:整个框架使用Google Guice 作为依赖注入框架把整体连接起来,其他部分与Spring 开发的 Java Web 应用没有太大的区别。
Axelor 的关键特性有下面几个:
- 内置的基础模块已具备数据导入导出、定时任务、权限管理等常用功能
- 编译时代码生成器省去大量样板代码
- 除Java以外可以使用 Kotlin、Scala和Groovy开发
- 纯模块化设计,模块可以安装、卸载
- 前端免开发,真正手机可用的响应式设计
- 全自动数据库版本迁移
- 多数据支持:PostgreSQL、MySQL、Oracle(5.0)
- Axelor 是同名公司的唯一主打产品,不会出现类似某些企业为 KPI 开源最后弃坑的情况
- 多租户、多语种多货币等等各种高级功能
下面是我总结的 Axelor 平台设计哲学。
回到根本的问题上来,为什么 Axelor 平台开发速度快?因为开发工作量小。为什么开发工作量小?因为Axelor 后端提供了强力的代码生成器,前端则有无需编写 HTML、JavaScript和CSS 的UI框架,让你只需要专注编写业务相关代码。
接下来通过实现一个简单的虚构销售订单管理系统项目带大家一起实际体验一下 Axelor 的开发。
项目准备
根据功能需求我们设计了四个表:客户表、商品表、订单表和订单明细表。
Figure 001
实际开发之前我们需要准备下Axelor的开发测试环境,必备的有:
- Java8 JDK;
- gradle 构建工具
- 数据库环境,这里我们用 PostgreSQL
- 还有Java 的IDE或者文本编辑器,本次用 IDEA演示,不使用IDE用命令行编译都是可以的。
这张图展示的是我们的订单系统作为一个Axelor项目的目录结构。
新建项目
进入实际开发的第一步,首先启动IDEA,创建一个基于 Gradle的项目,填写项目名称、路径这些参数。
接着创建Gradle工具的项目“build.gradle”文件,内容的话除了应用的名称、标题和子模块这些,其他基本都是固定的。
接下来创建“settings.gradle”文件,里面列出了主项目的名称和包含子模块的目录。
打开命令行输入 gradle build 命令可以测试一下目前的空项目配置是否有问题。
准备数据库
下面来准备数据库,打开数据库客户端工具,创建一个数据库角色,角色名称和密码都设置为“mingming”。开发阶段为了方便,直接作为超级用户。
然后创建一个“ming-sales-demo”的数据库,所有者设置为刚才建立的“mingming”角色。
第六幕:项目的各种配置文件
在主项目的“resources”目录里新建一个应用的配置文件 “application.properties”,根据你的数据库环境来配置下文件里的数据库连接参数。
新建一个Hibernate 的配置文件“persistence.xml”,这个文件是固定内容,复制进来就可以了。
这里我们再新建一个“modules”目录来放各个模块,下面创建一个“sales”目录来容纳销售管理模块的源代码。“sales”模块作为子项目,也需要一个简单的build.gradle 文件。
添加一个表(实体)
到这里,我们就可以进行实际的模块代码开发了。首先新建 src/main/resources/domains 和 views 这一套路径。然后在 domains 目录里新建一个 Entities.xml 文件。Axelor 对目录名称有约定,但文件名是可以任意的。
先把固定的domain-models元素粘贴进来,然后增加一个 module 元素设置一下包名。
接下来增加一个商品信息表的实体定义。
打开命令行,执行“gradle generateCode”命令,完成以后在模块的 build 目录里,可以找到 Axelor 帮我们生成的 Product.java 实体类,可以打开看一下,我们几行 XML 定义就产生了上百行的代码。
执行命令:
$gradle run
系统将自动生成、编译代码,自动迁移数据库结构,最后启动调试用的内置Tomcat服务器。
浏览器打开命令行提示的链接,就可以看到登录界面了。
输入默认的用户名密码“admin”就可以登录进入后台管理界面了。
点击进入Axelor平台里的模型管理功能里看到我们新建的商品实体。
同时,在数据库管理工具里也可以看到系统自动帮我们建好了表,同时还增加了创建时间、修改时间之类的固定字段。
添加界面(视图)
我们先定义菜单,在 views 目录里新建一个Menu.xml文件,这里大概讲解一下文件的结构:
menuitem 元素表示菜单项,这里先定义了一个顶层菜单叫做“销售管理”,然后有一个具体的“商品管理”的菜单项。
商品管理菜单关联到打开视图的动作,有两个视图,一个是列表的网格,一个是表单。
菜单定义好了,再新建一个叫做 Product.xml 的视图布局文件,在里面定义列表网格和表单的界面视图布局。Axelor的视图用 XML 布局然后前端的代码会自动渲染成具体的界面控件并负责和后端通讯。
完了重新启动程序,进入视图管理功能重新加载视图,然后刷新页面就可以看到我们开发的界面了。
同样的操作,把剩下三个表的实体定义和界面都添加进来,重启程序加载视图,就可以得到这样的界面了。
这里点击表单界面的两个按钮或者修改明细数量会报错,接下来我们就来处理前端界面和后端服务的交互问题。
前端和后端交互
在模块的源代码目录 src 里新建 java/com/mingming/sales 这个路径。然后再在里面新建 service 目录用来放业务逻辑层代码,再新建一个 web 目录来放 MVC 控制器代码。
业务逻辑层新建一个 OrderService 的接口,里面添加计算总金额、修改订单状态的几个方法声明。
然后通过 OrderServiceImpl 的类实现具体的业务方法。
最后增加 OrderController 控制器用于提供 JSON API 的接口和前端进行数据交换。
重新启动程序,发现报错了,这里可以看到业务逻辑层我们注入了数据访问层的 OrderRepository 进来,所以新建一个 db/repo 路径,然后实现这个 Repository。
由于我们增加了业务逻辑层的接口和类,需要创建一个简单的 Axelor模块定义类来把它们注册到系统里。
重启登录,进入销售订单的表单界面,编辑明细数量可以看到订单总金额可以自动计算了,点击确认订单按钮也可以转换订单状态了。
打开浏览器的开发者工具我们就可以看到Axelor的前后端是完全通过 JSON格式的请求来交互的,Axelor文档也有说明,自己用其他语言封装一个客户端也是很容易的事情。
可以用手机浏览器打开 Axelor页面看看效果,这个就作为课后练习题了。
修改登录界面
最后,来一个福利:从 Axelor 源代码里把 login.jsp 复制到我们的应用里,系统会自动用这个我们项目里的文件替换Axelor内置的同名文件。
我们这里修改一下login.jsp给登录界面加上背景图片。
结语
到这里我们的四个表的增删改查功能就做好了。
这里为了演示的简单,我没有涉及更多的常用功能,比如权限控制、种子数据导入之类的。
觉得有用的话可以点赞评论,如果感兴趣的人多,我可以把它展开成完整的Axelor开发视频课程。
项目源代码可以在视频下方描述里找到 GitHub 链接,如果看不到的话,可以私信我。
咱们下次见。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。