文章目录

  • 目标
  • 代码
    • 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 = valCookie.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){// 记录cookieCookie.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) {// 判断Cookieif (!Cookie.get('menu')) returnconst menu = JSON.parse(Cookie.get('menu'))state.menu = menuconst 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中对应的itemcloseTag(state, item) {// 要删除的是state.tabList中的itemconst index = state.tabList.findIndex(val => val.name === item.name)state.tabList.splice(index, 1)},// 设置不同用户的菜单setMenu(state, val) {state.menu = valCookie.set('menu', JSON.stringify(val))},// 动态添加路由addMenu(state, router) {// 判断Cookieif (!Cookie.get('menu')) returnconst menu = JSON.parse(Cookie.get('menu'))state.menu = menuconst 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)})}}
}

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

  1. 【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Table表格增删查改、Pagination分页、搜索框

    文章目录 目标 代码 0.结构 1.按钮-删除 2.按钮-编辑 3.debug 4.样式 5.分页Pagination:功能 6.分页Pagination:样式 7.搜索框:功能 8.搜索框:样式 总 ...

  2. 【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Form表单填写、Dialog对话框弹出

    文章目录 目标 代码 0.页面结构 1.新增按钮和弹出表单:结构 2.新增按钮和弹出表单:点击新增弹出表单 3.表单样式 4.表单验证 5.表单的提交和取消功能:接口.mock相关准备 6.表单的提交 ...

  3. 【前端】Vue+Element UI案例:通用后台管理系统-代码总结(已开源)

    文章目录 前言 项目文件目录 api mockServe home.js permission.js index.js mock.js user.js assert components Common ...

  4. 一步步教你如何用疯狂.NET架构中的通用权限系统 -- 如何控制用户显示的菜单权限...

    菜单权限是我们经常会遇到的权限,也是经常需要进行处理的权限,往往权限是通过控制菜单权限开始折腾起来的. 第一步:我的后台管理控制端,有一个叫模块配置的功能,这里集中配置,哪些模块可以用,哪些模块先锁定 ...

  5. 17. 基于Vue+Element+nodeJs+Express+MySql后台管理系统-前端主页面

    这期开始主页面的编写,在src\views目录下创建主页面Home.vue,主要是管理系统页面布局,头部和左侧导航栏. 一.Home.vue 页面 1.1 Home.vue 页面html部分: < ...

  6. html全局布局 vue_基于Vue+Element的电商后台管理系统

    前言 mall项目后台管理系统的前端项目. 项目介绍 mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现. 主要包括商品管理.订单管理.会员管理.促销管理.运 ...

  7. 用vue(element ui)快速开发后台管理

    平时我们在用vue开发网站后台管理的时候.比如说要写管理文章的功能,要先去写列表页面,编辑页面,添加页面.另外还需要程序提供对应的增删改查接口 图片上传接口等等,那么有没有一种快速的方法.可以用程序来 ...

  8. web前端-Vue element UI中的el-table勾选框 展示隐藏;设置默认勾选、禁用

    1.el-table如果我们想新增一个勾选框,在  .vue文件中 <el-table-column type="selection" width="55" ...

  9. web前端-vue element UI el-table,el-table-column表格添加行点击事件

    el-table如下数据 一.el-table 整行都可以点击事件 定义点击事件 @row-click="openDetails":openDetails为方法名 <!-- ...

最新文章

  1. 软件测试面试题-如何测试复制粘贴功能
  2. JQuery 获取自身的HTml代码
  3. .NET FrameWork 4.0 新特性
  4. Brilliant Programmers Show
  5. 纯c gSoap实现WebService
  6. mysql数据库元表_mysql中元数据库information_schema学习之TABLES表
  7. Redis vs Tendis:冷热混合存储版架构揭秘
  8. git配置全局用户名和密码_还在手动打包,手动传jar包?那你确实应该学一下jekins配置了...
  9. xos详解5:PendSV_Handler
  10. 【文文殿下】APIO2019游记
  11. 操作系统实验报告(四)文件系统
  12. Eclipse创建带JavaBean的JSP程序
  13. 安卓逆向 | 某新闻类APP urlSign
  14. Collecting package metadata (current_repodata.json)解决方法
  15. uniapp开发微信小程序教程(一)
  16. 163邮箱格式 ,个人邮箱的正确格式
  17. win10配置免密登录linux(centos7)
  18. 关于Android短信拦截(二)
  19. 电子测量-不同电压波形对不同检波特性电压表的影响分析
  20. 吴恩达 02.改善深层神经网络:超参数调试、正则化以及优化 第一周作业

热门文章

  1. 深度优先算法和广度优先算法
  2. 新入门的游戏贴图师,你不知道的MAYA,贴图细节
  3. 服务器硬盘怎么用到台机上,怎样在台机上使用服务器硬盘,scsi80针 爱问知识人...
  4. 2019上半年网络工程师下午真题及答案解析
  5. 高等数学(第七版)同济大学 习题10-2(后7题) 个人解答
  6. django数据库版分页实现
  7. 苹果如何分屏_高德百度哪家强?苹果Carplay第三方分屏功能评测
  8. 速览Visual Studio 2022 中的新增功能
  9. U盘问题,插入时只有声音,没有显示,在”计算机管理”的“磁盘管理”中,上面看不到盘符”H:”,下面可以看到”磁盘1 可移动无媒
  10. 这个明星最爱的奢侈品旅行箱,如何在天猫618增长5000%?