java实现递归菜单树

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

1.表结构

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `menu_name` varchar(64) NOT NULL COMMENT '菜单名称',
 `order_num` int(11) DEFAULT NULL COMMENT '菜单顺序',
 `url` varchar(64) DEFAULT NULL COMMENT '菜单路径',
 `pid` varchar(11) DEFAULT NULL COMMENT '上级Id',
 `icon` varchar(255) DEFAULT NULL COMMENT '菜单图标',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('1', '系统管理', '1', '', '0', null);
INSERT INTO `menu` VALUES ('2', '轨迹查询', '2', '', '0', null);
INSERT INTO `menu` VALUES ('3', '设备信息', '3', '', '0', null);
INSERT INTO `menu` VALUES ('4', '用户信息', '1', '', '1', null);
INSERT INTO `menu` VALUES ('5', '客户信息', '2', null, '1', null);
INSERT INTO `menu` VALUES ('6', '用户资料', '1', null, '4', null);
INSERT INTO `menu` VALUES ('7', '客户资料', '1', null, '5', null);
INSERT INTO `menu` VALUES ('8', '切割机', '1', null, '3', null);
INSERT INTO `menu` VALUES ('9', '铲车', '2', null, '3', null);
INSERT INTO `menu` VALUES ('10', '割片', '1', null, '8', null);

2.菜单实体类

import lombok.Data;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author m
 * @email 123456789@qq.com
 * @date 2019-12-13 16:54:59
 */
@Data
@Table(name = "menu")
public class Menu implements Serializable {
 private static final long serialVersionUID = 1L;

 //
  @Id
  private Integer id;

  //菜单名称
  @Column(name = "menu_name")
  private String menuName;

  //菜单顺序
  @Column(name = "order_num")
  private Integer orderNum;

  //菜单路径
  @Column(name = "url")
  private String url;

  //上级Id
  @Column(name = "pid")
  private String pid;

  //菜单图标
  @Column(name = "icon")
  private String icon;

 //子菜单
 @Transient
 private List<Menu> children;

}

3.菜单树

 /**
   * 获取菜单树
   * @return
   */
  public List<Menu> menuTree() {
    //查询所有菜单
    List<Menu> menus = mapper.selectAll();
    //返回的菜单树
    List<Menu> rootMenus = new ArrayList<>();
    for (Menu menu : menus) {
      //pid(上级Id)为0的是根菜单
      if ("0".equals(menu.getPid())) {
        rootMenus.add(menu);
      }
    }
    //遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
    for (Menu rootMenu : rootMenus) {
      List<Menu> child = getChild(String.valueOf(rootMenu.getId()), menus);
      rootMenu.setChildren(child);
    }
    return rootMenus;
  }

  /**
   * 递归获取下级菜单
   * @param pid 上级Id
   * @param menus 所有菜单
   * @return
   */
  public List<Menu> getChild(String pid, List<Menu> menus) {
    //子菜单列表
    List<Menu> childList = new ArrayList<>();
    for (Menu menu : menus) {
      if (pid.equals(menu.getPid())) {
        childList.add(menu);
      }
    }
    //遍历 获取子菜单的子菜单
    for (Menu menu : childList) {
      List<Menu> child = getChild(String.valueOf(menu.getId()), menus);
      menu.setChildren(child);
    }
    //递归出口 childList长度为0
    if (childList.size() == 0) {
      return new ArrayList<>();
    }
    return childList;
  }

4.测试

{
  "status": 200,
  "message": "操作成功",
  "data": [
    {
      "id": 1,
      "menuName": "系统管理",
      "orderNum": 1,
      "url": "",
      "pid": "0",
      "icon": null,
      "children": [
        {
          "id": 4,
          "menuName": "用户信息",
          "orderNum": 1,
          "url": "",
          "pid": "1",
          "icon": null,
          "children": [
            {
              "id": 6,
              "menuName": "用户资料",
              "orderNum": 1,
              "url": null,
              "pid": "4",
              "icon": null,
              "children": []
            }
          ]
        },
        {
          "id": 5,
          "menuName": "客户信息",
          "orderNum": 2,
          "url": null,
          "pid": "1",
          "icon": null,
          "children": [
            {
              "id": 7,
              "menuName": "客户资料",
              "orderNum": 1,
              "url": null,
              "pid": "5",
              "icon": null,
              "children": []
            }
          ]
        }
      ]
    },
    {
      "id": 2,
      "menuName": "轨迹查询",
      "orderNum": 2,
      "url": "",
      "pid": "0",
      "icon": null,
      "children": []
    },
    {
      "id": 3,
      "menuName": "设备信息",
      "orderNum": 3,
      "url": "",
      "pid": "0",
      "icon": null,
      "children": [
        {
          "id": 8,
          "menuName": "切割机",
          "orderNum": 1,
          "url": null,
          "pid": "3",
          "icon": null,
          "children": [
            {
              "id": 10,
              "menuName": "割片",
              "orderNum": 1,
              "url": null,
              "pid": "8",
              "icon": null,
              "children": []
            }
          ]
        },
        {
          "id": 9,
          "menuName": "铲车",
          "orderNum": 2,
          "url": null,
          "pid": "3",
          "icon": null,
          "children": []
        }
      ]
    }
  ]
}

