通过迭代器和递归实现查询用户角色的权限树
业务层
/**
* @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>