管理系统权限分析以及白屏处理

news2025/2/25 21:11:52

菜单权限的业务分析

超级管理员:首页、权限模块、商品模块

不同角色能看到的菜单是不一样的。

如何实现菜单的权限

登录时向服务器发请求,服务器会把用户相应的菜单的权限信息,返回给前端,可以根据服务器返回的数据,动态的设置路由,可以根据不同的用户展示不同的菜单。

在这里插入图片描述

获取用户信息时,返回的数据为上图

用户名name 用户头像avatar

routes返回的标志:不同用户应该展示哪些菜单的标记

roles用户角色信息 buttons按钮信息,按钮权限标记

在Vuex中存储这些数据。

实现

当用户获取用户信息的时候,服务器会把相应的用户拥有菜单权限的信息返回,需要用户身份对比出,当前这个用户需要展示哪些信息。

1.将路由进行拆分

常量路由:不管用户是什么角色都可以看到《登录、首页、404》

export const constantRoutes = [
  // 首页
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: '首页', icon: 'dashboard' }
    }]
  },
  ····
  ]

异步路由:

export const asyncRoutes = [
	//权限
	
]

任意路由

当路径出现错误的时候重定向404

anyRoutes=[]

2.在登录存储token和获取用户请求的vuex中

1、定义state中的数据

token: getToken(),
    name: '',
    avatar: '',
    routes:[],
    buttons:[],
    roles:[],
    // 对比之后,项目中已有的异步路由,与服务器返回的标记信息进行对比最终需要展示的路由
    resultAsyncRoutes:[],
    // 最终需要展示的全部路由
    resultAllRoutes:[]

2、定义一个函数

在actions中使用commit向mutations传递

传递什么?传递的是已经计算出来当前用户给予的权限路由(数组)

当然我们现在还没有计算出来

 commit('SET_RESULTASYNCROUTES',computedAsyncRoutes(asyncRoutes,data.routes))

需要单独写一个函数computedAsyncRoutes来计算:

asyncRoutes是从router中拿来的所有异步路由

data.routes是服务器返回的当前用户的权限路由

我们需要将两者进行对比过滤,将需要的保留下来,与常量路由和任意路由合并,从而形成一个用户所独有的权限功能数组。

// 函数对比:最终显示路由asyncRoutes动态路由数组,routes服务器返回数组
const computedAsyncRoutes=(asyncRoutes,routes)=>{
 return asyncRoutes.filter((item)=>{
    
    if(routes.indexOf(item.name)!=-1){
      // 包含相应权限的
      // 递归
      if(item.children&&item.children.length){
        item.children=computedAsyncRoutes(item.children,routes)
      }
      return true
    }
  })
}

此时我们就可以直接去mutations中了

  SET_RESULTASYNCROUTES:(state,asyncRoutes)=>{
    // 仅仅计算出所有的异步路由
    state.resultAsyncRoutes=asyncRoutes
    // 合并路由  state.resultAllRoutes=constantRoutes.concat(state.resultAsyncRoutes,anyRoutes)
    // 给路由添加新的路由
    router.addRoutes(state.resultAllRoutes)
    // 判断是否添加动态路由
  },

3.路由组件依旧不显示

不显示的原因是因为框架当时写的时候就不是根据你合并的这个路由数组遍历的,所以我们要将合并后的数组进行遍历

components->Sidebar->index.vue改一下就行

3.白屏问题

问题描述:当页面刷新时,vuex数据并不是持久存储的,所以所包含的路由权限信息就会消失,但是此时又需要展示所需要的页面(是需要请求得来的),所以出现了白屏的问题。

解决:依据全局前置路由守卫

const whiteList = ['/login']

