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移动开发中touch触摸事件详解

    JavaScript移动开发中touch触摸事件详解 1. 简介 在移动开发中,我们经常需要使用到触摸事件(touch event)。触摸事件是指用户在手机或平板电脑等触摸设备上进行的操作,这些操作包括点击、滑动、缩放等等。 在JavaScript中使用触摸事件可以为移动开发增加更丰富的交互方式,而对于大多数移动设备,touch事件已经成为了与鼠标事件等同的…

    JavaScript 2023年6月10日
    00
  • js实现一个简单的数字时钟效果

    下面是JS实现一个简单的数字时钟效果的攻略: HTML结构 首先需要在HTML中创建一个div,用来展现时钟。 <div id="clock"></div> CSS样式 然后还需要写一些CSS样式,让时钟展示的更加美观。 #clock { font-size: 48px; /*设置字号*/ font-family:…

    JavaScript 2023年5月27日
    00
  • JavaScript setinterval延迟一秒解决方案

    当我们在使用JavaScript代码的时候,我们可能会遇到需要执行定时任务的情况。而在一些情况下,我们需要在定时任务中等待一定的时间,再执行后续的操作。这时就可以使用setInterval延迟一定时间进行操作。但是,要注意setInterval不是严格间隔时间执行,而是间隔一段时间后才会执行。下面是针对“JavaScript setInterval延迟一秒解…

    JavaScript 2023年6月11日
    00
  • 浅析Java 对象引用和对象本身

    浅析 Java 对象引用和对象本身 在 Java 编程中,我们经常会涉及到对象的引用和对象本身的概念。这两者之间的关系非常密切,理解它们的作用和区别对于编写高质量的 Java 代码非常重要。 Java 对象引用 Java 中的对象引用指的是一个变量或表达式,该变量或表达式包含了对象的内存地址。简单来说,即是将对象的地址赋值给一个变量,以方便后续操作。 以下是…

    JavaScript 2023年6月10日
    00
  • 如何使用JS console.log()技巧提高工作效率

    如何使用JS console.log()技巧提高工作效率 JavaScript 是前端开发必不可少的一门语言,而 console.log() 是 JS 里常用的调试工具。在这里,我们将从几个方面介绍如何使用 console.log() 技巧提高工作效率。 1. console.log()基本使用 console.log() 不仅仅只是打印一些信息。在开发过程…

    JavaScript 2023年5月28日
    00
  • JavaScript实现生成GUID(全局统一标识符)

    生成GUID是前端开发中非常常见的需求之一,在JavaScript中实现也非常简单,可以通过以下步骤完成: 导入uuid库 JavaScript本身并没有原生的生成GUID的函数,但是可以通过第三方库来实现,其中最常用的就是uuid库。可以通过以下命令将uuid库导入到项目中: npm install uuid –save 使用uuid库生成GUID 成功…

    JavaScript 2023年6月10日
    00
  • JavaScript实现简单购物小表格

    下面是“JavaScript实现简单购物小表格”的完整攻略: 1.准备工作 在HTML中,首先要准备一个表格元素,代码如下: <table> <thead> <tr> <th>商品</th> <th>价格</th> <th>数量</th> <th…

    JavaScript 2023年6月11日
    00
  • ASP.NET笔记之 ListView 与 DropDownList的使用

    ASP.NET笔记之 ListView 与 DropDownList的使用 介绍 在ASP.NET中,ListView和DropDownList都是常用的控件之一,ListView可以显示多行数据并提供样式控制,DropDownList则是提供了下拉列表的选择功能。本文将详细讲解ListView和DropDownList的使用,包括基本概念、属性设置和样式控…

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