1、创建父工程管理所有的依赖

(1)、删除 src 目录,指定pom

(2)导入依赖

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.9.RELEASE</version><relativePath/></parent><!--依赖版本管理--><properties><spring-cloud.version>Hoxton.SR5</spring-cloud.version><cloud-alibaba.version>2.2.0.RELEASE</cloud-alibaba.version><mybatis-plus.version>3.3.1</mybatis-plus.version><druid.version>1.1.21</druid.version><kaptcha.version>2.3.2</kaptcha.version><fastjson.version>1.2.8</fastjson.version><commons-lang.version>2.6</commons-lang.version><commons-collections.version>3.2.2</commons-collections.version><commons-io.version>2.6</commons-io.version><httpclientutil.version>1.0.4</httpclientutil.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><!--依赖声明--><dependencyManagement><dependencies><!-- spring cloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><!--maven不支持多继承,使用 import 来依赖管理配置--><scope>import</scope></dependency><!-- alibaba 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!--mybatis-plus启动器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- Swagger --><dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId><version>1.9.1.RELEASE</version></dependency><!-- kaptcha 用于图形验证码 --><dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>${kaptcha.version}</version></dependency><!-- aliyun oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!--http请求工具--><dependency><groupId>com.arronlong</groupId><artifactId>httpclientutil</artifactId><version>${httpclientutil.version}</version></dependency><!-- 工具类依赖 --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>${commons-lang.version}</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>${commons-collections.version}</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons-io.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><!--springboot 打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources><resource><!--编译时,默认情况下不会将    mapper.xml文件编译进去,src/main/java 资源文件的路径,**/*.xml 需要编译打包的文件类型是xml文件,--><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources></build>

2、创建工具类(jhj-blog-utils)子工程

创建子工程的工具包,如果需要注入到Spring容器中,调用,则需要和其他微服务的总包保持一致

确保被扫描到

比如我的utils工程如下

子微服务如下

(1)、导入工具类的依赖

  <dependencies><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></dependency><!--Druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 配置处理器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--lombok setter,getter--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- swagger--><dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId></dependency><!-- aliyun --><!-- aliyun oss--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><!--http请求工具--><!--  服务远程调用的依赖--><dependency><groupId>com.arronlong</groupId><artifactId>httpclientutil</artifactId></dependency><!-- 工具类依赖 --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency></dependencies>

(2)、创建枚举类及统一接口进行管理工具类

package com.jhj.blog.utils.enums;import lombok.AllArgsConstructor;
import lombok.Getter;@Getter
@AllArgsConstructor //有参构造方法
public enum ResultEnum {SUCCESS(20000, "成功"),ERROR(999, "错误"),UNAUTHENTICATED(401, "请先通过身份认证"),AUTH_FAIL(1400, "认证失败"),// token异常TOKEN_PAST(1401, "身份过期,请求重新登录!"),TOKEN_ERROR(1402, "令牌错误"),HEADEA_ERROR(1403, "请求头错误"),AUTH_USERNAME_NONE(1405, "用户名不能为空"),AUTH_PASSWORD_NONE(1406, "密码不能为空"),MENU_NO(306, "没此权限,请联系管理员!");private Integer code;private String desc;
}
package com.jhj.blog.utils.base;import com.alibaba.fastjson.JSON;
import com.jhj.blog.utils.enums.ResultEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.Serializable;/*** 用于封装接口统一响应结果*/
@Data
@NoArgsConstructor // 无参构造方法
@AllArgsConstructor // 有参构造方法
public final class Result implements Serializable {private static final Logger logger = LoggerFactory.getLogger(Result.class);private static final long serialVersionUID = 1L;/*** 响应业务状态码*/private Integer code;/*** 响应信息*/private String message;/*** 响应中的数据*/private Object data;public static Result ok() {return new Result(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getDesc(), null);}public static Result ok(Object data) {return new Result(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getDesc(), data);}public static Result ok(String message, Object data) {return new Result(ResultEnum.SUCCESS.getCode(), message, data);}public static Result error(String message) {logger.debug("返回错误:code={}, message={}", ResultEnum.ERROR.getCode(), message);return new Result(ResultEnum.ERROR.getCode(), message, null);}public static Result build(int code, String message) {logger.debug("返回结果:code={}, message={}", code, message);return new Result(code, message, null);}public static Result build(ResultEnum resultEnum) {logger.debug("返回结果:code={}, message={}", resultEnum.getCode(), resultEnum.getDesc());return new Result(resultEnum.getCode(), resultEnum.getDesc(), null);}public String toJsonString() {return JSON.toJSONString(this);}}

