使用el-tree封装一个权限管理的小功能

使用el-tree封装一个权限管理的小功能

在这里插入图片描述
在这里插入图片描述
使用el-tree封装权限管理, 选中人员并且在右侧回显, 此组件用到了递归, 我只是将需要显示的数据进行了动态传递, 其他数据小伙伴可以自己封装

父组件

<template><div><authorityManage ref="authorityManage" :deptData="data"></authorityManage><el-button class="saveBtn" @click="saveBtnClick()">保存</el-button><el-button class="saveBtn" @click="editBtnClick()">回显数据(编辑 [曹丕] )</el-button></div>
</template><script>
import authorityManage from './common/authorityManage.vue'
export default {name: "index",components: {authorityManage},data(){return {data: [{id: 1,name: '部门A',parentId: 0,},{id: 2,parentId: 1,name: '曹操',},{id: 230,parentId: 2,name: '曹丕'},{id: 231,parentId: 2,name: '曹植'},{id: 3,parentId: 1,name: '司马懿'},{id: 20,name: '部门B',parentId: 0,},{id: 21,name: '刘备',parentId: 20,},]}},methods: {saveBtnClick(){let data = this.$refs.authorityManage.submitData();console.log(data,'data')},editBtnClick(){let list = [{authority: "1",copyContent: "0",download: "1",id: 230,name: "曹丕",parentId:2,printing: "0",}]this.$refs.authorityManage.editData(list)},}
}
</script><style scoped>
.saveBtn{margin-top: 10px;
}
</style>

子组件

