mirror of https://gitee.com/stylefeng/roses
【8.3.3】【sys】【cache】更新用户缓存value
parent
6ab35c8503
commit
7c622a04f5
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* 用户真实姓名的缓存
|
||||
* 用户的缓存
|
||||
* <p>
|
||||
* key是用户id,value是用户的真实姓名
|
||||
* key是用户id,value是用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommonKeyPrefix() {
|
||||
return UserConstants.USER_NAME_CACHE_PREFIX;
|
||||
return UserConstants.USER_INFO_CACHE_PREFIX;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* 用户真实姓名的缓存
|
||||
* 用户的缓存
|
||||
* <p>
|
||||
* key是用户id,value是用户的真实姓名
|
||||
* key是用户id,value是用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommonKeyPrefix() {
|
||||
return UserConstants.USER_NAME_CACHE_PREFIX;
|
||||
return UserConstants.USER_INFO_CACHE_PREFIX;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<String> userNameCache;
|
||||
@Resource(name = "userInfoCache")
|
||||
private CacheOperatorApi<UserInfoDetailDTO> 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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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";
|
||||
|
||||
}
|
||||
|
|
|
@ -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<SysUserMapper, SysUser> impl
|
|||
@Resource
|
||||
private SysUserCertificateService sysUserCertificateService;
|
||||
|
||||
@Resource(name = "userNameCache")
|
||||
private CacheOperatorApi<String> userNameCache;
|
||||
@Resource(name = "userInfoCache")
|
||||
private CacheOperatorApi<UserInfoDetailDTO> userInfoCache;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
|
@ -149,7 +149,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
|
|||
Long userId = LoginContext.me().getLoginUser().getUserId();
|
||||
|
||||
// 查询用户的详细信息
|
||||
LambdaQueryWrapper<SysUser> 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<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
|
|||
return null;
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<SysUser> 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<SysUserMapper, SysUser> impl
|
|||
if (userId == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// 先从缓存获取
|
||||
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();
|
||||
UserInfoDetailDTO userDetail = this.getUserDetail(userId);
|
||||
return userDetail.getRealName();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -649,16 +624,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
return new OnlineUserItem();
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<SysUser> 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<SysUserMapper, SysUser> 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<SysUser> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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<String> userNameCache() {
|
||||
public CacheOperatorApi<UserInfoDetailDTO> userInfoCache() {
|
||||
// 1小时过期
|
||||
TimedCache<String, String> cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
|
||||
return new UserNameMemoryCache(cache);
|
||||
TimedCache<String, UserInfoDetailDTO> cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
|
||||
return new UserInfoMemoryCache(cache);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<String> userNameCache(RedisConnectionFactory redisConnectionFactory) {
|
||||
RedisTemplate<String, String> redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory);
|
||||
return new UserNameRedisCache(redisTemplate);
|
||||
public CacheOperatorApi<UserInfoDetailDTO> userInfoCache(RedisConnectionFactory redisConnectionFactory) {
|
||||
RedisTemplate<String, UserInfoDetailDTO> redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory);
|
||||
return new UserInfoRedisCache(redisTemplate);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue