主要实现思路
1.首先从菜单数据中获取所有根节点。
2.为根节点建立次级子树并拼接上。
3.递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。
数据表设计:
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长度为0if (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;}
返回数据: