vue如何根据权限生成动态路由、导航栏

yizhihongxing

生成动态路由,实现权限控制是一个较为常见的需求,以下是可以参考的攻略:

1.准备工作

1)安装依赖

需要安装vue-router和vue-cli-plugin-auto-routing模块

npm install vue-router vue-cli-plugin-auto-routing --save

2)配置自动路由生成插件

首先需要在vue.config.js文件里面添加一个插件

module.exports = {
  configureWebpack: {
    resolve: {
      alias: {
        "@": require("path").resolve(__dirname, "src")
      }
    }
  },
  transpileDependencies: ["vuetify"],
  devServer: {
    hot: true,
    watchOptions: {
      poll: true
    }
  },
  pluginOptions: {
    autoRouting: {
      chunkNamePrefix: "page-",
      pages: "src/pages",
      nested: true
    }
  }
};

这段代码的作用是配置插件自动化生成路由,其中:

  • chunkNamePrefix 用于生成路由的名字前缀
  • pages 告诉插件路由的代码文件都在哪个目录里面
  • nested 表明这个目录是嵌套的

2.为让生成的路由可控,需要重新编写路由文件

根据自己的需求,构造一个树形菜单,例如:

const menus = [
  {
    name: "Dashboard",
    icon: "mdi-view-dashboard",
    path: "/dashboard"
  },
  {
    name: "用户管理",
    icon: "person",
    path: "/users",
    children: [
      {
        name: "新增用户",
        icon: "",
        path: "/users/new"
      },
      {
        name: "用户列表",
        icon: "",
        path: "/users/list"
      }
    ]
  }
];

其中,每个对象都包含了必须的信息,包括指向的组件、路径、名称,还有可选的图标信息。

然后就是循环生成路由和菜单的过程,大体如下:

import router from "@/router";
import store from "@/store";

function addRoutes(menuList) {
  menuList.forEach((menu) => {
    if (menu.children && menu.children.length > 0) {
      addRoutes(menu.children);
    }
    let route = {
      name: menu.name,
      path: menu.path,
      component: () =>
        import("@/pages" + menu.path + "/index.vue"),
      meta: menu.meta || {}
    };
    let parent = getParentRoute(menu.path);
    router.addRoute(parent, route);
  });
}

function getParentRoute(path) {
  let parent = router.options.routes.find((i) => i.path === path);
  if (!parent) {
    parent = {
      name: path.slice(1),
      path: path,
      component: () => import("@/pages/parent.vue"),
      meta: {}
    };
    router.addRoute(parent);
  }
  return parent;
}

const permission = {
  createRoutes: async function () {
    try {
      addRoutes(menus);
      store.commit("permission/setRoutes", router.options.routes);
      console.log("router", router.options.routes);
    } catch (e) {
      console.error(e);
    }
  }
};

export default permission;

上面的代码分为两部分:

  • addRoutes 构造路由表
  • getParentRoute 判断是否有父组件,并返回父组件路径

3.实现菜单动态生成

在循环生成路由的时候,也就是上面 addRoutes 函数里面,我们需要将菜单推入到一个全局变量 menuInfo 里面,最后把这个变量赋值给 store,以便在页面渲染时使用.

function addRoutes(menuList) {
    menuList.forEach((menu) => {
        if (menu.children && menu.children.length > 0) {
            addRoutes(menu.children);
        }
        let route = {
            name: menu.name,
            path: menu.path,
            component: () => import(`@/views${menu.path}/index.vue`),
            meta: menu.meta || {}
        };
        let parent = getParentRoute(menu.path);
        router.addRoute(parent, route);
        addMenu(menu, parent);
    });
}
const permission = {
    createRoutes: async function () {
        try {
            addRoutes(menus);
            store.commit('permission/setRoutes', router.options.routes);
            store.commit('permission/setMenuInfo', menuInfo);
            console.log('router', router.options.routes);
        } catch (e) {
            console.error(e);
        }
    }
};

接下来只需要在整个页面中调用这个 permission.createRoutes(),就可以自动化生成菜单和路由,实现权限管理了。

  1. 示例

这里提供两个使用自动化路由技术进行权限管理的示例:

  • 网站管理平台

某公司为自己的网站构建了一个可视化的管理平台,用于对网站内容、用户、前端界面进行管理。这个平台需要进行权限管理,管理员才能查看和操作网站相关内容,为此他们需要动态生成权限控制的路由和对应的菜单。

他们首先定义了一个功能树,树状结构中对应着导航菜单的结构,通过自动化路由插件,从配置文件 vue.config.js 中引用到插件配置,自动生成动态路由,并使用 router.addRoutes 动态将路由添加到VueRouter中。

然后根据功能树的结构,在配置文件当中定义好菜单的嵌套结构,每个菜单都对应着一个路由,当路由被匹配时,Vue会根据路径及文件配置自动加载对应的页面组件。并使用添加 routes 时的 addMenu 函数,将路由对象添加到菜单栏中。

  • 在线考试管理系统

