Springboot API 一键生成器

写这个项目,最大的想法就是:不做CRUD 程序猿

Springboot 在我们平时开发项目当中,是如此的常用。然而,比如平时我们写的一些:

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

诸如此类,无非是一张表格、带有分页、非常标准的一个增删改查 页面。很多时候再想,这样重复的工作,能不能有一个东西替我们实现呢?把重复的代码生成,而我关注有 业务逻辑 的地方就行。

欢迎Star,你的支持是我继续的动力!

生成代码示例

首先、你肯定会有一张表,当然,我们这里采用是MySQL。假设我们有一张后台的用户表

前提是,你不能偷懒,要写字段注释。

  1. CREATE TABLE `ums_admin` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '后台管理用户',
  3. `username` varchar(64) NOT NULL COMMENT '用户名',
  4. `password` varchar(64) NOT NULL COMMENT '密码',
  5. `icon` varchar(1024) NOT NULL COMMENT '头像',
  6. `lock` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0锁定1正常使用',
  7. `email` varchar(128) NOT NULL COMMENT '电子邮箱',
  8. `nick_name` varchar(32) NOT NULL COMMENT '昵称',
  9. `note` varchar(64) NOT NULL COMMENT '备注信息',
  10. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  11. `login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  12. `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '逻辑删除标记',
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

Controller

  • Controller 包含基本的 CRUD 接口。
  • Restful 风格接口信息,更加容易理解接口含义。
  • Swagger 生成基本的API 文档信息,以及测试接口。
  • 校验参数完整性!
  1. @Api(tags = "ApiUmsAdminController",description = "后台用户")
  2. @RestController
  3. @RequestMapping("/umsAdmin")
  4. @Validated
  5. public class ApiUmsAdminController {
  6. @Autowired
  7. private UmsAdminService umsAdminService;
  8. /**
  9. * <p>查询所有后台用户
  10. * <p>author: mrc
  11. *
  12. * @return xyz.chaobei.common.api.CommonResult
  13. * @since 2020-10-12 11:18:42
  14. **/
  15. @ApiOperation("查询所有后台用户")
  16. @GetMapping("/")
  17. public CommonResult getAll() {
  18. List<UmsAdminModel> allList = umsAdminService.findAll();
  19. return CommonResult.success(allList);
  20. }
  21. /**
  22. * <p>默认分页请求后台用户
  23. * <p>author: mrc
  24. *
  25. * @param pageAO 分页查询参数
  26. * @since 2020-10-12 11:18:42
  27. * @return xyz.chaobei.common.api.CommonResult
  28. **/
  29. @ApiOperation("默认分页请求后台用户")
  30. @PostMapping("/page")
  31. public CommonResult paging(@RequestBody @ApiParam("分页查询参数") UmsAdminPageAO pageAO) {
  32. Page<UmsAdminModel> allList = umsAdminService.findPage(pageAO);
  33. return CommonResult.success(allList);
  34. }
  35. /**
  36. * <p>保存一个后台用户
  37. * <p>author: mrc
  38. *
  39. * @param params 保存字段
  40. * @since 2020-10-12 11:18:42
  41. * @return xyz.chaobei.common.api.CommonResult
  42. **/
  43. @ApiOperation("保存一个后台用户")
  44. @PostMapping("/")
  45. public CommonResult save(@RequestBody @Valid @ApiParam("保存字段") UmsAdminSaveAO params) {
  46. boolean isSave = umsAdminService.save(params);
  47. return CommonResult.result(isSave);
  48. }
  49. /**
  50. * <p>修改一个后台用户
  51. * <p>author: mrc
  52. *
  53. * @param id 被修改的ID
  54. * @param params 被修改的字段
  55. * @since 2020-10-12 11:18:42
  56. * @return xyz.chaobei.common.api.CommonResult
  57. **/
  58. @ApiOperation("修改一个后台用户")
  59. @PutMapping("/{id}")
  60. public CommonResult update(@PathVariable("id") @ApiParam("被修改的ID") Integer id, @Valid @RequestBody @ApiParam("被修改的字段") UmsAdminSaveAO params) {
  61. boolean isUpdate = umsAdminService.updateById(params,id);
  62. return CommonResult.result(isUpdate);
  63. }
  64. /**
  65. * <p>删除一个后台用户
  66. * <p>author: mrc
  67. *
  68. * @param id 被删除的ID
  69. * @since 2020-10-12 11:18:42
  70. * @return xyz.chaobei.common.api.CommonResult
  71. **/
  72. @ApiOperation("删除一个后台用户")
  73. @DeleteMapping("/{id}")
  74. public CommonResult delete(@Valid @NotNull @PathVariable("id") @ApiParam("被删除的ID") Integer id) {
  75. boolean isDelete = umsAdminService.deleteById(id);
  76. return CommonResult.result(isDelete);
  77. }
  78. }

