【開源】Springboot API 一鍵生成器


Springboot API 一鍵生成器

寫這個項目,最大的想法就是:不做CRUD 程序猿

Springboot 在我們平時開發項目當中,是如此的常用。然而,比如平時我們寫的一些:

  • XX 管理系統
  • XX 管理后台
  • XX XXXX

諸如此類,無非是一張表格、帶有分頁、非常標准的一個增刪改查 頁面。很多時候再想,這樣重復的工作,能不能有一個東西替我們實現呢?把重復的代碼生成,而我關注有 業務邏輯 的地方就行。

程序猿小碼/bye-crud-generate

歡迎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

選擇一個將要生成表

選擇基礎入參字段

  • PageAO 分頁查詢所使用的字段。
  • Ins/UpdAO 添加、修改入參的基本字段。
  • 選擇字段的校驗規則。目前只是支持簡單的非空校驗。

image-20201009104241638

填寫基本生成信息

  • 包括自定義包路徑。
  • 填寫作者信息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 的基礎配置文件。 見上面

image-20201012114617369

使用Swagger 的好處實在是太多了。通過 bye-crud-generate 生成的CRUD 已經配置了詳細的文檔信息。

當然,你也可以直接在Swagger 測試你的API。

image-20201012115833219

參數具有詳細的信息,再也不用測試API 的時候,一邊復制字段,一遍使用 postman 等API 工具編寫 API json 參數了。

image-20201012115803311

如何自定義生成

最好的自定義的方式就是:修改源碼啦~ 我相信你可以的,按照自己的 代碼風格 , 改就完了

生成最靈活的方式在於:自定義

  • 自定義生成 類名名稱 例如 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

進度與后期安排

  1. 初始化搭建項目~
  2. 建立頁面交互~
  3. 實現接口生成邏輯~
  4. 生成 element-ui 基礎頁面~ 【TODO】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM