从数据库加载菜单及子菜单主要使用递归的方法,具体实现可看代码
首先封装一个菜单pojo
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
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public List
return childMenus;
}
public void setChildMenus(List
this.childMenus = childMenus;
}
}
然后写dao接口
package com.xfma.dao;
import com.xfma.pojo.Menu;
import java.util.List;
public interface MenuMapper {
/**
* 查找用户的菜单
* @return
*/
public List
}
接着mybatis配置映射文件
SELECT
id,`name`,parent_id as parentId,url,icon,`order`
FROM
jrbac_menu ORDER BY `order` ASC
接下来是service接口
package com.xfma.service;
import com.xfma.pojo.Menu;
import java.util.List;
public interface IMenuService {
public List
}
service实现类
package com.xfma.service.impl;
import com.xfma.dao.MenuMapper;
import com.xfma.pojo.Menu;
import com.xfma.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
@Service
public class MenuService implements IMenuService {
@Autowired
private MenuMapper menuMapper;
public List
List
List
return list;
}
/**
* 找出一级菜单和二级菜单
* @param rootMenus
* @return
*/
private List
List
// 先找到所有的一级菜单
for (int i=0;i
Menu menu = rootMenus.get(i);
//一级菜单 没有父节点
if (StringUtils.isEmpty(menu.getParentId())){
list.add(menu);
}
}
//查找二级菜单
/**
* 利用递归找出所有子菜单
*/
for (Menu menu: list) {
menu.setChildMenus(getChild(menu.getId(),rootMenus));
}
return list;
}
/**
* 找出子菜单
* @param id
* @param rootMenu
* @return
*/
private List
// 子菜单
List
for (Menu menu : rootMenu) {
// 遍历所有节点,将父菜单id与传过来的id比较
if (!StringUtils.isEmpty(menu.getParentId())) {
if (menu.getParentId().equals(id)) {
childList.add(menu);
}
}
}
// 把子菜单的子菜单再循环一遍
for (Menu menu : childList) {// 没有url子菜单还有子菜单
if (StringUtils.isEmpty(menu.getUrl())) {
// 递归
menu.setChildMenus(getChild(menu.getId(), rootMenu));
}
}
// 递归退出条件
if (childList.size() == 0) {
return null;
}
return childList;
}
}
返回的结果是已经封装好的各个菜单和子菜单,只需前台遍历就可以了。
下面附上SQL脚本:
DROP TABLE IF EXISTS `jrbac_menu`;
CREATE TABLE `jrbac_menu` (
`id` varchar(32) NOT NULL COMMENT '主键id,uuid32位',
`name` varchar(64) NOT NULL COMMENT '登录用户名',
`parent_id` varchar(32) default NULL COMMENT '父菜单id',
`url` varchar(64) default NULL COMMENT '访问地址',
`icon` varchar(32) default NULL COMMENT '菜单图标',
`order` tinyint(4) default '0' COMMENT '菜单顺序',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单表';
-- ----------------------------
-- Records of jrbac_menu
-- ----------------------------
INSERT INTO `jrbac_menu` VALUES ('1', 'Forms', null, 'forms.html', 'fa fa-edit', '0');
INSERT INTO `jrbac_menu` VALUES ('2', 'UI Elements', null, '', 'fa fa-wrench', '1');
INSERT INTO `jrbac_menu` VALUES ('3', 'Buttons', '2', 'buttons.html', '', '0');
INSERT INTO `jrbac_menu` VALUES ('4', 'Icons', '2', 'icons.html', null, '1');
INSERT INTO `jrbac_menu` VALUES ('5', 'Multi-Level Dropdown', '', '', 'fa fa-sitemap', '2');
INSERT INTO `jrbac_menu` VALUES ('6', 'Second Level Item', '5', 'second.html', null, '0');
INSERT INTO `jrbac_menu` VALUES ('7', 'Third Level', '5', null, '', '1');
INSERT INTO `jrbac_menu` VALUES ('8', 'Third Level Item', '7', 'third.html', null, '0');