Browse Source

spring doc:增加模块分组

YunaiV 2 years ago
parent
commit
711a39b8e9
17 changed files with 262 additions and 68 deletions
  1. 80 59
      yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
  2. 24 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/web/config/BpmWebConfiguration.java
  3. 4 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/web/package-info.java
  4. 24 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/web/config/InfraWebConfiguration.java
  5. 4 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/web/package-info.java
  6. 4 0
      yudao-module-mall/README.md
  7. BIN
      yudao-module-mall/yudao-module-mall.zip
  8. 24 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/config/MemberWebConfiguration.java
  9. 4 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/package-info.java
  10. 24 0
      yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/framework/web/config/MpWebConfiguration.java
  11. 4 0
      yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/framework/web/package-info.java
  12. 24 0
      yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/framework/web/config/PayWebConfiguration.java
  13. 4 0
      yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/framework/web/package-info.java
  14. 24 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/web/config/SystemWebConfiguration.java
  15. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/web/package-info.java
  16. 8 8
      yudao-server/pom.xml
  17. 2 1
      yudao-server/src/main/resources/application.yaml

+ 80 - 59
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java

@@ -6,6 +6,7 @@ import io.swagger.v3.oas.models.info.Contact;
 import io.swagger.v3.oas.models.info.Info;
 import io.swagger.v3.oas.models.info.License;
 import io.swagger.v3.oas.models.media.IntegerSchema;
+import io.swagger.v3.oas.models.media.StringSchema;
 import io.swagger.v3.oas.models.parameters.Parameter;
 import io.swagger.v3.oas.models.security.SecurityRequirement;
 import io.swagger.v3.oas.models.security.SecurityScheme;
@@ -27,8 +28,11 @@ import java.util.Optional;
 import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID;
 
 /**
- * springdoc 自动配置类
- * 使用 knife4j.enable=false 禁用 Swagger
+ * Swagger 自动配置类,基于 OpenAPI + Springdoc 实现。
+ *
+ * 友情提示:
+ * 1. Springdoc 文档地址:<a href="https://github.com/springdoc/springdoc-openapi">仓库</a>
+ * 2. Swagger 规范,于 2015 更名为 OpenAPI 规范,本质是一个东西
  *
  * @author 芋道源码
  */
@@ -37,95 +41,112 @@ import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_
 @EnableConfigurationProperties(SwaggerProperties.class)
 public class YudaoSwaggerAutoConfiguration {
 
+    // ========== 全局 OpenAPI 配置 ==========
+
     @Bean
     public OpenAPI createApi(SwaggerProperties properties) {
-        Map<String, SecurityScheme> maps = securityScheme();
+        Map<String, SecurityScheme> securitySchemas = buildSecuritySchemes();
         OpenAPI openAPI = new OpenAPI()
+                // 接口信息
                 .info(buildInfo(properties))
-                .components(new Components().securitySchemes(maps))
+                // 接口安全配置
+                .components(new Components().securitySchemes(securitySchemas))
                 .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));
-        maps.keySet().forEach(key -> openAPI.addSecurityItem(new SecurityRequirement().addList(key)));
+        securitySchemas.keySet().forEach(key -> openAPI.addSecurityItem(new SecurityRequirement().addList(key)));
         return openAPI;
     }
 
     /**
-     * 自定义 openapi 处理器
+     * API 摘要信息
+     */
+    private Info buildInfo(SwaggerProperties properties) {
+        return new Info()
+                .title(properties.getTitle())
+                .description(properties.getDescription())
+                .version(properties.getVersion())
+                .contact(new Contact().name(properties.getAuthor()).url(properties.getUrl()).email(properties.getEmail()))
+                .license(new License().name(properties.getLicense()).url(properties.getLicenseUrl()));
+    }
+
+    /**
+     * 安全模式,这里配置通过请求头 Authorization 传递 token 参数
+     */
+    private Map<String, SecurityScheme> buildSecuritySchemes() {
+        Map<String, SecurityScheme> securitySchemes = new HashMap<>();
+        SecurityScheme securityScheme = new SecurityScheme()
+                .type(SecurityScheme.Type.APIKEY) // 类型
+                .name(HttpHeaders.AUTHORIZATION) // 请求头的 name
+                .in(SecurityScheme.In.HEADER); // token 所在位置
+        securitySchemes.put(HttpHeaders.AUTHORIZATION, securityScheme);
+        return securitySchemes;
+    }
+
+    /**
+     * 自定义 OpenAPI 处理器
      */
     @Bean
     public OpenAPIService openApiBuilder(Optional<OpenAPI> openAPI,
                                          SecurityService securityParser,
                                          SpringDocConfigProperties springDocConfigProperties,
                                          PropertyResolverUtils propertyResolverUtils,
-                                         Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers,
-                                         Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomisers,
+                                         Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,
+                                         Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,
                                          Optional<JavadocProvider> javadocProvider) {
-        return new OpenAPIService(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider);
+
+        return new OpenAPIService(openAPI, securityParser, springDocConfigProperties,
+                propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider);
     }
 
