el-element-admin实现双路由菜单

需求:
1、输入用户名登录企业级菜单
2、点击企业级菜单中的首页,右边显示项目列表,点击某一行跳转到项目级菜单

注意:
企业级菜单和项目级菜单,后端分别给接口

具体实施:
1、点击面包靴首页的时候设置标记为企业级 1
D:\workCode\workShop-web\src\components\Breadcrumb\index.vue

 watch: {
    $route(route) {
      // if you go to the redirect page, do not update the breadcrumbs
      if (route.path.startsWith('/redirect/')) {
        return
      }
      this.getBreadcrumb()
      // 如果默认是首页 标记设置为企业级 1
      if (route.path === '/dashboard') {
        localStorage.setItem('enterpriseProjectFlag', 1)
        location.reload()
      }
    }
  }

2、点击退出时 标记设置为企业级 1
D:\workCode\workShop-web\src\layout\components\Navbar.vue

logout() {
 this.$store.dispatch('LogOut').then(() => {
    // 退出时 标记设置为企业级 1
    localStorage.setItem('enterpriseProjectFlag', 1)
    location.reload()
    if (this.$desktop.win != null) {
    // 跳转到泛云注销页面
      if (this.$store.getters.pageParmas.fy_logout_url && this.$store.getters.pageParmas.fy_logout_url.value && this.user.site.fyIp) {
        this.fy_logout_url = this.$store.getters.pageParmas.fy_logout_url.value.replace('{IP}', this.user.site.fyIp)
        this.$desktop.win.location.href = this.fy_logout_url
      }
    }
  })
}

3、菜单组件新增 @select 方法
D:\workCode\workShop-web\src\layout\components\Sidebar\index.vue

 <el-menu
   :default-active="activeMenu"
   :collapse="isCollapse"
   :background-color="variables.menuBg"
   :text-color="variables.menuText"
   :unique-opened="$store.state.settings.uniqueOpened"
   :active-text-color="variables.menuActiveText"
   :collapse-transition="false"
   @select="menuClick"
   mode="vertical"
 >
   <sidebar-item
     v-for="(route, index) in sidebarRouters"
     :key="route.path + index"
     :item="route"
     :base-path="route.path"
   />
 </el-menu>

点击左侧菜单中首页 标记为企业级1

methods:{
    //菜单激活回调
    menuClick(index){
      // 如果默认是首页 标记设置为企业级 1
      if (index === '/dashboard') {
        localStorage.setItem('enterpriseProjectFlag', 1)
        location.reload()
      }
    }
  }

4、localStorage中存储了enterpriseProjectFlag属性 该属性为1时代表企业级菜单,反之为0则代表项目级菜单
D:\workCode\workShop-web\src\router\index.js
引用企业级、菜单级接口

import { buildMenus, buildProject } from '@/api/system/menu'

全文重点:当企业级的时候在router.js loadMenus方法里加载企业级菜单 相反则加载项目级菜单
有了这段逻辑 仅需在自己需要区分企业级项目级菜单的地方 localStorage.setItem(‘enterpriseProjectFlag’, 0) 或localStorage.setItem(‘enterpriseProjectFlag’, 1) 即可加载对应菜单

export const loadMenus = (next, to) => {
  // 项目级 0 企业级 1
  if (Number(localStorage.getItem('enterpriseProjectFlag')) == 0 && getToken()) {
    // 项目级
    const data = {
      appType: appTypeProject,
      projectId: JSON.parse(localStorage.getItem('projectObject')).projId
    }
    buildProject(data).then(res => {
      const sdata = JSON.parse(JSON.stringify(res))
      const rdata = JSON.parse(JSON.stringify(res))
      const sidebarRoutes = filterAsyncRouter(sdata)
      const rewriteRoutes = filterAsyncRouter(rdata, false, true)
      rewriteRoutes.push({ path: '*', redirect: '/dashboard', hidden: true })
      store.dispatch('GenerateRoutes', rewriteRoutes).then(() => { // 存储路由
        router.addRoutes(rewriteRoutes) // 动态添加可访问路由表
        next({ ...to, replace: true })
      })
      store.dispatch('SetSidebarRouters', sidebarRoutes)
    })
  } else if(Number(localStorage.getItem('enterpriseProjectFlag')) == 1) {
    // 企业级
    const params = {
      appType: appType
    }
    buildMenus(params).then(res => {
      const sdata = JSON.parse(JSON.stringify(res))
      const rdata = JSON.parse(JSON.stringify(res))
      const sidebarRoutes = filterAsyncRouter(sdata)
      const rewriteRoutes = filterAsyncRouter(rdata, false, true)
      rewriteRoutes.push({ path: '*', redirect: '/dashboard', hidden: true })
      store.dispatch('GenerateRoutes', rewriteRoutes).then(() => { // 存储路由
        router.addRoutes(rewriteRoutes) // 动态添加可访问路由表
        next({ ...to, replace: true })
      })
      store.dispatch('SetSidebarRouters', sidebarRoutes)
    })
  }
}

