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

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

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 中更好地利用数组

    当涉及到 JavaScript 中的数组时,有一些技巧可以帮助我们更好地使用它们。以下是一些利用数组的技巧,包括代码示例。 数组的创建和初始化 我们可以使用数组字面量创建一个数组,如下所示: const myArray = [1, 2, 3]; 我们还可以使用构造函数 Array() 来创建一个数组。 const myArray = new Array(1,…

    JavaScript 2023年5月27日
    00
  • JavaScript数组的快速克隆(slice()函数)和数组的排序、乱序和搜索(sort()函数)

    JavaScript是一门非常强大的编程语言,其中数组作为数据结构扮演着重要的角色。本文将为大家介绍JavaScript数组的快速克隆(slice()函数)和数组的排序、乱序和搜索(sort()函数)的详细攻略。 JavaScript数组的快速克隆 JavaScript数组使用slice()函数可以迅速地创建一个数组的克隆。slice()函数可以截取数组的一…

    JavaScript 2023年5月27日
    00
  • js实现的美女瀑布流效果代码

    这里是“js实现的美女瀑布流效果代码”的完整攻略: 瀑布流效果简介 瀑布流效果(Waterfall Flow)是指像瀑布一样一列接一列的布局方式。随着页面滚动,页面中的图片会自动根据设置好的列数和间距排列,并且会动态加载。瀑布流效果是现代网站中十分流行的一种图片展示方式。 实现方法 瀑布流效果的实现方法比较多,包括纯CSS实现和JS实现。纯CSS实现的瀑布流…

    JavaScript 2023年6月11日
    00
  • JS中自定义事件与观察者模式详解

    那我来为你详细讲解一下关于“JS中自定义事件与观察者模式”的攻略。 一、 什么是自定义事件和观察者模式? 1. 自定义事件 在JavaScript中,浏览器提供了一些自带的事件,如 click、mouseover 等等。但有时候,我们需要在我们自己的应用程序中创建自定义事件,这就需要用到自定义事件技术了。 自定义事件即我们自己定义的事件,类似于浏览器内置的事…

    JavaScript 2023年5月19日
    00
  • Mysql内储存JSON字符串根据条件进行查询

    MySQL中可以使用JSON值类型存储JSON格式的数据。而且MySQL也提供了一系列的JSON函数和操作符来方便地处理JSON值类型的数据。以下是使用MySQL内储存JSON字符串根据条件进行查询的步骤和实例说明。 步骤 创建一个表格 在MySQL数据库中,我们可以用如下语句创建一个表格: sql CREATE TABLE `students` ( `id…

    JavaScript 2023年6月11日
    00
  • 分享JS表单验证源码(带错误提示及密码等级)

    分享JS表单验证源码是一项非常实用的技能,让我们一步步来学习如何完成它。 首先我们需要准备一个HTML表单。代码如下: <form action="#" method="POST"> <label>用户名:</label> <input type="text&quot…

    JavaScript 2023年6月10日
    00
  • JavaScript 异步调用

    JavaScript 异步调用 在JavaScript中,异步调用是指在执行某个函数时,不会等待该函数的返回,而是继续执行后面的语句,同时该函数在后台继续执行。当该函数执行完成并有结果后会再次调用回调函数进行处理。 异步调用主要用于I/O操作,如Ajax请求、定时器以及JavaScript中的事件处理等,而同步调用则是指代码按顺序执行,并且在某个函数执行完成…

    JavaScript 2023年5月28日
    00
  • ES6基础知识介绍

    下面是关于“ES6基础知识介绍”的完整攻略。 1. ES6是什么 ES6,全称是ECMAScript 6,又称ES2015,是JavaScript语言的新一代标准,是第一次对JavaScript语言本身的修改和完善,它不仅增加了很多新特性,还对语言本身进行了全面升级。ES6的各种新特性和语法糖,可以让我们用更少的代码,更简单地完成一些复杂的任务。 2. ES…

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