【前端】Vue+Element UI案例:通用后台管理系统-登陆不同用户显示不同菜单、动态添加路由

news2025/7/18 8:19:33

文章目录

    • 目标
    • 代码
      • 0.动态地显示菜单:store
      • 1.动态注册路由
      • 2.解决刷新后摆平问题
    • 总代码
      • 本篇修改的代码文件
      • tab.js

参考视频: VUE项目,VUE项目实战,vue后台管理系统,前端面试,前端面试项目

案例链接
【前端】Vue+Element UI案例:通用后台管理系统-导航栏(视频p1-16)https://blog.csdn.net/karshey/article/details/127640658
【前端】Vue+Element UI案例:通用后台管理系统-Header+导航栏折叠(p17-19)https://blog.csdn.net/karshey/article/details/127652862
【前端】Vue+Element UI案例:通用后台管理系统-Home组件:卡片、表格(p20-22)https://blog.csdn.net/karshey/article/details/127674643
【前端】Vue+Element UI案例:通用后台管理系统-Echarts图表准备:axios封装、mock数据模拟实战(p23-25)https://blog.csdn.net/karshey/article/details/127735159
【前端】Vue+Element UI案例:通用后台管理系统-Echarts图表:折线图、柱状图、饼状图(p27-30)https://blog.csdn.net/karshey/article/details/127737979
【前端】Vue+Element UI案例:通用后台管理系统-面包屑、tag栏(p31-35)https://blog.csdn.net/karshey/article/details/127756733
【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Form表单填写、Dialog对话框弹出(p36-38)https://blog.csdn.net/karshey/article/details/127787418
【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Table表格增删查改、Pagination分页、搜索框(p39-42)https://blog.csdn.net/karshey/article/details/127777962
【前端】Vue+Element UI案例:通用后台管理系统-登陆页面Login(p44)https://blog.csdn.net/karshey/article/details/127795302
【前端】Vue+Element UI案例:通用后台管理系统-登陆页面功能:登录权限跳转、路由守卫、退出(p45-46)https://blog.csdn.net/karshey/article/details/127849502
【前端】Vue+Element UI案例:通用后台管理系统-登陆不同用户显示不同菜单、动态添加路由(p47-48)https://blog.csdn.net/karshey/article/details/127865621
【前端】Vue+Element UI案例:通用后台管理系统-项目总结https://blog.csdn.net/karshey/article/details/127867638

目标

  • 不同用户登录后显示的菜单和能访问的页面不同
  • 动态添加路由

代码

0.动态地显示菜单:store

菜单的显示在CommonAside.vue中,而不同用户登陆后会显示哪些菜单在permission.js里。因此,我们可以把permission.js里要显示的menu写在store中,CommonAside.vue只需要获取store的数据即可。

在store的tab.js中:注意,要把菜单信息用cookie存起来,否则刷新后menu的信息就清空了。

export default {
    state: {
        menu: [],//不同用户的菜单
    },
    mutations: {
        // 设置不同用户的菜单
        setMenu(state, val) {
            state.menu = val
            Cookie.set('menu', JSON.stringify(val))
        }
    }
}

在Login.vue的submit函数中:在登录时commit

submit() {
    // 表单的校验
    this.$refs.form.validate((valid) => {
        if (valid) {
            // 传入表单数据
            getMenu(this.login).then((data) => {
                console.log(data);
                if(data.data.code===20000){
                    // 记录cookie
                    Cookie.set('token',data.data.data.token)
                    // 设置菜单
                    this.$store.commit('setMenu',data.data.data.menu)
                    // 跳转到首页
                    this.$router.push('/home')
                }else{
                    // 验证失败的弹窗
                    this.$message.error(data.data.data.message);
                }
            })
        }
    })
}

在CommonAside中显示菜单:在computed中

// 获取菜单
MenuData() {
    return JSON.parse(cookie.get('menu')) || this.$store.state.tab.menu
}

效果:
以用户

username:xiaoxiao
password:xiaoxiao

登陆后,菜单发生了变化。
在这里插入图片描述

1.动态注册路由

