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;
}