diff --git a/src/main/java/com/jsl/oa/common/constant/RedisConstant.java b/src/main/java/com/jsl/oa/common/constant/RedisConstant.java
index 841c4af..fea1187 100755
--- a/src/main/java/com/jsl/oa/common/constant/RedisConstant.java
+++ b/src/main/java/com/jsl/oa/common/constant/RedisConstant.java
@@ -20,6 +20,8 @@ public class RedisConstant {
public static final String TYPE_EMAIL = "mail:";
// 登陆相关
public static final String TYPE_AUTH = "auth:";
+ // 权限相关
+ public static final String TYPE_PERMISSION = "permission:";
/*
* 表分类
@@ -30,4 +32,6 @@ public class RedisConstant {
public static final String TABLE_TOKEN = "token:";
// 用户相关
public static final String TABLE_USER = "user:";
+ // 角色相关
+ public static final String TABLE_ROLE = "role:";
}
diff --git a/src/main/java/com/jsl/oa/config/redis/RedisOperating.java b/src/main/java/com/jsl/oa/config/redis/RedisOperating.java
index 585a29b..94d91ac 100644
--- a/src/main/java/com/jsl/oa/config/redis/RedisOperating.java
+++ b/src/main/java/com/jsl/oa/config/redis/RedisOperating.java
@@ -9,6 +9,18 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+/**
+ *
Redis工具类
+ *
+ * 用于操作Redis
+ *
+ * @param 泛型
+ * @since v1.1.0
+ * @version v1.1.0
+ * @see RedisConfiguration
+ * @see com.jsl.oa.common.constant.RedisConstant
+ * @author xiao_lfeng
+ */
@RequiredArgsConstructor
public abstract class RedisOperating {
protected final RedisTemplate redisTemplate;
diff --git a/src/main/java/com/jsl/oa/dao/PermissionDAO.java b/src/main/java/com/jsl/oa/dao/PermissionDAO.java
index 048f080..7424a15 100644
--- a/src/main/java/com/jsl/oa/dao/PermissionDAO.java
+++ b/src/main/java/com/jsl/oa/dao/PermissionDAO.java
@@ -1,9 +1,14 @@
package com.jsl.oa.dao;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.jsl.oa.common.constant.BusinessConstants;
import com.jsl.oa.mapper.PermissionMapper;
import com.jsl.oa.model.doData.PermissionDO;
+import com.jsl.oa.utils.redis.PermissionRedisUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@@ -23,32 +28,60 @@ import java.util.List;
@RequiredArgsConstructor
public class PermissionDAO {
private final PermissionMapper permissionMapper;
+ private final PermissionRedisUtil permissionRedisUtil;
+ private final Gson gson;
- public List getPermission(Long uid) {
+ /**
+ * 获取用户权限信息
+ *
+ * 通过用户 ID 获取用户权限信息
+ *
+ * @param uid 用户ID
+ * @return {@link List}
+ */
+ public List getPermission(@NotNull Long uid) {
log.info("\t> 执行 DAO 层 PermissionDAO.getPermission 方法");
- List permissionList = permissionMapper.permissionUserPid(uid);
- List getPermissionForString = new ArrayList<>();
- for (PermissionDO permission : permissionList) {
- // 寻找是否存在父亲
- StringBuilder permissionString = new StringBuilder();
- if (permission.getPid() != null) {
- // 存在父亲
- this.getFatherPermission(permissionString, permission.getPid());
- // 寻找子类
- this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
- getPermissionForString.add(permissionString.toString());
- } else {
- // 不存在父亲
- permissionString.append(permission.getName());
- this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
- getPermissionForString.add(permissionString.toString());
+ List getPermissionForString;
+ String permissionRedisString = permissionRedisUtil.getData(BusinessConstants.NONE, uid.toString());
+ if (permissionRedisString == null) {
+ log.info("\t\t> 从 MySQL 获取数据");
+ List permissionList = permissionMapper.permissionUserPid(uid);
+ getPermissionForString = new ArrayList<>();
+ for (PermissionDO permission : permissionList) {
+ // 寻找是否存在父亲
+ StringBuilder permissionString = new StringBuilder();
+ if (permission.getPid() != null) {
+ // 存在父亲
+ this.getFatherPermission(permissionString, permission.getPid());
+ // 寻找子类
+ this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
+ getPermissionForString.add(permissionString.toString());
+ } else {
+ // 不存在父亲
+ permissionString.append(permission.getName());
+ this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
+ getPermissionForString.add(permissionString.toString());
+ }
}
+ // 存入 Redis
+ permissionRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440);
+ } else {
+ log.info("\t\t> 从 Redis 获取数据");
+ getPermissionForString = gson.fromJson(permissionRedisString, new TypeToken>() {}.getType());
}
- // 存入 Redis
-
return getPermissionForString;
}
+ /**
+ * 获取子类权限信息
+ *
+ * 通过父类 ID 获取子类权限信息
+ * 递归调用
+ *
+ * @param permissionString 父类权限信息
+ * @param id 父类 ID
+ * @param getPermissionForString 存储权限信息
+ */
private void getChildPermission(StringBuilder permissionString, Long id, List getPermissionForString) {
// 获取子类权限信息
List permissionList = permissionMapper.getChildPermission(id);
@@ -73,6 +106,15 @@ public class PermissionDAO {
}
}
+ /**
+ * 获取父类权限信息
+ *
+ * 通过子类 ID 获取父类权限信息
+ * 递归调用
+ *
+ * @param permissionString 父类权限信息
+ * @param pid 父类 ID
+ */
public void getFatherPermission(StringBuilder permissionString, Long pid) {
// 获取权限信息
PermissionDO permissionDO = permissionMapper.getPermissionById(pid);
diff --git a/src/main/java/com/jsl/oa/utils/redis/EmailRedisUtil.java b/src/main/java/com/jsl/oa/utils/redis/EmailRedisUtil.java
index d2014f2..016b2e0 100755
--- a/src/main/java/com/jsl/oa/utils/redis/EmailRedisUtil.java
+++ b/src/main/java/com/jsl/oa/utils/redis/EmailRedisUtil.java
@@ -4,6 +4,7 @@ import com.jsl.oa.common.constant.BusinessConstants;
import com.jsl.oa.common.constant.RedisConstant;
import com.jsl.oa.config.redis.RedisConfiguration;
import com.jsl.oa.config.redis.RedisOperating;
+import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -22,6 +23,7 @@ import java.util.concurrent.TimeUnit;
* @see com.jsl.oa.common.constant.RedisConstant
* @since v1.1.0
*/
+@Slf4j
@Component
public class EmailRedisUtil extends RedisOperating {
@@ -41,6 +43,7 @@ public class EmailRedisUtil extends RedisOperating {
@Override
public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String email) {
String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email;
+ log.info("\t\t> 读取 Redis 键为 {} 的过期时间", key);
return redisTemplate.getExpire(key);
}
@@ -56,6 +59,7 @@ public class EmailRedisUtil extends RedisOperating {
@Override
public Boolean delData(@NotNull BusinessConstants businessConstants, String email) {
String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email;
+ log.info("\t\t> 删除 Redis 键为 {} 的数据", key);
return redisTemplate.delete(key);
}
@@ -71,6 +75,7 @@ public class EmailRedisUtil extends RedisOperating {
@Override
public R getData(@NotNull BusinessConstants businessConstants, String email) {
String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email;
+ log.info("\t\t> 读取 Redis 键为 {} 的数据", key);
return redisTemplate.opsForValue().get(key);
}
@@ -88,6 +93,7 @@ public class EmailRedisUtil extends RedisOperating {
public Boolean setData(@NotNull BusinessConstants businessConstants, String email, R value, Integer time) {
// 处理数据
String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email;
+ log.info("\t\t> 设置 Redis 键为 {} 的数据", key);
redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, time, TimeUnit.MINUTES);
return true;
diff --git a/src/main/java/com/jsl/oa/utils/redis/PermissionRedisUtil.java b/src/main/java/com/jsl/oa/utils/redis/PermissionRedisUtil.java
new file mode 100644
index 0000000..eda55c0
--- /dev/null
+++ b/src/main/java/com/jsl/oa/utils/redis/PermissionRedisUtil.java
@@ -0,0 +1,61 @@
+package com.jsl.oa.utils.redis;
+
+import com.jsl.oa.common.constant.BusinessConstants;
+import com.jsl.oa.common.constant.RedisConstant;
+import com.jsl.oa.config.redis.RedisOperating;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 权限Redis工具类
+ *
+ * 权限Redis工具类
+ *
+ * @param 泛型
+ * @since v1.1.0
+ * @version v1.1.0
+ * @see com.jsl.oa.common.constant.RedisConstant
+ * @author xiaofeng
+ */
+@Slf4j
+@Component
+public class PermissionRedisUtil extends RedisOperating {
+ public PermissionRedisUtil(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate) {
+ super(redisTemplate, stringRedisTemplate);
+ }
+
+ @Override
+ public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String field) {
+ String key = RedisConstant.TYPE_PERMISSION + RedisConstant.TABLE_ROLE + businessConstants.getValue() + field;
+ log.info("\t\t> 读取 Redis 键为 {} 的过期时间", key);
+ return redisTemplate.getExpire(key);
+ }
+
+ @Override
+ public Boolean delData(@NotNull BusinessConstants businessConstants, String field) {
+ String key = RedisConstant.TYPE_PERMISSION + RedisConstant.TABLE_ROLE + businessConstants.getValue() + field;
+ log.info("\t\t> 删除 Redis 键为 {} 的数据", key);
+ return redisTemplate.delete(key);
+ }
+
+ @Override
+ public R getData(@NotNull BusinessConstants businessConstants, String field) {
+ String key = RedisConstant.TYPE_PERMISSION + RedisConstant.TABLE_ROLE + businessConstants.getValue() + field;
+ log.info("\t\t> 读取 Redis 键为 {} 的数据", key);
+ return redisTemplate.opsForValue().get(key);
+ }
+
+ @Override
+ public Boolean setData(@NotNull BusinessConstants businessConstants, String field, R value, Integer time) {
+ String key = RedisConstant.TYPE_PERMISSION + RedisConstant.TABLE_ROLE + businessConstants.getValue() + field;
+ log.info("\t\t> 写入 Redis 键为 {} 的数据", key);
+ redisTemplate.opsForValue().set(key, value);
+ redisTemplate.expire(key, time, TimeUnit.MINUTES);
+ return true;
+ }
+}
diff --git a/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java b/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java
index a92296b..46d5a4d 100644
--- a/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java
+++ b/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java
@@ -3,6 +3,7 @@ package com.jsl.oa.utils.redis;
import com.jsl.oa.common.constant.BusinessConstants;
import com.jsl.oa.common.constant.RedisConstant;
import com.jsl.oa.config.redis.RedisOperating;
+import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -11,6 +12,20 @@ import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
+/**
+ * Token Redis 工具类
+ *
+ * 用于 Token 的 Redis 操作
+ *
+ * @param 泛型
+ * @version v1.1.0
+ * @since v1.1.0
+ * @see RedisOperating
+ * @see RedisTemplate
+ * @see StringRedisTemplate
+ * @author xiao_lfeng
+ */
+@Slf4j
@Component
public class TokenRedisUtil extends RedisOperating {
public TokenRedisUtil(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate) {
@@ -20,18 +35,21 @@ public class TokenRedisUtil extends RedisOperating {
@Override
public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String field) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field;
+ log.info("\t\t> 读取 Redis 键为 {} 的过期时间", key);
return redisTemplate.getExpire(key);
}
@Override
public Boolean delData(@NotNull BusinessConstants businessConstants, String field) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field;
+ log.info("\t\t> 删除 Redis 键为 {} 的数据", key);
return redisTemplate.delete(key);
}
@Override
public R getData(@NotNull BusinessConstants businessConstants, String field) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field;
+ log.info("\t\t> 读取 Redis 键为 {} 的数据", key);
return redisTemplate.opsForValue().get(key);
}
@@ -39,6 +57,7 @@ public class TokenRedisUtil extends RedisOperating {
public Boolean setData(@NotNull BusinessConstants businessConstants, String field, R value, Integer time) {
// 处理数据
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field;
+ log.info("\t\t> 写入 Redis 键为 {} 的数据", key);
redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, time, TimeUnit.MINUTES);
return true;
@@ -46,6 +65,7 @@ public class TokenRedisUtil extends RedisOperating {
public List getList(@NotNull BusinessConstants businessConstants) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + "*";
+ log.info("\t\t> 读取 Redis 键为 {} 的数据", key);
return this.getList(key);
}
}
diff --git a/src/main/java/com/jsl/oa/utils/redis/UserRedisUtil.java b/src/main/java/com/jsl/oa/utils/redis/UserRedisUtil.java
index 1cf76e8..fa68037 100644
--- a/src/main/java/com/jsl/oa/utils/redis/UserRedisUtil.java
+++ b/src/main/java/com/jsl/oa/utils/redis/UserRedisUtil.java
@@ -3,6 +3,7 @@ package com.jsl.oa.utils.redis;
import com.jsl.oa.common.constant.BusinessConstants;
import com.jsl.oa.common.constant.RedisConstant;
import com.jsl.oa.config.redis.RedisOperating;
+import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -20,6 +21,7 @@ import java.util.concurrent.TimeUnit;
* @version v1.1.0
* @author xiao_lfeng
*/
+@Slf4j
@Component
public class UserRedisUtil extends RedisOperating {
public UserRedisUtil(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate) {
@@ -29,18 +31,21 @@ public class UserRedisUtil extends RedisOperating {
@Override
public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String field) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_USER + businessConstants.getValue() + field;
+ log.info("\t\t> 读取 Redis 键为 {} 的过期时间", key);
return redisTemplate.getExpire(key);
}
@Override
public Boolean delData(@NotNull BusinessConstants businessConstants, String field) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_USER + businessConstants.getValue() + field;
+ log.info("\t\t> 删除 Redis 键为 {} 的数据", key);
return redisTemplate.delete(key);
}
@Override
public R getData(@NotNull BusinessConstants businessConstants, String field) {
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_USER + businessConstants.getValue() + field;
+ log.info("\t\t> 读取 Redis 键为 {} 的数据", key);
return redisTemplate.opsForValue().get(key);
}
@@ -48,6 +53,7 @@ public class UserRedisUtil extends RedisOperating {
public Boolean setData(@NotNull BusinessConstants businessConstants, String field, R value, Integer time) {
// 处理数据
String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_USER + businessConstants.getValue() + field;
+ log.info("\t\t> 写入 Redis 键为 {} 的数据", key);
redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, time, TimeUnit.MINUTES);
return true;