vue-element-admin项目学习笔记(4)路由分析二:动态路由及permission.js

news2024/11/18 17:29:35

路由模块非常重要,自己基于这个框架进行开发,这个必须吃透!!
前情回顾:

vue-element-admin项目学习笔记(1)安装、配置、启动项目
vue-element-admin项目学习笔记(2)main.js
文件分析
vue-element-admin项目学习笔记(3)路由分析一:静态路由

如果对vue路由部分还不是很熟悉的小伙伴,建议可以先去了解一下,或者看一下我的这两篇笔记:

Vue路由简明实操笔记
vue路由守卫简明操作笔记

开始~~
文件:项目目录/src/router/index.js

1、动态路由分析

项目目录/src/router/index.js文件里,代码export const asyncRoutes开始的部分的整个结构体,就是动态路由部分。

  • 这部分定义的asyncRoutes,就是动态路由,用户可用路由条数,是计算出来的
  • 然后将计算出来的当前用户路由,渲染到菜单栏上
  • permission.js进行鉴权计算的,在main.js中引用了的
  • 权限:页面级、路由器权限:不同权限的用户,登录进来,看到的侧边栏是不一样的、不同页面
  • 区分用户可访问的范围

// 这部分定义的asyncRoutes,就是动态路由,用户可用路由条数,是计算出来的
// 然后将计算出来的当前用户路由,渲染到菜单栏上
// permission.js进行鉴权计算的,在main.js中引用了的
// 权限:页面级、路由器权限:不同权限的用户,登录进来,看到的侧边栏是不一样的、不同页面
// 区分用户可访问的范围
export const asyncRoutes = [
  {
    path: '/permission',//访问路径
    component: Layout,//放置一个layout组件
    redirect: '/permission/page',// 重定向到了自己的二级路由,在下面有配置
    alwaysShow: true, // 在根菜单中显示
    name: 'Permission',
    meta: {   //路由元信息
      title: 'permission',//菜单中标题
      icon: 'lock',//菜单中图标
      // 权限就是靠roles区分的 
      //本项目就两个角色:admin、editor,可根据自己实际调整
      roles: ['admin', 'editor'] // 可见的角色,数组
    },
    children: [
      {
        //二级路由的path不要带‘/’
        path: 'page',//二级路由路径,完整:/permission/page
        component: () => import('@/views/permission/page'),//对应组件
        name: 'PagePermission',//路由名字
        meta: {
          title: 'pagePermission',//标题
          roles: ['admin'] // 可访问、可见的角色
        }
      },
      {
        path: 'directive',
        component: () => import('@/views/permission/directive'),
        name: 'DirectivePermission',
        meta: {
          title: 'directivePermission'
          // 二级路由权限,必须大于等于一级路由权限
          // 如:一级路由admin可访问、二级设置editor可访问
          // edtior根本没有机会看到二级
          // 如果不设置角色roles,则表示:此页面不需要权限校验
        }
      },
      {
        path: 'role',
        component: () => import('@/views/permission/role'),
        name: 'RolePermission',
        meta: {
          title: 'rolePermission',
          roles: ['admin']
        }
      }
    ]
  },

  {
    path: '/icon',
    component: Layout,
    children: [
      {
        path: 'index',
        component: () => import('@/views/icons/index'),
        name: 'Icons',
        meta: { title: 'icons', icon: 'icon', noCache: true }
      }
    ]
  },

2、permission.js鉴权逻辑分析

项目目录/src/permission.js文件里
该文件详细处理了鉴权过程的全部逻辑,非常重要
先看看流程图:
在这里插入图片描述
对比流程图,看代码分析

// 引入vue
import router from './router'
// 引入vuex仓库
import store from './store'
// 引入element-ui的提示组件
import { Message } from 'element-ui'
// 引入进度条、进度条风格
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
// 引入从cookie中获取 Token工具,登录后,token在cookie中
import { getToken } from '@/utils/auth' 
//  引入从 获取title工具,用于切换的时候,titile变化
import getPageTitle from '@/utils/get-page-title'
// 配置进度条
NProgress.configure({ showSpinner: false }) 
// 配置白名单:登录页面(不需要登录即可访问)
const whiteList = ['/login', '/auth-redirect'] 
// 全局前置路由守卫,核心逻辑都在守卫中
router.beforeEach(async(to, from, next) => {
  // 开始进度条
  NProgress.start()

  //设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 从cookie中获取token
  const hasToken = getToken()
  // 如果有token 说明已经登录了
  if (hasToken) {
    if (to.path === '/login') {
      // 如果已经登录,又访问了登录页
      next({ path: '/' })//定向放行到后台首页面
      NProgress.done() //进度条结束
    } else {//你登录了,你去的除了登录页之外的页面
      // 在vuex中的仓库store中看你的权限(存在,且不为空)
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      if (hasRoles) { //权限roles存在,且不为空
        next()   //放行
      } else { //如果没有角色信息,比如刷新了浏览器
        try {
           //用vuex发起获取用户信息请求
          const { roles } = await store.dispatch('user/getInfo')

          // 用获取到的用户信息中的权限,传入VUEX方法,生成路由规则
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          // console.log("accessRoutes",accessRoutes)
          // 将生成的当前用户的路由规则,添加到路由器,addRoutes方法,在user.js中
          router.addRoutes(accessRoutes)

          // 放行
          next({ ...to, replace: true })
        } catch (error) {
          // 获取权限过程异常,就清除登录状态
          await store.dispatch('user/resetToken')
          // 提示错误
          Message.error(error || 'Has Error')
          // 跳转到登录页面
          next(`/login?redirect=${to.path}`)
          NProgress.done()//进度条结束
        }
      }
    }
  } else {//如果没有token
     
      // 你访问的路径是不是白名单路径
    if (whiteList.indexOf(to.path) !== -1) {
      // 是白名单,就放行
      next()
    } else {
      // 如果不在白名单,就跳转登录页
      next(`/login?redirect=${to.path}`)
      NProgress.done()//进度条结束
    }
  }
})
// 全局后置路由守卫,就干了一件事,结束进度条
router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})


