mirror of https://gitee.com/stylefeng/roses
【8.0】【sys】【role】权限限制绑定:绑定应用
parent
81ffd3e94b
commit
62f71b198d
|
@ -1,15 +1,20 @@
|
||||||
package cn.stylefeng.roses.kernel.sys.modular.role.service.impl;
|
package cn.stylefeng.roses.kernel.sys.modular.role.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.ListUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu;
|
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions;
|
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuOptionsService;
|
import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuOptionsService;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuService;
|
import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuService;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleAssignOperateAction;
|
import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleAssignOperateAction;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleBindLimitAction;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleLimit;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenu;
|
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenu;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenuOptions;
|
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenuOptions;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.enums.PermissionNodeTypeEnum;
|
import cn.stylefeng.roses.kernel.sys.modular.role.enums.PermissionNodeTypeEnum;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.enums.RoleLimitTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest;
|
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleLimitService;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuOptionsService;
|
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuOptionsService;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuService;
|
import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
@ -17,6 +22,7 @@ import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -28,7 +34,8 @@ import java.util.stream.Collectors;
|
||||||
* @since 2023/6/14 14:13
|
* @since 2023/6/14 14:13
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class RoleBindAppImpl implements RoleAssignOperateAction {
|
@SuppressWarnings("all")
|
||||||
|
public class RoleBindAppImpl implements RoleAssignOperateAction, RoleBindLimitAction {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private SysMenuService sysMenuService;
|
private SysMenuService sysMenuService;
|
||||||
|
@ -42,6 +49,9 @@ public class RoleBindAppImpl implements RoleAssignOperateAction {
|
||||||
@Resource
|
@Resource
|
||||||
private SysRoleMenuOptionsService sysRoleMenuOptionsService;
|
private SysRoleMenuOptionsService sysRoleMenuOptionsService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysRoleLimitService sysRoleLimitService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PermissionNodeTypeEnum getNodeType() {
|
public PermissionNodeTypeEnum getNodeType() {
|
||||||
return PermissionNodeTypeEnum.APP;
|
return PermissionNodeTypeEnum.APP;
|
||||||
|
@ -54,27 +64,19 @@ public class RoleBindAppImpl implements RoleAssignOperateAction {
|
||||||
Long appId = roleBindPermissionRequest.getNodeId();
|
Long appId = roleBindPermissionRequest.getNodeId();
|
||||||
|
|
||||||
// 找到所选应用的对应的所有菜单
|
// 找到所选应用的对应的所有菜单
|
||||||
LambdaQueryWrapper<SysMenu> menuLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
Set<Long> appMenuIds = this.getAppMenuIds(appId);
|
||||||
menuLambdaQueryWrapper.eq(SysMenu::getAppId, appId);
|
if (ObjectUtil.isEmpty(appMenuIds)) {
|
||||||
menuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getMenuParentId);
|
|
||||||
List<SysMenu> totalMenus = sysMenuService.list(menuLambdaQueryWrapper);
|
|
||||||
Set<Long> totalMenuIds = totalMenus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet());
|
|
||||||
|
|
||||||
if (ObjectUtil.isEmpty(totalMenus)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 找到所选应用的对应的所有菜单功能
|
// 找到所选应用的对应的所有菜单功能
|
||||||
LambdaQueryWrapper<SysMenuOptions> menuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
List<SysMenuOptions> totalMenuOptions = this.getAppMenuOptions(appId);
|
||||||
menuOptionsLambdaQueryWrapper.eq(SysMenuOptions::getAppId, appId);
|
|
||||||
menuOptionsLambdaQueryWrapper.select(SysMenuOptions::getMenuOptionId, SysMenuOptions::getOptionName, SysMenuOptions::getMenuId);
|
|
||||||
List<SysMenuOptions> totalMenuOptions = sysMenuOptionsService.list(menuOptionsLambdaQueryWrapper);
|
|
||||||
Set<Long> totalMenuOptionIds = totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet());
|
Set<Long> totalMenuOptionIds = totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet());
|
||||||
|
|
||||||
// 先删除角色绑定的这些菜单
|
// 先删除角色绑定的这些菜单
|
||||||
LambdaQueryWrapper<SysRoleMenu> sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<SysRoleMenu> sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
sysRoleMenuLambdaQueryWrapper.eq(SysRoleMenu::getRoleId, roleId);
|
sysRoleMenuLambdaQueryWrapper.eq(SysRoleMenu::getRoleId, roleId);
|
||||||
sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getMenuId, totalMenuIds);
|
sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getMenuId, appMenuIds);
|
||||||
sysRoleMenuService.remove(sysRoleMenuLambdaQueryWrapper);
|
sysRoleMenuService.remove(sysRoleMenuLambdaQueryWrapper);
|
||||||
|
|
||||||
// 删除角色绑定的这些菜单功能
|
// 删除角色绑定的这些菜单功能
|
||||||
|
@ -88,11 +90,11 @@ public class RoleBindAppImpl implements RoleAssignOperateAction {
|
||||||
// 如果是选中了应用,则从新绑定这些菜单和功能
|
// 如果是选中了应用,则从新绑定这些菜单和功能
|
||||||
if (roleBindPermissionRequest.getChecked()) {
|
if (roleBindPermissionRequest.getChecked()) {
|
||||||
List<SysRoleMenu> sysRoleMenuList = new ArrayList<>();
|
List<SysRoleMenu> sysRoleMenuList = new ArrayList<>();
|
||||||
for (SysMenu menuItem : totalMenus) {
|
for (Long menuId : appMenuIds) {
|
||||||
SysRoleMenu sysRoleMenu = new SysRoleMenu();
|
SysRoleMenu sysRoleMenu = new SysRoleMenu();
|
||||||
sysRoleMenu.setRoleId(roleId);
|
sysRoleMenu.setRoleId(roleId);
|
||||||
sysRoleMenu.setAppId(appId);
|
sysRoleMenu.setAppId(appId);
|
||||||
sysRoleMenu.setMenuId(menuItem.getMenuId());
|
sysRoleMenu.setMenuId(menuId);
|
||||||
sysRoleMenuList.add(sysRoleMenu);
|
sysRoleMenuList.add(sysRoleMenu);
|
||||||
}
|
}
|
||||||
this.sysRoleMenuService.saveBatch(sysRoleMenuList);
|
this.sysRoleMenuService.saveBatch(sysRoleMenuList);
|
||||||
|
@ -110,4 +112,98 @@ public class RoleBindAppImpl implements RoleAssignOperateAction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PermissionNodeTypeEnum getRoleBindLimitNodeType() {
|
||||||
|
return this.getNodeType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doRoleBindLimitAction(RoleBindPermissionRequest roleBindPermissionRequest) {
|
||||||
|
|
||||||
|
Long roleId = roleBindPermissionRequest.getRoleId();
|
||||||
|
Long appId = roleBindPermissionRequest.getNodeId();
|
||||||
|
|
||||||
|
// 找到所选应用的对应的所有菜单
|
||||||
|
Set<Long> menuIds = this.getAppMenuIds(appId);
|
||||||
|
|
||||||
|
// 菜单为空,则直接返回
|
||||||
|
if (ObjectUtil.isEmpty(menuIds)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 找到所选应用的对应的所有菜单功能
|
||||||
|
List<SysMenuOptions> totalMenuOptions = this.getAppMenuOptions(appId);
|
||||||
|
Set<Long> menuOptionIds = totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet());
|
||||||
|
|
||||||
|
// 组装菜单id和功能id的集合
|
||||||
|
List<Long> totalBusinessId = ListUtil.list(false, menuIds);
|
||||||
|
if (ObjectUtil.isNotEmpty(menuOptionIds)) {
|
||||||
|
totalBusinessId.addAll(menuOptionIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除角色绑定的这些菜单限制,以及菜单功能限制
|
||||||
|
LambdaQueryWrapper<SysRoleLimit> sysRoleLimitLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
sysRoleLimitLambdaQueryWrapper.eq(SysRoleLimit::getRoleId, roleId);
|
||||||
|
sysRoleLimitLambdaQueryWrapper.in(SysRoleLimit::getBusinessId, totalBusinessId);
|
||||||
|
sysRoleLimitService.remove(sysRoleLimitLambdaQueryWrapper);
|
||||||
|
|
||||||
|
// 如果是选中了应用,则从新绑定这些菜单和功能
|
||||||
|
if (roleBindPermissionRequest.getChecked()) {
|
||||||
|
List<SysRoleLimit> totalRoleLimit = new ArrayList<>();
|
||||||
|
|
||||||
|
// 绑定菜单id
|
||||||
|
for (Long menuId : menuIds) {
|
||||||
|
SysRoleLimit sysRoleLimit = new SysRoleLimit();
|
||||||
|
sysRoleLimit.setRoleId(roleId);
|
||||||
|
sysRoleLimit.setLimitType(RoleLimitTypeEnum.MENU.getCode());
|
||||||
|
sysRoleLimit.setBusinessId(menuId);
|
||||||
|
totalRoleLimit.add(sysRoleLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 绑定菜单功能id
|
||||||
|
if (ObjectUtil.isNotEmpty(menuOptionIds)) {
|
||||||
|
for (Long optionsId : menuOptionIds) {
|
||||||
|
SysRoleLimit sysRoleLimit = new SysRoleLimit();
|
||||||
|
sysRoleLimit.setRoleId(roleId);
|
||||||
|
sysRoleLimit.setLimitType(RoleLimitTypeEnum.MENU_OPTIONS.getCode());
|
||||||
|
sysRoleLimit.setBusinessId(optionsId);
|
||||||
|
totalRoleLimit.add(sysRoleLimit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sysRoleLimitService.saveBatch(totalRoleLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取应用下的所有菜单id
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @since 2023/9/8 15:03
|
||||||
|
*/
|
||||||
|
private Set<Long> getAppMenuIds(Long appId) {
|
||||||
|
LambdaQueryWrapper<SysMenu> menuLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
menuLambdaQueryWrapper.eq(SysMenu::getAppId, appId);
|
||||||
|
menuLambdaQueryWrapper.select(SysMenu::getMenuId);
|
||||||
|
List<SysMenu> totalMenus = sysMenuService.list(menuLambdaQueryWrapper);
|
||||||
|
if (ObjectUtil.isEmpty(totalMenus)) {
|
||||||
|
return new HashSet<>();
|
||||||
|
}
|
||||||
|
return totalMenus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取应用下的所有菜单功能
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @since 2023/9/8 15:13
|
||||||
|
*/
|
||||||
|
private List<SysMenuOptions> getAppMenuOptions(Long appId) {
|
||||||
|
LambdaQueryWrapper<SysMenuOptions> menuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
menuOptionsLambdaQueryWrapper.eq(SysMenuOptions::getAppId, appId);
|
||||||
|
menuOptionsLambdaQueryWrapper.select(SysMenuOptions::getMenuOptionId, SysMenuOptions::getMenuId);
|
||||||
|
return sysMenuOptionsService.list(menuOptionsLambdaQueryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue