实战项目-02(讲师逻辑删除以及统一结果返回配置Swagger...)

讲师逻辑删除功能的实现

1. 配置逻辑删除插件

新建config包,在其中新建Educonfig

@Configuration
@MapperScan("com.sli.eduservice.mapper")//将主启动类上面的mapperscan转移到配置文件中
public class EduConfig {


    /**
     * 逻辑删除插件
     */
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }
}

2. 在实体类上面添加注解

@TableLogic
@ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
    private Boolean isDeleted;

3. EduTeacherController添加删除方法

@ApiOperation(value = "逻辑删除讲师")

    //2. 讲师的逻辑删除(1. 需要配置逻辑删除插件,2. 在实体类中加入tablelogic的注解 3. 编写方法)
    //delete提交浏览器无法进行测试,所以只能用swagger进行测试,需要整合swagger,进行测试(创建公共模块整合swagger便于所有的模块都可以使用)
    @DeleteMapping("{id}")//{id}的意思是需要通过路径进行传递id  eg:localhost:8001/edu/delete/1----->此处的1需要通过路径传递
    public R removeTeacher(@ApiParam(name = "id" , value = "讲师Id" , required = true) @PathVariable String id){//此处是得到路径中的id值,然后就可以用这个id操作
        boolean flag = teacherService.removeById(id);
        if (flag){
            return R.ok();
        }else {
            return R.error();
        }
    }

Swagger测试

引入了Swagger

Swagger

1.介绍

前后端分离开发模式中,api文档是最好的沟通方式。
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

  1. 及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)
  2. 规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)
  3. 一致性 (接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)
  4. 可测性 (直接在接口文档上进行测试,以方便理解业务)

2.配置Swagger

1. 创建common模块

在guli-parent下面创建模块common

1. 引入相关的依赖
点击查看代码
<?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">
    <parent>
        <artifactId>guli-parent</artifactId>
        <groupId>com.sli</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>common</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>servcie_base</module>
        <module>common_utils</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>provided </scope>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <scope>provided </scope>

        </dependency>

         <!--lombok用来简化实体类:需要安装lombok插件-->
         <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <scope>provided </scope>
          </dependency>

         <!--swagger-->
         <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-swagger2</artifactId>
           <scope>provided </scope>
           </dependency>
         <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-swagger-ui</artifactId>
           <scope>provided </scope>
           </dependency>

         <!-- redis -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>

         <!-- spring2.X集成redis所需common-pool2
            <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.0</version>
            </dependency>-->
         </dependencies>
</project>

2. 在common下面创建子模块service_base

3. 在service_base中,创建swagger配置类

在包com.sli.servicebase.config下面创建类SwaggerConfig

点击查看代码
package com.sli.servicebase;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author 1_f_
 * @create 2021-10-16 15:09
 */
@Configuration
@EnableSwagger2//swagger注解
public class SwaggerConfig {

    @Bean
     public Docket webApiConfig(){
         return new Docket(DocumentationType.SWAGGER_2)
         .groupName("webApi")
         .apiInfo(webApiInfo())
         .select()
         .paths(Predicates.not(PathSelectors.regex("/admin/.*")))
         .paths(Predicates.not(PathSelectors.regex("/error.*")))
         .build();

         }
     private ApiInfo webApiInfo(){
         return new ApiInfoBuilder()
         .title("网站-课程中心API文档")
         .description("本文档描述了课程中心微服务接口定义")
         .version("1.0")
         .contact(new Contact("sli", "https://www.cnblogs.com/sli1f/",
              "1743023xxx@qq.com"))
         .build();
      }
}

3. 在模块service中引入service-base

<dependency>
         <groupId>com.sli</groupId>
         <artifactId>servcie_base</artifactId>
         <version>0.0.1-SNAPSHOT</version>
</dependency>

因为在不同的工程中,spring的bean仓库也不再一起,所以需要在service_edu启动类上面添加注解,进行测试
@ComponentScan(basePackages = "com.sli")//包扫描规则,目的是扫描到common/service_base/中的swaggerconfig上面的configuration注解
测试访问: http://localhost:8001/swagger-ui.html

4. 定义接口的参数说明

定义在类上面:@Api
定义在方法上面:@ApiOperation
定义在参数上:@ApiParam

eg:

