java权限菜单

Java权限设计:
在这里插入图片描述
第一种:先查询所有父级菜单,才查询所有子级菜单,通过java代码递归查询
第二种:查出所有菜单,通过java代码循环操作

第一种:

/*权限--菜单树*/
    @Override
    public List<SysResourceOutput> getMenuList(Map<String, Object> map) {
    	//获取所有父级菜单
        List<SysResourceOutput> parentList = sysResourceMapper.getParentList(map);
        //获取所有子级菜单
        List<SysResourceOutput> childrenList = sysResourceMapper.getChildrenList(map);
        for (SysResourceOutput parent : parentList) {
        	//根据顶级菜单id找子级菜单
            List<SysResourceOutput> menu = this.getMenus(childrenList,parent.getId());
            parent.setChildren(menu);
        }
        return parentList;
    }

/**
     * 多级菜单树查询
     * @param childrenList 最顶级菜单除外
     * @param pid 父类id
     * @return
     */
    public List<SysResourceOutput> getMenus(List<SysResourceOutput> childrenList,Long pid){
        List<SysResourceOutput> result = new ArrayList<SysResourceOutput>();
        for (SysResourceOutput children : childrenList) {
            //获取菜单的id
            Long childrenId = children.getId();
            //获取菜单的父id
            Long parentid = children.getParentId();
            if(null != parentid){
                if(parentid.equals(pid)){
                    //递归查询当前子菜单下所有的子菜单,直到无子菜单为止
                    List<SysResourceOutput> iterateMenu = getMenus(childrenList,childrenId);
                    children.setChildren(iterateMenu);
                    result.add(children);
                }
            }
        }
        return result;
    }
    <!--父菜单 (查询最顶级菜单)-->
    <select id="getParentList" resultType="com.his.system.dto.output.SysResourceOutput" parameterType="java.util.Map">
        SELECT DISTINCT
	        ( usre.id ),
            usre.*
        FROM
            ucm.uc_sys_user usu
            LEFT JOIN ucm.uc_sys_user_role usur ON usu.id = usur.user_id
            LEFT JOIN ucm.uc_sys_role usr ON usur.role_id = usr.id
            LEFT JOIN ucm.uc_sys_role_resource usrr ON usr.id = usrr.role_id
            LEFT JOIN ucm.uc_sys_resource usre ON usre.id = usrr.resource_id
        WHERE
            usu.account = #{account}
            AND usre.id IS NOT NULL
            AND usre.parent_id = 0
            AND usre.resource_type IN ( 0, 1 )
            ORDER BY
                usre.seq ASC
    </select>
<!--子菜单 (查询所有子菜单)-->
    <select id="getChildrenList" resultType="com.his.system.dto.output.SysResourceOutput" parameterType="java.util.Map">
        SELECT DISTINCT
	        ( usre.id ),
            usre.*
        FROM
            ucm.uc_sys_user usu
            LEFT JOIN ucm.uc_sys_user_role usur ON usu.id = usur.user_id
            LEFT JOIN ucm.uc_sys_role usr ON usur.role_id = usr.id
            LEFT JOIN ucm.uc_sys_role_resource usrr ON usr.id = usrr.role_id
            LEFT JOIN ucm.uc_sys_resource usre ON usre.id = usrr.resource_id
        WHERE
            usu.account = #{account}
            AND usre.id IS NOT NULL
            AND usre.parent_id != 0
            AND usre.resource_type IN ( 0, 1 )
            ORDER BY
                usre.seq ASC
    </select>

第二种:

	public List<MenuEntity> getMenuList() {
		//先查询出所有的菜单数据
		List<MenuEntity> menuList = this.requestMapper.findAll();
		List<MenuEntity> menu = new ArrayList<>();
		HashMap<String, List<MenuEntity>> treeMap = new HashMap<>();
		//循环从数据库中获取的所有菜单
		for (MenuEntity menuEntity : menuList) {
			//筛选出所有子菜单
			if(menuEntity.getParentId() != null){
				//如果map中没有父菜单id
				if(!treeMap.containsKey(menuEntity.getParentId())){
					//将父菜单id当成map中的key,并且value为nul集合
					treeMap.put(menuEntity.getParentId(), new ArrayList<>());
				}
				//每次循环将按照parentid取值,再将当前parentid对应的实体放入map中value的位置
				treeMap.get(menuEntity.getParentId()).add(menuEntity);
			}
			
		}
		//循环从数据库中获取的所有菜单数据
		for (MenuEntity menuEntity : menuList) {
			//如果map中的parentid包含数据库中的菜单id
			if(treeMap.containsKey(menuEntity.getId())){
				List<MenuEntity> list = treeMap.get(menuEntity.getId());
				menuEntity.setMenuList(list);
			}
			//将组合好的菜单放入新的集合中一并返回
			if(menuEntity.getParentId() == null){
				menu.add(menuEntity);
			}
		}
		return menu;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值