Vue3+express实现动态编辑element-plus组件tag标签和select下拉框

news/2024/11/26 4:49:12/

需求是利用element-plusd的组件标签tag去实现增加部门的种类,效果图如下:
①在系统设置中添加/删减对应的部门
其他设置
②在部门下拉框中弹出自己设置的部门
下拉框
实现的思路是:通过系统设置中的部门设置增删部门,更新数据库中的部门设置字段,再通过获取数据库中的数据渲染至下拉框中

实现的难点在于:tag标签的数据类型是一个数组类型
例如:["总裁办","产品部","销售部","组织部"]

这里需要注意的是上传到数据库中,数组需为字符串形式

然后是下拉框的数据类型是数组包裹着对象,例如下面所示:

const options = [{value: 'Option1',label: 'Option1',},{value: 'Option2',label: 'Option2',},
]

所以需要把数组类型转换成这种数组包裹着对象的类型

首先是tag的标签部分的代码:
template部分

<div class="department-set"><span>部门设置</span><!-- disable-transitions是否禁用渐变动画 --><!-- closable是否可关闭 --><!-- close关闭 Tag 时触发的事件 --><el-tag v-for="tag in dynamicTags" :key="tag" class="mx-1" closable:disable-transitions="false" @close="handleClose(tag)">{{ tag }}</el-tag>el-input v-if="inputVisible" ref="InputRef" v-model="inputValue" class="ml-1 w-20"size="small" @keyup.enter="handleInputConfirm" @blur="handleInputConfirm" /><el-button v-else class="button-new-tag ml-1" size="small" @click="showInput">+ 添加部门组织</el-button>
</div>

script部分 (组合式setup Ts)

