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;