5、区分企业级项目级角色
D:\workCode\workShop-web\src\store\modules\user.js
登录时默认企业级角色

// 登录
Login({ commit }, userInfo) {
    const rememberMe = userInfo.rememberMe
    return new Promise((resolve, reject) => {
      login(userInfo.username, userInfo.password, userInfo.code, userInfo.uuid).then(res => {
        setToken(res.token, rememberMe)
        commit('SET_TOKEN', res.token)
        setUserInfo(res.user, commit)
        localStorage.setItem('enterpriseProjectFlag', 1)
        // 第一次加载菜单时用到, 具体见 src 目录下的 permission.js
        commit('SET_LOAD_MENUS', true)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  }
 // 设置企业级角色
export const setUserInfo = (res, commit) => {
  // 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
  if (res.roles.length === 0) {
    commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT'])
  } else {
    commit('SET_ROLES', res.roles)
  }
  commit('SET_USER', res.user)
}

设置项目级角色

// 获取具体项目信息
SetProject({ commit }, row) {
  return new Promise((resolve, reject) => {
    setProject(row.projId).then(res => {
      setProjectUserInfo(res, commit)
      resolve(res)
    }).catch(error => {
      reject(error)
    })
  })
},
export const setProjectUserInfo = (res, commit) => {
  // 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
  if (res.length === 0) {
    commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT'])
  } else {
    commit('SET_ROLES', res)
  }
}

6、点击企业级首页右边显示的项目列表的某一行 跳转到项目级逻辑
D:\workCode\workShop-web\src\views\project\index.vue
重点: location.reload()

// 查看项目
viewProject(row) {
   localStorage.setItem('projectObject', JSON.stringify(row))
   // 企业级 1 项目级 0 ,触发项目级菜单接口
   localStorage.setItem('enterpriseProjectFlag', 0)
   location.reload()
 },
 // 刷新之后
 [CRUD.HOOK.afterRefresh]() {
   // 项目级 0 ,跳转到HUB协作
   if (Number(localStorage.getItem('enterpriseProjectFlag')) === 0) {
     // 获取具体项目信息
     this.$store.dispatch('SetProject', JSON.parse(localStorage.getItem('projectObject')))
     this.$router.push({
       path: '/project/projectInfo',
       query: {
         projId: JSON.parse(localStorage.getItem('projectObject')).projId
       }
     })
   }
 },

最终效果图
企业级
在这里插入图片描述
项目级
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30652.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于nginx,正向代理和反向代理是什么意思

为什么要使用nginx 很多公司会用到nginx做代理服务器&#xff0c;为什么用nginx&#xff0c;tomcat服务器不行吗&#xff1f; tomcat缺点&#xff1a;并发量小&#xff0c;用户使用的少 nginx&#xff1a;高并发&#xff0c;高性能&#xff0c;cpu、内存等资源消耗却非常低&…

06-揭开神秘面纱:Golang method的魅力解析

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等【二】

安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等【一】 前面分享了这篇帖子&#xff0c;很多友友希望更新下新机型的基带替换方法。今天对其中做一些补充说明。由于安卓机型跨版本幅度较大。有的机型从出厂安卓8有可能官方目前已经更新到安卓12 13等等。所以任何的教…

Visual ChatGPT原理解读——大模型论文阅读笔记四

论文&#xff1a;https://arxiv.org/abs/2303.04671 代码&#xff1a;https://github.com/microsoft/TaskMatrix 一. 整体框架 如图所示&#xff0c;用户上传一张黄花的图像并输入一个复杂的语言指令“请根据该图像的预测深度生成一朵红花&#xff0c;然后逐步使其像卡通一样”…

5G技术学习——5GNR帧结构和空口资源

这里写目录标题 4G时域定义&#xff1a;资源划分 5GNR中时域 频域 与空域资源 循环前缀CP:背景和原理5G帧结构&#xff1a;基本框架5G slot分类 5G 频域资源5G频域资源基本概念信道带宽与传输带宽BWP定义及其应用场景 4G 时域定义&#xff1a; 帧&#xff1a;10ms&#xff0c;…

【使用Hystrix实现服务容错和熔断】—— 每天一点小知识

&#x1f4a7; 使用 H y s t r i x 实现服务容错和熔断 \color{#FF1493}{使用Hystrix实现服务容错和熔断} 使用Hystrix实现服务容错和熔断&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390…

SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计

文章目录 环境配置开发工具下载Vue前端模板前端项目启动前端说明及修改修改导航栏自定义菜单与子菜单增加导航标签功能 前端数据格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离项目实战 不想看视频可浏览此文章笔记&#xff0c;比较详细 环境配置…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

青大数据结构【2020】【三分析计算】

关键字&#xff1a; 无相连通图、Prim算法最小生成树、哈希函数、线性探测法、平均查找长度 1.对于一个带权连通无向图G&#xff0c;可以采用Prim算法构造出从某个顶点v出发的最小生成树&#xff0c;问该最小生成树是否一定包含从顶点v到其他所有顶点的最短路径。如果回答是&a…

kafka 报错 - Cannot assign requested address

背景 在华为云服务器上跑了 zookeeper 和 kafka 的 broker&#xff0c;想内外网分流&#xff0c;重点就是做不到从外网去消费&#xff0c;比如用自己的 windows 笔记本去消费。 配置 server.properties 的 listener 为 broker 所在机子的的内网 IP 后&#xff0c;终于能 star…

Vulnhub项目:Aragog

1、靶机地址&#xff1a; HarryPotter: Aragog (1.0.2) ~ VulnHub 死亡圣器三部曲之第一部&#xff0c;Aragog是海格养的蜘蛛的名字&#xff0c; 并且又牵扯到了密室 2、渗透过程 确定靶机ip&#xff0c;攻击机ip&#xff0c;扫描靶机开放端口 只有22&#xff0c;80端口&a…

数学建模常用模型(一):灰色预测法

数学建模常用模型&#xff08;一&#xff09;&#xff1a;灰色预测法 灰色预测法是一种用于处理少量数据、数据质量较差或者缺乏历史数据的预测方法。它适用于一些非线性、非平稳的系统&#xff0c;尤其在短期预测和趋势分析方面有着广泛的应用。灰色预测法作为一种强大的数学…

辅助驾驶功能开发-功能算法篇(3)-ACC-弯道速度辅助

1、功能架构:ACC弯道速度辅助(CSA) 2、CSA功能控制 2.1 要求 2.1.1 CSA ASM:弯道速度辅助 1. 模式管理器:驾驶员应能够激活/关闭功能 应存在处理 CSA 功能的模式管理器。模式管理器由驾驶员输入和系统状态控制。 模式管理器有两个由 CSAStatus 定义的状态。状态转换定义…

RabbitMQ高阶使用消息推送

目录 1 从打车开始说起1.1 需要解决的问题1.2 消息推送 2 消息推送2.1 什么是消息推送2.2 方案介绍2.2.1 ajax短轮询2.2.2 长轮询2.2.3 WebSocket 2.3 WS实现消息推送2.3.1 架构介绍2.3.2 暂存数据2.3.2.1 什么是MongoDB2.3.2.2 插入数据2.3.2.3 查询数据 2.4.1 轮询任务2.4.1.…

软件工程导论期末急救包(上)

目录 什么是软件工程&#xff1f;它的目标和内容是什么&#xff1f; 软件文档作用及包含 软件过程模型 瀑布模型 快速原型模型 增量模型 螺旋模型 喷泉模型 软件生存周期 需求分析阶段的基本任务是什么&#xff1f; 可行性研究的任务是什么&#xff1f; 软件是什…

vue+el-select下拉实现:全选、反选、清空功能

问题描述&#xff1a; el-select下拉框要求实现全选功能。具体功能包括&#xff1a; 当选择【全选】时&#xff0c;所有选项全部被勾选&#xff1b;当选择【反选】时&#xff0c;已选择选项变为未选择选项&#xff0c;未选项变为已选项当选择【清空】时&#xff0c;所有选项变…

带你用Python制作7个程序,让你感受到端午节的快乐

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 前言 程序1&#xff1a;制作粽子 程序2&#xff1a;龙舟比赛 程序3&#xff1a;艾草挂 程序4…

【人脸检测0】视频分解图片与图片合成视频

一,引言 目标:这小节主要通过两个demo熟悉视频分解图片与图片合成视频的OpenCV的应用 环境:python3.6+OpenCV3.3.1 二,示例 Demo1:视频分解图片 目标: 1.指定文件夹中读取视频文件 2.将视频文件分解为图片 3.将图片保存在指定文件夹中 # -*-coding:utf-8-*- #auth…

澳洲学生用ChatGPT代写?澳洲多所高校使用全新反击工具检测

朋友们听句劝 ChatGPT可太危险了 ChatGPT有多火&#xff1f;据2月1日瑞银发布的一项研究报告显示&#xff0c;仅仅发布两个月&#xff0c;ChatGPT月活跃用户已达1亿&#xff0c;这是历史上增长速度最快的应用。要知道达成1亿用户的时间&#xff0c;Instagram用了2.5年&#xf…

合宙Air724UG Cat.1模块硬件设计指南--SDIO接口

SDIO接口 简介 SDIO(Secure Digital Input and Output)全称为安全数字输入输出接口&#xff0c;在协议上和SPI类似是一种串行的硬件接口&#xff0c;通信的双方一个作为HOST&#xff0c;另一端是Device&#xff0c;所有的通信都是由HOST端发送命令开始的&#xff0c;Device端只…