diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/user/UserInfoDetailDTO.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/user/UserInfoDetailDTO.java
index d6d38605f..69d76366f 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/user/UserInfoDetailDTO.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/user/UserInfoDetailDTO.java
@@ -70,6 +70,12 @@ public class UserInfoDetailDTO {
@ChineseDescription("账号")
private String account;
+ /**
+ * 头像,存的为文件id
+ */
+ @ChineseDescription("头像,存的为文件id")
+ private Long avatar;
+
/**
* 生日
*/
@@ -119,6 +125,12 @@ public class UserInfoDetailDTO {
@ChineseDescription("用户的排序")
private BigDecimal userSort;
+ /**
+ * 用户工号
+ */
+ @ChineseDescription("用户工号")
+ private String employeeNumber;
+
/**
* 对接外部主数据的用户id
*/
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserNameMemoryCache.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserInfoMemoryCache.java
similarity index 54%
rename from kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserNameMemoryCache.java
rename to kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserInfoMemoryCache.java
index b979b721d..30e44b134 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserNameMemoryCache.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserInfoMemoryCache.java
@@ -2,25 +2,26 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.username;
import cn.hutool.cache.impl.TimedCache;
import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator;
+import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserInfoDetailDTO;
import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
/**
- * 用户真实姓名的缓存
+ * 用户的缓存
*
- * key是用户id,value是用户的真实姓名
+ * key是用户id,value是用户
*
* @author fengshuonan
* @since 2025/1/10 11:06
*/
-public class UserNameMemoryCache extends AbstractMemoryCacheOperator {
+public class UserInfoMemoryCache extends AbstractMemoryCacheOperator {
- public UserNameMemoryCache(TimedCache timedCache) {
+ public UserInfoMemoryCache(TimedCache timedCache) {
super(timedCache);
}
@Override
public String getCommonKeyPrefix() {
- return UserConstants.USER_NAME_CACHE_PREFIX;
+ return UserConstants.USER_INFO_CACHE_PREFIX;
}
}
\ No newline at end of file
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserNameRedisCache.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserInfoRedisCache.java
similarity index 55%
rename from kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserNameRedisCache.java
rename to kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserInfoRedisCache.java
index 5e2389f19..35069e817 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserNameRedisCache.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/UserInfoRedisCache.java
@@ -1,26 +1,27 @@
package cn.stylefeng.roses.kernel.sys.modular.user.cache.username;
import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator;
+import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserInfoDetailDTO;
import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
import org.springframework.data.redis.core.RedisTemplate;
/**
- * 用户真实姓名的缓存
+ * 用户的缓存
*
- * key是用户id,value是用户的真实姓名
+ * key是用户id,value是用户
*
* @author fengshuonan
* @since 2025/1/10 11:05
*/
-public class UserNameRedisCache extends AbstractRedisCacheOperator {
+public class UserInfoRedisCache extends AbstractRedisCacheOperator {
- public UserNameRedisCache(RedisTemplate redisTemplate) {
+ public UserInfoRedisCache(RedisTemplate redisTemplate) {
super(redisTemplate);
}
@Override
public String getCommonKeyPrefix() {
- return UserConstants.USER_NAME_CACHE_PREFIX;
+ return UserConstants.USER_INFO_CACHE_PREFIX;
}
}
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/clear/UserNameClearListener.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/clear/UserInfoClearListener.java
similarity index 64%
rename from kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/clear/UserNameClearListener.java
rename to kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/clear/UserInfoClearListener.java
index 0aa44f3be..d3da3a428 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/clear/UserNameClearListener.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/username/clear/UserInfoClearListener.java
@@ -3,6 +3,7 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.username.clear;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener;
+import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserInfoDetailDTO;
import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -14,10 +15,10 @@ import org.springframework.stereotype.Service;
* @since 2025/1/10 11:10
*/
@Service
-public class UserNameClearListener {
+public class UserInfoClearListener {
- @Resource(name = "userNameCache")
- private CacheOperatorApi userNameCache;
+ @Resource(name = "userInfoCache")
+ private CacheOperatorApi userInfoCache;
/**
* 监听更新用户
@@ -25,10 +26,10 @@ public class UserNameClearListener {
* @author fengshuonan
* @since 2025/1/10 11:11
*/
- @BusinessListener(businessCode = UserConstants.UPDATE_USER_NAME_EVENT)
- public void updateUserName(Long userId) {
+ @BusinessListener(businessCode = UserConstants.UPDATE_USER_INFO_EVENT)
+ public void updateUserInfo(Long userId) {
if (ObjectUtil.isNotEmpty(userId)) {
- userNameCache.remove(String.valueOf(userId));
+ userInfoCache.remove(String.valueOf(userId));
}
}
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/constants/UserConstants.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/constants/UserConstants.java
index f5f9fcab5..48bd15799 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/constants/UserConstants.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/constants/UserConstants.java
@@ -19,13 +19,13 @@ public interface UserConstants {
String UPDATE_USER_ROLE_EVENT = "UPDATE_USER_ROLE_EVENT";
/**
- * 用户姓名的缓存
+ * 用户信息详情的缓存
*/
- String USER_NAME_CACHE_PREFIX = "SYS:USER_NAME:";
+ String USER_INFO_CACHE_PREFIX = "SYS:USER_INFO:";
/**
* 更新用户姓名的事件(包含新增、修改、删除用户)
*/
- String UPDATE_USER_NAME_EVENT = "UPDATE_USER_NAME_EVENT";
+ String UPDATE_USER_INFO_EVENT = "UPDATE_USER_INFO_EVENT";
}
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserServiceImpl.java
index ec13173d3..142a7d542 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserServiceImpl.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserServiceImpl.java
@@ -58,7 +58,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
-import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants.UPDATE_USER_NAME_EVENT;
+import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants.UPDATE_USER_INFO_EVENT;
/**
* 系统用户业务实现层
@@ -94,8 +94,8 @@ public class SysUserServiceImpl extends ServiceImpl impl
@Resource
private SysUserCertificateService sysUserCertificateService;
- @Resource(name = "userNameCache")
- private CacheOperatorApi userNameCache;
+ @Resource(name = "userInfoCache")
+ private CacheOperatorApi userInfoCache;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -149,7 +149,7 @@ public class SysUserServiceImpl extends ServiceImpl impl
this.baseRemoveUser(CollectionUtil.set(false, sysUser.getUserId()));
// 发布更新缓存事件,清空用户名称缓存
- BusinessEventPublisher.publishEvent(UPDATE_USER_NAME_EVENT, sysUser.getUserId());
+ BusinessEventPublisher.publishEvent(UPDATE_USER_INFO_EVENT, sysUser.getUserId());
// 记录日志
BusinessLogUtil.setLogTitle("删除用户,用户账号:" + sysUser.getAccount());
@@ -176,7 +176,7 @@ public class SysUserServiceImpl extends ServiceImpl impl
// 发布更新缓存事件,清空用户名称缓存
for (Long userId : userIdList) {
- BusinessEventPublisher.publishEvent(UPDATE_USER_NAME_EVENT, userId.toString());
+ BusinessEventPublisher.publishEvent(UPDATE_USER_INFO_EVENT, userId.toString());
}
// 记录日志
@@ -221,7 +221,7 @@ public class SysUserServiceImpl extends ServiceImpl impl
BusinessLogUtil.addContent("更新后用户信息如下:\n", sysUser);
// 发布修改的事件
- BusinessEventPublisher.publishEvent(UPDATE_USER_NAME_EVENT, sysUser.getUserId());
+ BusinessEventPublisher.publishEvent(UPDATE_USER_INFO_EVENT, sysUser.getUserId());
}
@Override
@@ -336,17 +336,13 @@ public class SysUserServiceImpl extends ServiceImpl impl
Long userId = LoginContext.me().getLoginUser().getUserId();
// 查询用户的详细信息
- LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
- sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId);
- sysUserLambdaQueryWrapper.select(SysUser::getRealName, SysUser::getAccount, SysUser::getAvatar, SysUser::getEmail, SysUser::getPhone, SysUser::getSex, SysUser::getBirthday);
- SysUser sysUser = this.getOne(sysUserLambdaQueryWrapper, false);
-
- if (sysUser == null) {
+ UserInfoDetailDTO userDetail = this.getUserDetail(userId);
+ if (userDetail == null || userDetail.getUserId() == null) {
return new PersonalInfo();
}
PersonalInfo personalInfo = new PersonalInfo();
- BeanUtil.copyProperties(sysUser, personalInfo);
+ BeanUtil.copyProperties(userDetail, personalInfo);
return personalInfo;
}
@@ -363,7 +359,7 @@ public class SysUserServiceImpl extends ServiceImpl impl
this.updateById(sysUser);
// 发布修改用户的事件
- BusinessEventPublisher.publishEvent(UPDATE_USER_NAME_EVENT, sysUserRequest.getUserId());
+ BusinessEventPublisher.publishEvent(UPDATE_USER_INFO_EVENT, sysUserRequest.getUserId());
}
@Override
@@ -466,21 +462,18 @@ public class SysUserServiceImpl extends ServiceImpl impl
return null;
}
- LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
- sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId);
- sysUserLambdaQueryWrapper.select(SysUser::getRealName, SysUser::getAvatar, SysUser::getAccount);
- SysUser sysUser = this.getOne(sysUserLambdaQueryWrapper);
- if (sysUser == null) {
+ UserInfoDetailDTO userDetail = this.getUserDetail(userId);
+ if (userDetail == null || userDetail.getUserId() == null) {
return null;
}
SimpleUserDTO simpleUserDTO = new SimpleUserDTO();
simpleUserDTO.setUserId(userId);
- simpleUserDTO.setRealName(sysUser.getRealName());
- simpleUserDTO.setAccount(sysUser.getAccount());
+ simpleUserDTO.setRealName(userDetail.getRealName());
+ simpleUserDTO.setAccount(userDetail.getAccount());
// 获取头像文件id信息,转化为头像URL
- Long avatarFileId = sysUser.getAvatar();
+ Long avatarFileId = userDetail.getAvatar();
if (avatarFileId != null) {
// 获取头像的访问地址
String fileAuthUrl = fileInfoApi.getFileAuthUrl(avatarFileId);
@@ -495,26 +488,8 @@ public class SysUserServiceImpl extends ServiceImpl impl
if (userId == null) {
return "";
}
-
- // 先从缓存获取
- String userNameCached = userNameCache.get(userId.toString());
- if (userNameCached != null) {
- return userNameCached;
- }
-
- LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
- sysUserLambdaQueryWrapper.select(SysUser::getRealName);
- sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId);
- SysUser sysUser = this.getOne(sysUserLambdaQueryWrapper);
- if (sysUser == null) {
- // 查询结果记录到缓存
- userNameCache.put(userId.toString(), "", SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
- return "";
- }
-
- // 查询结果记录到缓存
- userNameCache.put(userId.toString(), sysUser.getRealName(), SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
- return sysUser.getRealName();
+ UserInfoDetailDTO userDetail = this.getUserDetail(userId);
+ return userDetail.getRealName();
}
@Override
@@ -649,16 +624,12 @@ public class SysUserServiceImpl extends ServiceImpl impl
return new OnlineUserItem();
}
- LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
- wrapper.eq(SysUser::getUserId, userId);
- wrapper.select(SysUser::getRealName, SysUser::getAccount);
- SysUser sysUser = this.getOne(wrapper, false);
-
- if (sysUser != null) {
- return new OnlineUserItem(userId, sysUser.getRealName(), sysUser.getAccount());
- } else {
+ UserInfoDetailDTO userDetail = this.getUserDetail(userId);
+ if (userDetail == null || userDetail.getUserId() == null) {
return new OnlineUserItem();
}
+
+ return new OnlineUserItem(userId, userDetail.getRealName(), userDetail.getAccount());
}
@Override
@@ -703,23 +674,31 @@ public class SysUserServiceImpl extends ServiceImpl impl
@Override
public UserInfoDetailDTO getUserDetail(Long userId) {
- UserInfoDetailDTO result = new UserInfoDetailDTO();
-
if (ObjectUtil.isEmpty(userId)) {
+ return new UserInfoDetailDTO();
+ }
+
+ // 先获取缓存中是否有记录
+ UserInfoDetailDTO result = userInfoCache.get(String.valueOf(userId));
+ if (result != null) {
return result;
}
LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId);
- sysUserLambdaQueryWrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getNickName, SysUser::getAccount, SysUser::getBirthday, SysUser::getSex, SysUser::getPhone, SysUser::getTel,
- SysUser::getEmail, SysUser::getSuperAdminFlag, SysUser::getStatusFlag, SysUser::getUserSort, SysUser::getMasterUserId);
- SysUser userInfo = this.getOne(sysUserLambdaQueryWrapper);
-
- if (userInfo != null) {
- BeanUtil.copyProperties(userInfo, result);
- return result;
+ sysUserLambdaQueryWrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getNickName, SysUser::getAccount, SysUser::getAvatar,
+ SysUser::getBirthday, SysUser::getSex, SysUser::getEmail, SysUser::getPhone, SysUser::getTel,
+ SysUser::getSuperAdminFlag, SysUser::getStatusFlag, SysUser::getUserSort, SysUser::getEmployeeNumber, SysUser::getMasterUserId);
+ SysUser userInfo = this.getOne(sysUserLambdaQueryWrapper, false);
+ if (userInfo == null) {
+ return new UserInfoDetailDTO();
}
+ result = new UserInfoDetailDTO();
+ BeanUtil.copyProperties(userInfo, result);
+
+ // 缓存结果
+ this.userInfoCache.put(String.valueOf(userInfo.getUserId()), result, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
return result;
}
diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java
index 4a60f9acb..755429b27 100644
--- a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java
+++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java
@@ -28,7 +28,8 @@ import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants;
-import cn.stylefeng.roses.kernel.sys.modular.user.cache.username.UserNameMemoryCache;
+import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserInfoDetailDTO;
+import cn.stylefeng.roses.kernel.sys.modular.user.cache.username.UserInfoMemoryCache;
import cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole.UserRoleMemoryCache;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
@@ -61,16 +62,16 @@ public class UserMemoryCacheAutoConfiguration {
}
/**
- * 用户姓名缓存
+ * 用户缓存
*
* @author fengshuonan
* @since 2025/1/10 11:12
*/
@Bean
- public CacheOperatorApi userNameCache() {
+ public CacheOperatorApi userInfoCache() {
// 1小时过期
- TimedCache cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
- return new UserNameMemoryCache(cache);
+ TimedCache cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
+ return new UserInfoMemoryCache(cache);
}
}
diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java
index a61e0373d..b53a8491b 100644
--- a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java
+++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java
@@ -26,7 +26,8 @@ package cn.stylefeng.roses.kernel.sys.starter.cache.user;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.cache.redis.util.CreateRedisTemplateUtil;
-import cn.stylefeng.roses.kernel.sys.modular.user.cache.username.UserNameRedisCache;
+import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserInfoDetailDTO;
+import cn.stylefeng.roses.kernel.sys.modular.user.cache.username.UserInfoRedisCache;
import cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole.UserRoleRedisCache;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -60,15 +61,15 @@ public class UserRedisCacheAutoConfiguration {
}
/**
- * 用户名称缓存
+ * 用户缓存
*
* @author fengshuonan
* @since 2025/1/10 11:12
*/
@Bean
- public CacheOperatorApi userNameCache(RedisConnectionFactory redisConnectionFactory) {
- RedisTemplate redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory);
- return new UserNameRedisCache(redisTemplate);
+ public CacheOperatorApi userInfoCache(RedisConnectionFactory redisConnectionFactory) {
+ RedisTemplate redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory);
+ return new UserInfoRedisCache(redisTemplate);
}
}