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

news/2024/11/15 1:45:49/

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

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/pagecomponent: () => 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中获取tokenconst 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 > 0if (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 barNProgress.done()
})

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

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

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

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

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

在这里插入图片描述


http://www.ppmy.cn/news/361553.html

相关文章

结合模板匹配与测量的剃须刀缺陷检测

模板匹配与测量 原图模板图检测图 代码结果 原图 模板图 检测图 代码 * ------------------------------------------------------------------------------------------------ *此示例程序使用基于形状的匹配来对齐度量的roi *工具,然后检查单个刀片。*该程序有两…

Linux系统下安装Kubernetes(超详细。。。)

一、安装Kubernetes前的准备 1.1 准备Hosts文件 &#xff08;注意&#xff0c;请根据Linux虚拟机的IP地址&#xff0c;修改以下命令后再执行&#xff09; cat >>/etc/hosts<<EOF 192.168.100.146 deploy EOF 1.2 检查虚拟机的hostname cat /etc/hostname验证…

python写入excel,(二) 言简意赅傻瓜式写法

xlrd限制条数&#xff0c;openpyxl 上限较高&#xff0c;所以推荐这种写法 import openpyxl # openpyxl引入模块 def write_to_excel(path: str, sheetStr, info, data): # 实例化一个workbook对象 workbook openpyxl.Workbook() # 激活一个sheet …

Linux从大文件中截取指定范围的内容到文件中

在实际开发与维护中&#xff0c;可能会遇到需要从好几个G大的文本文件中获取包含指定文本的内容&#xff0c; 例如&#xff0c;需要从某天的系统日志文件里获取指定时间范围的日志&#xff0c;而这个日志文件有几个个G,在Windows中用文本编辑器打开会出现内存不足的情况&#…

领域建模之数据模型设计方法论 | 京东云技术团队

本文通过实际业务需求场景建模案例&#xff0c;为读者提供一种业务模型向数据模型设计的方法论&#xff0c;用于指导实际开发中如何进行业务模型向数据模型转化抽象&#xff0c;并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章&#xff0c;读者可以收获到业务模型…

IT安全解决方案保护企业网络安全

全球每年报告数以万计的网络安全事件&#xff0c;云解决方案和远程工作的大规模采用意味着大多数组织的攻击面呈指数级增长。采用正确的网络安全解决方案是保护企业免受这些攻击的唯一方法。使用正确IT安全解决方案企业网络安全。 IT安全解决方案 ManageEngine IT安全解决方案…

JVM 调优分析 如何进行JVM调优

文章目录 1.为什么需要进行JVM调优&#xff1f;2.什么情况下可能需要JVM调优3.JVM调优参数4.JVM调优参数设置参考5.JVM内部结构1. 类加载器&#xff08;Class Loader&#xff09;2. 运行时数据区&#xff08;Runtime Data Area&#xff09;3. 垃圾收集器&#xff08;Garbage Co…

java常用api篇【更新中】

13-常用api Math abs&#xff0c;绝对值ceil&#xff0c;向上取整floor&#xff0c;向下取整round&#xff0c;四舍五入max&#xff0c;获取两个int中的较大值min&#xff0c;获取两个int中的较小值random&#xff0c;返回值为double的随机数sqrt&#xff0c;开平方根cqrt&am…