其他分享
首页 > 其他分享> > 分布式预约挂号平台(四) | 郑医宝のswagger测试

分布式预约挂号平台(四) | 郑医宝のswagger测试

作者:互联网

文章目录

1.引入swagger2依赖

swagger2:可以自动生成文档注释和测试接口的ui

由于swagger2不止是service_hosp模块需要使用,其他模块也需要使用,所以将其引入到common的pom.xml文件中

<!--引入swagger2,自动生成文档注释和测试接口的ui-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>
2.创建Swagger2Config配置类

在service_util的java目录下创建com.zhengyibao.yygh.common.config包

package com.zhengyibao.yygh.common.config;

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;

import java.util.function.Predicate;

/**
 * @author wenmiao
 * @create 2021-09-28 15:54
 * @explain  Swagger2的配置类
 */

@Configuration
@EnableSwagger2  //开启Swagger2操作的注解
public class Swagger2Config {

    @Bean  //创建对象
    public Docket webApiConfig() {

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")
                .apiInfo(webApiInfo())
                .select()
                .paths(Predicates.and(PathSelectors.regex("/api/.*")))   //只显示api路径下的页面
                .build();

    }

    @Bean
    public Docket adminApiConfig() {

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")     //分组的名字
                .apiInfo(adminApiInfo())   //相关api信息
                .select()
                .paths(Predicates.and(PathSelectors.regex("/admin/.*")))  //只显示admin路径下的页面(若包含admin就显示,不包含就不显示)
                .build();

    }

    private ApiInfo webApiInfo() {

        return new ApiInfoBuilder()
                .title("网站-API文档")
                .description("本文档描述了网站微服务接口定义")
                .version("1.0")
                .contact(new Contact("zhengyibao", "http://zhengyibao.com", "15978521338@163.com"))
                .build();
    }

    private ApiInfo adminApiInfo() {

        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")
                .description("本文档描述了后台管理系统微服务接口定义")
                .version("1.0")
                .contact(new Contact("zhengyibao", "http://zhengyibao.com", "15978521338@163.com"))
                .build();
    }
}
3.加载Swagger2Config到service_hosp模块

1.加载common/service_util中的到service模块的pom.xml中

<!--引入自定义model模块-->
<dependency>
    <groupId>com.zhengyibao</groupId>
    <artifactId>model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

2.在启动类上添加包扫描,因为两者包名不同,且都是以com.zhengyibao开头

package com.zhengyibao.yygh.hosp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

/**
 * @author wenmiao
 * @create 2021-09-26 22:52
 * @explain 启动类
 */

@SpringBootApplication
@ComponentScan(basePackages = "com.zhengyibao")  //设置扫描规则,使用配置类Swagger2Config进行测试
                                                 //1.加载common/service_util中的到service模块的pom.xml中
                                                 //2.而两者包名不同,但包名都是以com.zhengyibao开头,还需要额外在启动类上添加包扫描
public class ServiceHospApplication {
    public static void main(String[] args){
        SpringApplication.run(ServiceHospApplication.class, args);
    }
}
4.为表示层添加swagger提供的注解进行注释
@Api(tags = "医院设置管理")   //swagger的注解,中文提示信息
@ApiOperation(value = "获取所有医院设置信息")
@ApiOperation(value = "根据id逻辑删除医院设置信息")

请添加图片描述

5.测试
①.访问swagger

swagger有它自己的访问方式:浏览器访问http://localhost:8201/swagger-ui.html
http://[IP地址]:[服务端口号]/swagger-ui.html

中间出来一个错误导致访问swagger时报Whitelabel Error Page错误
控制台报Identify and stop the process that’s listening on port 8201 or configure this application to listen错误
错误原因:端口占有
解决1:可以在application.properties文件中修改服务端口号server.port=8201
解决2:使用netstat -ano查看自己服务端口号8021对应的pid,再使用taskkill /pid [pid] -f 杀掉端口

如果不加swagger提供的注解的页面

在这里插入图片描述

加了注解后

在这里插入图片描述

②.测试get访问查询所有医院设置信息

请添加图片描述

请添加图片描述

③.测试delete访问逻辑删除某个id的医院信息

请添加图片描述
请添加图片描述
请添加图片描述

6.对返回数据进行统一的规范

由于findAll和deleteById返回值不一样,不利于前端数据的显示,为了方便,所以对返回数据进行统一的规范

由于都需要返回统一结果,所以将其放到common_util子模块中
在common_util下的java目录下创建com.zhengyibao.yygh.common.result包

①.添加统一返回结果状态信息枚举类
package com.zhengyibao.yygh.common.result;

import lombok.Getter;

/**
 * @author wenmiao
 * @create 2021-09-28 17:57
 * @explain 统一返回结果状态信息枚举类
 */

@Getter //lombok提供
public enum ResultCodeEnum {

    //(状态码,状态信息)
    SUCCESS(200,"成功"),
    FAIL(201,"失败"),
    PARAM_ERROR(202,"参数不正确"),
    SERVICE_ERROR(203,"服务异常"),
    DATA_ERROR(204,"数据异常"),
    DATA_UPDATE_ERROR(205,"数据版本异常"),

    LOGIN_AUTH(208,"未登录"),
    PERMISSION(209,"没有权限"),

    CODE_ERROR(210,"验证码错误"),
    //LOGIN_MOBLE_ERROR(211,"账号不正确")
    LOGIN_DISABLED_ERROR(212,"该用户已被禁用"),
    REGISTER_MOBLE_ERROR(213,"手机号已被使用"),
    LOGIN_AURH(214,"需要登录"),
    LOGIN_ACL(215,"没有权限"),

