From 023a5446a7d2a4bc496100b4b96b2c6f25721d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=AF=28004796=29?= Date: Mon, 25 Dec 2023 20:53:23 +0800 Subject: [PATCH] init --- .../src/main/resources/application.yml | 42 +-- .../app/CaiAnchorAppController.java | 19 +- .../cai/dto/app/query/AnchorListQuery.java | 4 + .../ruoyi/cai/dto/app/query/GiveGuardRes.java | 4 + ruoyi-common/pom.xml | 19 +- .../ruoyi/common/core/domain/PageQuery.java | 6 + .../framework/config/SpringDocConfig.java | 122 -------- .../properties/SpringDocProperties.java | 96 ------- .../config/properties/SwaggerProperties.java | 63 ++++ .../framework/handler/OpenApiHandler.java | 272 ------------------ 10 files changed, 108 insertions(+), 539 deletions(-) delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SpringDocConfig.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SpringDocProperties.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/handler/OpenApiHandler.java diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index d597a261..4a402006 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -135,9 +135,12 @@ security: # swagger 文档配置 - /*/api-docs - /*/api-docs/** + - /doc.html + - /swagger-resources/** + - /webjars/** # actuator 监控配置 - - /actuator - - /actuator/** + # - /actuator + # - /actuator/** # MyBatisPlus配置 # https://baomidou.com/config/ @@ -201,36 +204,15 @@ springdoc: api-docs: # 是否开启接口文档 enabled: true - # swagger-ui: -# # 持久化认证数据 -# persistAuthorization: true - info: - # 标题 - title: '标题:${ruoyi.name}后台管理系统_接口文档' - # 描述 - description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...' - # 版本 - version: '版本号: ${ruoyi-vue-plus.version}' - # 作者信息 - contact: - name: Lion Li - email: crazylionli@163.com - url: https://gitee.com/dromara/RuoYi-Vue-Plus - components: - # 鉴权方式配置 - security-schemes: - apiKey: - type: APIKEY - in: HEADER - name: ${sa-token.token-name} + swagger-ui: + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha #这里定义了两个分组,可定义多个,也可以不定义 group-configs: - - group: 1.演示模块 - packages-to-scan: com.ruoyi.demo - - group: 2.系统模块 - packages-to-scan: com.ruoyi.web - - group: 3.代码生成模块 - packages-to-scan: com.ruoyi.generator + - group: 'default' + paths-to-match: '/api/**' + packages-to-scan: com.ruoyi.cai # 防止XSS攻击 xss: diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/CaiAnchorAppController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/CaiAnchorAppController.java index 37e46db8..3e237b48 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/CaiAnchorAppController.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/CaiAnchorAppController.java @@ -12,15 +12,16 @@ import com.ruoyi.cai.service.CaiUserGiftService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/anchor") +@Tag(name = "主播相关接口") public class CaiAnchorAppController { @Autowired @@ -31,19 +32,23 @@ public class CaiAnchorAppController { private CaiUserGiftService userGiftService; @GetMapping("/page") - public TableDataInfo page(PageQuery page, AnchorListQuery query){ + @Operation(summary = "查询主播-分页") + public TableDataInfo page(@Parameter(description = "name") PageQuery page, + @Parameter(description = "name2") AnchorListQuery query){ Page res = anchorService.pageApp(page,query); return TableDataInfo.build(res); } @PostMapping("/give/guard") - public R giveGuard(GiveGuardRes query){ + @Operation(summary = "赠送主播守护") + public R giveGuard(@RequestBody GiveGuardRes query){ boolean res = guardTotalService.giveGuard(query); return R.ok(res); } @PostMapping("/give/gift") - public R giveGift(GiveGiftRes query){ + @Operation(summary = "赠送主播礼物") + public R giveGift(@RequestBody GiveGiftRes query){ boolean res = userGiftService.giveGift(query); return R.ok(res); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/AnchorListQuery.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/AnchorListQuery.java index 9d535bfc..bfdeb056 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/AnchorListQuery.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/AnchorListQuery.java @@ -1,8 +1,10 @@ package com.ruoyi.cai.dto.app.query; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data +@Schema(description = "主播查询条件") public class AnchorListQuery { /** @@ -11,7 +13,9 @@ public class AnchorListQuery { * 2-新人查询 * 3-同城查询 */ + @Schema(description = "类型") private Integer type; + @Schema(description = "城市") private String city; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/GiveGuardRes.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/GiveGuardRes.java index 82439593..628c6a97 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/GiveGuardRes.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/GiveGuardRes.java @@ -1,11 +1,15 @@ package com.ruoyi.cai.dto.app.query; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data +@Schema(description = "赠送守护入参") public class GiveGuardRes { + @Schema(description = "接收方用户ID") private Long toUserId; + @Schema(description = "赠送数量") private Long guardNum; } diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index e665d5a1..198a59e1 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -120,17 +120,6 @@ org.projectlombok lombok - - - org.springdoc - springdoc-openapi-webmvc-core - - - - org.springdoc - springdoc-openapi-javadoc - - org.springframework.boot @@ -159,6 +148,12 @@ bcprov-jdk15to18 + + com.github.xiaoymin + knife4j-openapi3-spring-boot-starter + 4.1.0 + + org.lionsoul @@ -168,7 +163,7 @@ com.google.guava guava - 23.0 + 27.0.1-jre diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java index 8a45905b..1cf75ad0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sql.SqlUtil; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; @@ -20,6 +21,7 @@ import java.util.List; */ @Data +@Schema(description = "分页实体") public class PageQuery implements Serializable { private static final long serialVersionUID = 1L; @@ -27,21 +29,25 @@ public class PageQuery implements Serializable { /** * 分页大小 */ + @Schema(description = "分页大小") private Integer pageSize; /** * 当前页数 */ + @Schema(description = "页数") private Integer pageNum; /** * 排序列 */ + @Schema(accessMode = Schema.AccessMode.READ_ONLY) private String orderByColumn; /** * 排序的方向desc或者asc */ + @Schema(accessMode = Schema.AccessMode.READ_ONLY) private String isAsc; /** diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SpringDocConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SpringDocConfig.java deleted file mode 100644 index b10e35dc..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SpringDocConfig.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.ruoyi.framework.config; - -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.config.properties.SpringDocProperties; -import com.ruoyi.framework.handler.OpenApiHandler; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import lombok.RequiredArgsConstructor; -import org.springdoc.core.*; -import org.springdoc.core.customizers.OpenApiBuilderCustomizer; -import org.springdoc.core.customizers.OpenApiCustomiser; -import org.springdoc.core.customizers.ServerBaseUrlCustomizer; -import org.springdoc.core.providers.JavadocProvider; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -/** - * Swagger 文档配置 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Configuration -@AutoConfigureBefore(SpringDocConfiguration.class) -@ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true) -public class SpringDocConfig { - - private final ServerProperties serverProperties; - - @Bean - @ConditionalOnMissingBean(OpenAPI.class) - public OpenAPI openApi(SpringDocProperties properties) { - OpenAPI openApi = new OpenAPI(); - // 文档基本信息 - SpringDocProperties.InfoProperties infoProperties = properties.getInfo(); - Info info = convertInfo(infoProperties); - openApi.info(info); - // 扩展文档信息 - openApi.externalDocs(properties.getExternalDocs()); - openApi.tags(properties.getTags()); - openApi.paths(properties.getPaths()); - openApi.components(properties.getComponents()); - Set keySet = properties.getComponents().getSecuritySchemes().keySet(); - List list = new ArrayList<>(); - SecurityRequirement securityRequirement = new SecurityRequirement(); - keySet.forEach(securityRequirement::addList); - list.add(securityRequirement); - openApi.security(list); - - return openApi; - } - - private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) { - Info info = new Info(); - info.setTitle(infoProperties.getTitle()); - info.setDescription(infoProperties.getDescription()); - info.setContact(infoProperties.getContact()); - info.setLicense(infoProperties.getLicense()); - info.setVersion(infoProperties.getVersion()); - return info; - } - - /** - * 自定义 openapi 处理器 - */ - @Bean - public OpenAPIService openApiBuilder(Optional openAPI, - SecurityService securityParser, - SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, - Optional> openApiBuilderCustomisers, - Optional> serverBaseUrlCustomisers, Optional javadocProvider) { - return new OpenApiHandler(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider); - } - - /** - * 对已经生成好的 OpenApi 进行自定义操作 - */ - @Bean - public OpenApiCustomiser openApiCustomiser() { - String contextPath = serverProperties.getServlet().getContextPath(); - String finalContextPath; - if (StringUtils.isBlank(contextPath) || "/".equals(contextPath)) { - finalContextPath = ""; - } else { - finalContextPath = contextPath; - } - // 对所有路径增加前置上下文路径 - return openApi -> { - Paths oldPaths = openApi.getPaths(); - if (oldPaths instanceof PlusPaths) { - return; - } - PlusPaths newPaths = new PlusPaths(); - oldPaths.forEach((k,v) -> newPaths.addPathItem(finalContextPath + k, v)); - openApi.setPaths(newPaths); - }; - } - - /** - * 单独使用一个类便于判断 解决springdoc路径拼接重复问题 - * - * @author Lion Li - */ - static class PlusPaths extends Paths { - - public PlusPaths() { - super(); - } - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SpringDocProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SpringDocProperties.java deleted file mode 100644 index 93ecefb0..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SpringDocProperties.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.ruoyi.framework.config.properties; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.ExternalDocumentation; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.tags.Tag; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * swagger 配置属性 - * - * @author Lion Li - */ -@Data -@Component -@ConfigurationProperties(prefix = "springdoc") -public class SpringDocProperties { - - /** - * 文档基本信息 - */ - @NestedConfigurationProperty - private InfoProperties info = new InfoProperties(); - - /** - * 扩展文档地址 - */ - @NestedConfigurationProperty - private ExternalDocumentation externalDocs; - - /** - * 标签 - */ - private List tags = null; - - /** - * 路径 - */ - @NestedConfigurationProperty - private Paths paths = null; - - /** - * 组件 - */ - @NestedConfigurationProperty - private Components components = null; - - /** - *

