再見前端!純 Java 擼個后臺管理系統(tǒng),這框架用起來賊爽!
一個管理系統(tǒng),往往需要后端+前端一起實現(xiàn)。單表CRUD操作往往都差不多,我們可以使用代碼生成器來實現(xiàn)。有時候我們的管理系統(tǒng)只需要一些簡單的CRUD頁面,有沒有什么框架能做到不寫前端代碼,純Java擼個管理系統(tǒng)呢?這里推薦一個全棧類框架Erupt,希望對大家有所幫助!
Erupt簡介
Erupt是一個低代碼全棧類框架,它使用Java 注解動態(tài)生成頁面以及增、刪、改、查、權限控制等后臺功能。零前端代碼、零CURD、自動建表,僅需一個類文件 + 簡潔的注解配置,快速開發(fā)企業(yè)級后臺管理系統(tǒng)。
基本使用
我們首先來波實戰(zhàn),以商品品牌管理為例,來熟悉下Erupt結合SpringBoot的基本使用!
SpringBoot整合Erupt
由于Erupt原生支持SpringBoot,所以整合還是很方便的!
為了方便管理Erupt版本,我們先在 pom.xml中添加Erupt的版本屬性;
<properties>
<erupt.version>1.6.13</erupt.version>
</properties>
之后在 pom.xml中添加Erupt的權限管理、數(shù)據(jù)安全、后臺WEB界面及MySQL驅動依賴;
<dependencies>
<!--用戶權限管理-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-upms</artifactId>
<version>${erupt.version}</version>
</dependency>
<!--接口數(shù)據(jù)安全-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-security</artifactId>
<version>${erupt.version}</version>
</dependency>
<!--后臺WEB界面-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-web</artifactId>
<version>${erupt.version}</version>
</dependency>
<!--Mysql數(shù)據(jù)庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
修改項目的 application.yml文件,添加數(shù)據(jù)源和JPA配置;
spring:
datasource:
url: jdbc:mysql://localhost:3306/erupt?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
jpa:
show-sql: true
generate-ddl: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
database: mysql
在項目的 resources目錄下創(chuàng)建如下配置文件(拷貝mall-tiny-erupt中的即可);

添加Erupt的Java配置類 EruptConfig,以啟動類MallTinyApplication的包為準,配置包掃碼路徑;
/**
* Created by macro on 2021/4/13.
*/
@Configuration
@ComponentScan({"xyz.erupt","com.macro.mall.tiny"})
@EntityScan({"xyz.erupt","com.macro.mall.tiny"})
@EruptScan({"xyz.erupt","com.macro.mall.tiny"})
public class EruptConfig {
}
在MySQL中創(chuàng)建 erupt數(shù)據(jù)庫,之后使用啟動類運行該項目,在erupt數(shù)據(jù)庫中會自動創(chuàng)建如下表;

項目啟動成功后,可以直接訪登錄頁,默認賬號密碼 erupt:erupt,項目訪問地址:http://localhost:8080/

登錄成功后會跳轉到項目主頁,我們可以發(fā)現(xiàn)沒有寫一行前端代碼,卻擁有了完整的權限管理和字典管理功能,是不是很棒!

實現(xiàn)單表 CRUD
使用核心注解
@Erupt和@EruptField定義一個實體類即可快速完成CRUD操作,讓我們以商品品牌管理為例試試吧。
不需要Controller、Service、Dao,僅僅一個實體類即可完成CRUD,首先我們創(chuàng)建實體類 PmsBrand;
@Erupt(name = "商品品牌")
@Table(name = "pms_brand")
@Entity
public class PmsBrand {
@Id
@GeneratedValue(generator = "generator")
@GenericGenerator(name = "generator", strategy = "native")
@Column(name = "id")
@EruptField
private Long id;
@EruptField(
views = @View(title = "品牌名稱"),
edit = @Edit(title = "品牌名稱",notNull=true,search = @Search(vague = true))
)
private String name;
@EruptField(
views = @View(title = "品牌首字母"),
edit = @Edit(title = "品牌首字母",notNull=true)
)
private String firstLetter;
@EruptField(
views = @View(title = "品牌LOGO"),
edit = @Edit(title = "品牌LOGO", type = EditType.ATTACHMENT,
attachmentType = @AttachmentType(type = AttachmentType.Type.IMAGE))
)
private String logo;
@EruptField(
views = @View(title = "品牌專區(qū)大圖"),
edit = @Edit(title = "品牌專區(qū)大圖", type = EditType.ATTACHMENT,
attachmentType = @AttachmentType(type = AttachmentType.Type.IMAGE))
)
private String bigPic;
@EruptField(
views = @View(title = "品牌故事"),
edit = @Edit(title = "品牌故事")
)
private String brandStory;
@EruptField(
views = @View(title = "排序"),
edit = @Edit(title = "排序")
)
private Integer sort;
@EruptField(
views = @View(title = "是否顯示"),
edit = @Edit(title = "是否顯示")
)
private Boolean showStatus;
@EruptField(
views = @View(title = "品牌制造商"),
edit = @Edit(title = "品牌制造商")
)
private Boolean factoryStatus;
private Integer productCount;
private Integer productCommentCount;
}
創(chuàng)建成功后重啟項目,在 菜單維護中添加一個叫商品的一級菜單;

