vue 权限分组

在权限设计时,分为部门、岗位、人员三部分, 人员下面挂部门,部门下面挂岗位,岗位下面挂菜单,用户在进行授权时,勾选了操作权限,默认数据权限也进行勾选。

权限组:查询、新增、修改、删除

用户交互如下:

1、选中新增、修改、删除中的任何一个复选框时,查询框也选中。

2、选中查询框时,新增、修改、删除不变。

3、取消选中查询框时,新增、修改、删除都取消选中。

代码如下:

<template><div><el-treeref="treeRef"class="permission-tree":data="menuTree"show-checkboxnode-key="id"default-expand-all:expand-on-click-node="false":check-on-click-node="true"@check="handleCheck":props="{label: 'title'}"></el-tree></div>
</template><script>
export default {data() {return {menuTree: [{id: '1717148200757',code: 'departmentManagement',title: '部门管理 ',name: '部门管理 ',parentIdId: null,children: [{id: '1717148287418',parentIdId: '1717148200757',code: 'department',title: '部门',name: '部门 ',children: [{id: 'department:query',code: 'department:query',name: '查询',title: '查询',parentIdId: '1717148287418',dataPermission: true},{id: 'department:add',code: 'department:add',name: '新增',title: '新增',parentIdId: '1717148287418',dataPermission: false},{id: 'department:update',code: 'department:update',name: '修改',title: '修改',parentIdId: '1717148287418',dataPermission: false},{id: 'department:delete',code: 'department:delete',name: '删除',title: '删除',parentIdId: '1717148287418',dataPermission: false}]}]},{id: '1717148223729',code: 'jobManagement',title: '岗位管理',name: '岗位管理',parentId: null,children: [{id: '1717148366037',parentId: '1717148223729',code: 'jobInside',title: '岗位',name: '岗位',children: [{id: 'permissionManagement:position:query',code: 'permissionManagement:position:query',name: '查询',title: '查询',parentIdId: '1717148366037',dataPermission: true},{id: 'permissionManagement:position:add',code: 'permissionManagement:position:add',name: '新增',title: '新增',parentIdId: '1717148366037',dataPermission: false},{id: 'permissionManagement:position:update',code: 'permissionManagement:position:update',name: '修改',title: '修改',parentIdId: '1717148366037',dataPermission: false},{id: 'permissionManagement:position:delete',code: 'permissionManagement:position:delete',name: '删除',title: '删除',parentIdId: '1717148366037',dataPermission: false}]}]},{id: '1717148248870',code: 'userManagement',title: '用户管理',name: '用户管理',parentId: null,children: [{id: '1717148408202',parentId: '1717148248870',code: 'userAdmin',title: '用户',name: '用户',children: [{id: 'userAdmin:query',code: 'userAdmin:query',name: '查询',title: '查询',parentIdId: '1717148408202',dataPermission: true},{id: 'userAdmin:add',code: 'userAdmin:add',name: '新增',title: '新增',parentIdId: '1717148408202',dataPermission: false},{id: 'userAdmin:update',code: 'userAdmin:update',name: '修改',title: '修改',parentIdId: '1717148408202',dataPermission: false},{id: 'userAdmin:delete',code: 'userAdmin:delete',name: '删除',title: '删除',parentIdId: '1717148408202',dataPermission: false}]}]}]};},methods: {/*** 复选框选中事件* 实现的效果:* 1、查询节点选中时,其相邻兄弟节点不变* 2、查询节点取消选中时,其相邻兄弟节点取消选中* 3、其相邻兄弟节点任何一个选中时,查询节点必选中* 注:查询节点 dataPermission:true* **/handleCheck(data) {if (!data.children) {// 获取当前叶子节点的兄弟节点const sublingsNode = this.getSiblingsById(this.menuTree, data.id);// 获取当前叶子节点中为查询节点的项const dataPermissionItem = [data, ...sublingsNode].find((item) => item.dataPermission);if (data.dataPermission) {// 操作的是查询节点时,将其兄弟节点设置为取消选中状态sublingsNode.forEach((item) => {this.$refs.treeRef.setChecked(item, false);});} else {// 操作的是兄弟节点时,将查询节点设置为选中状态this.$refs.treeRef.setChecked(dataPermissionItem, true);}}},/*** 通过当前节点的 id 查找兄弟节点* treeData:树形结构的数据源* nodeId:当前节点的 id* **/getSiblingsById(treeData, nodeId) {function findSiblings(nodes) {for (const node of nodes) {if (node.id === nodeId) {return nodes.filter((item) => item.id !== nodeId);}if (node.children) {const siblings = findSiblings(node.children, node.id);if (siblings) return siblings;}}return null;}return findSiblings(treeData, null);}}
};
</script>

总结:

在写这部分逻辑时,难点在于取消数据权限时,怎么将操作权限也进行取消,这部分的交互相当于是查询是新增、修改、删除的取消全选操作。在进行这部分交互效果实现时,有考虑过使用 current-change 这个事件,因为这个事件可以获取到一个 Node 对象,在 Node 对象中可以获取到当前节点父节点,从而在父节点下找到当前节点及兄弟节点,从而避免了使用递归的方式查找兄弟节点,这个事件有个问题,无法触发 check 事件,导致在点击复选框选中时,事件未触发,所以退而求其次考虑使用 check 事件,配合递归方法实现最终的交互效果。

补充:

可以将递归函数去掉,使用 elementUI 中提供的 getNode 方法获取当前节点的兄弟节点,修改如下:

<template><div><el-treeref="treeRef"class="permission-tree":data="menuTree"show-checkboxnode-key="id"default-expand-all:expand-on-click-node="false":check-on-click-node="true"@check="handleCheck":props="{label: 'title'}"></el-tree></div>
</template><script>
export default {data() {return {menuTree: [{id: '1717148200757',code: 'departmentManagement',title: '部门管理 ',name: '部门管理 ',parentIdId: null,children: [{id: '1717148287418',parentIdId: '1717148200757',code: 'department',title: '部门',name: '部门 ',children: [{id: 'department:query',code: 'department:query',name: '查询',title: '查询',parentIdId: '1717148287418',dataPermission: true},{id: 'department:add',code: 'department:add',name: '新增',title: '新增',parentIdId: '1717148287418',dataPermission: false},{id: 'department:update',code: 'department:update',name: '修改',title: '修改',parentIdId: '1717148287418',dataPermission: false},{id: 'department:delete',code: 'department:delete',name: '删除',title: '删除',parentIdId: '1717148287418',dataPermission: false}]}]},{id: '1717148223729',code: 'jobManagement',title: '岗位管理',name: '岗位管理',parentId: null,children: [{id: '1717148366037',parentId: '1717148223729',code: 'jobInside',title: '岗位',name: '岗位',children: [{id: 'permissionManagement:position:query',code: 'permissionManagement:position:query',name: '查询',title: '查询',parentIdId: '1717148366037',dataPermission: true},{id: 'permissionManagement:position:add',code: 'permissionManagement:position:add',name: '新增',title: '新增',parentIdId: '1717148366037',dataPermission: false},{id: 'permissionManagement:position:update',code: 'permissionManagement:position:update',name: '修改',title: '修改',parentIdId: '1717148366037',dataPermission: false},{id: 'permissionManagement:position:delete',code: 'permissionManagement:position:delete',name: '删除',title: '删除',parentIdId: '1717148366037',dataPermission: false}]}]},{id: '1717148248870',code: 'userManagement',title: '用户管理',name: '用户管理',parentId: null,children: [{id: '1717148408202',parentId: '1717148248870',code: 'userAdmin',title: '用户',name: '用户',children: [{id: 'userAdmin:query',code: 'userAdmin:query',name: '查询',title: '查询',parentIdId: '1717148408202',dataPermission: true},{id: 'userAdmin:add',code: 'userAdmin:add',name: '新增',title: '新增',parentIdId: '1717148408202',dataPermission: false},{id: 'userAdmin:update',code: 'userAdmin:update',name: '修改',title: '修改',parentIdId: '1717148408202',dataPermission: false},{id: 'userAdmin:delete',code: 'userAdmin:delete',name: '删除',title: '删除',parentIdId: '1717148408202',dataPermission: false}]}]}]};},methods: {/*** 复选框选中事件* 实现的效果:* 1、查询节点选中时,其相邻兄弟节点不变* 2、查询节点取消选中时,其相邻兄弟节点取消选中* 3、其相邻兄弟节点任何一个选中时,查询节点必选中* 注:查询节点 dataPermission:true* **/handleCheck(data, checked, indeterminate) {if (!data.children) {// 只处理叶子节点const parentNode = this.$refs.treeRef.getNode(data).parent;if (parentNode) {// 获取当前叶子节点的兄弟节点// const sublingsNode = this.getSiblingsById(this.treeData, data.id);// 获取当前叶子节点和兄弟节点const siblings = parentNode.data.children;const dataPermissionItem = siblings.find((item) => item.dataPermission);if (data.dataPermission) {// 如果是查询节点,则取消选中所有非查询兄弟节点siblings.forEach((sibling) => {if (!sibling.dataPermission) {this.$refs.treeRef.setChecked(sibling, false, false);}});} else if (checked) {// 如果是非查询节点被选中,则确保查询节点也被选中this.$refs.treeRef.setChecked(dataPermissionItem, true, false);}}}}// /**//  * 通过当前节点的 id 查找兄弟节点//  * treeData:树形结构的数据源//  * nodeId:当前节点的 id//  * **/// getSiblingsById(treeData, nodeId) {//   function findSiblings(nodes) {//     for (const node of nodes) {//       if (node.id === nodeId) {//         return nodes.filter((item) => item.id !== nodeId);//       }//       if (node.children) {//         const siblings = findSiblings(node.children, node.id);//         if (siblings) return siblings;//       }//     }//     return null;//   }//   return findSiblings(treeData, null);// }}
};
</script>

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

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

相关文章

开发一套家政上门预约服务系统需要运用的关键技术

家政上门预约服务系统开发是指建立一个在线平台或应用程序&#xff0c;用于提供家政服务的预约和管理功能。该系统的目标是让用户能够方便地预约各种家政服务&#xff0c;如保洁、家庭护理、月嫂、家电维修等&#xff0c;并实现服务供应商管理和订单管理等功能。 开发一套家政上…

01Linux以及操作系统概述

课程目标 1.了解现代操作系统的整体构成及发展历史 2.了解Linux操作系统及其分支版本 3.直观上理解服务器端与桌面端版本的区别 课程实验 1.通过对CentOS和Ubuntu的演示&#xff0c;直观理解Linux与Windows的异同 课堂引入 本章内容主要为大家详细讲解Linux操作系统(以下简…

PPT 隐藏开启对象图层

目录预览 一、问题描述二、解决方案三、参考链接 一、问题描述 制作PPT的时候&#xff0c;有时候需要在一张PPT放置多个依次出现的内容&#xff0c;然后设置对应的动画&#xff0c;要是需要对某个内容进行修改的话&#xff0c;就会很不方便&#xff0c;这个时候就需要使用&…

flutter 自定义本地化-GlobalMaterialLocalizations(重写本地化日期转换)

1. 创建自定义 GlobalMaterialLocalizations import package:flutter_localizations/flutter_localizations.dart; import package:kittlenapp/utils/base/date_time_util.dart;///[auth] kittlen ///[createTime] 2024-05-31 11:40 ///[description]class MyMaterialLocaliza…

基于SpringBoot的旅游攻略信息系统的设计与实现

文档介绍 用户群体 针对已经学习过SpringBoot的同学,希望通过一个项目来加强对框架的应用能力,增加项目经验 针对需要完成大学期间的毕设项目的同学,可以通过此文档了解整个系统技术架构,为自己的毕设论文提供指导性建议 文档内容 此文档内容可以让学习此实战项目的同学有一…

有效2,关闭 Microsoft Defender 实时保护,u盘启动进入pe

将以下文件夹改名 “C:\Program Files\Windows Defender” “C:\Program Files\Windows Defender Advanced Threat Protection” “C:\Program Files (x86)\Windows Defender” “C:\ProgramData\Microsoft\Windows Defender” “C:\ProgramData\Microsoft\Windows Securi…

webshell代码免杀

1.什么是WAF? Web Application Firewal(web应用防火墙)&#xff0c;web应用防火通过执行一系列针对HTTP/HTTPS的安全策略来专门为web应用提供保护的一款产品&#xff0c;基本可以分为以下4种 软件型WAF&#xff1a;以软件的形式安装在服务器上面&#xff0c;可以接触到服务器…

Java高级---Spring Boot---4核心概念

4 核心概念 4.1 Spring Boot的自动配置详解 自动配置 是 Spring Boot 的核心特性之一&#xff0c;它允许框架根据项目中添加的依赖自动配置应用程序。 EnableAutoConfiguration: 这个注解是自动配置的入口点&#xff0c;它告诉 Spring Boot 根据类路径上的库来自动配置 Spri…

MAB规范(1):概览介绍

前言 MATLAB的MAAB&#xff08;MathWorks Automotive Advisory Board&#xff09;建模规范是一套由MathWorks主导的建模指南&#xff0c;旨在提高基于Simulink和Stateflow进行建模的代码质量、可读性、可维护性和可重用性。这些规范最初是由汽车行业的主要厂商共同制定的&…

c#基础()

学习目标 了解&#xff1a;嵌套类&#xff0c;匿名类&#xff0c;对象初始化器 重点&#xff1a;类的定义以及对象&#xff0c;构造方法&#xff0c;this和static关键字 掌握&#xff1a;面向对象的概念&#xff0c;访问修饰符&#xff0c;垃圾回收 面向对象 面向对象的概…

2024年5月月终总结

一转眼4月份又过去了&#xff0c;按照年初的承诺&#xff0c;每月照例要写一个月总结&#xff0c;简单回顾下: 1) 英语学习继续进行&#xff1a; 百词斩&#xff1a; 不背单词&#xff1a; 每日英语听力&#xff1a; 2&#xff09;中医学习每天15分钟&#xff0c;没有中断。 …

xxl-job的使用

介绍 在分布式中&#xff0c;很多微服务可能存在多实例部署的现象&#xff0c;如果在某个具体的微服务中实现一个定时任务&#xff0c;而该微服务存在多个实例的话&#xff0c;那么会导致该定时任务在不同实例中都会进行执行&#xff01;这很容易导致脏数据、数据重复等问题&am…

低代码与大模型时代:技术的进化与人工智能的普及

在当前快速发展的技术环境中&#xff0c;低代码和大模型成为了推动技术创新和人工智能普及的关键因素。低代码开发平台使得软件开发变得更简单和高效&#xff0c;大模型则提供了更强大的智能能力。这篇文章将探讨低代码和大模型在技术领域的应用&#xff0c;以及它们对于普通用…

远程继电器模块实现(nodemcu D1 + 继电器)

前言 接下来将实现一个远程继电器&#xff0c;实时远程控制和查询的开关状态。用 5v 直流电控制 220v 交流电。 硬件上&#xff1a; 使用 nodemcu D1 和 JQC-3FF-S-Z 继电器。 软件上&#xff1a; 使用 nodejs 作为服务端&#xff0c;和 html 作为客户端。 在开始之前在电脑…

Scrapy vs. Beautiful Soup | 网络抓取教程 2024

网络爬虫是任何想要从网上收集数据用于分析、研究或商业智能的人必备的技能。Python中两个最受欢迎的网络爬虫工具是Scrapy和Beautiful Soup。在本教程中&#xff0c;我们将比较这些工具&#xff0c;探索它们的功能&#xff0c;并指导你如何有效地使用它们。此外&#xff0c;我…

精雕细琢,B 端 UI 设计展典雅风范

精雕细琢&#xff0c;B 端 UI 设计展典雅风范

医学图像处理质量的评价方法

评判处理后医学图像的质量是确保图像处理技术有效性和可靠性的关键。以下是一些常用的图像质量评估方法和指标&#xff1a; 1. 主观评估 主观评估是由专业人员&#xff08;如放射科医生&#xff09;通过视觉检查对图像质量进行评分。常用的主观评估方法包括&#xff1a; 视觉…

CC工具箱使用指南:【山西省村规结构调整表(亦求长生亦求你)】

一、简介 群友定制工具。 工具根据输入的用地图层&#xff0c;生成山西村规的结构调整表。 和一般的用地表有些不一样的地方是&#xff0c;现状和规划字段都在同一个图层里。 并且还有一个【村庄名称】的字段&#xff0c;可以将多个村庄放在一个图层中&#xff0c;一次性生…

【网络研究观】-20240531

战争揭开美国武器优势的面纱 随着俄军在哈尔科夫地区稳步推进&#xff0c;乌克兰战争对美国国防机器而言是一场灾难&#xff0c;这一点越来越明显&#xff0c;这不仅是因为我们的援助未能挽救乌克兰的撤退和可能的失败。更重要的是&#xff0c;这场战争无情地暴露了我们国防体…

Nginx一个端口代理多个vue项目,通过不同路由转到不同系统,反向代理Apache进行文件处理

需求&#xff1a;由于一些因素限制&#xff0c;需要尽可能的少开放外部端口访问&#xff0c;这里将多个vue项目通过一个nginx端口进行代理&#xff0c;由不同的路由来确定访问哪些项目&#xff0c;apache同理 nginx代理多个vue项目 安装和配置nginx的基础教程这里就不写了&…