新增:新增接口文档配置(基于 Spring Doc OpenAPI,使用 Knife4j 作为增强解决方案)

This commit is contained in:
2022-12-11 21:56:18 +08:00
parent 1e5eaab9d3
commit 79891e8b5a
13 changed files with 366 additions and 44 deletions

View File

@@ -0,0 +1,77 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.charles7c.cnadmin.common.config;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import cn.hutool.core.util.RandomUtil;
import top.charles7c.cnadmin.common.config.properties.ContinewAdminProperties;
/**
* 接口文档配置
*
* @author Charles7c
* @since 2022/12/11 19:14
*/
@Configuration
@RequiredArgsConstructor
@ConditionalOnProperty(name = "springdoc.swagger-ui.enabled", havingValue = "true", matchIfMissing = true)
public class SwaggerConfiguration {
private final ContinewAdminProperties continewAdminProperties;
/**
* 接口文档配置
*/
@Bean
public OpenAPI openAPI() {
return new OpenAPI().info(
new Info().title(continewAdminProperties.getName() + " 接口文档").version(continewAdminProperties.getVersion())
.description(continewAdminProperties.getDescription()).termsOfService(continewAdminProperties.getUrl())
.contact(continewAdminProperties.getAuthor()).license(continewAdminProperties.getLicense()));
}
/**
* 根据 @Tag 上的排序,写入 x-order
*
* @return the global open api customizer
*/
@Bean
public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
return openApi -> {
if (openApi.getTags() != null) {
openApi.getTags().forEach(tag -> {
Map<String, Object> map = new HashMap<>();
map.put("x-order", RandomUtil.randomInt(0, 100));
tag.setExtensions(map);
});
}
};
}
}

View File

@@ -0,0 +1,70 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.charles7c.cnadmin.common.config;
import java.util.concurrent.TimeUnit;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Web MVC 配置
*
* @author Charles7c
* @since 2022/12/11 19:40
*/
@EnableWebMvc
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
/**
* 静态资源处理器配置
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());
}
/**
* 跨域配置
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setMaxAge(1800L);
// 允许跨域配置
config.addAllowedOriginPattern("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}

View File

@@ -0,0 +1,75 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package top.charles7c.cnadmin.common.config.properties;
import lombok.Data;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.License;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.stereotype.Component;
/**
* 项目配置属性
*
* @author Charles7c
* @since 2022/12/11 19:26
*/
@Data
@Component
@ConfigurationProperties(prefix = "continew-admin")
public class ContinewAdminProperties {
/**
* 名称
*/
private String name;
/**
* 应用名称
*/
private String appName;
/**
* 版本
*/
private String version;
/**
* 描述
*/
private String description;
/**
* URL
*/
private String url;
/**
* 作者信息
*/
@NestedConfigurationProperty
private Contact author;
/**
* 许可协议信息
*/
@NestedConfigurationProperty
private License license;
}

View File

@@ -23,6 +23,8 @@ import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.http.HttpStatus;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -35,19 +37,29 @@ import com.fasterxml.jackson.annotation.JsonFormat;
*/
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Schema(description = "响应信息")
public class R<V extends Serializable> implements Serializable {
private static final long serialVersionUID = 1L;
/** 是否成功 */
@Schema(description = "是否成功")
private boolean success;
/** 状态码 */
@Schema(description = "状态码")
private int code;
/** 状态信息 */
@Schema(description = "状态信息")
private String msg;
/** 返回数据 */
@Schema(description = "返回数据")
private V data;
/** 时间戳 */
@Schema(description = "时间戳")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime timestamp = LocalDateTime.now();