java实现角色权限的菜单树结构

16 篇文章 0 订阅

通过迭代器和递归实现查询用户角色的权限树

业务层

/**
     * @author 
     * @date 2020-07-09 15:36:12
     * @description 根据id查找用户权限信息
     */
    @Override
    public SysUserDTO getUserMenuDetail(String id) {
        SysUserDTO sysUserDTO = sysUserMapper.getUserMenuDetail(id);
        List<SysRoleDTO> roleList = sysUserDTO.getRoleList();
        if (CollectionUtils.isNotEmpty(roleList)) {
            for (SysRoleDTO sysRoleDTO : roleList) {
                List<SysMenuDTO> sysMenuDTOList = sysRoleDTO.getSysMenuDTOList();
                List<SysMenuDTO> menuTreeList = this.getMenuList(sysMenuDTOList);
                sysRoleDTO.setSysMenuDTOList(menuTreeList);
            }
        }
        return sysUserDTO;
    }

    /**
     * @author 
     * @date 2020-07-09 17:12:37
     * @description 将菜单数据格式转化为树形结构
    */
    public List<SysMenuDTO> getMenuList(List<SysMenuDTO> sysMenuDTOList) {
        List<SysMenuDTO> parentMenuList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(sysMenuDTOList)) {
            for (SysMenuDTO sysMenuDTO : sysMenuDTOList) {
                String parentId = sysMenuDTO.getParentId();
                if (StringUtils.isBlank(parentId)) {
                    parentMenuList.add(sysMenuDTO);
                }
            }
        }
        for (SysMenuDTO sysMenuDTO : parentMenuList) {
            //递归调用
            sysMenuDTO.setChildMenuList(getChild(sysMenuDTO.getId(), sysMenuDTOList));
        }
        return parentMenuList;
    }

    /**
     * @author 
     * @date 2020-07-09 17:13:06
     * @description 递归调用, 获取子菜单
    */
    private List<SysMenuDTO> getChild(String pid, List<SysMenuDTO> sysMenuDTOList) {
        List<SysMenuDTO> childMenuList = new ArrayList<>();
        for (SysMenuDTO sysMenuDTO : sysMenuDTOList) {
            String parentId = sysMenuDTO.getParentId();
            if (StringUtils.isNotEmpty(parentId) && StringUtils.isNotEmpty(pid) && parentId.equals(pid)) {
                childMenuList.add(sysMenuDTO);
            }
        }
        //把子菜单的子菜单再循环一遍
            for (SysMenuDTO sysMenuDTO : childMenuList) {
                sysMenuDTO.setChildMenuList(getChild(sysMenuDTO.getId(), sysMenuDTOList));
            }
        // 递归退出条件
        if (childMenuList.size() == 0) {
            return null;
        }
        return childMenuList;
    }

sql

    <select id="getUserMenuDetail" resultMap="userRoleMenuMap">
        select su.id_int,
        su.id as user_id,su.company_id,su.login_name,su.password,su.zh_name,su.telephone,su.id_no,su.email,su.wechat_qr,su.head_photo,su.sex,
        sr.id as role_id,sr.role_name,
        sm.id as menu_id,sm.menu_name,sm.parent_id,sm.menu_url,sm.icon,sm.menu_type,sm.perms
        from sys_user su
        left join sys_users_roles sur on sur.user_id = su.id
        left join sys_role sr on sr.id = sur.role_id
        left join sys_menus_roles smr on smr.role_id = sr.id
        left join sys_menu sm on sm.id = smr.menu_id
        where su.id = #{id}
    </select>

手动映射

<resultMap id="userRoleMenuMap" type="com.etouch.pojo.dto.basic.SysUserDTO">
        <id column="id_int" property="idInt"/>
        <result column="user_id" property="id"/>
        <result column="company_id" property="companyId"/>
        <result column="login_name" property="loginName"/>
        <result column="password" property="password"/>
        <result column="zh_name" property="zhName"/>
        <result column="telephone" property="telephone"/>
        <result column="email" property="email"/>
        <result column="wechat_qr" property="wechatQr"/>
        <result column="head_photo" property="headPhoto"/>
        <result column="sex" property="sex"/>
        <collection property="roleList" ofType="com.etouch.pojo.dto.basic.SysRoleDTO">
            <id column="role_id" property="id"/>
            <result column="role_name" property="roleName"/>
            <collection property="sysMenuDTOList" ofType="com.etouch.pojo.dto.basic.SysMenuDTO">
                <id column="menu_id" property="id"/>
                <result column="menu_name" property="menuName"/>
                <result column="menu_url" property="menuUrl"/>
                <result column="parent_id" property="parentId"/>
                <result column="icon" property="icon"/>
                <result column="menu_type" property="menuType"/>
                <result column="perms" property="perms"/>
            </collection>
        </collection>
    </resultMap>
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意田天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值