vue2+antd——实现动态菜单路由功能——基础积累

这篇具有很好参考价值的文章主要介绍了vue2+antd——实现动态菜单路由功能——基础积累。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


最近在写后台管理系统,遇到一个需求就是要将之前的静态路由改为动态路由,使用的后台框架是: vue-antd-admin

实现的需求:

在页面开始登录时,通过路由接口可以获取到所有有权限的菜单数据。

然后通过loadRoutes方法来实现异步动态路由。

效果图——动态菜单的参数效果图如下:

vue2+antd——实现动态菜单路由功能——基础积累,antd,vue基础知识,js必会知识点,windows

在account.js中的refreshPermissions函数中添加以下代码

如上图所示,需要在登录接口调用成功后,书写以下的代码:
import { loadRoutes } from '@/utils/routerUtil.js';
import { getCodeList } from '@/services/menu';//获取权限的接口,我这边是获取权限成功后,再去获取动态菜单,其实这个逻辑是可以异步处理的。

actions: {
 refreshPermissions({ commit }, callback) {
   getCodeList().then((res) => {
     let permissions = [];
     res &&
       res.map((x) => {
         permissions.push({
           id: x,
           operation: [],
         });
       });
     commit('setPermissions', permissions);
   });
   loadRoutes();
   callback && callback('success');
 }
}

loadRoutes方法内容如下:

import PageView from '@/layouts/PageView';
function changeRoutes(item) {
  let obj = { ...item };
  obj.component =
    item.routeTypeCode == 0
      ? PageView
      : (resolve) => require([`@/pages${item.component}`], resolve);
  if (item.children) {
    obj['children'] = item.children.map((child) => {
      return changeRoutes(child);
    });
  }
  return obj;
}
function loadRoutes(routesConfig){
  getCurrentMenu().then((arr) => {
  //如果接口没有数据,则可以用下面的模拟数据
  let arr = [
    {
      path: 'default',
      name: '工作台',
      icon: 'dashboard',
      component: '/dashboard/index',
      routeTypeCode: 1,
    },
    {
      path: '/memberManage',
      name: '客户管理',
      icon: 'team',
      component: '/BlankView',
      routeTypeCode: 0,
      children: [
        {
          path: '/company/list',
          name: '企业管理',
          component: '/Member/Company/list',
          routeTypeCode: 1,
        },
        {
          path: '/company/detail',
          name: '企业详情',
          invisible: true,
          routeTypeCode: 1,
          component: '/Member/Company/detail',
        },
        {
          name: '用户管理',
          path: '/member/list',
          routeTypeCode: 1,
          component: '/Member/Member/list',
        },
        {
          name: '用户详情',
          path: '/member/detail',
          routeTypeCode: 1,
          invisible: true,
          component: '/Member/Member/detail',
        },
      ],
    },
    {
      path: '/system',
      name: '系统管理',
      icon: 'setting',
      routeTypeCode: 0,
      component: () => import('@/layouts/PageView'),
      children: [
        {
          name: '角色管理',
          path: '/system/role',
          routeTypeCode: 1,
          component: '/identity/RoleList',
        },
        {
          name: '部门组织',
          path: '/system/organization',
          routeTypeCode: 1,
          component: '/organization/organizationUnits',
        },
        {
          name: '用户管理',
          path: '/system/user',
          routeTypeCode: 1,
          component: '/identity/UserList',
        },
        {
          name: '数据字典',
          path: '/system/dataDictionary',
          routeTypeCode: 1,
          component: '/dataDictionary/DataDictionary',
        },
        {
          name: '客户端管理',
          path: '/system/openApi',
          routeTypeCode: 1,
          component: '/OpenAPI/index',
        },
        {
          name: 'HttpApi日志',
          path: '/system/httpApi',
          routeTypeCode: 1,
          component: '/system/httpApi',
        },
        {
          name: '审计日志',
          path: '/system/auditLog',
          routeTypeCode: 1,
          component: '/system/auditLog',
        },
        {
          name: '缓存列表',
          path: '/system/cache',
          routeTypeCode: 1,
          component: '/system/cache',
        },
      ],
    },
    {
      path: '/menu',
      name: '菜单管理',
      icon: 'menu',
      routeTypeCode: 0,
      redirect: '/menu/list',
      component: '/BlankView.vue',
      children: [
        {
          path: '/menu/list',
          name: '菜单管理',
          routeTypeCode: 1,
          component: '/Menu/menuList.vue',
        },
      ],
    },
  ];
  let list = [];
  arr.forEach((item) => {
    if (item.routeTypeCode != 2) {
      list.push(changeRoutes(item));
    }
  });
  routesConfig = [
    {
      router: 'root',
      children: list,
    },
  ];
  console.log('加载路由了,在此处请求接口获取数据', routesConfig);
  // 应用配置
  const { router, store, i18n } = appOptions;
  // 如果 routesConfig 有值,则更新到本地,否则从本地获取
  if (routesConfig) {
    store.commit('account/setRoutesConfig', routesConfig);
  } else {
    routesConfig = store.getters['account/routesConfig'];
  }
  // 如果开启了异步路由,则加载异步路由配置
  // const asyncRoutes = store.state.setting.asyncRoutes;
  const asyncRoutes = true;
  if (asyncRoutes) {
    if (routesConfig && routesConfig.length > 0) {
      const routes = parseRoutes(routesConfig, routerMap);
      const finalRoutes = mergeRoutes(basicOptions.routes, routes);
      formatRoutes(finalRoutes);
      router.options = { ...router.options, routes: finalRoutes };
      router.matcher = new Router({ ...router.options, routes: [] }).matcher;
      console.log('finalRoutes', finalRoutes);
      router.addRoutes(finalRoutes);
    }
  }
  // 提取路由国际化数据
  mergeI18nFromRoutes(i18n, router.options.routes);
  // 初始化Admin后台菜单数据
  const rootRoute = router.options.routes.find((item) => item.path === '/');
  const menuRoutes = rootRoute && rootRoute.children;
  if (menuRoutes) {
    store.commit('setting/setMenuData', menuRoutes);
  }
  })
}

