From 01ec82142fd8284ca8ac1cc8bc562da25f762fd2 Mon Sep 17 00:00:00 2001
From: sterben <1473352497@qq.com>
Date: Mon, 4 Dec 2023 21:31:22 +0800
Subject: [PATCH] =?UTF-8?q?[Feature#]=E5=AE=8C=E6=88=90=E4=BE=9D=E8=B5=96?=
 =?UTF-8?q?=E5=8C=85=E7=9A=84=E5=8D=87=E7=BA=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |  49 ++---
 .../com/steadon/saber/biz/impl/AccessBiz.java |   8 +-
 .../saber/controller/AccessController.java    |   2 +-
 .../saber/interceptor/JwtInterceptor.java     |   8 +-
 .../model/request/AuthorizationRequest.java   |   2 +-
 .../service/impl/BusinessServiceImpl.java     |   2 +-
 .../service/impl/FeishuRobotServiceImpl.java  |   2 +-
 .../impl/NotificationAttrsServiceImpl.java    |   2 +-
 .../service/impl/NotificationServiceImpl.java |   2 +-
 .../service/impl/UserGroupServiceImpl.java    |   2 +-
 .../com/steadon/saber/util/RedisUtils.java    | 196 ------------------
 src/main/resources/application.yml            |   3 +
 12 files changed, 35 insertions(+), 243 deletions(-)
 delete mode 100644 src/main/java/com/steadon/saber/util/RedisUtils.java

diff --git a/pom.xml b/pom.xml
index 06973a0..d45ee18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,17 +15,14 @@
     <description>saber</description>
     <properties>
         <java.version>17</java.version>
+        <nacos.version>2022.0.0.0-RC2</nacos.version>
+        <sutils.version>3.1.0</sutils.version>
+        <easyexcel.version>3.3.2</easyexcel.version>
+        <hibernate.version>8.0.0.Final</hibernate.version>
         <spring-cloud.version>2022.0.4</spring-cloud.version>
+        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
     </properties>
     <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-jdbc</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -37,12 +34,12 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus</artifactId>
-            <version>3.5.3.1</version>
+            <version>${mybatis-plus.version}</version>
         </dependency>
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.5.3.1</version>
+            <version>${mybatis-plus.version}</version>
         </dependency>
         <dependency>
             <groupId>com.mysql</groupId>
@@ -63,62 +60,51 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-generator</artifactId>
-            <version>3.5.3.1</version>
+            <version>${mybatis-plus.version}</version>
         </dependency>
         <!-- mybatis-plus代码生成器模板引擎 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-freemarker</artifactId>
         </dependency>
-        <!-- aop -->
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-        </dependency>
         <!-- Nacos Config Starter -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-            <version>2022.0.0.0-RC2</version>
+            <version>${nacos.version}</version>
         </dependency>
         <!-- Nacos Discovery Starter -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-            <version>2022.0.0.0-RC2</version>
+            <version>${nacos.version}</version>
         </dependency>
         <!-- loadbalancer -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-loadbalancer</artifactId>
         </dependency>
-        <!-- jwt util-->
+        <!-- utils-->
         <dependency>
             <groupId>io.github.steadon</groupId>
-            <artifactId>utils</artifactId>
-            <version>2.1.3</version>
-        </dependency>
-        <!-- retry -->
-        <dependency>
-            <groupId>org.springframework.retry</groupId>
-            <artifactId>spring-retry</artifactId>
-            <version>2.0.0</version>
+            <artifactId>sutils</artifactId>
+            <version>${sutils.version}</version>
         </dependency>
         <!-- excel -->
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
-            <version>3.3.2</version>
+            <version>${easyexcel.version}</version>
         </dependency>
         <dependency>
             <groupId>org.hibernate.validator</groupId>
             <artifactId>hibernate-validator</artifactId>
-            <version>8.0.0.Final</version>
+            <version>${hibernate.version}</version>
         </dependency>
         <dependency>
             <groupId>org.hibernate.validator</groupId>
             <artifactId>hibernate-validator-annotation-processor</artifactId>
-            <version>8.0.0.Final</version>
+            <version>${hibernate.version}</version>
         </dependency>
     </dependencies>
     <dependencyManagement>
@@ -149,5 +135,4 @@
             </plugin>
         </plugins>
     </build>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/src/main/java/com/steadon/saber/biz/impl/AccessBiz.java b/src/main/java/com/steadon/saber/biz/impl/AccessBiz.java
index e23bc22..0bd1445 100644
--- a/src/main/java/com/steadon/saber/biz/impl/AccessBiz.java
+++ b/src/main/java/com/steadon/saber/biz/impl/AccessBiz.java
@@ -1,15 +1,15 @@
 package com.steadon.saber.biz.impl;
 
-import com.steadon.JWTUtils;
 import com.steadon.saber.biz.IAccessBiz;
 import com.steadon.saber.pojo.SaberResponse;
 import com.steadon.saber.pojo.domain.Admin;
+import com.steadon.saber.pojo.model.pageData.PageData;
 import com.steadon.saber.pojo.model.request.AuthorizationRequest;
 import com.steadon.saber.pojo.model.result.TokenResult;
-import com.steadon.saber.pojo.model.pageData.PageData;
 import com.steadon.saber.pojo.model.resultEnum.ResultCode;
 import com.steadon.saber.service.AccessService;
 import com.steadon.saber.util.StringUtils;
+import com.steadon.utils.TokenUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -19,7 +19,7 @@ public class AccessBiz implements IAccessBiz {
 
     private AccessService accessService;
 
-    private JWTUtils jwtUtils;
+    private TokenUtils tokenUtils;
 
     /**
      * 可访问权限验证
@@ -46,7 +46,7 @@ public class AccessBiz implements IAccessBiz {
         // 签发token并返回给前端
         TokenResult result = new TokenResult();
         result.setUsername(admin.getUsername());
-        result.setToken(jwtUtils.createToken(request));
+        result.setToken(tokenUtils.createToken(request));
         return SaberResponse.success(result);
     }
 
diff --git a/src/main/java/com/steadon/saber/controller/AccessController.java b/src/main/java/com/steadon/saber/controller/AccessController.java
index 8c08afe..5493b19 100644
--- a/src/main/java/com/steadon/saber/controller/AccessController.java
+++ b/src/main/java/com/steadon/saber/controller/AccessController.java
@@ -6,7 +6,7 @@ import com.steadon.saber.pojo.domain.Admin;
 import com.steadon.saber.pojo.model.request.AuthorizationRequest;
 import com.steadon.saber.pojo.model.result.TokenResult;
 import com.steadon.saber.pojo.model.pageData.PageData;
-import com.steadon.saber.util.RedisUtils;
+import com.steadon.utils.RedisUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
diff --git a/src/main/java/com/steadon/saber/interceptor/JwtInterceptor.java b/src/main/java/com/steadon/saber/interceptor/JwtInterceptor.java
index 532dadf..9e0237a 100644
--- a/src/main/java/com/steadon/saber/interceptor/JwtInterceptor.java
+++ b/src/main/java/com/steadon/saber/interceptor/JwtInterceptor.java
@@ -1,8 +1,8 @@
 package com.steadon.saber.interceptor;
 
-import com.steadon.JWTUtils;
 import com.steadon.saber.handler.token.TokenHandler;
 import com.steadon.saber.pojo.model.request.AuthorizationRequest;
+import com.steadon.utils.TokenUtils;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
@@ -17,7 +17,7 @@ import org.springframework.web.servlet.HandlerInterceptor;
 @AllArgsConstructor
 public class JwtInterceptor implements HandlerInterceptor {
 
-    private JWTUtils jwtUtils;
+    private TokenUtils tokenUtils;
 
     @Override
     public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) {
@@ -27,13 +27,13 @@ public class JwtInterceptor implements HandlerInterceptor {
             return true;
         }
         // 验证token
-        if (!jwtUtils.checkToken(token)) {
+        if (!tokenUtils.checkToken(token)) {
             // 设置 HTTP 状态码为 401
             response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
             return false;
         }
         // 将载荷存入 ThreadLocal
-        AuthorizationRequest authorizationRequest = jwtUtils.parseToken(token, AuthorizationRequest.class);
+        AuthorizationRequest authorizationRequest = tokenUtils.parseToken(token, AuthorizationRequest.class);
         TokenHandler.setUsername(authorizationRequest.getUsername());
         return true;
     }
diff --git a/src/main/java/com/steadon/saber/pojo/model/request/AuthorizationRequest.java b/src/main/java/com/steadon/saber/pojo/model/request/AuthorizationRequest.java
index f6c5701..fbd39ba 100644
--- a/src/main/java/com/steadon/saber/pojo/model/request/AuthorizationRequest.java
+++ b/src/main/java/com/steadon/saber/pojo/model/request/AuthorizationRequest.java
@@ -1,6 +1,6 @@
 package com.steadon.saber.pojo.model.request;
 
-import com.steadon.Token;
+import com.steadon.annotation.Token;
 import jakarta.validation.constraints.Pattern;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
diff --git a/src/main/java/com/steadon/saber/service/impl/BusinessServiceImpl.java b/src/main/java/com/steadon/saber/service/impl/BusinessServiceImpl.java
index dcada91..e4eb538 100644
--- a/src/main/java/com/steadon/saber/service/impl/BusinessServiceImpl.java
+++ b/src/main/java/com/steadon/saber/service/impl/BusinessServiceImpl.java
@@ -7,7 +7,7 @@ import com.steadon.saber.mapper.BusinessMapper;
 import com.steadon.saber.pojo.domain.Business;
 import com.steadon.saber.pojo.model.pageData.PageData;
 import com.steadon.saber.service.BusinessService;
-import com.steadon.saber.util.RedisUtils;
+import com.steadon.utils.RedisUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
diff --git a/src/main/java/com/steadon/saber/service/impl/FeishuRobotServiceImpl.java b/src/main/java/com/steadon/saber/service/impl/FeishuRobotServiceImpl.java
index bfceadc..37142a2 100644
--- a/src/main/java/com/steadon/saber/service/impl/FeishuRobotServiceImpl.java
+++ b/src/main/java/com/steadon/saber/service/impl/FeishuRobotServiceImpl.java
@@ -11,7 +11,7 @@ import com.steadon.saber.pojo.domain.FeishuRobot;
 import com.steadon.saber.pojo.model.pageData.PageData;
 import com.steadon.saber.pojo.model.resultEnum.ResultCode;
 import com.steadon.saber.service.FeishuRobotService;
-import com.steadon.saber.util.RedisUtils;
+import com.steadon.utils.RedisUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
diff --git a/src/main/java/com/steadon/saber/service/impl/NotificationAttrsServiceImpl.java b/src/main/java/com/steadon/saber/service/impl/NotificationAttrsServiceImpl.java
index 6124b09..005708e 100644
--- a/src/main/java/com/steadon/saber/service/impl/NotificationAttrsServiceImpl.java
+++ b/src/main/java/com/steadon/saber/service/impl/NotificationAttrsServiceImpl.java
@@ -8,7 +8,7 @@ import com.steadon.saber.pojo.domain.NotificationFeishuAttrs;
 import com.steadon.saber.pojo.domain.NotificationSmsAttrs;
 import com.steadon.saber.pojo.model.resultEnum.ResultCode;
 import com.steadon.saber.service.NotificationAttrsService;
-import com.steadon.saber.util.RedisUtils;
+import com.steadon.utils.RedisUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
diff --git a/src/main/java/com/steadon/saber/service/impl/NotificationServiceImpl.java b/src/main/java/com/steadon/saber/service/impl/NotificationServiceImpl.java
index b26ef10..1bbe7c1 100644
--- a/src/main/java/com/steadon/saber/service/impl/NotificationServiceImpl.java
+++ b/src/main/java/com/steadon/saber/service/impl/NotificationServiceImpl.java
@@ -17,7 +17,7 @@ import com.steadon.saber.pojo.domain.vo.NotificationRuleVo;
 import com.steadon.saber.pojo.model.pageData.PageData;
 import com.steadon.saber.pojo.model.resultEnum.ResultCode;
 import com.steadon.saber.service.NotificationService;
-import com.steadon.saber.util.RedisUtils;
+import com.steadon.utils.RedisUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
diff --git a/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java b/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java
index e78cde9..29125e6 100644
--- a/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java
+++ b/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java
@@ -17,7 +17,7 @@ import com.steadon.saber.pojo.model.request.UserInfoSearchRequest;
 import com.steadon.saber.pojo.model.resultEnum.ResultCode;
 import com.steadon.saber.service.UserGroupService;
 import com.steadon.saber.util.CollectionUtils;
-import com.steadon.saber.util.RedisUtils;
+import com.steadon.utils.RedisUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
diff --git a/src/main/java/com/steadon/saber/util/RedisUtils.java b/src/main/java/com/steadon/saber/util/RedisUtils.java
deleted file mode 100644
index 654a8bd..0000000
--- a/src/main/java/com/steadon/saber/util/RedisUtils.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package com.steadon.saber.util;
-
-import com.steadon.saber.exception.SaberBaseException;
-import com.steadon.saber.pojo.model.resultEnum.ResultCode;
-import lombok.AllArgsConstructor;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-
-@Component
-@AllArgsConstructor
-public class RedisUtils {
-
-    private RedisTemplate<String, Object> redisTemplate;
-
-    private final ConcurrentHashMap<String, Object> locks = new ConcurrentHashMap<>();
-
-    public <T> void setValue(String key, T value, long timeout, TimeUnit unit) {
-        if (key == null || key.isEmpty()) {
-            throw new IllegalArgumentException("Key cannot be null or empty");
-        }
-        if (timeout > 0) {
-            redisTemplate.opsForValue().set(key, value, timeout, unit);
-        } else {
-            redisTemplate.opsForValue().set(key, value);
-        }
-    }
-
-    public void deleteValue(String key) {
-        if (key == null || key.isEmpty()) {
-            throw new IllegalArgumentException("Key cannot be null or empty");
-        }
-        redisTemplate.delete(key);
-    }
-
-    public <T> Optional<T> getValue(String key, Class<T> clazz) {
-        Object o = redisTemplate.opsForValue().get(key);
-        if (clazz.isInstance(o)) {
-            return Optional.of(clazz.cast(o));
-        }
-        return Optional.empty();
-    }
-
-    /**
-     * Get a string value.
-     *
-     * @param key the cache key
-     * @return Optional containing the string value, or empty if not found or if the key is invalid.
-     */
-    public Optional<String> getString(String key) {
-        if (key == null || key.isEmpty()) {
-            return Optional.empty();
-        }
-        Object value = redisTemplate.opsForValue().get(key);
-        if (value instanceof String) {
-            return Optional.of((String) value);
-        }
-        return Optional.empty();
-    }
-
-    /**
-     * Get a integer value.
-     *
-     * @param key the cache key
-     * @return Optional containing the string value, or empty if not found or if the key is invalid.
-     */
-    public Optional<Integer> getInteger(String key) {
-        if (key == null || key.isEmpty()) {
-            return Optional.empty();
-        }
-        Object value = redisTemplate.opsForValue().get(key);
-        if (value instanceof Integer) {
-            return Optional.of((Integer) value);
-        }
-        return Optional.empty();
-    }
-
-    /**
-     * Set a list into the cache for any type of objects.
-     *
-     * @param key  the cache key
-     * @param list the list to cache
-     * @param <T>  the type of elements in the list
-     */
-    public <T> void setList(String key, List<T> list, long timeout, TimeUnit unit) {
-        if (key == null || key.isEmpty()) {
-            throw new IllegalArgumentException("Key cannot be null or empty");
-        }
-        if (list == null) {
-            throw new IllegalArgumentException("List cannot be null");
-        }
-        if (list.isEmpty()) {
-            redisTemplate.delete(key);
-        } else {
-            redisTemplate.opsForList().rightPushAll(key, list.toArray());
-            redisTemplate.expire(key, timeout, unit);
-        }
-    }
-
-    /**
-     * Get a list from the cache.
-     *
-     * @param key   the cache key
-     * @param clazz the type of List elements
-     * @return Optional containing the cached list, or an empty Optional if the list is not found
-     */
-    public <T> Optional<List<T>> getList(String key, Class<T> clazz) {
-        if (key == null || key.isEmpty()) {
-            throw new IllegalArgumentException("Key cannot be null or empty");
-        }
-        List<Object> rawList = redisTemplate.opsForList().range(key, 0, -1);
-        if (rawList == null || rawList.isEmpty()) {
-            return Optional.empty();
-        }
-        List<T> typedList = rawList.stream().filter(clazz::isInstance).map(clazz::cast).toList();
-        return Optional.of(typedList);
-    }
-
-    /**
-     * Check if a key exists in the cache.
-     *
-     * @param key the cache key
-     * @return true if the key exists, false otherwise
-     * @throws IllegalArgumentException if key is null or empty
-     */
-    public boolean hasKey(String key) {
-        if (key == null || key.isEmpty()) {
-            throw new IllegalArgumentException("Key cannot be null or empty");
-        }
-        Boolean result = redisTemplate.hasKey(key);
-        return result != null && result;
-    }
-
-    /**
-     * 清除所有缓存
-     */
-    public void flushAll() {
-        Set<String> keys = redisTemplate.keys("*");
-        if (keys != null && !keys.isEmpty()) {
-            redisTemplate.delete(keys);
-        }
-    }
-
-    /**
-     * 二级抽象的获取参数方法以提高代码复用率(非集合类型)
-     *
-     * @param cacheKey      缓存键
-     * @param clazz         返回类型
-     * @param queryFunction 具体查询方法
-     * @return clazz
-     */
-    public <T> T getCacheOrQuery(String cacheKey, Class<T> clazz, Supplier<T> queryFunction) {
-        return getValue(cacheKey, clazz).orElseGet(() -> {
-            Object lock = locks.computeIfAbsent(cacheKey, k -> new Object());
-            synchronized (lock) {
-                return getValue(cacheKey, clazz).orElseGet(() -> {
-                    T result = queryFunction.get();
-                    if (result != null) {
-                        setValue(cacheKey, result, 1, TimeUnit.HOURS);
-                        return result;
-                    }
-                    throw new SaberBaseException(ResultCode.INVALID_PARAM, clazz.getSimpleName() + " not found");
-                });
-            }
-        });
-    }
-
-    /**
-     * 二级抽象的获取参数方法以提高代码复用率(集合类型)
-     *
-     * @param cacheKey      缓存键
-     * @param clazz         返回类型
-     * @param queryFunction 具体查询方法
-     * @return clazz
-     */
-    public <T> List<T> getCachedListOrQuery(String cacheKey, Class<T> clazz, Supplier<List<T>> queryFunction) {
-        return getList(cacheKey, clazz).orElseGet(() -> {
-            Object lock = locks.computeIfAbsent(cacheKey, k -> new Object());
-            synchronized (lock) {
-                return getList(cacheKey, clazz).orElseGet(() -> {
-                    List<T> dataList = queryFunction.get();
-                    if (CollectionUtils.isNotEmpty(dataList)) {
-                        setList(cacheKey, dataList, 1, TimeUnit.HOURS);
-                    }
-                    return dataList;
-                });
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 3ee5832..9c2b4fe 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -33,6 +33,8 @@ spring:
             logger-level: basic
 
 mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
   mapper-locations: classpath:mapper/*.xml
   type-aliases-package: com.steadon.saber.pojo.domain
   global-config:
@@ -43,6 +45,7 @@ mybatis-plus:
 
 token:
   sign: saber@2023@steadon
+  key-str: secretkeyofmyaes
 
 lancelot:
   feishu-app-id: cli_a583b6b767d8900b
-- 
GitLab