【8.3.3】【sys】【cache】更新用户缓存value

pull/62/head
stylefeng 2025-01-14 22:14:06 +08:00
parent 6ab35c8503
commit 7c622a04f5
8 changed files with 84 additions and 88 deletions

View File

@ -70,6 +70,12 @@ public class UserInfoDetailDTO {
@ChineseDescription("账号") @ChineseDescription("账号")
private String account; private String account;
/**
* id
*/
@ChineseDescription("头像存的为文件id")
private Long avatar;
/** /**
* *
*/ */
@ -119,6 +125,12 @@ public class UserInfoDetailDTO {
@ChineseDescription("用户的排序") @ChineseDescription("用户的排序")
private BigDecimal userSort; private BigDecimal userSort;
/**
*
*/
@ChineseDescription("用户工号")
private String employeeNumber;
/** /**
* id * id
*/ */

View File

@ -2,25 +2,26 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.username;
import cn.hutool.cache.impl.TimedCache; import cn.hutool.cache.impl.TimedCache;
import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator; 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; import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
/** /**
* *
* <p> * <p>
* keyidvalue * keyidvalue
* *
* @author fengshuonan * @author fengshuonan
* @since 2025/1/10 11:06 * @since 2025/1/10 11:06
*/ */
public class UserNameMemoryCache extends AbstractMemoryCacheOperator<String> { public class UserInfoMemoryCache extends AbstractMemoryCacheOperator<UserInfoDetailDTO> {
public UserNameMemoryCache(TimedCache<String, String> timedCache) { public UserInfoMemoryCache(TimedCache<String, UserInfoDetailDTO> timedCache) {
super(timedCache); super(timedCache);
} }
@Override @Override
public String getCommonKeyPrefix() { public String getCommonKeyPrefix() {
return UserConstants.USER_NAME_CACHE_PREFIX; return UserConstants.USER_INFO_CACHE_PREFIX;
} }
} }

View File

@ -1,26 +1,27 @@
package cn.stylefeng.roses.kernel.sys.modular.user.cache.username; package cn.stylefeng.roses.kernel.sys.modular.user.cache.username;
import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator; 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 cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
/** /**
* *
* <p> * <p>
* keyidvalue * keyidvalue
* *
* @author fengshuonan * @author fengshuonan
* @since 2025/1/10 11:05 * @since 2025/1/10 11:05
*/ */
public class UserNameRedisCache extends AbstractRedisCacheOperator<String> { public class UserInfoRedisCache extends AbstractRedisCacheOperator<UserInfoDetailDTO> {
public UserNameRedisCache(RedisTemplate<String, String> redisTemplate) { public UserInfoRedisCache(RedisTemplate<String, UserInfoDetailDTO> redisTemplate) {
super(redisTemplate); super(redisTemplate);
} }
@Override @Override
public String getCommonKeyPrefix() { public String getCommonKeyPrefix() {
return UserConstants.USER_NAME_CACHE_PREFIX; return UserConstants.USER_INFO_CACHE_PREFIX;
} }
} }

View File

@ -3,6 +3,7 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.username.clear;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener; 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 cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -14,10 +15,10 @@ import org.springframework.stereotype.Service;
* @since 2025/1/10 11:10 * @since 2025/1/10 11:10
*/ */
@Service @Service
public class UserNameClearListener { public class UserInfoClearListener {
@Resource(name = "userNameCache") @Resource(name = "userInfoCache")
private CacheOperatorApi<String> userNameCache; private CacheOperatorApi<UserInfoDetailDTO> userInfoCache;
/** /**
* *
@ -25,10 +26,10 @@ public class UserNameClearListener {
* @author fengshuonan * @author fengshuonan
* @since 2025/1/10 11:11 * @since 2025/1/10 11:11
*/ */
@BusinessListener(businessCode = UserConstants.UPDATE_USER_NAME_EVENT) @BusinessListener(businessCode = UserConstants.UPDATE_USER_INFO_EVENT)
public void updateUserName(Long userId) { public void updateUserInfo(Long userId) {
if (ObjectUtil.isNotEmpty(userId)) { if (ObjectUtil.isNotEmpty(userId)) {
userNameCache.remove(String.valueOf(userId)); userInfoCache.remove(String.valueOf(userId));
} }
} }

View File

@ -19,13 +19,13 @@ public interface UserConstants {
String UPDATE_USER_ROLE_EVENT = "UPDATE_USER_ROLE_EVENT"; 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";
} }

View File

@ -58,7 +58,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; 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<SysUserMapper, SysUser> impl
@Resource @Resource
private SysUserCertificateService sysUserCertificateService; private SysUserCertificateService sysUserCertificateService;
@Resource(name = "userNameCache") @Resource(name = "userInfoCache")
private CacheOperatorApi<String> userNameCache; private CacheOperatorApi<UserInfoDetailDTO> userInfoCache;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -149,7 +149,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
this.baseRemoveUser(CollectionUtil.set(false, sysUser.getUserId())); 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()); BusinessLogUtil.setLogTitle("删除用户,用户账号:" + sysUser.getAccount());
@ -176,7 +176,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 发布更新缓存事件,清空用户名称缓存 // 发布更新缓存事件,清空用户名称缓存
for (Long userId : userIdList) { 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<SysUserMapper, SysUser> impl
BusinessLogUtil.addContent("更新后用户信息如下:\n", sysUser); BusinessLogUtil.addContent("更新后用户信息如下:\n", sysUser);
// 发布修改的事件 // 发布修改的事件
BusinessEventPublisher.publishEvent(UPDATE_USER_NAME_EVENT, sysUser.getUserId()); BusinessEventPublisher.publishEvent(UPDATE_USER_INFO_EVENT, sysUser.getUserId());
} }
@Override @Override
@ -336,17 +336,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
Long userId = LoginContext.me().getLoginUser().getUserId(); Long userId = LoginContext.me().getLoginUser().getUserId();
// 查询用户的详细信息 // 查询用户的详细信息
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); UserInfoDetailDTO userDetail = this.getUserDetail(userId);
sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId); if (userDetail == null || userDetail.getUserId() == null) {
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) {
return new PersonalInfo(); return new PersonalInfo();
} }
PersonalInfo personalInfo = new PersonalInfo(); PersonalInfo personalInfo = new PersonalInfo();
BeanUtil.copyProperties(sysUser, personalInfo); BeanUtil.copyProperties(userDetail, personalInfo);
return personalInfo; return personalInfo;
} }
@ -363,7 +359,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
this.updateById(sysUser); this.updateById(sysUser);
// 发布修改用户的事件 // 发布修改用户的事件
BusinessEventPublisher.publishEvent(UPDATE_USER_NAME_EVENT, sysUserRequest.getUserId()); BusinessEventPublisher.publishEvent(UPDATE_USER_INFO_EVENT, sysUserRequest.getUserId());
} }
@Override @Override
@ -466,21 +462,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
return null; return null;
} }
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); UserInfoDetailDTO userDetail = this.getUserDetail(userId);
sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId); if (userDetail == null || userDetail.getUserId() == null) {
sysUserLambdaQueryWrapper.select(SysUser::getRealName, SysUser::getAvatar, SysUser::getAccount);
SysUser sysUser = this.getOne(sysUserLambdaQueryWrapper);
if (sysUser == null) {
return null; return null;
} }
SimpleUserDTO simpleUserDTO = new SimpleUserDTO(); SimpleUserDTO simpleUserDTO = new SimpleUserDTO();
simpleUserDTO.setUserId(userId); simpleUserDTO.setUserId(userId);
simpleUserDTO.setRealName(sysUser.getRealName()); simpleUserDTO.setRealName(userDetail.getRealName());
simpleUserDTO.setAccount(sysUser.getAccount()); simpleUserDTO.setAccount(userDetail.getAccount());
// 获取头像文件id信息转化为头像URL // 获取头像文件id信息转化为头像URL
Long avatarFileId = sysUser.getAvatar(); Long avatarFileId = userDetail.getAvatar();
if (avatarFileId != null) { if (avatarFileId != null) {
// 获取头像的访问地址 // 获取头像的访问地址
String fileAuthUrl = fileInfoApi.getFileAuthUrl(avatarFileId); String fileAuthUrl = fileInfoApi.getFileAuthUrl(avatarFileId);
@ -495,26 +488,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
if (userId == null) { if (userId == null) {
return ""; return "";
} }
UserInfoDetailDTO userDetail = this.getUserDetail(userId);
// 先从缓存获取 return userDetail.getRealName();
String userNameCached = userNameCache.get(userId.toString());
if (userNameCached != null) {
return userNameCached;
}
LambdaQueryWrapper<SysUser> 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();
} }
@Override @Override
@ -649,16 +624,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
return new OnlineUserItem(); return new OnlineUserItem();
} }
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>(); UserInfoDetailDTO userDetail = this.getUserDetail(userId);
wrapper.eq(SysUser::getUserId, userId); if (userDetail == null || userDetail.getUserId() == null) {
wrapper.select(SysUser::getRealName, SysUser::getAccount);
SysUser sysUser = this.getOne(wrapper, false);
if (sysUser != null) {
return new OnlineUserItem(userId, sysUser.getRealName(), sysUser.getAccount());
} else {
return new OnlineUserItem(); return new OnlineUserItem();
} }
return new OnlineUserItem(userId, userDetail.getRealName(), userDetail.getAccount());
} }
@Override @Override
@ -703,23 +674,31 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
@Override @Override
public UserInfoDetailDTO getUserDetail(Long userId) { public UserInfoDetailDTO getUserDetail(Long userId) {
UserInfoDetailDTO result = new UserInfoDetailDTO();
if (ObjectUtil.isEmpty(userId)) { if (ObjectUtil.isEmpty(userId)) {
return new UserInfoDetailDTO();
}
// 先获取缓存中是否有记录
UserInfoDetailDTO result = userInfoCache.get(String.valueOf(userId));
if (result != null) {
return result; return result;
} }
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId); sysUserLambdaQueryWrapper.eq(SysUser::getUserId, userId);
sysUserLambdaQueryWrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getNickName, SysUser::getAccount, SysUser::getBirthday, SysUser::getSex, SysUser::getPhone, SysUser::getTel, sysUserLambdaQueryWrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getNickName, SysUser::getAccount, SysUser::getAvatar,
SysUser::getEmail, SysUser::getSuperAdminFlag, SysUser::getStatusFlag, SysUser::getUserSort, SysUser::getMasterUserId); SysUser::getBirthday, SysUser::getSex, SysUser::getEmail, SysUser::getPhone, SysUser::getTel,
SysUser userInfo = this.getOne(sysUserLambdaQueryWrapper); SysUser::getSuperAdminFlag, SysUser::getStatusFlag, SysUser::getUserSort, SysUser::getEmployeeNumber, SysUser::getMasterUserId);
SysUser userInfo = this.getOne(sysUserLambdaQueryWrapper, false);
if (userInfo != null) { if (userInfo == null) {
BeanUtil.copyProperties(userInfo, result); return new UserInfoDetailDTO();
return result;
} }
result = new UserInfoDetailDTO();
BeanUtil.copyProperties(userInfo, result);
// 缓存结果
this.userInfoCache.put(String.valueOf(userInfo.getUserId()), result, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
return result; return result;
} }