<template><div><div class="manage"><div class="personnel"><div class="header">未选</div><div class="content"><el-tree :props="defaultProps" ref="tree" :data="deptTreeData" node-key="id" show-checkbox @check="handleCheckChange"></el-tree></div></div><div class="authority"><div class="header"><div>已选</div><div><el-dropdown><span class="el-dropdown-link">{{ form.authority ? authorityMatter(form.authority) : '权限' }} <i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><div class="dropdownBox" style=""><div class="dropdownBox_left"><div class="title">文档权限</div><div class="permissionList"><el-radio v-model="form.authority" :label="item.value" v-for="(item,key) in authorityOptions" :key="key">{{ item.label }}</el-radio></div></div><div class="dropdownBox_right"><div class="title">文档保护</div><div class="permissionList"><div class="switch"><div class="title">下载</div><div><el-switch active-value="1" inactive-value="0" v-model="form.download"></el-switch></div></div><div class="switch"><div class="title">打印</div><div><el-switch active-value="1" inactive-value="0" v-model="form.printing"></el-switch></div></div><div class="switch"><div class="title">复制内容</div><div><el-switch active-value="1" inactive-value="0" v-model="form.copyContent"></el-switch></div></div></div></div></div></el-dropdown-menu></el-dropdown></div></div><div class="content"><el-tree :props="defaultProps" :data="selectDeptTreeData"></el-tree></div></div></div></div>
</template><script>
export default {name: "authority",data(){return {form: {authority: '', // 权限download: '0', // 下载printing:'0', // 打印copyContent: '0', // 复制内容},// 权限optionsauthorityOptions: [{label: '仅查看',value: '1'},{label: '可编辑',value: '2'},{label: '可批注',value: '3'},{label: '可审核',value: '4'},{label: '禁止访问',value: '5'},],// 部门数据deptTreeData: [],defaultProps: {children: 'children',label: 'name',},// 已选择部门人员selectDeptData: [],// 已选择的部门人员树状数据selectDeptTreeData: [],}},props: {// 父组件传递的数据deptData: {default: null,type: Array,}},mounted() {this.initData()},methods: {/**接受父组件传递的数据, 并格式化为树状数据图形左侧使用 */initData(){this.deptTreeData = this.treeLikeData(this.deptData, 0,);},/**权限label格式化 */authorityMatter(){let filterList = this.authorityOptions.filter(item=>item.value == this.form.authority);if (filterList.length){return filterList[0].label;}},/**树状数据change事件 */handleCheckChange(data){// 1(if),判断是否有children, 如果有children, 需要将children里的数据取出,// 2(else),如果没有children, 需要通过pid查询出上一级, 直到pid为0if (data.children.length){let resoltData = this.recursionGetChildrenData(data,[]);this.mergeData(resoltData,);if (data.parentId !== 0){let resoltData = this.adoptPidGetPreviousLevelData(data);this.mergeData(resoltData);}} else {let resoltData = this.adoptPidGetPreviousLevelData(data);this.mergeData(resoltData);}this.selectDeptTreeData = this.treeLikeData(this.selectDeptData, 0,);},/**通过递归, 将children里的数据全部取出 */recursionGetChildrenData(data, recoverList){let dataObj = {id: data.id,name: data.name,parentId: data.parentId,}let list = recoverList;list.push(dataObj)let childData = function(data){data.forEach(item=>{let obj = {id: item.id,name: item.name,parentId: item.parentId,}list.push(obj);if (item.children.length){childData(item.children);}})return list;}return childData(data.children, list)},/**通过pid获取上一级数据, 直到pid为0 */adoptPidGetPreviousLevelData(data){let deptData = this.deptData;let list = [];let dataObj = {id: data.id,name: data.name,parentId: data.parentId}list.push(dataObj);let getPreviouseData = function(data){let index = deptData.map(item=>item.id).indexOf(data.parentId);if (index !== -1){let obj = {id: deptData[index].id,name: deptData[index].name,parentId: deptData[index].parentId,}list.push(obj);if (obj.pid !== 0){getPreviouseData(obj);}}return list;}return getPreviouseData(data);},/**将过滤出来的数据合并到selectDeptData里, 如果过滤出来的数据存在在selectDeptData,需要删除,如果不存在,则添加 */mergeData(data){if (data.length){data.forEach(item=>{let index = this.selectDeptData.map(mapItem=>mapItem.id).indexOf(item.id);let pidIndex = this.selectDeptData.map(mapItem=>mapItem.parentId).indexOf(item.id);// 查询当前数据是否存在selectDeptData里, 如果存在,需要删除if (index !== -1 && pidIndex == -1){let treeNode = this.$refs.tree.getNode(item.id);if (treeNode && !treeNode.checked){this.selectDeptData.splice(index, 1);}} else {// 查看当前数据是否在selectDeptData里, 如果不存在就添加, 防止重复添加let index = this.selectDeptData.map(mapItem=>mapItem.id).indexOf(item.id);if (index == -1){this.selectDeptData.push(item);}}})}},/**提交数据 */submitData(){let data = this.getBottomData();return data;},/**查询已选择数据的最底层, 为其赋权限 */getBottomData(){let list = [];let _this = this;let child = function(data){data.forEach(item=>{if (item.children.length){child(item.children)} else {let obj = {id: item.id,name: item.name,parentId: item.parentId,authority: _this.form.authority, // 权限download: _this.form.download, // 下载printing: _this.form.printing, // 打印copyContent: _this.form.copyContent, // 复制内容}list.push(obj);}})return list;}return child(this.selectDeptTreeData)},/**编辑回显数据 */editData(data){let idList = [];if (data.length){data.forEach(item=>{idList.push(item.id);this.form.authority = item.authority;this.form.download = item.download;this.form.printing = item.printing;this.form.copyContent = item.copyContent;let resoltData = this.adoptPidGetPreviousLevelData(item);this.mergeData(resoltData);})this.selectDeptTreeData = this.treeLikeData(this.selectDeptData, 0,);}this.setCheckedKeys(idList)},/**通过key设置选中数据 */setCheckedKeys(idList){this.$refs.tree.setCheckedKeys(idList);},/**格式化数据, 将数据格式化为树状数据 */treeLikeData (list, parentID, parentIdName) {let parentName = parentIdName ? parentIdName : 'parentId';//定义一个用于递归查找子元素的函数var child = function (pareID) {//先定义一个数组,用于存储所查到的子元素var childs = [];//循环数组for (let i = 0; i < list.length; i++) {//如果数组其中一项的parentId等于传入的,说明这一项是传入的子元素,把他push进数组,然后重复递归自己找该项的子元素if (list[i][parentName] == pareID) {list[i].children = child(list[i].id);childs.push(list[i])}}//最后将查到的所有子元素返回return childs;};return child(parentID)},}
}
</script><style scoped lang="scss">
.el-dropdown-menu{width: 300px;.dropdownBox{display: flex;padding: 10px;box-sizing: border-box;font-size: 14px;.dropdownBox_left{width: 100px;border-right: 1px solid #ccc;.permissionList{.el-radio{margin-top: 10px;}}}.dropdownBox_right{flex: 1;padding: 0 10px;box-sizing: border-box;.permissionList{.switch{display: flex;align-items: center;margin-top: 10px;.title{width: 80px;}}}}}
}.manage{width: 600px;height: 500px;border: 2px solid #ccc;display: flex;justify-content: space-between;.personnel{width: 50%;height: 100%;border-right: 1px solid #ccc;.header{height: 40px;display: flex;align-items: center;padding: 0 10px;box-sizing: border-box;background: #ddd;}.content{height: calc(100% - 40px);padding: 0 10px;box-sizing: border-box;}}.authority{width: 50%;height: 100%;.header{height: 40px;display: flex;align-items: center;justify-content: space-between;padding: 0 10px;box-sizing: border-box;background: #ddd;}.content{height: calc(100% - 40px);}}
}
</style>

以上是我处理的方式, 如果有更好的方式, 请兄弟们指教

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

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

相关文章

python - DataFrame查询数据操作

学习目标 掌握获取df一列或多列数据的方法 知道loc和iloc的区别以及使用方法 知道df的query函数的使用方法 知道isin函数的作用和使用方法 获取DataFrame子集的基本方法 1.1 从前从后获取多行数据 案例中用到的数据集在文章顶部 LJdata.csv 前景回顾 head() & tail(…

实现树形结构几种方式

1&#xff0c;三级分类树形结构查询 /*** DDD(Domain-Driven Design): 领域驱动设计** 三级分类树形结构&#xff1b;* 支持无限层级&#xff1b;* 当前项目只有三级*/ Data public class CategoryTreeTo {private Long categoryId; //1private String categoryName;private …

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programming xv6 in C)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…

linux系统——route路由命令

route路由对linux内的ip路由表进行操作 计算机间的数据通信是通过网络来实现的&#xff0c;路由就是从源主机到目标主机的转发过程 路由分为静态路由与动态路由&#xff0c;linux中的均为静态路由&#xff0c;动态路由由交换机路由器自动分配规则而来

[word] word悬挂缩进怎么设置? #经验分享#职场发展#经验分享

word悬挂缩进怎么设置&#xff1f; 在编辑Word的时候上方会有个Word标尺&#xff0c;相信很多伙伴都没使用过。其实它隐藏着很多好用的功能&#xff0c;今天就给大家分享下利用这个word标尺的悬挂缩进怎么设置&#xff0c;一起来看看吧&#xff01; 1、悬挂缩进 选中全文&…

Linux Mint 默认禁用未经验证的 Flatpak 软件包

Linux Mint 默认禁用未经验证的 Flatpak 软件包 Linux Mint 新政策 Linux Mint 项目宣布了一项新政策&#xff0c;即默认禁用那些未经官方验证的 Flatpak 软件包&#xff0c;以增强用户的安全保障。 当用户选择启用未经验证的 Flatpak 软件包时&#xff0c;Linux Mint 的软…

JAVA开发的一套(智造制造领航者云MES系统成品源码)saas云MES制造执行系统源码,全套源码,支持二次开发

JAVA开发的一套&#xff08;智造制造领航者云MES系统成品源码&#xff09;saas云MES制造执行系统源码&#xff0c;全套源码&#xff0c;支持二次开发 1990年11月&#xff0c;美国先进制造研究中心AMR&#xff08;Advanced Manufacturing Research&#xff09;就提出了MES&#…

Linux守护进程揭秘-无声无息运行在后台

在Linux系统中&#xff0c;有一些特殊的进程悄无声息地运行在后台&#xff0c;如同坚实的基石支撑着整个系统的运转。它们就是众所周知的守护进程(Daemon)。本文将为你揭开守护进程的神秘面纱&#xff0c;探讨它们的本质特征、创建过程&#xff0c;以及如何重定向它们的输入输出…

国产主流软硬件厂商生态分析

国产领域主流厂商汇总 信创&#xff0c;即信息技术应用创新&#xff0c;由“信息技术应用创新工作委员会”于2016年3月4日发起&#xff0c;是专注于软硬件关键技术研发、应用与服务的非营利性组织。作为科技自强的关键力量&#xff0c;信创在我国信息化建设中占据核心地位&…

外部mysql导入

利用这个命令&#xff1a; mysql -u username -p database_name < file.sql 然后就这样。成功导入。

定个小目标之每天刷LeetCode热题(12)

这是一道简单题&#xff0c;使用位运算中的异或运算即可&#xff0c;异或运算有以下性质&#xff1a; 1、任何数异或 0 结果仍然是原来的数&#xff0c;即 a⊕0a 2、任何数和其自身做异或运算&#xff0c;结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…

探索风电机组:关键软件工具全解析

探索风电机组&#xff1a;关键软件工具全解析 随着可再生能源市场的迅猛发展&#xff0c;风电作为一种重要的可再生能源&#xff0c;其相关技术和工具也越来越受到重视。风电机组的设计、仿真、优化及运维等方面&#xff0c;都需要依靠一系列专业软件工具来实现。这些软件涵盖…

Netty中的ByteBuf使用介绍

ByteBuf有三类&#xff1a; 堆缓存区&#xff1a;JVM堆内存分配直接缓冲区&#xff1a;有计算机内存分配&#xff0c;JVM只是保留分配内存的地址信息&#xff0c;相对于堆内存方式较为昂贵&#xff1b;复合缓冲区&#xff1a;复合缓冲区CompositeByteBuf&#xff0c;它为多个B…

VS2019创建c++动态链接库dll与调用方法

VS2019创建c动态链接库dll与调用方法 1.点击文件-》新建-》项目&#xff0c;输入dll,选择具有导出项的(DLL)动态链接库 2.输入一个文件名&#xff1a;dll2 头文件.h 3.添加加减法函数&#xff1a; // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的…

题解web

1.[LitCTF 2023]Follow me and hack me 1&#xff09;进入题目环境&#xff0c;提示get传参&#xff0c;post传参 2&#xff09;看看源码&#xff0c;也没啥 3&#xff09;直接用hackbar&#xff0c;传入对应参数即可得到FLAG 3&#xff09;但是扫描出来它后端还有东西&#x…

Vue 学习笔记 总结

Vue.js 教程 | 菜鸟教程 (runoob.com) 放一下课上的内容 Vue练习 1、练习要求和实验2的用户注册一样&#xff0c;当用户输入后&#xff0c;能在下方显示用户输入的各项内容&#xff08;不需要实现【重置】按钮&#xff09; 2、实验报告中的实验小结部分来谈谈用JS、jQuery和…

618数码产品有什么推荐?四大2024“宝藏”数码产品推荐!

随着618购物节的热情逐渐升温&#xff0c;你是否在繁多且诱人的商品海洋中迷失方向&#xff0c;难以找到那最心仪的宝贝&#xff1f;团团在此特别为你精心挑选了一系列经过亲身体验的优质好物。这些推荐不仅时尚前沿&#xff0c;更贴合你的日常生活需求&#xff0c;确保实用与品…

霸气的短视频:成都科成博通文化传媒公司

霸气的短视频&#xff1a;瞬间的力量与魅力 在数字化浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为社交媒体的新宠。而在众多短视频中&#xff0c;那些充满霸气、让人热血沸腾的作品&#xff0c;总能引起广泛的关注和讨论。成都科成博通文化传媒公司将从内…

CSS基础知识汇总

目录 CSS 基础知识1. CSS 的基本结构2. 选择器3. 常用 CSS 属性4. CSS 单位5. CSS 盒模型 总结 学习 CSS&#xff08;Cascading Style Sheets&#xff09;是前端开发的重要部分&#xff0c;它用于控制网页的样式和布局。以下是学习 CSS 过程中需要掌握的基本概念、符号和对应的…

Vue08-数据代理

一、Object.defineProperty() Object.defineProperty() 是 JavaScript 中的一个方法&#xff0c;用于直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回这个对象。 这个方法允许你精确地控制一个对象的属性&#xff0c;包括它的值、是…