然后再添加一個叫 品牌管理的二級菜單,注意選擇好菜單類型和上級菜單,輸入類型值為實體類的類名稱PmsBrand;

菜單添加成功后,刷新頁面,完整的品牌管理功能就出現(xiàn)了,來試下新增;

再看下查詢列表頁面,可以發(fā)現(xiàn)我們通過 @Edit注解,將實體類的字段轉換成了不同的輸入控件,比如文本框、圖片上傳框、單選框和數(shù)值框。

核心注解說明
幾個Erupt的核心注解,對照PmsBrand中的代碼學習即可!
@Erupt
name:功能名稱 desc:功能描述
@EruptField
views:表格展示配置 edit:編輯項配置 sort:前端展示順序,數(shù)字越小越靠前
@View
title:表格列名稱 desc:表格列描述 type:數(shù)據(jù)展示形式,默認為AUTO,可以根據(jù)屬性類型自行推斷 show:是否顯示
@Edit
title:表格列名稱 desc:表格列描述 type:編輯類型,默認為AUTO,可以根據(jù)屬性類型自行推斷 show:是否顯示 notNull:是否為必填項 search:是否支持搜索,search = @Search(vague = true)會啟用高級查詢策略
擴展模塊
當然Erupt的功能遠不止于此,還集成了很多實用的系統(tǒng)功能,包括定時任務、代碼生成器、系統(tǒng)監(jiān)控及NoSQL支持等。
定時任務erupt-job
通過定時任務功能,我們可以在代碼中定義好定時任務,然后在圖形化界面中操作任務,有點之前講過的PowerJob 的感覺!
首先我們需要在 pom.xml中添加erupt-job相關依賴;
<!--定時任務erupt-job-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-job</artifactId>
<version>${erupt.version}</version>
</dependency>
之后在 application.yml中添加郵件配置(否則啟動會報錯);
spring:
mail:
username: [email protected]
password: 123456
host: smtp.exmail.qq.com
port: 465
properties:
mail.smtp.ssl.auth: true
mail.smtp.ssl.enable: true
mail.smtp.ssl.required: true
之后創(chuàng)建一個定時任務實現(xiàn)類 JobHandlerImpl,在exec方法中添加定時任務執(zhí)行代碼;
/**
* Created by macro on 2021/4/13.
*/
@Service
@Slf4j
public class JobHandlerImpl implements EruptJobHandler {
@Override
public String exec(String code, String param) throws Exception {
log.info("定時任務已經(jīng)執(zhí)行,code:{},param:{}",code,param);
return "success";
}
}
之后重新啟動應用,在 任務維護中添加一個定時任務,每5秒執(zhí)行一次;

添加成功后,定時任務開始執(zhí)行,點擊任務列表中的 日志按鈕即可查看執(zhí)行日志。

代碼生成器erupt-generator
如果你覺得手寫實體類比較麻煩的話,還可以用用Erupt中的代碼生成器。
在 pom.xml中添加erupt-generator相關依賴;
<!-- 代碼生成器 erupt-generator -->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-generator</artifactId>
<version>${erupt.version}</version>
</dependency>
在 代碼生成菜單中我們可以像在Navicat中一樣,直接添加表和字段,從而生成實體類代碼;

我們在添加過程中可以發(fā)現(xiàn),Erupt支持的 編輯類型還挺多的,多達30種;

添加成功后,點擊列表項的 代碼預覽按鈕可以直接生成代碼,復制到自己項目下即可。

系統(tǒng)監(jiān)控erupt-monitor
通過使用Erupt的系統(tǒng)監(jiān)控功能,我們可以查看服務器的配置、Redis的緩存使用情況和在線用戶信息。
在 pom.xml中添加erupt-monitor相關依賴;
<!--服務器監(jiān)控 erupt-monitor-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-monitor</artifactId>
<version>${erupt.version}</version>
</dependency>
由于需要使用到Redis,所以要在 application.yml中添加Redis配置,并開啟Session的Redis存儲功能;
spring:
redis:
host: localhost # Redis服務器地址
database: 1 # Redis數(shù)據(jù)庫索引(默認為0)
port: 6379 # Redis服務器連接端口
password: 123456 # Redis服務器連接密碼(默認為空)
timeout: 3000ms # 連接超時時間
erupt:
# 開啟redis方式存儲session,默認false,開啟后需在配置文件中添加redis配置
redisSession: true
通過 服務監(jiān)控菜單,可以查看到服務器的CPU、內(nèi)存和Java虛擬機信息;

