数据库model ```java public class Menu { @TableId(type = IdType.AUTO) private Integer id;
@TableField(fill =FieldFill.INSERT) private Date addTime;
@TableField(fill = FieldFill.INSERT_UPDATE) private Date modifyTime;
@ApiModelProperty(value = “排序”) private Integer sort;
@ApiModelProperty(value = “类型(0.按钮 1.菜单)”) private Integer type;
@ApiModelProperty(value = “图标”) private String icon;
@ApiModelProperty(value = “菜单URL”) private String url;
@ApiModelProperty(value = “上级菜单ID 第一级为0”) private Integer parentId;
@ApiModelProperty(value = “菜单/按钮名称”) private String menuName;
@ApiModelProperty(value = “菜单状态(0.失效,1.有效)”) private Integer state;
@ApiModelProperty(value = “菜单级别”) private Integer level;
}
返回model
```java
public class MenuVo {
@ApiModelProperty(value = "菜单/按钮Id")
private Integer menuId;
@ApiModelProperty(value = "菜单/按钮名称")
private String menuName;
@ApiModelProperty(value = "类型(0.按钮 1.菜单)")
private Integer type;
@ApiModelProperty(value = "图标")
private String icon;
@ApiModelProperty(value = "菜单/按钮 URL")
private String url;
@ApiModelProperty(value = "排序")
private Integer sort;
@ApiModelProperty(value = "菜单级别")
private Integer level;
@ApiModelProperty(value = "上级菜单ID 第一级为0")
private Integer parentId;
@ApiModelProperty(value = "是否选中 0未选 1已选")
private Integer selected;
@ApiModelProperty(value = "下级菜单信息")
private List<MenuVo> children;
}
数据处理
//roleId 为角色Id,用来标注这个角色有没有选中这个菜单
@Override
public GenericResponse findAllMenu(Integer roleId) {
Role role = roleMapper.selectById(roleId);
String menuIds = role.getMenuIds();
List<String> listmenuIds = Lists.newArrayList();
if (StringUtils.isNotBlank(menuIds)) {
listmenuIds = Arrays.asList(menuIds.split(",")).stream().map(s -> (s.trim())).collect(Collectors.toList());
}
//所有有效的菜单 1:有效的
List<Menu> menuList = menuMapper.selectList(new LambdaQueryWrapper<Menu>().eq(Menu::getState, 1));
List<MenuVo> collect = combingParam(menuList, listmenuIds);
return GenericResponse.response(collect);
}
/**
* 参数整理
* @author X-MD
* @date 2020/12/31 0031
* @param menuList
* @param listmenuIds
* @return List
**/
private List<MenuVo> combingParam(List<Menu> menuList,List<String> listmenuIds){
List<MenuVo> listVo = Lists.newArrayList();
if (CollectionUtils.isEmpty(menuList)) {
return listVo;
}
//使用stream拷贝list
List<MenuVo> voList = menuList.stream()
.map(menu -> {
MenuVo menuVo = new MenuVo();
BeanUtils.copyProperties(menu, menuVo);
return menuVo.setMenuId(menu.getId());
})
.collect(Collectors.toList());
//先将所有一级部门添加至rslist
for (MenuVo menuVo : voList) {
//如果父级为空,则为顶级部门
if (menuVo.getParentId().equals(0)) {
menuVo = listmenuIds.contains(String.valueOf(menuVo.getMenuId())) ? menuVo.setSelected(2) : menuVo.setSelected(1);
listVo.add(menuVo);
}
}
// 为父级部门设置子部门,getChild是递归调用的
for (MenuVo menuVo : listVo) {
//传入父级部门Id,以及所有查询结果
menuVo.setChildren(getChild(menuVo.getMenuId(), voList, listmenuIds));
}
return listVo.stream().sorted(Comparator.comparing(MenuVo::getSort)).collect(Collectors.toList());
}
/**
* 传进父级ID,查找其子部门
*
* @param id
* @param depts
* @return List<MenuVo>
* @author X-MD
* @date 2020/12/30 0030
**/
public List<MenuVo> getChild(Integer id, List<MenuVo> depts, List<String> listmenuIds) {
List<MenuVo> childList = new ArrayList<>();
for (MenuVo menuVo : depts) {
// 遍历所有属于父级节点的子节点
if (menuVo.getParentId() != 0 && menuVo.getParentId().equals(id)) {
menuVo = listmenuIds.contains(String.valueOf(menuVo.getMenuId())) ? menuVo.setSelected(2) : menuVo.setSelected(1);
childList.add(menuVo);
}
}
List<MenuVo> collect = childList.stream().sorted(Comparator.comparing(MenuVo::getSort))
.collect(Collectors.toList());
//然后给所有子节点添加子节点
for (MenuVo menuVo : collect) {
// 遍历所有属于父级节点的子节点
menuVo.setChildren(getChild(menuVo.getMenuId(), depts, listmenuIds));
}
// 递归退出条件
if (CollectionUtils.isEmpty(childList)) {
return Lists.newArrayList();
}
return childList;
}