溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue-admin-element中的動態加載路由怎么實現

發布時間:2022-08-13 14:07:04 來源:億速云 閱讀:356 作者:iii 欄目:開發技術

Vue-Admin-Element 中的動態加載路由實現

在現代的前端開發中,動態加載路由是一個非常重要的功能。特別是在管理后臺系統中,不同的用戶可能擁有不同的權限,因此需要根據用戶的權限動態加載不同的路由。Vue-Admin-Element 是一個基于 Vue.js 和 Element UI 的后臺管理系統模板,它提供了豐富的功能和組件,其中就包括動態加載路由的實現。

本文將詳細介紹如何在 Vue-Admin-Element 中實現動態加載路由,包括路由的配置、權限控制、以及如何根據用戶的權限動態生成路由。

1. 路由配置

在 Vue-Admin-Element 中,路由的配置通常放在 src/router/index.js 文件中。我們可以將路由分為兩種類型:靜態路由和動態路由。

1.1 靜態路由

靜態路由是指在應用啟動時就加載的路由,這些路由通常是不需要權限控制的,比如登錄頁、404 頁面等。

const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },
  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: () => import('@/views/dashboard/index'),
        meta: { title: 'Dashboard', icon: 'dashboard' }
      }
    ]
  }
]

1.2 動態路由

動態路由是指根據用戶的權限動態加載的路由。這些路由通常需要根據用戶的角色或權限來決定是否加載。

const asyncRoutes = [
  {
    path: '/permission',
    component: Layout,
    redirect: '/permission/page',
    name: 'Permission',
    meta: {
      title: 'Permission',
      icon: 'lock',
      roles: ['admin', 'editor']
    },
    children: [
      {
        path: 'page',
        component: () => import('@/views/permission/page'),
        name: 'PagePermission',
        meta: { title: 'Page Permission', roles: ['admin'] }
      },
      {
        path: 'directive',
        component: () => import('@/views/permission/directive'),
        name: 'DirectivePermission',
        meta: { title: 'Directive Permission' }
      }
    ]
  }
]

2. 權限控制

在 Vue-Admin-Element 中,權限控制通常通過 vuex 來管理。我們可以通過 vuex 來存儲用戶的角色和權限信息,并根據這些信息來動態生成路由。

2.1 用戶登錄

當用戶登錄時,我們可以通過接口獲取用戶的角色和權限信息,并將其存儲在 vuex 中。

// src/store/modules/user.js
const state = {
  roles: []
}

const mutations = {
  SET_ROLES: (state, roles) => {
    state.roles = roles
  }
}

const actions = {
  login({ commit }, userInfo) {
    return new Promise((resolve, reject) => {
      login(userInfo).then(response => {
        const { data } = response
        commit('SET_ROLES', data.roles)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  }
}

2.2 動態生成路由

在用戶登錄成功后,我們可以根據用戶的角色和權限信息動態生成路由。

// src/permission.js
router.beforeEach(async(to, from, next) => {
  const hasRoles = store.getters.roles && store.getters.roles.length > 0
  if (hasRoles) {
    next()
  } else {
    try {
      const { roles } = await store.dispatch('user/getInfo')
      const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
      router.addRoutes(accessRoutes)
      next({ ...to, replace: true })
    } catch (error) {
      next(`/login?redirect=${to.path}`)
    }
  }
})

2.3 生成路由

vuex 中,我們可以通過 generateRoutes 方法來根據用戶的角色生成路由。

// src/store/modules/permission.js
const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes || []
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

function filterAsyncRoutes(routes, roles) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })
  return res
}

function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}

3. 路由加載

在動態生成路由后,我們需要將這些路由添加到 vue-router 中。Vue-Admin-Element 使用了 router.addRoutes 方法來動態添加路由。

// src/permission.js
router.beforeEach(async(to, from, next) => {
  const hasRoles = store.getters.roles && store.getters.roles.length > 0
  if (hasRoles) {
    next()
  } else {
    try {
      const { roles } = await store.dispatch('user/getInfo')
      const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
      router.addRoutes(accessRoutes)
      next({ ...to, replace: true })
    } catch (error) {
      next(`/login?redirect=${to.path}`)
    }
  }
})

4. 總結

通過以上步驟,我們可以在 Vue-Admin-Element 中實現動態加載路由的功能。首先,我們將路由分為靜態路由和動態路由,靜態路由在應用啟動時加載,而動態路由則根據用戶的權限動態生成。然后,我們通過 vuex 來管理用戶的角色和權限信息,并根據這些信息動態生成路由。最后,我們使用 router.addRoutes 方法將生成的路由添加到 vue-router 中。

動態加載路由不僅可以提高應用的性能,還可以根據用戶的權限靈活地控制路由的訪問權限,從而提高系統的安全性。希望本文能幫助你更好地理解和使用 Vue-Admin-Element 中的動態加載路由功能。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女