mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 10:57:13 +08:00 
			
		
		
		
	refactor: 适配 Jackson、API 文档(Knife4j:Spring Doc)自动配置
This commit is contained in:
		| @@ -17,10 +17,16 @@ | |||||||
|     <description>公共模块(存放公共工具类,公共配置等)</description> |     <description>公共模块(存放公共工具类,公共配置等)</description> | ||||||
|  |  | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <!-- ContiNew Starter 核心依赖 --> |         <!-- ContiNew Starter API 文档依赖 --> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>top.charles7c.continew</groupId> |             <groupId>top.charles7c.continew</groupId> | ||||||
|             <artifactId>continew-starter-core</artifactId> |             <artifactId>continew-starter-api-doc</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <!-- ContiNew Starter Jackson 依赖 --> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>top.charles7c.continew</groupId> | ||||||
|  |             <artifactId>continew-starter-json-jackson</artifactId> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|         <!-- ################ Spring Boot 相关 ################ --> |         <!-- ################ Spring Boot 相关 ################ --> | ||||||
| @@ -108,12 +114,6 @@ | |||||||
|             <artifactId>mica-ip2region</artifactId> |             <artifactId>mica-ip2region</artifactId> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|         <!-- Knife4j(前身是 swagger-bootstrap-ui,集 Swagger2 和 OpenAPI3 为一体的增强解决方案) --> |  | ||||||
|         <dependency> |  | ||||||
|             <groupId>com.github.xiaoymin</groupId> |  | ||||||
|             <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> |  | ||||||
|         </dependency> |  | ||||||
|  |  | ||||||
|         <!-- Redisson(不仅仅是一个 Redis Java 客户端) --> |         <!-- Redisson(不仅仅是一个 Redis Java 客户端) --> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.redisson</groupId> |             <groupId>org.redisson</groupId> | ||||||
|   | |||||||
| @@ -1,72 +0,0 @@ | |||||||
| /* |  | ||||||
|  * 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 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.map.MapUtil; |  | ||||||
| import cn.hutool.core.util.RandomUtil; |  | ||||||
|  |  | ||||||
| import top.charles7c.cnadmin.common.config.properties.ProjectProperties; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * 接口文档配置 |  | ||||||
|  * |  | ||||||
|  * @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 ProjectProperties projectProperties; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 接口文档配置 |  | ||||||
|      */ |  | ||||||
|     @Bean |  | ||||||
|     public OpenAPI openApi() { |  | ||||||
|         return new OpenAPI().info(new Info().title(projectProperties.getName() + " 接口文档") |  | ||||||
|             .version(String.format("v%s", projectProperties.getVersion())) |  | ||||||
|             .description(projectProperties.getDescription()).termsOfService(projectProperties.getUrl()) |  | ||||||
|             .contact(projectProperties.getAuthor()).license(projectProperties.getLicense())); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 根据 @Tag 上的排序,写入 x-order |  | ||||||
|      * |  | ||||||
|      * @return the global open api customizer |  | ||||||
|      */ |  | ||||||
|     @Bean |  | ||||||
|     public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { |  | ||||||
|         return openApi -> { |  | ||||||
|             if (null != openApi.getTags()) { |  | ||||||
|                 openApi.getTags() |  | ||||||
|                     .forEach(tag -> tag.setExtensions(MapUtil.of("x-order", RandomUtil.randomInt(0, 100)))); |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -60,10 +60,6 @@ public class WebMvcConfiguration implements WebMvcConfigurer { | |||||||
|             .setCachePeriod(0); |             .setCachePeriod(0); | ||||||
|         registry.addResourceHandler(localStorageProperties.getAvatarPattern()).addResourceLocations(avatarUtl) |         registry.addResourceHandler(localStorageProperties.getAvatarPattern()).addResourceLocations(avatarUtl) | ||||||
|             .setCachePeriod(0); |             .setCachePeriod(0); | ||||||
|         registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/"); |  | ||||||
|         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()); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -53,30 +53,6 @@ import top.charles7c.cnadmin.common.base.IBaseEnum; | |||||||
| @Configuration | @Configuration | ||||||
| public class JacksonConfiguration { | public class JacksonConfiguration { | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 针对时间类型:LocalDateTime、LocalDate、LocalTime 的序列化和反序列化 |  | ||||||
|      */ |  | ||||||
|     @Bean |  | ||||||
|     public Jackson2ObjectMapperBuilderCustomizer customizer() { |  | ||||||
|         return builder -> { |  | ||||||
|             JavaTimeModule javaTimeModule = new JavaTimeModule(); |  | ||||||
|             DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); |  | ||||||
|             javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter)); |  | ||||||
|             javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter)); |  | ||||||
|  |  | ||||||
|             DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN); |  | ||||||
|             javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter)); |  | ||||||
|             javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter)); |  | ||||||
|  |  | ||||||
|             DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN); |  | ||||||
|             javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter)); |  | ||||||
|             javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter)); |  | ||||||
|             builder.timeZone(TimeZone.getDefault()); |  | ||||||
|             builder.modules(javaTimeModule); |  | ||||||
|             log.info(">>>初始化 Jackson 序列化配置<<<"); |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 针对枚举基类 BaseEnum 的序列化和反序列化 |      * 针对枚举基类 BaseEnum 的序列化和反序列化 | ||||||
|      */ |      */ | ||||||
|   | |||||||
| @@ -36,55 +36,7 @@ import cn.hutool.extra.spring.SpringUtil; | |||||||
|  */ |  */ | ||||||
| @Data | @Data | ||||||
| @Component | @Component | ||||||
| @ConfigurationProperties(prefix = "project") | public class ProjectProperties extends top.charles7c.continew.starter.core.autoconfigure.ProjectProperties { | ||||||
| public class ProjectProperties { |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 名称 |  | ||||||
|      */ |  | ||||||
|     private String name; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 应用名称 |  | ||||||
|      */ |  | ||||||
|     private String appName; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 版本 |  | ||||||
|      */ |  | ||||||
|     private String version; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 描述 |  | ||||||
|      */ |  | ||||||
|     private String description; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * URL |  | ||||||
|      */ |  | ||||||
|     private String url; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 基本包 |  | ||||||
|      */ |  | ||||||
|     private String basePackage; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 作者信息 |  | ||||||
|      */ |  | ||||||
|     @NestedConfigurationProperty |  | ||||||
|     private Contact author; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 许可协议信息 |  | ||||||
|      */ |  | ||||||
|     @NestedConfigurationProperty |  | ||||||
|     private License license; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 是否为生产环境 |  | ||||||
|      */ |  | ||||||
|     private boolean production = false; |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 是否本地解析 IP 归属地 |      * 是否本地解析 IP 归属地 | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ project: | |||||||
|   # 基本包 |   # 基本包 | ||||||
|   basePackage: top.charles7c.cnadmin |   basePackage: top.charles7c.cnadmin | ||||||
|   ## 作者信息配置 |   ## 作者信息配置 | ||||||
|   author: |   contact: | ||||||
|     name: Charles7c |     name: Charles7c | ||||||
|     email: charles7c@126.com |     email: charles7c@126.com | ||||||
|     url: https://blog.charles7c.top/about/me |     url: https://blog.charles7c.top/about/me | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -40,7 +40,6 @@ | |||||||
|         <justauth.version>1.16.5</justauth.version> |         <justauth.version>1.16.5</justauth.version> | ||||||
|         <easyexcel.version>3.3.2</easyexcel.version> |         <easyexcel.version>3.3.2</easyexcel.version> | ||||||
|         <ip2region.version>3.1.5.1</ip2region.version> |         <ip2region.version>3.1.5.1</ip2region.version> | ||||||
|         <knife4j.version>4.3.0</knife4j.version> |  | ||||||
|         <redisson.version>3.24.3</redisson.version> |         <redisson.version>3.24.3</redisson.version> | ||||||
|         <easy-captcha.version>1.6.2</easy-captcha.version> |         <easy-captcha.version>1.6.2</easy-captcha.version> | ||||||
|         <hutool.version>5.8.22</hutool.version> |         <hutool.version>5.8.22</hutool.version> | ||||||
| @@ -139,15 +138,6 @@ | |||||||
|                 <version>${ip2region.version}</version> |                 <version>${ip2region.version}</version> | ||||||
|             </dependency> |             </dependency> | ||||||
|  |  | ||||||
|             <!-- Knife4j(前身是 swagger-bootstrap-ui,集 Swagger2 和 OpenAPI3 为一体的增强解决方案) --> |  | ||||||
|             <dependency> |  | ||||||
|                 <groupId>com.github.xiaoymin</groupId> |  | ||||||
|                 <artifactId>knife4j-dependencies</artifactId> |  | ||||||
|                 <version>${knife4j.version}</version> |  | ||||||
|                 <type>pom</type> |  | ||||||
|                 <scope>import</scope> |  | ||||||
|             </dependency> |  | ||||||
|  |  | ||||||
|             <!-- Redisson(不仅仅是一个 Redis Java 客户端) --> |             <!-- Redisson(不仅仅是一个 Redis Java 客户端) --> | ||||||
|             <dependency> |             <dependency> | ||||||
|                 <groupId>org.redisson</groupId> |                 <groupId>org.redisson</groupId> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user