diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/constants/SystemConstants.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/constants/SystemConstants.java
index 9c6a9c2b3..3bfe951f2 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/constants/SystemConstants.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/constants/SystemConstants.java
@@ -38,4 +38,14 @@ public interface SystemConstants {
*/
String DEFAULT_SYSTEM_NAME = "Guns快速开发平台";
+ /**
+ * 用户缓存的前缀
+ */
+ String USER_CACHE_PREFIX = "user:";
+
+ /**
+ * 用户缓存过期时间(1小时)
+ */
+ Long USER_CACHE_TIMEOUT_SECONDS = 3600L;
+
}
diff --git a/kernel-s-system/system-business-user/pom.xml b/kernel-s-system/system-business-user/pom.xml
index 8820961f9..bf1d7cce0 100644
--- a/kernel-s-system/system-business-user/pom.xml
+++ b/kernel-s-system/system-business-user/pom.xml
@@ -62,6 +62,26 @@
7.0.1
+
+
+
+ cn.stylefeng.roses
+ cache-api
+ 7.0.1
+
+
+ cn.stylefeng.roses
+ cache-sdk-memory
+ 7.0.1
+ true
+
+
+ cn.stylefeng.roses
+ cache-sdk-redis
+ 7.0.1
+ true
+
+
diff --git a/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/cache/SysUserMemoryCache.java b/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/cache/SysUserMemoryCache.java
new file mode 100644
index 000000000..9a6df5a32
--- /dev/null
+++ b/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/cache/SysUserMemoryCache.java
@@ -0,0 +1,25 @@
+package cn.stylefeng.roses.kernel.system.modular.user.cache;
+
+import cn.hutool.cache.impl.TimedCache;
+import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator;
+import cn.stylefeng.roses.kernel.system.api.constants.SystemConstants;
+import cn.stylefeng.roses.kernel.system.api.pojo.user.SysUserDTO;
+
+/**
+ * 用户的缓存
+ *
+ * @author fengshuonan
+ * @date 2021/2/28 10:23
+ */
+public class SysUserMemoryCache extends AbstractMemoryCacheOperator {
+
+ public SysUserMemoryCache(TimedCache timedCache) {
+ super(timedCache);
+ }
+
+ @Override
+ public String getCommonKeyPrefix() {
+ return SystemConstants.USER_CACHE_PREFIX;
+ }
+
+}
diff --git a/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/cache/SysUserRedisCache.java b/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/cache/SysUserRedisCache.java
new file mode 100644
index 000000000..06c523e98
--- /dev/null
+++ b/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/cache/SysUserRedisCache.java
@@ -0,0 +1,25 @@
+package cn.stylefeng.roses.kernel.system.modular.user.cache;
+
+import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator;
+import cn.stylefeng.roses.kernel.system.api.constants.SystemConstants;
+import cn.stylefeng.roses.kernel.system.api.pojo.user.SysUserDTO;
+import org.springframework.data.redis.core.RedisTemplate;
+
+/**
+ * 用户的缓存
+ *
+ * @author fengshuonan
+ * @date 2021/2/28 10:23
+ */
+public class SysUserRedisCache extends AbstractRedisCacheOperator {
+
+ public SysUserRedisCache(RedisTemplate redisTemplate) {
+ super(redisTemplate);
+ }
+
+ @Override
+ public String getCommonKeyPrefix() {
+ return SystemConstants.USER_CACHE_PREFIX;
+ }
+
+}
diff --git a/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/service/impl/SysUserServiceImpl.java b/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/service/impl/SysUserServiceImpl.java
index f848c12d8..54b268dd4 100644
--- a/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/service/impl/SysUserServiceImpl.java
+++ b/kernel-s-system/system-business-user/src/main/java/cn/stylefeng/roses/kernel/system/modular/user/service/impl/SysUserServiceImpl.java
@@ -11,6 +11,7 @@ import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
+import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
@@ -109,6 +110,9 @@ public class SysUserServiceImpl extends ServiceImpl impl
@Resource
private OrganizationServiceApi organizationServiceApi;
+ @Resource
+ private CacheOperatorApi sysUserCacheOperatorApi;
+
@Override
public void register(SysUserRequest sysUserRequest) {
SysUser sysUser = new SysUser();
@@ -175,6 +179,9 @@ public class SysUserServiceImpl extends ServiceImpl impl
// 删除该用户对应的用户-数据范围表关联信息
sysUserDataScopeService.delByUserId(userId);
+
+ // 清除缓存中的用户信息
+ sysUserCacheOperatorApi.remove(String.valueOf(userId));
}
@Override
@@ -199,6 +206,9 @@ public class SysUserServiceImpl extends ServiceImpl impl
// 更新用户员工信息
sysUserOrgService.edit(sysUser.getUserId(), sysUserRequest.getOrgId(), sysUserRequest.getPositionId());
+
+ // 清除缓存中的用户信息
+ sysUserCacheOperatorApi.remove(String.valueOf(sysUser.getUserId()));
}
@Override
@@ -209,6 +219,9 @@ public class SysUserServiceImpl extends ServiceImpl impl
SysUserCreateFactory.fillUpdateInfo(sysUserRequest, sysUser);
this.updateById(sysUser);
+
+ // 清除缓存中的用户信息
+ sysUserCacheOperatorApi.remove(String.valueOf(sysUser.getUserId()));
}
@Override
@@ -236,6 +249,9 @@ public class SysUserServiceImpl extends ServiceImpl impl
log.error(SysUserExceptionEnum.UPDATE_USER_STATUS_ERROR.getUserTip());
throw new SystemModularException(SysUserExceptionEnum.UPDATE_USER_STATUS_ERROR);
}
+
+ // 清除缓存中的用户信息
+ sysUserCacheOperatorApi.remove(String.valueOf(sysUser.getUserId()));
}
@Override
@@ -291,6 +307,9 @@ public class SysUserServiceImpl extends ServiceImpl impl
SimpleUserInfo simpleUserInfo = loginUser.getSimpleUserInfo();
simpleUserInfo.setAvatar(fileId);
sessionManagerApi.updateSession(LoginContext.me().getToken(), loginUser);
+
+ // 清除缓存中的用户信息
+ sysUserCacheOperatorApi.remove(String.valueOf(sysUser.getUserId()));
}
@Override
@@ -569,9 +588,18 @@ public class SysUserServiceImpl extends ServiceImpl impl
@Override
public SysUserDTO getUserInfoByUserId(Long userId) {
+
+ // 从缓存查询用户
+ SysUserDTO sysUserDTO = sysUserCacheOperatorApi.get(String.valueOf(userId));
+ if (sysUserDTO != null) {
+ return sysUserDTO;
+ }
+
SysUser sysUser = this.getById(userId);
if (ObjectUtil.isNotEmpty(sysUser)) {
- return BeanUtil.copyProperties(sysUser, SysUserDTO.class);
+ SysUserDTO result = BeanUtil.copyProperties(sysUser, SysUserDTO.class);
+ sysUserCacheOperatorApi.put(String.valueOf(userId), result);
+ return result;
}
return null;
}
@@ -618,10 +646,26 @@ public class SysUserServiceImpl extends ServiceImpl impl
* @date 2020/3/26 9:54
*/
private SysUser querySysUser(SysUserRequest sysUserRequest) {
+
+ // 先从缓存中获取用户信息
+ String userIdKey = String.valueOf(sysUserRequest.getUserId());
+ SysUserDTO sysUserDTO = sysUserCacheOperatorApi.get(userIdKey);
+ if (sysUserDTO != null) {
+ SysUser tempUser = new SysUser();
+ BeanUtil.copyProperties(sysUserDTO, tempUser);
+ return tempUser;
+ }
+
SysUser sysUser = this.getById(sysUserRequest.getUserId());
if (ObjectUtil.isNull(sysUser)) {
throw new SystemModularException(SysUserExceptionEnum.USER_NOT_EXIST, sysUserRequest.getUserId());
}
+
+ // 放入缓存
+ SysUserDTO sysUserDTOCache = new SysUserDTO();
+ BeanUtil.copyProperties(sysUser, sysUserDTOCache);
+ sysUserCacheOperatorApi.put(userIdKey, sysUserDTOCache);
+
return sysUser;
}
diff --git a/kernel-s-system/system-spring-boot-starter/pom.xml b/kernel-s-system/system-spring-boot-starter/pom.xml
index dcc8f1f2a..c41fd0973 100644
--- a/kernel-s-system/system-spring-boot-starter/pom.xml
+++ b/kernel-s-system/system-spring-boot-starter/pom.xml
@@ -53,11 +53,17 @@
+
cn.stylefeng.roses
system-business-user
7.0.1
+
+ cn.stylefeng.roses
+ cache-sdk-memory
+ 7.0.1
+
diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsUserCacheAutoConfiguration.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsUserCacheAutoConfiguration.java
new file mode 100644
index 000000000..f19bc28a8
--- /dev/null
+++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsUserCacheAutoConfiguration.java
@@ -0,0 +1,35 @@
+package cn.stylefeng.roses.kernel.system.starter;
+
+import cn.hutool.cache.CacheUtil;
+import cn.hutool.cache.impl.TimedCache;
+import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
+import cn.stylefeng.roses.kernel.system.api.constants.SystemConstants;
+import cn.stylefeng.roses.kernel.system.api.pojo.user.SysUserDTO;
+import cn.stylefeng.roses.kernel.system.modular.user.cache.SysUserMemoryCache;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 用户缓存的自动配置
+ *
+ * @author fengshuonan
+ * @date 2021/2/28 10:29
+ */
+@Configuration
+public class GunsUserCacheAutoConfiguration {
+
+ /**
+ * 用户的缓存
+ *
+ * @author fengshuonan
+ * @date 2021/2/28 10:30
+ */
+ @Bean
+ @ConditionalOnMissingBean(name = "sysUserCacheOperatorApi")
+ public CacheOperatorApi sysUserCacheOperatorApi() {
+ TimedCache sysUserTimedCache = CacheUtil.newTimedCache(SystemConstants.USER_CACHE_TIMEOUT_SECONDS * 1000);
+ return new SysUserMemoryCache(sysUserTimedCache);
+ }
+
+}
diff --git a/kernel-s-system/system-spring-boot-starter/src/main/resources/META-INF/spring.factories b/kernel-s-system/system-spring-boot-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..c00e2a177
--- /dev/null
+++ b/kernel-s-system/system-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ cn.stylefeng.roses.kernel.system.starter.GunsUserCacheAutoConfiguration