首页 > 其他分享 > 路由权限的实现与动态导航的渲染

路由权限的实现与动态导航的渲染

时间:2023-06-06 14:01:29浏览次数:50  
标签:views 渲染 component meta path import 权限 路由

路由权限的实现与动态导航的渲染

1. 作用

  1. 对于管理系统,不同的账号有不同的权限,登录后所看到的内容自然也应该不同。
  2. 所以这里就要根据账号的角色渲染不同的导航,有些路由就不能访问。

2. 处理路由,形成不同的权限。

1. 拆分路由

  1. 把路由拆分成不同的模块,每个模块能访问到的路由是不同的,至于超级管理员这种应该能查看所有路由。
  2. 这里为了简单演示,就分两个,以便日后查看与理解。
// 1: 普通管理员路由
const normalRoutes = [
  // 默认进入登录页
  { path: '/', redirect: '/login' },
  { path: '/login', component: () => import('@/views/login/Login.vue') },
  // 首页
  {
    path: '/home', meta: { title: '首页' }, isMenu: true, icon: 'el-icon-s-home', component: () => import('@/views/home/Layerout.vue'),
    children: [
      { path: '', component: () => import('@/views/home/Home.vue') }
    ]
  },
  // 要展示导航的路由添加自定义属性:isMuse,
  // 商品模块
  {
    path: '/goods', meta: { title: '商品管理' }, icon: 'el-icon-sell', isMenu: true, component: () => import('@/views/home/Layerout.vue'), redirect: '/goods/list',
    children: [
      { path: '/goods/list', meta: { title: '商品列表' }, isMenu: true, component: () => import('@/views/goods/GoodsList.vue') },
      { path: '/goods/add', meta: { title: '商品添加' }, isMenu: true, component: () => import('@/views/goods/GoodsAdd.vue') },
    ]
  },
  // 订单管理
  {
    path: '/order', meta: { title: '订单管理' }, icon: 'el-icon-document', isMenu: true, component: () => import('@/views/home/Layerout.vue'),
    children: [
      { path: '', component: () => import('@/views/order/Order.vue') }
    ]
  },
]
// 2: 超级管理员路由
const superRoutes = [
  // 账号模块
  {
    path: '/account', icon: 'el-icon-user-solid', meta: { title: '账号管理' }, isMenu: true, component: () => import('@/views/home/Layerout.vue'), redirect: '/account/list',
    children: [
   //这里是多个子路由。
    ]
  },
  // 店铺管理
  {
    path: '/store', icon: 'el-icon-s-shop', meta: { title: '店铺管理' }, isMenu: true, component: () => import('@/views/home/Layerout.vue'),
    children: [
      { path: '', component: () => import('@/views/store/Store.vue') }
    ]
  },
]
  1. 上面的注意点
  • meta属性的title是用来记录路径名字的,以便后面调用。
  • isMenu属性是用来判断要不要显示到导航上,后面可以利用这个属性踢出不用的路由
  • icon是element图标的名字

2. 封装函数用以返回不同的路由集合

  1. 函数内从本地读取当前账号角色分类,当然也可以不用本地读取。
let role = local.get('role')
  1. 根据不同账号返回不同路由,注意这里要暴露出去,因为导航栏还要使用到这些路由。
//返回路由的函数
export function showRoute() {
  let role = local.get('role')
  //超级管理员返回所有路由
  if (role === 'super') {
    return [...normalRoutes, ...superRoutes]
    //普通管理员返回普通路由
  } else {
    return normalRoutes
  }
}

3. 路由实例化时调用函数

const router = new VueRouter({
  routes: showRoute()
})

这样就实现了不同类型账号能够读取不同的路由
路由权限就实现了

3. 导航的动态渲染

1. 导航栏获取路由数据

  1. 引入上面暴露的路由函数
// 引入渲染导航的函数
import { showRoute } from "@/router/index.js";
  1. 筛选出拥有自定义属性isMenu的路由
export default {
  data() {
    return {
      routes: showRoute().filter(v => v.isMenu)
    };
  }
};

2. 进行渲染

利用这个获取到的数据渲染一级导航。

  1. 因为v-for和v-if写到同一个标签上编码软件会报错,实际上是可以运行的。所以要用一个template的虚拟标签来,这里的:key可以写到内部,因为他是个虚拟标签。
<template v-for="(v, i) in routes"></template>
  1. 在里面渲染标签,v-if进行判断v.children.length是不是1,如果是就渲染一级导航。
