【Vue3】el-checkbox-group实现权限配置和应用

一. 需求

  1. 针对不同等级的用户,配置不同的可见项

  2. 配置效果如下
    (1)新增,获取数据列表在这里插入图片描述
    (2)编辑,回显数据列表
    在这里插入图片描述

  3. 应用效果如下
    (1)父级配置
    在这里插入图片描述
    (2)子级配置
    在这里插入图片描述

二. 数据格式

  1. 普通用户列表、vip用户列表、svip用户列表 共用一个List
// type == 0 父:级可配置
// type == 2 :父级必然存在 
// type == 1 :type==2的 子级(若有的必然存在,可通过name进行筛选)
List:[{id: 1,children:null,createTime: null,name: "par1",value: "父1",isDel: 0,sort: 1,type: 0,},{id: 2,children:null,createTime: null,name: "par2",value: "父2",isDel: 0,sort: 2,type: 0,},{id: 3,children:null,createTime: null,name: "par3",value: "父3",isDel: 0,sort: 3,type: 0,},{id: 4,children:null,createTime: null,name: "par4",value: "父4",isDel: 0,sort: 4,type: 0,},{id: 5,children:null,createTime: null,name: "par5",value: "父5",isDel: 0,sort: 5,type: 0,},{id: 6,children:[{id: 7,children:null,createTime: null,name: "child1",value: "子1",isDel: 0,sort: 1,type: 1,},{id: 8,children:null,createTime: null,name: "child2",value: "子2",isDel: 0,sort: 2,type: 1,},{id: 9,children:null,createTime: null,name: "child3",value: "子3",isDel: 0,sort: 3,type: 1,},{id: 10,children:null,createTime: null,name: "child4",value: "子4",isDel: 0,sort: 4,type: 1,},{id: 11,children:null,createTime: null,name: "child5",value: "子5",isDel: 0,sort: 5,type: 1,},{id: 12,children:null,createTime: null,name: "child6",value: "子6",isDel: 0,sort: 6,type: 1,},{id: 13,children:null,createTime: null,name: "child7",value: "子7",isDel: 0,sort: 7,type: 1,},],createTime: null,name: "par6",value: "父6",isDel: 0,sort: 6,type: 2,},
]
  1. 思路:调用接口获取List,将同一个List 分别赋值给三个不同的数组。

三. 实现

  1. 数据获取并渲染 及 回显 功能
