Zwei Implementierungsmethoden für das dynamische Routing von Vue: 1. Einfache Rollenrouting-Einstellungen, z. B. nur die Einbeziehung der Berechtigungen von Administratoren und normalen Benutzern, werden normalerweise direkt am Frontend vorgenommen. 2. Komplexe Routing-Berechtigungseinstellungen, wie z. B. OA-System und Berechtigungskonfiguration für mehrere Rollen; normalerweise muss das Backend die Routing-Liste zurückgeben und das Front-End-Rendering verwenden.
Die Betriebsumgebung dieses Tutorials: Windows7-System, Vue3-Version, DELL G3-Computer.
Dynamisches Routing unterscheidet sich vom üblichen statischen Routing. Es kann die Site-Routing-Liste entsprechend verschiedenen „Faktoren“ ändern.
Im Allgemeinen gibt es zwei Arten von dynamischen Routing-Einstellungen:
(1) Einfache Rollen-Routing-Einstellungen: Es handelt sich beispielsweise nur um die Berechtigungen von Administratoren und normalen Benutzern. Normalerweise werden einfache Rollenberechtigungseinstellungen direkt am Frontend durchgeführt
(2), komplexe Routing-Berechtigungseinstellungen: wie OA-System, Berechtigungskonfiguration für mehrere Rollen. Normalerweise muss das Backend die Routing-Liste zurückgeben und das Front-End-Rendering verwenden.
1 Einfache Rollenrouting-Einstellungen. (1) Projektrouting-Berechtigungen konfigurieren asyncRouter.js-Datei// router.js
import Vue from 'vue'
import Router from 'vue-router'
import Layout from '@/layout'
Vue.use(Router)// 权限路由列表
let asyncRoutes = [
{
path: '/permission',
component: Layout,
redirect: '/permission/page',
alwaysShow: true,
name: 'Permission',
meta: {
title: 'Permission',
roles: ['admin', 'editor'] // 普通的用户角色
},
children: [
{
path: 'page',
component: () => import('@/views/permission/page'),
name: 'PagePermission',
meta: {
title: 'Page',
roles: ['editor'] // editor角色的用户才能访问该页面
}
},
{
path: 'role',
component: () => import('@/views/permission/role'),
name: 'RolePermission',
meta: {
title: 'Role',
roles: ['admin'] // admin角色的用户才能访问该页面
}
}
]
},
]
// 静态路由
let defaultRouter = [{
path: '/404',
name: '404',
component: () => import('@/views/404'),
meta: {
title: '404'
}
}]
let router = new Router({
mode: 'history',
scrollBehavior: () => ({ y: 0 }),
routes: defaultRouter
})
export default router
// asyncRouter.js //判断当前角色是否有访问权限 function hasPermission(roles, route) { if (route.meta && route.meta.roles) { return roles.some(role => route.meta.roles.includes(role)) } else { return true } } // 递归过滤异步路由表,筛选角色权限路由 export 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 }
(4) Führen Sie die Datei „permission.js“ in main.js ein
(5) Speichern Rollen im Store beim Anmelden
2. Komplexe Routing-Berechtigungseinstellungen (das Backend gibt Routing-Daten dynamisch zurück)
(1) Konfigurieren Sie die Projekt-Routing-Datei. Es sind keine Routen vorhanden, oder es gibt welche öffentliche Routen, also Routen ohne Berechtigungenimport router from './router'
import store from './store'
import NProgress from 'nprogress' // 进度条插件
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/auth'
import { filterAsyncRoutes } from '@/utils/asyncRouter.js'
NProgress.configure({ showSpinner: false }) // 进度条配置
const whiteList = ['/login']
router.beforeEach(async (to, from, next) => {
// 进度条开始
NProgress.start()
// 获取路由 meta 中的title,并设置给页面标题
document.title = to.meta.title // 获取用户登录的token
const hasToken = getToken()
// 判断当前用户是否登录
if (hasToken) {
if (to.path === '/login') {
next({ path: '/' })
NProgress.done()
} else {
// 从store中获取用户角色
const hasRoles = store.getters.roles && store.getters.roles.length > 0
if (hasRoles) {
next()
} else {
try {
// 获取用户角色
const roles = await store.state.roles // 通过用户角色,获取到角色路由表
const accessRoutes = filterAsyncRoutes(await store.state.routers,roles)
// 动态添加路由到router内
router.addRoutes(accessRoutes)
next({ ...to, replace: true })
} catch (error) {
// 清除用户登录信息后,回跳到登录页去
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}
} else {
// 用户未登录
if (whiteList.indexOf(to.path) !== -1) {
// 需要跳转的路由是否是whiteList中的路由,若是,则直接条状
next()
} else {
// 需要跳转的路由不是whiteList中的路由,直接跳转到登录页
next(`/login?redirect=${to.path}`)
// 结束精度条
NProgress.done()
}
}})
router.afterEach(() => {
// 结束精度条
NProgress.done()
})
import Vue from 'vue'
import Router from 'vue-router'
import Layout from '@/layout';
Vue.use(Router)// 配置项目中没有涉及权限的公共路由
export const constantRoutes = [
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
},
{
path: '/404',
component: () => import('@/views/404'),
hidden: true
},
]
const createRouter = () => new Router({
mode: 'history',
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})
const router = createRouter()
export function resetRouter() {
const newRouter = createRouter()
router.matcher = newRouter.matcher
}
export default router
// 引入路由文件这种的公共路由 import { constantRoutes } from '../router';// Layout 组件是项目中的主页面,切换路由时,仅切换Layout中的组件 import Layout from '@/layout'; export function getAsyncRoutes(routes) { const res = [] // 定义路由中需要的自定名 const keys = ['path', 'name', 'children', 'redirect', 'meta', 'hidden'] // 遍历路由数组去重组可用的路由 routes.forEach(item => { const newItem = {}; if (item.component) { // 判断 item.component 是否等于 'Layout',若是则直接替换成引入的 Layout 组件 if (item.component === 'Layout') { newItem.component = Layout } else { // item.component 不等于 'Layout',则说明它是组件路径地址,因此直接替换成路由引入的方法 newItem.component = resolve => require([`@/views/${item.component}`],resolve) // 此处用reqiure比较好,import引入变量会有各种莫名的错误 // newItem.component = (() => import(`@/views/${item.component}`)); } } for (const key in item) { if (keys.includes(key)) { newItem[key] = item[key] } } // 若遍历的当前路由存在子路由,需要对子路由进行递归遍历 if (newItem.children && newItem.children.length) { newItem.children = getAsyncRoutes(item.children) } res.push(newItem) }) // 返回处理好且可用的路由数组 return res }
(4) Fügen Sie die Datei „permission.js“ in „main.js“ ein Die Verarbeitung erfolgt asynchron und es kommt zu einem Sprung, nachdem die Seite auf eine leere Seite umgeleitet wurde. Dies liegt daran, dass die Daten im Router zu diesem Zeitpunkt noch nicht vorhanden sind. Sie können die Route über window.location.reload() aktualisieren.
Das vom Backend zurückgegebene Routenformat:
// 进度条引入设置如上面第一种描述一样 import router from './router' import store from './store' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style import { getToken } from '@/utils/auth' // get token from cookie import { getAsyncRoutes } from '@/utils/asyncRouter' const whiteList = ['/login']; router.beforeEach( async (to, from, next) => { NProgress.start() document.title = to.meta.title; // 获取用户token,用来判断当前用户是否登录 const hasToken = getToken() if (hasToken) { if (to.path === '/login') { next({ path: '/' }) NProgress.done() } else { //异步获取store中的路由 let route = await store.state.addRoutes; const hasRouters = route && route.length>0; //判断store中是否有路由,若有,进行下一步 if ( hasRouters ) { next() } else { //store中没有路由,则需要获取获取异步路由,并进行格式化处理 try { const accessRoutes = getAsyncRoutes(await store.state.addRoutes ); // 动态添加格式化过的路由 router.addRoutes(accessRoutes); next({ ...to, replace: true }) } catch (error) { // Message.error('出错了') next(`/login?redirect=${to.path}`) NProgress.done() } } } } else { if (whiteList.indexOf(to.path) !== -1) { next() } else { next(`/login?redirect=${to.path}`) NProgress.done() } }})router.afterEach(() => { NProgress.done() })
vuejs-Video-Tutorial
,Web-Front-End-Entwicklung
】Das obige ist der detaillierte Inhalt vonWas sind die beiden Implementierungsmethoden des dynamischen Vue-Routings?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!