View File

@ -28,7 +28,8 @@ import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache; import cn.hutool.cache.impl.TimedCache;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; 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.cache.userrole.UserRoleMemoryCache;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
@ -61,16 +62,16 @@ public class UserMemoryCacheAutoConfiguration {
} }
/** /**
* *
* *
* @author fengshuonan * @author fengshuonan
* @since 2025/1/10 11:12 * @since 2025/1/10 11:12
*/ */
@Bean @Bean
public CacheOperatorApi<String> userNameCache() { public CacheOperatorApi<UserInfoDetailDTO> userInfoCache() {
// 1小时过期 // 1小时过期
TimedCache<String, String> cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); TimedCache<String, UserInfoDetailDTO> cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
return new UserNameMemoryCache(cache); return new UserInfoMemoryCache(cache);
} }
} }

View File

@ -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.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.cache.redis.util.CreateRedisTemplateUtil; 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.cache.userrole.UserRoleRedisCache;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@ -60,15 +61,15 @@ public class UserRedisCacheAutoConfiguration {
} }
/** /**
* *
* *
* @author fengshuonan * @author fengshuonan
* @since 2025/1/10 11:12 * @since 2025/1/10 11:12
*/ */
@Bean @Bean
public CacheOperatorApi<String> userNameCache(RedisConnectionFactory redisConnectionFactory) { public CacheOperatorApi<UserInfoDetailDTO> userInfoCache(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory); RedisTemplate<String, UserInfoDetailDTO> redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory);
return new UserNameRedisCache(redisTemplate); return new UserInfoRedisCache(redisTemplate);
} }
} }