(3)、创建mybatisPlus的page 分页方法的封装实体类

package com.jhj.blog.utils.base;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;/*** 请求参数基础类、带分页参数* @param <T>*/
@Accessors(chain = true)
//@Accessors(chain = true)在lomBook中级联操作,setter 方法有返回值 this ,
// 所以可以连续点Page<T>().setCurrent(this.current).setSize(this.size)
@Data
public class BaseRequest<T> implements Serializable {//    @ApiModelProperty(value = "页码", required = true) 注解是 Swagger 提供的,用于生成接口文档用的,@ApiModelProperty(value = "页码", required = true)private long current;@ApiModelProperty(value = "每页显示多少条", required = true)private long size;/*** 封装分页对象* @return*/@ApiModelProperty(hidden = true) // hidden = true 不在swagger接口文档中显示public IPage<T> getPage() {
//        Page<T> tPage = new Page<>(this.current, this.size);相当于这样吧return new Page<T>().setCurrent(this.current).setSize(this.size);}}

(4)在resourse下面创建 日志配置文件logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--梦学谷 www.mengxuegu.com --><configuration><!-- 彩色日志 --><!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /><conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /><conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><layout class="ch.qos.logback.classic.PatternLayout"><pattern>${CONSOLE_LOG_PATTERN}</pattern></layout></appender><!--nacos相关日志级别--><logger name="com.alibaba.nacos.client" level="ERROR" additivity="false"/><root level="info"><appender-ref ref="stdout" /></root>
</configuration>

3、创建接口子工程(jhj-blog-api)

(1)、添加依赖

第一个工具类的依赖,第二个feign的依赖,后期做接口统一调度

 <dependencies><dependency><groupId>jhj-blog</groupId><artifactId>jhj-blog-utils</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- feign 调用服务接口 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies>

(2)现在针对 mxg_category表做个测试

在jhj-blog-api子项目中添加该表的实体类

package com.jhj.blog.entities;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** @program: jhj-blog* @ClassName Category* @description:* @author:蒋皓洁* @create: 2021-12-07 16:55* @Version 1.0**/
@ApiModel(value = "Category对象", description = "类别表描述")
@Data // lombok 注解,生成 setter,getter等
@TableName("mxg_category") // mybatis-plus注解,对应表名
public class Category implements Serializable {private static final long serialVersionUID = 1L;/*** 主键,分布式id*/@ApiModelProperty(value = "主键")@TableId(value = "id", type = IdType.ASSIGN_ID)private String id;/*** 分类名称*/@ApiModelProperty(value = "分类名称")private String name;/*** 备注*/@ApiModelProperty(value = "备注")private String remark;/*** 状态(1:正常,0:禁用)*/@ApiModelProperty(value = "状态(1:正常,0:禁用)")private Integer status;/*** 排序*/@ApiModelProperty(value = "排序")private Integer sort;/*** 创建时间*/@ApiModelProperty(value = "创建时间")private Date createDate;/*** 更新时间*/@ApiModelProperty(value = "更新时间")private Date updateDate;/*** <p>* 标签表* </p>** @author jiangHaoJie* @since 2021-12-08*/}

4、创建子工程 (jhj-blog-article)做核心接口处理

(1)、添加pom依赖

添加了jhj-blog-api依赖 因为jhj-blog-api依赖中包含jhj-blog-utils依赖,所以不用引入