@ApiOperation(value = "逻辑删除讲师")

    //2. 讲师的逻辑删除(1. 需要配置逻辑删除插件,2. 在实体类中加入tablelogic的注解 3. 编写方法)
    //delete提交浏览器无法进行测试,所以只能用swagger进行测试,需要整合swagger,进行测试(创建公共模块整合swagger便于所有的模块都可以使用)
    @DeleteMapping("{id}")//{id}的意思是需要通过路径进行传递id  eg:localhost:8001/edu/delete/1----->此处的1需要通过路径传递
    public R removeTeacher(@ApiParam(name = "id" , value = "讲师Id" , required = true) @PathVariable String id){//此处是得到路径中的id值,然后就可以用这个id操作
        boolean flag = teacherService.removeById(id);
        if (flag){
            return R.ok();
        }else {
            return R.error();
        }
    }

image
image

统一返回数据格式

项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android,Web)对数据的操作更一致、轻松。
一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容
例如,我们的系统要求返回的基本数据格式如下:

{
	"success": true,
	"code": 20000,
	"message": "成功",
	"data": {
		"items": [
 	{
     	"id": "1",
	 "name": "xxx",
     	"intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"
    }
   ]
  }
 }

会要求我们返回的数据上面加上来表示成功或者失败

	"success": true,
	"code": 20000,
	"message": "成功",

因此我们定义统一的结果

{
	"success": 布尔, //响应是否成功
 	"code": 数字, //响应码
 	"message": 字符串, //返回消息
 	"data": HashMap //返回数据,放在键值对中
}

创建统一结果返回类

1. 在common模块下面创建子模块common_utils

并创建com.sli.commonutils

创建返回码接口ResultCode

package com.sli.commonutils;

/**
 * @author 1_f_
 * @create 2021-10-16 15:41
 */
public interface ResultCode {
    //操作成功
    public static Integer SUCCESS = 20000;
    //操作失败
    public static Integer ERROR = 20001;
}

创建返回结果类R

package com.sli.commonutils;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 1_f_
 * @create 2021-10-16 15:44
 */
@Data
//统一返回结果的类
public class R {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private Map<String , Object> data = new HashMap<String , Object>();

    //将构造方法私有
    private R(){}


    //成功静态方法
    public static R ok(){
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    //失败静态方法
    public static R error(){
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }


//this就是当前类的对象,这样做可以达到链式编程的效果
    public R success(Boolean success){
         this.setSuccess(success);
         return this;
         }

         public R message(String message){
         this.setMessage(message);
         return this;
         }

         public R code(Integer code){
         this.setCode(code);
         return this;
         }

         public R data(String key, Object value){
         this.data.put(key, value);
         return this;
         }

         public R data(Map<String, Object> map){
         this.setData(map);
         return this;
         }
}

统一返回结果使用

1. 在service中添加依赖

   <dependency>
            <groupId>com.sli</groupId>
            <artifactId>commom_utils</artifactId>
            <version>0.0.1-SNAPSHOT</version>
   </dependency>

修改controller的返回结果(将返回全部改为R类型)

eg:

@ApiOperation(value = "所有讲师列表")
    //1. 查询是讲师表中的所有数据
    //rest风格
    @GetMapping("/findAll")
    public R findAllTeacher(){
        //调用service中的方法实现查询的所有操作
        List<EduTeacher> list = teacherService.list(null);

        return R.ok().data("items",list);
    }
@ApiOperation(value = "逻辑删除讲师")

    //2. 讲师的逻辑删除(1. 需要配置逻辑删除插件,2. 在实体类中加入tablelogic的注解 3. 编写方法)
    //delete提交浏览器无法进行测试,所以只能用swagger进行测试,需要整合swagger,进行测试(创建公共模块整合swagger便于所有的模块都可以使用)
    @DeleteMapping("{id}")//{id}的意思是需要通过路径进行传递id  eg:localhost:8001/edu/delete/1----->此处的1需要通过路径传递
    public R removeTeacher(@ApiParam(name = "id" , value = "讲师Id" , required = true) @PathVariable String id){//此处是得到路径中的id值,然后就可以用这个id操作
        boolean flag = teacherService.removeById(id);
        if (flag){
            return R.ok();
        }else {
            return R.error();
        }
    }
posted @ 2021-10-17 17:04  1_f  阅读(80)  评论(0)    收藏  举报