动态获取菜单
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="
u
s
e
r
M
e
n
u
L
i
s
t
"
v
a
r
=
"
m
e
n
u
"
v
a
r
S
t
a
t
u
s
=
"
s
t
a
t
u
s
"
>
<
!
−
−
一
级
子
菜
单
没
有
p
a
r
e
n
t
I
d
,
有
u
r
l
−
−
>
<
c
:
i
f
t
e
s
t
=
"
{userMenuList }" var="menu" varStatus="status"> <!-- 一级子菜单没有parentId,有url --> <c:if test="
userMenuList"var="menu"varStatus="status"><!−−一级子菜单没有parentId,有url−−><c:iftest="{empty menu.parentId and not empty menu.url}">
m e n u . n a m e < / a > < / l i > < / c : i f > < ! − − 可 展 开 的 一 级 菜 单 , 没 有 p a r e n t I d , 有 u r l − − > < c : i f t e s t = " {menu.name } </a> </li> </c:if> <!-- 可展开的一级菜单,没有parentId,有url --> <c:if test=" menu.name</a></li></c:if><!−−可展开的一级菜单,没有parentId,有url−−><c:iftest="{empty menu.parentId and empty menu.url}">
m e n u . n a m e < s p a n c l a s s = " f a a r r o w " > < / s p a n > < / a > < u l c l a s s = " n a v n a v − s e c o n d − l e v e l " > < ! − − 没 有 u r l 的 是 三 级 菜 单 , 有 u r l 的 直 接 输 出 到 l i 中 − − > < c : f o r E a c h i t e m s = " {menu.name }<span class="fa arrow"></span> </a> <ul class="nav nav-second-level"> <!-- 没有url的是三级菜单,有url的直接输出到li中 --> <c:forEach items=" menu.name<spanclass="faarrow"></span></a><ulclass="navnav−second−level"><!−−没有url的是三级菜单,有url的直接输出到li中−−><c:forEachitems="{menu.childMenus}" var=“secondChild” varStatus=“status”>
<c:if test=" n o t e m p t y s e c o n d C h i l d . u r l " > < l i > < a h r e f = " < c : u r l v a l u e = ′ {not empty secondChild.url }"> <li> <a href="<c:url value=' notemptysecondChild.url"><li><ahref="<c:urlvalue=′{secondChild.url }’/>"> s e c o n d C h i l d . n a m e < / a > < / l i > < / c : i f > < ! − − 二 级 菜 单 u r l 为 空 , 表 示 还 有 三 级 菜 单 − − > < c : i f t e s t = " {secondChild.name }</a> </li> </c:if> <!-- 二级菜单url为空,表示还有三级菜单 --> <c:if test=" secondChild.name</a></li></c:if><!−−二级菜单url为空,表示还有三级菜单−−><c:iftest="{empty secondChild.url }">
s e c o n d C h i l d . n a m e < s p a n c l a s s = " f a a r r o w " > < / s p a n > < / a > < u l c l a s s = " n a v n a v − t h i r d − l e v e l " > < c : f o r E a c h i t e m s = " {secondChild.name }<span class="fa arrow"></span></a> <ul class="nav nav-third-level"> <c:forEach items=" secondChild.name<spanclass="faarrow"></span></a><ulclass="navnav−third−level"><c:forEachitems="{secondChild.childMenus}" var=“thirdChild” varStatus=“status”>
${thirdChild.name }
</c:forEach>
</c:if>
</c:forEach>
</c:if>
</c:forEach>