    <dependencies><dependency><groupId>jhj-blog</groupId><artifactId>jhj-blog-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--热部署 ctrl+f9--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

(2)、添加application.yml

swagger:title: 博客系统接口文档description: 博客系统-分类&标签&文章&广告管理接口exclude-path: /error # 剔除Springboot自定义的error请求server:port: 8001servlet:context-path: /article # 上下文件路径,请求前缀 ip:port/articlespring:application:name: article-server # 应用名# 数据源配置datasource:username: rootpassword: rooturl: jdbc:mysql://127.0.0.1:3306/mxg_blog_article?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true#mysql8版本以上驱动包指定新的驱动类driver-class-name: com.mysql.cj.jdbc.Driver#   数据源其他配置, 在 DruidConfig配置类中手动绑定initialSize: 8minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALmybatis-plus:type-aliases-package: com.jhj.blog.entities# xxxMapper.xml 路径mapper-locations: classpath*:com/jhj/blog/article/mapper/**/*.xml# 日志级别,会打印sql语句
logging:level:com.jhj.blog.article.mapper: debug

其中 下面这个表示配置swagger的统一配置项目的标题等,去除springboot中自带的error接口

swagger:title: 博客系统接口文档description: 博客系统-分类&标签&文章&广告管理接口exclude-path: /error # 剔除Springboot自定义的error请求

配置mybatisPlus的实体类路径,和mapper的扫描路径

mybatis-plus:type-aliases-package: com.jhj.blog.entities# xxxMapper.xml 路径mapper-locations: classpath*:com/jhj/blog/article/mapper/**/*.xml

配置日志打印SQL的mapper路径

logging:level:com.jhj.blog.article.mapper: debug

(3)配置mybatisPlus分页配置

@MapperScan("com.jhj.blog.article.mapper")//扫描指定的Map接口

@Configuration//标注配置类
@EnableTransactionManagement  //开启事务管理

package com.jhj.blog.article.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** @program: jhj-blog* @ClassName MybatisPlusConfig* @description:* @author:蒋皓洁* @create: 2021-12-08 15:00* @Version 1.0**/
@MapperScan("com.jhj.blog.article.mapper")//扫描Map接口
@Configuration//标注配置类
@EnableTransactionManagement  //开启事务管理
public class MybatisPlusConfig {/**** 分页插件* @return* 添加Bean注解,添加到容器中*/@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}}

(4) mxg_category表的mapper层

package com.jhj.blog.article.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jhj.blog.entities.Category;/*** <p>* 文章分类表 Mapper 接口* </p>* @author*/
public interface CategoryMapper extends BaseMapper<Category> {
}

(5)server层

