Vue-Router4 + Pinia 动态权限路由设置

1 篇文章 0 订阅
1 篇文章 0 订阅

Vue-Router4 + Pinia 动态权限路由设置

在学习动态添加有权限区分的路由时,遇到了许多问题,自学能力低,多次查了官方文档和网上的一些博客才清楚一些。以下是我当时的眼界所想所做,很难不做到愚见,如有错误,敬请指正!

现在先让我来描述下我的场景:

在router文件夹下有个文件path,里面放着静态路由和动态路由;

还有一个index文件,用来初始化和做路由前置守卫;
在这里插入图片描述

在Store文件夹下有个user的文件,里面是用pinia生成的一个userStore,放着登录、登出、获取用户信息、获取动态路由信息的方法和一些变量;
在这里插入图片描述

在侧边栏那,和头部的面包屑那需要路由的信息;
在这里插入图片描述

现在需要我在登录后获取动态路由,再次进入页面时能自动跳转到主页,并在结合侧边栏和面包屑加载页面

一开始我觉得这不简单吗,直接 addRoute() 后在侧边栏的那里用 router.options.routes 获取全部路由遍历即可。

一开始的代码忘了许多,大概这样,会有bug

router.beforeEach(async (to, _from, next) => {
  console.log("守卫");

  if (to.path == "/login") {
    // 如果token值还有且没过期,直接进入主页
    if (getToken()&&!OverdueToken()) {
        next("/");
    } else {
      next();
    }
  } else {
    if (getToken()) {
      if (OverdueToken()) {
      // token过期,执行退出登录操作,删除所有
        userStore.resetTokenSoOn();
        next("/login");
      } else {
      //获取动态路由
        let resulRouter = await userStore.setAllauthorityRoute(getCharacters())
       //添加动态路由
        myAddroutes(resulRouter)
        next("/");
      }
    } else {
      next("/login");
    }
  }
});

我开心的登录来到我的主页,却发现只有静态路由在那,我输出了下router,发现确实没有,难道是我获取动态路由那步有问题?再输出下,没问题呀!打开vue-devtools再走一遍,发现跳转到主页时是已经添加到路由里面去了的,用hasRoute方法来确定我的动态路由确实是添加上去了的,但是却没有相关信息的展示,options里的信息并没有变化。

请添加图片描述

看看文档怎么说的,

addRoute"添加一个新的路由记录,将其作为一个已有路由的子路由"

options"创建路由器时的原始选项对象"

难道要我直接修改options的routes嘛,试试,相应的你需要在退出登录时在修改回只有静态路由

function myAddroutes(resulRouter: RouteRecordRaw[]) {
  resulRouter.forEach((item: RouteRecordRaw) => {
    router.addRoute(item);
  });
  router.options.routes = [...new Set([...router.options.routes, ...resulRouter])]
}

可以,顺利读取到了

在这里插入图片描述
这是另一个权限的(暂时只设置了2个)
请添加图片描述

也找了些相关博客,确实存在这种情况,解决方法也是直接往routes上修改。

又想了想,我们非要在options.routes上获取吗?

修修改改。。。。

router的index

router.beforeEach(async (to, _from, next) => {

    if (getToken() && !OverdueToken()) {
      if(to.path == '/login'){
        next("/")
      }
      else {
          //刷新后,标识变量也会重置,再次获取路由,不做store持久化
        if (userStore.userRole == false) {
          let resulRouter = await userStore.setAllauthorityRoute(
            getCharacters(),
          );
          // 添加动态路由
          myAddroutes(resulRouter);
          // 重定向
          next({ ...to, replace: true });
        } else {
          next();
        }
      }
    }
    else {
      // 白名单,让登录过去
      if(isWhiteMune(to)){
        next()
      }else{
      next("/login")

      }
    }
});

store的user

    const setAllauthorityRoute = async(username:any) => {
      let routeName: string[] = [];
      await getRouteNameApi({username:username}).then((res:any)=>{
        setKeepRoute(res.data.routerName)
        routeName = res.data.routerName
      })

      let arr = filterrouter(authorityRoute, routeName);
      // 动态路由  
      roleMenu.value = [ ...basicRoute, ...arr]
      // 角色
      userRole.value = true
      return arr
    }

我把动态路由放在了store里,然后让侧边栏的配置函数接收它,这样就完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值