- * 文档的基础属性信息 - *

- * - * @see io.swagger.v3.oas.models.info.Info - * - * 为了 springboot 自动生产配置提示信息,所以这里复制一个类出来 - */ - @Data - public static class InfoProperties { - - /** - * 标题 - */ - private String title = null; - - /** - * 描述 - */ - private String description = null; - - /** - * 联系人信息 - */ - @NestedConfigurationProperty - private Contact contact = null; - - /** - * 许可证 - */ - @NestedConfigurationProperty - private License license = null; - - /** - * 版本 - */ - private String version = null; - - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java new file mode 100644 index 00000000..ece75efe --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java @@ -0,0 +1,63 @@ +package com.ruoyi.framework.config.properties; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * swagger 配置属性 + * + * @author Lion Li + */ +@Data +@Component +@ConfigurationProperties(prefix = "swagger") +public class SwaggerProperties { + + /** + * 验证码类型 + */ + private Boolean enabled; + /** + * 设置请求的统一前缀 + */ + private String pathMapping; + /** + * 验证码类别 + */ + private String title; + /** + * 数字验证码位数 + */ + private String description; + /** + * 字符验证码长度 + */ + private String version; + + /** + * 联系方式 + */ + private Contact contact; + + @Data + @NoArgsConstructor + public static class Contact{ + + /** + * 联系人 + **/ + private String name; + /** + * 联系人url + **/ + private String url; + /** + * 联系人email + **/ + private String email; + + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/OpenApiHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/OpenApiHandler.java deleted file mode 100644 index 608cae5d..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/OpenApiHandler.java +++ /dev/null @@ -1,272 +0,0 @@ -package com.ruoyi.framework.handler; - -import cn.hutool.core.io.IoUtil; -import io.swagger.v3.core.jackson.TypeNameResolver; -import io.swagger.v3.core.util.AnnotationsUtils; -import io.swagger.v3.oas.annotations.tags.Tags; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Operation; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.tags.Tag; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springdoc.core.OpenAPIService; -import org.springdoc.core.PropertyResolverUtils; -import org.springdoc.core.SecurityService; -import org.springdoc.core.SpringDocConfigProperties; -import org.springdoc.core.customizers.OpenApiBuilderCustomizer; -import org.springdoc.core.customizers.ServerBaseUrlCustomizer; -import org.springdoc.core.providers.JavadocProvider; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.util.CollectionUtils; -import org.springframework.web.method.HandlerMethod; - -import java.io.StringReader; -import java.lang.reflect.Method; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * 自定义 openapi 处理器 - * 对源码功能进行修改 增强使用 - */ -@SuppressWarnings("all") -public class OpenApiHandler extends OpenAPIService { - - /** - * The constant LOGGER. - */ - private static final Logger LOGGER = LoggerFactory.getLogger(OpenAPIService.class); - - /** - * The Context. - */ - private ApplicationContext context; - - /** - * The Security parser. - */ - private final SecurityService securityParser; - - /** - * The Mappings map. - */ - private final Map mappingsMap = new HashMap<>(); - - /** - * The Springdoc tags. - */ - private final Map springdocTags = new HashMap<>(); - - /** - * The Open api builder customisers. - */ - private final Optional> openApiBuilderCustomisers; - - /** - * The server base URL customisers. - */ - private final Optional> serverBaseUrlCustomizers; - - /** - * The Spring doc config properties. - */ - private final SpringDocConfigProperties springDocConfigProperties; - - /** - * The Open api. - */ - private OpenAPI openAPI; - - /** - * The Cached open api map. - */ - private final Map cachedOpenAPI = new HashMap<>(); - - /** - * The Is servers present. - */ - private boolean isServersPresent; - - /** - * The Server base url. - */ - private String serverBaseUrl; - - /** - * The Property resolver utils. - */ - private final PropertyResolverUtils propertyResolverUtils; - - /** - * The javadoc provider. - */ - private final Optional javadocProvider; - - /** - * The Basic error controller. - */ - private static Class basicErrorController; - - static { - try { - //spring-boot 2 - basicErrorController = Class.forName("org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController"); - } catch (ClassNotFoundException e) { - //spring-boot 1 - try { - basicErrorController = Class.forName("org.springframework.boot.autoconfigure.web.BasicErrorController"); - } catch (ClassNotFoundException classNotFoundException) { - //Basic error controller class not found - LOGGER.trace(classNotFoundException.getMessage()); - } - } - } - - /** - * Instantiates a new Open api builder. - * - * @param openAPI the open api - * @param securityParser the security parser - * @param springDocConfigProperties the spring doc config properties - * @param propertyResolverUtils the property resolver utils - * @param openApiBuilderCustomizers the open api builder customisers - * @param serverBaseUrlCustomizers the server base url customizers - * @param javadocProvider the javadoc provider - */ - public OpenApiHandler(Optional openAPI, SecurityService securityParser, - SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, - Optional> openApiBuilderCustomizers, - Optional> serverBaseUrlCustomizers, - Optional javadocProvider) { - super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); - if (openAPI.isPresent()) { - this.openAPI = openAPI.get(); - if (this.openAPI.getComponents() == null) - this.openAPI.setComponents(new Components()); - if (this.openAPI.getPaths() == null) - this.openAPI.setPaths(new Paths()); - if (!CollectionUtils.isEmpty(this.openAPI.getServers())) - this.isServersPresent = true; - } - this.propertyResolverUtils = propertyResolverUtils; - this.securityParser = securityParser; - this.springDocConfigProperties = springDocConfigProperties; - this.openApiBuilderCustomisers = openApiBuilderCustomizers; - this.serverBaseUrlCustomizers = serverBaseUrlCustomizers; - this.javadocProvider = javadocProvider; - if (springDocConfigProperties.isUseFqn()) - TypeNameResolver.std.setUseFqn(true); - } - - @Override - public Operation buildTags(HandlerMethod handlerMethod, Operation operation, OpenAPI openAPI, Locale locale) { - - Set tags = new HashSet<>(); - Set tagsStr = new HashSet<>(); - - buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr, locale); - buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr, locale); - - if (!CollectionUtils.isEmpty(tagsStr)) - tagsStr = tagsStr.stream() - .map(str -> propertyResolverUtils.resolve(str, locale)) - .collect(Collectors.toSet()); - - if (springdocTags.containsKey(handlerMethod)) { - io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod); - tagsStr.add(tag.getName()); - if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { - openAPI.addTagsItem(tag); - } - } - - if (!CollectionUtils.isEmpty(tagsStr)) { - if (CollectionUtils.isEmpty(operation.getTags())) - operation.setTags(new ArrayList<>(tagsStr)); - else { - Set operationTagsSet = new HashSet<>(operation.getTags()); - operationTagsSet.addAll(tagsStr); - operation.getTags().clear(); - operation.getTags().addAll(operationTagsSet); - } - } - - if (isAutoTagClasses(operation)) { - - - if (javadocProvider.isPresent()) { - String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType()); - if (StringUtils.isNotBlank(description)) { - io.swagger.v3.oas.models.tags.Tag tag = new io.swagger.v3.oas.models.tags.Tag(); - - // 自定义部分 修改使用java注释当tag名 - List list = IoUtil.readLines(new StringReader(description), new ArrayList<>()); - // tag.setName(tagAutoName); - tag.setName(list.get(0)); - operation.addTagsItem(list.get(0)); - - tag.setDescription(description); - if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { - openAPI.addTagsItem(tag); - } - } - } else { - String tagAutoName = splitCamelCase(handlerMethod.getBeanType().getSimpleName()); - operation.addTagsItem(tagAutoName); - } - } - - if (!CollectionUtils.isEmpty(tags)) { - // Existing tags - List openApiTags = openAPI.getTags(); - if (!CollectionUtils.isEmpty(openApiTags)) - tags.addAll(openApiTags); - openAPI.setTags(new ArrayList<>(tags)); - } - - // Handle SecurityRequirement at operation level - io.swagger.v3.oas.annotations.security.SecurityRequirement[] securityRequirements = securityParser - .getSecurityRequirements(handlerMethod); - if (securityRequirements != null) { - if (securityRequirements.length == 0) - operation.setSecurity(Collections.emptyList()); - else - securityParser.buildSecurityRequirement(securityRequirements, operation); - } - - return operation; - } - - private void buildTagsFromMethod(Method method, Set tags, Set tagsStr, Locale locale) { - // method tags - Set tagsSet = AnnotatedElementUtils - .findAllMergedAnnotations(method, Tags.class); - Set methodTags = tagsSet.stream() - .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet()); - methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class)); - if (!CollectionUtils.isEmpty(methodTags)) { - tagsStr.addAll(methodTags.stream().map(tag -> propertyResolverUtils.resolve(tag.name(), locale)).collect(Collectors.toSet())); - List allTags = new ArrayList<>(methodTags); - addTags(allTags, tags, locale); - } - } - - private void addTags(List sourceTags, Set tags, Locale locale) { - Optional> optionalTagSet = AnnotationsUtils - .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true); - optionalTagSet.ifPresent(tagsSet -> { - tagsSet.forEach(tag -> { - tag.name(propertyResolverUtils.resolve(tag.getName(), locale)); - tag.description(propertyResolverUtils.resolve(tag.getDescription(), locale)); - if (tags.stream().noneMatch(t -> t.getName().equals(tag.getName()))) - tags.add(tag); - }); - }); - } - -}