package com.jhj.blog.article.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.jhj.blog.article.req.CategoryREQ;
import com.jhj.blog.entities.Category;
import com.jhj.blog.utils.base.Result;/*** 文章分类*/
public interface ICategoryService extends IService<Category> {//分页条件查询分类信息Result queryPage(CategoryREQ req);/*** 获取所有正常状态的分类 status==1* findAllNormal*/Result findAllNormal();
}
package com.jhj.blog.article.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jhj.blog.article.mapper.CategoryMapper;
import com.jhj.blog.article.req.CategoryREQ;
import com.jhj.blog.article.service.ICategoryService;
import com.jhj.blog.entities.Category;
import com.jhj.blog.utils.base.Result;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;import java.util.Date;/*** @program: jhj-blog* @ClassName CategoryServiceImpl* @description:* @author:蒋皓洁* @create: 2021-12-08 14:40* @Version 1.0* 继承ServiceImpl传入mapper,和实体entity**/
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements ICategoryService {@Overridepublic Result queryPage(CategoryREQ req) {QueryWrapper<Category> categoryQueryWrapper = new QueryWrapper<>();//分类名称if (StringUtils.isNotEmpty(req.getName())) {categoryQueryWrapper.like("name", req.getName());}//分类状态if (req.getStatus() != null) {categoryQueryWrapper.eq("status", req.getStatus());}
//        status 1正常 0 异常,降序排列(由高到底)orderByDesc,再对sort进行升序排列categoryQueryWrapper.orderByDesc("status").orderByAsc("sort");IPage<Category> categoryIPage = baseMapper.selectPage(req.getPage(), categoryQueryWrapper);return Result.ok(categoryIPage);}@Overridepublic Result findAllNormal() {QueryWrapper<Category> wrapper = new QueryWrapper<>();wrapper.eq("status", 1); // 1 正常,0 禁用return Result.ok(baseMapper.selectList(wrapper));}@Overridepublic boolean updateById(Category entity) {entity.setUpdateDate(new Date());
//     super调用父类的实现方法return super.updateById(entity);}
}

重写了父类的 updateById的方法,将修改时候,设置最新时间,再返回父类的super.updateById(entity);方法

   @Overridepublic boolean updateById(Category entity) {entity.setUpdateDate(new Date());
//     super调用父类的实现方法return super.updateById(entity);}

(6)controller层

package com.jhj.blog.article.controller;import com.jhj.blog.article.req.CategoryREQ;
import com.jhj.blog.article.service.ICategoryService;
import com.jhj.blog.entities.Category;
import com.jhj.blog.utils.base.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;/*** @program: jhj-blog* @ClassName CategoryController* @description:* @author:蒋皓洁* @create: 2021-12-08 15:05* @Version 1.0**/
@Api(value = "分类管理接口", description = "显示分类管理的增删改查")
@RestController//所有的方法都会返回Json字符串进行相应
@RequestMapping("/category")
public class CategoryController {@Autowiredprivate ICategoryService iCategoryService;@ApiOperation("根据分类名称及状态查询分类列表接口")@PostMapping("/search")public Result search(@RequestBody CategoryREQ req) {return iCategoryService.queryPage(req);}@ApiOperation("根据ID查询分类接口")@ApiImplicitParam(name = "id", value = "类别ID", required = true)@GetMapping("/{id}")public Result view(@PathVariable("id") String id) {Category byId = iCategoryService.getById(id);return Result.ok(byId);}@ApiOperation("更新分类信息")@PutMappingpublic Result update(@RequestBody Category category) {iCategoryService.updateById(category);return Result.ok();}@ApiOperation("新增分类信息接口")@PostMappingpublic Result save(@RequestBody Category category) {boolean save = iCategoryService.save(category);if (save) {return Result.ok();} else {return Result.error("更新失败");}}@ApiOperation("删除分类信息接口")@ApiImplicitParam(name = "id", value = "类别ID", required = true)@DeleteMapping("/{id}")public Result delete(@PathVariable("id") String id) {boolean b = iCategoryService.removeById(id);if (b) {return Result.ok();} else {return Result.error("删除失败");}}/*** 查询所有正常的类别* @return*/@ApiOperation("获取所有正常状态的分类接口")@GetMapping("/list")public Result list() {return iCategoryService.findAllNormal();}}

5、Swagger的使用

1、依赖

因为前面父Pom文件加入了下面这个依赖,所以在子工程(jhj-blog-article)不用添加其他依赖

        <dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId></dependency>

2、启动类添加  @EnableSwagger2Doc 注解

@SpringBootApplication
@EnableSwagger2Doc
public class ArticleApplication {public static void main(String[] args) {SpringApplication.run(ArticleApplication.class, args);}
}

3、请求实体类注解

@ApiModel:用在请求参数是对象上,描述该对象类的作用

@ApiModelProperty:用在请求参数是对象的属性上,描述对象属性的作用。 value:属性的描述 hidden:是否是查询条件属性, false:(默认值)在api文档显示,作为查询条件;true 隐藏,不是条件属性

@Data
@Accessors(chain = true)
//swagger的注解
@ApiModel(value = "CategoryREQ条件对象", description = "类别查询条件")
public class CategoryREQ extends BaseRequest<Category> {/*** 分类名称*/@ApiModelProperty(value = "分类名称")private String name;/*** 状态(1:正常,0:禁用)*/@ApiModelProperty(value = "状态")private Integer status;
}

4、接口注解

(1)接口类注解

@Api:用在 Controller 类上,描述该类的作用,注解参数: value="简要说明" description="详细描述该类的作用"

@Api(value = "分类管理接口", description = "显示分类管理的增删改查")
@RestController//所有的方法都会返回Json字符串进行相应
@RequestMapping("/category")
public class CategoryController {

(2)方法上注解

@ApiOperation:用在 Controller 请求方法上,描述方法的作用。

  @ApiOperation("根据分类名称及状态查询分类列表接口")@PostMapping("/search")public Result search(@RequestBody CategoryREQ req) {return iCategoryService.queryPage(req);}

@ApiImplicitParams:用在请求方法上,对多个请求参数增加描述。

@ApiImplicitParam:可单独使用,或在 @ApiImplicitParams 中使用,给方法的一个请求参数增加描述。

name:参数名

value:描述参数的作用

dataType:参数类型,参数类型,默认String,其它值 dataType="Integer"

defaultValue:参数默认值

required:参数是否必传(true/false)

paramTpye:指定参数放在哪些地方(header/query/path/body/form)

header :参数在request headers 里边提交@RequestHeader

query :直接跟参数完成自动映射赋值 @RequestParam

path :以路径变量的形式提交数据 @PathVariable

body :以流的形式提交 仅支持POST(不常用) form :以form表单的形式提交 仅支持POST (不常用)

    @ApiOperation("根据ID查询分类接口")@ApiImplicitParam(name = "id", value = "类别ID", required = true)@GetMapping("/{id}")public Result view(@PathVariable("id") String id) {Category byId = iCategoryService.getById(id);return Result.ok(byId);}
// 请求方法有多个请求参数 size, current
@ApiImplicitParams({@ApiImplicitParam(name="current", value="页码", required=true, paramType="path",
dataType="int"),@ApiImplicitParam(name="size", value="每页记录数", required=true, paramType="path",
dataType="int")
})
@ApiOperation("根据分类名称与状态查询分类列表接口")
@PostMapping("/search/{current}/{size}")
Result search(@RequestBody CategoryREQ req,@PathVariable int current, @PathVariable int size);

5、启动项目

访问地址:http://127.0.0.1:8001/article/swagger-ui.html

以新增接口为例

 @ApiOperation("新增分类信息接口")@PostMappingpublic Result save(@RequestBody Category category) {boolean save = iCategoryService.save(category);if (save) {return Result.ok();} else {return Result.error("更新失败");}}

查看传入对象字段属性

6、创建代码生成器子工程(jhj-blog-generator)

1、添加依赖,(1)、工具类依赖,(2)、mybatisPlus代码生成器依赖 (3)、模本引擎依赖

<dependencies><dependency><groupId>jhj-blog</groupId><artifactId>jhj-blog-utils</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- 代码生成器核心依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency></dependencies>

2、添加代码生成器

package com.jhj.generator;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.Scanner;// 执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {// 生成的代码放到哪个工程中private static String PROJECT_NAME = "jhj-blog-article";// 数据库名称private static String DATABASE_NAME = "mxg_blog_article";// 子包名private static String MODULE_NAME = "article";public static void main(String[] args) {// 代码生成器AutoGenerator mpg = new AutoGenerator();// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/"+ DATABASE_NAME +"?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("root");mpg.setDataSource(dsc);// 全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir") + "/";gc.setOutputDir(projectPath + PROJECT_NAME +"/src/main/java");gc.setIdType(IdType.ASSIGN_ID); // 分布式idgc.setAuthor("jiangHaoJie");gc.setFileOverride(true); //覆盖现有的,覆盖代码gc.setOpen(false); //是否生成后打开gc.setDateType(DateType.ONLY_DATE);gc.setSwagger2(true); //实体属性 Swagger2 注解mpg.setGlobalConfig(gc);// 包配置PackageConfig pc = new PackageConfig();pc.setParent("com.jhj.blog"); //父包名pc.setController(MODULE_NAME+".controller"); // com.mengxuegu.blog.aritcle.controllerpc.setService(MODULE_NAME+".service");pc.setServiceImpl(MODULE_NAME+".service.impl");pc.setMapper(MODULE_NAME+".mapper");pc.setXml(MODULE_NAME+".mapper.xml");pc.setEntity("entities");//实体类存储包名 com.mengxuegu.blog.entitiesmpg.setPackageInfo(pc);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);strategy.setEntityLombokModel(true); //使用lombokstrategy.setEntitySerialVersionUID(true);// 实体类的实现接口Serializablestrategy.setRestControllerStyle(true); // @RestControllerstrategy.setInclude(scanner("表名,多个英文逗号分割").split(","));strategy.setControllerMappingHyphenStyle(true);strategy.setTablePrefix("mxg_"); // 去掉表前缀mpg.setStrategy(strategy);mpg.setTemplateEngine(new FreemarkerTemplateEngine());mpg.execute();}/*** <p>* 读取控制台内容* </p>*/public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("请输入" + tip + ":");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotBlank(ipt)) {return ipt;}}throw new MybatisPlusException("请输入正确的" + tip + "!");}}

3、点击运行

搭建基础后台框架及整合Swagger2及整合mybatisPlus代码器相关推荐

  1. Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能  之前一直用的是自 ...

  2. 零基础搭建微服务框架/Spring Boot + Dubbo + Docker + Jenkins

    本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 项目完整源码下载 https://github ...

  3. IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/中后台/体验管理等)之详细攻略

    IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/Node/IDE/中后台/体验管理/ ...

  4. 使用dwz框架搭建网站后台

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载dwz源码:https://github.com/dwzteam/dwz_jui,我们下载一个zip压缩包 2.解要我 ...

  5. 主流大数据技术全体系参数与搭建与后台代码工程框架的编写(百分之70)

    之前查阅源码啊,性能测试啊调优啊..基本告一段落,项目也接近尾声,那么整理下spark所有配置参数与优化策略,方便以后开发与配置: Spark安装配置与代码框架 spark-default.conf ...

  6. Django的学习需要掌握的一些基础和初步搭建自己的框架

    一.Django的学习需要掌握的一些基础 第一个需要注意的点:客户端发送过来的数据结构组成: 第二个需要注意的点:动态网页和静态网页 静态网页:用户发送请求,服务端找到对应的静态文件返回给浏览器,静态 ...

  7. 从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析...

    http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...

  8. java职业发展路线图_从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析...

    http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...

  9. 基于蘑菇博客建设个人SNS网站(二)--后台框架搭建

    在github/gitee上面有很多别人写好的开源框架,选择适合的可以很大的减少开发人员的工作,我的网站用的是gitee上面的明星项目mogu博客,这里是项目地址:https://gitee.com/ ...

最新文章

  1. struts2原理(转)
  2. Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件
  3. c# 扩展方法奇思妙用高级篇五:ToString(string format) 扩展
  4. c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数
  5. Java工作笔记-Java函数参传值传引用问题
  6. 使用Turi Create训练核心ML模型以对犬种进行分类
  7. 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
  8. 第3章 动态规划 矩阵连乘问题
  9. wpf之代码给grid添加内容
  10. 使用submit异步提交,阻止表单默认提交
  11. python通过文件路径读取图片
  12. Excel(XLS,XLSX)和CSV相互转换 - C#简单实现方案
  13. vm14远程连接服务器,VisualVM 远程连接服务器
  14. 51循迹小车舵机c语言程序,红外循迹小车c程序(舵机小车).doc
  15. 对灰色按钮克星的屏蔽
  16. MySQL int(M)数值类型中M值的意义
  17. 2017Final 圆周率山
  18. ps4绝地求生服务器维护,绝地求生官方更新公告 无停机维护公告
  19. Kali linux安装Nvidia官方显卡驱动的心灵路程
  20. 高通骁龙600系列处理器

热门文章

  1. VsCode 何时能一统江湖?
  2. win7下 VMware 9.0安装 MAC OS 10.8
  3. 这才是实习生写的代码,你学废了吗
  4. Linux——磁盘Part 4:磁盘阵列(raid0、raid1、raid5、raid6、raid1+0)
  5. 机器学习第四课:SVM前置知识点(凸优化问题)
  6. python评价指标_详解分类评价指标和回归评价指标以及Python代码实现
  7. 安装了迅雷却无法下载的解决方法
  8. 赵小楼《天道》《遥远的救世主》解读(89)敬畏之心下的真理
  9. 用Python制作高逼格数学动画manim
  10. Docker入门详解