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