From 5f0d5163f37ed1ef62eb5e0fa036800753634cab Mon Sep 17 00:00:00 2001 From: DongZeLiang <2746733890@qq.com> Date: Wed, 10 Jul 2024 21:29:22 +0800 Subject: [PATCH] =?UTF-8?q?feat()=EF=BC=9A=E6=8E=A5=E5=8F=A3=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=9B=B8=E5=85=B3=E9=9B=86=E6=88=90=201=E3=80=81?= =?UTF-8?q?=E9=9B=86=E6=88=90=E4=BA=86knife4j=20spring-doc=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=202=E3=80=81=E7=A7=BB=E9=99=A4=E4=BA=86swagg?= =?UTF-8?q?er2=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE=203=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86nacos=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-auth/pom.xml | 6 + .../pom.xml | 22 +- .../api/doc/config/SpringDocConfig.java | 34 ++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + cloud-common/cloud-common-core/pom.xml | 6 - .../annotation/EnableCustomSwagger2.java | 15 - .../config/SwaggerAutoConfiguration.java | 111 ------- .../config/SwaggerBeanPostProcessor.java | 45 --- .../swagger/config/SwaggerProperties.java | 296 ------------------ .../config/SwaggerWebConfiguration.java | 18 -- ...ot.autoconfigure.AutoConfiguration.imports | 3 - cloud-common/pom.xml | 2 +- cloud-gateway/pom.xml | 12 +- .../muyu/gateway/config/SwaggerProvider.java | 76 ----- .../filter/{log => }/AccessLogFilter.java | 3 +- .../muyu/gateway/handler/SwaggerHandler.java | 46 --- .../{filter/log => model}/AccessLog.java | 4 +- .../src/main/resources/bootstrap.yml | 12 + cloud-modules/cloud-modules-file/pom.xml | 12 +- cloud-modules/cloud-modules-gen/pom.xml | 18 +- .../com/muyu/gen/CloudGenApplication.java | 2 - cloud-modules/cloud-modules-job/pom.xml | 18 +- .../com/muyu/job/CloudJobApplication.java | 2 - cloud-modules/cloud-modules-system/pom.xml | 24 +- .../muyu/system/CloudSystemApplication.java | 1 - .../controller/SysConfigController.java | 6 +- .../src/main/resources/bootstrap.yml | 6 +- init-file/cloud-system.sql | 2 +- init-file/nacos_config.zip | Bin 5495 -> 6501 bytes pom.xml | 10 +- 30 files changed, 93 insertions(+), 720 deletions(-) rename cloud-common/{cloud-common-swagger => cloud-common-api-doc}/pom.xml (52%) create mode 100644 cloud-common/cloud-common-api-doc/src/main/java/com/muyu/common/api/doc/config/SpringDocConfig.java create mode 100644 cloud-common/cloud-common-api-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/annotation/EnableCustomSwagger2.java delete mode 100644 cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerAutoConfiguration.java delete mode 100644 cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerBeanPostProcessor.java delete mode 100644 cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerProperties.java delete mode 100644 cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerWebConfiguration.java delete mode 100644 cloud-common/cloud-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 cloud-gateway/src/main/java/com/muyu/gateway/config/SwaggerProvider.java rename cloud-gateway/src/main/java/com/muyu/gateway/filter/{log => }/AccessLogFilter.java (99%) delete mode 100644 cloud-gateway/src/main/java/com/muyu/gateway/handler/SwaggerHandler.java rename cloud-gateway/src/main/java/com/muyu/gateway/{filter/log => model}/AccessLog.java (95%) diff --git a/cloud-auth/pom.xml b/cloud-auth/pom.xml index 09495d2..0a76aae 100644 --- a/cloud-auth/pom.xml +++ b/cloud-auth/pom.xml @@ -52,6 +52,12 @@ cloud-common-security + + + com.muyu + cloud-common-api-doc + + diff --git a/cloud-common/cloud-common-swagger/pom.xml b/cloud-common/cloud-common-api-doc/pom.xml similarity index 52% rename from cloud-common/cloud-common-swagger/pom.xml rename to cloud-common/cloud-common-api-doc/pom.xml index b4804c8..261e760 100644 --- a/cloud-common/cloud-common-swagger/pom.xml +++ b/cloud-common/cloud-common-api-doc/pom.xml @@ -9,10 +9,10 @@ 4.0.0 - cloud-common-swagger + cloud-common-api-doc - cloud-common-swagger系统接口 + cloud-common-api-doc系统接口 @@ -23,22 +23,10 @@ spring-boot-starter-web - - + - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.5.0 - - - slf4j-api - org.slf4j - - + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter diff --git a/cloud-common/cloud-common-api-doc/src/main/java/com/muyu/common/api/doc/config/SpringDocConfig.java b/cloud-common/cloud-common-api-doc/src/main/java/com/muyu/common/api/doc/config/SpringDocConfig.java new file mode 100644 index 0000000..08d7bff --- /dev/null +++ b/cloud-common/cloud-common-api-doc/src/main/java/com/muyu/common/api/doc/config/SpringDocConfig.java @@ -0,0 +1,34 @@ +package com.muyu.common.api.doc.config; + +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SpringDocConfig { + + @Value("${spring.application.name}") + private String applicationName; + + private Info info(){ + return new Info() + .title(String.format("%S-微服务接口文档", applicationName)) + .description("微服务接口文档,根据此接口文档可以进行前后端功能对接/联调") + .version("v1.0.0"); + } + private ExternalDocumentation externalDocumentation() { + return new ExternalDocumentation() + .description("服务总站") + .url("https://gitea.qinmian.online"); + } + + @Bean + public OpenAPI springShopOpenAPI() { + return new OpenAPI() + .info(info()) + .externalDocs(externalDocumentation()); + } +} diff --git a/cloud-common/cloud-common-api-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/cloud-common/cloud-common-api-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..4b1b17b --- /dev/null +++ b/cloud-common/cloud-common-api-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.muyu.common.api.doc.config.SpringDocConfig \ No newline at end of file diff --git a/cloud-common/cloud-common-core/pom.xml b/cloud-common/cloud-common-core/pom.xml index cd7b8d1..57cf128 100644 --- a/cloud-common/cloud-common-core/pom.xml +++ b/cloud-common/cloud-common-core/pom.xml @@ -142,12 +142,6 @@ javax.annotation-api - - - io.swagger - swagger-annotations - - org.projectlombok diff --git a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/annotation/EnableCustomSwagger2.java b/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/annotation/EnableCustomSwagger2.java deleted file mode 100644 index 8b56946..0000000 --- a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/annotation/EnableCustomSwagger2.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.muyu.common.swagger.annotation; - -import com.muyu.common.swagger.config.SwaggerAutoConfiguration; -import org.springframework.context.annotation.Import; - -import java.lang.annotation.*; - -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Inherited -@Import({SwaggerAutoConfiguration.class}) -public @interface EnableCustomSwagger2 { - -} diff --git a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerAutoConfiguration.java b/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerAutoConfiguration.java deleted file mode 100644 index a58a108..0000000 --- a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerAutoConfiguration.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.muyu.common.swagger.config; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.*; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.ApiSelectorBuilder; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; - -@Configuration -@EnableSwagger2 -@EnableConfigurationProperties(SwaggerProperties.class) -@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true) -@Import({SwaggerBeanPostProcessor.class, SwaggerWebConfiguration.class}) -public class SwaggerAutoConfiguration { - /** - * 默认的排除路径,排除Spring Boot默认的错误处理路径和端点 - */ - private static final List DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**"); - - private static final String BASE_PATH = "/**"; - - @Bean - public Docket api (SwaggerProperties swaggerProperties) { - // base-path处理 - if (swaggerProperties.getBasePath().isEmpty()) { - swaggerProperties.getBasePath().add(BASE_PATH); - } - // noinspection unchecked - List> basePath = new ArrayList>(); - swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path))); - - // exclude-path处理 - if (swaggerProperties.getExcludePath().isEmpty()) { - swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH); - } - - List> excludePath = new ArrayList<>(); - swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path))); - - ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2).host(swaggerProperties.getHost()) - .apiInfo(apiInfo(swaggerProperties)).select() - .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage())); - - swaggerProperties.getBasePath().forEach(p -> builder.paths(PathSelectors.ant(p))); - swaggerProperties.getExcludePath().forEach(p -> builder.paths(PathSelectors.ant(p).negate())); - - return builder.build().securitySchemes(securitySchemes()).securityContexts(securityContexts()).pathMapping("/"); - } - - /** - * 安全模式,这里指定token通过Authorization头请求头传递 - */ - private List securitySchemes () { - List apiKeyList = new ArrayList(); - apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); - return apiKeyList; - } - - /** - * 安全上下文 - */ - private List securityContexts () { - List securityContexts = new ArrayList<>(); - securityContexts.add( - SecurityContext.builder() - .securityReferences(defaultAuth()) - .operationSelector(o -> o.requestMappingPattern().matches("/.*")) - .build()); - return securityContexts; - } - - /** - * 默认的全局鉴权策略 - * - * @return - */ - private List defaultAuth () { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - List securityReferences = new ArrayList<>(); - securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); - return securityReferences; - } - - private ApiInfo apiInfo (SwaggerProperties swaggerProperties) { - return new ApiInfoBuilder() - .title(swaggerProperties.getTitle()) - .description(swaggerProperties.getDescription()) - .license(swaggerProperties.getLicense()) - .licenseUrl(swaggerProperties.getLicenseUrl()) - .termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl()) - .contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail())) - .version(swaggerProperties.getVersion()) - .build(); - } -} diff --git a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerBeanPostProcessor.java b/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerBeanPostProcessor.java deleted file mode 100644 index 13d252f..0000000 --- a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerBeanPostProcessor.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.muyu.common.swagger.config; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.util.ReflectionUtils; -import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; -import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; -import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; - -import java.lang.reflect.Field; -import java.util.List; -import java.util.stream.Collectors; - -/** - * swagger 在 springboot 2.6.x 不兼容问题的处理 - * - * @author muyu - */ -public class SwaggerBeanPostProcessor implements 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/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerProperties.java b/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerProperties.java deleted file mode 100644 index a0dac64..0000000 --- a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerProperties.java +++ /dev/null @@ -1,296 +0,0 @@ -package com.muyu.common.swagger.config; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.ArrayList; -import java.util.List; - -@ConfigurationProperties("swagger") -public class SwaggerProperties { - /** - * 是否开启swagger - */ - private Boolean enabled; - - /** - * swagger会解析的包路径 - **/ - private String basePackage = ""; - - /** - * swagger会解析的url规则 - **/ - private List basePath = new ArrayList<>(); - - /** - * 在basePath基础上需要排除的url规则 - **/ - private List excludePath = new ArrayList<>(); - - /** - * 标题 - **/ - private String title = ""; - - /** - * 描述 - **/ - private String description = ""; - - /** - * 版本 - **/ - private String version = ""; - - /** - * 许可证 - **/ - private String license = ""; - - /** - * 许可证URL - **/ - private String licenseUrl = ""; - - /** - * 服务条款URL - **/ - private String termsOfServiceUrl = ""; - - /** - * host信息 - **/ - private String host = ""; - - /** - * 联系人信息 - */ - private Contact contact = new Contact(); - - /** - * 全局统一鉴权配置 - **/ - private Authorization authorization = new Authorization(); - - public Boolean getEnabled () { - return enabled; - } - - public void setEnabled (Boolean enabled) { - this.enabled = enabled; - } - - public String getBasePackage () { - return basePackage; - } - - public void setBasePackage (String basePackage) { - this.basePackage = basePackage; - } - - public List getBasePath () { - return basePath; - } - - public void setBasePath (List basePath) { - this.basePath = basePath; - } - - public List getExcludePath () { - return excludePath; - } - - public void setExcludePath (List excludePath) { - this.excludePath = excludePath; - } - - public String getTitle () { - return title; - } - - public void setTitle (String title) { - this.title = title; - } - - public String getDescription () { - return description; - } - - public void setDescription (String description) { - this.description = description; - } - - public String getVersion () { - return version; - } - - public void setVersion (String version) { - this.version = version; - } - - public String getLicense () { - return license; - } - - public void setLicense (String license) { - this.license = license; - } - - public String getLicenseUrl () { - return licenseUrl; - } - - public void setLicenseUrl (String licenseUrl) { - this.licenseUrl = licenseUrl; - } - - public String getTermsOfServiceUrl () { - return termsOfServiceUrl; - } - - public void setTermsOfServiceUrl (String termsOfServiceUrl) { - this.termsOfServiceUrl = termsOfServiceUrl; - } - - public String getHost () { - return host; - } - - public void setHost (String host) { - this.host = host; - } - - public Contact getContact () { - return contact; - } - - public void setContact (Contact contact) { - this.contact = contact; - } - - public Authorization getAuthorization () { - return authorization; - } - - public void setAuthorization (Authorization authorization) { - this.authorization = authorization; - } - - public static class Contact { - /** - * 联系人 - **/ - private String name = ""; - /** - * 联系人url - **/ - private String url = ""; - /** - * 联系人email - **/ - private String email = ""; - - public String getName () { - return name; - } - - public void setName (String name) { - this.name = name; - } - - public String getUrl () { - return url; - } - - public void setUrl (String url) { - this.url = url; - } - - public String getEmail () { - return email; - } - - public void setEmail (String email) { - this.email = email; - } - } - - public static class Authorization { - /** - * 鉴权策略ID,需要和SecurityReferences ID保持一致 - */ - private String name = ""; - - /** - * 需要开启鉴权URL的正则 - */ - private String authRegex = "^.*$"; - - /** - * 鉴权作用域列表 - */ - private List authorizationScopeList = new ArrayList<>(); - - private List tokenUrlList = new ArrayList<>(); - - public String getName () { - return name; - } - - public void setName (String name) { - this.name = name; - } - - public String getAuthRegex () { - return authRegex; - } - - public void setAuthRegex (String authRegex) { - this.authRegex = authRegex; - } - - public List getAuthorizationScopeList () { - return authorizationScopeList; - } - - public void setAuthorizationScopeList (List authorizationScopeList) { - this.authorizationScopeList = authorizationScopeList; - } - - public List getTokenUrlList () { - return tokenUrlList; - } - - public void setTokenUrlList (List tokenUrlList) { - this.tokenUrlList = tokenUrlList; - } - } - - public static class AuthorizationScope { - /** - * 作用域名称 - */ - private String scope = ""; - - /** - * 作用域描述 - */ - private String description = ""; - - public String getScope () { - return scope; - } - - public void setScope (String scope) { - this.scope = scope; - } - - public String getDescription () { - return description; - } - - public void setDescription (String description) { - this.description = description; - } - } -} diff --git a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerWebConfiguration.java b/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerWebConfiguration.java deleted file mode 100644 index 48d66f6..0000000 --- a/cloud-common/cloud-common-swagger/src/main/java/com/muyu/common/swagger/config/SwaggerWebConfiguration.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.muyu.common.swagger.config; - -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * swagger 资源映射路径 - * - * @author muyu - */ -public class SwaggerWebConfiguration implements WebMvcConfigurer { - @Override - public void addResourceHandlers (ResourceHandlerRegistry registry) { - /** swagger-ui 地址 */ - registry.addResourceHandler("/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); - } -} diff --git a/cloud-common/cloud-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/cloud-common/cloud-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index b15b749..0000000 --- a/cloud-common/cloud-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1,3 +0,0 @@ -# com.muyu.common.swagger.config.SwaggerAutoConfiguration -# com.muyu.common.swagger.config.SwaggerWebConfiguration -# com.muyu.common.swagger.config.SwaggerBeanPostProcessor diff --git a/cloud-common/pom.xml b/cloud-common/pom.xml index 5b03fd4..0d57a4e 100644 --- a/cloud-common/pom.xml +++ b/cloud-common/pom.xml @@ -13,7 +13,7 @@ cloud-common-core cloud-common-redis cloud-common-seata - cloud-common-swagger + cloud-common-api-doc cloud-common-security cloud-common-datascope cloud-common-datasource diff --git a/cloud-gateway/pom.xml b/cloud-gateway/pom.xml index ab86356..106c740 100644 --- a/cloud-gateway/pom.xml +++ b/cloud-gateway/pom.xml @@ -76,16 +76,10 @@ cloud-common-redis - - io.springfox - springfox-swagger-ui - ${swagger.fox.version} - - - io.springfox - springfox-swagger2 - ${swagger.fox.version} + com.github.xiaoymin + knife4j-gateway-spring-boot-starter + 4.5.0 diff --git a/cloud-gateway/src/main/java/com/muyu/gateway/config/SwaggerProvider.java b/cloud-gateway/src/main/java/com/muyu/gateway/config/SwaggerProvider.java deleted file mode 100644 index c048db8..0000000 --- a/cloud-gateway/src/main/java/com/muyu/gateway/config/SwaggerProvider.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.muyu.gateway.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.gateway.config.GatewayProperties; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.support.NameUtils; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.config.ResourceHandlerRegistry; -import org.springframework.web.reactive.config.WebFluxConfigurer; -import springfox.documentation.swagger.web.SwaggerResource; -import springfox.documentation.swagger.web.SwaggerResourcesProvider; - -import java.util.ArrayList; -import java.util.List; - -/** - * 聚合系统接口 - * - * @author muyu - */ -@Component -public class SwaggerProvider implements SwaggerResourcesProvider, WebFluxConfigurer { - /** - * Swagger2默认的url后缀 - */ - public static final String SWAGGER2URL = "/v2/api-docs"; - - /** - * 网关路由 - */ - @Lazy - @Autowired - private RouteLocator routeLocator; - - @Autowired - private GatewayProperties gatewayProperties; - - /** - * 聚合其他服务接口 - * - * @return - */ - @Override - public List get () { - List resourceList = new ArrayList<>(); - List routes = new ArrayList<>(); - // 获取网关中配置的route - routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); - gatewayProperties.getRoutes().stream() - .filter(routeDefinition -> routes - .contains(routeDefinition.getId())) - .forEach(routeDefinition -> routeDefinition.getPredicates().stream() - .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName())) - .filter(predicateDefinition -> !"cloud-auth".equalsIgnoreCase(routeDefinition.getId())) - .forEach(predicateDefinition -> resourceList - .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs() - .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL))))); - return resourceList; - } - - private SwaggerResource swaggerResource (String name, String location) { - SwaggerResource swaggerResource = new SwaggerResource(); - swaggerResource.setName(name); - swaggerResource.setLocation(location); - swaggerResource.setSwaggerVersion("2.0"); - return swaggerResource; - } - - @Override - public void addResourceHandlers (ResourceHandlerRegistry registry) { - /** swagger-ui 地址 */ - registry.addResourceHandler("/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); - } -} diff --git a/cloud-gateway/src/main/java/com/muyu/gateway/filter/log/AccessLogFilter.java b/cloud-gateway/src/main/java/com/muyu/gateway/filter/AccessLogFilter.java similarity index 99% rename from cloud-gateway/src/main/java/com/muyu/gateway/filter/log/AccessLogFilter.java rename to cloud-gateway/src/main/java/com/muyu/gateway/filter/AccessLogFilter.java index 6307684..9ceec12 100644 --- a/cloud-gateway/src/main/java/com/muyu/gateway/filter/log/AccessLogFilter.java +++ b/cloud-gateway/src/main/java/com/muyu/gateway/filter/AccessLogFilter.java @@ -1,8 +1,9 @@ -package com.muyu.gateway.filter.log; +package com.muyu.gateway.filter; import cn.hutool.core.date.LocalDateTimeUtil; import com.alibaba.nacos.common.utils.StringUtils; import com.muyu.common.core.constant.SecurityConstants; +import com.muyu.gateway.model.AccessLog; import com.muyu.gateway.utils.WebFrameworkUtils; import lombok.extern.log4j.Log4j2; import org.reactivestreams.Publisher; diff --git a/cloud-gateway/src/main/java/com/muyu/gateway/handler/SwaggerHandler.java b/cloud-gateway/src/main/java/com/muyu/gateway/handler/SwaggerHandler.java deleted file mode 100644 index c2a7b67..0000000 --- a/cloud-gateway/src/main/java/com/muyu/gateway/handler/SwaggerHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.muyu.gateway.handler; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; -import springfox.documentation.swagger.web.*; - -import java.util.Optional; - -@RestController -@RequestMapping("/swagger-resources") -public class SwaggerHandler { - private final SwaggerResourcesProvider swaggerResources; - @Autowired(required = false) - private SecurityConfiguration securityConfiguration; - @Autowired(required = false) - private UiConfiguration uiConfiguration; - - @Autowired - public SwaggerHandler (SwaggerResourcesProvider swaggerResources) { - this.swaggerResources = swaggerResources; - } - - @GetMapping("/configuration/security") - public Mono> securityConfiguration () { - return Mono.just(new ResponseEntity<>( - Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), - HttpStatus.OK)); - } - - @GetMapping("/configuration/ui") - public Mono> uiConfiguration () { - return Mono.just(new ResponseEntity<>( - Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); - } - - @SuppressWarnings("rawtypes") - @GetMapping("") - public Mono swaggerResources () { - return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); - } -} diff --git a/cloud-gateway/src/main/java/com/muyu/gateway/filter/log/AccessLog.java b/cloud-gateway/src/main/java/com/muyu/gateway/model/AccessLog.java similarity index 95% rename from cloud-gateway/src/main/java/com/muyu/gateway/filter/log/AccessLog.java rename to cloud-gateway/src/main/java/com/muyu/gateway/model/AccessLog.java index a6bb706..b52eb3e 100644 --- a/cloud-gateway/src/main/java/com/muyu/gateway/filter/log/AccessLog.java +++ b/cloud-gateway/src/main/java/com/muyu/gateway/model/AccessLog.java @@ -1,6 +1,5 @@ -package com.muyu.gateway.filter.log; +package com.muyu.gateway.model; -import com.alibaba.cloud.commons.io.StringBuilderWriter; import com.muyu.common.core.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Builder; @@ -9,7 +8,6 @@ import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.springframework.cloud.gateway.route.Route; -import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; import org.springframework.util.MultiValueMap; diff --git a/cloud-gateway/src/main/resources/bootstrap.yml b/cloud-gateway/src/main/resources/bootstrap.yml index 6cc9f34..73409c9 100644 --- a/cloud-gateway/src/main/resources/bootstrap.yml +++ b/cloud-gateway/src/main/resources/bootstrap.yml @@ -61,3 +61,15 @@ spring: namespace: ${nacos.namespace} data-type: json rule-type: gw-flow +knife4j: + gateway: + enabled: true + # 指定服务发现的模式聚合微服务文档,并且是默认`default`分组 + strategy: discover + discover: + enabled: true + # 指定版本号(Swagger2|OpenAPI3) + version : openapi3 + # 需要排除的微服务(eg:网关服务) + excluded-services: + - cloud-monitor diff --git a/cloud-modules/cloud-modules-file/pom.xml b/cloud-modules/cloud-modules-file/pom.xml index 11f3860..e151176 100644 --- a/cloud-modules/cloud-modules-file/pom.xml +++ b/cloud-modules/cloud-modules-file/pom.xml @@ -48,22 +48,16 @@ ${minio.version} - - - com.muyu cloud-common-system + - org.springframework.boot - spring-boot-starter-web + com.muyu + cloud-common-api-doc diff --git a/cloud-modules/cloud-modules-gen/pom.xml b/cloud-modules/cloud-modules-gen/pom.xml index 30b0d48..32c6fa3 100644 --- a/cloud-modules/cloud-modules-gen/pom.xml +++ b/cloud-modules/cloud-modules-gen/pom.xml @@ -41,13 +41,6 @@ spring-boot-starter-actuator - - - org.apache.velocity @@ -66,15 +59,10 @@ cloud-common-log - - - + - org.springframework.boot - spring-boot-starter-web + com.muyu + cloud-common-api-doc diff --git a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java index 4868540..da3eb43 100644 --- a/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java +++ b/cloud-modules/cloud-modules-gen/src/main/java/com/muyu/gen/CloudGenApplication.java @@ -2,7 +2,6 @@ package com.muyu.gen; import com.muyu.common.security.annotation.EnableCustomConfig; import com.muyu.common.security.annotation.EnableMyFeignClients; -//import com.muyu.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -12,7 +11,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @author muyu */ @EnableCustomConfig -//@EnableCustomSwagger2 @EnableMyFeignClients @SpringBootApplication public class CloudGenApplication { diff --git a/cloud-modules/cloud-modules-job/pom.xml b/cloud-modules/cloud-modules-job/pom.xml index 2676963..69ed8ee 100644 --- a/cloud-modules/cloud-modules-job/pom.xml +++ b/cloud-modules/cloud-modules-job/pom.xml @@ -41,13 +41,6 @@ spring-boot-starter-actuator - - - io.springfox - springfox-swagger-ui - ${swagger.fox.version} - - org.quartz-scheduler @@ -72,15 +65,10 @@ cloud-common-log - - - + - org.springframework.boot - spring-boot-starter-web + com.muyu + cloud-common-api-doc diff --git a/cloud-modules/cloud-modules-job/src/main/java/com/muyu/job/CloudJobApplication.java b/cloud-modules/cloud-modules-job/src/main/java/com/muyu/job/CloudJobApplication.java index fcb8d9b..b8342e3 100644 --- a/cloud-modules/cloud-modules-job/src/main/java/com/muyu/job/CloudJobApplication.java +++ b/cloud-modules/cloud-modules-job/src/main/java/com/muyu/job/CloudJobApplication.java @@ -2,7 +2,6 @@ package com.muyu.job; import com.muyu.common.security.annotation.EnableCustomConfig; import com.muyu.common.security.annotation.EnableMyFeignClients; -//import com.muyu.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -12,7 +11,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @author muyu */ @EnableCustomConfig -//@EnableCustomSwagger2 @EnableMyFeignClients @SpringBootApplication public class CloudJobApplication { diff --git a/cloud-modules/cloud-modules-system/pom.xml b/cloud-modules/cloud-modules-system/pom.xml index 43f0b1f..f1e7d98 100644 --- a/cloud-modules/cloud-modules-system/pom.xml +++ b/cloud-modules/cloud-modules-system/pom.xml @@ -41,13 +41,6 @@ spring-boot-starter-actuator - - - io.springfox - springfox-swagger-ui - ${swagger.fox.version} - - com.mysql @@ -72,21 +65,10 @@ cloud-common-log - - + com.muyu - cloud-common-swagger - --> - - - org.springframework.boot - spring-boot-starter-web - - - - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.6.0 + cloud-common-api-doc diff --git a/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/CloudSystemApplication.java b/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/CloudSystemApplication.java index 8d86380..b01e5db 100644 --- a/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/CloudSystemApplication.java +++ b/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/CloudSystemApplication.java @@ -2,7 +2,6 @@ package com.muyu.system; import com.muyu.common.security.annotation.EnableCustomConfig; import com.muyu.common.security.annotation.EnableMyFeignClients; -//import com.muyu.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/controller/SysConfigController.java b/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/controller/SysConfigController.java index 5d97890..3bced52 100644 --- a/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/controller/SysConfigController.java +++ b/cloud-modules/cloud-modules-system/src/main/java/com/muyu/system/controller/SysConfigController.java @@ -10,11 +10,13 @@ import com.muyu.common.security.annotation.RequiresPermissions; import com.muyu.common.security.utils.SecurityUtils; import com.muyu.system.domain.SysConfig; import com.muyu.system.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; @@ -25,6 +27,7 @@ import java.util.List; */ @RestController @RequestMapping("/config") +@Tag(name = "SysConfigController", description = "系统参数配置") public class SysConfigController extends BaseController { @Autowired @@ -35,6 +38,7 @@ public class SysConfigController extends BaseController { */ @RequiresPermissions("system:config:list") @GetMapping("/list") + @Operation(summary = "查询集合", description = "更新水果信息") public Result> list (SysConfig config) { startPage(); List list = configService.pageQuery(config); diff --git a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml index b57c6de..d31aae7 100644 --- a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml @@ -8,10 +8,6 @@ nacos: user-name: nacos password: nacos namespace: muyu-cloud -# swagger-ui custom path -springdoc: - swagger-ui: - path: /swagger-ui.html # Spring spring: @@ -53,4 +49,4 @@ spring: - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} logging: level: - com.muyu.system.mapper: DEBUG + com.muyu.system.mapper: DEBUG \ No newline at end of file diff --git a/init-file/cloud-system.sql b/init-file/cloud-system.sql index 9621a73..0eb4e54 100644 --- a/init-file/cloud-system.sql +++ b/init-file/cloud-system.sql @@ -303,7 +303,7 @@ INSERT INTO `sys_menu` VALUES (112, 'Nacos控制台', 2, 4, 'http://localhost:88 INSERT INTO `sys_menu` VALUES (113, 'Admin控制台', 2, 5, 'http://localhost:9100/login', '', '', 0, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', '2024-05-23 15:08:18', '', NULL, '服务监控菜单'); INSERT INTO `sys_menu` VALUES (114, '表单构建', 3, 1, 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2024-05-23 15:08:18', '', NULL, '表单构建菜单'); INSERT INTO `sys_menu` VALUES (115, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2024-05-23 15:08:18', '', NULL, '代码生成菜单'); -INSERT INTO `sys_menu` VALUES (116, '系统接口', 3, 3, 'http://localhost:8080/swagger-ui/index.html', '', '', 0, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2024-05-23 15:08:18', '', NULL, '系统接口菜单'); +INSERT INTO `sys_menu` VALUES (116, '系统接口', 3, 3, 'http://localhost:8080/doc.html', '', '', 0, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2024-05-23 15:08:18', '', NULL, '系统接口菜单'); INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'system/operlog/index', '', 1, 0, 'C', '0', '0', 'system:operlog:list', 'form', 'admin', '2024-05-23 15:08:18', '', NULL, '操作日志菜单'); INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'system/logininfor/index', '', 1, 0, 'C', '0', '0', 'system:logininfor:list', 'logininfor', 'admin', '2024-05-23 15:08:18', '', NULL, '登录日志菜单'); INSERT INTO `sys_menu` VALUES (1000, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2024-05-23 15:08:18', '', NULL, ''); diff --git a/init-file/nacos_config.zip b/init-file/nacos_config.zip index 437ec1999dc009ad473f4fb3546a7f2f1a5c4958..047c1aeedfe57b4b0c5375525d833108457c866b 100644 GIT binary patch delta 4823 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 NK2g}6&c1Qk`yZe6ZRY?0 delta 3822 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.1.0-M2 1.3.2 5.8.27 + 4.1.0 @@ -86,6 +87,13 @@ ${apm-logback.version} + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + ${knife4j-openapi3.version} + + jakarta.servlet @@ -184,7 +192,7 @@ com.muyu - cloud-common-swagger + cloud-common-api-doc ${muyu.version}