SaveAO

SaveAO 一般就是前端 填写表单入参的信息 ,当然我们能直接使用 DO 进行携带参数。那样不安全。AO 将参数从 Controller

携带后,通过 javax.validation.Valid 对字段进行校验后、方可进行下一步。

  • SaveAO 将参数从 Controller 传递到 Service 处理逻辑
  • Controller 入参的时候,检验 SaveAO 所包含的参数。
    • @NotBlank
    • @NotNull
    • 略...
  • @ApiModelProperty 说明参数注释信息
  1. @Getter
  2. @Setter
  3. public class UmsAdminSaveAO {
  4. /**
  5. * 用户名
  6. */
  7. @NotBlank
  8. @ApiModelProperty("用户名")
  9. private String username;
  10. /**
  11. * 密码
  12. */
  13. @NotBlank
  14. @ApiModelProperty("密码")
  15. private String password;
  16. /**
  17. * 头像
  18. */
  19. @ApiModelProperty("头像")
  20. private String icon;
  21. /**
  22. * 0锁定1正常使用
  23. */
  24. @NotNull
  25. @ApiModelProperty("0锁定1正常使用")
  26. private Integer lock;
  27. /**
  28. * 电子邮箱
  29. */
  30. @NotBlank
  31. @ApiModelProperty("电子邮箱")
  32. private String email;
  33. /**
  34. * 昵称
  35. */
  36. @ApiModelProperty("昵称")
  37. private String nickName;
  38. /**
  39. * 备注信息
  40. */
  41. @ApiModelProperty("备注信息")
  42. private String note;
  43. }

当然。这里的所有参数都是可以自定义的。你想要哪些,就生成哪些~

Service

  • Service 负责将 Controller 传递的 AO 复制到 DO(Database Object)
  • 调用 Mapper 的方法进行持久化。
  • Service 返回一个 成功或者失败的标志。
  • 逻辑异常,抛出一个异常信息【例如这个ID 找不到用户。。。】,全局捕获后,返回给前端进行提示。
  1. @Service
  2. public class UmsAdminServiceimpl implements UmsAdminService {
  3. @Autowired
  4. private UmsAdminMapper umsAdminMapper;
  5. @Override
  6. public List<UmsAdminModel> findAll() {
  7. return umsAdminMapper.selectList(null);
  8. }
  9. @Override
  10. public Page<UmsAdminModel> findPage(UmsAdminPageAO pageAO) {
  11. Page page = new Page(pageAO.getCurrent(),pageAO.getSize());
  12. QueryWrapper wrapper = new QueryWrapper();
  13. wrapper.eq("`username`", pageAO.getUsername());
  14. wrapper.eq("`lock`", pageAO.getLock());
  15. wrapper.eq("`note`", pageAO.getNote());
  16. umsAdminMapper.selectPage(page, wrapper);
  17. return page;
  18. }
  19. @Override
  20. public boolean save(UmsAdminSaveAO params) {
  21. UmsAdminModel model = new UmsAdminModel();
  22. BeanUtils.copyProperties(params,model);
  23. /**
  24. * 你的逻辑写在这里
  25. */
  26. int num = umsAdminMapper.insert(model);
  27. return SqlHelper.retBool(num);
  28. }
  29. @Override
  30. public boolean updateById(UmsAdminSaveAO params, Integer id) {
  31. UmsAdminModel model = new UmsAdminModel();
  32. BeanUtils.copyProperties(params,model);
  33. /**
  34. * 你的逻辑写在这里
  35. */
  36. model.setId(id);
  37. int num = umsAdminMapper.updateById(model);
  38. return SqlHelper.retBool(num);
  39. }
  40. @Override
  41. public boolean deleteById(Integer id) {
  42. /**
  43. * 你的逻辑写在这里
  44. */
  45. int num = umsAdminMapper.deleteById(id);
  46. return SqlHelper.retBool(num);
  47. }
  48. }

