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); } }