某所学校开发了一个在线考试系统,要求管理员能够控制用户的考试权限。管理员以树状结构的形式设置各种试卷和考试的权限。不同的权限跳转到不同的页面,因此需要使用自动化路由技术。

管理员可以将试卷分组,也能指定用户或用户组对试卷的访问权限,例如,密钥保持在数据库中,或者只允许某个特定的IP地址访问某个特定的试卷。由于考试系统为受限区域,管理员不需要考虑攻击问题。

管理员管理权限时,需要对应到 routes map 中的节点,并使用对应的 router-view 渲染组件。如果当前登录的用户没有访问某个特定路由的权限,Vue会自动跳转到默认路径。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue如何根据权限生成动态路由、导航栏 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript中Infinity(无穷数)的使用和注意事项

    让我详细为您讲解一下“JavaScript中Infinity(无穷数)的使用和注意事项”的完整攻略。 什么是Infinity Infinity是JavaScript中的一个特殊数值,表示正或负的无穷大,表示数值超出JavaScript可以表示的极限。具体地说,在JavaScript中,Infinity是一个大于任何数的数,可以表示一些过大的数字或计算出的无限…

    JavaScript 2023年5月28日
    00
  • JS加载器如何动态加载外部js文件

    JS加载器(JS Loader)是一种在页面上动态加载外部JavaScript文件的工具。在浏览器中,可以使用XMLHttpRequest对象或标签来实现动态加载JS文件。下面是JS加载器动态加载外部JS文件的完整攻略。 步骤一:创建JS加载器 首先,需要创建一个JS加载器函数,用于动态加载外部JS文件,并且可以指定在JS文件加载完成后需要执行的回调函数。 …

    JavaScript 2023年5月27日
    00
  • Json Web Token在前后端实践思考分析

    Json Web Token在前后端实践思考分析 什么是Json Web Token(JWT) JSON Web Token(JWT)是一种用于在两个实体之间安全传输消息的开放标准(RFC 7519)。JWT以JSON格式编码数据,可以安全地存储在URL参数、POST参数、HTTP标头或Cookie中。JWT包括三个部分:头部,载荷和签名,最终生成的JWT字…

    JavaScript 2023年5月27日
    00
  • JavaScript关于提高网站性能的几点建议(一)

    下面是详细讲解 “JavaScript关于提高网站性能的几点建议(一)” 的完整攻略: 1. 使用事件委托 当我们需要在多个元素上绑定相同的事件,传统的做法是给每个元素都绑定一遍,这样就会导致页面加载过慢,影响用户体验。使用事件委托可以解决这个问题,它会将事件绑定到元素的父元素上,当子元素触发事件时,事件会冒泡到父元素,再去执行绑定的事件处理函数。 下面是一…

    JavaScript 2023年5月27日
    00
  • js输出数据精确到小数点后n位代码

    下面是 js 输出数据精确到小数点后 n 位代码的完整攻略。 方式一:Number.prototype.toFixed() 方法 Number.prototype.toFixed() 方法可以将一个数四舍五入为指定小数位数的数字。它的基本语法如下: number.toFixed(digits) 其中,number 是要转换的数字,digits 是要保留的小数…

    JavaScript 2023年5月28日
    00
  • JS合并数组的几种方法及优劣比较

    JS合并数组的几种方法及优劣比较 在JavaScript编程中,经常需要将两个或多个数组合并成一个新数组。下面将会介绍几种常用的合并数组的方法,并对它们的优劣进行比较。 方法一:concat() 方法 concat() 方法是 JavaScript 中最基础的数组合并方法。它可以将两个或多个数组合并成一个新数组。 let arr1 = [1, 2, 3]; …

    JavaScript 2023年5月27日
    00
  • JavaScript实现字符串与日期的互相转换及日期的格式化

    JavaScript实现字符串与日期的互相转换及日期的格式化主要包含以下几个步骤: 将日期字符串转换为Date对象 将Date对象转换为字符串 对日期进行格式化 下面将详细阐述这些步骤: 将日期字符串转换为Date对象 可以使用Date.parse()方法将日期字符串转换为Date对象。该方法接收一个日期字符串作为参数,返回相应的毫秒数。 示例代码: con…

    JavaScript 2023年5月27日
    00
  • JavaScript逆向调试技巧总结分享

    JavaScript逆向调试技巧总结分享 什么是JavaScript逆向调试 JavaScript逆向调试指的是从已有的 JavaScript 代码中,逆向推导出程序的逻辑和实现方式,有助于了解和优化程序的功能和性能。 JavaScript逆向调试的方法和工具 方法 代码审查 断点调试 控制台调试 动态脚本注入 工具 浏览器自带的控制台 Chrome Dev…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部