通過 緩存監(jiān)控菜單,可以查看到Redis信息、命令統(tǒng)計和Redis Key統(tǒng)計;

通過 在線用戶菜單,可以查看到在線用戶信息,還可以讓用戶強行退出!

NoSQL數(shù)據(jù)源erupt-mongodb
Erupt支持多種數(shù)據(jù)源,包括:MySQL、Oracle、PostgreSQL、H2,甚至支持 MongoDB。下面我們來體驗下MongoDB的支持功能。
在 pom.xml中添加erupt-mongodb相關依賴;
<!--NoSQL數(shù)據(jù)源 erupt-mongodb-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-mongodb</artifactId>
<version>${erupt.version}</version>
</dependency>
由于需要使用到MongoDB,所以要在 application.yml中添加MongoDB配置;
spring:
data:
mongodb:
host: localhost # mongodb的連接地址
port: 27017 # mongodb的連接端口號
database: erupt # mongodb的連接的數(shù)據(jù)庫
以一個簡化版的商品管理為例,還是熟悉的套路,添加一個 PmsProduct實體類;
/**
* Created by macro on 2021/4/13.
*/
@EruptDataProcessor(EruptMongodbImpl.MONGODB_PROCESS) //此注解表示使用MongoDB來存儲數(shù)據(jù)
@Document(collection = "product")
@Erupt(
name = "商品管理",
orderBy = "sort"
)
public class PmsProduct {
@Id
@EruptField
private String id;
@EruptField(
views = @View(title = "商品名稱", sortable = true),
edit = @Edit(title = "商品名稱", search = @Search(vague = true))
)
private String name;
@EruptField(
views = @View(title = "副標題", sortable = true),
edit = @Edit(title = "副標題", search = @Search(vague = true))
)
private String subTitle;
@EruptField(
views = @View(title = "價格", sortable = true),
edit = @Edit(title = "價格")
)
private Double price;
@EruptField(
views = @View(title = "商品圖片"),
edit = @Edit(title = "商品圖片", type = EditType.ATTACHMENT,
attachmentType = @AttachmentType(type = AttachmentType.Type.IMAGE))
)
private String pic;
@EruptField(
views = @View(title = "狀態(tài)", sortable = true),
edit = @Edit(title = "狀態(tài)",
boolType = @BoolType(trueText = "上架", falseText = "下架"),
search = @Search)
)
private Boolean publishStatus;
@EruptField(
views = @View(title = "創(chuàng)建時間", sortable = true),
edit = @Edit(title = "創(chuàng)建時間", search = @Search(vague = true))
)
private Date createTime;
}
與之前操作MySQL的區(qū)別是通過 @EruptDataProcessor注解指定用MongoDB來存儲數(shù)據(jù),@Table注解改為使用@Document注解;
@EruptDataProcessor(EruptMongodbImpl.MONGODB_PROCESS) //此注解表示使用MongoDB來存儲數(shù)據(jù)
@Document(collection = "product")
@Erupt(
name = "商品管理",
orderBy = "sort"
)
public class PmsProduct {
//...省略若干代碼
}
接下來就是在 菜單維護里面添加一個商品管理的菜單,刷新一下就可以看到該功能了。

在線接口開發(fā)erupt-magic-api
最后再介紹一個神奇的功能,直接通過UI界面來開發(fā)接口,無需定義Controller、Service、Dao、Mapper、XML、VO等Java對象!
在 pom.xml中添加erupt-magic-api相關依賴;
<!--在線接口開發(fā) erupt-magic-api-->
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>erupt-magic-api</artifactId>
<version>${erupt.version}</version>
</dependency>
在 application.yml中添加magic-api相關配置;
erupt:
# 設置具體哪些包被jackson消息轉化而不是gson
jacksonHttpMessageConvertersPackages:
- org.ssssssss
magic-api:
web: /magic/web
# 接口配置文件存放路徑
resource.location: D:/erupt/magic-script
我們可以直接通過 magic-api自己定義的腳本來實現(xiàn)查詢,比如下面這個腳本,用于查詢?nèi)科放疲?/section>
var sql = "select * from pms_brand";
return db.select(sql);
在 接口配置菜單中直接添加該腳本即可實現(xiàn)品牌列表查詢接口,無需額外編寫代碼;

在瀏覽器中直接訪問接口,發(fā)現(xiàn)已經(jīng)自動生成接口,是不是很棒!

總結
如果你的需求是搭建一個業(yè)務并不復雜的后臺管理系統(tǒng),Erupt是一個很好的選擇!它能讓你不寫前端代碼!但是如果你的需求方對界面有很多要求,而你的業(yè)務邏輯又比較復雜的話那就要自己實現(xiàn)前端了!
參考資料
官方文檔:https://www.yuque.com/erupts/erupt
項目源碼地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-erupt
關注 Stephen,一起學習,一起成長。
