热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java实现树形菜单对象

这篇文章主要为大家详细介绍了java实现树形菜单对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现树形菜单对象的具体代码,供大家参考,具体内容如下

1、SysMenu

package com.zy.shiro.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * sys_menu
 * @author 
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SysMenu对象", description="菜单管理")
public class SysMenu implements Serializable {
    @TableId(value = "menu_id", type = IdType.AUTO)
    private Long menuId;

    /**
     * 父菜单id,父菜单为0
     */
    private Long parentId;

    /**
     * 菜单名称
     */
    private String menuName;

    /**
     * 菜单url
     */
    private String url;

    /**
     * 授权(多个用逗号分隔,如:user:list,user:create)
     */
    private String permisions;

    /**
     * 类型   0:目录   1:菜单   2:按钮
     */
    private Integer menuType;

    /**
     * 菜单图标
     */
    private String icon;

    /**
     * 排序
     */
    private Integer orderNum;

    @TableField(exist = false)
    private List list;

//    @JsonInclude(value = JsonInclude.Include.NON_EMPTY)
//    private List child=new ArrayList<>();

    private static final long serialVersiOnUID= 1L;


}

2、TreeNode

package com.zy.common.tree;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import sun.reflect.generics.tree.Tree;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode implements Serializable {

    private Integer id;
    private Integer pid;
    private String title;
    private String icon;
    private String href;
    private String target;
    private Boolean spread;
    @JsonInclude(value = JsonInclude.Include.NON_EMPTY)
    private List child=new ArrayList<>();

    /**
     * 登陆成功之后系统主而需要的菜单树的json对象构造器
     * @param id
     * @param pid
     * @param title
     * @param icon
     * @param href
     * @param target
     * @param spread
     */
    public TreeNode(Integer id, Integer pid, String title, String icon, String href, String target, Boolean spread) {
        this.id = id;
        this.pid = pid;
        this.title = title;
        this.icon = icon;
        this.href = href;
        this.target = target;
        this.spread = spread;
    }




    public  static class TreeNodeBuilder{
        /**
         *
         * @param treeNodes 要生成有层级关系的源数据
         * @param topId  最顶层的pid 根节点的pid
         * @return
         */
        public static List build(List treeNodes,Integer topId){

            List nodes=new ArrayList<>();

            for (TreeNode n1 : treeNodes) {
                if(n1.getPid().equals(topId)){
                    //说明n1节点是
                    nodes.add(n1);
                }
                for (TreeNode n2 : treeNodes) {
                    if(n2.getPid().equals(n1.getId())){
                        //说明n2是n1的子节点 应该放到n1的clild里面
                        n1.getChild().add(n2);
                    }
                }
            }
            return nodes;
        }
    }
}

3、SysMenuServiceImpl

根据用户id查询该用户所拥有的菜单

 // 1 用户的id 查询角色
    List roleIds = sysUserRoleMapper.selectObjs(new LambdaQueryWrapper().select(
      SysUserRole::getRoleId
      ).
        eq(SysUserRole::getUserId, userId)
    );
    if (roleIds == null || roleIds.isEmpty()) {
      return menuAuthResult;
    }
    // 2 通过角色的id 查询菜单的id
    List menuIds = sysRoleMenuMapper.selectObjs(new LambdaQueryWrapper().select(
      SysRoleMenu::getMenuId
      ).in(SysRoleMenu::getRoleId, roleIds)
    );
    if (menuIds == null || menuIds.isEmpty()) {
      return menuAuthResult;
    }
    // 3 通过菜单的Id 查询菜单的数据
    List sysMenus = sysMenuMapper.selectList(new LambdaQueryWrapper().in(SysMenu::getMenuId, menuIds));
    if (sysMenus == null || sysMenus.isEmpty()) {
      return menuAuthResult;
    }

查询出来的menu集合:

4、测试

@Test
  public  void test3() {
    SysUser sysUser = sysUserMapper.selectById(1);
    List menuList = null;
    if (null != sysUser) {
      menuList = this.sysMenuService.queryeMenuByUserIdForList(sysUser.getUserId());
      List treeNodes=new ArrayList<>();
      for (SysMenu m : menuList) {
        treeNodes.add(new com.zy.common.tree.TreeNode(m.getMenuId().intValue(),m.getParentId().intValue(),m.getMenuName(),m.getIcon(),m.getUrl(),"_self",Boolean.TRUE));
      }
      List build = com.zy.common.tree.TreeNode.TreeNodeBuilder.build(treeNodes, 0);
      System.out.println(build);

treeNodes:

buid后的树形结构:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Win10 UWP 开发技巧:利用 XamlTreeDump 获取 XAML 元素树
    本文介绍如何在 Win10 UWP 开发中使用 XamlTreeDump 库来获取和转换 XAML 元素树为 JSON 字符串,这对于 UI 单元测试非常有用。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • Python数据类型6 字典
    字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • 本文详细介绍了如何在 Java 中使用 com.badlogic.gdx.utils.JsonValue.iterator() 方法来遍历和解析 JSON 数据,并提供了多个实际应用中的代码示例。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 深入解析ES6至ES8的新特性与应用
    本文详细介绍了自2015年发布的ECMAScript 6.0(简称ES6)以来,JavaScript语言的多项重要更新,旨在帮助开发者更好地理解和利用这些新特性进行复杂应用的开发。 ... [详细]
  • 本文档详细介绍了Scrapy框架中的信号系统,包括如何利用信号来增强爬虫的功能性和灵活性,以及各个内置信号的具体用途和参数。 ... [详细]
  • 本文将详细介绍小蚁智能行车记录仪的各项性能,包括其1296P高清分辨率的实际表现及ADAS辅助驾驶系统的功能测试。通过白天、夜晚及低光环境下的视频测试,全面评估这款设备的实用性。 ... [详细]
  • AngularJS在IE7中的兼容性解决方案
    本文探讨了在较旧版本的Internet Explorer(如IE7)中使用AngularJS时遇到的问题及解决方法,包括HTML标签的正确书写方式以及如何添加对JSON的支持。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
author-avatar
火影魂XJ_710
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有