1. 程式人生 > >【開源】Springboot API 一鍵生成器

【開源】Springboot API 一鍵生成器

## Springboot API 一鍵生成器 寫這個專案,最大的想法就是:**不做CRUD 程式猿** Springboot 在我們平時開發專案當中,是如此的常用。然而,比如平時我們寫的一些: - XX 管理系統 - XX 管理後臺 - XX XXXX 諸如此類,無非是一張表格、帶有分頁、非常標準的一個`增刪改查` 頁面。很多時候再想,這樣重複的工作,能不能有一個東西替我們實現呢?把重複的程式碼生成,而我關注有 **業務邏輯** 的地方就行。 [![程式猿小碼/bye-crud-generate](https://gitee.com/mrc1999/bye-crud-generate/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/mrc1999/bye-crud-generate) **歡迎Star,你的支援是我繼續的動力!** [個人部落格,期待您的訪問](https://blogs.chaobei.xyz/) ### 生成程式碼示例 首先、你肯定會有一張表,當然,我們這裡採用是MySQL。假設我們有一張後臺的`使用者表` > 前提是,你不能偷懶,要寫欄位註釋。 ```sql 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 文件資訊,以及測試介面。 - 校驗引數完整性! ```java @Api(tags = "ApiUmsAdminController",description = "後臺使用者") @RestController @RequestMapping("/umsAdmin") @Validated public class ApiUmsAdminController { @Autowired private UmsAdminService umsAdminService; /** *

查詢所有後臺使用者 *

author: mrc * * @return xyz.chaobei.common.api.CommonResult * @since 2020-10-12 11:18:42 **/ @ApiOperation("查詢所有後臺使用者") @GetMapping("/") public CommonResult getAll() { List allList = umsAdminService.findAll(); return CommonResult.success(allList); } /** *

預設分頁請求後臺使用者 *

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 allList = umsAdminService.findPage(pageAO); return CommonResult.success(allList); } /** *

儲存一個後臺使用者 *

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); } /** *

修改一個後臺使用者 *

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); } /** *

刪除一個後臺使用者 *

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` 說明引數註釋資訊 ```java @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 找不到使用者。。。】,全域性捕獲後,返回給前端進行提示。 ```java @Service public class UmsAdminServiceimpl implements UmsAdminService { @Autowired private UmsAdminMapper umsAdminMapper; @Override public List findAll() { return umsAdminMapper.selectList(null); } @Override public Page 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 能力。 ```java public interface UmsAdminMapper extends BaseMapper { // 繼承mybatis-plus 獲得基礎crud } ``` 看完以上生成的程式碼。是否對你現在的專案有幫助呢?如果有的話~請繼續看下去。 ### RestController 模式 > 概括一下,我們常用的一般模式按照圖解的話,其實就是這樣的。`bye-crud-generate` 其實就是將這個流程的`crud` 操作進行生成出來。 > > 讓我們吧更多的時間放在邏輯上。增刪改查用它來生成就好了! ![](https://file.chaobei.xyz/bye-crud-drive.png_imagess) ### 如何使用 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](http://localhost:8080/index) - 選擇你的資料庫表格~ ![](https://file.chaobei.xyz/20201001131116.png_imagess) #### 選擇基礎入參欄位 - `PageAO` 分頁查詢所使用的欄位。 - `Ins/UpdAO` 新增、修改入參的基本欄位。 - 選擇欄位的校驗規則。目前只是支援簡單的非空校驗。 ![image-20201009104241638](https://file.chaobei.xyz/image-20201009104241638.png_imagess) #### 填寫基本生成資訊 - 包括自定義包路徑。 - 填寫`作者資訊`、`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](https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/pom.xml) ```xml

4.0.0 xyz.chaobei test 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE 1.8 3.3.2 2.9.2 org.springframework.boot spring-boot-starter-web
com.baomidou mybatis-plus-boot-starter ${mybatis.plus.version} org.springframework.boot spring-boot-devtools true mysql mysql-connector-java runtime
org.projectlombok lombok provided xyz.chaobei bye-crud-common 1.2 io.springfox springfox-swagger2 ${swagger2.version} io.springfox springfox-swagger-ui ${swagger2.version}
org.springframework.boot spring-boot-maven-plugin ``` #### 新增配置檔案 新增一個`application.yaml` 資料庫連線配置 [https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/application.yaml](https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/application.yaml) ```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 配置 ```java @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", "[email protected]")) .build(); } } ``` 新增一個啟動 `main()` 方法 [https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/DefaultApplication.java](https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/DefaultApplication.java) ```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](http://localhost:8090/swagger-ui.html) > 首先你需要新增一個 `swagger` 的基礎配置檔案。 見上面 ![image-20201012114617369](https://file.chaobei.xyz/image-20201012114617369.png_imagess) 使用Swagger 的好處實在是太多了。通過 `bye-crud-generate` 生成的CRUD 已經配置了詳細的文件資訊。 當然,你也可以直接在`Swagger` 測試你的API。 ![image-20201012115833219](https://file.chaobei.xyz/image-20201012115833219.png_imagess) 引數具有詳細的資訊,再也不用測試API 的時候,一邊複製`欄位`,一遍使用 `postman` 等API 工具編寫 API `json` 引數了。 ![image-20201012115803311](https://file.chaobei.xyz/image-20201012115803311.png_imagess) ### 如何自定義生成 > 最好的自定義的方式就是:修改原始碼啦~ 我相信你可以的,按照自己的 `程式碼風格` , **改就完了** 生成最靈活的方式在於:**自定義**。 - 自定義生成 `類名名稱` 例如 `Entity/Model` 等符合你習慣的字尾字首 - 自定義實體類 `包名` - 自定義 `資料庫資料型別` 與JAVA 資料型別的 `對映關係` 詳細內容見:`config/application.yaml` ```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 ``` ### 進度與後期安排 1. 初始化搭建專案~ 2. 建立頁面互動~ 3. 實現介面生成邏輯~ 4. 生成 `element-ui` 基礎頁面~ 【TODO】