根据 获取到的用户信息中的权限,传入VUEX方法,生成路由规则,打印结果:
在这里插入图片描述

点击登录,发了两次请求:
在这里插入图片描述

第一次:先发登录请求,校验用户名密码,成功的话,返回token

在这里插入图片描述
在这里插入图片描述

第二次:用token,获取用户信息(权限、用户名、头像等等)

在这里插入图片描述

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

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

相关文章

改KendoReactUI组件,实现多个子元素的样式不一样

before after 问题描述 使用KendoReact RadioButton 组件,当用户选中当前项时需要显示不同颜色,试图通过找到KendoUI中对应的class name,然后修改这个class name下面的css来达到目的,但不起作用解决办法 用js控制style核心代码 …

华为OD机试之查找众数及中位数(Java源码)

查找众数及中位数 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶…

从0开始搭建react项目(函数组件)

目录 项目搭建步骤 本地开发环境 脚手架构建项目 关联Git仓库 strictMode 严格模式 路由配置 路由传参 路由守卫 数据绑定 生命周期 父子组件通信 redux持久化 安装Sass 安装postcss-pxtorem(移动端项目) 安装axios 环境变量 本地代理 …

直播预告:CoremailHVV经验分享与重保整体解决方案发布

面对更具有目的性、针对性的网络攻击压力,重保既是抵抗攻击的重要举措,也是数字经济时代下企业发展的刚需。 正值重保期,企业在面对多样化的攻击手段、持续化的攻击行为、剧增化的攻击危害,应该如何应对重保大考? 6月1…

供应链安全

供应链安全 目录 文章目录 供应链安全目录本节实战可信任软件供应链概述构建镜像Dockerfile文件优化镜像漏洞扫描工具:Trivy检查YAML文件安全配置:kubesec准入控制器: Admission Webhook准入控制器: ImagePolicyWebhook关于我最后…

openpnp - 底部相机支架的制作

文章目录 openpnp - 底部相机支架的制作概述END openpnp - 底部相机支架的制作 概述 前几天总结了底部相机校验通不过的原因(openpnp - 底部相机矫正(subject not found)的原因总结), 并且可以校验通过了. 好景不长, 在校验通过的第三天(中间再穿插做其他事情), 从头做了一次…

【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)

由于一些不规范的输入,或是其它数据转换而来,要素类或者独立表的字段值经常含有空值、空格等影响数据质量的内容。 这个工具的目的就是清理、转换这些字段内容,提高数据质量。 一、要实现的功能 如上图所示,点击【清洗字段值】按…

springboot+vue+java仓库管理系统_0r36w