Mapper

  • 继承 Mybatis-Plus BaseMapper 获得基础CRUD 能力。
  1. public interface UmsAdminMapper extends BaseMapper<UmsAdminModel> {
  2. // 继承mybatis-plus 获得基础crud
  3. }

看完以上生成的代码。是否对你现在的项目有帮助呢?如果有的话~请继续看下去。

RestController 模式

概括一下,我们常用的一般模式按照图解的话,其实就是这样的。bye-crud-generate 其实就是将这个流程的crud 操作进行生成出来。

让我们吧更多的时间放在逻辑上。增删改查用它来生成就好了!

如何使用 bye-crud-generate

  1. # git clone 拉取代码到本地
  2. git clone https://gitee.com/mrc1999/bye-crud-generate.git
  3. # 修改配置文件信息、连接你的数据库
  4. vi config/application.yaml
  5. # 使用maven插件启动这个spring-boot 项目
  6. mvn spring-boot:run
  7. # 测试访问地址
  8. http://localhost:8080/index

选择一个将要生成表

选择基础入参字段

  • PageAO 分页查询所使用的字段。
  • Ins/UpdAO 添加、修改入参的基本字段。
  • 选择字段的校验规则。目前只是支持简单的非空校验。

填写基本生成信息

  • 包括自定义包路径。
  • 填写作者信息API 描述信息、生成路径等。

一键生成,生成目录如下,一个标准格式的 maven 项目。

  1. test
  2. └── src
  3. └── main
  4. ├── java
  5. └── xyz
  6. └── chaobei
  7. ├── controller
  8. └── ApiUmsAdminController.java
  9. ├── mapper
  10. └── UmsAdminMapper.java
  11. ├── model
  12. └── UmsAdminModel.java
  13. ├── pojo
  14. ├── UmsAdminPageAO.java
  15. └── UmsAdminSaveAO.java
  16. └── service
  17. ├── impl
  18. └── UmsAdminServiceimpl.java
  19. └── UmsAdminService.java
  20. └── resources
  21. └── mapper
  22. └── UmsAdminMapping.xml

让生成的API 跑起来

当然,这里只是作为测试,如果你已经有一个 Springboot项目 那么完全可以按需要添加。

在生成代码路径下:

添加maven 依赖

添加一个 pom.xml maven 依赖文件

https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>xyz.chaobei</groupId>
  7. <artifactId>test</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <!-- springboot 2.3.1 -->
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.1.3.RELEASE</version>
  14. <relativePath/> <!-- lookup parent from repository -->
  15. </parent>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <mybatis.plus.version>3.3.2</mybatis.plus.version>
  19. <swagger2.version>2.9.2</swagger2.version>
  20. </properties>
  21. <dependencies>
  22. <!-- web -->
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <!-- mybatis-plus -->
  28. <dependency>
  29. <groupId>com.baomidou</groupId>
  30. <artifactId>mybatis-plus-boot-starter</artifactId>
  31. <version>${mybatis.plus.version}</version>
  32. </dependency>
  33. <!-- devtools -->
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-devtools</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <!-- mysql -->
  40. <dependency>
  41. <groupId>mysql</groupId>
  42. <artifactId>mysql-connector-java</artifactId>
  43. <scope>runtime</scope>
  44. </dependency>
  45. <!-- lombok -->
  46. <dependency>
  47. <groupId>org.projectlombok</groupId>
  48. <artifactId>lombok</artifactId>
  49. <scope>provided</scope>
  50. </dependency>
  51. <!-- crud-common -->
  52. <dependency>
  53. <groupId>xyz.chaobei</groupId>
  54. <artifactId>bye-crud-common</artifactId>
  55. <version>1.2</version>
  56. </dependency>
  57. <!-- swagger2 -->
  58. <dependency>
  59. <groupId>io.springfox</groupId>
  60. <artifactId>springfox-swagger2</artifactId>
  61. <version>${swagger2.version}</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>io.springfox</groupId>
  65. <artifactId>springfox-swagger-ui</artifactId>
  66. <version>${swagger2.version}</version>
  67. </dependency>
  68. </dependencies>
  69. <build>
  70. <plugins>
  71. <plugin>
  72. <groupId>org.springframework.boot</groupId>
  73. <artifactId>spring-boot-maven-plugin</artifactId>
  74. </plugin>
  75. </plugins>
  76. </build>
  77. </project>

