如何编写vue-router基于后端permissions动态生成导航菜单的代码
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇内容主要讲解"如何编写vue-router基于后端permissions动态生成导航菜单的代码",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何编写v
千家信息网最后更新 2025年01月23日如何编写vue-router基于后端permissions动态生成导航菜单的代码1、注册全局守卫
2、Vuex状态管理 全局缓存routes
3、路由拦截
4、路由菜单
本篇内容主要讲解"如何编写vue-router基于后端permissions动态生成导航菜单的代码",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何编写vue-router基于后端permissions动态生成导航菜单的代码"吧!
目录
Vue.js
1、注册全局守卫
2、Vuex状态管理 全局缓存routes
3、路由拦截
4、路由菜单
5、递归菜单vue组件
Vue.js
vue-router
vuex
1、注册全局守卫
核心逻辑
1、token身份验证(后端) => token失效返回登录页面
2、获取用户权限
3、校验permissions,动态添加路由菜单
router.beforeResolve 注册一个全局守卫。和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。
router.beforeResolve(async (to, from, next) => { let hasToken = store.getters['User/accessToken'] if (!settings.loginInterception) hasToken = true if (hasToken) { if (to.path === '/auth/sign-in') { next({ path: '/' }) } else { const hasPermissions = store.getters['User/permissions'] && store.getters['User/permissions'].length > 0 if (hasPermissions) { next() } else { try { let permissions if (!constant.loginInterception) { // settings.js loginInterception为false时,创建虚拟权限 await store.dispatch('User/setPermissions', ['admin']) permissions = ['admin'] } else { permissions = await store.dispatch('User/getUserInfo') } let accessRoutes = [] accessRoutes = await store.dispatch('Routes/setRoutes', permissions) // 添加路由 router.addRoutes(accessRoutes) next({ ...to, replace: true }) } catch { await store.dispatch('User/resetAccessToken') } } } } else { if (settings.routesWhiteList.indexOf(to.path) !== -1) { next() } else { next('/auth/sign-in') } } document.title = getPageTitle(to.meta.title)})
settings.js 全局设置
export default { // 是否开启登录拦截 loginInterception: true, // 不经过token校验的路由 routesWhiteList: ['/auth/sign-in', '/auth/register', '/401', '/404'],}
2、Vuex状态管理 全局缓存routes
state :对数据的全局存储
getter: 可以理解为computed ,对数据进行计算
mutations :对数据的同步更改
actions:对数据的异步更改(实现异步操作)
module: 将 store 分割成模块
/** * @author Alan * @description 路由拦截状态管理 */import { asyncRoutes, constantRoutes } from '@/router'import { filterAsyncRoutes } from '@/Utils/handleRoutes'const state = () => ({ routes: [], partialRoutes: []})const getters = { routes: (state) => state.routes, partialRoutes: (state) => state.partialRoutes}const mutations = { setRoutes (state, routes) { state.routes = constantRoutes.concat(routes) }, setPartialRoutes (state, routes) { state.partialRoutes = constantRoutes.concat(routes) }}const actions = { async setRoutes ({ commit }, permissions) { const finallyAsyncRoutes = await filterAsyncRoutes( [...asyncRoutes], permissions ) commit('setRoutes', finallyAsyncRoutes) return finallyAsyncRoutes }, setPartialRoutes ({ commit }, accessRoutes) { commit('setPartialRoutes', accessRoutes) return accessRoutes }}export default { namespaced: true, state, getters, mutations, actions }
3、路由拦截
/** * @author Alan * @description 判断当前路由是否包含权限 * @param permissions * @param route * @returns {boolean|*} */export function hasPermission (permissions, route) { if (route.meta && route.meta.permissions) { return permissions.some((role) => route.meta.permissions.includes(role)) } else { return true }}/** * @author Alan * @description 根据permissions数组拦截路由 * @param routes * @param permissions * @returns {[]} */export function filterAsyncRoutes (routes, permissions) { const finallyRoutes = [] routes.forEach((route) => { const item = { ...route } if (hasPermission(permissions, item)) { if (item.children) { item.children = filterAsyncRoutes(item.children, permissions) } finallyRoutes.push(item) } }) return finallyRoutes}
4、路由菜单
/** @author Alan* @description 公共路由*/export const constantRoutes = [ { path: '/auth', name: 'auth2', component: AuthLayout, children: authChildRoutes('auth2'), hidden: true // 隐藏菜单 }, { path: '/', name: 'dashboard', component: VerticleLayout, meta: { title: 'Dashboard', name: 'sidebar.dashboard', is_heading: false, is_active: false, link: '', class_name: '', is_icon_class: true, icon: 'ri-home-4-line', permissions: ['admin'] }, children: childRoutes('dashboard') }]/** @author Alan* @description 异步路由*/export const asyncRoutes = [ { path: '/menu-design', name: 'horizontal-dashboard', component: HorizantalLayout, meta: { title: 'Menu Design', name: 'sidebar.MenuDesign', is_heading: false, is_active: false, link: '', class_name: '', is_icon_class: true, icon: 'ri-menu-3-line', permissions: ['admin'] }, children: horizontalRoute('dashboard') }, { path: '/core', name: 'core', component: VerticleLayout, meta: { title: 'UI Elements', name: 'sidebar.uiElements', is_heading: false, is_active: false, class_name: '', link: '', is_icon_class: true, icon: 'ri-pencil-ruler-line', permissions: ['admin'] }, children: coreChildRoute('core') }]
5、递归菜单vue组件
{{ $t(item.meta.name) }} {{ $t(item.meta.name) }}
到此,相信大家对"如何编写vue-router基于后端permissions动态生成导航菜单的代码"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
路由
菜单
全局
组件
动态
导航
数据
代码
生成
权限
状态
管理
内容
缓存
递归
学习
登录
实用
更深
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
公司未制定网络安全事件应急预案
DNS服务器是什么设备
软件开发预期技术指标
cache 数据库 修改记录
长沙中兴通讯软件开发
国产化服务器什么价位
奇怪的网络安全方案
网络安全弱口令
网络安全大事2017
工作App服务器登不上
5g速度那么快服务器跟得上吗
公网ip网络安全设置
社攻 网络安全 书
网络安全实验室要求
老师和软件开发
晋宁区综合软件开发报价表
关于网络安全方面的绘画初中
两会期间网络安全工作
计算机网络技术的国企
bbs论坛服务器迁移
bs软件开发流程
安全接入服务器地址在哪找
深圳正云网络技术
软件开发动漫设计是什么技术
软件开发行业现状2021
河南手机软件开发外包
三级网络技术视频教程文档
苹果品种数据库
杭州网络安全大专班
男孩学习网络安全