mirror of https://gitee.com/stylefeng/roses
【7.6.0】【sys】【permission】【角色绑定权限】更新菜单的操作实现
parent
dd3a09ff50
commit
dc936e2e2a
|
@ -81,5 +81,12 @@ public interface SysMenuService extends IService<SysMenu> {
|
||||||
*/
|
*/
|
||||||
boolean validateMenuBindApp(Set<Long> appIdList);
|
boolean validateMenuBindApp(Set<Long> appIdList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取菜单的所属appId
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @since 2023/6/13 22:49
|
||||||
|
*/
|
||||||
|
Long getMenuAppId(Long menuId);
|
||||||
|
|
||||||
}
|
}
|
|
@ -72,6 +72,19 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
return count > 0;
|
return count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getMenuAppId(Long menuId) {
|
||||||
|
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(SysMenu::getMenuId, menuId);
|
||||||
|
queryWrapper.select(SysMenu::getAppId);
|
||||||
|
SysMenu one = this.getOne(queryWrapper, false);
|
||||||
|
if (one != null) {
|
||||||
|
return one.getAppId();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SysMenu> findList(SysMenuRequest sysMenuRequest) {
|
public List<SysMenu> findList(SysMenuRequest sysMenuRequest) {
|
||||||
LambdaQueryWrapper<SysMenu> wrapper = this.createWrapper(sysMenuRequest);
|
LambdaQueryWrapper<SysMenu> wrapper = this.createWrapper(sysMenuRequest);
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
package cn.stylefeng.roses.kernel.sys.modular.role.factory;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.enums.PermissionNodeTypeEnum;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.response.RoleBindPermissionItem;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限绑定结果的对象创建工厂
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @since 2023/6/13 22:58
|
||||||
|
*/
|
||||||
|
public class PermissionAssignResultFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建角色绑定菜单的相应结果
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @since 2023/6/13 23:03
|
||||||
|
*/
|
||||||
|
public static List<RoleBindPermissionItem> createRoleBindMenuResult(List<SysMenuOptions> menuOptions, Boolean checkedFlag) {
|
||||||
|
|
||||||
|
List<RoleBindPermissionItem> result = new ArrayList<>();
|
||||||
|
|
||||||
|
if (ObjectUtil.isEmpty(menuOptions)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (SysMenuOptions menuOption : menuOptions) {
|
||||||
|
RoleBindPermissionItem roleBindPermissionItem = new RoleBindPermissionItem(
|
||||||
|
menuOption.getMenuOptionId(), null, menuOption.getOptionName(),
|
||||||
|
PermissionNodeTypeEnum.OPTIONS.getCode(), checkedFlag);
|
||||||
|
result.add(roleBindPermissionItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,18 +7,31 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
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.callback.RemoveRoleCallbackApi;
|
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi;
|
||||||
|
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.SysMenuService;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleAssignOperateAction;
|
||||||
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.enums.PermissionNodeTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.enums.exception.SysRoleMenuExceptionEnum;
|
import cn.stylefeng.roses.kernel.sys.modular.role.enums.exception.SysRoleMenuExceptionEnum;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.factory.PermissionAssignResultFactory;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleMenuMapper;
|
import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleMenuMapper;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleMenuRequest;
|
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleMenuRequest;
|
||||||
|
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.response.RoleBindPermissionItem;
|
||||||
|
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;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
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 javax.annotation.Resource;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色菜单关联业务实现层
|
* 角色菜单关联业务实现层
|
||||||
|
@ -27,7 +40,16 @@ import java.util.Set;
|
||||||
* @date 2023/06/10 21:29
|
* @date 2023/06/10 21:29
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService, RemoveRoleCallbackApi {
|
public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService, RemoveRoleCallbackApi, RoleAssignOperateAction {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysMenuOptionsService sysMenuOptionsService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysRoleMenuOptionsService sysRoleMenuOptionsService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysMenuService sysMenuService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(SysRoleMenuRequest sysRoleMenuRequest) {
|
public void add(SysRoleMenuRequest sysRoleMenuRequest) {
|
||||||
|
@ -79,6 +101,54 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRo
|
||||||
this.remove(wrapper);
|
this.remove(wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PermissionNodeTypeEnum getNodeType() {
|
||||||
|
return PermissionNodeTypeEnum.MENU;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<RoleBindPermissionItem> doOperateAction(RoleBindPermissionRequest roleBindPermissionRequest) {
|
||||||
|
|
||||||
|
Long roleId = roleBindPermissionRequest.getRoleId();
|
||||||
|
Long menuId = roleBindPermissionRequest.getNodeId();
|
||||||
|
|
||||||
|
// 1. 首先进行角色和菜单的绑定
|
||||||
|
SysRoleMenu sysRoleMenu = new SysRoleMenu();
|
||||||
|
sysRoleMenu.setRoleId(roleId);
|
||||||
|
sysRoleMenu.setMenuId(menuId);
|
||||||
|
Long appId = sysMenuService.getMenuAppId(menuId);
|
||||||
|
sysRoleMenu.setAppId(appId);
|
||||||
|
|
||||||
|
// 2. 查询菜单下所有的菜单功能
|
||||||
|
LambdaQueryWrapper<SysMenuOptions> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(SysMenuOptions::getMenuId, menuId);
|
||||||
|
queryWrapper.select(SysMenuOptions::getMenuOptionId, SysMenuOptions::getOptionName);
|
||||||
|
List<SysMenuOptions> totalMenuOptions = sysMenuOptionsService.list(queryWrapper);
|
||||||
|
|
||||||
|
// 3. 先删除已经绑定的所有角色和功能的绑定
|
||||||
|
LambdaQueryWrapper<SysRoleMenuOptions> roleMenuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
roleMenuOptionsLambdaQueryWrapper.eq(SysRoleMenuOptions::getRoleId, roleId);
|
||||||
|
roleMenuOptionsLambdaQueryWrapper.in(SysRoleMenuOptions::getMenuOptionId, totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet()));
|
||||||
|
sysRoleMenuOptionsService.remove(roleMenuOptionsLambdaQueryWrapper);
|
||||||
|
|
||||||
|
// 4. 如果是选中状态,则从新进行这些角色和功能的绑定
|
||||||
|
if (roleBindPermissionRequest.getChecked()) {
|
||||||
|
ArrayList<SysRoleMenuOptions> sysRoleMenuOptions = new ArrayList<>();
|
||||||
|
for (SysMenuOptions totalMenuOption : totalMenuOptions) {
|
||||||
|
SysRoleMenuOptions roleMenuOptions = new SysRoleMenuOptions();
|
||||||
|
roleMenuOptions.setRoleId(roleId);
|
||||||
|
roleMenuOptions.setAppId(appId);
|
||||||
|
roleMenuOptions.setMenuId(menuId);
|
||||||
|
roleMenuOptions.setMenuOptionId(totalMenuOption.getMenuOptionId());
|
||||||
|
sysRoleMenuOptions.add(roleMenuOptions);
|
||||||
|
}
|
||||||
|
this.sysRoleMenuOptionsService.saveBatch(sysRoleMenuOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 根据菜单下的资源信息,封装返回结果
|
||||||
|
return PermissionAssignResultFactory.createRoleBindMenuResult(totalMenuOptions, roleBindPermissionRequest.getChecked());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取信息
|
* 获取信息
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue