From e91af8cfd3c49c24eda093c2eec50f87c22fcab5 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Wed, 27 Dec 2023 11:03:40 +0800 Subject: [PATCH 1/5] =?UTF-8?q?knife4j=E5=8D=87=E7=BA=A74.4.0=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-boot/jeecg-boot-base-core/pom.xml | 9 +- .../java/org/jeecg/config/Swagger2Config.java | 370 +++++++++--------- .../java/org/jeecg/config/Swagger3Config.java | 58 +++ .../org/jeecg/config/shiro/ShiroConfig.java | 4 +- .../gpt/service/impl/ChatServiceImpl.java | 2 +- .../jeecg-cloud-gateway/pom.xml | 2 +- .../src/main/resources/application.yml | 9 + .../jeecg-visual/jeecg-cloud-monitor/pom.xml | 11 - 8 files changed, 255 insertions(+), 210 deletions(-) create mode 100644 jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java diff --git a/jeecg-boot/jeecg-boot-base-core/pom.xml b/jeecg-boot/jeecg-boot-base-core/pom.xml index c4ae57e1..491b364c 100644 --- a/jeecg-boot/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot/jeecg-boot-base-core/pom.xml @@ -173,7 +173,7 @@ DmDialect-for-hibernate5.0 ${dm8.version} - + org.springframework.boot @@ -211,14 +211,9 @@ - com.github.xiaoymin - knife4j-openapi2-spring-boot-starter + knife4j-openapi3-spring-boot-starter ${knife4j-spring-boot-starter.version} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java index e45570e4..484624b9 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java @@ -1,188 +1,182 @@ -package org.jeecg.config; - - -import io.swagger.annotations.ApiOperation; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.config.mybatis.MybatisPlusSaasConfig; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.util.ReflectionUtils; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; -import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.ParameterBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.schema.ModelRef; -import springfox.documentation.service.*; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; -import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Author scott - */ -@Configuration -@EnableSwagger2WebMvc -@Import(BeanValidatorPluginsConfiguration.class) -public class Swagger2Config implements WebMvcConfigurer { - - /** - * - * 显示swagger-ui.html文档展示页,还必须注入swagger资源: - * - * @param registry - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - } - - /** - * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 - * - * @return Docket - */ - @Bean(value = "defaultApi2") - public Docket defaultApi2() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - //此包路径下的类,才生成接口文档 - .apis(RequestHandlerSelectors.basePackage("org.jeecg")) - //加了ApiOperation注解的类,才生成接口文档 - .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) - .paths(PathSelectors.any()) - .build() - .securitySchemes(Collections.singletonList(securityScheme())) - .securityContexts(securityContexts()) - .globalOperationParameters(setHeaderToken()); - } - - /*** - * oauth2配置 - * 需要增加swagger授权回调地址 - * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html - * @return - */ - @Bean - SecurityScheme securityScheme() { - return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header"); - } - /** - * JWT token - * @return - */ - private List setHeaderToken() { - ParameterBuilder tokenPar = new ParameterBuilder(); - List pars = new ArrayList<>(); - tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); - pars.add(tokenPar.build()); - //update-begin-author:liusq---date:2024-08-15--for: 开启多租户时,全局参数增加租户id - if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ - ParameterBuilder tenantPar = new ParameterBuilder(); - tenantPar.name(CommonConstant.TENANT_ID).description("租户ID").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); - pars.add(tenantPar.build()); - } - //update-end-author:liusq---date:2024-08-15--for: 开启多租户时,全局参数增加租户id - - return pars; - } - - /** - * api文档的详细信息函数,注意这里的注解引用的是哪个 - * - * @return - */ - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - // //大标题 - .title("JeecgBoot 后台服务API接口文档") - // 版本号 - .version("1.0") -// .termsOfServiceUrl("NO terms of service") - // 描述 - .description("后台API接口") - // 作者 - .contact(new Contact("北京国炬信息技术有限公司","www.jeccg.com","jeecgos@163.com")) - .license("The Apache License, Version 2.0") - .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") - .build(); - } - - /** - * 新增 securityContexts 保持登录状态 - */ - private List securityContexts() { - return new ArrayList( - Collections.singleton(SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(PathSelectors.regex("^(?!auth).*$")) - .build()) - ); - } - - private List defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - return new ArrayList( - Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes))); - } - - /** - * 解决springboot2.6 和springfox不兼容问题 - * @return - */ - @Bean - public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { - return new BeanPostProcessor() { - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof WebMvcRequestHandlerProvider) { - customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); - } - return bean; - } - - private void customizeSpringfoxHandlerMappings(List mappings) { - List copy = mappings.stream() - .filter(mapping -> mapping.getPatternParser() == null) - .collect(Collectors.toList()); - mappings.clear(); - mappings.addAll(copy); - } - - @SuppressWarnings("unchecked") - private List getHandlerMappings(Object bean) { - try { - Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); - field.setAccessible(true); - return (List) field.get(bean); - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new IllegalStateException(e); - } - } - }; - } - - -} +//package org.jeecg.config; +// +// +//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +//import org.jeecg.common.constant.CommonConstant; +//import org.springframework.beans.BeansException; +//import org.springframework.beans.factory.config.BeanPostProcessor; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Import; +//import org.springframework.util.ReflectionUtils; +//import org.springframework.web.bind.annotation.RestController; +//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; +//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +//import springfox.documentation.builders.ApiInfoBuilder; +//import springfox.documentation.builders.ParameterBuilder; +//import springfox.documentation.builders.PathSelectors; +//import springfox.documentation.builders.RequestHandlerSelectors; +//import springfox.documentation.oas.annotations.EnableOpenApi; +//import springfox.documentation.schema.ModelRef; +//import springfox.documentation.service.*; +//import springfox.documentation.spi.DocumentationType; +//import springfox.documentation.spi.service.contexts.SecurityContext; +//import springfox.documentation.spring.web.plugins.Docket; +//import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; +//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; +//import springfox.documentation.swagger2.annotations.EnableSwagger2; +// +//import java.lang.reflect.Field; +//import java.util.ArrayList; +//import java.util.Collections; +//import java.util.List; +//import java.util.stream.Collectors; +// +///** +// * @Author scott +// */ +//@Configuration +//@EnableSwagger2 //开启 Swagger2 +//@EnableKnife4j //开启 knife4j,可以不写 +//@Import(BeanValidatorPluginsConfiguration.class) +//public class Swagger2Config implements WebMvcConfigurer { +// +// /** +// * +// * 显示swagger-ui.html文档展示页,还必须注入swagger资源: +// * +// * @param registry +// */ +// @Override +// public void addResourceHandlers(ResourceHandlerRegistry registry) { +// registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); +// registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); +// registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); +// } +// +// /** +// * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 +// * +// * @return Docket +// */ +// @Bean(value = "defaultApi2") +// public Docket defaultApi2() { +// return new Docket(DocumentationType.SWAGGER_2) +// .apiInfo(apiInfo()) +// .select() +// //此包路径下的类,才生成接口文档 +// .apis(RequestHandlerSelectors.basePackage("org.jeecg")) +// //加了ApiOperation注解的类,才生成接口文档 +// .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) +// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) +// .paths(PathSelectors.any()) +// .build() +// .securitySchemes(Collections.singletonList(securityScheme())) +// .securityContexts(securityContexts()) +// .globalOperationParameters(setHeaderToken()); +// } +// +// /*** +// * oauth2配置 +// * 需要增加swagger授权回调地址 +// * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html +// * @return +// */ +// @Bean +// SecurityScheme securityScheme() { +// return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header"); +// } +// /** +// * JWT token +// * @return +// */ +// private List setHeaderToken() { +// ParameterBuilder tokenPar = new ParameterBuilder(); +// List pars = new ArrayList<>(); +// tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); +// pars.add(tokenPar.build()); +// return pars; +// } +// +// /** +// * api文档的详细信息函数,注意这里的注解引用的是哪个 +// * +// * @return +// */ +// private ApiInfo apiInfo() { +// return new ApiInfoBuilder() +// // //大标题 +// .title("JeecgBoot 后台服务API接口文档") +// // 版本号 +// .version("1.0") +//// .termsOfServiceUrl("NO terms of service") +// // 描述 +// .description("后台API接口") +// // 作者 +// .contact(new Contact("北京国炬信息技术有限公司","www.jeccg.com","jeecgos@163.com")) +// .license("The Apache License, Version 2.0") +// .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") +// .build(); +// } +// +// /** +// * 新增 securityContexts 保持登录状态 +// */ +// private List securityContexts() { +// return new ArrayList( +// Collections.singleton(SecurityContext.builder() +// .securityReferences(defaultAuth()) +// .forPaths(PathSelectors.regex("^(?!auth).*$")) +// .build()) +// ); +// } +// +// private List defaultAuth() { +// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); +// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; +// authorizationScopes[0] = authorizationScope; +// return new ArrayList( +// Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes))); +// } +// +// /** +// * 解决springboot2.6 和springfox不兼容问题 +// * @return +// */ +// @Bean +// public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { +// return new BeanPostProcessor() { +// +// @Override +// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { +// if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { +// customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); +// } +// return bean; +// } +// +// private void customizeSpringfoxHandlerMappings(List mappings) { +// List copy = mappings.stream() +// .filter(mapping -> mapping.getPatternParser() == null) +// .collect(Collectors.toList()); +// mappings.clear(); +// mappings.addAll(copy); +// } +// +// @SuppressWarnings("unchecked") +// private List getHandlerMappings(Object bean) { +// try { +// Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); +// field.setAccessible(true); +// return (List) field.get(bean); +// } catch (IllegalArgumentException | IllegalAccessException e) { +// throw new IllegalStateException(e); +// } +// } +// }; +// } +// +// +//} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java new file mode 100644 index 00000000..044e9d6f --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java @@ -0,0 +1,58 @@ +package org.jeecg.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Paths; +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.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.jeecg.common.constant.CommonConstant; +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +/** + * @author eightmonth + */ +@Configuration +public class Swagger3Config implements WebMvcConfigurer { + /** + * + * 显示swagger-ui.html文档展示页,还必须注入swagger资源: + * + * @param registry + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + @Bean + public GroupedOpenApi swaggerOpenApi() { + return GroupedOpenApi.builder() + .group("default") + .packagesToScan("org.jeecg") + .build(); + } + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("JeecgBoot 后台服务API接口文档") + .version("1.0") + .contact(new Contact().name("北京国炬信息技术有限公司").url("www.jeccg.com").email("jeecgos@163.com")) + .description( "后台API接口") + .termsOfService("NO terms of service") + .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html"))) + .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)) + .components(new Components().addSecuritySchemes(HttpHeaders.AUTHORIZATION, + new SecurityScheme().name(HttpHeaders.AUTHORIZATION).type(SecurityScheme.Type.HTTP))); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 82c02a7d..e2a68a96 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -134,7 +134,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger**/**", "anon"); filterChainDefinitionMap.put("/webjars/**", "anon"); - filterChainDefinitionMap.put("/v2/**", "anon"); + filterChainDefinitionMap.put("/v3/**", "anon"); // update-begin--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP) filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon"); @@ -320,7 +320,7 @@ public class ShiroConfig { return sentinelManager; } - + // redis 单机支持,在集群为空,或者集群无机器时候使用 add by jzyadmin@163.com if (lettuceConnectionFactory.getClusterConfiguration() == null || lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().isEmpty()) { RedisManager redisManager = new RedisManager(); diff --git a/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/service/impl/ChatServiceImpl.java b/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/service/impl/ChatServiceImpl.java index c22ace48..c24b0dce 100644 --- a/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/service/impl/ChatServiceImpl.java +++ b/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/gpt/service/impl/ChatServiceImpl.java @@ -9,7 +9,7 @@ import com.unfbx.chatgpt.entity.chat.Message; import com.unfbx.chatgpt.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; -import org.jeecg.chatgpt.prop.AiChatProperties; +import org.jeecg.ai.prop.AiChatProperties; import org.jeecg.common.api.vo.Result; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.vo.LoginUser; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml index 8fae6e58..117ad135 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml @@ -73,7 +73,7 @@ com.github.xiaoymin - knife4j-openapi2-spring-boot-starter + knife4j-gateway-spring-boot-starter ${knife4j-spring-boot-starter.version} diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml index 6a1c4922..310f3f21 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml @@ -1,6 +1,15 @@ server: port: 9999 +knife4j: + gateway: + enabled: true + strategy: discover + discover: + excluded-services: ${spring.application.name} + enabled: true + version: OpenAPI3 + spring: application: name: jeecg-gateway diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml index 76debcc7..cbb441b9 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml @@ -34,17 +34,6 @@ org.springframework.boot spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - org.springframework.boot - spring-boot-starter-undertow From fcc7842e894673a6d19e02f8527859e3be103601 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Thu, 28 Dec 2023 10:42:06 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3=E8=8C=83?= =?UTF-8?q?=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ff58a1dd265bb1b514f2a887f5a9ddce5d99e816) --- .../src/main/java/org/jeecg/config/Swagger3Config.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java index 044e9d6f..eec425ee 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java @@ -1,5 +1,6 @@ package org.jeecg.config; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Paths; @@ -38,6 +39,10 @@ public class Swagger3Config implements WebMvcConfigurer { return GroupedOpenApi.builder() .group("default") .packagesToScan("org.jeecg") + // 剔除以下几个包路径的接口生成文档 + .packagesToExclude("org.jeecg.modules.drag", "org.jeecg.modules.online", "org.jeecg.modules.jmreport") + // 加了Operation注解的方法,才生成接口文档 + .addOpenApiMethodFilter(method -> method.isAnnotationPresent(Operation.class)) .build(); } From 20037ae02bb0065dd01eaf326db3b382a36bb616 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Mon, 31 Mar 2025 16:36:43 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=AF=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg-visual/jeecg-cloud-monitor/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml index cbb441b9..76debcc7 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml @@ -34,6 +34,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow From 299f63c6e9fbec5a5d5fba8c19b17613d0113736 Mon Sep 17 00:00:00 2001 From: EightMonth Date: Tue, 1 Apr 2025 15:04:06 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9token=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A4=B4=E4=BF=A1=E6=81=AF=E5=8F=8A=E6=8E=92?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E9=9C=80=E8=A6=81=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jeecg/config/Swagger3Config.java | 25 ++++++++++++++++--- .../src/main/resources/application.yml | 7 +++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java index eec425ee..3b9c9a60 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java @@ -11,9 +11,9 @@ import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import org.jeecg.common.constant.CommonConstant; import org.springdoc.core.GroupedOpenApi; +import org.springdoc.core.customizers.GlobalOpenApiCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpHeaders; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** @@ -43,9 +43,26 @@ public class Swagger3Config implements WebMvcConfigurer { .packagesToExclude("org.jeecg.modules.drag", "org.jeecg.modules.online", "org.jeecg.modules.jmreport") // 加了Operation注解的方法,才生成接口文档 .addOpenApiMethodFilter(method -> method.isAnnotationPresent(Operation.class)) + .addOpenApiCustomiser(globalOpenApiCustomizer()) .build(); } + @Bean + public GlobalOpenApiCustomizer globalOpenApiCustomizer() { + return openApi -> { + // 全局添加鉴权参数 + if (openApi.getPaths() != null) { + openApi.getPaths().forEach((s, pathItem) -> { + // 接口添加鉴权参数 + pathItem.readOperations() + .forEach(operation -> + operation.addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN)) + ); + }); + } + }; + } + @Bean public OpenAPI customOpenAPI() { return new OpenAPI() @@ -56,8 +73,8 @@ public class Swagger3Config implements WebMvcConfigurer { .description( "后台API接口") .termsOfService("NO terms of service") .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html"))) - .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)) - .components(new Components().addSecuritySchemes(HttpHeaders.AUTHORIZATION, - new SecurityScheme().name(HttpHeaders.AUTHORIZATION).type(SecurityScheme.Type.HTTP))); + .addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN)) + .components(new Components().addSecuritySchemes(CommonConstant.X_ACCESS_TOKEN, + new SecurityScheme().name(CommonConstant.X_ACCESS_TOKEN).type(SecurityScheme.Type.HTTP))); } } diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/application.yml index 53f5eed6..9841caa3 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/application.yml @@ -1,6 +1,11 @@ server: port: 7001 - + +springdoc: + packages-to-exclude: + - org.jeecg.modules.drag + - org.jeecg.modules.online + - org.jeecg.modules.jmreport spring: application: name: jeecg-system From c18fb68e81ea7cb7b3841c7304a3202730bfa90d Mon Sep 17 00:00:00 2001 From: EightMonth Date: Tue, 1 Apr 2025 17:01:58 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E4=B8=BA=E5=85=8D=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=8E=92=E9=99=A4token=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jeecg/config/Swagger3Config.java | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java index 3b9c9a60..ed3880b9 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java @@ -9,6 +9,7 @@ import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CommonConstant; import org.springdoc.core.GroupedOpenApi; import org.springdoc.core.customizers.GlobalOpenApiCustomizer; @@ -16,11 +17,30 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + /** * @author eightmonth */ +@Slf4j @Configuration public class Swagger3Config implements WebMvcConfigurer { + // 定义不需要注入安全要求的路径集合 + Set excludedPaths = new HashSet<>(Arrays.asList( + "/sys/randomImage/{key}", + "/sys/login", + "/sys/phoneLogin", + "/sys/mLogin", + "/sys/sms", + "/sys/cas/client/validateLogin", + "/test/jeecgDemo/demo3", + "/sys/thirdLogin/**", + "/sys/user/register" + )); + /** * * 显示swagger-ui.html文档展示页,还必须注入swagger资源: @@ -52,12 +72,21 @@ public class Swagger3Config implements WebMvcConfigurer { return openApi -> { // 全局添加鉴权参数 if (openApi.getPaths() != null) { - openApi.getPaths().forEach((s, pathItem) -> { - // 接口添加鉴权参数 - pathItem.readOperations() - .forEach(operation -> - operation.addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN)) - ); + openApi.getPaths().forEach((path, pathItem) -> { + log.info("path: {}", path); + // 检查当前路径是否在排除列表中 + boolean isExcluded = excludedPaths.stream().anyMatch(excludedPath -> + excludedPath.equals(path) || + (excludedPath.endsWith("**") && path.startsWith(excludedPath.substring(0, excludedPath.length() - 2))) + ); + + if (!isExcluded) { + // 接口添加鉴权参数 + pathItem.readOperations() + .forEach(operation -> + operation.addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN)) + ); + } }); } }; @@ -68,7 +97,7 @@ public class Swagger3Config implements WebMvcConfigurer { return new OpenAPI() .info(new Info() .title("JeecgBoot 后台服务API接口文档") - .version("1.0") + .version("3.7.4") .contact(new Contact().name("北京国炬信息技术有限公司").url("www.jeccg.com").email("jeecgos@163.com")) .description( "后台API接口") .termsOfService("NO terms of service") @@ -77,4 +106,4 @@ public class Swagger3Config implements WebMvcConfigurer { .components(new Components().addSecuritySchemes(CommonConstant.X_ACCESS_TOKEN, new SecurityScheme().name(CommonConstant.X_ACCESS_TOKEN).type(SecurityScheme.Type.HTTP))); } -} +} \ No newline at end of file