如何构建资源树

文章讲述了如何创建一个用于表示菜单的数据结构,包括菜单ID、名称、排序号、父ID等字段,并定义了SQL语句来创建这个表。接着,提供了使用递归方法获取菜单树形结构的代码,以及根据角色ID获取所有相关菜单资源的方法。
摘要由CSDN通过智能技术生成

创建数据结构

CREATE TABLE `menu` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `name` varchar(11) NOT NULL COMMENT '名称',
  `sort_no` smallint(5) unsigned NOT NULL DEFAULT '10' COMMENT '排序号',
  `parent_id` bigint(20) unsigned NOT NULL COMMENT '父节点id',
  `icon` varchar(200) DEFAULT NULL COMMENT '图标',
  `remark` varchar(20) DEFAULT NULL COMMENT '备注',
  `url` varchar(60) DEFAULT NULL COMMENT '菜单链接',
  `level` tinyint(4) DEFAULT NULL COMMENT '菜单等级',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

结束

组装树形结构

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

获取所有的资源

/**
  * 根据角色id获取对象集合信息
  */
 public List<Menu> getAllMenus(){
     List<Menu> menus = this.loadAll();
     //返回的菜单树
     List<Menu> rootMenus = new ArrayList<>();
     for (Menu menu : menus) {
         //pid(上级Id)为0的是根菜单
         if (0==(menu.getParentId())) {
             rootMenus.add(menu);
         }
     }
     //遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
     for (Menu rootMenu : rootMenus) {
         List<Menu> child = getChild(rootMenu.getId(), menus);
         rootMenu.setChildren(child);
     }
     return rootMenus;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值