一個基於SpringBoot 2 的管理後臺系統,有數十個基於此的商業應用,包含了用戶管理,組織機構管理,角色管理,功能點管理,菜單管理,權限分配,數據權限分配,代碼生成等功能 相比其他開源的後臺開發平臺腳手架,SpringBoot-Plus 使用簡單,可以輕易完成中型,大型系統開發。同時技術棧較為簡單
如何判斷一個開源開發平臺適合自己
- 要明白單體系統,系統拆分,微服務三個不同構建開發平臺方式,plus支持單體和系統拆分,一般而言,後臺管理系統適合單體和系統拆分。微服務並不適合系統管理,以我知道的互聯網大廠,央企後臺管理系統,還是以前倆個為多
- 你需要的是技術框架還是開發平臺,技術框架就是技術堆砌,開發平臺必須具備一定複雜基礎業務功能
- 看權限模型,支持功能權限和數據權限。plus具備強大的功能權限和數據權限,且可以擴展n種數據權限
- 看用戶是否能屬於多個部門,用戶兼職情況很常見
- 看數據字典是否支持級聯,數據字典級聯太常見了,平臺需要提供數據和前端的支持。puls系統支持
- 看代碼生成是否支持預覽,為什麼要預覽,因為生成會覆蓋,預覽可以修改已經生成的代碼
Plus系統是一個使用簡單,功能較為複雜的開源系統,已經數十家商業公司採用
系統基於Spring Boot2.1技術,前端採用了Layui2.4。數據庫以MySQL/Oracle/Postgres/SQLServer為實例,理論上是跨數據庫平臺.
1 使用說明
1.1 安裝說明
建議在徹底熟悉plus系統之前,先暫時不要修改其他配置選項,免得系統無法訪問
本系統基於Spring Boot 2 ,因此請務必使用JDK8,且打開編譯選項parameters(點擊瞭解parameters), 並重新編譯工程,如果你沒有使用Java8的 parameters 特性,系統不能正常使用
從Git上獲取代碼後,通過IDE導入此Maven工程,包含倆個子工程
- admin-core ,核心包,包含了緩存,數據權限,公用的JS和HTML頁面。
- admin-console, 系統管理功能,包含了用戶,組織機構,角色,權限,數據權限,代碼生成等管理功能
com.ibeetl.admin.CosonleApplication 是系統啟動類,在admin-console包下,在運行這個之前,還需要初始化數據庫,位於doc/starter-mysql.sql,目前只提供mysql, oracle, postgresql腳本。理論上支持所有數據庫
還需要修改SpringBoot配置文件application.properties,修改你的數據庫地址和訪問用戶
spring.datasource.baseDataSource.url=jdbc:mysql://127.0.0.1:3306/starter?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=true
spring.datasource.baseDataSource.username=root
spring.datasource.baseDataSource.password=123456
spring.datasource.baseDataSource.driver-class-name=com.mysql.cj.jdbc.Driver
運行CosonleApplication,然後訪問http://127.0.0.1:8080/ 輸入admin/123456 則可以直接登錄進入管理系統
1.2 創建子系統
SpringBoot-plus 是一個適合大系統拆分成小系統的架構,或者是一個微服務系統,因此,如果你需要創建自己的業務系統,比如,一個CMS子系統,建議你不要在SpringBoot-Plus 添加代碼,應該是新建立一個maven工程,依賴admin-core,或者依賴admin-console(如果你有後臺管理需求,通常都有,但不是必須的)
創建子系統,可以進入代碼生成>子系統生成, 輸入maven項目路徑,還有包名,就可以直接生成一個可運行的基於SpringBoot-Plus 的子系統,所有代碼可以在個項目裡些完成,直接運行MainApplication,
@SpringBootApplication @EnableCaching @ComponentScan(basePackages= {"com.corp.xxx","com.ibeetl.admin"}) public class MainApplication extends SpringBootServletInitializer implements WebApplicationInitializer { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
子系統包含了admin-core和admin-console, 因此你可以直接在子系統裡使用core和console提供的所有功能,通過子系統的console功能的代碼生成來完成進一步開發
子系統可以單獨運行和維護,也可以集成到nginx後構成一個龐大的企業應用系統
1.2.1 配置子系統
子系統不需要做任何配置即可在IDE裡直接運行,如果你想打包jar方式運行,則需要添加
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-maven-plugin/<artifactid>
如果你想打包成war放到tomcat下運行,需要修改maven打包為war
<packaging>war/<packaging>
1.2.2 菜單系統
系統默認提供三種類型菜單
- 系統級菜單,出現在頁面頂部,表示一個子系統
- 導航菜單,出現在頁面左邊,點擊導航將打開其下所有菜單
- 菜單,點開菜單將定位到頁面,菜單必須關聯到一個功能點。
建議新建立一個子系統來放置新功能
SpringPlus-Boot 並非以菜單或者按鈕來組織整個系統,而是以功能點來組織整個系統提供的功能。如果要使得菜單生效,你必須要先常見一個功能點並且功能點有一個訪問地址,然後將此菜單關聯到這個功能點
SpringBoot-Plus 先建立功能點是個好習慣,功能點被組織成一顆樹,代表了系統應該提供功能的功能,我們看代碼就會看到,功能點跟菜單,跟權限,和數據權限都有密切關係
1.2.2 添加代碼
可以參考1.3業務代碼生成生成初始化的代碼,業務代碼生成了14個文件,包含前後端所有代碼,可以通過生成來了解代碼習作規範
1.3 業務代碼生成
在介紹如何利用Plus開發系統之前,先介紹代碼生成功能,此功能可以生成前後端代碼總計14個文件,你可以通過預覽功能瞭解如何開發這個系統
代碼生成針對表進行代碼生成,包括JS,JAVA,SQL和HTML,可以通過預覽功能直接預覽。在生成代碼到本地前,有些參數需要修改,否則,代碼生成後顯示的都是英文
- 顯示字段 : 當此實體顯示在任何地方的時候,能代表此實體的名稱,比如用戶名,組織機構名
- 變量名:可以自己設定一個較短的名字,此變量名會用於前後端的變量
- urlBase:你規劃的子系統,最後訪問路徑是urlBase+變量名字
- system: 存放sql目錄的的名稱
其他修改的地方有
是否包含導入導出,如果選擇,則會生成導入導出的代碼,導入導出模板則需要參考已有功能(比如數據字典)來完成
是否包含附件管理,如果選擇,則業務對象可以關聯一組附件,比如客戶關聯一組附件,或者申請信息關聯一組附件。
字段信息的顯示名字,這個用於前端列表,表單的顯示,應當輸入中文名字
作為搜索,可以勾選幾個搜索條件,系統自動生成一個搜索配置類
如果字段關聯數據字典,那麼設置一個數據字典,這樣,生成的界面將會變成一個下拉列表
1.3.1 前端代碼
前端代碼採用了layui的JS框架,使用了按需加載的方式,文檔參考 http://www.layui.com/doc/base/infrastructure.html.
- index.js: 系統入口JS,包含了查詢和表格
- add.js : 新增操作的所有JS
- edit.js: 編輯操作的所有JS
- del.js: 刪除操作的所有JS
基礎JS
- Common.js: 封裝了通常JS功能,如jquery的post方法,layui的窗口方法
- Lib.js 封裝了業務相關方法,如submitForm,loadOrgPanel等方法
1.3.2 HTML代碼
頁面採用layui,文檔參考 http://www.layui.com/demo/
模板語言了使用Beetl,文檔參考ibeetl.com
- index.html: 功能首頁
- add.html: 新增首頁
- edit.html: 編輯操作首頁
採用layui的好處是自帶了頁面和組件還有JS的管理,能完成大多數業務需求
基礎UI組件:
- orgInput.tag.html 組織機構輸入框
- simpleDictSelect.tag.html 字典下拉列表
- simpleDataSelect.tag 包含key-value的下拉列表
- searchForm.tag.html 通用搜索表單
- submitButtons.tag.html 提交按鈕
- accessButton.tag.html 普通按鈕(含權限)
- attachment.tag.html 附件管理組件
- ....
2 單體系統,系統拆分和微服務
plus是一個適合單體系統,系統拆分的java快速開發平臺,也可以經過改造成微服務平臺(以前做一個版本,但覺得plus應該聚焦系統核心,而不是簡單堆砌功能,所以放棄了)
以下是單體系統,小系統,和微服務的區別
單體系統是一種常見系統設計方式,也是這十幾年年來最主要的設計方式。單體系統的所有功能都在一個工程裡,打成一個war包,部署。這樣有如下明顯好處
- 單體系統開發方式簡單,我們從剛開始學習編程,就是完成的單體系統,開發人員只要集中精力開發當前工程
- 容易修改,如果需要修改任何功能,都非常方便,只需要修改一個工程範圍的代碼
- 測試簡單,單體系統測試不需要考慮別的系統,避免本書下冊要提到的各種REST,MQ調用
- 部署也很容易:不需要考慮跟別的系統關係,直接打war包部署到Web服務器即可
- 性能容易擴展,可以通過Nginx,把一個應用部署到多個服務器上。
隨著業務發展,重構,單體系統越來越多,在開發一個龐大的單體系統的時候,就會有如下弊病
- 單體系統龐大,越來越難理解單體系統,微小的改動牽涉面廣泛導致開發小組小心謹慎,開發速度會越來越慢。另外,啟動一個龐大的單體系統,可能需要3分鐘,或者更多時間
- 多個功能在同一個單體系統上開發,導致測試越來越慢,比如,測試必須排期,串行測試
- 單體系統如果想對技術進行更新換代,那代價非常大,如果是個小系統構成,則可以選取一個小系統先做嘗試。單體大系統是幾乎不可能做技術升級的
- 單體系統的所有功能運行在同一個JVM裡,功能會互相影響,比如一個統計上傳word文檔的頁碼的功能由於非常消耗CPU,因此,會因為調用統計功能,導致整個系統短暫都不可用,出現假死的現象
因此,越來越多的架構師在設計系統的時候,會考慮系統拆分成多個單體小系統甚至是微服務。對於傳統企業應用,拆成小系統更合適,對互聯網系統,使用微服務個更合適,這是因為
- 傳統IT系統本質上還是會用一個數據庫,而微服務提倡的是一個服務一個數據庫
- 傳統IT系統很少需要調用其他模塊服務。傳統IT系統通過工作流來串聯其他子系統。而電商類的微服務則是通過RPC等方式進行交互,是一個輕量級協議。傳統IT系統也可以通過SOA,JMS跟其他系統(非子系統)交互,採用重量級協議
- 微服務對系統的基礎設施要求很高,比如微服務治理,彈性庫等等,只要電商系統才有人力物力去做這種事情,而傳統IT系統,及時財大氣粗,也暫時不具備微服務那樣的IT基礎設置
因此,對於大多數傳統IT應用來說,單體拆分小系統在技術上沒有風險,是一個可以立即實施的架構。如下是一個單體系統拆分後的物理架構
對於用戶來說,訪問不同的菜單功能,講定位到不同得子系統,提供服務。
閱讀更多 DIY分享秀 的文章