5.菜单树工具类

菜单树工具类

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

(0)

相关推荐

  • 如何实现java递归 处理权限管理菜单树或分类

    这篇文章主要介绍了如何实现java递归 处理权限管理菜单树或分类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.数据库表设计 2.实体类设计 package com.ieou.capsule.dto.SystemPermissions; import java.util.List; /** * 功能菜单类 */ public class SystemPermissionsTree { private String functionCode;

  • java利用递归调用实现树形菜单的样式

    一:需求 现有以需求就是把某一个帖子的全部评论展示出来. 二:分析 关于对帖子的评论分为主评论和子评论,主评论就是对帖子的直接评论,子评论就是对评论的评论. 三:思路 先获取某一个帖子的全部主评论,递归判断是否有子评论,获取子评论. 递归本质:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调 用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模

  • java递归菜单树转换成pojo对象

    复制代码 代码如下: package com.cjonline.foundation.authority.pojo;import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import org.apache.log4j.Logger;import com.cjonline.foundation.util.CheckNullEmpty;/** *

  • vue+ java 实现多级菜单递归效果

    效果如图: 大概思路:树形视图使用的是vue官方事例代码,java负责封装数据,按照vue官方事例的数据结构封装数据即可.有两个需要关注的点: 1.官方事例的数据结构是一个对象里面包含着集合,而不是一个集合对象 2.递归算法 上代码: 前端:html+js <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://cdn.

  • Java递归如何正确输出树形菜单

    本文实例为大家分享了java递归输出树形菜单的具体代码,供大家参考,具体内容如下 首先我们要建立树节点的类: package com.tree; public class Node { private Integer id; private Integer parentId; private String name; private String link; public Integer getId() { return id; } public void setId(Integer id) {

  • java实现递归菜单树

    本文实例为大家分享了java实现递归菜单树的具体代码,供大家参考,具体内容如下 1.表结构 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for menu -- ---------------------------- DROP TABLE IF EXISTS `menu`; CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMEN

  • java利用递归实现类别树示例代码

    在浏览淘宝,京东等各大商场的时候会发现首页一般都是商品分类,并且这个商品分类都是层级关系.下图以天猫商场为例,分为了三层的树状结构!!! 那么这种的类别树是怎么实现的呢?话不多说直接上代码: 1.首先我们新建一张商品类别表并维护所需数据: 2.创建商品类别实体 @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel("商品类别表") public class OrdersCategor

  • 利用java+mysql递归实现拼接树形JSON列表的方法示例

    前言 本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据 例如: [ { "name": "商品目录", "pid": "-1", "id": "1", "children"

  • 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> children;

  • golang 实现菜单树的生成方式

    golang 实现菜单树的生成,包括菜单节点的选中状态.半选中状态,菜单的搜索. 1 该包提供两个方法根接口 1.1 GenerateTree(nodes, selectedNodes []INode) (trees []Tree) GenerateTree 自定义的结构体实现 INode 接口后调用此方法生成树结构. 1.2 FindRelationNode(nodes, allNodes []INode) (respNodes []INode) FindRelationNode 在 allT

  • Java数据结构学习之树

    一.树 1.1 概念 与线性表表示的一一对应的线性关系不同,树表示的是数据元素之间更为复杂的非线性关系. 直观来看,树是以分支关系定义的层次结构. 树在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可以用树的形象来表示. 简单来说,树表示的是1对多的关系. 定义(逻辑结构): 树(Tree)是n( n>=0 )个结点的有限集合,没有结点的树称为空树,在任意一颗非空树中: 有且仅有一个特定的称为根(root)的结点 . 当n>1的时,其余结点可分为 m( m>0 ) 个互不相交的

  • 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.f

随机推荐