<!-- 只有一层的菜单 -->
<el-menu-item :index="v.path" :key="i" v-if="v.children.length===1">
    <i :class="v.icon"></i>
    <span slot="title">{{ v.meta.title }}</span>
</el-menu-item>
  1. 紧接着写v-else二级菜单,因为路由里面还有children也要进行遍历与判断,所以还要用到虚拟标签。
  2. v-for进行遍历,v-if对取出的值进行判断,如果有isMenu就创建他。
<!-- 两层的菜单,第一层 -->
<el-submenu :index="v.path" v-else :key="i">
    <template slot="title">
        <i :class="v.icon"></i>
        <span>{{ v.meta.title }}</span>
    </template>
    <el-menu-item-group>
        <!-- 第二层 -->
        <template v-for="(n, j) in v.children">
            <el-menu-item :index="n.path" v-if="n.meta" :key="j">{{ n.meta.title }}</el-menu-item>
        </template>
    </el-menu-item-group>
</el-submenu>
  1. 这样就利用路由实现了导航的动态渲染。

4. 解决单页应用的一个bug

  1. 不同账号在同一设备登录可能会查看到不属于自己权限的内容。必须要刷新一次。
  2. 因为跳转页面的函数是异步的,所以添加await。
// 登陆成功时
if (res.data.code === 0) {
    // 存储数据
    local.set("token", res.data.token);
    // 储存角色
    local.set("role", res.data.role);
    // 跳转页面
    await this.$router.push("/home");
    // 解决不同账号登录的bug,会访问到不该访问的页面
    window.location.reload();
}

标签:views,渲染,component,meta,path,import,权限,路由
From: https://www.cnblogs.com/lyc00000000/p/17460350.html

相关文章

  • Maven(创建私有仓库和设置权限)
    为区分项目,要为项目建立私有仓库 1.添加仓库    2.填写私有仓库信息,然后保存 RiilRelease仓库 RiilSnapshot仓库   3.配置成功 4.添加权限    5.添加RiilRelease的权限和RiilSnapshot的权限    6.检查是否配置成功    7.创建角色,分配权限    ......
  • 使用eNSP模拟器配置静态路由
    知识点延伸:什么是静态路由?答:静态路由是指由网络管理员手动配置和维护的路由。静态路由配置简单,无须像动态路由那样占用路由器的CPU资源来计算和分析路由更新,还可以实现负载均衡和路由备份。1.任务要求:(1)PC1、PC2实现网络互通;(2)源网络和源目的网络之间存在多条链路,使用等价路由实......
  • MySQL用户与权限管理
    一:用户管理1:登录MySQL服务器我们在安装完MySQL以后,就会通过root用户进行登录;那么root该怎么登录呢?所以我们启动MySQL服务后,可以通过mysql命令来登录MySQL服务器基本语法:mysql<-uusername><-p>[password][-hhostname|hostIP][-Pport][databaseName][-e"SQL语句"......
  • Vue router 二级默认路由设置
    一、起因打开默认地址/(http://localhost:5432/),home页面有空白,因为没有指定默认打开的子页。//router.jsexportconstconstantRoutes=[{path:'/',component:()=>import('@/views/MainView'),name:'Index',met......
  • linux 下文件的权限
                     ......
  • WPF自学入门(四)WPF路由事件之自定义路由事件
      在上一篇博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件。接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧。创建自定义路由事件分为3个步骤:1、声明并注册路由事件。2、利用CLR事件包装路由事件(封装路由事件)。3、创建可以激发路由......
  • asp.net core 中的路由
          ......
  • Cisco 路由器登录标语
    Router(config)#bannerlogin'haha'设置本地登录标语Router(config)#bannermotd'xixi'设置启动标语......
  • 条件渲染,列表渲染,双向数据绑定,事件处理,checkbox单选,
    条件渲染v-if,v-else-if,v-else:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="/js/vue.js"></script></head><......
  • Wi-Fi 6E路由器电源线端口浪涌保护方案设计图
    如今,Wi-Fi路由器越来越容易受到瞬态浪涌、静电放电的损坏。Wi-Fi6E路由器具有多个高速有线网络接口,有以太网、USB和Wi-Fi天线端口等等。由于用户经常交互和操作这些数据端口,路由器极易受到瞬态浪涌威胁的影响,例如静电放电ESD、电气快速瞬变EFT、电气过载EOS、电缆放电(CDE)等等......