添加配置文件

添加一个application.yaml 数据库连接配置

https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/application.yaml

  1. server:
  2. port: 8090
  3. spring:
  4. datasource:
  5. driver-class-name: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://192.168.99.100:3306/mall-pro?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
  7. username: root
  8. password: 123456

添加 swagger 配置

  1. @EnableSwagger2
  2. @Configuration
  3. public class SwaggerConfig {
  4. @Bean
  5. public Docket createApiDocket() {
  6. Docket docket = new Docket(DocumentationType.SWAGGER_2)
  7. // 自定义API 基本信息
  8. .apiInfo(this.defaultInfo())
  9. // 开启一个端点
  10. .select()
  11. // 开启API 生成路径
  12. .apis(RequestHandlerSelectors.basePackage("xyz.chaobei.controller"))
  13. // 选择生成路径
  14. .paths(PathSelectors.any())
  15. .build();
  16. return docket;
  17. }
  18. public ApiInfo defaultInfo() {
  19. return new ApiInfoBuilder()
  20. .title("TEST")
  21. .description("TEST bye-crud-generate")
  22. .version("1.0")
  23. .contact(new Contact("mrc", "https://blogs.chaobei.xyz", "maruichao52@gmail.com"))
  24. .build();
  25. }
  26. }

添加一个启动 main() 方法

https://gitee.com/mrc1999/bye-crud-generate/blob/master/file/DefaultApplication.java

  1. @SpringBootApplication
  2. @MapperScan("xyz.chaobei.mapper")
  3. public class DefaultApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(DefaultApplication.class,args);
  6. }
  7. }

启动你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

  1. bycrud:
  2. ## 模板对应的生成包路径
  3. packages:
  4. entity: model
  5. mapping: mapper
  6. controller: controller
  7. service: service
  8. serviceImpl: service.impl
  9. saveAO: pojo
  10. pageAO: pojo
  11. ## 数据库类型转换为java 类型对应
  12. type:
  13. char: String
  14. varchar: String
  15. text: String
  16. int: Integer
  17. tinyint: Integer
  18. date: Date
  19. datetime: Date
  20. timestamp: Date
  21. bigint: Long
  22. ##自定义前缀
  23. prefix:
  24. controller: Api
  25. ##自定义后缀
  26. suffix:
  27. entity: Model
  28. saveAO: SaveAO
  29. pageAO: PageAO

进度与后期安排

  1. 初始化搭建项目~
  2. 建立页面交互~
  3. 实现接口生成逻辑~
  4. 生成 element-ui 基础页面~ 【TODO】

