Vue权限控制——动态注册路由
需求:实现后台管理系统不同用户的权限控制
根据登录的用户的角色动态展示后台管理系统的左侧菜单栏的菜单列表内容,然后还要动态注册对应子菜单的路由
菜单列表内容应该通过后端接口返回:
- sort为1表示当前项有子菜单
- sort为2表示当前项没有子菜单,这个才是需要我们去动态注册的组件
前端需要根据后端返回的菜单列表去动态的展示菜单列表:
并且为每个菜单列表项注册对应的路由:
在views/main文件夹下创建所有的页面(component)
在router/main文件夹下创建每个页面对应的路由对象(此时只是先配置好路由path和组件component的映射关系,还没有注册路由,后续会根据后端返回的用户菜单表数据(userMenus)动态的去注册路由)
根据用户的角色role.id向后端发送请求,拿到当前登录用户的userMenus菜单
根据userMenus生成对应的routes
1)先拿到项目中所有组件的路由对象route放到allRoutes数组中
2)再递归遍历userMenus数组的每一项(menu),将满足menu.url === route.path条件的menu放到routes数组中
遍历routes数组,把数组中的每一个route通过
router.addRoute('main', route)
,动态注册到main路由对象的children属性中
import type { RouteRecordRaw } from 'vue-router'export function mapMenuToRoutes(userMenus: any[]): RouteRecordRaw[] {const routes: RouteRecordRaw[] = []// 1.先去加载默认所有的routesconst allRoutes: RouteRecordRaw[] = []const routeFiles = require.context('../router/main', true, /\.ts/)routeFiles.keys().forEach((key) => {console.log(key) // ./analysis/dashboard/dashboard.tsconst route = require('../router/main' + key.split('.')[1])allRoutes.push(route.default)})console.log(allRoutes)// 2.根据菜单获取需要添加到routesconst _recurseGetRoute = (menus: any[]) => {for (const menu of menus) {if (menu.type === 2) {const route = allRoutes.find((route) => {return route.path === menu.url})if (route) routes.push(route)} else {_recurseGetRoute(menu.children)}}}_recurseGetRoute(userMenus)return routes
}
<template><div class="nav-menu"><div class="logo"><img src="~@/assets/img/logo.svg" alt="logo" /><span class="title" v-if="!collapse">后台管理系统</span></div><el-menudefault-active="1":collapse="collapse"class="el-menu-vertical"background-color="#0c2135"text-color="#b7bdc3"unique-openedactive-text-color="#0a60bd"><template v-for="item in userMenus" :key="item.id"><!-- 有二级菜单的一级菜单 --><template v-if="item.type === 1"><!-- 一级菜单 --><el-sub-menu :index="item.id + ''"><template #title><el-icon><Setting /></el-icon><!-- <i v-if="item.icon" :class="item.icon"></i> --><span>{{ item.name }}</span></template><template v-for="subItem in item.children" :key="subItem.id"><!-- 二级菜单 --><el-menu-item:index="subItem.id + ''"@click="handleMenuItemClick(subItem)"><i v-if="subItem.icon" :class="subItem.icon"></i><span>{{ subItem.name }}</span></el-menu-item></template></el-sub-menu></template><!-- 没有二级菜单的一级菜单 --><template v-else-if="item.type === 2"><!-- 一级菜单 --><el-menu-item :index="item.id + ''"><i v-if="item.icon" :class="item.icon"></i><span>{{ item.name }}</span></el-menu-item></template></template></el-menu></div>
</template><script lang="ts">
import { defineComponent, computed } from 'vue'
import { Setting } from '@element-plus/icons-vue'
import { useStore } from '@/store'
import { useRouter } from 'vue-router'
export default defineComponent({name: 'nav-menu',components: { Setting },props: {collapse: {type: Boolean,default: false}},setup(props, context) {const store = useStore()const router = useRouter()const userMenus = computed(() => store.state.login.userMenus)const handleMenuItemClick = (item: any) => {// console.log(item)router.push({path: item.url ?? '/not-found'})}return {userMenus,handleMenuItemClick}}
})
</script><style scoped lang="less">
.nav-menu {height: 100%;background-color: #001529;
}
.logo {display: flex;height: 28px;padding: 12px 10px 8px 10px;flex-direction: row;justify-content: center;align-items: center;img {width: 40px;height: 40px;}.title {font-size: 16px;font-weight: 700;color: #fff;}
}
.el-menu-vertical {width: 100%;height: calc(100% - 48px);
}
.el-menu {border-right: none;
}
</style>
Vue权限控制——动态注册路由相关推荐
- 测试服务命名和动态注册路由的方式@Xan
2019独角兽企业重金招聘Python工程师标准>>> 1.测试服务命名:如不需要网关进行权限和登录验证时,服务名称命名后面加"tests",例如: sysadm ...
- vue-router动态注册路由,实现无需注册页面可跳转
demo工程地址:https://github.com/martSforever/test-router 先说一下特性: 无需注册页面路由,可直接跳转: 页面地址可以在数据库中配置: 页面分包加载,进 ...
- php注册路由,thinkphp动态注册路由
thinkphp动态注册路由 一.总结 1.thinkphp使用路由步骤:a.config配置文件中开启路由 b.Route类的rule方法创建路由(在Routephp中)Route::rule(' ...
- vue 权限管理 动态路由(6)
1.动态生成路由 import Vue from 'vue' import Router from 'vue-router' import NProgress from 'nprogress' // ...
- vue当中addRoutes动态添加路由白屏解决和next(),next(“/“)的一些区别
问题产生前言 使用动态添加路由router.addRoutes()后进入一个页面,对着这一个页面刷新一下,然后页面就白屏了并且不管刷新多少次都没有用,依旧是白屏,只有重新进入页面才有效果 比如对于网站 ...
- vue中使用动态添加路由(router.addRoutes)加载权限侧边栏的两种方式
工作中我们经常会遇到这种需求,后台定义用户的权限数据,前端进行获取,并渲染在侧边栏导航上,不同权限的用户看到的侧边栏是不同的.即前端渲染的数据是随着后台的改变而改变的,做到真正的前后端分离. 一.拿到 ...
- Vue项目如何动态设置路由meta信息中的title属性值
场景:编辑.新建页面配置为同一个路由信息,期望不同页面的文档title展示不一样. 目前的配置如下,不能实现需求. 因此,我们需要动态的去设置meta的值.思路:借助Vue Router的路由独享守卫 ...
- 【前端】Vue+Element UI案例:通用后台管理系统-登陆不同用户显示不同菜单、动态添加路由
文章目录 目标 代码 0.动态地显示菜单:store 1.动态注册路由 2.解决刷新后摆平问题 总代码 本篇修改的代码文件 tab.js 参考视频: VUE项目,VUE项目实战,vue后台管理系统,前 ...
- 关于vue 动态引入(异步加载import和require)组件的方法和坑(按需懒加载组件,动态生成路由)babel-plugin-dynamic-import-node 优化编译速度
前言: 最近在改造vue-cli 2.x + webpack2.x的项目时,由于之前路由是静态的,没有根据菜单权限动态生成前端路由.所以想对此进行改造,然后碰到了一些问题和坑,现在总结一下,避免以后继 ...
最新文章
- python银行家算法代码_避免死锁的银行家算法C++程序实现
- 1.3-date命令
- angular模拟web API
- 白话Elasticsearch30-IK中文分词之热更新IK词库
- 利用 Git OpenSSH 查看/生成 本机 ssh 公钥
- 预留空间过大的OutOfMemoryError
- Linux 应用程序的源码包如何安装?
- Sort the Array
- POJ P1185 炮兵阵地 【状压dp】
- 计算机专业的描述,计算机专业描述怎么写
- C语言程序设计基础篇
- PE制作-004.UEFI和Legacy双启动之修改定制Win10PE
- 自定义下拉框样式兼容IE8
- 神舟K650D-G4D2安装ubuntu18.04出现的[Firmware Bug]
- 【RDMA】RDMA编程实例(IBV Verbs )
- 十年匠心,让国漫精致到羽翼丰满!《老鹰抓小鸡》幕后制作分享
- CLion: rsync is not installed or not avaiable in PATH on remote host
- 线段树节点个数的递推公式与通项公式
- win10可以上网但是网路连接显示小地球-解决办法
- 支付宝支付开发——当面付条码支付和扫码支付
热门文章
- 深度学习案例之基于 CNN 的 MNIST 手写数字识别
- 买电脑主要看什么配置_我的专业要买什么配置电脑可以用到毕业?
- 【自动化测试】整理各种测试开发工具!持续更新
- shell脚本执行方式,更方便更快捷。
- 大数据之Kafka入门简介
- php 计算数据偏离度,关于偏离度的测算方法
- 华为消息推送 有透传通道吗_求解在推送用透传消息-使用厂商通道(我用的是基座测试) 用手机测试出现了“clientId离线”问题...
- 湖北大学计算机袁云,暑期走访不停歇 远赴异地送关怀——学校慰问离退休教职工和校友...
- DEBUG、void、NULL、C库和API、临时匿名变量、main函数
- uboot的一般性介绍