springBoot基于角色实现动态路由

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);
    }

想要源码,扫码关注下方公众号,留言即可立即获取相应的资源

Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值