router.beforeEach(async(to, from, next) => {
//获取token
  const hasToken = getToken()
  //判断token是否存在
  if (hasToken) {
  //如果是从login过来的,就放行
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
   //如果不是从login过来的,那就是因为路由跳转或刷新出现的问题了,我们可以获取用户信息
      const hasGetUserInfo = store.getters.name
      //判断用户信息是否存在,如果存在就放行,说明没有刷新,只是路由跳转
      if (hasGetUserInfo) {
        next()
      } else {
      //说明用户信息丢失,需要重新获取用户信息
        try {
          // get user info
          await store.dispatch('user/getInfo')
          // hack方法 确保addRoutes已完成,注意要添加 replace: true
          // 其实在路由守卫中,只有next()是放行,其他的诸如:next('/logon') 、 next(to) 或者 next({ ...to, replace: true })都不是放行,
          // 而是:中断当前导航,执行新的导航
          // next({ ...to, replace: true })中的replace: true只是一个设置信息,告诉VUE本次操作后,不能通过浏览器后退按钮,返回前一个路由。
          next({ ...to, replace: true })
          // next()
        } catch (error) {
          await store.dispatch('user/resetToken')
          next(`/login?redirect=${to.path}`)
        }
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next(`/login?redirect=${to.path}`)
    }
  }
})

总结:

1.router.addRoutes()

用于给路由器添加新的路由

2.next({ …to, replace: true })

next({ …to, replace: true })中的replace: true只是一个设置信息,告诉VUE本次操作后,不能通过浏览器后退按钮,返回前一个路由。

3.确保 addRoutes() 已经完成

