【8.0】【sys】【user】更新用户角色的缓存

pull/57/head
fengshuonan 2023-07-14 22:12:42 +08:00
parent 270ff4e6a8
commit c9a3c8b3d2
7 changed files with 138 additions and 114 deletions

View File

@ -0,0 +1 @@
package cn.stylefeng.roses.kernel.sys.modular.user.cache;

View File

@ -0,0 +1,26 @@
package cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole;
import cn.hutool.cache.impl.TimedCache;
import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator;
import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2023/7/14 22:00
*/
public class UserRoleMemoryCache extends AbstractMemoryCacheOperator<List<Long>> {
public UserRoleMemoryCache(TimedCache<String, List<Long>> timedCache) {
super(timedCache);
}
@Override
public String getCommonKeyPrefix() {
return UserConstants.USER_ROLE_CACHE_PREFIX;
}
}

View File

@ -0,0 +1,26 @@
package cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole;
import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator;
import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2023/7/14 21:58
*/
public class UserRoleRedisCache extends AbstractRedisCacheOperator<List<Long>> {
public UserRoleRedisCache(RedisTemplate<String, List<Long>> redisTemplate) {
super(redisTemplate);
}
@Override
public String getCommonKeyPrefix() {
return UserConstants.USER_ROLE_CACHE_PREFIX;
}
}

View File

@ -0,0 +1,38 @@
package cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole.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 org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants.UPDATE_USER_ROLE_EVENT;
/**
*
*
* @author fengshuonan
* @since 2023/7/14 22:05
*/
@Service
public class UserRoleClearListener {
@Resource(name = "userRoleCache")
private CacheOperatorApi<List<Long>> userRoleCache;
/**
*
*
* @author fengshuonan
* @since 2023/7/14 22:10
*/
@BusinessListener(businessCode = UPDATE_USER_ROLE_EVENT)
public void updateUserRole(Long userId) {
if (ObjectUtil.isNotEmpty(userId)) {
userRoleCache.remove(String.valueOf(userId));
}
}
}

View File

@ -0,0 +1,21 @@
package cn.stylefeng.roses.kernel.sys.modular.user.constants;
/**
*
*
* @author fengshuonan
* @since 2023/7/14 22:06
*/
public interface UserConstants {
/**
*
*/
String USER_ROLE_CACHE_PREFIX = "SYS:USER_ROLE:";
/**
*
*/
String UPDATE_USER_ROLE_EVENT = "UPDATE_USER_ROLE_EVENT";
}

View File

