后台管理系统: 权限管理

权限管理

角色:一家企业而言:BOSS、运维、销售、程序员

权限:超级管理员(BOSS),是有权利操作整个项目的所有的模块
     test(新媒体),只能首页、商品管理者一部分菜单数据
admin:超级管理员-----boss

权限管理:用户管理、角色管理、菜单管理
由于用户管理、角色管理、菜单管理:对于获取数据、展示数据、收集数据

首先搭建权限管理的静态界面

然后去路由当中去配置权限

export const asyncRoutes = [{name: 'Acl',path: '/acl',component: Layout,redirect: '/acl/user/list',meta: {title: '权限管理',icon: 'el-icon-lock'},children: [{name: 'User',path: 'user/list',component: () => import('@/views/acl/user/list'),meta: {title: '用户管理',},},{name: 'Role',path: 'role/list',component: () => import('@/views/acl/role/list'),meta: {title: '角色管理',},},{name: 'RoleAuth',path: 'role/auth/:id',component: () => import('@/views/acl/role/roleAuth'),meta: {activeMenu: '/acl/role/list',title: '角色授权',},hidden: true,},{name: 'Permission',path: 'permission/list',component: () => import('@/views/acl/permission/list'),meta: {title: '菜单管理',},},]
},
{path: '/product',component: Layout,name: 'Product',meta: { title: '商品管理', icon: 'el-icon-goods' },children: [{path: 'trademark',name: 'TradeMark',component: () => import('@/views/product/tradeMark'),meta: { title: '品牌管理' }},{path: 'attr',name: 'Attr',component: () => import('@/views/product/Attr'),meta: { title: '平台属性管理' }},{path: 'spu',name: 'Spu',component: () => import('@/views/product/Spu'),meta: { title: 'Spu管理' }},{path: 'sku',name: 'Sku',component: () => import('@/views/product/Sku'),meta: { title: 'Sku管理' }},]
},
{path: '/test',component: Layout,name: 'Test',meta: { title: '测试管理', icon: 'el-icon-goods' },children: [{path: 'test1',name: 'Test1',component: () => import('@/views/Test/Test1'),meta: { title: '测试管理1' }},{path: 'test2',name: 'Test2',component: () => import('@/views/Test/Test2'),meta: { title: '测试管理2' }},]
},
];

然后就是相关权限的请求

这里有一个问题,那就是路由的配置,为什么不同用户登录我们的项目,菜单(路由都是一样的)

因为目前的路由是死的,不管你是谁,看到的,操作的都是一样的

活着的路由指的是根据不同用户(角色)可以展示不用菜单

如何实现菜单的权限?不同的用户所能操作|查看菜单不一样的?

起始不同的用户(角色),登录的时候会向服务器发请求,服务器会把用户相应的菜单的权限的信息,返回给我们
我们可以根据服务器返回的数据(信息),可以动态的设置路由,可以根据不同的用户展示不同的菜单。

回到登录界面

发现登录事件跟派发的action有关,查看vuex

这个data打印出来就是服务器返回来的数据

其中包含了:用户名name 用户头像avatar router[返回的标志:不同的用户应该展示那些菜单的标记] roles(用户角色信息)  button 【按钮的信息:按钮权限用的标记】

而我们这里的模板只存了用户名和头像,这个明显是不完整的,将他修改完整

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

