以上是我们保存菜单的表,以后就可以在这个表里面添加菜单
如果用户是管理员,需要将全部的菜单查询出来,我们可以写一个sql,查询出全部的菜单
<select id="selectMenuNormalAll" resultMap="SysMenuResult">
select distinct m.menu_id, m.parent_id, m.menu_name, m.url, m.visible, m.is_refresh, ifnull(m.perms,'') as perms, m.target, m.menu_type, m.icon, m.order_num, m.create_time
from sys_menu m
查询出菜单的类型是目录,菜单的,而且菜单状态是可见的
where m.menu_type in ('M', 'C') and m.visible = 0
order by m.parent_id, m.order_num
</select>
以上是全部的菜单都查询出来了,我们还需要根据父子级,进行处理一下数据,将处理之后的数据再返回给前段。
先将父id为0的菜单整理出来,
getChildPerms(menus, 0) 第一个参数是查询出的菜单的集合,第二个参数是父id,
/**
* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return String
*/
public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
{
//先创建一个菜单的list集合对象
List<SysMenu> returnList = new ArrayList<SysMenu>();
//一直遍历全部的菜单list集合
for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
{
SysMenu t = (SysMenu) iterator.next();
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId() == parentId)
{
只要遍历出的菜单的parentId=0 ,那么就继续找这个菜单的子级
recursionFn(list, t);//这个方法就是获取子菜单
returnList.add(t);每一个菜单的属性children里面都有自己的子菜单了,放到list集合里面
}
}
return returnList;
}
SysMenu实体类里面还有子菜单集合
/** 子菜单 */
private List<SysMenu> children = new ArrayList<SysMenu>();
/**
* 递归列表
*
* @param list
* @param t
*/
第一个参数是数据库查询出的全部的数据,第二个参数是isparent=0的菜单
private void recursionFn(List<SysMenu> list, SysMenu t)
{
// 得到子节点列表 获取到当前isparent=0的菜单的子菜单集合
List<SysMenu> childList = getChildList(list, t);
t.setChildren(childList); 把子菜单集合放到 当前菜单的属性里面
for (SysMenu tChild : childList) 遍历子菜单
{
if (hasChild(list, tChild)) 如果子菜单下还有子菜单
{
recursionFn(list, tChild); 一直遍历获取菜单,放到父的属性里面
}
}
}
/**
* 得到子节点列表
* 第一个参数是数据库查询出的全部的数据,第二个参数是isparent=0的菜单
*/
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
{
List<SysMenu> tlist = new ArrayList<SysMenu>();
Iterator<SysMenu> it = list.iterator(); //迭代全部的菜单
while (it.hasNext())
{
SysMenu n = (SysMenu) it.next();//获取到全部菜单里面的一个
//如果全部菜单里面的每一个菜单的父id等于 当前菜单的菜单id
if (n.getParentId().longValue() == t.getMenuId().longValue())//、
{
tlist.add(n); 就将遍历出来的这个菜单放到一个list集合里面
}
}
return tlist;返回list集合
}