我们在以xiaoxiao登陆后,在url处访问user,结果是可以访问。
原因是:我们在router处把路由写死了:

const routes = [
    // 主路由
    {
        path: '/',
        component: Main,
        redirect: '/home', // 重定向
        children: [
            // 子路由
            { path: '/home', name: 'home', component: Home }, // 首页
            { path: '/user', name: 'user', component: User }, // 用户管理
            { path: '/mall', name: 'mall', component: Mall }, // 商品管理
            { path: '/page1', name: 'page1', component: PageOne }, // 页面1
            { path: '/page2', name: 'page2', component: PageTwo }, // 页面2
        ]
    },
    {
        path: '/login',
        name: 'login',
        component: Login
    }
]

实际上,xiaoxiao只能访问“首页”和“商品管理”这两个路由。于是我们需要动态地添加路由。

在store的mutation处:addMenu,动态地添加路由:

// 动态添加路由
addMenu(state, router) {
    // 判断Cookie
    if (!Cookie.get('menu')) return
    const menu = JSON.parse(Cookie.get('menu'))
    state.menu = menu

    const menuArray=[]

    // 组装路由
    menu.forEach(item => {
        // 判断是否有子路由
        if (item.children) {
            item.children = item.children.map(itemm => {
                itemm.component = () => import(`../Views/${itemm.url}`)
                return itemm
            })
            menuArray.push(...item.children)
        } else {
            item.component=()=>import(`../Views/${item.url}`)
            menuArray.push(item)
        }
    });

    menuArray.forEach(item=>{
        router.addRoute('Main',item)
    })
}

在Login处commit:

// 动态添加路由
this.$store.commit('addMenu',this.$router)

注意要把router中写死的子路由注释掉。

效果:在登录xiaoxiao时访问user是访问不了的。

2.解决刷新后摆平问题

我们在登录之后刷新页面,会白屏,原因是:我们只在Login登陆处添加了路由。而vue页面在刷新后会重新渲染,此时就没有路由的代码了。

解决方法:在vue的created生命周期时就进行动态添加路由。

new Vue({
  router,
  store,
  render: h => h(App),
  created() {
    store.commit('addMenu', router)
  }
}).$mount('#app')

效果:刷新后也能显示页面了。

总代码

本篇修改的代码文件

  • CommonAside:显示菜单MenuData,获取store的tab中的menu
  • router的index:注释掉子路由
  • store的tab:添加mutation的方法:设置菜单和动态添加路由;添加menu
  • Login:submit时commit在tab中新加的mutation方法
  • main.js:在created生命周期时就动态添加路由

在这里插入图片描述

tab.js

import Cookie from "js-cookie"

