content: 
  package com.platform.config;
  
  import cn.hutool.core.collection.CollUtil;
  import com.fasterxml.classmate.TypeResolver;
  import io.swagger.annotations.ApiModel;
  import io.swagger.annotations.ApiModelProperty;
  import lombok.Data;
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.core.Ordered;
  import org.springframework.data.domain.Pageable;
  import springfox.documentation.builders.ApiInfoBuilder;
  import springfox.documentation.builders.PathSelectors;
  import springfox.documentation.schema.AlternateTypeRule;
  import springfox.documentation.schema.AlternateTypeRuleConvention;
  import springfox.documentation.service.ApiInfo;
  import springfox.documentation.service.ApiKey;
  import springfox.documentation.service.AuthorizationScope;
  import springfox.documentation.service.SecurityReference;
  import springfox.documentation.service.SecurityScheme;
  import springfox.documentation.spi.DocumentationType;
  import springfox.documentation.spi.service.contexts.SecurityContext;
  import springfox.documentation.spring.web.plugins.Docket;
  import springfox.documentation.swagger2.annotations.EnableSwagger2;
  
  import java.util.ArrayList;
  import java.util.List;
  import static springfox.documentation.schema.AlternateTypeRules.newRule;
  
  /**
   * api页面 /doc.html
   * @author AllDataDC
   * @date 2023-01-27
   */
  @Configuration
  @EnableSwagger2
  public class SwaggerConfig {
  
      @Value("${jwt.header}")
      private String tokenHeader;
  
      @Value("${swagger.enabled}")
      private Boolean enabled;
  
      @Bean
      @SuppressWarnings("all")
      public Docket createRestApi() {
          return new Docket(DocumentationType.SWAGGER_2)
                  .enable(enabled)
                  .pathMapping("/")
                  .apiInfo(apiInfo())
                  .select()
                  .paths(PathSelectors.regex("^(?!/error).*"))
                  .paths(PathSelectors.any())
                  .build()
                  //添加登陆认证
                  .securitySchemes(securitySchemes())
                  .securityContexts(securityContexts());
      }
  
      private ApiInfo apiInfo() {
          return new ApiInfoBuilder()
                  .description("AllData数据中台")
                  .title("AllData数据中台")
                  .version("2.6")
                  .build();
      }
  
      private List<SecurityScheme> securitySchemes() {
          //设置请求头信息
          List<SecurityScheme> securitySchemes = new ArrayList<>();
          ApiKey apiKey = new ApiKey(tokenHeader, tokenHeader, "header");
          securitySchemes.add(apiKey);
          return securitySchemes;
      }
  
      private List<SecurityContext> securityContexts() {
          //设置需要登录认证的路径
          List<SecurityContext> securityContexts = new ArrayList<>();
          // ^(?!auth).*$ 表示所有包含auth的接口不需要使用securitySchemes即不需要带token
          // ^标识开始  ()里是一子表达式  ?!/auth表示匹配不是/auth的位置，匹配上则添加请求头，注意路径已/开头  .表示任意字符  *表示前面的字符匹配多次 $标识结束
          securityContexts.add(getContextByPath());
          return securityContexts;
      }
  
      private SecurityContext getContextByPath() {
          return SecurityContext.builder()
                  .securityReferences(defaultAuth())
                  .build();
      }
  
      private List<SecurityReference> defaultAuth() {
          List<SecurityReference> securityReferences = new ArrayList<>();
          AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
          AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
          authorizationScopes[0] = authorizationScope;
          securityReferences.add(new SecurityReference(tokenHeader, authorizationScopes));
          return securityReferences;
      }
  }
  
  /**
   *  将Pageable转换展示在swagger中
   */
  @Configuration
  class SwaggerDataConfig {
  
      @Bean
      public AlternateTypeRuleConvention pageableConvention(final TypeResolver resolver) {
          return new AlternateTypeRuleConvention() {
              @Override
              public int getOrder() {
                  return Ordered.HIGHEST_PRECEDENCE;
              }
  
              @Override
              public List<AlternateTypeRule> rules() {
                  return CollUtil.newArrayList(newRule(resolver.resolve(Pageable.class), resolver.resolve(Page.class)));
              }
          };
      }
  
      @ApiModel
      @Data
      private static class Page {
          @ApiModelProperty("页码 (0..N)")
          private Integer page;
  
          @ApiModelProperty("每页显示的数目")
          private Integer size;
  
          @ApiModelProperty("以下列格式排序标准：property[,asc | desc]。 默认排序顺序为升序。 支持多种排序条件：如：id,asc")
          private List<String> sort;
      }
  }
  