Springboot API 一鍵生成器
寫這個項目,最大的想法就是:不做CRUD 程序猿
Springboot 在我們平時開發項目當中,是如此的常用。然而,比如平時我們寫的一些:
- XX 管理系統
- XX 管理后台
- XX XXXX
諸如此類,無非是一張表格、帶有分頁、非常標准的一個增刪改查
頁面。很多時候再想,這樣重復的工作,能不能有一個東西替我們實現呢?把重復的代碼生成,而我關注有 業務邏輯 的地方就行。
歡迎Star,你的支持是我繼續的動力!
生成代碼示例
首先、你肯定會有一張表,當然,我們這里采用是MySQL。假設我們有一張后台的用戶表
前提是,你不能偷懶,要寫字段注釋。
CREATE TABLE `ums_admin` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '后台管理用戶',
`username` varchar(64) NOT NULL COMMENT '用戶名',
`password` varchar(64) NOT NULL COMMENT '密碼',
`icon` varchar(1024) NOT NULL COMMENT '頭像',
`lock` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0鎖定1正常使用',
`email` varchar(128) NOT NULL COMMENT '電子郵箱',
`nick_name` varchar(32) NOT NULL COMMENT '昵稱',
`note` varchar(64) NOT NULL COMMENT '備注信息',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`login_time` datetime DEFAULT NULL COMMENT '最后登錄時間',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '邏輯刪除標記',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
Controller
- Controller 包含基本的
CRUD
接口。 Restful
風格接口信息,更加容易理解接口含義。Swagger
生成基本的API 文檔信息,以及測試接口。- 校驗參數完整性!
@Api(tags = "ApiUmsAdminController",description = "后台用戶")
@RestController
@RequestMapping("/umsAdmin")
@Validated
public class ApiUmsAdminController {
@Autowired
private UmsAdminService umsAdminService;
/**
* <p>查詢所有后台用戶
* <p>author: mrc
*
* @return xyz.chaobei.common.api.CommonResult
* @since 2020-10-12 11:18:42
**/
@ApiOperation("查詢所有后台用戶")
@GetMapping("/")
public CommonResult getAll() {
List<UmsAdminModel> allList = umsAdminService.findAll();
return CommonResult.success(allList);
}
/**
* <p>默認分頁請求后台用戶
* <p>author: mrc
*
* @param pageAO 分頁查詢參數
* @since 2020-10-12 11:18:42
* @return xyz.chaobei.common.api.CommonResult
**/
@ApiOperation("默認分頁請求后台用戶")
@PostMapping("/page")
public CommonResult paging(@RequestBody @ApiParam("分頁查詢參數") UmsAdminPageAO pageAO) {
Page<UmsAdminModel> allList = umsAdminService.findPage(pageAO);
return CommonResult.success(allList);
}
/**
* <p>保存一個后台用戶
* <p>author: mrc
*
* @param params 保存字段
* @since 2020-10-12 11:18:42
* @return xyz.chaobei.common.api.CommonResult
**/
@ApiOperation("保存一個后台用戶")
@PostMapping("/")
public CommonResult save(@RequestBody @Valid @ApiParam("保存字段") UmsAdminSaveAO params) {
boolean isSave = umsAdminService.save(params);
return CommonResult.result(isSave);
}
/**
* <p>修改一個后台用戶
* <p>author: mrc
*
* @param id 被修改的ID
* @param params 被修改的字段
* @since 2020-10-12 11:18:42
* @return xyz.chaobei.common.api.CommonResult
**/
@ApiOperation("修改一個后台用戶")
@PutMapping("/{id}")
public CommonResult update(@PathVariable("id") @ApiParam("被修改的ID") Integer id, @Valid @RequestBody @ApiParam("被修改的字段") UmsAdminSaveAO params) {
boolean isUpdate = umsAdminService.updateById(params,id);
return CommonResult.result(isUpdate);
}
/**
* <p>刪除一個后台用戶
* <p>author: mrc
*
* @param id 被刪除的ID
* @since 2020-10-12 11:18:42
* @return xyz.chaobei.common.api.CommonResult
**/
@ApiOperation("刪除一個后台用戶")
@DeleteMapping("/{id}")
public CommonResult delete(@Valid @NotNull @PathVariable("id") @ApiParam("被刪除的ID") Integer id) {
boolean isDelete = umsAdminService.deleteById(id);
return CommonResult.result(isDelete);
}
}
SaveAO
SaveAO 一般就是前端
填寫表單入參的信息
,當然我們能直接使用DO
進行攜帶參數。那樣不安全。AO
將參數從Controller
攜帶后,通過
javax.validation.Valid
對字段進行校驗后、方可進行下一步。
SaveAO
將參數從Controller
傳遞到Service
處理邏輯Controller
入參的時候,檢驗SaveAO
所包含的參數。- @NotBlank
- @NotNull
- 略...
@ApiModelProperty
說明參數注釋信息
@Getter
@Setter
public class UmsAdminSaveAO {
/**
* 用戶名
*/
@NotBlank
@ApiModelProperty("用戶名")
private String username;
/**
* 密碼
*/
@NotBlank
@ApiModelProperty("密碼")
private String password;
/**
* 頭像
*/
@ApiModelProperty("頭像")
private String icon;
/**
* 0鎖定1正常使用
*/
@NotNull
@ApiModelProperty("0鎖定1正常使用")
private Integer lock;
/**
* 電子郵箱
*/
@NotBlank
@ApiModelProperty("電子郵箱")
private String email;
/**
* 昵稱
*/
@ApiModelProperty("昵稱")
private String nickName;
/**
* 備注信息
*/
@ApiModelProperty("備注信息")
private String note;
}
當然。這里的所有參數都是可以自定義的。你想要哪些,就生成哪些~
Service
Service
負責將Controller
傳遞的AO
復制到DO(Database Object)
。- 調用
Mapper
的方法進行持久化。 Service
返回一個 成功或者失敗的標志。- 邏輯異常,拋出一個異常信息【例如這個ID 找不到用戶。。。】,全局捕獲后,返回給前端進行提示。
@Service
public class UmsAdminServiceimpl implements UmsAdminService {
@Autowired
private UmsAdminMapper umsAdminMapper;
@Override
public List<UmsAdminModel> findAll() {
return umsAdminMapper.selectList(null);
}
@Override
public Page<UmsAdminModel> findPage(UmsAdminPageAO pageAO) {
Page page = new Page(pageAO.getCurrent(),pageAO.getSize());
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("`username`", pageAO.getUsername());
wrapper.eq("`lock`", pageAO.getLock());
wrapper.eq("`note`", pageAO.getNote());
umsAdminMapper.selectPage(page, wrapper);
return page;
}
@Override
public boolean save(UmsAdminSaveAO params) {
UmsAdminModel model = new UmsAdminModel();
BeanUtils.copyProperties(params,model);
/**
* 你的邏輯寫在這里
*/
int num = umsAdminMapper.insert(model);
return SqlHelper.retBool(num);
}
@Override
public boolean updateById(UmsAdminSaveAO params, Integer id) {
UmsAdminModel model = new UmsAdminModel();
BeanUtils.copyProperties(params,model);
/**
* 你的邏輯寫在這里
*/
model.setId(id);
int num = umsAdminMapper.updateById(model);
return SqlHelper.retBool(num);
}
@Override
public boolean deleteById(Integer id) {
/**
* 你的邏輯寫在這里
*/
int num = umsAdminMapper.deleteById(id);
return SqlHelper.retBool(num);
}
}
Mapper
- 繼承
Mybatis-Plus BaseMapper
獲得基礎CRUD 能力。
public interface UmsAdminMapper extends BaseMapper<UmsAdminModel> {
// 繼承mybatis-plus 獲得基礎crud
}
看完以上生成的代碼。是否對你現在的項目有幫助呢?如果有的話~請繼續看下去。
RestController 模式
概括一下,我們常用的一般模式按照圖解的話,其實就是這樣的。
bye-crud-generate
其實就是將這個流程的crud
操作進行生成出來。讓我們吧更多的時間放在邏輯上。增刪改查用它來生成就好了!
如何使用 bye-crud-generate
# git clone 拉取代碼到本地
git clone https://gitee.com/mrc1999/bye-crud-generate.git
# 修改配置文件信息、連接你的數據庫
vi config/application.yaml
# 使用maven插件啟動這個spring-boot 項目
mvn spring-boot:run
# 測試訪問地址
http://localhost:8080/index
選擇一個將要生成表
- 訪問 http://localhost:8080/index
- 選擇你的數據庫表格~
選擇基礎入參字段
PageAO
分頁查詢所使用的字段。Ins/UpdAO
添加、修改入參的基本字段。- 選擇字段的校驗規則。目前只是支持簡單的非空校驗。
填寫基本生成信息
- 包括自定義包路徑。
- 填寫
作者信息
、API 描述
信息、生成路徑
等。
一鍵生成,生成目錄如下,一個標准格式的 maven
項目。
test
└── src
└── main
├── java
│ └── xyz
│ └── chaobei
│ ├── controller
│ │ └── ApiUmsAdminController.java
│ ├── mapper
│ │ └── UmsAdminMapper.java
│ ├── model
│ │ └── UmsAdminModel.java
│ ├── pojo
│ │ ├── UmsAdminPageAO.java
│ │ └── UmsAdminSaveAO.java
│ └── service
│ ├── impl
│ │ └── UmsAdminServiceimpl.java
│ └── UmsAdminService.java
└── resources
└── mapper
└── UmsAdminMapping.xml
讓生成的API 跑起來
當然,這里只是作為測試,如果你已經有一個 Springboot項目 那么完全可以按需要添加。
在生成代碼路徑下:
添加maven 依賴
添加一個 pom.xml
maven 依賴文件
https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xyz.chaobei</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- springboot 2.3.1 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<mybatis.plus.version>3.3.2</mybatis.plus.version>
<swagger2.version>2.9.2</swagger2.version>
</properties>
<dependencies>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- crud-common -->
<dependency>
<groupId>xyz.chaobei</groupId>
<artifactId>bye-crud-common</artifactId>
<version>1.2</version>
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
添加配置文件
添加一個application.yaml
數據庫連接配置
https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/application.yaml
server:
port: 8090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.99.100:3306/mall-pro?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
添加 swagger 配置
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket createApiDocket() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
// 自定義API 基本信息
.apiInfo(this.defaultInfo())
// 開啟一個端點
.select()
// 開啟API 生成路徑
.apis(RequestHandlerSelectors.basePackage("xyz.chaobei.controller"))
// 選擇生成路徑
.paths(PathSelectors.any())
.build();
return docket;
}
public ApiInfo defaultInfo() {
return new ApiInfoBuilder()
.title("TEST")
.description("TEST bye-crud-generate")
.version("1.0")
.contact(new Contact("mrc", "https://blogs.chaobei.xyz", "maruichao52@gmail.com"))
.build();
}
}
添加一個啟動 main()
方法
https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/DefaultApplication.java
@SpringBootApplication
@MapperScan("xyz.chaobei.mapper")
public class DefaultApplication {
public static void main(String[] args) {
SpringApplication.run(DefaultApplication.class,args);
}
}
啟動你IDEA 里面的main()
方法,這個Springboot 項目已經完全跑起來嘍~
使用Swagger 測試API
Swagger: http://localhost:8080/swagger-ui.html
首先你需要添加一個
swagger
的基礎配置文件。 見上面
使用Swagger 的好處實在是太多了。通過 bye-crud-generate
生成的CRUD 已經配置了詳細的文檔信息。
當然,你也可以直接在Swagger
測試你的API。
參數具有詳細的信息,再也不用測試API 的時候,一邊復制字段
,一遍使用 postman
等API 工具編寫 API json
參數了。
如何自定義生成
最好的自定義的方式就是:修改源碼啦~ 我相信你可以的,按照自己的
代碼風格
, 改就完了
生成最靈活的方式在於:自定義。
- 自定義生成
類名名稱
例如Entity/Model
等符合你習慣的后綴前綴 - 自定義實體類
包名
- 自定義
數據庫數據類型
與JAVA 數據類型的映射關系
詳細內容見:config/application.yaml
bycrud:
## 模板對應的生成包路徑
packages:
entity: model
mapping: mapper
controller: controller
service: service
serviceImpl: service.impl
saveAO: pojo
pageAO: pojo
## 數據庫類型轉換為java 類型對應
type:
char: String
varchar: String
text: String
int: Integer
tinyint: Integer
date: Date
datetime: Date
timestamp: Date
bigint: Long
##自定義前綴
prefix:
controller: Api
##自定義后綴
suffix:
entity: Model
saveAO: SaveAO
pageAO: PageAO
進度與后期安排
- 初始化搭建項目~
- 建立頁面交互~
- 實現接口生成邏輯~
- 生成
element-ui
基礎頁面~ 【TODO】