Vue3Element-plus编写一个简版的字典服务

之前公司有维护过一个内部的字典平台,基本步骤和页面如下
在这里插入图片描述
添加字典属性弹窗
在这里插入图片描述

添加枚举值弹窗
在这里插入图片描述
基本业务代码如下
核心代码

import { defineStore } from 'pinia'
export const useDictionary = defineStore('dictionary', {state: () => ({dict: [],dictObj: {},}),actions: {setDict(data, type) {let init = this.dictObj[type] || []this.dictObj[type] = [...init, ...data]},setDictContent(data, type) {let initData = JSON.parse(JSON.stringify(data))this.dictObj[type] = initData.list || []this.dict.push(initData)},},getters: {getDict(type) {return this.dictObj[type]},getDictList() {return this.dict},},
})

主页面代码

<template><div class="main flex_c"><div class="m8_b"><el-button type="primary" @click="addDict">添加字典</el-button></div><div class="flex_r dict"><div class="dict_left"><el-table :data="dictList" border @row-click="rowClick"><el-table-columnlabel="字典名称"prop="label"></el-table-column><el-table-columnlabel="字典key"prop="key"></el-table-column><el-table-column label="启用状态"><template #default="scope"><span>{{ scope.row.flag ? '禁用' : '启用' }}</span></template></el-table-column></el-table></div><div class="dict_right"><div class="m8_b"><el-buttontype="primary"@click="addItem":disabled="disabledAdd">添加枚举值</el-button></div><el-table :data="dictItemList" border><el-table-column label="序号" prop="desc"></el-table-column><el-table-columnlabel="枚举名称"prop="label"></el-table-column><el-table-columnlabel="枚举值"prop="value"></el-table-column></el-table></div></div><dictForm v-model="dictFlag" /><dictContentv-model="dictContentFlag"ref="dictContents"@submitItem="submitItem"/></div>
</template>
<script setup>
import { useDictionary } from '@/stores/dictionary';
import { computed, watch } from 'vue';
import dictContent from './components/dictContent.vue';
import dictForm from './components/dictForm.vue';
const dictFlag = ref(false) // 字典列表
const dictContentFlag = ref(false) // 字典详情
const dictContents = ref(null)
const keyType = ref('')
const store = useDictionary()
const dictList = computed(() => {return store.dict
})
watch(dictList, (newValue) => {console.log(newValue, '>><<<')
})
const addDict = () => {dictFlag.value = !dictFlag.value
}
const disabledAdd = computed(() => {return !keyType.value
})
const dictItemList = computed(() => {return store.dictObj[keyType.value]
})
// 点击某一行
const rowClick = (row, column, event) => {//   dictContents.value.addRef(row.key)keyType.value = row.key}
const addItem = () => {dictContentFlag.value = !dictContentFlag.value
}
const submitItem = (val) => {store.setDict([val], keyType.value)}
</script>
<style lang="scss" scoped>
.main {width: 100%;height: 100%;
}
.dict {width: 100%;height: 100%;.dict_left {flex: 2;border: 1px solid #eee;border-radius: 4px;box-shadow: 0px 2px 2px 2px #eee;margin-right: 8px;}.dict_right {flex: 1;}
}
</style>

字典弹窗代码

<template><div><el-dialog v-model="centerDialogVisible" title="新增" width="50%" align-center @close="close"><div><el-form :model="addForm" ref="addFroms" :rules="rules"><el-row :gutter="24"><el-col :span="12"><el-form-item label="字典名称" prop="label"><el-input v-model="addForm.label" placeholder="请输字典名称"></el-input></el-form-item></el-col><el-col :span="12"><el-form-item label="字典key" prop="key"><el-input v-model="addForm.key" placeholder="请输入字典key"></el-input></el-form-item></el-col><el-col :span="12"><el-form-item label="排序顺序" prop="desc"><el-input v-model.number="addForm.desc" placeholder="请输入排序顺序"></el-input></el-form-item></el-col><el-col :span="12"><el-form-item label="是否禁用" prop="flag"><el-radio-group v-model="addForm.flag" class="ml-4"><el-radio :label="false" size="large">启用</el-radio><el-radio :label="true" size="large">禁用</el-radio></el-radio-group></el-form-item></el-col></el-row></el-form></div><template #footer><span class="dialog-footer"><el-button @click="close">取消</el-button><el-button type="primary" @click="addConfirm">确定</el-button></span></template></el-dialog></div>
</template>
<script setup>
import { useDictionary } from '@/stores/dictionary';
import { reactive } from "vue";
// import { storeToRefs } from 'pinia'
const store = useDictionary()
const props = defineProps({modelValue: {type: Boolean,default: false}
})
const addForm = reactive({key: '',label: '',desc: '',flag: false,list: []
})
const rules = {key: [{ required: true, message: '请输入字典key', target: 'blur' }],label: [{ required: true, message: '请输入字典名称', target: 'blur' }],desc: [{ required: false, message: '' }],flag: [{ required: false }]}
const addFroms = ref(null)
const emit = defineEmits(['update:modelValue'])
const centerDialogVisible = computed({get() {return props.modelValue},set(val) {emit('update:modelValue', val)}
})
const addRef = (value) => {//   console.log(value, '我是父组件传值过来的')
}
const close = () => {emit('update:modelValue', false)addFroms.value.resetFields()
}
// 确认
const addConfirm = () => {addFroms.value.validate((valid) => {if (valid) {store.setDictContent(addForm, addForm.key)close()}})}
defineExpose({centerDialogVisible,addRef
})
</script>

枚举值弹窗代码

<template><div><el-dialogv-model="centerDialogVisible"title="新增"width="50%"align-center@close="close"><div><el-form :model="addForm" ref="addFroms"><el-row :gutter="24"><el-col :span="12"><el-form-item label="枚举名称" prop="label"><el-inputv-model="addForm.label"placeholder="请输入枚举名称"></el-input></el-form-item></el-col><el-col :span="12"><el-form-item label="枚举值" prop="value"><el-inputv-model="addForm.value"placeholder="请输入枚举值"></el-input></el-form-item></el-col><el-col :span="12"><el-form-item label="排序顺序" prop="desc"><el-inputv-model.number="addForm.desc"placeholder="请输入排序顺序"></el-input></el-form-item></el-col><el-col :span="12"><el-form-item label="是否禁用" prop="flag"><el-radio-groupv-model="addForm.flag"class="ml-4"><el-radio :label="false" size="large">启用</el-radio><el-radio :label="true" size="large">禁用</el-radio></el-radio-group></el-form-item></el-col></el-row></el-form></div><template #footer><span class="dialog-footer"><el-button @click="close">取消</el-button><el-button type="primary" @click="addConfirm">确定</el-button></span></template></el-dialog></div>
</template>
<script setup>
import { reactive, ref } from "vue";const props = defineProps({modelValue: {type: Boolean,default: false}
})
const addFroms = ref(null)
const addForm = reactive({value: '',label: '',desc: '',flag: false
})
const emit = defineEmits(['update:modelValue', 'submitItem'])
const centerDialogVisible = computed({get () {return props.modelValue},set (val) {emit('update:modelValue', val)}
})
const addRef = (value) => {console.log(value, '我是父组件传值过来的')
}
const close = () => {emit('update:modelValue', false)addFroms.value.resetFields()}
// 确认
const addConfirm = () => {let form = JSON.parse(JSON.stringify(addForm))emit('submitItem', form)close()}
defineExpose({centerDialogVisible,addRef
})
</script>

一个简单版的字典服务排序和删除的暂时没有做 思路大概是这个样子

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

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

相关文章

贪心算法的介绍

贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解&#…

J签证、移民、绿卡都是怎么回事?

随着全球化的不断推进&#xff0c;越来越多的人开始关注国际间的移民与签证政策&#xff0c;其中包括J签证、移民以及绿卡的申请问题。本文将简要介绍J签证、移民绿卡的基本概念&#xff0c;并提供相关申请的一般步骤&#xff0c;以帮助读者更好地了解这些程序。 首先&#xff…

上海毅速丨新材料将推动3D打印在压铸行业的应用

压铸是一种应用广泛的制造工艺&#xff0c;它的制造原理是将液态或半液态金属&#xff0c;在高压作用下&#xff0c;以高速度填充压铸模具型腔&#xff0c;并在压力下快速凝固而获得铸件的一种方法。压铸模的设计和制造需要考虑到多方面的因素&#xff0c;如模具材料、结构、冷…

【MATLAB】EWT分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EWTFFTHHT组合算法是一种广泛应用于信号处理领域的算法&#xff0c;它结合了经验小波变换&#xff08;Empirical Wavelet Transform&#xff0c;EWT&#xff09;、快速傅里叶变换&#x…

windows配置服务开机自启和保活

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载WinSW&#xff1f;二、使用步骤1.解压2.配置3.安装服务4.服务启停5.服务卸载6.开机自启7.保活 总结 前言 写了一个程序或者是exe&#xff0c;或者是ba…

Neo4j 程序开发 JavaAPI 嵌入式开发模式(头歌)

文章目录 第1关&#xff1a;JavaAPI 嵌入式开发模式任务描述相关知识创建 Neo4j 数据库启动 Neo4j 数据事务创建节点创建节点关系将创建的数据库设置为默认数据库 编程要求测试说明答案代码修改配置文件&#xff0c;更改默认 Neo4j 数据库代码文件 第1关&#xff1a;JavaAPI 嵌…

Windows10中在Visual Studio2017中VC++项目安装使用GoogleTest库

Windows10中在Visual Studio2017中VC项目安装使用GoogleTest库 在Windows10中VC程序中可以不用自己手动下载GoogleTest源代码&#xff0c;可以直接通过【项目】-> 【管理 NuGet 程序包】-> 【浏览】-> 搜索 googletest&#xff0c; 找到Microsoft.googletest.v140.wi…

运维知识点-Nginx

Nginx Nginx解析安全实战预备知识实验目的#制作图片木马# web服务器-Nginx服务命令及配置centOS7安装安装所需插件安装gccpcre、pcre-devel安装zlib安装安装openssl Nginx解析安全实战 预备知识 NginxPHP/FastCGI构建的WEB服务器工作原理 Nginx|FastCGI简介 Nginx (“engin…

冒泡排序算法是对已知的数列进行从小到大的递增排序。

题目描述冒泡排序算法是对已知的数列进行从小到大的递增排序每个实例输出两行&#xff0c;第一行输出第1轮结果, 第二行输出最终结果 它的排序方法如下: 1.对数列从头开始扫描&#xff0c;比较两个相邻的元素,如果前者大于后者,则交换两者位置 2.重复步骤1&#xff0c;直到没有…

传统算法: Pygame 实现快速排序

使用 Pygame 模块实现了快速排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过快速排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序选择一个基准元素(pivot),将数组分成两部分,…

同旺科技 分布式数字温度传感器 -- OPC Servers测试

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…

Spring Security 6.x 系列(7)—— 源码分析之建造者模式

一、建造者模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者&#xff0c;把他们放到一起看看他们的共同特点&#xff1a; 查看AuthenticationManagerBuilder的继承结构图&#xff1a; 查看HttpSecurity的继承结构图&#xff1a; 查看WebSec…