动态获取菜单
2018年06月07日 13:12:31 MissRiven 阅读数:817
本文章来源于:https://blog.csdn.net/MISSRIVEN/article/details/80607711,如有不当之处,请告知删除!
首先看一下菜单的样子
这里写图片描述
根据这个样子我们定义菜单类
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
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’);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
为了演示,我们把可展开的没有做完,仅仅插入几条数据能出效果就可以了。
测试方法与递归方法
private final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
@Test
public void testQueryMenuList() {
// 原始的数据
List
// 查看结果
for (Menu menu : rootMenu) {
System.out.println(menu);
}
// 最后的结果
List<Menu> menuList = new ArrayList<Menu>();
// 先找到所有的一级菜单
for (int i = 0; i < rootMenu.size(); i++) {
// 一级菜单没有parentId
if (StringUtils.isBlank(rootMenu.get(i).getParentId())) {
menuList.add(rootMenu.get(i));
}
}
// 为一级菜单设置子菜单,getChild是递归调用的
for (Menu menu : menuList) {
menu.setChildMenus(getChild(menu.getId(), rootMenu));
}
Map<String,Object> jsonMap = new HashMap<>();
jsonMap.put("menu", menuList);
System.out.println(gson.toJson(jsonMap));
}
/**
- 递归查找子菜单
- @param id
-
当前菜单id
- @param rootMenu
-
要查找的列表
- @return
*/
private List
这里写图片描述
meuDao
package com.jrbac.dao;
import java.util.List;
import com.jrbac.entity.LoginUser;
import com.jrbac.entity.Menu;
public interface MenuDao {
/**
* 查找用户的菜单
* @param loginUser
* @return
*/
public List<Menu> queryMenuList(LoginUser loginUser);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mybatis
这里写图片描述
最终效果
这里写图片描述
如果你也使用sbadmin后台模版的话,它只做到了二级菜单,三级的没有做展开控制。
要做到三级将sb-admin-2.js的最后一个替换成下面的。
if (element.is(‘li’)) {
element.addClass(‘active’);
element.parent().addClass(‘in’);
}
1
2
3
4
再奉上前端jsp页面输出菜单的代码
<c:forEach items="
{empty menu.parentId and not empty menu.url}">
{empty menu.parentId and empty menu.url}">
{menu.childMenus}" var=“secondChild” varStatus=“status”>
<c:if test=" {secondChild.url }’/>"> {empty secondChild.url }">
{secondChild.childMenus}" var=“thirdChild” varStatus=“status”>
${thirdChild.name }
</c:forEach>
</c:if>
</c:forEach>
</c:if>
</c:forEach>