export default {
    state: {
        isCollapse: false,//导航栏是否折叠
        tabList: [
            {
                path: '/',
                name: 'home',
                label: '首页',
                icon: 's-home',
                url: 'Home/Home'
            }
        ],//面包屑的数据:点了哪个路由,首页是一定有的
        menu: [],//不同用户的菜单
    },
    mutations: {
        // 修改导航栏展开和收起的方法
        CollapseMenu(state) {
            state.isCollapse = !state.isCollapse
        },
        // 更新面包屑的数据
        SelectMenu(state, item) {
            // 如果点击的不在面包屑数据中,则添加
            const index = state.tabList.findIndex(val => val.name === item.name)
            if (index === -1) {
                state.tabList.push(item)
            }
        },
        // 删除tag:删除tabList中对应的item
        closeTag(state, item) {
            // 要删除的是state.tabList中的item
            const index = state.tabList.findIndex(val => val.name === item.name)
            state.tabList.splice(index, 1)
        },
        // 设置不同用户的菜单
        setMenu(state, val) {
            state.menu = val
            Cookie.set('menu', JSON.stringify(val))
        },
        // 动态添加路由
        addMenu(state, router) {
            // 判断Cookie
            if (!Cookie.get('menu')) return
            const menu = JSON.parse(Cookie.get('menu'))
            state.menu = menu

            const menuArray = []

            // 组装路由
            menu.forEach(item => {
                // 判断是否有子路由
                if (item.children) {
                    item.children = item.children.map(itemm => {
                        itemm.component = () => import(`../Views/${itemm.url}`)
                        return itemm
                    })
                    menuArray.push(...item.children)
                } else {
                    item.component = () => import(`../Views/${item.url}`)
                    menuArray.push(item)
                }
            });

            console.log(menuArray, 'menuArray');

            menuArray.forEach(item => {
                router.addRoute('Main', item)
            })
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring-IOC理论推导P3

1.新建一个项目。名字叫做spring-study 2.导包 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version></dependency></dependencies&…

solr-7.7.3 搭建

solr-7.7.3 搭建 solr-7.7.3 搭建 文章目录solr-7.7.3 搭建一、前期准备安裝规划(一)资料下载(二)上传文件二、安裝(一)创建新用户(二)安装solr1.solr安装包解压到/opt/module2.将解压文件名修改为solr3.修改配置文件(三)分发文件&#xff08;四&#xff09;开启solr&#xff…

YOLOv5量化调优

目录 一、背景 二、模型调优 2.1 基准选取 2.1.1 官方精度数据 2.1.2 fp32bmodel的精度 2.1.3 int8bmodel精度数据 2.2 多图量化 2.3 预处理对齐&lmdb 2.4 网络图优化 2.4.1 per_channel优化 2.4.2 accuracy_opt优化 2.4.3 conv_group优化 2.4.4 总结 2.5 混…

python中使用xlrd、xlwt操作excel表格详解

最近遇到一个情景&#xff0c;就是定期生成并发送服务器使用情况报表&#xff0c;按照不同维度统计&#xff0c;涉及python对excel的操作&#xff0c;上网搜罗了一番&#xff0c;大多大同小异&#xff0c;而且不太能满足需求&#xff0c;不过经过一番对源码的"研究"&…

移动电源出口美国和欧盟需要做什么?

手机的普遍使用也带动了充电宝的发展&#xff0c;现在是智能的时代&#xff0c;手机现在是我们每个人永远不会忘记带的东西&#xff0c;当然耗电量也是很大的。所以充电宝在这时就有很大的用处了。移动电源是一种集供电和充电功能于一体的便携式充电器&#xff0c;一般由锂离子…

杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

目录 一、简介 关于杰理芯片的key文件&#xff0c;实际上 杰理芯片特有的一种机制&#xff0c;而这种机制就是存在于杰理芯片特有的架构&#xff0c;也是杰理公司延续将近10年的特点&#xff0c;估计以后也会是这种机制。具体为什么&#xff0c;请听我娓娓道来&#xff0c;这里…

测试大咖漫谈如何搞定软件质量?

关于质量保障&#xff0c;好像已经说过太多&#xff0c;但这里还是抽象的唠叨几句。 多年的软件测试和质量保障工作让我越来越清晰的认识到&#xff1a;质量绝对不是一个环节&#xff0c;一个工种可以搞定的。比如&#xff1a; 从对语言的误用&#xff0c;到对第三方组件的误用…

第4关: 网页排序——PageRank算法

要求&#xff1a;编写实现网页数据集PageRank算法的程序&#xff0c;对网页数据集进行处理得到网页权重排序。 ####相关知识 ######PageRank算法原理 1.基本思想&#xff1a; 如果网页T存在一个指向网页A的连接&#xff0c;则表明T的所有者认为A比较重要&#xff0c;从而把T的一…

【Shell】入门Shell(基本变量、环境变量、特殊变量)

Shell脚本一、Shell脚本的执行方式1.脚本格式要求2. 编写第一个Shell脚本3.Shell脚本的常用执行方式二、Shell的变量1.Shell变量介绍2. Shell变量的定义a. 基本语法b. 快速入门(三案例)2. Shell变量的定义a. 定义变量的规则b. 将命令的返回值赋给变量三、Shell多行注释1. 用 :&…

成本优化之使用P2P的方案的需要了解的本地SDK的背后的原理

文章目录一. P2P的SDK到底做了什么二. P2P原理1. 同流分享思路2. 目前方案三. 使用P2P后产生的问题1. 有概率出现loading转菊花2. 首次打开速度明显慢于正常的通道1-2秒参考文章一. P2P的SDK到底做了什么 P2P的SDK在我们App启动后其实是开启了一个服务&#xff0c;固定端口去监…

刷题日记【第十一篇】-笔试必刷题【小易的升级之路+找出字符串中第一个只出现一次的字符+微信红包+计算字符串的编辑距离】

1.计算字符串的编辑距离【动态规划编程题】 import java.util.Scanner; import java.io.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String args[]) throws Exception{BufferedReader reader new BufferedReader(n…

【RuoYi-Vue-Plus】扩展笔记 07 - CentOS 7 集成 Prometheus + Grafana 监控初体验

文章目录前言参考目录官方文档博客参考相关书目操作步骤1、Prometheus1.1、安装 Prometheus1.2、配置 Prometheus1.3、访问控制台2、Grafana2.1、安装 Grafana2.2、访问控制台3、Grafana 大屏配置3.1、添加 Prometheus 数据源3.2、导入 dashboards 仪表板3.3、配置 node_export…

你安全吗?丨沉默的“复仇”到底是什么东西?

作者&#xff1a;黑蛋 在电视剧《你安全吗&#xff1f;》第七集中&#xff0c;因为周游的死缠烂打&#xff0c;秦淮第一次提起了他和陈默以前的事情&#xff0c;也给出了之前虎迫公司开除陈默的原因&#xff1a;陈默妈妈被诈骗团伙骗掉所有积蓄&#xff0c;又因为此事走神出了…

【附源码】计算机毕业设计JAVA计算机专业在线学习评估软件-演示录像-

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

Java抽象类

什么是抽象类&#xff1f; 如果一个类不能够表示一个准确的对象&#xff0c;则使用abstract修饰&#xff0c;表示为抽象类&#xff0c;抽象类就是为了被继承。抽象类使用abstract修饰 abstract class Animal {abstract public void eat(); }抽象类不能被实例化 public static …

第四节.常用Linux命令—文件内容查询

第四节.常用Linux命令—文件内容查询 1.查看目录内容&#xff1a;cat,more,grep 序号命令作用01cat 文件名查看文件内容&#xff0c;more创建文件&#xff0c;合并文件&#xff0c;追加文件内容等02more 文件名分屏显示文本内容03grep 搜索文本文件名搜索文本文件内容(模式查找…

快速入门Servlet

前导 1、web概述 1.1、Web与JavaWeb的概念 Web&#xff1a;全球广域网 &#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站 JavaWeb&#xff1a;是用Java技术来解决相关web互联网领域的技术栈 1.2、JavaWeb技术栈 了解JavaWeb技术栈之前&#xf…

面试官:说说React-SSR的原理

前言 所谓同构&#xff0c;简而言之就是&#xff0c;第一次访问后台服务时&#xff0c;后台直接把前端要显示的界面全部返回&#xff0c;而不是像 SPA 项目只渲染一个 <div id"root"></div> 剩下的都是靠 JavaScript 脚本去加载。这样一来可以大大减少首…

SpringMVC之通过最简单的方法实现多文件上传(提供一种模板,可以在这种方法的基础上进行各种的改良)

上一篇博客主要介绍的SpringMVC中单文件进行上传的两种方法单文件上传的两种方法 单文件上传的方法我们解决了&#xff0c;那如何如何实现多文件进行上传输出呢&#xff1f; 这篇文章主要实现的方法就是通过数组的方法来实现多文件的上传 注意本篇文章的大部分内容与上一篇文章…

2022年11月华南师范大学计算机信息管理-专科-计算机信息管理课程实验(一)

《 计算机信息管理课程实验&#xff08;一&#xff09; 》课程试卷 试卷提交说明&#xff1a; 提交对应于三个题目的三个文档&#xff0c;请把三个文档放到一个文件夹&#xff0c;文档命名规则为题目号&#xff0c;文件夹命名为&#xff1a;“序号姓名课程名”。 此试卷总分…