update 接口文档 支持分组配置

This commit is contained in:
疯狂的狮子li 2021-09-26 17:02:28 +08:00
parent bcac70b2ab
commit 3434610349
3 changed files with 121 additions and 79 deletions

View File

@ -243,6 +243,11 @@ swagger:
name: Lion Li name: Lion Li
email: crazylionli@163.com email: crazylionli@163.com
url: https://gitee.com/JavaLionLi/RuoYi-Vue-Plus url: https://gitee.com/JavaLionLi/RuoYi-Vue-Plus
groups:
- name: 演示案例
basePackage: com.ruoyi.demo
- name: 系统模块
basePackage: com.ruoyi.admin
# 防止XSS攻击 # 防止XSS攻击
xss: xss:

View File

@ -1,11 +1,12 @@
package com.ruoyi.framework.config; package com.ruoyi.framework.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.ruoyi.common.properties.TokenProperties;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.config.properties.SwaggerProperties; import com.ruoyi.framework.config.properties.SwaggerProperties;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In; import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
@ -15,6 +16,7 @@ import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import javax.annotation.PostConstruct;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -27,82 +29,92 @@ import java.util.List;
@EnableKnife4j @EnableKnife4j
public class SwaggerConfig { public class SwaggerConfig {
@Autowired @Autowired
private SwaggerProperties swaggerProperties; private SwaggerProperties swaggerProperties;
/** @Autowired
* 创建API private TokenProperties tokenProperties;
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.enable(swaggerProperties.getEnabled())
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
/* 设置安全模式swagger可以设置访问token */
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.pathMapping(swaggerProperties.getPathMapping());
}
/** /**
* 安全模式这里指定token通过Authorization头请求头传递 * 创建API
*/ */
private List<SecurityScheme> securitySchemes() { @PostConstruct
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); public void createRestApi() {
apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) {
return apiKeyList; String basePackage = group.getBasePackage();
} Docket docket = new Docket(DocumentationType.OAS_30)
.enable(swaggerProperties.getEnabled())
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api用这种方式更灵活
//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
.apis(RequestHandlerSelectors.basePackage(basePackage))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.groupName(group.getName())
// 设置安全模式swagger可以设置访问token
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.pathMapping(swaggerProperties.getPathMapping());
String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket";
SpringUtils.registerBean(beanName, docket);
}
}
/** /**
* 安全上下文 * 安全模式这里指定token通过Authorization头请求头传递
*/ */
private List<SecurityContext> securityContexts() { private List<SecurityScheme> securitySchemes() {
List<SecurityContext> securityContexts = new ArrayList<>(); List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
securityContexts.add( String header = tokenProperties.getHeader();
SecurityContext.builder() apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue()));
.securityReferences(defaultAuth()) return apiKeyList;
.operationSelector(o -> o.requestMappingPattern().matches("/.*")) }
.build());
return securityContexts;
}
/** /**
* 默认的安全上引用 * 安全上下文
*/ */
private List<SecurityReference> defaultAuth() { private List<SecurityContext> securityContexts() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); List<SecurityContext> securityContexts = new ArrayList<>();
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; securityContexts.add(
authorizationScopes[0] = authorizationScope; SecurityContext.builder()
List<SecurityReference> securityReferences = new ArrayList<>(); .securityReferences(defaultAuth())
securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
return securityReferences; .build());
} return securityContexts;
}
/** /**
* 添加摘要信息 * 默认的安全上引用
*/ */
private ApiInfo apiInfo() { private List<SecurityReference> defaultAuth() {
// 用ApiInfoBuilder进行定制 AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
SwaggerProperties.Contact contact = swaggerProperties.getContact(); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
return new ApiInfoBuilder() authorizationScopes[0] = authorizationScope;
// 设置标题 List<SecurityReference> securityReferences = new ArrayList<>();
.title(swaggerProperties.getTitle()) securityReferences.add(new SecurityReference(tokenProperties.getHeader(), authorizationScopes));
// 描述 return securityReferences;
.description(swaggerProperties.getDescription()) }
// 作者信息
.contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) /**
// 版本 * 添加摘要信息
.version(swaggerProperties.getVersion()) */
.build(); private ApiInfo apiInfo() {
} // 用ApiInfoBuilder进行定制
SwaggerProperties.Contact contact = swaggerProperties.getContact();
return new ApiInfoBuilder()
// 设置标题
.title(swaggerProperties.getTitle())
// 描述
.description(swaggerProperties.getDescription())
// 作者信息
.contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail()))
// 版本
.version(swaggerProperties.getVersion())
.build();
}
} }

View File

@ -5,6 +5,8 @@ import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
/** /**
* swagger 配置属性 * swagger 配置属性
* *
@ -41,23 +43,46 @@ public class SwaggerProperties {
*/ */
private Contact contact; private Contact contact;
/**
* 组配置
*/
private List<Groups> groups;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public static class Contact{ public static class Contact {
/** /**
* 联系人 * 联系人
**/ */
private String name; private String name;
/** /**
* 联系人url * 联系人url
**/ */
private String url; private String url;
/** /**
* 联系人email * 联系人email
**/ */
private String email; private String email;
} }
@Data
@NoArgsConstructor
public static class Groups {
/**
* 组名
*/
private String name;
/**
* 基础包路径
*/
private String basePackage;
}
} }