如何在一张表的情况下,实现二级菜单的显示?

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.效果如下
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值