构建树形菜单数据

Posted pan-my

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建树形菜单数据相关的知识,希望对你有一定的参考价值。

菜单实体:
@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;
    

 

以上是关于构建树形菜单数据的主要内容,如果未能解决你的问题,请参考以下文章

Java构建树形菜单

vue递归组件—开发树形组件Tree--(构建树形菜单)

使用zTree插件构建树形菜单

Vue.js怎样把递归组件构建为树形菜单

怎么把后台的数据在页面用树形菜单显示出来?

JSP实现树形菜单