一.权限菜单
每个用户登录后是根据自己的权限查得到相应的菜单
1.1 Role实体类的修改
@Transient
:一对多不需要JPA管理,由我们自己添加数据@JsonIgnore
:双向关联不要生成JSON,会搞成死循环,根据业务需求放某一方放弃生成
@Entity
@Table(name = "menu")
public class Menu extends BaseDomain {
//菜单名称
private String name;
//菜单路径
private String url;
//图标
private String icon;
/**
* 配置多对一(性能,业务需求【需要通过子菜单拿到父菜单】)
* 让生成JSON的时候,不要去找父亲
*/
@ManyToOne
@JoinColumn(name = "parent_id")
@JsonIgnore
private Menu parent;
/**
* 不要配置单向一对多(性能不好)
* 你现在敢配置一对多嘛?配置了一对多,关系则由JPA来管理!
* 它会自动从1方去拿到所有多方!!!
* 1.这里是否需要儿子的List字段 -》 一定要的
* 2.这个儿子的List是否要JPA管理 -》 不可以
* 加上这个字段(属性),但是不交给JPA管理【咱们手动管理这个字段】
*/
//parent_id
//配置一对多 Transient:临时属性(JPA不会管它)
@Transient
private List<Menu> children = new ArrayList<>();
...
}
1.2 MenuRepository
- 根据员工获取到他对应的所有权限菜单(这里只有子菜单)
- 这条JPQL要求你的关系都是配置好的(与实体类匹配上)
/**
* 根据用户拿到对应的所有权限菜单
*/
@Query("select distinct m from Employee e join e.roles r join r.permissions p join p.menu m where e.id=?1")
List<Menu> findMenusByUser(Long userId);
/**
* 查找全部的父菜单
* @return
*/
@Query("select m from Menu m where m.url is null")
List<Menu> findParentMenus();
1.3 MenuService
- 拿到当前登录用户然后进行查询
- 拼接成前台需要的效果(一定要记住你最后想要的是什么效果)
@Override
public List<Menu> findLoginUserMenus() {
//一.准备一个装父菜单的容器(List)
List<Menu> parentMenuList = new ArrayList<>();
//二.拿到并循环子菜单
//2.1 拿到当前登录用户
Subject subject = SecurityUtils.getSubject();
Employee loginUser = (Employee) subject.getPrincipal();
//2.2 根据用户拿到他的菜单 iter
List<Menu> menus = menuRepository.findMenusByUser(loginUser.getId());
for (Menu menu : menus) {
//三.开始设置数据结构
//3.1 根据子菜单拿父菜单
Menu parentMenu = menu.getParent();
//3.2 判断父菜单容器中是否有这个父菜单
if(!parentMenuList.contains(parentMenu)){
//如果没有,我们要把当前这个父菜单放到容器中
parentMenuList.add(parentMenu);
}
//3.3 把子菜单放到父菜单中
parentMenu.getChildren().add(menu);
}
return parentMenuList;
}
1.4 前台正常展示
@RequestMapping("/findParentMenus")
@ResponseBody
public List<Menu> findParentMenus() {
return menuService.findLoginUserMenus();
}
1.5前台需要接受的json格式数据
[{
"id": 1,
"text": "系统管理",
"state": "open",
"children": [{
"id": 12,
"text": "部门管理",
"iconCls":"icon-lock",
"url":"/department/index"
},{
"id": 11,
"text": "员工管理",
"iconCls":"icon-man",
"url":"/employee/index"
}]
}]