mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 22:57:17 +08:00 
			
		
		
		
	升级:升级 MyBatis Plus 版本为 3.5.3.1,升级 Hutool 版本为 5.8.11(已将 ServletUtils.getHeadersMap(HttpServletResponse) PR 到了 Hutool,详情见:dromara/hutool#2828)
This commit is contained in:
		| @@ -77,7 +77,7 @@ yarn dev | |||||||
| | [Undertow](https://undertow.io/)                             | 2.2.22.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 | | | [Undertow](https://undertow.io/)                             | 2.2.22.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 | | ||||||
| | [Sa-Token + JWT](https://sa-token.dev33.cn/)                 | 1.33.0       | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。             | | | [Sa-Token + JWT](https://sa-token.dev33.cn/)                 | 1.33.0       | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。             | | ||||||
| | [MariaDB](https://mariadb.org/)                              | 10.10.2      | MySQL 的一个分支,主要由开源社区在维护,完全兼容 MySQL,包括 API 和命令行,能轻松成为 MySQL 的代替品。 | | | [MariaDB](https://mariadb.org/)                              | 10.10.2      | MySQL 的一个分支,主要由开源社区在维护,完全兼容 MySQL,包括 API 和命令行,能轻松成为 MySQL 的代替品。 | | ||||||
| | [MyBatis Plus](https://baomidou.com/)                        | 3.5.2        | MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。 | | | [MyBatis Plus](https://baomidou.com/)                        | 3.5.3.1      | MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。 | | ||||||
| | [dynamic-datasource-spring-boot-starter](https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611) | 3.6.1        | 基于 Spring Boot 的快速集成多数据源的启动器。                | | | [dynamic-datasource-spring-boot-starter](https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611) | 3.6.1        | 基于 Spring Boot 的快速集成多数据源的启动器。                | | ||||||
| | Hikari                                                       | 4.0.3        | JDBC 连接池,号称 “史上最快连接池”,SpringBoot 在 2.0 之后,采用的默认数据库连接池就是 Hikari。 | | | Hikari                                                       | 4.0.3        | JDBC 连接池,号称 “史上最快连接池”,SpringBoot 在 2.0 之后,采用的默认数据库连接池就是 Hikari。 | | ||||||
| | [mysql-connector-j](https://dev.mysql.com/doc/connector-j/8.0/en/) | 8.0.31       | MySQL Java 驱动。                                            | | | [mysql-connector-j](https://dev.mysql.com/doc/connector-j/8.0/en/) | 8.0.31       | MySQL Java 驱动。                                            | | ||||||
| @@ -87,7 +87,7 @@ yarn dev | |||||||
| | [Redisson](https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D) | 3.19.0       | 不仅仅是一个 Redis Java 客户端,同其他 Redis Java 客户端有着很大的区别,相比之下其他客户端提供的功能还仅仅停留在作为数据库驱动层面上,比如仅针对 Redis 提供连接方式,发送命令和处理返回结果等。而 Redisson 充分的利用了 Redis 键值数据库提供的一系列优势,基于 Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 | | | [Redisson](https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D) | 3.19.0       | 不仅仅是一个 Redis Java 客户端,同其他 Redis Java 客户端有着很大的区别,相比之下其他客户端提供的功能还仅仅停留在作为数据库驱动层面上,比如仅针对 Redis 提供连接方式,发送命令和处理返回结果等。而 Redisson 充分的利用了 Redis 键值数据库提供的一系列优势,基于 Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 | | ||||||
| | Easy Captcha                                                 | 1.6.2        | Java 图形验证码,支持 gif、中文、算术等类型,可用于 Java Web、JavaSE 等项目。 | | | Easy Captcha                                                 | 1.6.2        | Java 图形验证码,支持 gif、中文、算术等类型,可用于 Java Web、JavaSE 等项目。 | | ||||||
| | [Knife4j](https://doc.xiaominfo.com/)                        | 4.0.0        | 前身是 swagger-bootstrap-ui,集 Swagger2 和 OpenAPI3 为一体的增强解决方案。本项目使用的是 [knife4j-openapi3-spring-boot-starter](https://gitee.com/xiaoym/swagger-bootstrap-ui-demo/tree/master/knife4j-springdoc-openapi-demo) 基于 OpenAPI3 规范,在 Spring Boot < 3.0.0-M1 的单体架构下可以直接引用此 starter,该模块包含了 UI 部分,底层基于 springdoc-openapi 项目。 | | | [Knife4j](https://doc.xiaominfo.com/)                        | 4.0.0        | 前身是 swagger-bootstrap-ui,集 Swagger2 和 OpenAPI3 为一体的增强解决方案。本项目使用的是 [knife4j-openapi3-spring-boot-starter](https://gitee.com/xiaoym/swagger-bootstrap-ui-demo/tree/master/knife4j-springdoc-openapi-demo) 基于 OpenAPI3 规范,在 Spring Boot < 3.0.0-M1 的单体架构下可以直接引用此 starter,该模块包含了 UI 部分,底层基于 springdoc-openapi 项目。 | | ||||||
| | [Hutool](https://www.hutool.cn/)                             | 5.8.10       | 小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 | | | [Hutool](https://www.hutool.cn/)                             | 5.8.11       | 小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 | | ||||||
| | [Lombok](https://projectlombok.org/)                         | 1.18.24      | 在 Java 开发过程中用注解的方式,简化了 JavaBean 的编写,避免了冗余和样板式代码,让编写的类更加简洁。 | | | [Lombok](https://projectlombok.org/)                         | 1.18.24      | 在 Java 开发过程中用注解的方式,简化了 JavaBean 的编写,避免了冗余和样板式代码,让编写的类更加简洁。 | | ||||||
|  |  | ||||||
| ## 项目结构 | ## 项目结构 | ||||||
| @@ -188,7 +188,7 @@ continew-admin  # 全局通用项目配置及依赖版本管理 | |||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| continew-admin | continew-admin | ||||||
|   └─ continew-admin-ui       # 前端项目 |   └─ continew-admin-ui      # 前端项目 | ||||||
|     ├─ src |     ├─ src | ||||||
|     │  ├─ api               # 请求接口 |     │  ├─ api               # 请求接口 | ||||||
|     │  │  └─ auth             # 认证模块 |     │  │  └─ auth             # 认证模块 | ||||||
|   | |||||||
| @@ -75,21 +75,4 @@ public class ServletUtils { | |||||||
|         UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); |         UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); | ||||||
|         return userAgent.getBrowser().getName() + " " + userAgent.getVersion(); |         return userAgent.getBrowser().getName() + " " + userAgent.getVersion(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 获取响应所有的头(header)信息 |  | ||||||
|      * |  | ||||||
|      * @param response |  | ||||||
|      *            响应对象{@link HttpServletResponse} |  | ||||||
|      * @return header值 |  | ||||||
|      */ |  | ||||||
|     public static Map<String, Collection<String>> getHeaderMap(HttpServletResponse response) { |  | ||||||
|         final Map<String, Collection<String>> headerMap = new HashMap<>(); |  | ||||||
|  |  | ||||||
|         final Collection<String> names = response.getHeaderNames(); |  | ||||||
|         for (String name : names) { |  | ||||||
|             headerMap.put(name, response.getHeaders(name)); |  | ||||||
|         } |  | ||||||
|         return headerMap; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -27,7 +27,6 @@ import lombok.extern.slf4j.Slf4j; | |||||||
|  |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
|  |  | ||||||
| import org.jetbrains.annotations.NotNull; |  | ||||||
| import org.springframework.core.annotation.AnnotationUtils; | import org.springframework.core.annotation.AnnotationUtils; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| import org.springframework.web.method.HandlerMethod; | import org.springframework.web.method.HandlerMethod; | ||||||
| @@ -68,8 +67,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|     private final LogProperties operationLogProperties; |     private final LogProperties operationLogProperties; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, |     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { | ||||||
|         @NotNull Object handler) { |  | ||||||
|         if (!checkIsNeedRecord(handler, request)) { |         if (!checkIsNeedRecord(handler, request)) { | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
| @@ -80,8 +78,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void afterCompletion(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, |     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { | ||||||
|         @NotNull Object handler, Exception e) { |  | ||||||
|         // 记录请求耗时及异常信息 |         // 记录请求耗时及异常信息 | ||||||
|         SysLog sysLog = this.logElapsedTimeAndException(); |         SysLog sysLog = this.logElapsedTimeAndException(); | ||||||
|         if (sysLog == null) { |         if (sysLog == null) { | ||||||
| @@ -142,7 +139,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|      * @param handler |      * @param handler | ||||||
|      *            处理器 |      *            处理器 | ||||||
|      */ |      */ | ||||||
|     private void logDescription(@NotNull SysLog sysLog, Object handler) { |     private void logDescription(SysLog sysLog, Object handler) { | ||||||
|         HandlerMethod handlerMethod = (HandlerMethod)handler; |         HandlerMethod handlerMethod = (HandlerMethod)handler; | ||||||
|         Operation methodOperation = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Operation.class); |         Operation methodOperation = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Operation.class); | ||||||
|         Log methodLog = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Log.class); |         Log methodLog = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Log.class); | ||||||
| @@ -165,7 +162,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|      * @param request |      * @param request | ||||||
|      *            请求对象 |      *            请求对象 | ||||||
|      */ |      */ | ||||||
|     private void logRequest(@NotNull SysLog sysLog, @NotNull HttpServletRequest request) { |     private void logRequest(SysLog sysLog, HttpServletRequest request) { | ||||||
|         sysLog.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString() |         sysLog.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString() | ||||||
|             : request.getRequestURL().append("?").append(request.getQueryString()).toString()); |             : request.getRequestURL().append("?").append(request.getQueryString()).toString()); | ||||||
|         sysLog.setRequestMethod(request.getMethod()); |         sysLog.setRequestMethod(request.getMethod()); | ||||||
| @@ -191,7 +188,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|      */ |      */ | ||||||
|     private void logResponse(SysLog sysLog, HttpServletResponse response) { |     private void logResponse(SysLog sysLog, HttpServletResponse response) { | ||||||
|         sysLog.setStatusCode(response.getStatus()); |         sysLog.setStatusCode(response.getStatus()); | ||||||
|         sysLog.setResponseHeader(this.desensitize(ServletUtils.getHeaderMap(response))); |         sysLog.setResponseHeader(this.desensitize(ServletUtil.getHeadersMap(response))); | ||||||
|         // 响应体(不记录非 JSON 响应数据) |         // 响应体(不记录非 JSON 响应数据) | ||||||
|         String responseBody = this.getResponseBody(response); |         String responseBody = this.getResponseBody(response); | ||||||
|         if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) { |         if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) { | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -46,7 +46,7 @@ limitations under the License. | |||||||
|         <sa-token.version>1.33.0</sa-token.version> |         <sa-token.version>1.33.0</sa-token.version> | ||||||
|  |  | ||||||
|         <!-- ### 持久层相关 ### --> |         <!-- ### 持久层相关 ### --> | ||||||
|         <mybatis-plus.version>3.5.2</mybatis-plus.version> |         <mybatis-plus.version>3.5.3.1</mybatis-plus.version> | ||||||
|         <dynamic-ds.version>3.6.1</dynamic-ds.version> |         <dynamic-ds.version>3.6.1</dynamic-ds.version> | ||||||
|         <p6spy.version>3.9.1</p6spy.version> |         <p6spy.version>3.9.1</p6spy.version> | ||||||
|  |  | ||||||
| @@ -55,7 +55,7 @@ limitations under the License. | |||||||
|         <knife4j.version>4.0.0</knife4j.version> |         <knife4j.version>4.0.0</knife4j.version> | ||||||
|         <redisson.version>3.19.0</redisson.version> |         <redisson.version>3.19.0</redisson.version> | ||||||
|         <easy-captcha.version>1.6.2</easy-captcha.version> |         <easy-captcha.version>1.6.2</easy-captcha.version> | ||||||
|         <hutool.version>5.8.10</hutool.version> |         <hutool.version>5.8.11</hutool.version> | ||||||
|  |  | ||||||
|         <!-- ### 基础环境相关 ### --> |         <!-- ### 基础环境相关 ### --> | ||||||
|         <revision>0.0.1-SNAPSHOT</revision> |         <revision>0.0.1-SNAPSHOT</revision> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user