<template><div><el-form ref="detailRef" :model="form" :rules="rules" label-width="140px"><el-form-item label="普通用户" prop="ordinaryUser"><el-checkbox-group v-model="form.ordinaryUser"><el-checkbox v-for="item in ordinaryUser" v-show="item.type == 0" :key="item.id"class="check-box":label="item.name">{{ item.value }}</el-checkbox><div><el-checkbox v-for="item in ordinaryUser" v-show="item.type == 1" :key="item.id"class="check-box":label="item.name">{{ item.value }}</el-checkbox></div></el-checkbox-group></el-form-item><el-form-item label="VIP用户" prop="vipUser"><el-checkbox-group v-model="form.vipUser"><el-checkbox v-for="item in vipUser" v-show="item.type == 0" :key="item.id"class="check-box":label="item.name">{{ item.value }}</el-checkbox><div><el-checkbox v-for="item in vipUser" v-show="item.type == 1" :key="item.id"class="check-box":label="item.name">{{ item.value }}</el-checkbox></div></el-checkbox-group></el-form-item><el-form-item label="SVIP用户" prop="svipUser"><el-checkbox-group v-model="form.svipUser"><el-checkbox v-for="item in svipUser" v-show="item.type == 0" :key="item.id"class="check-box":label="item.name">{{ item.value }}</el-checkbox><div><el-checkbox v-for="item in vipUser" v-show="item.type == 1" :key="item.id"class="check-box":label="item.name">{{ item.value }}</el-checkbox></div></el-checkbox-group></el-form-item></el-form><div><el-button @click="handleClick">取 消</el-button><el-button type="primary" @click="submitForm">确 认</el-button></div></div>
</template>
<script setup name="ManageMenu">
import { getList,update } from '@/api/xxx/xxx'
import { getConfigList } from '@/api/xxx/xxxConfig'
import { reactive } from '@vue/reactivity'
import { ref } from 'vue'const { proxy } = getCurrentInstance()const route = useRoute()
const configId = route.params.id //  通过路由获取到 配置idconst ordinaryUser = ref([]) // 普通用户
const vipUser = ref([]) // vip用户
const svipUser = ref([]) // svip用户
const selectStartLevel = reactive([]) // 当前选中项
const allStartLevel = ref([]) // 全部数据const selectOrdinaryUser = ref([]) // 当前选中的普通用户可见项
const selectVipUser = ref([]) // 当前选中的vip用户可见项
const selectSVipUser = ref([]) // 当前选中的svip用户可见const data = reactive({form: {},rules: {ordinaryUser: [{ type: 'array', required: true, message: '必填', trigger: ['blur'] }],vipUser: [{ type: 'array', required: true, message: '必填', trigger: ['blur'] }],svipUser: [{ type: 'array', required: true, message: '必填', trigger: ['blur'] }]}
})// 重置表单
const reset = () => {form.value = {id: null,ordinaryUser: [],vipUser: [],svipUser: [],List: [] // 给后端传/回显数据的数组}proxy.resetForm('detailRef')
}/*** 初始化列表数据*/
onMounted(() => {reset()getCList()// 数据回显if (configId != null) {getActivityManageListDetails ({ configId: Number(configId) }).then(res => {if (res.code === 200) {form.value = res.dataform.value.ordinaryUser = form.value.List.filter(item => item.rankConfig === 3 && item.configFlag === 1).map(item => item.name)form.value.vipUser = form.value.List.filter(item => item.rankConfig === 2 && item.configFlag === 1).map(item => item.name)form.value.svipUser = form.value.List.filter(item => item.rankConfig === 1 && item.configFlag === 1).map(item => item.name)}})}
})/*** 扁平化配置项数据*/
const getCList = () => {// 获取配置项 并并扁平化,同时设置等级getConfigList().then(res => {// res.data 数据格式就是 上述ListordinaryUser.value = treeToArray(res.data, 3) // 三级vipUser.value = treeToArray(res.data, 2) // 二级svipUser.value = treeToArray(res.data, 1) // 一级// 将扁平化的数据,整理放到一个数组中allStartLevel.value = [...ordinaryUser.value, ...vipUser.value, ...svipUser.value]// 过滤到type != 2 的数据 type=2,这一项因为需求在代码中写死了,时时刻刻存在所以要筛查掉allStartLevel.value = allStartLevel.value.filter(item => item.type !== 2)})
}/*** 点击确定*/
const submitForm = () => {selectOrdinaryUser.value = form.value.ordinaryUser.map(item => ({ rankConfig: 3, dictEnglishName: item }))selectVipUser.value = form.value.vipUser.map(item => ({ rankConfig: 2, dictEnglishName: item }))selectSVipUser.value = form.value.svipUser.map(item => ({ rankConfig: 1, dictEnglishName: item }))// 当前选中项selectStartLevel.value = [...selectOrdinaryUser.value, ...selectVipUser.value, ...selectSVipUser.value]// 设置选中项对应的星级 是否选中allStartLevel.value.forEach(item => {item.configId = item.idselectStartLevel.value.forEach(val => {if (item.rankConfig === val.rankConfig && item.name === val.name) {item.configFlag = 1}})})// 设置级别权限form.value.List = allStartLevel.valueproxy.$refs['detailRef'].validate(valid => {if (valid) {console.log(...form.value, '校验成功了吗');if (configId != null) {update({ id: Number(configId), ...form.value }).then(res => {if (res.code === 200) {proxy.$modal.msgSuccess('编辑成功')handleClick()reset()}})} else{update({ id: 0, ...form.value }).then(res => {if (res.code === 200) {proxy.$modal.msgSuccess('新增成功')handleClick()reset()}})}}})
}/*** 弹窗取消*/
const handleClick = async () => {console.log('弹窗取消')
}/*** 数组扁平化(reduce)*/
const treeToArray = (tree, rankConfig) => {return tree.reduce((res, item) => {const { children, ...i } = itemi.rankConfig = rankConfigi.configFlag = 0return res.concat(i, children && children.length ? treeToArray(children, rankConfig) : [])}, [])
}
</script><style scoped>
.check-box{width:90px
}
</style>
  1. 权限的应用(此处只处理父级)
<template><el-tabs v-model="activeName" type="card" style="max-width: 100%" @tab-change="handleClick"><el-tab-pane v-for="item in leftData" :key="item.id" :label="item.value" :name="item.name"><component :is="allLeftCompontents[item.name]" :dataDetail="dataDetail"></component></el-tab-pane></el-tabs>
</template>
<script setup>
import Parent1 from '@/views/xxx/parent1'
import Parent2 from '@/views/xxx/parent2'
import Parent3 from '@/views/xxx/parent3'
import Parent4 from '@/views/xxx/parent4'
import Parent5 from '@/views/xxx/parent5'
import Parent6 from '@/views/xxx/parent6'
import { getApplyDetail } from "@/api/xxx"
import { getConfigListByConfigId } from "@/api/xxx"const route = useRoute()
const id = route.params.id // 路由 获取id
const leftData = ref([]) // 配置数据项
const currentTab = ref('') // 当前选中tab项
const activeName = ref('') // 当前选中tab的名称
const dataDetail = reactive({}) // 获取详情const allLeftCompontents = {par1: markRaw(Parent1),par2: markRaw(Parent2),par3: markRaw(Parent3),par4: markRaw(Parent4),par5: markRaw(Parent5),par6: markRaw(Parent6)
}onMounted(() => {// 获取详情getApplyDetail({ id: id }).then(res => {if (res.code === 200) {dataDetail.configId = res.data.configIddataDetail.level = res.data.level// 获取等级权限getSatReviewConfigList()}})
})/*** 获取配置项*/
const getSatReviewConfigList = () => {getConfigListByConfigId({configId:dataDetail.configId , rankConfig: dataDetail.level}).then(result => {leftData.value = result.data// 初始加载第一个tabactiveName.value = leftData.value[0].namehandleClick(activeName.value)})
}/*** 点击切换标签项*/
const handleClick = (val) => {currentTab.value = val
}
</script>

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

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

相关文章

详解TCP/IP五层模型

目录 一、什么是TCP五层模型&#xff1f; 二、TCP五层模型的详细内容 1. 应用层 2. 传输层 3. 网络层 4. 数据链路层 5. 物理层 三、网络设备所在分层 封装和分⽤ 三、Java示例 引言&#xff1a; 在网络通信中&#xff0c;TCP/IP协议是至关重要的。为了更好地理解TCP协议的工…

详解设计模式:单例的进化之路

概念 单例模式(Singleton Pattern)是设计模式中一个重要的模式之一&#xff0c;是确保一个类在任何情况下都绝对只有一个实例。单例模式一般会屏蔽构造器&#xff0c;单例对象提供一个全局访问点&#xff0c;属于创建型模式。 根据初始化时间的不同&#xff0c;可以将单例模式…

文件操作讲解

目录 一.为什么使用文件 二.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 三.文本文件和二进制文件 fwrite函数 fclose函数 四.文件的打开和关闭 4.1流和标准流 4.2文件指针 4.3文件的打开和关闭 五.文件的顺序读写 5.1文件的顺序读写函数 5.1.1fgetc函数…

【软件工程】概要设计

1. 导言 1.1 目的 该文档的目的是描述学生成绩管理系统的概要设计&#xff0c;其主要内容包括&#xff1a; 系统功能简介 系统结构简介 系统接口设计 数据设计 模块设计 界面设计 本文的预期读者是&#xff1a; 项目开发人员 项目管理人员 项目评测人员&#xff08;…

VS2022使用属性表快速设置OpenCV工程属性

1.创建C++控制台应用 2.配置工程 3.打开工程后,为工程添加属性表 打开属性管理器窗口,选择Debug|x64 然后右击选择添加新的项目属性表 并命名为opencv490_debug_x64 点击添加 Debug版本属性表添加成功 使用相同方法添加Release版本属性表

Windows通过git配置github代码仓库全流程

git git是代码的版本控制工具 git安装和github注册 这个默认弄过了 通过git和github之间的SSH配置 在github上面新建仓库&#xff0c;做好配置 git绑定GitHub账号 先cd到上传的文件所在的目录 git config --global user.name "你的github用户名"git config -…

网络原理 - HTTP / HTTPS(3)——http响应

目录 一、认识 “状态码”&#xff08;status code&#xff09; 常见的状态码 &#xff08;1&#xff09;200 OK &#xff08;2&#xff09;404 Not Found &#xff08;3&#xff09;403 ForBidden &#xff08;4&#xff09;405 Method Not Allowed &#xff08;5&…

基于java实现的弹幕视频网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示自定义字符应用

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864显示自定义字符应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD12864简单介绍一、LCD…

使用ffmpeg将视频解码为帧时,图像质量很差

当使用ffmpeg库自带的ffmpeg.exe对对视频进行解帧或合并时&#xff0c;结果质量很差。导致这种原因的是在使用ffmpeg.exe指令进行解帧或合并时使用的是默认的视频码率&#xff1a;200kb/s。 如解帧指令&#xff1a; ffmpeg.exe -i 600600pixels.avi -r 2 -f image2 img/%03d.…

深度学习arm cache系列--一篇就够了

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 1. cache的基本概念介绍 1.1、为什么要用cache? ARM 架构刚开始开发时&#xff0c;处理器的时钟速度和内存的访问速度大致相似。今天的处理器内核要复杂得多&#xff0c;并且时…

【基于HTML5的网页设计及应用】——-正则表达式.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

ctf_show笔记篇(web入门---SSRF)

ssrf简介 ssrf产生原理&#xff1a; 服务端存在网络请求功能/函数&#xff0c;例如&#xff1a;file_get_contens()这一类类似于curl这种函数传入的参数用户是可控的没有对用户输入做过滤导致的ssrf漏洞 ssrf利用: 用于探测内网服务以及端口探针存活主机以及开放服务探针是否存…

C语言交换二进制位的奇数偶数位

基本思路 我们要先把想要交换的数的二进制位给写出来假如交换13的二进制位&#xff0c;13的二进制位是 0000 0000 0000 0000 0000 0000 0000 1101然后写出偶数位的二进制数&#xff08;偶数位是1的&#xff09; 1010 1010 1010 1010 1010 1010 1010 1010然后写出奇数位的二进…

uniapp切换中英文

一、安装 npm install uni-i18n --save 二、创建中英文切换的文件 1.英文en.js文件 2.中文zh_CN.js文件 三、 main.js中引用 // Vue i18n 国际化 import VueI18n from /common/vue-i18n.min.js; Vue.use(VueI18n);// i18n 部分的配置&#xff0c;引入语言包&#xff0c;注意路…

Linux :进程的程序替换

目录 一、什么是程序替换 1.1程序替换的原理 1.2更改为多进程版本 二、各种exe接口 2.2execlp ​编辑 2.2execv 2.3execle、execve、execvpe 一、什么是程序替换 1.1程序替换的原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往…

0基础安装配置Linux-ubuntu环境

Vmtools的安装参见 0基础教你安装VM 17PRO-直接就是专业许可证版_vm17许可证-CSDN博客 在vmtools中安装ubuntu 等待安装 这时候发现没有继续按钮&#xff0c;我们关闭这个界面&#xff0c;进入系统中&#xff0c;先更改分辨率 点击这个三角&#xff0c;因为还么有安装成功&am…

【Canavs与艺术】绘制蓝白绶带大卫之星勋章

【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用Canvas绘制蓝白绶带大卫之星勋章</title><style type&quo…

从 MongoDB 到 PostgreSQL 的大迁移

Infisical&#xff0c;一家做密钥管理的开源商业公司&#xff0c;主要对标的是 HashiCorp Vault Infisical 在过去一年里迅速发展&#xff0c;平台现在每天处理超过 5000 万个密钥&#xff0c;将应用程序配置和私密数据发送给需要的团队、CI/CD 流水线以及服务器 / 应用程序。 …

基于JSP的农产品供销服务系统

背景 互联网的迅猛扩张彻底革新了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国的政府机关和各类企业便开始探索利用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖范围有限、用户接受度不高、互联网相关法律法规不完善以及技术开发不够成熟等因素&…