前言

闲来无事,整一个 Java 项目快速开发脚手架。

正文

一、简介

Chewing 是一个简单的 Java 项目快速开发脚手架。既适合需要开发小型项目的小伙伴使用,也适合刚入门的新手用来学习一些常用的技术。

二、源码

源码地址:https://github.com/jingqueyimu/chewing。

三、核心技术

1、后端

SpringBoot:Web 应用框架。

Mybatis:持久层框架。

MySQL:关系型数据库。

Redis:缓存数据库。

RabbitMQ:消息队列中间件。

2、前端

Themeleaf:模板引擎。

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', '网站备案号', '备案号', '网站备案号', 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 list = userService.list(params);
// 表头
String[] headers = new String[] {"编号 ", "用户名", "姓名", "手机号", "邮箱", "注册方式", "注册时间", "上次登录时间", "是否VIP"};
os = response.getOutputStream();
// 导出
ExcelUtil.exportExcel(fileName, list, headers, os, new IExcelExportHandler() {
@Override
public List handle(User user) {
List 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 = userService.list(params);
System.out.println(user);
}
@Test
public void test2() {
JSONObject params = new JSONObject();
params.put("username_in", Arrays.asList("test"));
List user = userService.list(params);
System.out.println(user);
}

(12)…

六、演示图

1、前台

java 搭建脚手架 java开发脚手架_java 搭建脚手架

java 搭建脚手架 java开发脚手架_初始化_02

java 搭建脚手架 java开发脚手架_java 搭建脚手架_03

2、后台

java 搭建脚手架 java开发脚手架_配置文件_04

java 搭建脚手架 java开发脚手架_初始化_05

java 搭建脚手架 java开发脚手架_初始化_06

java 搭建脚手架 java开发脚手架_配置文件_07

java 搭建脚手架 java开发脚手架_java 搭建脚手架_08

java 搭建脚手架 java开发脚手架_java 开发快速脚手架_09

java 搭建脚手架 java开发脚手架_配置文件_10

结语

目前,Chewing 还只是提供了一些较为常用的功能(实在是肝不动了)。但是,后续会不断完善、新增功能。有时间的话,也会整一个微服务版的。

敬请期待~