上面最重要的文章来源地址https://www.toymoban.com/news/detail-713209.html

到了这里,关于vue2+antd——实现动态菜单路由功能——基础积累的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3+vite搭建基础架构(11)--- 菜单栏功能和Tab页功能实现

    这里记录下自己在Vue3+vite的项目使用less来写样式以及使用vite-plugin-vue-setup-extend直接定义组件name,不使用ts语法,方便以后直接使用。这里承接自己的博客Vue3+vite搭建基础架构(10)— 使用less和vite-plugin-vue-setup-extend这篇博客,在该博客项目的基础上增加菜单栏功能和Tab页功能

    2024年02月21日
    浏览(28)
  • Vue2动态路由

    应用场景:   一般管理端的菜单栏是根据登录用户角色不同,动态生成的,在vue中我们不止菜单栏需要动态生成,同时我们路由也需要动态生成。 使用到的组件: 组件名称 组件版本 组件作用 axios 1.3.4 用于发送请求获取数据 element-ui 2.15.13 前端ui组件库,制作页面使用 vue-

    2024年02月20日
    浏览(36)
  • Vue-根据角色获取菜单动态添加路由

    如果大家写过后台管理系统的项目,那么动态路由一定是绕不开的,如果想偷懒的话,就把所有路由一开始都配置好,然后只根据后端返回的菜单列表渲染就好菜单就好了,但是这样的隐患就是我在地址栏输入的地址的时候,也会进入这个页面,不偷懒的方法就是本文要介绍

    2024年01月24日
    浏览(65)
  • 前端之vue 根据菜单自动生成路由(动态配置前端路由)

    在需要权限控制的页面,往往存在根据用户来显示菜单的情况,单独根据用户类型判断显然不是很好,如果后面用户类型发生变化,项目修改维护可能就会比较麻烦,所以比较好的做法是根据后端返回的菜单动态生成页面路由,以达到完全权限控制的目的,并且若权限发生变

    2024年04月10日
    浏览(27)
  • Vue2中根据权限添加动态路由

    大概记录一下主要代码 大概结构如下:

    2024年02月12日
    浏览(28)
  • Django+vue3权限菜单rabc设计和动态路由

    本次是基于Django和vue实现 github源码:nineaiyu/xadmin-server: xadmin-基于Django+vue3的rbac权限管理系统 (github.com) 服务器设计及部分代码  权限控制的话,可以基于Django的permission进行控制,并通过访问api的URL操作 核心代码如下 因此,需要对menu表进行设计,由于涉及到了前端vue路由,

    2024年02月12日
    浏览(35)
  • Vue2-动态路由传参的基本用法

    在Vue 2中,可以使用动态路由传递参数。动态路由参数允许你在路由路径中包含占位符,这些占位符可以在路由被匹配时提取出来并作为参数传递给组件。 下面是一个使用Vue 2动态路由传参的基本用法的例子: 首先,在路由配置文件(通常是 router/index.js )中定义一个带有动

    2024年02月01日
    浏览(32)
  • el-menu实现左侧菜单栏(vue2,vue3)

    vue3写法 多级数据 1. home.vue 先把页面基底搭建好 2. Sidebar.vue 左侧菜单栏(多级数据) 3. Header.vue 顶部导航栏 一级数据 home页面是一样的 Sidebar.vue Header.vue(我这里还做了一个切换昼夜间模式的主题) vue2 多级数据 一级数据(使用自己的图标

    2024年02月08日
    浏览(38)
  • Vue2基础九、路由

    1、单页应用 (1)单页应用是什么 单页面应用(SPA:Single Page Application): 所有功能在 一个html页面 上实现 具体示例: 网易云音乐 https://music.163.com/ (2)单页面应用VS多页面应用 单页面应用优缺点 优点:按需更新性能高,开发效率高,用户体验好 缺点:学习成本,首屏加载慢,

    2024年02月15日
    浏览(27)
  • Vue2路由:手动配置使用路由&路由嵌套、路由动态传参(:参数,query、props)、编程式导航(back、go)、导航守卫

    过了一遍vue2的router,整理一下小结 目录 一、前端路由的概念与原理 1.1 什么是路由 1.2 路由的工作方式 二、vue-router的基本使用 2.1 安装、配置、使用router 2.2 redirect重定向 三、嵌套路由 3.1 声明子路由的规则 3.2 默认子路由 四、动态路由 4.1 动态路由的概念 4.2 动态路由取参方

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包