【开源】Springboot API 一键生成器的更多相关文章

  1. 开源的api文档管理系统

    api文档 php 在项目中,需要协同开发,所以会写许多API文档给其他同事,以前都是写一个简单的TXT文本或Word文档,口口相传,这种方式比较老土了,所以,需要有个api管理系统专门来管理这些ap ...

  2. 开源的API集成测试工具 v0.1.2 - 增强体验

    Hitchhiker 是一款开源的 Restful Api 集成测试工具,你可以在轻松部署到本地,和你的team成员一起管理Api. 详细介绍请看: http://www.cnblogs.com/br ...

  3. Netflix正式开源其API网关Zuul 2

    5 月 21 日,Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2.Netflix 公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相当多的微服务组件(详见 ...

  4. [No0000198]swagger api一键导入postman

    在用postman进行接口测试时,对于参数较多的接口时第一次添加接口参数是比较繁琐的,可利用swagger一键导入api接口,事例如下: 1.获取swagger地址 2.打开postman,点击imp ...

  5. python实战===国内很简单实用的一些开源的api以及开源项目

    原创 2017年03月25日 15:40:59 标签: api / 开源项目 / app / 免费接口   声明 以下所有 API 均由产品公司自身提供,本人皆从网络获取.获取与共享之行为或有侵犯产品 ...

  6. 开源天气预报api整理

    高德天气:https://lbs.amap.com/api/webservice/guide/api/weatherinfo/? github上对开源api的整理:https://github.com ...

  7. Netflix正式开源其API网关Zuul 2--转

    微信公众号:聊聊架构 5 月 21 日,Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2.Netflix 公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相 ...

  8. 再见丑陋的 SwaggerUI,这款开源的API文档生成神器界面更炫酷,逼格更高!

    一般在使用 Spring Boot 开发前后端分离项目的时候,都会用到 Swagger.Swagger 是一个规范和完整的框架,用于生成.描述.调试和可视化 RESTful 风格的 Web API 服 ...

  9. 开源的API文档工具框架——Swagger简介

    初次接触Swagger是在2017年5月,当时公司正好要对整套系统架构进行重新设计,有同事推荐用这个技术框架来规范后台接口的API文档.当时因为架构重构,涉及改造的技术点太多,一时也就没太多精力,把S ...

随机推荐

  1. RGB打水印在YUV图片上

    一. 概述 将RGB图片打在YUV上需要注意的是, 字体之外应该透明, 否则背景也会被覆盖不好看,  所以RGB必须有透明度,  本测试格式为BMP ARGB8888(也即B是最低字节, A是最高字节 ...

  2. mybatis-spring-boot-starter 1.3.0 操作实体类的SpringBoot例子

    例程下载:https://files.cnblogs.com/files/xiandedanteng/gatling20200428-02.zip 需求:使用mybatis实现对hy_emp表的CRU ...

  3. docker 停止、启动、删除镜像指令

    容器 docker ps // 查看所有正在运行容器 docker stop containerId // containerId 是容器的ID docker ps -a // 查看所有容器 dock ...

  4. Serverless 初体验:快速开发与部署一个Hello World(Java版)

    昨天被阿里云的这个酷炫大屏吸引了! 我等85后开发者居然这么少!挺好奇到底什么鬼东西都是90.95后在玩?就深入看了一下. 这是一个关于Serverless的体验活动,Serverless在国内一直都 ...

  5. Oracle数据库之体系结构

    Oracle数据库管理系统中的3个重要的概念:实例(Instance).数据库(Database)和数据库服务器(Database Server). 实例:是后台进程和内存结构的集合,是Oracle数 ...

  6. Python3使用钉钉机器人推送消息(签名方式)

    import time import hmac import hashlib import base64 import urllib import json import requests impor ...

  7. JVM强引用、软引用、弱引用、虚引用、终结器引用垃圾回收行为总结

    JVM引用 我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中:如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象. -[既偏门又非常高频的面试题]强引用.软引用.弱引用.虚引 ...

  8. day52:django:ORM单表/多表操作

    目录 1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM 什么是ORM? ORM(object relational ma ...

  9. spring boot 源码之banner

    Banner 使用Spring Boot启动的jar包总是会显示一个Spring的图标.实际我们是可以自定义这个图标.Banner接口定义了打印banner的方法. void printBanner( ...

  10. Jenkins持续集成git、gitlab、sonarqube(7.0)、nexus,自动化部署实战,附安装包,严禁转载!!!

    导读 之前用的都是SVN,由于工作需要用到Git,求人不如求己,技多不压身,多学一项技能,未来就少求别人一次,系统的学一遍,自己搭建一整套环境,自动化部署(自动发版),代码质量检测等等(为啥不用doc ...