当用户登录的时候,服务器端会返回相应角色的菜单权限的信息
只不过返回信息是一个数组routes-->['sku','spu',produt']

然后回到router当中,把项目中的路由进行拆分

我们需要拆分出

常量路由:就是不管用户是什么角色(超级管理员,普通员工),都可以看见的路由例如登录,404,首页

异步路由:不同的角色,需要过滤选出的路由,称之为异步路由

任意路由:当路径出现错误的时候重新定位到404

然后根据这三种路由根据不同情况进行筛选

服务器返回来的路由信息跟我们的异步路由进行对比,判断是否显示

回到vuex中

先把异步路由引入进来

定义一个函数:俩个数组进行对比,对比出当前用户到底显示那些异步路由

但我们这些操作只是vuex保存当前用户的异步路由,注意,一个用户需要展示完成路由:常量,异步,任意路由,因此我们需要计算出当前用户展示的所有路由

1.首先需要将这三个路由先引入进来

2.在state中招一个变量用来存储它

3.算出当前用户展示的所有路由

展示出了所有需要展示的路由,但是左侧依旧还是一样,这个是因为我们在路由当中设置的是把常量路由写死的

因此我们需要添加新的路由

1.先引入router

2.给路由器添加新的路由

但并没有效果,这个是因为这个模板取的只有常量路由

到这里就完成了菜单的权限

之前权限界面无法显示这个是因为接口有问题,只需要添加/dev-api即可

显示成功 

按钮权限

菜单权限:不同的用户(角色),能操作、能观看的菜单是不同的。

 按钮的权限:不同的用户(角色),有的用户的是可见按钮、当然有的用户不可见。

 vue elementUI tree树形控件获取父节点ID的实例修改源码:情况1: element-ui没有实现按需引入打包node_modules\element-ui\lib\element-ui.common.js    25382行修改源码  去掉 'includeHalfChecked &&'// if ((child.checked || includeHalfChecked && child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {if ((child.checked || child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {情况2: element-ui实现了按需引入打包node_modules\element-ui\lib\tree.js    1051行修改源码  去掉 'includeHalfChecked &&'// if ((child.checked || includeHalfChecked && child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {if ((child.checked || child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {

为什么给了测试管理的权限,左侧菜单却没显示“测试管理”。因为没这个路由组件,所以建一个就有了

先写相应的组件

然后配置异步路由

效果实现

v-show="$store.state.user.buttons.indexOf('btn.Add1')!=-1"

通过这种方式可以实现对按钮权限的控制

完整效果展示

完整项目如下

Chicksqace/vue_project at Branch_088eb50c (github.com)

记得切换分支到Branch_088eb50c当中

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

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

相关文章

ClickHouse 指南(三)最佳实践 -- 主键稀疏索引

在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中,我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…

Curator基本使用

文章目录 1. 基本操作1.1 建立连接1.2 创建结点1.3 查询结点查询数据查询子结点查看结点信息 1.4 修改结点普通修改带乐观锁的修改 1.5 删除删除单个结点删除带子结点的结点必须成功的删除带回调函数的删除 2. 监听器事件2.1 NodeCache单一结点连续监听2.2 PathChildrenCache监…

nginx平滑升级,信号使用,分割日志

信号 kill -l 看信号大全 nginx -h 中可以看到的信号较少 s signal : send signal to a master process: stop, quit, reopen, reload 可以使用man手册来查看详细的信号 如果没安装,去源码包里找到man文件 man 路径/nginx.8 不加路径打不开man帮助 st…

docker小知识:linux环境安装docker

安装必要软件包,执行如下命令 yum install -y yum-utils device-mapper-persistent-data lvm2目的是确保在安装 Docker 之前,系统已经安装了必要的软件包和服务,以支持 Docker 的正常运行。设置yum源,添加Docker官方的CentOS存储…

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁,并引入了一个新的问题 若定义锁的过期时间是10s,此时A线程获取了锁然后执行业务代码,但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码,A线程…

vscode与vue/react环境配置

一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理),此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号: 配置系统变量 因为在执…

机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现 naive_bayes_classifier.py import numpy as np import collections as cc # 集合的计数功能 from scipy.stats import norm # 极大似然估计样本的均值和标准方差 from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"…

Python分支和循环结构及其应用(文末送书)

一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…

SpringCloud(17)之SpringCloud Stream

一、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型,该模型建立在已经建立和熟悉的Spring习惯用法和最佳实践之上,包括对持久发布/子语义…

腾讯云4核8G服务器优惠价格表(轻量+CVM)

腾讯云4核8G服务器多少钱?轻量应用服务器4核8G12M带宽一年446元、646元15个月,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,标准型SA2服务器1444.8元一年,在txy.wiki可以查询详细配置和精准报价…

ChatGPT带火的HBM是什么?

“ChatGPT是人工智能领域的iPhone时刻,也是计算领域有史以来最伟大的技术之一。” 英伟达创始人兼CEO黄仁勋此前这样盛赞ChatGPT。 ChatGPT突然爆火,对大算力芯片提出了更高更多的要求。近日,据韩国经济日报报道,受惠于ChatGPT&am…

[rust] 10 project, crate, mod, pub, use: 项目目录层级组织, 概念和实战

文章目录 一 项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用 …

Linux之安装jdk,tomcat,mysql,部署项目

目录 一、操作流程 1.1安装jdk 1.2安装tomcat(加创建自启动脚本) 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器&#xff0c…

普中51单片机学习(8*8LED点阵)

8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a;…

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED&#xff0c;计时LEDESP32基础控制&#xff1a;温控输出串口监控&#xff0c;LCD事件计数器&#xff0c;SD卡读写&#xff0c;扫描WiFi网络&#xff0c;手机控制LED&#xff0c;经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

如何多环境切换?如何在微服务配置多环境?

问题本质: nacos配置中心的配置是如何被项目读取到的&#xff1f;(nacos的配置中心和项目是如何联系的&#xff1f;) 注意&#xff1a;nacos有配置管理和服务管理&#xff0c;别弄混。自动注册的是服务管理&#xff01;&#xff01;&#xff01; 1. 如何注册到nacos服务管理中心…

蓝桥杯备战刷题one(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬&#xff0c;我又回来了&#xff0c;最近2月太忙啦&#xff08;过年、奶娃、本子、材料、结题&#xff09;&#xff0c;断更了。现水一篇证明我还活着&#xff01;&#xff01;&#xff01; 最近在写国自然本子&#xff0c;遇到一个估计大家都会遇到的问…

Unity将4个纹理图拼接成1个纹理

需要的效果 最终实现的效果大概如下: 4个贴图上去 这里随便放一个切分的图。 Shader代码如下 直接上代码: // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)// Unlit shader. Simplest possible textured shad…