1. spring boot 基于角色实现动态路由
1. 创建实体类
@Data
@Table(name = "tb_role")
@NoArgsConstructor
@AllArgsConstructor
public class Role {
@Id
@KeySql(useGeneratedKeys = true)
private Long roleId;
@Column(name = "role_name")
private String roleName;
@Column(name = "role_desc")
private String roleDes;
private List<Permission> permissions;
private List<Menu> menus;
}
@Data
@Table(name = "tb_menu")
public class Menu {
@Id
@Column(name = "menu_id")
@KeySql(useGeneratedKeys = true)
private Long menuId;
@Column(name = "menu_name")
private String menuName;
private String url;//路由
private String icon;//图标
@Column(name = "order_num")
private Long orderNum;//用于路由排序
private Boolean type;// 0菜单,可以展开 1按钮不可展开
private Boolean available;//0不可用 1可用
@Column(name = "parent_id")
private Long parentId; //上级菜单id 0一级菜单
@Column(name = "modify_time")
private Date modifyTime;//修改时间
private Boolean authority;//是否需要权限
private List<Menu> menus;//子菜单
}
2. 创建mapper接口
public interface MenuMapper extends Mapper<Menu> {
/**
* 根据roleId获取所有菜单信息
*
* @param roleId
* @return
*/
@Select("select m.* from tb_menu m left join tb_role_menu rm on rm.menu_id = m.menu_id where rm.role_id=#{roleId} and m.type=1")
List<Menu> queryMenusByRoleId(Long roleId);
/**
* 根据parentId与是否需要权限查询
*
* @param parentId
* @param authority
* @return
*/
@Select("select * from tb_menu where parent_id = #{parentId} and authority=#{authority}")
List<Menu> queryMenusByParentId(@Param("parentId") Long parentId, @Param("authority") Boolean authority);
/**
* 根据是否需要权限与类型查询
*
* @param authority
* @param type
* @return
*/
@Select("select * from tb_menu where authority=#{authority} and type=#{type}")
List<Menu> queryMenusByAuthority(@Param("authority") Boolean authority, @Param("type") Boolean type);
}
3. 创建service
/**
* 根据用户信息获取对应的菜单信息
*
* @return
*/
public List<Menu> queryMenuByRole() {
//从线程域中获取用户信息
UserInfo userInfo = UserInfoContext.getUserInfo();
if (userInfo == null) {
return null;
}
//获取无需权限的菜单
List<Menu> noAuthorityMenus = menuMapper.queryMenusByAuthority(false, true);
for (Menu noAuthorityMenu : noAuthorityMenus) {
List<Menu> menus = menuMapper.queryMenusByParentId(noAuthorityMenu.getMenuId(), false);
if (!CollectionUtils.isEmpty(menus)) {
noAuthorityMenu.setMenus(menus);
}
}
//根据roleId获取对应的菜单
List<Long> roleIds = userInfo.getRoles().stream().map(Role::getRoleId).collect(Collectors.toList());
for (Long roleId : roleIds) {
List<Menu> menus = menuMapper.queryMenusByRoleId(roleId);
if (!CollectionUtils.isEmpty(menus)) {
for (Menu menu : menus) {
//根据parentId查询所有菜单下的子菜单
List<Menu> childMenu = menuMapper.queryMenusByParentId(menu.getMenuId(), true);
menu.setMenus(childMenu);
}
noAuthorityMenus.addAll(menus);
//根据orderNum字段进行排序操作
noAuthorityMenus.sort((menu1, menu2) -> {
Long orderNum1 = menu1.getOrderNum();
Long orderNum2 = menu2.getOrderNum();
return orderNum1.compareTo(orderNum2);
});
}
}
return noAuthorityMenus;
}
4. Controller层
@GetMapping("/menus")
public Result queryMenuByRole() {
List<Menu> menus = userInfoService.queryMenuByRole();
if (CollectionUtils.isEmpty(menus)) {
return new Result(false, StatusCode.MENU_NOT_FOUND);
}
return new Result(true, StatusCode.OK, menus);
}
想要源码,扫码关注下方公众号,留言即可立即获取相应的资源