[代码完善](v2.5): v2.5 beta 修复角色管理中分配菜单后子菜单丢失的问题

问题:角色管理中的分配菜单由于是懒加载的,导致保存分配的菜单时只保存了选择的父节点
修复:在保存前先将部分菜单加载出来

2.5 Beta 详情:https://www.ydyno.com/archives/1225.html
pull/361/head^2
ZhengJie 2020-05-11 18:36:46 +08:00
parent f3f803e5a4
commit a51aeb604b
4 changed files with 54 additions and 61 deletions

View File

@ -33,11 +33,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/** /**
* @author Zheng Jie * @author Zheng Jie
@ -48,7 +44,6 @@ import java.util.Set;
@RequiredArgsConstructor @RequiredArgsConstructor
@Api(tags = "系统:菜单管理") @Api(tags = "系统:菜单管理")
@RequestMapping("/api/menus") @RequestMapping("/api/menus")
@SuppressWarnings("unchecked")
public class MenuController { public class MenuController {
private final MenuService menuService; private final MenuService menuService;
@ -67,7 +62,7 @@ public class MenuController {
@GetMapping(value = "/build") @GetMapping(value = "/build")
public ResponseEntity<Object> buildMenus(){ public ResponseEntity<Object> buildMenus(){
List<MenuDto> menuDtoList = menuService.findByRoles(roleService.findByUsersId(SecurityUtils.getCurrentUserId())); List<MenuDto> menuDtoList = menuService.findByRoles(roleService.findByUsersId(SecurityUtils.getCurrentUserId()));
List<MenuDto> menuDtos = (List<MenuDto>) menuService.buildTree(menuDtoList).get("content"); List<MenuDto> menuDtos = menuService.buildTree(menuDtoList);
return new ResponseEntity<>(menuService.buildMenus(menuDtos),HttpStatus.OK); return new ResponseEntity<>(menuService.buildMenus(menuDtos),HttpStatus.OK);
} }
@ -91,10 +86,13 @@ public class MenuController {
@ApiOperation("查询菜单:根据ID获取同级与上级数据") @ApiOperation("查询菜单:根据ID获取同级与上级数据")
@GetMapping("/superior") @GetMapping("/superior")
@PreAuthorize("@el.check('menu:list')") @PreAuthorize("@el.check('menu:list')")
public ResponseEntity<Object> getSuperior(@RequestParam Long id) { public ResponseEntity<Object> getSuperior(@RequestParam List<Long> ids) {
MenuDto menuDto = menuService.findById(id); Set<MenuDto> menuDtos = new LinkedHashSet<>();
List<MenuDto> menuDtos = menuService.getSuperior(menuDto, new ArrayList<>()); for (Long id : ids) {
return new ResponseEntity<>(menuService.buildTree(menuDtos),HttpStatus.OK); MenuDto menuDto = menuService.findById(id);
menuDtos.addAll(menuService.getSuperior(menuDto, new ArrayList<>()));
}
return new ResponseEntity<>(menuService.buildTree(new ArrayList<>(menuDtos)),HttpStatus.OK);
} }
@Log("新增菜单") @Log("新增菜单")

View File

@ -19,11 +19,9 @@ import me.zhengjie.modules.system.domain.Menu;
import me.zhengjie.modules.system.service.dto.MenuDto; import me.zhengjie.modules.system.service.dto.MenuDto;
import me.zhengjie.modules.system.service.dto.MenuQueryCriteria; import me.zhengjie.modules.system.service.dto.MenuQueryCriteria;
import me.zhengjie.modules.system.service.dto.RoleSmallDto; import me.zhengjie.modules.system.service.dto.RoleSmallDto;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
@ -81,7 +79,7 @@ public interface MenuService {
* @param menuDtos * @param menuDtos
* @return / * @return /
*/ */
Map<String,Object> buildTree(List<MenuDto> menuDtos); List<MenuDto> buildTree(List<MenuDto> menuDtos);
/** /**
* *

View File

@ -173,7 +173,7 @@ public class DeptServiceImpl implements DeptService {
trees.add(deptDTO); trees.add(deptDTO);
} }
for (DeptDto it : deptDtos) { for (DeptDto it : deptDtos) {
if (it.getPid() != null && it.getPid().equals(deptDTO.getId())) { if (deptDTO.getId().equals(it.getPid())) {
isChild = true; isChild = true;
if (deptDTO.getChildren() == null) { if (deptDTO.getChildren() == null) {
deptDTO.setChildren(new ArrayList<>()); deptDTO.setChildren(new ArrayList<>());

View File

@ -217,7 +217,7 @@ public class MenuServiceImpl implements MenuService {
} }
@Override @Override
public Map<String,Object> buildTree(List<MenuDto> menuDtos) { public List<MenuDto> buildTree(List<MenuDto> menuDtos) {
List<MenuDto> trees = new ArrayList<>(); List<MenuDto> trees = new ArrayList<>();
Set<Long> ids = new HashSet<>(); Set<Long> ids = new HashSet<>();
for (MenuDto menuDTO : menuDtos) { for (MenuDto menuDTO : menuDtos) {
@ -225,7 +225,7 @@ public class MenuServiceImpl implements MenuService {
trees.add(menuDTO); trees.add(menuDTO);
} }
for (MenuDto it : menuDtos) { for (MenuDto it : menuDtos) {
if (it.getPid() != null && it.getPid().equals(menuDTO.getId())) { if (menuDTO.getId().equals(it.getPid())) {
if (menuDTO.getChildren() == null) { if (menuDTO.getChildren() == null) {
menuDTO.setChildren(new ArrayList<>()); menuDTO.setChildren(new ArrayList<>());
} }
@ -234,61 +234,58 @@ public class MenuServiceImpl implements MenuService {
} }
} }
} }
Map<String,Object> map = new HashMap<>(2);
if(trees.size() == 0){ if(trees.size() == 0){
trees = menuDtos.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); trees = menuDtos.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList());
} }
map.put("content",trees); return trees;
map.put("totalElements", menuDtos.size());
return map;
} }
@Override @Override
public List<MenuVo> buildMenus(List<MenuDto> menuDtos) { public List<MenuVo> buildMenus(List<MenuDto> menuDtos) {
List<MenuVo> list = new LinkedList<>(); List<MenuVo> list = new LinkedList<>();
menuDtos.forEach(menuDTO -> { menuDtos.forEach(menuDTO -> {
if (menuDTO!=null){ if (menuDTO!=null){
List<MenuDto> menuDtoList = menuDTO.getChildren(); List<MenuDto> menuDtoList = menuDTO.getChildren();
MenuVo menuVo = new MenuVo(); MenuVo menuVo = new MenuVo();
menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponentName()) ? menuDTO.getComponentName() : menuDTO.getTitle()); menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponentName()) ? menuDTO.getComponentName() : menuDTO.getTitle());
// 一级目录需要加斜杠,不然会报警告 // 一级目录需要加斜杠,不然会报警告
menuVo.setPath(menuDTO.getPid() == null ? "/" + menuDTO.getPath() :menuDTO.getPath()); menuVo.setPath(menuDTO.getPid() == null ? "/" + menuDTO.getPath() :menuDTO.getPath());
menuVo.setHidden(menuDTO.getHidden()); menuVo.setHidden(menuDTO.getHidden());
// 如果不是外链 // 如果不是外链
if(!menuDTO.getIFrame()){ if(!menuDTO.getIFrame()){
if(menuDTO.getPid() == null){ if(menuDTO.getPid() == null){
menuVo.setComponent(StrUtil.isEmpty(menuDTO.getComponent())?"Layout":menuDTO.getComponent()); menuVo.setComponent(StrUtil.isEmpty(menuDTO.getComponent())?"Layout":menuDTO.getComponent());
}else if(!StrUtil.isEmpty(menuDTO.getComponent())){ }else if(!StrUtil.isEmpty(menuDTO.getComponent())){
menuVo.setComponent(menuDTO.getComponent()); menuVo.setComponent(menuDTO.getComponent());
}
}
menuVo.setMeta(new MenuMetaVo(menuDTO.getTitle(),menuDTO.getIcon(),!menuDTO.getCache()));
if(menuDtoList !=null && menuDtoList.size()!=0){
menuVo.setAlwaysShow(true);
menuVo.setRedirect("noredirect");
menuVo.setChildren(buildMenus(menuDtoList));
// 处理是一级菜单并且没有子菜单的情况
} else if(menuDTO.getPid() == null){
MenuVo menuVo1 = new MenuVo();
menuVo1.setMeta(menuVo.getMeta());
// 非外链
if(!menuDTO.getIFrame()){
menuVo1.setPath("index");
menuVo1.setName(menuVo.getName());
menuVo1.setComponent(menuVo.getComponent());
} else {
menuVo1.setPath(menuDTO.getPath());
}
menuVo.setName(null);
menuVo.setMeta(null);
menuVo.setComponent("Layout");
List<MenuVo> list1 = new ArrayList<>();
list1.add(menuVo1);
menuVo.setChildren(list1);
}
list.add(menuVo);
} }
} }
menuVo.setMeta(new MenuMetaVo(menuDTO.getTitle(),menuDTO.getIcon(),!menuDTO.getCache()));
if(menuDtoList !=null && menuDtoList.size()!=0){
menuVo.setAlwaysShow(true);
menuVo.setRedirect("noredirect");
menuVo.setChildren(buildMenus(menuDtoList));
// 处理是一级菜单并且没有子菜单的情况
} else if(menuDTO.getPid() == null){
MenuVo menuVo1 = new MenuVo();
menuVo1.setMeta(menuVo.getMeta());
// 非外链
if(!menuDTO.getIFrame()){
menuVo1.setPath("index");
menuVo1.setName(menuVo.getName());
menuVo1.setComponent(menuVo.getComponent());
} else {
menuVo1.setPath(menuDTO.getPath());
}
menuVo.setName(null);
menuVo.setMeta(null);
menuVo.setComponent("Layout");
List<MenuVo> list1 = new ArrayList<>();
list1.add(menuVo1);
menuVo.setChildren(list1);
}
list.add(menuVo);
}
}
); );
return list; return list;
} }