1.数据库表(Permission )
注意:p_parent_id 为0表示一级菜单,其他的值与pid相比较,如果相同就表示为对应pid的二级菜单。
2.实体类
此表的实体类应设计为:1对多的模式。
3.controller层
采用递归的方法
具体步骤如下:
//结果1:认证成功,响应{success:true}
if(dbUser != null){
map.put("success", true);
//授权操作
//根据用户ID获得该用户的权限(角色)
String permissionID = userService.getUserPermissionsAsId(dbUser.getUid());
System.out.println(permissionID);
//通过权限ID查询用户的全部权限集合:userPermissions
List<Permission> userPermissions = userService.getUserPermissions(permissionID);
//创建存放一级菜单的集合
List<Permission> treePermission = new ArrayList<>();
// 遍历全部权限获取每个一级菜单及其子菜单(userPermission)
for (Permission userPermission : userPermissions) {
if(userPermission.getpParentId() == 0){
//调用递归算法传入全部权限集合和当前一级菜单对象
Permission permission = buildChilTree(userPermissions, userPermission);
//将返回的对象添加到一级菜单的集合内
treePermission.add(permission);
}
}
//将用户数据写入session作用域
session.setAttribute("user", dbUser);
//将权限存入作用域
session.setAttribute("tree", treePermission);
递归方法:
/**
* 递归算法解析成树形结构
*/
private Permission buildChilTree(List<Permission> userPermissions, Permission pNode){
//存放当前权限对象的子权限集合
List<Permission> chilMenus =new ArrayList<Permission>();
//遍历全部权限
for(Permission menuNode : userPermissions) {
//比较每个权限的p_parent_id 和当前对象的pid
if(menuNode.getpParentId() == pNode.getPid()) {
//调用递归方法判断是否还有子菜单(因为我做的是二级菜单所以没有)将符合条件的权限添加进入子权限集合
chilMenus.add(buildChilTree(userPermissions, menuNode));
}
}
//设置该一级菜单的子权限
pNode.setPermissions(chilMenus);
//返回完整的对象
return pNode;
}
4.在freemarker模板界面遍历
<#list tree as per>
<li class="list-group-item tree-closed" >
<#if per.permissions?size gt 0>
<span><i class="${per.pimager}"></i> ${per.pname} <span class="badge" style="float:right">${per.permissions?size}</span></span>
<ul style="margin-top:10px;display:none;">
<#list per.permissions as p>
<li style="height:30px;">
<a href="${p.pMenuPath}"><i class="${p.pimager}"></i> ${p.pname}</a>
</li>
</#list>
</ul>
<#else>
<a href="${per.pMenuPath}"><i class="${per.pimager}"></i> ${per.pname}</a>
</#if>
</li>
</#list>
5.效果如下