// 其他设置 部门标签
const inputValue = ref('')
// dynamicTags 即为tag中的数据
const dynamicTags = ref()
// element-plus中自带的
const inputVisible = ref(false)
// element-plus中自带的
const InputRef = ref<InstanceType<typeof ElInput>>()// 删减部门
const handleClose = async (tag : string) => {// splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。// 第一个参数为位置,第二个为删除的个数// setdepartment为更新tag的接口// 因为dynamicTags里面的数据是代理的,所以传参的时候需要变为原始数据// JSON.stringify把参数变为字符串进行传参到接口dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1)const res = await setdepartment(JSON.stringify(toRaw(dynamicTags.value)))// res为后端设置的返回数据if (res == '设置成功') {ElMessage({message: '移除部门成功',type: 'success',})} else {ElMessage.error('移除部门失败,请检查网络是否通畅')}
}// 显示输入内容 组件自带的参数
const showInput = () => {
inputVisible.value = truenextTick(() => {InputRef.value!.input!.focus()})
}// 添加部门
const handleInputConfirm = async () => {if (inputValue.value) {dynamicTags.value.push(inputValue.value)// 再次提醒:从Reactive或Ref中得到原始数据// 把数组转换成json格式const res = await setdepartment(JSON.stringify(toRaw(dynamicTags.value)))if (res == '设置成功') {ElMessage({message: '添加部门成功',type: 'success',})}else {ElMessage.error('添加部门失败,请检查网络是否通畅')}}inputVisible.value = falseinputValue.value = ''
}

然后是用户界面下拉框的实现逻辑:
template部分

<el-select v-model="department" 
class="m-2" 
clearable 
placeholder="选择部门进行筛选" 
@change='searchOfDepartment'
ar='clearSelect'>
<el-optionv-for="item in options":key="item.value":label="item.value":value="item.value"/>
</el-select>

script部分 (组合式setup TS)

	// 部门数据
const options = ref([])
/ 选中的部门
const department = ref()
// 获取部门数据
const getdepartmentlist = async () => {const res = await getdepartment()const data = []// 把数组的每一项都取出来,变成一个单独的对象,再把这个对象push进新数组
// 不要把obj放在for循环外,不然输出的数组内容都是最后一个数据,初级知识这里不再叙述for(let i=0;i<res.length;i++){let obj = {value:res[i]}data.push(obj)}options.value = data
}
// 调用上面的函数
getdepartmentlist()

涉及的三个接口如下(前端部分):

// 用户所属部门设置
export const setdepartment = tags => {return instance({url: '/set/setDepartment',method: 'POST',data: {tags}})
}// 获取所有部门
export const getdepartment = () => {return instance({url: '/set/getDepartment',method: 'POST',})
}// 根据部门去筛选用户
export const searchofdepartment = (department) => {return instance({url: '/set/departmentUser',method: 'POST',data:{department}})
}

涉及的三个接口如下(后端部分):

// 用户所属部门设置
exports.setDepartment = (req, res) => {// res.send(req.body.tags)const userinfo = req.bodyconst name = '部门设置'const sql = 'update setting set set_value = ? where set_name = ?'db.query(sql, [userinfo.tags, name], (err, result) => {if (err) return res.cc(err)res.send('设置成功')})
}// 设置获取所有部门
exports.getDepartment = (req, res) => {const userinfo = req.bodyconst name = '部门设置'const sql = 'select set_value from setting where set_name = ? 'db.query(sql, name, (err, result) => {if (err) return res.cc(err)res.send(result[0].set_value)})
}// 根据部门去筛选用户
exports.departmentUser = (req, res) => {const userinfo = req.bodyconst identity = '用户'const sql = 'select * from users where department = ? and identity = ? 'db.query(sql, [userinfo.department, identity], (err, result) => {if (err) return res.cc(err)res.send(result)})
}

数据库字段:
数据库

一个关键点是在设计数据库之处就需要把部门设置添加到set_namevalue中,后面需要更改的时候在接口中指定改部门设置即可


http://www.ppmy.cn/news/101630.html

相关文章

电子企业MES管理系统解决方案

随着信息技术的飞速发展&#xff0c;电子企业面临着日益复杂的数据管理、生产流程和业务决策等问题。如何应对这些问题并提高企业生产效率已成为电子企业的当务之急。本文旨在探讨电子企业MES管理系统的解决方案&#xff0c;以应对电子企业面临的挑战。 在制定电子企业MES管理…

【虚拟机】VMware虚拟机安装Windows 10系统 详细教程

大家好&#xff0c;我是雷工&#xff01; 由于购买的电脑自带系统为windows11家庭版&#xff0c;而有些软件无法在家庭版中安装&#xff0c;所以考虑用虚拟机再装个Windows10专业版系统。 前一段时间在Windows11 家庭版上安装的KingSCADA软件运行时总反应很慢&#xff0c;准备…

tcp丢包的排查

丢包的排查&#xff1a; 参考资料&#xff1a;1、https://blog.csdn.net/maimang1001/article/details/121786580 2、https://blog.csdn.net/m0_67645544/article/details/124574099 1、 网卡丢包 a) ifconfig b) 查看网卡丢包统计(虚拟机看不到网卡信息)&#xff1a;eth…

入门性能测试(一)

一、JDK的下载和安装 1、jdk安装 官网位置&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2、安装JDK 建议&#xff1a;安装路径&#xff0c;不要有汉字目录&#xff0c;不要有空格目录&#xff0c;不要有x86目录 3、配置环境变量…

Codeforces Round 875 (Div. 2)【A、B、C】

文章目录 A. Twin Permutations(构造)B. Array merging(贪心)C. Copil Copac Draws Trees(DFS) 传送门 A. Twin Permutations(构造) 题意&#xff1a;给出排列a&#xff0c;让你给出排列b&#xff0c;使得两排列之和单调不减 思路&#xff1a;构造全相等的排列 时间复杂度:O(n…

创建型设计模式03-原型模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 &#x1f3e1;账号&#xff1a;CSDN 、个人博客 、Github &#x1f38a;公众号&#xff1a;猫十二懿 原型模式 1、原型模式介绍 原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来生成新对象&#xf…

单例模式总结

(153条消息) 解决线程安全问题&&单例模式_Master_hl的博客-CSDN博客 饿汉式 在类初始化时直接创建实例对象&#xff0c;不管你是否需要这个对象都会创建 直接实例化饿汉式&#xff08;简洁直观&#xff09; 特点&#xff1a;构造器私有化、自行创建且用静态变量保…

LiangGaRy-学习笔记-Day17

1、磁盘的介绍 自动分区、手工分区、命令工具分区 1.1、磁盘分类 根据介质来区分&#xff1a; 机械硬盘和固态硬盘 通过盘大小&#xff1a; 3.5英寸和2.5英寸 通过接口分类&#xff1a; SAS、SATA、FC scisi 根据功能&#xff1a; 桌面和企业级别 1.2、磁盘类型 HD…