再执行下一次beforeEach((to, from, next)。如果守卫中没有正确的放行出口的话,会使next({ …to})进入死循环

器后退按钮,返回前一个路由。

3.确保 addRoutes() 已经完成

再执行下一次beforeEach((to, from, next)。如果守卫中没有正确的放行出口的话,会使next({ …to})进入死循环

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

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

相关文章

sql复习(set运算符、高级子查询)

一、set运算符 union:得到两个查询结果的并集,并且⾃动去掉重复⾏。不会排序 union all:得到两个查询结果的并集,不会去掉重复⾏。也不会排序 intersect:得到两个查询结果的交集,并且按照结果集的第⼀个列进…

JavaSEI学习day10 基础班知识点回顾

一. 注释 注释是对代码的一种解释,在程序 的指定位置, 添加的一些说明性信息被注释掉的内容, 不会参与程序的编译和运行. 分类:单行: // 注释信息多行: /* 注释信息 */文档: /** 注释信息 */ 二. 关键字 Java语言中有特殊含义的单词,就是关键字。在后面的课程中…

基于Django的员工管理系统

目录 一、新建项目 二、创建app 三、设计表结构 四、在MySQL中生成表 五、静态文件管理 六、添加页面 七、模板的继承 一、新建项目 django-admin startproject 员工管理系统 二、创建app startapp app01 三、设计表结构 app01/migrations/models.py from django.db impo…

类与类之间的关系有哪几种?

文章目录程序设计要素1.可读性2.健壮性3.优化4.复用性5.可扩展性设计类的关系遵循的原则1、 高内聚低耦合2、面向对象开发中 “针对接口编程优于针对实现编程”,”组合优于继承” 的总体设计类与类之间的关系(即事物关系) A is-a B 泛化&…

模拟用户登录-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-3】 模拟用户登录 【案例介绍】 1.任务描述 在使用一些APP时,通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功,否则会提示用户名或密码错误。 本例要求编写一个程序,模拟用户登录。程序要求如下: 用…

Redis02: Redis基础命令

一、基础命令 先启动redis服务,使用redis-cli客户端连到redis数据库里面 1. 获取符合规则的键: keys 要点: (1)keys 后面可以指定正则表达式 (2)在生产环境下建议禁用keys命令,因为这个命令会查…

为什么要经常阅读和分析计算机SCI期刊论文? - 易智编译EaseEditing

训练阅读与分析期刊论文的能力,可以增加中长期的学术竞争力。 只要能够充分掌握阅读与分析期刊论文的技巧,就可以水到渠成地轻松进行「创新」的工作。 所以,只要深入掌握到阅读与分析期刊论文的技巧,就可以掌握到大学生不曾研习过…

koa中间件的实现原理

koa中间件的实现原理如何?先来看一个例子。koa的执行顺序是这样的:const middleware asyncfunction (ctx, next) {console.log(1)await next()console.log(6) }const middleware2 asyncfunction (ctx, next) {console.log(2)await next()console.log(5…

GCN项目实战1-SimGNN

文章目录SimGNN:快速图相似度计算的神经网络方法1. 数据2. 模型2.1 python文件功能介绍2.2 重要函数和类的实现SimGNN:快速图相似度计算的神经网络方法 原论文名称:SimGNN: A Neural Network Approach to Fast Graph Similarity Computation…

2023年,即时配送迎来黄金年,其他玩家该如何“弯道超车”?

我们知道,面对如此宏达的快递行业,它的市场一直被许多人所看好。尤其近几年,随着电商、物流的发展,各互联网公司纷纷跻身这一领域。现在市面上为大家所熟知的三通一达、极兔以及顺丰等等。 除此之外,在一些细分领域&a…

AWS攻略——Peering连接VPC

文章目录创建IP/CIDR不覆盖的VPC创建VPC创建子网创建密钥对创建EC2创建Peering接受Peering邀请修改各个VPC的路由表修改美东us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由测试知识点我们回顾下《AWS攻略——VPC初识》中的知识: 一个VPC只能设置在一个Re…

劳特巴赫仿真测试工具Trace32的基本使用(cmm文件)

劳特巴赫 Trace32 调试使用教程 使用PRACTICE 脚本(.cmm) 在TRACE32 中使用PRACTICE 脚本(*.cmm)将帮助你: 在调试器启动时立即执行命令根据您的项目需求自定义TRACE32PowerView用户界面加载应用程序或符号使调试操作具有可重复性, 并可用于验证目的和回归测试 自动启动脚本…

Spring Boot系列--创建第一个Spring Boot项目

1.项目搭建 在IDEA中新建项目,选择Spring Initializr。 填写项目信息: 选择版本和Spring Web依赖: Spring Web插件能为项目集成Tomcat、配置dispatcherServlet和xml文件。此处选择的版本若为3.0.2的话会出现如下错误: java: …

【C++】文件IO流

一起来康康C中的文件IO操作吧 文章目录1.operator bool2.C文件IO流3.文件操作3.0 关于按位与的说明3.1 ifstream3.2 ofstream流插入文本3.3 ostringstream/istringstream3.4 stringstream3.5使用stringstream的注意事项结语1.operator bool 之前写OJ的时候,就已经用…

Python学习-----排序问题1.0(冒泡排序、选择排序、插入排序)

目录 前言: 1.冒泡排序 2.选择排序 3.插入排序 前言: 学过C语言肯定接触过排序问题,我们最常用的也就是冒泡排序、选择排序、插入排序……等等,同样在Python中也有排序问题,这里我也会讲解Python中冒泡排序、选择排…

MvvmLight框架入门

MvvmLight MvvmLight主要程序库 ViewModelLocator 在.netFramework环境下nuget安装MvvmLight会自动安装依赖项MvvmLightLibs库,如果在.net core环境下需要手动安装MvvmLightLibs库。 .netFramework环境下安装完成后,在ViewModel目录下具有一个 ViewMo…

page cache设计及实现

你好,我是安然无虞。 page cache的设计及实现 page cache 本质上也是一个哈希桶, 它是按照页的数量进行映射的. 当 central cache 向 page cache 申请内存时, page cache 先检查对应位置是否有span, 如果没有则向更大页去寻找一个span, 如果找到则分裂成两个. 比如…

Java基础常见面试题(五)

异常 Java 异常类层次结构图概览 : Exception 和 Error 有什么区别? Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类 Exception(异常)和 Error(错误…

DAMA-CDGA/CDGP数据治理认证考试如何报考?

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

LocalDNS

目录 文章目录目录本节实战DNS优化1、dns 5s 超时问题解决办法2、NodeLocal DNSCache实验软件关于我最后本节实战 实战名称💘 实战:NodeLocal DNSCache-2022.7.30(测试成功)💘 实战:NodeLocal DNSCache-2023.2.21(测试成功) DNS优…