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 鏈接,如果看不到的話,可以私信我。
咱們下次見。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。