1. 程式人生 > >幹掉前端!3分鐘純 Java 註解搭個管理系統

幹掉前端!3分鐘純 Java 註解搭個管理系統

大家好,我是小富~ 最近接觸到個新專案,發現它用了一個比較有意思的框架,可以說實現了我剛入行時候的夢想,所以這裡馬不停蹄的和大家分享下。 在我剛開始工作接觸的專案都還沒做前後端分離,經常需要後端來維護頁面,有時候覺得自己好像天生不適合幹前端,你要是讓我研究研究後端的技術,看箇中間件原始碼啊,分析分析什麼框架底層原理啊,這都問題不大,偶爾搞一下`JS`也可以。你要是讓我寫個`css`樣式,那簡直要命了,一點也提不起興趣,不知道有沒有跟我一樣的。 ![](https://img-blog.csdnimg.cn/20210323130333473.png) 今天要介紹的框架直接不用寫頁面了,話不多說,下邊咱們直奔主題 `Erupt`一個通用後臺管理框架,據說有 **超低程式碼量**、 **零前端程式碼**、**零 CURD操作**、**無需建表**,**純Java註解開發**等特色,號稱三分鐘就可以搭建一個完整的後臺管理系統。 額~ 聽著好像還挺流批的,到底是不是有這麼魔幻,咱們一起用起來感受下。 首先來搭建一下環境,目前`Erupt`支援`Java`版本`1.8.0`及以上、`Spring Boot`版本`2.0`及其以上。 **搭建easy** `pom.xml`引入必要的`jar`包 ```xml org.springframework.boot spring-boot-starter mysql mysql-connector-java xyz.erupt erupt-upms 1.6.7 xyz.erupt erupt-security 1.6.7
xyz.erupt erupt-web 1.6.7 org.springframework.boot spring-boot-starter-tomcat compile
``` `application.yml` 檔案只要簡單配置資料來源就好,提前準備個數據庫,說到資料庫這裡我說個小插曲。 我之前在`Github` 提交案例程式碼的時候(`https://github.com/chengxy-nds/Springboot-Notebook` ),由於沒太注意沒遮蔽敏感資訊,導致雲資料庫賬號洩露了,最近我發現已經有小夥伴在資料庫上跑專案了,仔細看了看裡邊的資料結構,發現像是個畢設專案。 ![](https://img-blog.csdnimg.cn/20210323132908875.png) 本身這個庫就是我跑`demo`案例的一個測試庫,為的就是讓小夥伴能把更多時間放在研究案例的技術點上,減少搭建環境這種沒技術含量的瑣碎事。 發現歸發現,這裡我沒改密碼,也沒刪他們的庫,如果你要用就繼續用著,但玩歸玩,鬧歸鬧,**你不能亂動不是你的資料**!影響其他人學習就不好了。 ```java spring: datasource: url: jdbc:mysql://47.93.6.5:3306/erupt2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: 123456 jpa: show-sql: true generate-ddl: true database-platform: org.hibernate.dialect.MySQL5InnoDBDialect database: mysql profiles: active: dev mail: username: [email protected] password: xxxxxxx host: smtp.qq.com properties: mail.smtp.ssl.auth: true mail.smtp.ssl.enable: true mail.smtp.ssl.required: true server: port: 8888 ``` 說了點題外話,我們繼續搞起~ 其實到這`Erupt`的環境就搭建完了,額~ ,這就完了? 咱們什麼也沒幹,專案是個空殼子,一行程式碼也沒寫,好像連個表也沒建啊! ![](https://img-blog.csdnimg.cn/20210323194814593.png?) 彆著急咱們先啟動下專案,看到控制檯打印出很多建表語句和插入語句,這是因為`Erupt`框架底層應用`JPA`持久化,預置建立了一些系統表和資料。 ![](https://img-blog.csdnimg.cn/2021032413095250.png?) **注意**:`Erupt`預置表只會隨專案第一次啟動構建一次,如果想重新建立,需刪除`.Erupt`檔案(一般在專案的工作空間內),獲取檔案位置方式 ```java System.getProperty("user.dir") ``` 再看資料庫裡建立了16張系統表,其中`e_upms_user`表是使用者表,預設只有一個管理員賬號,使用者名稱、密碼都是`erupt`。 ![](https://img-blog.csdnimg.cn/20210324131238168.png?) 緊接著我們訪問`http://127.0.0.1:8888/`,看一下是個什麼效果,竟然有個完整的登入頁面。 ![](https://img-blog.csdnimg.cn/20210325132712944.png) 用上邊的使用者名稱、密碼直接登入,`erupt`已經預先實現了完整的許可權控等功能,而到這我們幾乎是沒寫過什麼程式碼的,都是框架封裝好了的,選單類資料全部從資料庫動態獲取,一個基礎的後臺管理系統就搭建完了,有點哇塞。 ![](https://img-blog.csdnimg.cn/20210324133541112.png) **有趣的頁面** 那麼問題來了?想要自定義頁面怎麼辦? 開篇我們就說過`erupt`是零前端程式碼,全部基於`Java`註解開發的,接下來用`Java`註解寫個簡單頁面體驗下。 `erupt`有兩個核心註解`@Erupt`,`@EruptField` - `@Erupt`註解修飾類,代表定義一個頁面 - `@EruptField`註解修飾字段,代表頁面上顯示的欄位名 - `@Power`註解控制是否操作按鈕,增、刪、改、查、匯入、匯出等 - `@Search`註解表示欄位為搜尋條件 - `@Table`註解表示頁面取資料對應的表,如果不設定,頁面第一次初始化的時候,會根據類欄位值自動建立一張和類名一致的表名。 >
註解型別比較多,不一一列舉了,更多的自己到官網瞅:`https://www.erupt.xyz` 下邊我們定義一個`Student`類,加上`@Erupt`,`@EruptField`註解,這樣頁面和元素就算寫完了,是不是有點顛覆認知。 ```java /* * @Erupt註解修飾在類上,@EruptField註解修飾在欄位上 * 其他註解均為Jpa註解 */ @Getter @Setter @Erupt(name = "學生表", power = @Power(importable = true, export = true) ) @Entity //@Table(name = "t_student") public class Student extends BaseModel { @EruptField( views = @View(title = "學生姓名"), edit = @Edit(title = "學生姓名", notNull = true, search = @Search(vague = true)) ) private String studentName; @EruptField( views = @View(title = "所屬班級"), edit = @Edit(title = "所屬班級", notNull = true) ) private String studentClass; @EruptField( views = @View(title = "學生年齡"), edit = @Edit(title = "學生年齡", notNull = true) ) private String studentAge; @Lob @EruptField( views = @View(title = "學生性別"), edit = @Edit(title = "學生性別", notNull = true) ) private String studentSex; @EruptField( views = @View(title = "考核狀態"), edit = @Edit(title = "考核狀態", notNull = true, boolType = @BoolType(trueText = "通過", falseText = "掛科"), search = @Search) ) private Boolean status; } ``` 但此時新建立的頁面不會顯示出來,還需要我們手動做一個對映關係,在選單維護中自定義個選單,**型別值**一定要為新建的 **類名** `Student`。 ![](https://img-blog.csdnimg.cn/20210325123929998.png?) 儲存重新整理後會看到我們的新頁面出現了,而且頁面的功能很完整,基礎操作、查詢、匯入、匯出功能都自動實現了。 ![](https://img-blog.csdnimg.cn/20210325133617841.png?) 頁面新增一個學生資訊,對應的`Student`表也多了條記錄,而這個持久化的過程完全由框架來做。 ![](https://img-blog.csdnimg.cn/2021032514102996.png) 儘管`Erupt` 框架對前後端程式碼做了深度封裝,但它提供了豐富靈活的自定義介面,來滿足我們的個性化需求。 比如我們在錄入新學生資訊時,希望遮蔽名字為`張三`的同學,可以對頁面按鈕功能做代理`dataProxy`,實現自定義的邏輯,對哪個按鈕代理就實現對應方法即可,如`beforeAdd`、`afterAdd`是對新增按鈕的代理。 ```java @Getter @Setter @Erupt(name = "學生表",dataProxy = {StudentDataProxy.class}, power = @Power(importable = true, export = true) ) @Entity //@Table(name = "t_student") public class Student extends BaseModel { } public class StudentDataProxy implements DataProxy { @Override public void beforeAdd(Student student) { //後臺欄位校驗 if ("張三".equals(student.getStudentName())) { throw new EruptApiErrorTip("名稱禁止為張三!"); } } @Override public void afterAdd(Student student) { } @Override public void afterUpdate(Student student) { } @Override public void afterDelete(Student student) { } } ``` 當我們在頁面錄入名字為`張三`的同學時,成功遮蔽。其他類似的功能還有很多,這裡就不一一舉例了,看文件看文件~ ![](https://img-blog.csdnimg.cn/20210325144817229.png) 如果我們想要按傳統的方式開發介面,不用擔心會和`Erupt`的頁面生成規則有衝突,絲毫不會受影響。而且`Erupt`內部集成了`JPA`,提供了現成的`dao`介面,只要呼叫對應API即可上手開發。 ![](https://img-blog.csdnimg.cn/20210325151040350.png) 如果你不想手寫`Java`程式碼也沒關係,`Erupt`還提供了程式碼生成器,自定義`Java`類名和欄位名,可以生成程式碼,直接`copy`就行了。 ![](https://img-blog.csdnimg.cn/20210326133518536.png?) ![](https://img-blog.csdnimg.cn/20210326133740671.png?) 說到這我只介紹了`Erupt`一丟丟的基礎特性,主要是想讓小夥伴知道有這麼個敏捷利器。 不僅如此它還支援豐富的資料型別,內建了像定時`任務管理`、`多表聯合查詢`、`前後端分離部署`、`介面許可權`、`操作記錄`、`多資料來源`、`郵件系統`、`黑白名單`等等很多實用功能,都直接呼叫API就可以用。 ![](https://img-blog.csdnimg.cn/20210326134233294.png?) **說在後邊** `Erupt` 框架的優點是顯而易見的,快捷、高效、上手容易,對新手相當的友好,但在實際生產環境中我只是用它來做一些配置字典類的資料管理。 因為它的深度封裝雖然讓開發變的簡單高效,可對於業務相對複雜、高度定製的系統來說,`Erupt` 框架顯得力不從心,更關鍵的一點,它的社群並不算特別活躍,畢竟是個小眾框架。 不過,技術從來都是服務於業務的,如果你的業務與`Erupt`的氣質相匹配,別猶豫,