CmsUserManager.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.cyksj.service.mange.cms;
  2. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  3. import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
  4. import com.cyksj.mapper.manage.cms.CmsMenuMapper;
  5. import com.cyksj.mapper.manage.cms.CmsRoleMapper;
  6. import com.cyksj.mapper.manage.cms.CmsUserMapper;
  7. import com.cyksj.mapper.manage.cms.CmsUserRoleMapper;
  8. import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
  9. import com.cyksj.model.entity.CmsMenu;
  10. import com.cyksj.model.entity.CmsRole;
  11. import com.cyksj.model.entity.CmsUser;
  12. import com.cyksj.model.entity.CmsUserRole;
  13. import com.cyksj.service.mange.business.UserBusinessRateService;
  14. import com.cyksj.service.mange.cms.manager.service.CacheService;
  15. import lombok.RequiredArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.stereotype.Service;
  18. import java.util.Arrays;
  19. import java.util.List;
  20. import java.util.Set;
  21. import java.util.function.Supplier;
  22. import java.util.stream.Collectors;
  23. /*
  24. *项目名: yicang-admin
  25. *文件名: CmsUserManager
  26. *创建者: JavaZou
  27. *创建时间:2022/9/30 13:59
  28. */
  29. @Service
  30. @Slf4j
  31. @RequiredArgsConstructor
  32. public class CmsUserManager {
  33. private final CacheService cacheService;
  34. private final CmsUserMapper cmsUserMapper;
  35. private final CmsRoleMapper cmsRoleMapper;
  36. private final CmsMenuMapper cmsMenuMapper;
  37. private final CmsUserRoleMapper cmsUserRoleMapper;
  38. private final UserDistributeMapper userDistributeMapper;
  39. private final UserBusinessRateService userBusinessRateService;
  40. private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
  41. public CmsUser getUser(Long account) {
  42. return selectCacheByTemplate(() -> cacheService.getUserCache(account), () -> cmsUserMapper.selectById(account));
  43. }
  44. public void loadUserRedisCache(CmsUser user) throws Exception {
  45. cacheService.saveUser(user.getId());
  46. // 缓存用户角色
  47. cacheService.saveRoles(user.getId());
  48. // 缓存用户权限
  49. cacheService.savePermissions(user.getId());
  50. }
  51. public Set<String> getUserPermissions(Long account) {
  52. List<CmsMenu> cmsMenus = selectCacheByTemplate(() -> cacheService.getUserPermsCache(account), () -> cmsMenuMapper.getCmsMenusByAccount(account));
  53. if (cmsMenus == null) {
  54. return null;
  55. }
  56. return cmsMenus.stream().map(CmsMenu::getPerms).collect(Collectors.toSet());
  57. }
  58. public Set<String> getUserRoles(Long adminId) {
  59. List<CmsRole> cmsRoles = selectCacheByTemplate(
  60. () -> cacheService.getUserRoleCache(adminId),
  61. () -> cmsRoleMapper.getCmsRolesByAccount(adminId)
  62. );
  63. if (cmsRoles == null) {
  64. return null;
  65. }
  66. return cmsRoles.stream().map(CmsRole::getRoleName).collect(Collectors.toSet());
  67. }
  68. /**
  69. * 缓存查询模板
  70. *
  71. * @param cacheSelector 查询缓存的方法
  72. * @param databaseSelector 数据库查询方法
  73. * @return T
  74. */
  75. public static <T> T selectCacheByTemplate(Supplier<T> cacheSelector, Supplier<T> databaseSelector) {
  76. try {
  77. log.debug("查询redis ······");
  78. // 先查 Redis缓存
  79. T t = cacheSelector.get();
  80. if (t == null) {
  81. // 没有记录再查询数据库
  82. return databaseSelector.get();
  83. }
  84. return t;
  85. } catch (Exception e) {
  86. // 缓存查询出错,则去数据库查询
  87. log.error("redis查询 error:", e);
  88. log.debug("查询数据库 ······");
  89. return databaseSelector.get();
  90. }
  91. }
  92. public void saveUserRoleRelation(Long userId, String roleIds) {
  93. if (!userBusinessRateService.isBusiness(userId)) {
  94. userBusinessRateService.deleteBusinessRateByUid(userId);
  95. }
  96. Arrays.stream(roleIds.split(",")).collect(Collectors.toSet()).forEach(roleId -> {
  97. CmsRole cmsRole = cmsRoleMapper.selectById(roleId);
  98. if (cmsRole != null && cmsRole.getRoleName().contains("商务")) {
  99. TASK_EXECUTOR.execute(() -> userBusinessRateService.saveBusinessRate(userId));
  100. }
  101. cmsUserRoleMapper.insert(new CmsUserRole(userId, Long.valueOf(roleId)));
  102. });
  103. }
  104. public void delUserRoleRelation(Long userId) throws Exception {
  105. cmsUserRoleMapper.delete(Wrappers.lambdaQuery(CmsUserRole.class).eq(CmsUserRole::getUserId, userId));
  106. //删除用户缓存
  107. cacheService.deleteUserCache(userId);
  108. //删除角色缓存
  109. cacheService.delUserRoleCache(userId);
  110. //删除权限缓存
  111. cacheService.delUserPermissionsCache(userId);
  112. }
  113. public void saveUserRoleRelationAndCache(CmsUser cmsUser, String roles) throws Exception {
  114. //用户角色关联入库
  115. this.saveUserRoleRelation(cmsUser.getId(), roles);
  116. //缓存用户最数据
  117. loadUserRedisCache(cmsUser);
  118. }
  119. }