**
项目业务拓展
首页菜单动态化实现
背景
用户希望在登陆以后基于权限的不同,在首页左侧呈现不同的菜单,如何实现呢?
初步分析
基于登陆用户id,查询用户对应的菜单信息然后进行呈现
原理应用分析
方案实现上可以基于同步或异步查询然后进行菜单数据呈现。
最终解决方案
用户登陆以后,基于用户登陆id查询用户对应的一级菜单,二级菜单然后存储到指定作用域,当进入系统首页后基于thymeleaf呈现用户菜单。
Pojo类的定义
基于用户需求将查询到的一级菜单以及一级菜单对应的二级菜单查询出来,并进行封装。
package com.cy.pj.sys.pojo;
@Setter
@Getter
@ToString
public class SysUserMenu implements Serializable{
private static final long serialVersionUID =
-8126757329276920059L;
private Integer id;
private String name;
private String url;
private List<SysUserMenu> childs;
}
Dao接口实现
在SysMenuDao中添加方法,基于菜单id获取所有菜单相关信息,代码如下
/**
- 基于菜单获取菜单信息
- @param menuIds
- @return
*/
List<SysUserMenu> findMenusByIds(
@Param("menuIds")List<Integer> menuIds);
Mapper元素定义
在SysMenuMapper.xml文件中添加如下映射元素:
<select id="findMenusByIds"
resultMap="sysUserMenu">
select p.id,p.name,p.url,c.id cid,c.name cname,c.url curl
from sys_menus p join sys_menus c
on c.parentId=p.id
<where>
<foreach collection="menuIds"
open="("
close=")"
separator="or"
item="menuId">
c.id=#{menuId}
</foreach>
and p.parentId is null
</where>
</select>
<resultMap type="com.cy.pj.sys.vo.SysUserMenu" id="sysUserMenu">
<!-- 一级菜单映射 -->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="url" column="url"/>
<!-- 二级菜单映射 -->
<collection property="childs" ofType="com.cy.pj.sys.vo.SysUserMenu">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<result property="url" column="curl"/>
</collection>
</resultMap>
Service接口及实现
在SysMenuService接口及实现类中定义如下方法,基于用户id查询用户对应的菜单信息,代码如下
@Override
public List<SysUserMenu> findUserMenusByUserId(Integer id) {
//1.对用户id进行判断
//2.基于用户id查找用户对应的角色id
List<Integer> roleIds=
sysUserRoleDao.findRoleIdsByUserId(id);
//3.基于角色id获取角色对应的菜单信息,并进行封装.
List<Integer> menuIds=
sysRoleMenuDao.findMenuIdsByRoleIds(roleIds);
//4.基于菜单id获取用户对应的菜单信息并返回
return sysMenuDao.findMenusByIds(menuIds);
}
Controller类实现
修改PageController中的doIndexUI方法
@RequestMapping("doIndexUI")
public String doIndexUI(Model model) {
SysUser user=ShiroUtils.getUser();
model.addAttribute("username", user.getUsername());
List<SysUserMenu> userMenus=
sysUserService.findUserMenusByUserId(user.getId());
model.addAttribute("userMenus",userMenus);
return "starter";
}
Starter页面实现
将如下代码替换starter.html中Sidebar Menu对应的位置。
<ul class="sidebar-menu" data-widget="tree">
<li class="header">HEADER</li>
<li class="treeview" th:each="m:${userMenus}">
<span>[[${m.name}]]</span>
<span class="pull-right-container">
</span>
<ul class="treeview-menu">
<li th:each="c:${m.childs}">
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。