提交 3c51373c 编写于 作者: 郝先瑞

refactor: 抽离 API 文档配置至公共模块 common-apidoc

上级 844c3cf5
......@@ -48,7 +48,10 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
......@@ -86,13 +89,13 @@
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<groupId>com.youlai</groupId>
<artifactId>common-seata</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-seata</artifactId>
<artifactId>common-apidoc</artifactId>
</dependency>
</dependencies>
......
package com.youlai.mall.oms.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger 配置
* <p>
* Spring Doc FAQ: https://springdoc.org/#faq
*
* @author haoxr
* @since 2023/2/17
*/
@Configuration
public class SwaggerConfig {
/**
* 认证服务地址
*/
@Value("${knife4j.oauth2.token-url}")
private String tokenUrl ;
/**
* 接口信息
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
new SecurityScheme()
.name("Authorization")
.type(SecurityScheme.Type.OAUTH2)
.flows(new OAuthFlows()
.password(
new io.swagger.v3.oas.models.security.OAuthFlow()
.tokenUrl(tokenUrl)
.refreshUrl(tokenUrl)
.scopes(
new Scopes()
.addString("all", "全部权限")
)
)
)
.scheme("bearer")
.in(SecurityScheme.In.HEADER)
.bearerFormat("JWT")
)
)
.info(new Info()
.title("订单服务")
.version("3.0.0")
.description("订单、购物车等接口")
.license(new License().name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0"))
);
}
}
......@@ -92,6 +92,11 @@
<artifactId>common-seata</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-apidoc</artifactId>
</dependency>
</dependencies>
<build>
......
package com.youlai.mall.pms.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger 配置
* <p>
* Spring Doc FAQ: https://springdoc.org/#faq
*
* @author haoxr
* @since 2023/2/17
*/
@Configuration
public class SwaggerConfig {
/**
* 认证服务地址
*/
@Value("${knife4j.oauth2.token-url}")
private String tokenUrl ;
/**
* 接口信息
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
new SecurityScheme()
.name("Authorization")
.type(SecurityScheme.Type.OAUTH2)
.flows(new OAuthFlows()
.password(
new io.swagger.v3.oas.models.security.OAuthFlow()
.tokenUrl(tokenUrl)
.refreshUrl(tokenUrl)
.scopes(
new Scopes()
.addString("all", "全部权限")
)
)
)
.scheme("bearer")
.in(SecurityScheme.In.HEADER)
.bearerFormat("JWT")
)
)
.info(new Info()
.title("商品服务")
.version("3.0.0")
.description("库存、分类、品牌、规格、参数等接口")
.license(new License().name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0"))
);
}
}
......@@ -79,13 +79,13 @@
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<groupId>com.youlai</groupId>
<artifactId>common-security</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-security</artifactId>
<artifactId>common-apidoc</artifactId>
</dependency>
</dependencies>
......
package com.youlai.mall.sms.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger 配置
* <p>
* Spring Doc FAQ: https://springdoc.org/#faq
*
* @author haoxr
* @since 2023/2/17
*/
@Configuration
public class SwaggerConfig {
/**
* 认证服务地址
*/
@Value("${knife4j.oauth2.token-url}")
private String tokenUrl ;
/**
* 接口信息
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
new SecurityScheme()
.name("Authorization")
.type(SecurityScheme.Type.OAUTH2)
.flows(new OAuthFlows()
.password(
new io.swagger.v3.oas.models.security.OAuthFlow()
.tokenUrl(tokenUrl)
.refreshUrl(tokenUrl)
.scopes(
new Scopes()
.addString("all", "全部权限")
)
)
)
.scheme("bearer")
.in(SecurityScheme.In.HEADER)
.bearerFormat("JWT")
)
)
.info(new Info()
.title("营销服务")
.version("3.0.0")
.description("广告、优惠券等接口")
.license(new License().name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0"))
);
}
}
......@@ -78,6 +78,11 @@
<artifactId>common-seata</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-apidoc</artifactId>
</dependency>
</dependencies>
<build>
......
package com.youlai.mall.ums.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger 配置
* <p>
* Spring Doc FAQ: https://springdoc.org/#faq
*
* @author haoxr
* @since 2023/2/17
*/
@Configuration
public class SwaggerConfig {
/**
* 认证服务地址
*/
@Value("${knife4j.oauth2.token-url}")
private String tokenUrl ;
/**
* 接口信息
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
new SecurityScheme()
.name("Authorization")
.type(SecurityScheme.Type.OAUTH2)
.flows(new OAuthFlows()
.password(
new io.swagger.v3.oas.models.security.OAuthFlow()
.tokenUrl(tokenUrl)
.refreshUrl(tokenUrl)
.scopes(
new Scopes()
.addString("all", "全部权限")
)
)
)
.scheme("bearer")
.in(SecurityScheme.In.HEADER)
.bearerFormat("JWT")
)
)
.info(new Info()
.title("会员服务")
.version("3.0.0")
.description("会员、地址等接口")
.license(new License().name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0"))
);
}
}
package com.youlai.auth.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger 配置
*
* @author haoxr
* @since 2023/2/17
*/
@Configuration
public class SwaggerConfig {
/**
* 认证服务地址
*/
@Value("${knife4j.oauth2.token-url}")
private String tokenUrl ;
/**
* 接口信息
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
new SecurityScheme()
.name("Authorization")
.type(SecurityScheme.Type.OAUTH2)
.flows(new OAuthFlows()
.password(
new io.swagger.v3.oas.models.security.OAuthFlow()
.tokenUrl(tokenUrl)
.refreshUrl(tokenUrl)
.scopes(
new Scopes()
.addString("all", "全部权限")
)
)
)
.scheme("bearer")
.in(SecurityScheme.In.HEADER)
.bearerFormat("JWT")
)
)
.info(new Info()
.title("认证中心")
.version("3.0.0")
.description("认证接口")
.license(new License().name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0"))
);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.youlai</groupId>
<artifactId>youlai-mall</artifactId>
<version>3.0.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>common-apidoc</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 接口文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.youlai.common.apidoc.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* API 信息属性
*
* @author haoxr
* @since 2023/10/30
*/
@Data
@ConfigurationProperties(prefix = "springdoc.info")
public class ApiDocInfoProperties {
/**
* API文档标题
*/
private String title;
/**
* API文档版本
*/
private String version;
/**
* API文档描述
*/
private String description;
/**
* 联系人信息
*/
private Contact contact;
/**
* 许可证信息
*/
private License license;
@Data
public static class Contact {
/**
* 联系人姓名
*/
private String name;
/**
* 联系人主页
*/
private String url;
/**
* 联系人邮箱
*/
private String email;
}
/**
* 许可证信息
*/
@Data
public static class License{
/**
* 许可证名称
*/
private String name;
/**
* 许可证URL
*/
private String url;
}
}
package com.youlai.system.config;
package com.youlai.common.apidoc.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
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.OAuthFlow;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.Scopes;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
/**
* Swagger 配置
* OpenAPI 配置类
* <p>
* 基于 OpenAPI 3.0 规范 + SpringDoc 实现 + knife4j 增强
*
* @author haoxr
* @since 3.0.0
*/
@Configuration
public class SwaggerConfig {
@RequiredArgsConstructor
@EnableConfigurationProperties(ApiDocInfoProperties.class)
public class OpenApiConfig {
/**
* 认证服务地址
* OAuth2 认证 endpoint
*/
@Value("${knife4j.oauth2.token-url}")
private String tokenUrl ;
@Value("${spring.security.oauth2.authorizationserver.token-uri}")
private String tokenUrl;
/**
* 接口信息
* API 文档信息属性
*/
private final ApiDocInfoProperties apiDocInfoProperties;
/**
* OpenAPI 配置(元信息、安全协议)
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
.addSecuritySchemes(HttpHeaders.AUTHORIZATION,
new SecurityScheme()
.name("Authorization")
// OAuth2 授权模式
.type(SecurityScheme.Type.OAUTH2)
.name(HttpHeaders.AUTHORIZATION)
.flows(new OAuthFlows()
.password(
new io.swagger.v3.oas.models.security.OAuthFlow()
new OAuthFlow()
.tokenUrl(tokenUrl)
.refreshUrl(tokenUrl)
.scopes(
new Scopes()
.addString("all", "全部权限")
)
)
)
.scheme("bearer")
// 安全模式使用Bearer令牌(即JWT)
.in(SecurityScheme.In.HEADER)
.scheme("Bearer")
.bearerFormat("JWT")
)
)
// 接口全局添加 Authorization 参数
.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
// 接口文档信息(不重要)
.info(new Info()
.title("系统服务")
.version("3.0.0")
.description("用户、角色、菜单、部门、字典等接口")
.license(new License().name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0"))
);
.title(apiDocInfoProperties.getTitle())
.version(apiDocInfoProperties.getVersion())
.description(apiDocInfoProperties.getDescription())
.contact(new Contact()
.name(apiDocInfoProperties.getContact().getName())
.url(apiDocInfoProperties.getContact().getUrl())
.email(apiDocInfoProperties.getContact().getEmail())
)
.license(new License().name(apiDocInfoProperties.getLicense().getName())
.url(apiDocInfoProperties.getLicense().getUrl())
));
}
}
......@@ -12,6 +12,7 @@
<artifactId>common-web</artifactId>
<dependencies>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-core</artifactId>
......@@ -48,12 +49,6 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
......@@ -69,12 +64,6 @@
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 接口文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-security</artifactId>
......
......@@ -14,6 +14,7 @@
<packaging>pom</packaging>
<modules>
<module>common-apidoc</module>
<module>common-core</module>
<module>common-redis</module>
<module>common-web</module>
......
......@@ -112,6 +112,11 @@
<artifactId>common-security</artifactId>
</dependency>
<dependency>
<groupId>com.youlai</groupId>
<artifactId>common-apidoc</artifactId>
</dependency>
</dependencies>
<build>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册