部门管理员: 申购入库:发起申购,进行入库申请。 调拨申请:发起资产调拨的申请以及查看申请的详情信息。 出库管理:查看调拨的详情信息,可以进行资产的申请报废以及申请维修。 资产报废查询:查看…

薛定谔maestro 安装

【1】先删除之前不能用的文件包 【2】tar -xvf 解压包 进行解压 【3】cd 解压出来的文件下 【4】sudo ./INSTALL 【也可以不用sudo,我的电脑不知道上面问题,需要用sudo,否则在之后创建生成文件夹的时候没有权限】 【5】根据操作一步一步…

电子行业 K 公司对接 Nexperia EDI 项目案例

项目背景 Nexperia 是一家全球领先的半导体制造商,专注于提供高性能、高可靠性和创新性的半导体解决方案。公司成立于2017年,是前飞思卡尔半导体业务的一部分,并在全球范围内拥有多个设计、研发和生产基地。 Nexperia 使用 EDI(…

【VMware】虚拟机安装centos7

目录 一、创建虚拟机 1、自定义 2、选择需要安装的操作系统 3、选择虚拟机安装位置 4、选择处理器配置(可先默认) 5、设置虚拟内存(一般4096) 6、选择网络连接方式 7、选择I/O控制器 8、选择磁盘类型 9、选择磁盘 10、指定磁盘容…

真刑!几行代码端了整个教务系统。。

今天给大家伙分享一个网络安全的案例,程序员和网安同学都可以看看, 前言:本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担 漏洞成因 事…

佩戴舒适的蓝牙耳机哪款比较好用?佩戴舒适度最好的蓝牙耳机推荐

​关于蓝牙耳机佩戴舒适度及音质表现的问题,经常有很多小伙伴在问,或许大家更习惯用价格去界定一个蓝牙耳机的定位。本篇文章主要给大家介绍哪款蓝牙耳机比较好用,很值得入手的蓝牙耳机,一起来看看吧。 一、南卡OE蓝牙耳机&#…

知识小结——HTTP协议相关

目录 TCP/IP URI / URL HTTPS 总结时间: TCP/IP协议簇 对TCP的理解 对UDP的理解 HTTP(超文本传输协议)是什么? HTTPS(安全超文本传输协议)是什么? HTTPS的特点: HTTPS协议…

【Linux】linux下使用命令修改jar包内某一个文件中的内容并重新运行jar程序

linux下使用命令修改jar包内某一个文件中的内容并重新运行jar程序 一、背景描述二、vi命令编辑三、启动程序四、拓展--启动脚本 一、背景描述 需求:发现线上的 iotp-irsb-server-v1.0.0.2.jar 包中配置文件的日志级别配置错误,需要在线修改jar包中文件的…

99.实战网页构建定价部分-第二节

上节课我们完成的定价页面是这样的 上节课我们完成的定价页面是这样的 ● 首先我们先给卡片加上背景颜色 .princing-plan {background-color: #fdf2e9;border-radius: 11px;padding: 4.8rem; }● 之后我们调整下框子的大小和位置 ● 接着我们给基础价格再调价一项&#x…

低代码开发平台介绍

低代码开发平台近两年发展迅猛,并迅速渗透到各个细分领域。本文简要介绍低代码开发的概念以及特性,并结合低代码开发的应用场景介绍两个低代码开发平台。 1、低代码开发概念 1.1 低代码开发介绍 低代码开发(Low-code Development&#xff0…

SQL调优:让Java内存分担计算

作者: 剽悍一小兔 CSDN前端优质创作者,打破编程小说次元壁第一人《JavaScript百炼成仙》作者,专注Java硬核干货分享,分享创造快乐,技术成就梦想! 我们在工作中,经常会因为一条慢sql调半天。这一节&#xff…

无线蓝牙耳机什么牌子好?八大真无线蓝牙耳机排名

蓝牙耳机作为当前热门的数码产品,无论何时都能用上,蓝牙耳机的快速发展逐渐的取代有线耳机,摆脱线条的束缚,更方便携带。当然,随着蓝牙耳机的设计各种各样,导致很多的小伙伴在选购耳机的时候,不…

简易协程工具【Wait! - Easy Coroutines】

Wait! - Easy Coroutines | Utilities Tools | Unity Asset StoreUse the Wait! - Easy Coroutines from Iterant Games on your next project. Find this utility tool & more on the Unity Asset Store.https://prf.hn/l/b3AQw5a 1、概述 Wait - Easy Coroutines&#…