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

news/2024/5/10 13:11:23/文章来源:https://blog.csdn.net/guhanfengdu/article/details/129145312

菜单权限的业务分析

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

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

如何实现菜单的权限

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

在这里插入图片描述

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

用户名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) => {
//获取tokenconst 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 infoawait 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.luyixian.cn/news_show_261053.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK8增加的特性

Java知识点总结:想看的可以从这里进入 目录13、JDK8增加的特性13.1、Lambda表达式13.2、方法的引用13.3、时间处理类13.4、接口增加方法13.5、注解新增13.6、Optional类13.7、Stream13、JDK8增加的特性 13.1、Lambda表达式 Lambda表达式和方法的引用 13.2、方法的…

日日顺于贞超:供应链数字化要做到有数、有路、有人

在供应链行业里面,关于“数字化”的讨论绝对是一个经久不衰的话题。 但关于这个话题的讨论又时常让人觉得“隔靴搔痒”,因为数字化变革为非一日之功,对于企业来说意味着投入和牺牲。企业既怕不做怕将来被淘汰,又怕投入过高、不达预…

vue3中使用jszip压缩文件

1、安装依赖 npm install jszip npm install file-saver --save 2、使用 <template><el-card class"mb15"><template #header><span>jszip</span></template><!-- 二维码容器 --><div id"qrCodeBox">&…

网络工程课(二)

ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…

ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST

1、逻辑流 在屏幕开发中&#xff0c;存在如下逻辑流&#xff1a; PBO&#xff08;Process Before Output&#xff09;&#xff1a;屏幕输出之前触发 PAI&#xff08;Process After Input&#xff09;&#xff1a;用户在屏幕中执行操作触发 POH&#xff08;Process On Help-…

计算机四级 [操作系统] | 选择题 2 重点标注版

1.某一个单道批处理系统几乎同时依次到达4个作业&#xff0c;这4个作业的预计运行时间分别为8、4、4和4分钟&#xff0c;按照短作业优先的调度算法运行&#xff0c;请问该批作业的平均周转时间为多少 B A. 14分钟 B. 11分钟 C. 20分钟 D. 10分钟 2.下列与进程具有一一对应的关…

【Git】为什么需要版本控制?版本控制工具有那些?

目录 一、为什么需要版本控制&#xff1f; 二、版本控制工具有那些&#xff1f; &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、为什么需要版本控制&#xff1f; 首先我们要知道什么是版本控制&#xff1f;对版本控制进行文字…

重压之下,特斯拉并不心甘情愿地召回FSD

/ 导读 /近日&#xff0c;美国国家公路交通安全管理局&#xff08;NHTSA&#xff09;宣布&#xff0c;其将召回近37万辆已安装或待安装全自动驾驶测试版&#xff08;FSD Beta&#xff09;的汽车。其实早在今年1月份的时候&#xff0c;NHTSA就要求特斯拉提交召回申请。而特斯拉在…

2023从0开始学性能(1) —— 性能测试基础【持续更新】

背景 不知道各位大佬有没遇到上面的情况&#xff0c;性能这个东西到底是什么&#xff0c;还是以前的358原则吗&#xff1f;明显并不是适用于现在了。多次想踏入性能测试门槛都以失败告终&#xff0c;这次就以系列的方式来督促自己真正踏进性能测试的门槛。 什么是性能测试 通…

作业:1.实验串口收发一个字符2.实验串口收发一个字符串

main.c代码如下#include "uart4.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); } int main() {//串口初始化uart_init();//实现串口数据收发while(1){//put_char(get_char()1);p…

前端必须知道的http知识

HTTP协议也叫超文本传输协议&#xff0c;是一种基于TCP/IP的应用层通信协议&#xff0c;这个协议详细规定了浏览器和万维网服务器之间互相通信的规则&#xff08;报文&#xff0c;请求报文、响应报文&#xff09; 请求方式 HTTP设定了八种发送请求方式&#xff0c;这八种方法没…

APP测试中ios和androis的区别,有哪些注意点

目录 一、运行机制不同 二、对app内存消耗处理方式不同 三、后台制度不同 四、最高权限指令不同 五、推送机制不同 六、抓取方式不同 七、灰度发版机制不同 八、审核机制不同 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;…

独立搭建 handle server

本节主要介绍,如何搭建一个与 GHR隔离的 handle sever,不与外界有任何连通。 下载文件 访问地址下载最新版:http://www.handle.net/download_hnr.html 这里以 9.3.0 版本作为讲解 解压服务端,解压客户端 # 解压 tar -xzvf handle-9.3.0-distribution.tar.gz# 到目录下 …

剑指 Offer 27. 二叉树的镜像

剑指 Offer 27. 二叉树的镜像 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 例如输入&#xff1a; 镜像输出&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,…

性能测试的二八原则

性能测试二八原则&#xff0c;响应时间2/5/8原则 所谓响应时间的“2-5-8原则”&#xff0c;简单说&#xff0c;就是 当用户能够在2秒以内得到响应时&#xff0c;会感觉系统的响应很快; 当用户在2-5秒之间得到响应时&#xff0c;会感觉系统的响应速度还可以; 当用户在5-8秒以内得…

智能小车PWM调速原理

电机驱动电路智能小车电机的驱动芯片采用L293D。L293D是一款单片集成的高电压、高电流、4通道电机驱动&#xff0c;设计用于连接标准DTL或TTL逻辑电平&#xff0c;驱动电感负载&#xff08;诸如继电线圈、DC和步进电机&#xff09;和开关功率晶体管等等。L293D有4个通道&#x…

SpringBoot2核心技术-核心功能【05、Web开发】

目录 1、SpringMVC自动配置概览 2、简单功能分析 2.1、静态资源访问 1、静态资源目录 2、静态资源访问前缀 2.2、欢迎页支持 2.3、自定义 Favicon 2.4、静态资源配置原理 3、请求参数处理 0、请求映射 1、rest使用与原理 2、请求映射原理 1、普通参数与基本注解 …

Vulnhub靶场----1、DC-1

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 靶场下载地址&#xff1a;https://download.vulnhub.com/dc/DC-1.zip Kali地址&#xff1a;192.168.144.148 DC-1靶机地址&#xff1a;192.168.144.149 二、渗透流程 端口扫描&#xff1a;nmap -A -T4 192.168.144.1…

基于 U-Net 网络的遥感图像语义分割 完整代码+论文

一、研究目的U-Net 是一种由全卷积神经网络启发的对称结构网络&#xff0c;在医疗影像分割领域取得了很好的效果。 此次研究尝试使用 U-Net 网络在对多光谱遥感影像数据集上进行训练&#xff0c;尝试使用卷积神经网络自动分割出建筑&#xff0c;希望能够得到一种自动分割遥感影…

基于Java+SpringBoot+Vue+Uniapp前后端分离健身预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…