构建树形菜单数据

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

原文地址:https://www.cnblogs.com/pan-my/p/11428443.html

时间: 2024-08-29 09:26:16

构建树形菜单数据的相关文章

Java构建树形菜单

构建树形菜单 效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> ch

使用zTree插件构建树形菜单

zTree下载:https://github.com/zTree/zTree_v3 目录: 就我看来,zTree较为实用的有以下几点: zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 支持 JSON 数据 支持静态 和 Ajax 异步加载节点数据 支持任意更换皮肤 / 自定义图标 支持极其灵活的 checkbox 或 radio 选择功能 提供多种事件响应回调 灵活的编辑(增/删/改/查)功能,可随意拖拽节点,还可

ExtJS4.2 根据数据库记录构建树形菜单

背景:最近用ExtJS4.2做一个系统,需要在前端展示资源菜单,为树形结构,该树形结构是从数据库动态加载的. ExtJS的树形结构大致有两种情况: 1.静态树形结构,此处不多说,看API就能简单明白: 2.动态加载,ExtJS的特性是根据父节点ID来查询子节点,从而动态更新树形菜单,这里有一个缺陷,或许是我孤陋寡闻不知道,那就是无法根据数据库节点信息自动构建成为一棵树,记得zTree插件就有这个功能. 那么,我希望能够根据数据库树节点信息自动的构建成一棵树,就需要自己去写个小算法在后台拼接成Ex

[JavaScritp]构建简单的json树形菜单

json结构: var Menu = [{ tit:"一级菜单", submenu:[{ tit:"二级菜单", url:"", func:function(){ alert('what do you want to do?'); } },{ tit:"二级菜单", func:function(){ alert('do what?'); }, submenu:[{ tit:"三级菜单", url:"

Unity UGUI自定义树形菜单(TreeView)

先上几张效果图:          如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三角形按钮),可以收缩或展开它的子元素: 3.可以单独判断某一元素的复选框是否被勾选,或者直接获取当前树形菜单中所有被勾选的元素: 4.树形菜单统一控制其下所有子元素按钮的事件分发: 5.可自动调节的滚动视野边缘,根据当前可见的子元素数量进行横向以及纵向的伸缩: 一.首先,我们先制作子元素的模板(Te

ExtJs Treepanel刷新树形菜单

在之前的一次项目开发学习过程中,我需要实现一个功能,就是点击导航栏的链接后左侧树形菜单自动生成对应的菜单项.当时这个问题困扰了我很长一段时间. 后来,在看了ExtJs官方的文档及Demo后一下恍然大悟. 我们来认真分析一下要实现这个功能就是让树形菜单整个刷新. 首先来看看官方的Demo里面是怎么写的: 后台Default.aspx.cs文件中的关键代码:    [DirectMethod]     public string RefreshMenu()     {         Ext.Net

zTree树形菜单交互选项卡效果实现

1. 添加自定义属性 page 2. 为 ztree 每个树形节点,添加点击事件 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>ztree树形菜单的使用</title> 7 <!-- 导入jquery核心类库 --> 8 <script type="text/javascript"

easyui实现树形菜单Tab功能、layout布局

一:常见三种前端ui框架 在初学者入门的状态下,我们常见的前端框架有三种且都有自己的官方网站: 1.easyui:官方网站(http://www.jeasyui.net/) 基于jquery的用户页面插件集合,为一些交互的js提供相应的功能,开发者也不需要写特别复杂的javascript方法,可以用html的标签来解决,支持html5可以说算是能满足你的所有需求,节约时间还能扩展需求,虽然简单但是功能强大. 2.Bootstrap:官方网站(http://www.bootcss.com/) Bo

基于MVC+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用如何使用Json实体类构建菜单数据,然后在主界面中进行使用. 菜单的界面效果如下所示,菜单分为一级菜单.二级菜单.三级菜单,他们各自