|
@@ -4,28 +4,31 @@ import cc.iotkit.common.api.PageRequest;
|
|
import cc.iotkit.common.api.Paging;
|
|
import cc.iotkit.common.api.Paging;
|
|
import cc.iotkit.common.exception.BizException;
|
|
import cc.iotkit.common.exception.BizException;
|
|
import cc.iotkit.common.satoken.utils.LoginHelper;
|
|
import cc.iotkit.common.satoken.utils.LoginHelper;
|
|
|
|
+import cc.iotkit.common.undefined.LoginUser;
|
|
import cc.iotkit.common.utils.MapstructUtils;
|
|
import cc.iotkit.common.utils.MapstructUtils;
|
|
|
|
+import cc.iotkit.common.utils.StreamUtils;
|
|
import cc.iotkit.common.utils.StringUtils;
|
|
import cc.iotkit.common.utils.StringUtils;
|
|
import cc.iotkit.data.system.ISysRoleData;
|
|
import cc.iotkit.data.system.ISysRoleData;
|
|
import cc.iotkit.data.system.ISysRoleDeptData;
|
|
import cc.iotkit.data.system.ISysRoleDeptData;
|
|
import cc.iotkit.data.system.ISysRoleMenuData;
|
|
import cc.iotkit.data.system.ISysRoleMenuData;
|
|
import cc.iotkit.data.system.ISysUserRoleData;
|
|
import cc.iotkit.data.system.ISysUserRoleData;
|
|
import cc.iotkit.model.system.SysRole;
|
|
import cc.iotkit.model.system.SysRole;
|
|
-import cc.iotkit.system.dto.SysRoleDept;
|
|
|
|
-import cc.iotkit.system.dto.SysUserRole;
|
|
|
|
|
|
+import cc.iotkit.model.system.SysRoleDept;
|
|
|
|
+import cc.iotkit.model.system.SysRoleMenu;
|
|
|
|
+import cc.iotkit.model.system.SysUserRole;
|
|
import cc.iotkit.system.dto.bo.SysRoleBo;
|
|
import cc.iotkit.system.dto.bo.SysRoleBo;
|
|
import cc.iotkit.system.dto.vo.SysRoleVo;
|
|
import cc.iotkit.system.dto.vo.SysRoleVo;
|
|
import cc.iotkit.system.service.ISysRoleService;
|
|
import cc.iotkit.system.service.ISysRoleService;
|
|
|
|
+import cn.dev33.satoken.exception.NotLoginException;
|
|
|
|
+import cn.dev33.satoken.stp.StpUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
+import org.hibernate.service.spi.ServiceException;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.HashSet;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Set;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 角色 业务层处理
|
|
* 角色 业务层处理
|
|
@@ -37,6 +40,7 @@ import java.util.Set;
|
|
public class SysRoleServiceImpl implements ISysRoleService {
|
|
public class SysRoleServiceImpl implements ISysRoleService {
|
|
|
|
|
|
private final ISysRoleData iSysRoleData;
|
|
private final ISysRoleData iSysRoleData;
|
|
|
|
+
|
|
private final ISysRoleMenuData iSysRoleMenuData;
|
|
private final ISysRoleMenuData iSysRoleMenuData;
|
|
private final ISysUserRoleData iSysUserRoleData;
|
|
private final ISysUserRoleData iSysUserRoleData;
|
|
private final ISysRoleDeptData iSysRoleDeptData;
|
|
private final ISysRoleDeptData iSysRoleDeptData;
|
|
@@ -207,10 +211,10 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public void insertRole(SysRoleBo bo) {
|
|
|
|
|
|
+ public int insertRole(SysRoleBo bo) {
|
|
SysRole role = iSysRoleData.save(bo.to(SysRole.class));
|
|
SysRole role = iSysRoleData.save(bo.to(SysRole.class));
|
|
bo.setRoleId(role.getId());
|
|
bo.setRoleId(role.getId());
|
|
- insertRoleMenu(bo);
|
|
|
|
|
|
+ return insertRoleMenu(bo);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -222,11 +226,11 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public int updateRole(SysRoleBo bo) {
|
|
public int updateRole(SysRoleBo bo) {
|
|
- SysRole role = iSysRoleData.save(bo.to(SysRole.class));
|
|
|
|
- if (ObjectUtil.isNull(role)) {
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- return 1;
|
|
|
|
|
|
+ // 修改角色信息
|
|
|
|
+ iSysRoleData.updateById(bo.to(SysRole.class));
|
|
|
|
+ // 删除角色与菜单关联
|
|
|
|
+ iSysRoleMenuData.deleteByRoleId(List.of(bo.getRoleId()));
|
|
|
|
+ return insertRoleMenu(bo);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -253,13 +257,13 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public void authDataScope(SysRoleBo bo) {
|
|
|
|
|
|
+ public int authDataScope(SysRoleBo bo) {
|
|
// 修改角色信息
|
|
// 修改角色信息
|
|
iSysRoleData.updateById(MapstructUtils.convert(bo, SysRole.class));
|
|
iSysRoleData.updateById(MapstructUtils.convert(bo, SysRole.class));
|
|
// 删除角色与部门关联
|
|
// 删除角色与部门关联
|
|
- iSysRoleDeptData.delete(bo.getRoleId());
|
|
|
|
|
|
+ iSysRoleDeptData.deleteByRoleId(List.of(bo.getRoleId()));
|
|
// 新增角色和部门信息(数据权限)
|
|
// 新增角色和部门信息(数据权限)
|
|
- insertRoleDept(bo);
|
|
|
|
|
|
+ return insertRoleDept(bo);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -268,7 +272,20 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
*
|
|
*
|
|
* @param role 角色对象
|
|
* @param role 角色对象
|
|
*/
|
|
*/
|
|
- private void insertRoleMenu(SysRoleBo role) {
|
|
|
|
|
|
+ private int insertRoleMenu(SysRoleBo role) {
|
|
|
|
+ long rows = 1;
|
|
|
|
+ // 新增用户与角色管理
|
|
|
|
+ List<SysRoleMenu> list = new ArrayList<>();
|
|
|
|
+ for (Long menuId : role.getMenuIds()) {
|
|
|
|
+ SysRoleMenu rm = new SysRoleMenu();
|
|
|
|
+ rm.setRoleId(role.getRoleId());
|
|
|
|
+ rm.setMenuId(menuId);
|
|
|
|
+ list.add(rm);
|
|
|
|
+ }
|
|
|
|
+ if (list.size() > 0) {
|
|
|
|
+ rows = iSysRoleMenuData.insertBatch(list);
|
|
|
|
+ }
|
|
|
|
+ return Integer.parseInt(rows + "");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -276,10 +293,10 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
*
|
|
*
|
|
* @param role 角色对象
|
|
* @param role 角色对象
|
|
*/
|
|
*/
|
|
- private void insertRoleDept(SysRoleBo role) {
|
|
|
|
- /* int rows = 1;
|
|
|
|
|
|
+ private int insertRoleDept(SysRoleBo role) {
|
|
|
|
+ long rows = 1;
|
|
// 新增角色与部门(数据权限)管理
|
|
// 新增角色与部门(数据权限)管理
|
|
- List<SysRoleDept> list = new ArrayList();
|
|
|
|
|
|
+ List<SysRoleDept> list = new ArrayList<SysRoleDept>();
|
|
for (Long deptId : role.getDeptIds()) {
|
|
for (Long deptId : role.getDeptIds()) {
|
|
SysRoleDept rd = new SysRoleDept();
|
|
SysRoleDept rd = new SysRoleDept();
|
|
rd.setRoleId(role.getRoleId());
|
|
rd.setRoleId(role.getRoleId());
|
|
@@ -287,9 +304,9 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
list.add(rd);
|
|
list.add(rd);
|
|
}
|
|
}
|
|
if (list.size() > 0) {
|
|
if (list.size() > 0) {
|
|
- rows = roleDeptMapper.insertBatch(list) ? list.size() : 0;
|
|
|
|
|
|
+ rows = iSysRoleDeptData.insertBatch(list);
|
|
}
|
|
}
|
|
- return rows;*/
|
|
|
|
|
|
+ return Integer.parseInt(rows + "");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -300,7 +317,13 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public void deleteRoleById(Long roleId) {
|
|
|
|
|
|
+ public int deleteRoleById(Long roleId) {
|
|
|
|
+ // 删除角色与菜单关联
|
|
|
|
+ iSysRoleMenuData.deleteByRoleId(List.of(roleId));
|
|
|
|
+ // 删除角色与部门关联
|
|
|
|
+ iSysRoleDeptData.deleteByRoleId(List.of(roleId));
|
|
|
|
+ long num = iSysRoleData.deleteById(roleId);
|
|
|
|
+ return Integer.parseInt(num + "");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -311,7 +334,21 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public void deleteRoleByIds(Long[] roleIds) {
|
|
|
|
|
|
+ public int deleteRoleByIds(Long[] roleIds) {
|
|
|
|
+ for (Long roleId : roleIds) {
|
|
|
|
+ checkRoleAllowed(roleId);
|
|
|
|
+ checkRoleDataScope(roleId);
|
|
|
|
+ SysRole role = iSysRoleData.findById(roleId);
|
|
|
|
+ if (countUserRoleByRoleId(roleId) > 0) {
|
|
|
|
+ throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ List<Long> ids = Arrays.asList(roleIds);
|
|
|
|
+ // 删除角色与菜单关联
|
|
|
|
+ iSysRoleMenuData.deleteByRoleId(ids);
|
|
|
|
+ // 删除角色与部门关联
|
|
|
|
+ iSysRoleDeptData.deleteByRoleId(ids);
|
|
|
|
+ return iSysRoleData.deleteByIds(ids);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -321,7 +358,12 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
* @return 结果
|
|
* @return 结果
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- public void deleteAuthUser(SysUserRole userRole) {
|
|
|
|
|
|
+ public int deleteAuthUser(SysUserRole userRole) {
|
|
|
|
+ long rows = iSysUserRoleData.delete(userRole.getRoleId(), List.of(userRole.getUserId()));
|
|
|
|
+ if (rows > 0) {
|
|
|
|
+ cleanOnlineUserByRole(userRole.getRoleId());
|
|
|
|
+ }
|
|
|
|
+ return Integer.parseInt(rows + "");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -332,7 +374,12 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
* @return 结果
|
|
* @return 结果
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- public void deleteAuthUsers(Long roleId, Long[] userIds) {
|
|
|
|
|
|
+ public int deleteAuthUsers(Long roleId, Long[] userIds) {
|
|
|
|
+ long rows = iSysUserRoleData.delete(roleId, Arrays.asList(userIds));
|
|
|
|
+ if (rows > 0) {
|
|
|
|
+ cleanOnlineUserByRole(roleId);
|
|
|
|
+ }
|
|
|
|
+ return Integer.parseInt(rows + "");
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -343,10 +390,44 @@ public class SysRoleServiceImpl implements ISysRoleService {
|
|
* @return 结果
|
|
* @return 结果
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- public void insertAuthUsers(Long roleId, Long[] userIds) {
|
|
|
|
|
|
+ public int insertAuthUsers(Long roleId, Long[] userIds) {
|
|
|
|
+ // 新增用户与角色管理
|
|
|
|
+ long rows = 1;
|
|
|
|
+ List<SysUserRole> list = StreamUtils.toList(List.of(userIds), userId -> {
|
|
|
|
+ SysUserRole ur = new SysUserRole();
|
|
|
|
+ ur.setUserId(userId);
|
|
|
|
+ ur.setRoleId(roleId);
|
|
|
|
+ return ur;
|
|
|
|
+ });
|
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
|
+ rows = iSysUserRoleData.insertBatch(list);
|
|
|
|
+ }
|
|
|
|
+ if (rows > 0) {
|
|
|
|
+ cleanOnlineUserByRole(roleId);
|
|
|
|
+ }
|
|
|
|
+ return Integer.parseInt(rows + "");
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void cleanOnlineUserByRole(Long roleId) {
|
|
public void cleanOnlineUserByRole(Long roleId) {
|
|
|
|
+ List<String> keys = StpUtil.searchTokenValue("", 0, -1, false);
|
|
|
|
+ if (CollUtil.isEmpty(keys)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作
|
|
|
|
+ keys.parallelStream().forEach(key -> {
|
|
|
|
+ String token = StringUtils.substringAfterLast(key, ":");
|
|
|
|
+ // 如果已经过期则跳过
|
|
|
|
+ if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ LoginUser loginUser = LoginHelper.getLoginUser(token);
|
|
|
|
+ if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) {
|
|
|
|
+ try {
|
|
|
|
+ StpUtil.logoutByTokenValue(token);
|
|
|
|
+ } catch (NotLoginException ignored) {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
}
|
|
}
|
|
}
|
|
}
|