动态菜单5张表的实现
花了好长时间有一周多了吧,一直在学习动态菜单的做法,在这里记录一下:
1.我实现动态菜单用了5张表,user表,power表,menu表,user_power中间表,power_menu中间表,
user表
用户信息表
power表
用户权限表
menu表
菜单表
user_power中间表
用户职位中间表(user_id和power_id都是外建)
power_menu中间表
职位菜单中间表(power_id和menu_id都为外建)
有了五张表就可以往下做了,因为有了中间表,就省略了一对多的关系了
2.使用generator添加entity层,dao层,mapper层。
3.在MenuMapper.xml文件中添加多表联查,通过用户id查询其所对应的menu:
<!-- 查询菜单,传入一个userId,然后通过该ID查出其可见可菜单列表 --> <select id="selectMenuByUSerId" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select m.* from menu m inner join pmmiddle pmm on m.menu_id = pmm.menu_id inner join upmiddle upm on pmm.power_id =upm.power_id where upm.user_id = #{userId} </select>
多表联查,可以将一个sql语句放到一个mapper文件中。
4.在dao层中添加接口:
//定义方法selectMenuByUSerId,传入一个userId,传出一个List<Menu> List<Menu> selectMenuByUSerId(Integer userId);
用来调用sql语句。
5.在service层中添加方法调用sql语句//通过userId查询出要返回到前台的菜单列表集合
1 public List<Menu> selectMenuByuserID(String userName){ 2 //通过userId查询出要返回到前台的菜单列表集合 3 public List<Menu> selectMenuByuserID(String userName){ 4 User user = selectUserByUserName(userName); 5 int userId = user.getUserId(); 6 //接收通过sql语句查出的所有Menu集合 7 List<Menu> menuList = selectMenuByUSerId.selectMenuByUSerId(userId); 8 return menuList; 9 } 10 11 //selectUserByUserName方法,传入一个username进入到数据库中查询,传回一个User对象 12 public User selectUserByUserName(String username){ 13 User user = new User(); 14 user.setUserName(username); 15 //直接调用了那句sql语句 16 return userMapper.loginFindNamePwd(user); 17 }
6.controller层中:
在登陆的方法中调用service层的方法
1 //添加一个方法,将用户名传入查出userId,然后通过userId查出要返回到前台的菜单列表 2 List list = loginService.selectMenuByuserID(userName); 3 4 model.addAttribute("menuList", list);//将集合添加到前台页面中。
7.jsp页面中用el表达式和jstl构建左侧菜单栏:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>