前言
閒來無事,整一個 Java 專案快速開發腳手架。
正文
一、簡介
Chewing 是一個簡單的 Java 專案快速開發腳手架。既適合需要開發小型專案的小夥伴使用,也適合剛入門的新手用來學習一些常用的技術。
二、原始碼
原始碼地址:https://github.com/jingqueyimu/chewing。
三、核心技術
1、後端
- SpringBoot:Web 應用框架。
- MyBatis:持久層框架。
- MySQL:關係型資料庫。
- Redis:快取資料庫。
- RabbitMQ:訊息佇列中介軟體。
2、前端
- Thymeleaf:模板引擎。
- Bootstrap:UI 框架。
四、環境部署
1、準備工作
- JDK 1.8
- MySQL 5.7
- Maven 3.x
- Redis
- RabbitMQ
2、必要配置
- application.properties 配置檔案:資料庫、Redis、RabbitMQ、郵箱等配置。
- config/myconfig.properties 配置檔案:系統相關的自定義配置。
五、專案介紹
1、檔案結構
src/main/java
|— com.jingqueyimu
|— annotation // 註解
|— aspect // 切面
|— config // 配置
|— constant // 常量
|— context // 上下文
|— controller // 控制層
|— exception // 異常
|— factory // 工廠
|— filter // 過濾器
|— handler // 處理器
|— init // 初始化
|— interceptor // 攔截器
|— mapper // 持久層
|— model // 資料模型
|— mq // 訊息佇列
|— schedule // 排程
|— service // 服務層
|— util // 工具
MyAppcation.java // 應用啟動類
src/main/resources
|— config // 配置檔案
|— mapper // 對映檔案
|— static // 靜態檔案
|— templates // 頁面檔案
application.properties // 應用配置檔案
quartz.properties // 排程配置檔案
2、程式碼說明
(1)路由
- /api/xxx:需要使用者登入。
- /console/xxx:需要管理員登入,登入、登出等部分介面除外。
(2)介面規範
- 頁面請求:GET、URL 引數。
- 介面請求:POST、JSON 引數。
(3)資料庫初始化
- 初始化配置檔案:config/dbinit.json。
- 配置初始化標識及 SQL 語句。
初始化示例:
[
{
"initKey": "site_config_20210110",
"sqls": [
"INSERT INTO t_site_config (id, code, name, content, description, public_flag, gmt_create) VALUES(NULL, 'site_record_no', '網站備案號', '<a href=\"https://beian.miit.gov.cn\" class=\"ml-2\" target=\"_blank\">備案號</a>', '網站備案號', true, NOW());"
]
}
]
(4)檔案上傳下載
- 上傳單個檔案:/file/upload。
- 上傳多個檔案:/file/uploads。
- 下載檔案:/file/download。
(5)Excel 匯入匯出
- Excel 匯入匯出方法:ExcelUtil.importExcel()、ExcelUtil.exportExcel()。
- Excel 匯入匯出處理器介面:IExcelImportHandler、IExcelExportHandler。
匯入示例:
String msg = null;
try {
String[] keys = new String[] {"username", "realName", "mobile"};
msg = ExcelUtil.importExcel(file.getInputStream(), keys, new IExcelImportHandler() {
@Override
public void handle(JSONObject data) {
if (StringUtils.isBlank(data.getString("username"))) {
throw new RuntimeException("使用者名稱不能為空");
}
if (StringUtils.isBlank(data.getString("mobile"))) {
throw new RuntimeException("手機號不能為空");
}
// 業務處理
}
});
log.info(msg);
} catch (IOException e) {
e.printStackTrace();
}
匯出示例:
ServletOutputStream os = null;
try {
String fileName = "使用者列表";
...
// 使用者列表資料
List<User> list = userService.list(params);
// 表頭
String[] headers = new String[] {"編號 ", "使用者名稱", "姓名", "手機號", "郵箱", "註冊方式", "註冊時間", "上次登入時間", "是否VIP"};
os = response.getOutputStream();
// 匯出
ExcelUtil.exportExcel(fileName, list, headers, os, new IExcelExportHandler<User>() {
@Override
public List<Object> handle(User user) {
List<Object> rowDatas = new ArrayList<>();
rowDatas.add(user.getId());
rowDatas.add(user.getUsername());
rowDatas.add(user.getRealName());
rowDatas.add(user.getMobile());
rowDatas.add(user.getEmail());
rowDatas.add(RegisterType.getEnum(user.getRegisterType()).getValue());
rowDatas.add(DateUtil.format(user.getRegisterTime(), "yyyy-MM-dd HH:mm:ss"));
rowDatas.add(user.getLastLoginTime() == null ? "" : DateUtil.format(user.getLastLoginTime(), "yyyy-MM-dd HH:mm:ss"));
rowDatas.add(Boolean.TRUE.equals(user.getVipFlag()) ? "是" : "否");
return rowDatas;
}
});
} catch (IOException e) {
e.printStackTrace();
} finally {
...
}
(6)獲取字典
- 獲取單個字典:/common/dict。
- 獲取多個字典:/common/dicts。
(7)上下文資訊
- UserContext:使用者上下文資訊。
- AdminContext:管理員上下文資訊。
(8)排程
- 新增排程任務:繼承 BaseJob。
- 排程介面
- 執行排程任務:/console/schedule_job/run。
- 修改排程狀態:/console/schedule_job/update_status。
- 修改排程頻率:/console/schedule_job/update_cron。
(9)註解
- @Lock:分散式鎖。
- @Perm:標註需要管理員許可權的介面。
(10)配置檔案
- 由於個人習慣,專案中使用的是 properties 配置檔案,對於習慣使用 yml 配置檔案的,請手動修改。
- 如果要載入自定義的 yml 配置檔案,可以使用專案中提供的 YAML 屬性源工廠類:YamlPropertySourceFactory。
程式碼示例:
@Component
@ConfigurationProperties(prefix="test")
@PropertySource(value="classpath:config/test.yml", encoding="UTF-8", factory=YamlPropertySourceFactory.class)
public class TestYmlConfig {
...
}
(11)屬性名字尾匹配查詢條件
BaseService 中以 JSON 物件為引數的方法,可通過在屬性名後面新增字尾,來匹配查詢條件。
- xxx_begin:大於等於。
- xxx_end:小於等於。
- xxx_in:IN 查詢。
- xxx_like:模糊查詢。
- xxx_llike:左模糊查詢。
- xxx_rlike:右模糊查詢。
- 其他:等於。
- 屬性值為空:不參與查詢。
程式碼示例:
@Test
public void test() {
JSONObject params = new JSONObject();
params.put("username_like", "test");
List<User> user = userService.list(params);
System.out.println(user);
}
@Test
public void test2() {
JSONObject params = new JSONObject();
params.put("username_in", Arrays.asList("test"));
List<User> user = userService.list(params);
System.out.println(user);
}
(12)...
六、演示圖
1、前臺
2、後臺
結語
目前,Chewing 還只是提供了一些較為常用的功能(實在是肝不動了)。但是,後續會不斷完善、新增功能。有時間的話,也會整一個微服務版的。
敬請期待~
交流區
微信公眾號:驚卻一目
個人部落格:驚卻一目