From b463c5971ece8d536da78b8dfa3eb2c7d42a44c3 Mon Sep 17 00:00:00 2001
From: bunny <1319900154@qq.com>
Date: Thu, 17 Jul 2025 22:29:00 +0800
Subject: [PATCH] =?UTF-8?q?:tada:=20init-common=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
auth-common/pom.xml | 81 +++++++
.../ControllerStringParamTrimConfig.java | 50 ++++
.../common/config/MyBatisPlusFieldConfig.java | 44 ++++
.../auth/common/config/MybatisPlusConfig.java | 35 +++
.../config/ThreadLocalCleanupInterceptor.java | 23 ++
.../com/auth/common/config/WebConfig.java | 26 ++
.../com/auth/common/context/BaseContext.java | 29 +++
.../exception/AuthenticSecurityException.java | 47 ++++
.../exception/GlobalExceptionHandler.java | 102 ++++++++
.../exception/MyAuthenticationException.java | 19 ++
.../auth/common/model/bo/package-info.java | 1 +
.../auth/common/model/common/BaseEntity.java | 48 ++++
.../com/auth/common/model/common/BaseVo.java | 23 ++
.../model/common/result/PageResult.java | 37 +++
.../common/model/common/result/Result.java | 174 ++++++++++++++
.../model/common/result/ResultCodeEnum.java | 90 +++++++
.../model/constant/FileStorageConstant.java | 35 +++
.../auth/common/model/constant/FileType.java | 12 +
.../model/constant/LocalDateTimeConstant.java | 11 +
.../model/constant/RedisUserConstant.java | 67 ++++++
.../constant/SecurityConfigConstant.java | 12 +
.../common/model/constant/UserConstant.java | 12 +
.../com/auth/common/model/dto/DictDto.java | 49 ++++
.../auth/common/model/dto/package-info.java | 1 +
.../auth/common/model/entity/DictEntity.java | 50 ++++
.../common/model/entity/package-info.java | 1 +
.../auth/common/model/enums/LoginEnums.java | 18 ++
.../auth/common/model/value/package-info.java | 8 +
.../java/com/auth/common/model/vo/DictVo.java | 48 ++++
.../export/ExcelZipExportStrategy.java | 35 +++
.../common/pattern/export/ExportStrategy.java | 8 +
.../pattern/export/JsonZipExportStrategy.java | 23 ++
.../pattern/processor/TreeProcessor.java | 18 ++
.../java/com/auth/common/utils/FileUtil.java | 55 +++++
.../com/auth/common/utils/JwtTokenUtil.java | 225 ++++++++++++++++++
.../com/auth/common/utils/ResponseUtil.java | 26 ++
36 files changed, 1543 insertions(+)
create mode 100644 auth-common/pom.xml
create mode 100644 auth-common/src/main/java/com/auth/common/config/ControllerStringParamTrimConfig.java
create mode 100644 auth-common/src/main/java/com/auth/common/config/MyBatisPlusFieldConfig.java
create mode 100644 auth-common/src/main/java/com/auth/common/config/MybatisPlusConfig.java
create mode 100644 auth-common/src/main/java/com/auth/common/config/ThreadLocalCleanupInterceptor.java
create mode 100644 auth-common/src/main/java/com/auth/common/config/WebConfig.java
create mode 100644 auth-common/src/main/java/com/auth/common/context/BaseContext.java
create mode 100644 auth-common/src/main/java/com/auth/common/exception/AuthenticSecurityException.java
create mode 100644 auth-common/src/main/java/com/auth/common/exception/GlobalExceptionHandler.java
create mode 100644 auth-common/src/main/java/com/auth/common/exception/MyAuthenticationException.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/bo/package-info.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/common/BaseEntity.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/common/BaseVo.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/common/result/PageResult.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/common/result/Result.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/common/result/ResultCodeEnum.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/constant/FileStorageConstant.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/constant/FileType.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/constant/LocalDateTimeConstant.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/constant/RedisUserConstant.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/constant/SecurityConfigConstant.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/constant/UserConstant.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/dto/DictDto.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/dto/package-info.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/entity/DictEntity.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/entity/package-info.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/enums/LoginEnums.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/value/package-info.java
create mode 100644 auth-common/src/main/java/com/auth/common/model/vo/DictVo.java
create mode 100644 auth-common/src/main/java/com/auth/common/pattern/export/ExcelZipExportStrategy.java
create mode 100644 auth-common/src/main/java/com/auth/common/pattern/export/ExportStrategy.java
create mode 100644 auth-common/src/main/java/com/auth/common/pattern/export/JsonZipExportStrategy.java
create mode 100644 auth-common/src/main/java/com/auth/common/pattern/processor/TreeProcessor.java
create mode 100644 auth-common/src/main/java/com/auth/common/utils/FileUtil.java
create mode 100644 auth-common/src/main/java/com/auth/common/utils/JwtTokenUtil.java
create mode 100644 auth-common/src/main/java/com/auth/common/utils/ResponseUtil.java
diff --git a/auth-common/pom.xml b/auth-common/pom.xml
new file mode 100644
index 0000000..737f179
--- /dev/null
+++ b/auth-common/pom.xml
@@ -0,0 +1,81 @@
+
+ 4.0.0
+
+ com.auth
+ auth-server
+ 0.0.1
+
+
+ auth-common
+ jar
+ 0.0.1
+ common
+ 公共的配置和实体类
+
+
+ UTF-8
+ 17
+ 17
+ 17
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+
+
+ com.mysql
+ mysql-connector-j
+
+
+ com.zaxxer
+ HikariCP
+
+
+
+
+ io.jsonwebtoken
+ jjwt
+
+
+
+
+ com.alibaba
+ easyexcel
+
+
+
+
+ com.alibaba.fastjson2
+ fastjson2
+
+
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-jakarta-spring-boot-starter
+
+
+
diff --git a/auth-common/src/main/java/com/auth/common/config/ControllerStringParamTrimConfig.java b/auth-common/src/main/java/com/auth/common/config/ControllerStringParamTrimConfig.java
new file mode 100644
index 0000000..4a7e97b
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/config/ControllerStringParamTrimConfig.java
@@ -0,0 +1,50 @@
+package com.auth.common.config;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import java.io.IOException;
+
+/**
+ * 去除前端传递的空格
+ */
+@ControllerAdvice
+public class ControllerStringParamTrimConfig {
+
+ /**
+ * 创建 String trim 编辑器
+ * 构造方法中 boolean 参数含义为如果是空白字符串,是否转换为null
+ * 即如果为true,那么 " " 会被转换为 null,否者为 ""
+ */
+ @InitBinder
+ public void initBinder(WebDataBinder binder) {
+ StringTrimmerEditor propertyEditor = new StringTrimmerEditor(false);
+ // 为 String 类对象注册编辑器
+ binder.registerCustomEditor(String.class, propertyEditor);
+ }
+
+ @Bean
+ public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+ return jacksonObjectMapperBuilder -> {
+ // 为 String 类型自定义反序列化操作
+ jacksonObjectMapperBuilder
+ .deserializerByType(String.class, new StdScalarDeserializer(String.class) {
+ @Override
+ public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
+ // // 去除全部空格
+ // return StringUtils.trimAllWhitespace(jsonParser.getValueAsString());
+
+ // 仅去除前后空格
+ return jsonParser.getValueAsString().trim();
+ }
+ });
+ };
+ }
+}
\ No newline at end of file
diff --git a/auth-common/src/main/java/com/auth/common/config/MyBatisPlusFieldConfig.java b/auth-common/src/main/java/com/auth/common/config/MyBatisPlusFieldConfig.java
new file mode 100644
index 0000000..c204ba6
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/config/MyBatisPlusFieldConfig.java
@@ -0,0 +1,44 @@
+package com.auth.common.config;
+
+import com.auth.common.context.BaseContext;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+
+/**
+ * 配置MP在修改和新增时的操作
+ */
+@Component
+public class MyBatisPlusFieldConfig implements MetaObjectHandler {
+
+ /**
+ * 使用mp做添加操作时候,这个方法执行
+ */
+ @Override
+ public void insertFill(MetaObject metaObject) {
+ // 设置属性值
+ this.strictInsertFill(metaObject, "isDeleted", Integer.class, 0);
+ this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
+ this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
+ if (BaseContext.getUsername() != null) {
+ this.setFieldValByName("createUser", BaseContext.getUserId(), metaObject);
+ this.setFieldValByName("updateUser", BaseContext.getUserId(), metaObject);
+ } else {
+ this.setFieldValByName("createUser", 0L, metaObject);
+ this.setFieldValByName("updateUser", BaseContext.getUserId(), metaObject);
+ }
+ }
+
+ /**
+ * 使用mp做修改操作时候,这个方法执行
+ */
+ @Override
+ public void updateFill(MetaObject metaObject) {
+ if (BaseContext.getUserId() != null) {
+ this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
+ this.setFieldValByName("updateUser", BaseContext.getUserId(), metaObject);
+ }
+ }
+}
diff --git a/auth-common/src/main/java/com/auth/common/config/MybatisPlusConfig.java b/auth-common/src/main/java/com/auth/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..ebd027b
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/config/MybatisPlusConfig.java
@@ -0,0 +1,35 @@
+package com.auth.common.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@EnableTransactionManagement
+@Configuration
+public class MybatisPlusConfig {
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ // 拦截器
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+
+ // 使用分页插件
+ PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
+ paginationInnerInterceptor.setDbType(DbType.MYSQL);
+ paginationInnerInterceptor.setMaxLimit(600L);
+ interceptor.addInnerInterceptor(paginationInnerInterceptor);
+
+ // 乐观锁
+ interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
+
+ // 防止全表删除
+ interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
+ return interceptor;
+ }
+}
diff --git a/auth-common/src/main/java/com/auth/common/config/ThreadLocalCleanupInterceptor.java b/auth-common/src/main/java/com/auth/common/config/ThreadLocalCleanupInterceptor.java
new file mode 100644
index 0000000..0d165e8
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/config/ThreadLocalCleanupInterceptor.java
@@ -0,0 +1,23 @@
+package com.auth.common.config;
+
+import com.auth.common.context.BaseContext;
+import jakarta.annotation.Nullable;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+@Configuration
+public class ThreadLocalCleanupInterceptor implements HandlerInterceptor {
+
+ // @Override
+ // public boolean preHandle(@Nullable HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Object handler) {
+ // return true;
+ // }
+
+ @Override
+ public void afterCompletion(@Nullable HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Object handler, Exception ex) {
+ // 移除上下文存储内容
+ BaseContext.removeUser();
+ }
+}
\ No newline at end of file
diff --git a/auth-common/src/main/java/com/auth/common/config/WebConfig.java b/auth-common/src/main/java/com/auth/common/config/WebConfig.java
new file mode 100644
index 0000000..b0d9fc7
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/config/WebConfig.java
@@ -0,0 +1,26 @@
+package com.auth.common.config;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@RequiredArgsConstructor
+public class WebConfig implements WebMvcConfigurer {
+
+ private final ThreadLocalCleanupInterceptor threadLocalCleanupInterceptor;
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(threadLocalCleanupInterceptor);
+ }
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
\ No newline at end of file
diff --git a/auth-common/src/main/java/com/auth/common/context/BaseContext.java b/auth-common/src/main/java/com/auth/common/context/BaseContext.java
new file mode 100644
index 0000000..f948f30
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/context/BaseContext.java
@@ -0,0 +1,29 @@
+package com.auth.common.context;
+
+
+public class BaseContext {
+ private static final ThreadLocal userId = new ThreadLocal<>();
+ private static final ThreadLocal username = new ThreadLocal<>();
+
+ // 用户id相关
+ public static Long getUserId() {
+ return userId.get();
+ }
+
+ public static void setUserId(Long _userId) {
+ userId.set(_userId);
+ }
+
+ public static String getUsername() {
+ return username.get();
+ }
+
+ public static void setUsername(String _username) {
+ username.set(_username);
+ }
+
+ public static void removeUser() {
+ username.remove();
+ userId.remove();
+ }
+}
\ No newline at end of file
diff --git a/auth-common/src/main/java/com/auth/common/exception/AuthenticSecurityException.java b/auth-common/src/main/java/com/auth/common/exception/AuthenticSecurityException.java
new file mode 100644
index 0000000..dc42d66
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/exception/AuthenticSecurityException.java
@@ -0,0 +1,47 @@
+package com.auth.common.exception;
+
+
+import com.auth.common.model.common.result.ResultCodeEnum;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+
+@NoArgsConstructor
+@Getter
+@ToString
+@Slf4j
+public class AuthenticSecurityException extends RuntimeException {
+ // 状态码
+ Integer code;
+
+ // 描述信息
+ String message = "服务异常";
+
+ // 返回结果状态
+ ResultCodeEnum resultCodeEnum;
+
+ public AuthenticSecurityException(Integer code, String message) {
+ super(message);
+ this.code = code;
+ this.message = message;
+ }
+
+ public AuthenticSecurityException(String message) {
+ super(message);
+ this.message = message;
+ }
+
+ public AuthenticSecurityException(ResultCodeEnum codeEnum) {
+ super(codeEnum.getMessage());
+ this.code = codeEnum.getCode();
+ this.message = codeEnum.getMessage();
+ this.resultCodeEnum = codeEnum;
+ }
+
+ public AuthenticSecurityException(String message, Exception exception) {
+ super(message);
+ this.message = message;
+ log.error(message, exception);
+ }
+}
diff --git a/auth-common/src/main/java/com/auth/common/exception/GlobalExceptionHandler.java b/auth-common/src/main/java/com/auth/common/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..4928eaa
--- /dev/null
+++ b/auth-common/src/main/java/com/auth/common/exception/GlobalExceptionHandler.java
@@ -0,0 +1,102 @@
+package com.auth.common.exception;
+
+import com.auth.common.model.common.result.Result;
+import com.auth.common.model.common.result.ResultCodeEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.sql.SQLIntegrityConstraintViolationException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+ @ExceptionHandler(AuthenticSecurityException.class)
+ @ResponseBody
+ public Result