VueRouter4动态路由,路由守卫,权限控制

VueRouter4动态路由,路由守卫,权限控制

1、创建路由实例,定义公共路由router/index.ts

import { createRouter, createWebHashHistory } from "vue-router";
import Home from '../views/Home.vue'
import Login from '../views/Login.vue'

// 定义公共页面
export const constantRoutes = [
    {
        name: 'login',
        path: '/login',
        component: Login,
        meta: {
            title:'登录'
        }
    },
    {
        name: 'home',
        path: '/',
        component: Home,
    }
]

const router = createRouter({
    history: createWebHashHistory(),
    routes: constantRoutes,
    // 滚动行为,切换页面就置顶
    scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { top: 0 }
    }
  },
})

export default router

2、路由全局使用(main.ts)

import router from './router'
app.use(router)

3、路由守卫(router/permission.ts)

import router from './index'
// 引入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 从状态库中取出状态
import useUserStore from '../store/modules/user'
import usePermissionStore from '../store/modules/permission'

NProgress.configure({ showSpinner: false })
// 白名单
const whiteList = ['/login', '/auth-redirect', '/bind', '/register']

// 路由守卫
router.beforeEach(async (to, from, next) => {
  // 进度条
  NProgress.start()
  // 具体业务逻辑判断
  if (getToken()) {
     // 已登录且要跳转的页面是登录页
     if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else{
      // 是否存在token
      if (useUserStore().roles.length === 0) {
        // 没有拉取用户信息
        useUserStore().getInfo().then(() => {
            // 获取菜单列表
            usePermissionStore().generateRoutes().then((accessRoutes:any):void => {
              // 根据roles权限生成可访问的路由表
              accessRoutes.forEach((route:any) => {
                if (!isHttp(route.path)) {
                  router.addRoute(route) // 动态添加可访问路由表
                }
              })
              next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
            })
          })
          .catch((error) => {
            // 获取用户信息失败 登出并重定向/
            useUserStore().logOut().then(() => {
                next({ path: '/' })
              })
          })
      } else {
        //路由、菜单加载ok
        next()
      }
    }
    
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      //白名单直接跳转
      next()
    } else {
      // 其他菜单跳转值登录界面
      next(`/login?redirect=${to.fullPath}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})

4、动态路由(router/router-all.ts)

const routerAll = [
  {
    path:'/layout',
    component: () => import('../views/Layout.vue'),
    name:"layout",
    meta: { title: '菜单管理' },
    children:[
    	{
            name: 'xxx',
            path: '/',
            component:() => import('../views/xxx.vue'),
        }
    ]
  }
]
export default routerAll
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态路由是指在Vue Router中,可以根据不同的参数值动态生成路由路径。通过动态路由,我们可以根据不同的参数值加载不同的组件或页面。在Vue Router中,我们可以使用冒号(:)来定义动态路由参数。例如,我们可以定义一个动态路由路径为`/user/:id`,其中`:id`表示一个动态的参数值。当用户访问`/user/1`时,Vue Router会根据参数值1加载相应的组件或页面。 路由守卫是指在Vue Router中,可以通过路由守卫控制路由的访问权限和导航行为。Vue Router提供了三种类型的路由守卫:全局前置守卫、全局解析守卫和组件内的守卫。全局前置守卫会在路由切换之前被调用,可以用来进行权限验证或其他全局操作。全局解析守卫会在路由切换之前被调用,用来获取路由数据。组件内的守卫会在组件内部被调用,可以用来进行组件内部的权限验证或其他操作。 以下是一个示例代码,演示了如何使用动态路由路由守卫: ```javascript // 定义动态路由 const routes = [ { path: '/user/:id', component: User, meta: { requiresAuth: true // 设置需要登录才能访问的路由 } } ] // 创建路由实例 const router = new VueRouter({ routes }) // 全局前置守卫 router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated()) { next('/login') // 如果需要登录才能访问的路由没有登录,则跳转到登录页面 } else { next() // 否则继续路由切换 } }) // 组件内的守卫 export default { beforeRouteEnter (to, from, next) { // 在进入路由前调用,可以访问组件实例this if (this.$store.state.user.isAdmin) { next() // 如果是管理员,则继续路由切换 } else { next(false) // 否则取消路由切换 } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hoki802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值