+    // ========== 分组 OpenAPI 配置 ==========
+
+    /**
+     * 所有模块的 API 分组
+     */
     @Bean
-    public GroupedOpenApi appApi() {
-        return GroupedOpenApi.builder()
-                .group("app")
-                .addOperationCustomizer((operation, handlerMethod) ->
-                        operation.addParametersItem(globalHeaderParameter())
-                )
-                .pathsToMatch("/app-api/**")
-                .build();
+    public GroupedOpenApi allGroupedOpenApi() {
+        return buildGroupedOpenApi("all", "");
     }
 
-    @Bean
-    public GroupedOpenApi adminApi() {
-        return GroupedOpenApi.builder()
-                .group("admin")
-                .addOperationCustomizer((operation, handlerMethod) ->
-                        operation.addParametersItem(globalHeaderParameter())
-                )
-                .pathsToMatch("/admin-api/**")
-                .build();
+    public static GroupedOpenApi buildGroupedOpenApi(String group) {
+        return buildGroupedOpenApi(group, group);
     }
 
-    /**
-     * API 摘要信息
-     */
-    private Info buildInfo(SwaggerProperties properties) {
-        return new Info()
-                .title(properties.getTitle())
-                .description(properties.getDescription())
-                .version(properties.getVersion())
-                .contact(new Contact().name(properties.getAuthor()).url(properties.getUrl()).email(properties.getEmail()))
-                .license(new License().name(properties.getLicense()).url(properties.getLicenseUrl()));
+    public static GroupedOpenApi buildGroupedOpenApi(String group, String path) {
+        return GroupedOpenApi.builder()
+                .group(group)
+                .pathsToMatch("/admin-api/" + path + "/**", "/app-api/" + path + "/**")
+                .addOperationCustomizer((operation, handlerMethod) -> operation
+                        .addParametersItem(buildTenantHeaderParameter())
+                        .addParametersItem(buildSecurityHeaderParameter()))
+                .build();
     }
 
     /**
-     * 安全模式,这里配置通过请求头 Authorization 传递 token 参数
+     * 构建 Tenant 租户编号请求头参数
+     *
+     * @return 多租户参数
      */
-    private Map<String, SecurityScheme> securityScheme() {
-        Map<String, SecurityScheme> map = new HashMap<>();
-        SecurityScheme securityScheme = new SecurityScheme()
-                //类型
-                .type(SecurityScheme.Type.APIKEY)
-                //请求头的name
-                .name(HttpHeaders.AUTHORIZATION)
-                //token所在未知
-                .in(SecurityScheme.In.HEADER);
-        map.put(HttpHeaders.AUTHORIZATION, securityScheme);
-        return map;
+    private static Parameter buildTenantHeaderParameter() {
+        return new Parameter()
+                .name(HEADER_TENANT_ID) // header 名
+                .description("租户编号") // 描述
+                .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
+                .schema(new IntegerSchema()._default(1L).name(HEADER_TENANT_ID).description("租户编号")); // 默认:使用租户编号为 1
     }
 
     /**
-     * globalHeaderParameter
-     * @return 多租户参数
+     * 构建 Authorization 认证请求头参数
+     *
+     * 解决 Knife4j <a href="https://gitee.com/xiaoym/knife4j/issues/I69QBU">Authorize 未生效,请求header里未包含参数</a>
+     *
+     * @return 认证参数
      */
-    private static Parameter globalHeaderParameter() {
+    private static Parameter buildSecurityHeaderParameter() {
         return new Parameter()
-                .name(HEADER_TENANT_ID)
-                .description("租户编号")
-                .in(String.valueOf(SecurityScheme.In.HEADER))
-                .schema(new IntegerSchema()
-                        ._default(1L)
-                        .name(HEADER_TENANT_ID)
-                        .description("租户编号")
-                );
+                .name(HttpHeaders.AUTHORIZATION) // header 名
+                .description("认证 Token") // 描述
+                .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
+                .schema(new StringSchema()._default("Bearer test1").name(HEADER_TENANT_ID).description("认证 Token")); // 默认:使用用户编号为 1
     }
 
 }

+ 24 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/web/config/BpmWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.bpm.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * bpm 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class BpmWebConfiguration {
+
+    /**
+     * bpm 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi bpmGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("bpm");
+    }
+
+}

+ 4 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * bpm 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.bpm.framework.web;

+ 24 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/web/config/InfraWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.infra.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * infra 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class InfraWebConfiguration {
+
+    /**
+     * infra 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi infraGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("infra");
+    }
+
+}

+ 4 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * infra 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.infra.framework.web;

+ 4 - 0
yudao-module-mall/README.md

@@ -0,0 +1,4 @@
+mall 后端的代码,暂时归档成一个 yudao-module-mall 的压缩包。
+
+精力有限,近期还是以管理后台的工作流、大屏报表等功能为主!
+

BIN
yudao-module-mall/yudao-module-mall.zip


+ 24 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/config/MemberWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.member.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * member 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class MemberWebConfiguration {
+
+    /**
+     * member 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi memberGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("member");
+    }
+
+}

+ 4 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * member 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.member.framework.web;

+ 24 - 0
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/framework/web/config/MpWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mp.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * mp 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class MpWebConfiguration {
+
+    /**
+     * mp 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi mpGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("mp");
+    }
+
+}

+ 4 - 0
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * mp 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.mp.framework.web;

+ 24 - 0
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/framework/web/config/PayWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.pay.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * pay 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class PayWebConfiguration {
+
+    /**
+     * pay 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi payGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("pay");
+    }
+
+}

+ 4 - 0
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * pay 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.pay.framework.web;

+ 24 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/web/config/SystemWebConfiguration.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.system.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * system 模块的 web 组件的 Configuration
+ *
+ * @author 芋道源码
+ */
+@Configuration(proxyBeanMethods = false)
+public class SystemWebConfiguration {
+
+    /**
+     * system 模块的 API 分组
+     */
+    @Bean
+    public GroupedOpenApi systemGroupedOpenApi() {
+        return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("system");
+    }
+
+}

+ 4 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/web/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * system 模块的 web 配置
+ */
+package cn.iocoder.yudao.module.system.framework.web;

+ 8 - 8
yudao-server/pom.xml

@@ -41,19 +41,19 @@
             <artifactId>yudao-spring-boot-starter-biz-error-code</artifactId>
         </dependency>
 
-        <!-- 数据报表 -->
-<!--        <dependency>-->
-<!--            <groupId>cn.iocoder.boot</groupId>-->
-<!--            <artifactId>yudao-module-visualization-biz</artifactId>-->
-<!--            <version>${revision}</version>-->
-<!--        </dependency>-->
-        <!-- 工作流 -->
+        <!-- 数据报表。默认注释,保证编译速度 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-visualization-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
+        <!-- 工作流。默认注释,保证编译速度 -->
 <!--        <dependency>-->
 <!--            <groupId>cn.iocoder.boot</groupId>-->
 <!--            <artifactId>yudao-module-bpm-biz</artifactId>-->
 <!--            <version>${revision}</version>-->
 <!--        </dependency>-->
-        <!-- 支付服务 -->
+        <!-- 支付服务。默认注释,保证编译速度 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-pay-biz</artifactId>

+ 2 - 1
yudao-server/src/main/resources/application.yaml

@@ -34,8 +34,9 @@ spring:
     redis:
       time-to-live: 1h # 设置过期时间为 1 小时
 
+--- #################### 接口文档配置 ####################
+
 springdoc:
-  show-actuator: true
   swagger-ui:
     enabled: true
     path: /swagger-ui