构建树形菜单数据
菜单实体: @Data public class SysMenu { /** * 菜单编码 */ @ApiModelProperty(value="菜单编码",name="rowId",example="菜单编码") private String rowId; /** * 菜单名称 */ @ApiModelProperty(value="菜单名称",name="name",example="菜单名称") private String name; /** * 父ID */ @ApiModelProperty(value="父ID",name="parentId",example="父ID") private String parentId; /** * */ @ApiModelProperty(value="",name="iconCls",example="") private String iconCls; /** * url */ @ApiModelProperty(value="url",name="url",example="url") private String url; /** * 值 */ @ApiModelProperty(value="值",name="sort",example="值") private Long sort; /** * 版本号 */ @ApiModelProperty(value="版本号",name="version",example="版本号") private String version; /** * 修改人 */ @ApiModelProperty(value="修改人",name="updateUserid",example="修改人") private String updateUserid; /** * 修改时间 */ @ApiModelProperty(value="修改时间",name="updatedt",example="修改时间") private Date updatedt; /** * 创建人 */ @ApiModelProperty(value="创建人",name="userid",example="创建人") private String userid; /** * 创建时间 */ @ApiModelProperty(value="创建时间",name="insdt",example="创建时间") private Date insdt; /** * 类型 */ @ApiModelProperty(value="类型",name="type",example="类型") private String type; @ApiModelProperty(value="父节点名",name="parentName",example="父节点名") private String parentName; @ApiModelProperty(value="是否可见",name="visible",example="是否可见") private String visible; @ApiModelProperty(value="权限标识",name="access",example="权限标识") private String access; /** * 是否被选中 */ private boolean checked = false; @ApiModelProperty(value="是否是收藏(0:不是,1:是)",name="access",example="是否是收藏(0:不是,1:是)") private String isFavorite; /** *子节点 * @return */ @ApiModelProperty(value = "子菜单, 查询时返回") private List<SysMenu> childrens = new ArrayList<>(); } @Data public class SysMenuDto { /** * 菜单编码 */ @ApiModelProperty(value="菜单编码",name="id",example="菜单编码") private String id; /** * 菜单名称 */ @ApiModelProperty(value="菜单名称",name="text",example="菜单名称") private String text; /** * 父ID */ @ApiModelProperty(value="父ID",name="parentId",example="父ID") private String parentId; /** * */ @ApiModelProperty(value="",name="iconCls",example="") private String iconCls; /** * url */ @ApiModelProperty(value="url",name="url",example="url") private String url; @ApiModelProperty(value="类型",name="type",example="类型") private String type; @ApiModelProperty(value="父节点名",name="parentName",example="父节点名") private String parentName; @ApiModelProperty(value="是否可见",name="visible",example="是否可见") private String visible; @ApiModelProperty(value="权限标识",name="access",example="权限标识") private String access; /** * 是否被选中 */ private boolean checked = false; @ApiModelProperty(value="是否是收藏(0:不是,1:是)",name="access",example="是否是收藏(0:不是,1:是)") private String isFavorite; /** * 值 */ @ApiModelProperty(value="值",name="sort",example="值") private Long sort; /** *子节点 * @return */ @ApiModelProperty(value = "子菜单, 查询时返回") private List<SysMenuDto> childrens; public static SysMenuDto convertSysMenuEntity(SysMenu entity) { SysMenuDto sysMenuDto = new SysMenuDto(); sysMenuDto.setId(entity.getRowId()); sysMenuDto.setText(entity.getName()); sysMenuDto.setParentId(entity.getParentId()); sysMenuDto.setIconCls(entity.getIconCls()); sysMenuDto.setUrl(entity.getUrl()); sysMenuDto.setChecked(entity.isChecked()); sysMenuDto.setAccess(entity.getAccess()); sysMenuDto.setParentName(entity.getParentName()); sysMenuDto.setVisible(entity.getVisible()); sysMenuDto.setType(entity.getType()); sysMenuDto.setIsFavorite(entity.getIsFavorite()); sysMenuDto.setSort(entity.getSort()); return sysMenuDto; } } 构建递归方法查询子节点: private void getTreeStructure(SysMenuDto root, List<SysMenu> orgs) { for (SysMenu org : orgs) { if (org.getParentId().equals(root.getId())) { SysMenuDto s = SysMenuDto.convertSysMenuEntity(org); getTreeStructure(s, orgs); if (root.getChildrens() == null) { root.setChildrens(new ArrayList<>()); } root.getChildrens().add(s); } } } 调用递归方法构建数据: public Map<String, Object> getSysMenuTreeData(String pDid, String pRowId) { List<SysMenuDto> list = new ArrayList<>(); //查询菜单列表 List<SysMenu> sysMenuList = sysRoleMapper.findList(); //修改时查询已选中的权限 if (!StringUtils.isEmpty(pRowId)) { SysRole sysRole = sysRoleMapper.selectByPrimaryKey(pRowId, pDid); if (null != sysRole && !StringUtils.isEmpty(sysRole.getMenu())) { //已选中的权限列表 就是拥有的菜单编码 List<String> menuList = Arrays.asList(sysRole.getMenu().split(",")); logger.info("选中的权限列表:{}", JsonUtil.obj2String(menuList)); for (SysMenu sysMenu : sysMenuList) { //如果菜单已被选中,则设置为true if (menuList.contains(sysMenu.getRowId())) { sysMenu.setChecked(true); } } } } //获取该经销商默认设置的系统菜单版本 String verdion = sysRoleMapper.selectVersion(pDid); //获取顶级菜单 List<SysMenu> topMenuList = sysRoleMapper.selectTopMenu(verdion); if (null == topMenuList) { return null; } for (SysMenu menu : topMenuList) { SysMenuDto s = SysMenuDto.convertSysMenuEntity(menu); getTreeStructure(s, sysMenuList); list.add(s); } logger.info("获取最终菜单:{}", JsonUtil.obj2String(list)); Map<String, Object> map = new HashMap<>(); map.put("Id", "0"); map.put("text", "全选"); map.put("childrens", list); return map; }