@ -1,13 +1,10 @@
package cn.stylefeng.roses.kernel.sys.modular.user.service; package cn.stylefeng.roses.kernel.sys.modular.user.service;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.sys.api.SysUserRoleServiceApi; import cn.stylefeng.roses.kernel.sys.api.SysUserRoleServiceApi;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import cn.stylefeng.roses.kernel.sys.modular.user.pojo.request.SysUserRoleRequest; import cn.stylefeng.roses.kernel.sys.modular.user.pojo.request.SysUserRoleRequest;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* *
* *
@ -16,62 +13,6 @@ import java.util.List;
*/ */
public interface SysUserRoleService extends IService<SysUserRole>, SysUserRoleServiceApi { public interface SysUserRoleService extends IService<SysUserRole>, SysUserRoleServiceApi {
/**
*
*
* @param sysUserRoleRequest
* @author fengshuonan
* @date 2023/06/10 21:26
*/
void add(SysUserRoleRequest sysUserRoleRequest);
/**
*
*
* @param sysUserRoleRequest
* @author fengshuonan
* @date 2023/06/10 21:26
*/
void del(SysUserRoleRequest sysUserRoleRequest);
/**
*
*
* @param sysUserRoleRequest
* @author fengshuonan
* @date 2023/06/10 21:26
*/
void edit(SysUserRoleRequest sysUserRoleRequest);
/**
*
*
* @param sysUserRoleRequest
* @author fengshuonan
* @date 2023/06/10 21:26
*/
SysUserRole detail(SysUserRoleRequest sysUserRoleRequest);
/**
*
*
* @param sysUserRoleRequest
* @return List<SysUserRole>
* @author fengshuonan
* @date 2023/06/10 21:26
*/
List<SysUserRole> findList(SysUserRoleRequest sysUserRoleRequest);
/**
*
*
* @param sysUserRoleRequest
* @return PageResult<SysUserRole>
* @author fengshuonan
* @date 2023/06/10 21:26
*/
PageResult<SysUserRole> findPage(SysUserRoleRequest sysUserRoleRequest);
/** /**
* *
* *

View File

@ -1,23 +1,19 @@
package cn.stylefeng.roses.kernel.sys.modular.user.service.impl; package cn.stylefeng.roses.kernel.sys.modular.user.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.event.sdk.publish.BusinessEventPublisher;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi; import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserRoleExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserRoleMapper; import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserRoleMapper;
import cn.stylefeng.roses.kernel.sys.modular.user.pojo.request.SysUserRoleRequest; import cn.stylefeng.roses.kernel.sys.modular.user.pojo.request.SysUserRoleRequest;
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserRoleService; import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserRoleService;
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserService; import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -28,6 +24,8 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants.UPDATE_USER_ROLE_EVENT;
/** /**
* *
* *
@ -44,37 +42,8 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
@Resource @Resource
private SysUserService sysUserService; private SysUserService sysUserService;
@Override @Resource(name = "userRoleCache")
public void add(SysUserRoleRequest sysUserRoleRequest) { private CacheOperatorApi<List<Long>> userRoleCache;
SysUserRole sysUserRole = new SysUserRole();
BeanUtil.copyProperties(sysUserRoleRequest, sysUserRole);
this.save(sysUserRole);
}
@Override
public void del(SysUserRoleRequest sysUserRoleRequest) {
SysUserRole sysUserRole = this.querySysUserRole(sysUserRoleRequest);
this.removeById(sysUserRole.getUserRoleId());
}
@Override
public void edit(SysUserRoleRequest sysUserRoleRequest) {
SysUserRole sysUserRole = this.querySysUserRole(sysUserRoleRequest);
BeanUtil.copyProperties(sysUserRoleRequest, sysUserRole);
this.updateById(sysUserRole);
}
@Override
public SysUserRole detail(SysUserRoleRequest sysUserRoleRequest) {
return this.querySysUserRole(sysUserRoleRequest);
}
@Override
public PageResult<SysUserRole> findPage(SysUserRoleRequest sysUserRoleRequest) {
LambdaQueryWrapper<SysUserRole> wrapper = createWrapper(sysUserRoleRequest);
Page<SysUserRole> sysRolePage = this.page(PageFactory.defaultPage(), wrapper);
return PageResultFactory.createPageResult(sysRolePage);
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -100,6 +69,10 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
newUserRoles.add(sysUserRole); newUserRoles.add(sysUserRole);
} }
this.saveBatch(newUserRoles); this.saveBatch(newUserRoles);
// 发布修改用户绑定角色的事件
BusinessEventPublisher.publishEvent(UPDATE_USER_ROLE_EVENT, sysUserRoleRequest.getUserId());
} }
@Override @Override
@ -113,12 +86,10 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
sysUserRole.setUserId(userId); sysUserRole.setUserId(userId);
sysUserRole.setRoleId(defaultRoleId); sysUserRole.setRoleId(defaultRoleId);
this.save(sysUserRole); this.save(sysUserRole);
}
@Override // 发布修改用户绑定角色的事件
public List<SysUserRole> findList(SysUserRoleRequest sysUserRoleRequest) { BusinessEventPublisher.publishEvent(UPDATE_USER_ROLE_EVENT, userId);
LambdaQueryWrapper<SysUserRole> wrapper = this.createWrapper(sysUserRoleRequest);
return this.list(wrapper);
} }
@Override @Override
@ -151,26 +122,26 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
return new ArrayList<>(); return new ArrayList<>();
} }
// 先从缓存查找用户的角色
List<Long> cachedRoleIds = userRoleCache.get(userId.toString());
if (cachedRoleIds != null) {
return cachedRoleIds;
}
LambdaQueryWrapper<SysUserRole> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysUserRole> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUserRole::getUserId, userId); wrapper.eq(SysUserRole::getUserId, userId);
wrapper.select(SysUserRole::getRoleId); wrapper.select(SysUserRole::getRoleId);
List<SysUserRole> sysUserRoleList = this.list(wrapper); List<SysUserRole> sysUserRoleList = this.list(wrapper);
return sysUserRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); List<Long> userRoleQueryResult = sysUserRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toList());
}
/** // 查询结果缓存起来
* if (ObjectUtil.isNotEmpty(userRoleQueryResult)) {
* userRoleCache.put(userId.toString(), userRoleQueryResult);
* @author fengshuonan return userRoleQueryResult;
* @date 2023/06/10 21:26
*/
private SysUserRole querySysUserRole(SysUserRoleRequest sysUserRoleRequest) {
SysUserRole sysUserRole = this.getById(sysUserRoleRequest.getUserRoleId());
if (ObjectUtil.isEmpty(sysUserRole)) {
throw new ServiceException(SysUserRoleExceptionEnum.SYS_USER_ROLE_NOT_EXISTED);
} }
return sysUserRole;
return userRoleQueryResult;
} }
/** /**