文章目录
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(); //失败
}
}
}