    URL_ENCODE_ERROR(216,"URL编码失败"),
    ILLEGAL_CALLBACK_REQUEST_ERROR(217,"非法回调请求"),
    PETCH_ACCESSTOKEN_ERROR(218,"获取用户accessToken失败"),
    FETCH_USERINFO_ERROR(219,"获取用户信息失败"),

    PAY_RUN(220,"支付中"),
    CANCEL_ORDER_FAIL(225,"取消订单失败"),
    CANCEL_ORDER_NO(225,"不能取消预约"),

    HOSCODE_EXIST(230,"医院编号已经存在"),
    NUMBER_NO(240,"可预约号不足"),
    TIME_NO(250,"当前时间不可以预约"),

    SIGN_ERROR(300,"签名错误"),
    HOSPITAL_OPEN(310,"医院未开通,暂时不能访问"),
    HOSPITAL_LOCK(320,"医院被锁定,暂时不能访问"),
    ;   //需要加个分号

    private Integer code;
    private String message;

    private ResultCodeEnum(Integer code,String message){
        this.code=code;
        this.message=message;
    }
}
②.添加全局统一返回结果类
package com.zhengyibao.yygh.common.result;

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

/**
 * @author wenmiao
 * @create 2021-09-28 17:57
 * @explain 全局统一返回结果类,都采用static<T>,在使用时可以直接使用 类名.方法 直接用
 */

@Data
@ApiModel(value="全局统一返回结果")
public class Result<T> {

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

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

    @ApiModelProperty(value = "返回数据")
    private T data;

    public Result(){}

    protected static<T> Result<T> build(T data){
        Result<T> result=new Result<T>();
        if(data!=null)
            result.setData(data);
        return result;
    }

    public static<T> Result<T> build(T body,ResultCodeEnum resultCodeEnum){
        Result<T> result=build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    public static<T> Result<T> build(Integer code,String message){
        Result<T> result=build(null);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static<T> Result<T> ok(){return Result.ok(null);}

    //操作成功
    public static<T> Result<T> ok(T data){
        Result<T> result=build(data);
        return build(data,ResultCodeEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){return Result.fail(null);}

    //操作失败
    public static<T> Result<T> fail(T data){
        Result<T> result=build(data);
        return build(data,ResultCodeEnum.FAIL);
    }

//    public Result<T> code(Integer code){
//
//    }
}
③.引入Result

由于需要在service_hosp中使用Result全局统一返回结果类,所以在service的pom.xml文件中引入common_util模块

<!--引入自定义service_util模块,来实现swagger-->
<dependency>
    <groupId>com.zhengyibao</groupId>
    <artifactId>service_util</artifactId>
    <version>1.0</version>
</dependency>
④.修改controller
package com.zhengyibao.yygh.hosp.controller;

import com.zhengyibao.yygh.common.result.Result;
import com.zhengyibao.yygh.hosp.service.HospitalSetService;
import com.zhengyibao.yygh.model.hosp.HospitalSet;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author wenmiao
 * @create 2021-09-27 22:05
 * @explain
 */

@Api(tags = "医院设置管理")   //swagger的注解,中文提示信息
@RestController  //里面有两个主要注解,1.@Controller:让HospitalSetController交给spring管理 2.@ResponseBody:返回数据(以json格式返回)
@RequestMapping("/admin/hosp/hospitalSet")  //访问的路径 http://localhost:8201/admin/hosp/hospitalSet/findAll
public class HospitalSetController {

    //注入service
    @Autowired
    private HospitalSetService hospitalSetService;

    //1.查询医院设置表的所有信息
    @ApiOperation(value = "获取所有医院设置信息")   //swagger的注解,方法的中文提示信息
    @GetMapping("findAll")   //get方式提交(查询所有)
    //public List<HospitalSet> findAllHospitalSet(){
        //调用service里面的方法 mybatis-plus给增删改查在mapper中做了封装,在service中也做了封装
    //    List<HospitalSet> list=hospitalSetService.list();
    //    return list;  //@RestController注解返回数据,底层的jackson会将数据转换成json格式,所以list最后会被转换成json格式
    //}
    //返回统一结果的查询
    public Result findAllHospitalSet(){
        List<HospitalSet> list=hospitalSetService.list();
        return Result.ok(list);
    }

    //2.根据id逻辑删除医院设置信息
    @ApiOperation(value = "根据id逻辑删除医院设置信息")
    @DeleteMapping("{id}")  //delete方式提交,并通过路径传id值 但由于浏览器无法直接使用delete方式访问,所以要在comment模块整合swagger,在common父模块的pom.xml中引入swagger的依赖,在service_util中
    //public boolean removeHospitalSet(@PathVariable Long id){  //@PathVariable Long id 用来得到通过路径传入的值
    //    boolean flag=hospitalSetService.removeById(id);
    //    return flag;
    //}
    //返回统一结果的逻辑删除
    public Result removeHospitalSet(@PathVariable Long id){
        boolean flag=hospitalSetService.removeById(id);
        if(flag){
            return Result.ok();     //成功
        }else{
            return Result.fail();   //失败
        }
    }
}
⑤测试结果

在这里插入图片描述

标签:郑医宝,zhengyibao,挂号,Result,import,swagger,com,public
来源: https://blog.csdn.net/weixin_43908649/article/details/120533587