要求,使用redis缓存,根据用户角色可以动态展示菜单
1, mapper层
接口
public interface MenuMapper {
//根据角色id查询一级菜单
List<Menu> selectFirstLevelMenus(Integer roleId);
//根据一级菜单Id查询二级菜单
List<Menu> selectSecondLevelMenus(Integer id);
}
xml映射文件
<select id="selectFirstLevelMenus" resultType="Menu">
select id, m.name, path, icon
from t_menu m,
t_role_menu rm
where m.id = rm.menu_id
and rm.role_id = #{roleid}
and level = 1
ORDER BY priority
</select>
<select id="selectSecondLevelMenus" resultType="Menu">
select name,linkurl ,path from t_menu where parentMenuId=#{id}
</select>
2 ,实现登录的userserImpl中存权限或者角色之前,根据角色id得到一级菜单继而得到二级菜单,并且存入redisd的List中
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private PermissionMapper permissionMapper;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MenuMapper menuMapper;
@Override
public User findByUsername(String username) {
User user = userMapper.selectByUsername(username);
if (null != user) {
Set<Role> roles = roleMapper.selectByUserid(user.getId());
if (roles != null && roles.size() > 0) {
for (Role role : roles) {
//用List类型缓存一级菜单,key就是角色的keyword
BoundListOperations opt = redisTemplate.boundListOps(role.getKeyword());
Set<Permission> permissions = permissionMapper.selectByRoleid(role.getId());
if (permissions != null && permissions.size() > 0) {
role.setPermissions(permissions);
}
List range = opt.range(0, -1);
if (null == range || range.size() == 0) {
//查询角色对应的一级菜单
List<Menu> firstLevelMenus = menuMapper.selectFirstLevelMenus(role.getId());
for (Menu menu : firstLevelMenus) {
//查询二级菜单
List<Menu> secondLevelMenus = menuMapper.selectSecondLevelMenus(menu.getId());
//设置一级菜单的子菜单
menu.setChildren(secondLevelMenus);
//存一级菜单到redis
opt.rightPush(menu);
}
//设置一天有效
opt.expire(24, TimeUnit.HOURS);
}
}
user.setRoles(roles);
}
}
return user;
}
}
3,main页面
//发请求,获取用户的菜单
axios.get('../user/getMenus').then(response => {
this.menuList=response.data.data;
});
4,controller 中得到认证实体,然后获取其中的角色——以“"ROLE_"开头,
@Autowired
private RedisTemplate redisTemplate;
@ApiOperation("获取用户的菜单")
@GetMapping("/getMenus")
public Result getMenus() {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//得到一个集合,默认当前的getAuthorities()返回结合中有角色也有权限
Stream<GrantedAuthority> stream = user.getAuthorities().stream();
List<String> role_keywords = stream.filter(t -> t.getAuthority().startsWith("ROLE_")).map(e -> e.getAuthority()).collect(Collectors.toList());
//角色的keyword
String s = role_keywords.get(0);
BoundListOperations opt = redisTemplate.boundListOps(s);
//一级菜单
List<Menu> ranges = opt.range(0, -1);
//调用MenuSerice中的方法根据一级菜单获取对应的二级菜单
//Map<String, Object> map = new HashMap<>();
return new Result(true, "一级菜单获取成功", ranges);
}
}