封装form表单
目录
1. 源码
2. 其他页面引用
ps:请看完看明白再复用
1. 源码
<template><div style="width: 100%; height: 100%" class="form-condition"><!-- 普通表单 --><el-card shadow="hover" class="cardheight"><div class="form-content"><el-form ref="FormRef" label-width="auto" :model="FormRef"><el-rowv-for="(formType, indexs) in formTypeArray":key="indexs":gutter="20"><!-- <el-button @click="Text(formTypeArray[indexs])"></el-button> --><el-col:span="formTypeArray[indexs].length < 2 ? 24 : span"v-for="(data, index) in formTypeArray[indexs]":key="index"><!-- 关于Id相关的均不显示,此处需要后台进行配合完成 --><!-- &&(data.label? data.label.includes('ID')? false: true: false) --><el-form-itemv-if="data.type !== 'allCheckBox' &&data.type !== 'checkbox' &&(data.label? data.label.includes('ID')? false: true: false)":label="data.label":prop="data.prop":rules="rules(data)"><!-- :label="data.label.includes('ID') ? '序号' : data.label" --><!-- active-text="打开" --><!-- inactive-text="关闭" --><el-switchv-if="data.type == 'switch'"v-model="FormRef[data.prop]"class="mb-2"style="--el-switch-on-color: #13ce66;--el-switch-off-color: #ff4949;":active-value="1":inactive-value="0":disabled="data.disabled"@change="SwitchChang($event,formTypeArray[indexs][index],indexs,index)"/><!-- 输入框类型 --><!-- 修改点 去除 v-model.number="FormRef[data.prop]" 202302002--><el-inputv-if="data.type == 'input'"v-model="FormRef[data.prop]":placeholder="data.placeholder":disabled="data.disabled"suffix-icon="xxxx"></el-input><!-- 时间类型 --><el-date-pickerpopper-class="date-style"v-if="data.type == 'date'"type="datetime":placeholder="data.placeholder"v-model="FormRef[data.prop]"format="YYYY/MM/DD HH:mm:ss"value-format="YYYY-MM-DD HH:mm:ss"style="width: 100%":disabled="data.disabled"></el-date-picker><!-- 下拉框类型 --><el-select:popper-append-to-body="false"v-if="data.type == 'select'":multiple="data.multiple":clearable="data.clearable"v-model="FormRef[data.prop]":placeholder="data.placeholder":change="SelectChange(FormRef[data.prop], data.label)"style="width: 100%":disabled="data.disabled"><el-optionv-for="(item, i) in data.option":key="item.value":label="item.label":value="item.value"></el-option></el-select><!-- lu 文本域--><!-- 输入框类型 --><el-inputv-if="data.type == 'inputText'"type="textarea"v-model="FormRef[data.prop]":placeholder="data.placeholder":disabled="data.disabled"suffix-icon="xxxx"></el-input><el-checkboxv-if="data.type == 'Radio'":true-label="1":false-label="0"v-model="FormRef[data.prop]":label="'点击激活此项为' + data.label + '产品售后信息'"border/><!-- 显示带有“check-on-click-node”的复选框:树形下拉框 --><el-tree-selectv-if="data.type == 'treeSelect'"v-model="FormRef[data.prop]":data="data.option"check-strictly:render-after-expand="false"show-checkboxcheck-on-click-nodestyle="width: 100%":disabled="data.disabled":multiple="data.multiple"/><!-- 上传控件 --><el-uploadv-if="data.type == 'upload'"action="#"multiple:auto-upload="true"accept="jpg,jpeg,png,PNG"list-type="picture-card":file-list="files":http-request="uploadFile":before-upload="beforeUpload":on-preview="handlePictureCardPreview":on-change="ChangeImage":on-remove="handleRemove"><el-icon><Plus /></el-icon></el-upload><!-- <el-button @click="SubPicForm">提交上传</el-button> --><el-dialog v-model="dialogVisible"><img style="width: 100%" :src="dialogImageUrl" alt="" /></el-dialog></el-form-item><el-rowv-if="data.type == 'allCheckBox' &&JSON.stringify(data.childList) !== '{}'"class="allcheckBoxOther"><el-form-item label-width="auto" label="随带资料"><div v-for="(checkBoxData, key) in data.childList" :key="key"><el-form-item label-width="auto"><el-checkboxborder:true-label="1":false-label="0":label="checkBoxData.label"v-model="FormRef[checkBoxData.prop]"></el-checkbox></el-form-item></div></el-form-item></el-row></el-col></el-row><el-row style="width: 100%; height: 32px; padding-top: 10px"><el-col :span="span" style="width: 100%; margin: 0 auto"><el-form-item style="width: 100%"><div class="content-btn" style="margin: auto"><el-buttonplaintype="danger"style="float: left; margin-right: 15px"@click="cleanFormValue"><el-icon><FolderRemove /></el-icon>  清 空</el-button><el-buttonplaintype="primary"style="float: left"@click="getCondition()"><el-icon><Search /></el-icon> {{isOpenSonDataTable || isOpenSonTransfer ? "保存" : "提 交"}}</el-button></div></el-form-item></el-col></el-row></el-form></div></el-card><!-- 是否存在明细附表 --><div v-if="isOpenSonDataTable"><!-- 表单 --><el-card shadow="hover"><!-- 表单按钮组件 --><div style="margin-bottom: 10px"><ButtonView ref="ButtonRef" @ButtonMessage="GetBtnClick"></ButtonView></div><!-- 数据表格组件 --><div class="aa"><TableDialogref="tableSonDataRef"@getPage="GetDataFenYeWath"@tableMessage="GetTableMessage"></TableDialog></div></el-card></div><!-- 抽屉,明细表编辑处 :before-close="drawerCloseSonForm"--><el-drawer:key="itemKey":title="dialogTitle"v-model="dialog"direction="ltr":size="drawerSize"custom-class="demo-drawer"ref="drawer"destroy-on-close><div class="demo-drawer__content"><!-- 表单组件 --><FromViewref="SonfromView"@conditionParams="GetCondition"@conditionFormData="GetConditionFormData"@SonSelectChange="GetSonSelectChange"></FromView></div></el-drawer><!-- 是否存在其他组件 --><div v-if="isOpenSonTransfer"><el-card shadow="hover" style="height: 439px"><p style="text-align: center; margin: 0 0 20px">请选择左侧的数据项,点击中间“>”按钮添加数据项</p><div style="text-align: center"><div><el-transferstyle="text-align: left; display: inline-block"v-model="transferValue":data="transferDatas":props="{label: 'title',}"filterable:titles="['待选数据', '已选数据']":button-texts="['取消', '选择']"></el-transfer></div><el-button plain class="squan" type="success" @click="Authorization()">绑 定</el-button></div></el-card></div></div>
</template><script>
import { computed, provide, inject, ref } from "@vue/runtime-core";
import { watchEffect, getCurrentInstance, reactive } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";export default {name: "FromView",emits: ["conditionParams"],setup(props, context) {let FormRefTest = reactive({});let span = ref(6); //6let formTypeArray = ref(new Array());//用于接收父组件传递的Form表单配置const formTypeConfig = inject("formTypeConfig");//行数let formRowsCount = inject("formRowsCount");let checkBoxList = [{type: "allCheckBox",label: "allCheckBox",childList: {},},];//移位,将特定的元素移到最后function moveArray(arr, sourceIndex, targetIndex) {// splice 将目标元素替换并将原结果扔回来赋值给它arr[sourceIndex] = arr.splice(targetIndex, 1, arr[sourceIndex])[0];}/*** 设置表单类型* @param array 表单配置* @param col 每行表单项个数*/const setFormType = (oldArray, col) => {formTypeArray = ref(new Array());//console.log("进入FormView组件中的方法", formTypeArray);//console.log(oldArray, col);let array = [];oldArray.map((item) => {if (item.type == "checkbox") {checkBoxList[0].childList[item.prop] = item;array.push(item);} else {array.push(item);}});//console.log("checkBoxList====", checkBoxList);//console.log("array====", array);//#region 移动 checkbox 参数位置//移动var sourceIndexes = [];array.forEach((item, index) => {if (item.type && item.type == "checkbox") {sourceIndexes.push(index);}});// 遍历索引数组,移动元素sourceIndexes.forEach((sourceIndex) => {moveArray(array, sourceIndex, array.length);});//过滤undefinedarray = array.filter((item) => {return item !== undefined || !!item;});//#endregionif (col == null || col == "" || array == null || array == "") {col = 4; // 默认分4列}span.value = 24 / col;if (array != null) {array.map((item) => {FormRefTest[item.prop] = item.value;});//console.log("==========FormRef=====", FormRefTest);// 只有一行if (col >= array.length) {formTypeArray.value.push(array);} else {// 超过一行let deb = col;let i = 0;while (i < array.length) {let item = []; //nullvar isFlag = false; //当它为True时,下方将不再Pushwhile (i < deb) {if (array[i].label.indexOf("后台自增ID") !== -1) {item.push(array[i]);i++;break;} else if (array[i].label.indexOf("备注") !== -1 ||array[i].label.indexOf("概述") !== -1 ||array[i].label.indexOf("附件") !== -1 ||array[i].type.indexOf("inputText") !== -1) {//说明在此之前已有数据if (item.length > 0) {isFlag = true;formTypeArray.value.push(item);item = [];}item.push(array[i]);i++;break;} else {item.push(array[i]);//console.log(deb);i++;}}if (!isFlag) {formTypeArray.value.push(item);}if (array.length - i < col) {deb = array.length;} else {deb = i + col;}}formTypeArray.value.push(checkBoxList);}}//console.log("---------表单配置数据 SUCCESS----------");};//#region 明细表配置//用于监听子表表单数据let FatherisOk = ref(false);//用于父表单保存后的Idlet FatherIds = ref(0);//用于监听子表单中的数据let SonConfigCondition = ref([]);//用于监听子表一行几个let SonformRowsCount = ref(1);//明细表单配置const ConfigurationCondition = () => {provide("formTypeConfig", SonConfigCondition);provide("formRowsCount", SonformRowsCount);};//#endregion//#region 穿梭框配置//#endregion// 监听表单配置数据 数据变化时, 更新配置watchEffect(() => {//console.log("-------监听formTypeConfig--------");//console.log("=formTypeConfig==========", formTypeConfig);//console.log(formRowsCount);var rowlCount = formRowsCount == undefined ? 1 : formRowsCount.value;setFormType(formTypeConfig.value, rowlCount);});return {formTypeArray,span,//cleanFormValue,setFormType,ConfigurationCondition, //明细表单配置SonConfigCondition,FatherisOk, //用于子表判断附表是否已经保存FatherIds, //若主表已经保存,此字段不为0且同时可以获取主表新增数据后的IdformRowsCount, //行数//#region 穿梭框配置FormRefTest,//#endregion};},data() {return {FormRef: {},checkBoxList: {},isOpenSonDataTable: false, //是否存在明细表格isOpenSonTransfer: false, //是否存在其他组件listData: [], //此处我子表单中选择的数据,用于对其修改、删除使用GetDataFenYe: null, //分页查询数据GetDataHanderAndFrom: null, //明细表表头查询数据dialog: false,dialogTitle: "",itemKey: "",transferValue: [], //穿梭框选中的transferDatas: [], //穿梭框数据源//上传如下:files: [],dialogVisible: false,dialogImageUrl: "",deleteFiles: [],//抽屉大小drawerSize: "22%",};},created() {//默认初始化明细表单配置this.ConfigurationCondition();this.FormRef = this.FormRefTest;//console.log("this.FormRef====", this.FormRef);//console.log("this.FormRefTest====", this.FormRefTest);},methods: {Text(val) {},rules(data) {//#region 自定义验证校验if (data.isRules) {//校验数值类型if (data.propTypes == "INT") {var validatorTel = (rule, value, callback) => {if (!value) {return callback(new Error(data.label + "不能为空"));}var numReg = /^[0-9]+$/;var numRe = new RegExp(numReg);if (!numRe.test(value)) {callback(new Error("请输入数字值"));} else {callback();}};return [{required: true,validator: validatorTel,trigger: "blur",},];}}//#endregion//校验手机号 regMobile//暂时屏蔽校验手机号,此处不完善,目前只打开校验是否为空//20230202留// const regMobile =// /^((\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14})|([1][3,4,5,6,7,8,9][0-9]{9})$/;// if (data.prop.includes("Tel")) {// var validatorTel = (rule, value, callback) => {// if (!value) {// return callback(new Error(data.label + "不能为空"));// }// var numReg = /^[0-9]+$/;// var numRe = new RegExp(numReg);// if (!numRe.test(value)) {// callback(new Error("请输入数字值"));// } else {// if (!regMobile.test(value)) {// callback(new Error("请输入正确的号码"));// } else {// callback();// }// }// };// return [// {// required: true,// validator: validatorTel,// trigger: "blur",// },// ];// } elseif (data.prop == "LoginAccount" ||data.prop == "Password" ||data.prop.includes("Eqipment") ||data.prop == "ProductID" ||data.prop == "PartID" ||data.prop == "WorkNo" ||data.prop == "QualityCode") {if (data.type === "select") {return [{ required: true, message: "此处为必填项", trigger: "change" },];}if (data.type === "input") {return [{ required: true, message: "此处为必填项", trigger: "blur" }];}}},SwitchChang(data, formData, indexs, index) {// this.FormRef[data.prop] = data ? 1 : 0;//},//实时监听子组件发送的信息GetDataFenYeWath(Msg) {//重新赋值,避免新增、修改、删除操作this.pageSize = Msg.pageSize;this.pageNum = Msg.pageNum;let param = {params: Msg,};if (this.GetDataFenYe != null) {this.GetDataFenYe(param);}this.$emit("SongetPage", { pageSize: this.pageSize, pageNum: this.pageNum });},//获取表格组件传递的信息GetTableMessage(msg) {//获取listDatas值this.listData =msg.type === "列表选择"? msg.listData: msg.type === "页码切换"? null: null;//console.log("组件:表格发送信息:" + this.listData);},//选择框事件SelectChange(data, labels) {console.log(labels);var linsDatas = { value: data, label: labels };//匹配新格式var datas = {data: linsDatas,type: "选择",};//选择框事件,回传给父组件this.$emit("SonSelectChange", datas);},/*** 获取父组件传递过来的数据信息链,这里指isOpenSonTransfer 穿梭框的数据*/SetDataSonTransfer(SonDataTransFer) {this.isOpenSonTransfer = SonDataTransFer.isOpenSonTransfer; //是否开启穿梭框var tData = SonDataTransFer.SonTransfer; //穿梭框左侧数据//为True的情况下,进行渲染明细if (this.isOpenSonTransfer) {//每次选择后清空,重新触发this.transferDatas = [];this.transferDatas = tData;}},/*** 获取父组件传递过来的数据信息链,这里指isOpenSonTransfer 穿梭框的数据*/SetDataSonTransferDatas(SonDataTransFer) {this.isOpenSonTransfer = SonDataTransFer.isOpenSonTransfer; //是否开启穿梭框var SonTransferValue = SonDataTransFer.SonTransferValue; //穿梭框右侧数据//为True的情况下,进行渲染明细if (this.isOpenSonTransfer) {//每次选择后清空,重新触发this.transferValue = [];var ChangeLst = [];SonTransferValue.forEach((element) => {ChangeLst.push(element.PartID.toString());});this.transferValue = ChangeLst;}},//绑定按钮Authorization() {// 优先判断在新增的情况下,主表是否已经完成了保存 多用于子表进行新增操作if (!this.FatherisOk) {//警告this.$message({message:"在新建明细信息的情况下,请优先添加主表信息,再对其明细表进行新增编辑操作",type: "warning",});return;}this.formTypeArray;this.transferValue;var datas = {form: this.formTypeArray,transDatas: this.transferDatas,trans: this.transferValue,FatherIds: this.FatherIds,type: "绑定",};this.$emit("SonSelectChange", datas);},/*** 获取父组件传递过来的数据信息链,不包含明细表数据* @param {} GetDataLists*/SetData(SonDataTableDatas) {this.isOpenSonDataTable = SonDataTableDatas.isOpenSonDataTable;//为True的情况下,进行渲染明细if (this.isOpenSonDataTable) {//渲染 —— 延迟加载this.$nextTick(() => {this.$nextTick(() => {//自动高度this.$refs.tableSonDataRef.heights = "auto";});//普通表格this.$refs.tableSonDataRef.SetTableType(true);//组件渲染表头表单this.$refs.tableSonDataRef.SetDataTableHeader(SonDataTableDatas.GetDataHanderAndFrom);//添加子表表单数据this.SonConfigCondition =SonDataTableDatas.GetDataHanderAndFrom.lstSubset[0].Froms;//渲染明细按钮this.$refs.ButtonRef.SetButtonConfigDatas(SonDataTableDatas.PartButtonList);});}},//接收父组件传递的明细表数据,通过此方法作为媒介进行对孙组件传值SetDataSonTable(GetDataFenYe) {this.$nextTick(() => {//若编辑一条装备主表数据时,存在部件表,此处需要赋值this.$refs.tableSonDataRef.SetDataTable(GetDataFenYe);// this.dialog = false;});},//获取按钮组件消息————————用于明细表单GetBtnClick(val) {//拿到组件信息后,新增、修改弹出Dalodif (val.search("新增") != -1) {// 优先判断在新增的情况下,主表是否已经完成了保存 多用于子表进行新增操作if (!this.FatherisOk) {//警告this.$message({message:"在新建明细信息的情况下,请优先添加主表信息,再对其明细表进行新增编辑操作",type: "warning",});return;}// 优先添加this.dialog = true;this.dialogTitle = val;// //优先清空// this.$refs.SonfromView.CloseSonForm();var parm = { type: "新增" };this.$emit("GrandsonFormArr", parm);}if (val.search("编辑") != -1) {//仅支持单条编辑if (JSON.parse(JSON.stringify(this.listData)).length != 1) {//警告this.$message({message: "请选择一条数据进行编辑操作!",type: "warning",});return;}//结构剖析var newListData = JSON.parse(JSON.stringify(this.listData));//循环表单this.SonConfigCondition.forEach((item) => {newListData.forEach((dataitem) => {//循环找Keyfor (let key in dataitem) {if (item.prop == key) {item.value = dataitem[key];}}});});//先打开this.dialog = true;this.dialogTitle = val;if (newListData[0].Files !== undefined &&newListData[0].Files !== null) {//剔除特殊字符var newFilesString = newListData[0].Files.replace(/"/g, "");//分割数组var newFilesArr = newFilesString.replace(/"/g, "").split("|");//删除最后一位,总是多出的空 ''newFilesArr.pop();//此处延迟加载会帮你解决一切this.$nextTick(() => {var newFiles = [];//构建回显所需要的参数值newFilesArr.forEach((element) => {var file = { url: this.$FWurl + element };newFiles.push(file);});//组件渲染this.$refs.SonfromView.SetFilesData(newFiles);});}var parm = { type: "编辑", Ids: newListData[0].ID };this.$emit("GrandsonFormArr", parm);}if (val.search("删除") != -1) {this.$nextTick(() => {var _this = this;//仅支持单条编辑if (JSON.parse(JSON.stringify(this.listData)).length != 1) {//警告this.$message({message: "请选择一条数据进行删除操作!",type: "warning",});return;}//结构剖析var newListData = JSON.parse(JSON.stringify(this.listData));//此参数在删除时无需传递delete newListData[0].id;ElMessageBox.confirm("确认删除这条信息吗?", "警告", {confirmButtonText: "确定",cancelButtonText: "取消",type: "warning",}).then(() => {let dataParam = { data: newListData[0], type: "删除" };this.$emit("SonFormArr", dataParam);}).catch(() => {});});}},//给孙组件的抽屉添加宽度SetDrawerSize(value) {//渲染 —— 延迟加载this.$nextTick(() => {//重新渲染,itemKey用于处理Table不渲染的问题this.drawerSize = value;});},//孙组件获取父组件传递的File信息GetConditionFormData(datas) {// Ids虽然是从父级得来,但是此处可能会丢失Ids,所以需要将孙级位面中Ids获取,也就是明细Id//先删后加,垃圾FormData特性datas.delete("Ids");datas.append("Ids", this.FatherIds); //属于哪条明细表数据this.$emit("conditionFormData", datas);},//获取表单组件传递的信息,此处接收的表单乃是数据表格对应的表单————————用于明细表单GetCondition(datas) {//console.log("组件:表单组件发送信息:" + datas);var formDatas = {};formDatas = datas;// datas.forEach((e, index) => {// for (let i = 0; i < e.length; i++) {// var keys = datas[index][i].prop;// var values = datas[index][i].value;// formDatas[keys] = values;// }// });const param = formDatas;//获取表单组件后,判断是新增/修改if (this.dialogTitle.search("新增") != -1) {//将新增后的主表Id拿到后进行新增操作,此处需要回传到最外层的组件中param.FatherIds = this.FatherIds;let dataParam = { data: param, type: "新增" };this.$emit("SonFormArr", dataParam);}if (this.dialogTitle.search("编辑") != -1) {param.FatherIds = this.FatherIds;let dataParam = { data: param, type: "编辑" };this.$emit("SonFormArr", dataParam);}},//清空子表表单数据CloseSonForm() {//清空选择this.cleanFormValue();},//抽屉回调,关闭前清空表单数据drawerCloseSonForm(done) {//清空选择this.$refs.SonfromView.CloseSonForm();done();},/*** 清空表单内容*/cleanFormValue() {for (let key in this.FormRef) {this.FormRef[key] = "";}},//#region 关于图片组上传uploadFile(file) {//console.log(file);},//删除事件handleRemove(file, fileList) {var obj = file.url.split("upLoad/").slice(-1)[0];//添加 需要删除的附件this.deleteFiles.push(obj);//console.log(file, fileList);},//预览事件handlePictureCardPreview(file) {this.dialogImageUrl = file.url;this.dialogVisible = true;},//添加图片ChangeImage(file, filelist) {this.files = filelist;//console.log("-----------" + JSON.stringify(file));},/*** 给父组件返回表单输入的内容*//// lugetCondition() {this.$refs.FormRef.validate((valid) => {//console.log("valid===", valid);if (valid) {var formData = new FormData();this.files.forEach((item) => {if (!(!item.raw && item.url.indexOf("blob") === -1)) {formData.append("file", item.raw);}});formData.append("Ids", this.FatherIds); //属于哪条主表数据this.deleteFiles.forEach((item) => {formData.append("fileByDelete", item); //删除的集合});// //console.log(333333, this.formTypeArray);this.$emit("conditionParams", this.FormRef);this.$emit("conditionFormData", formData);} else {// this.$message("请输入内容");return false;}});},/*** 回显*/SetFilesData(FilesList) {//渲染 —— 延迟加载this.$nextTick(() => {this.files = [];this.files = FilesList;});},//#endregion//子组件中选择框事件GetSonSelectChange(datas) {if (datas.type == "选择") {this.$emit("GrandsonSelectChange", datas);}if (datas.type == "绑定") {this.$emit("GrandsonSelectChange", datas);}},},
};
</script>
<style lang="scss" scoped>
.allcheckBoxOther div:not(:first-child) {margin-left: 1% !important;:deep(.el-form-item__label-wrap) {margin-bottom: 20% !important;margin-left: 1% !important;}
}
.aa ::v-deep .el-scrollbar {height: 100px;
}
//卡片与“新增”字样之间的距离,卡片的padding-top 为0
.el-dialog--center .el-dialog__body {text-align: initial;padding: 0px calc(var(--el-dialog-padding-primary) + 5px) 30px !important;
}
</style>
2. 其他页面引用
<template><el-row :gutter="20"><el-col :span="4"><div><!-- 树形列表组件 --><el-collapse v-model="activeNames" @change="handleChange"><el-collapse-item style="text-align: center" title="字典项" name="1"><TreeViewref="TreeRef"@TreeViewMessage="GetTreeMessage":defaultSelected="defaultSelected"nodeKey="DictID"></TreeView></el-collapse-item></el-collapse></div></el-col><el-divider direction="vertical">分割线</el-divider><el-col :span="19"><div><!-- 表单按钮组件 --><div style="margin-bottom: 10px"><ButtonView @ButtonMessage="GetBtnClick"></ButtonView></div><!-- 数据表格组件 --><div style="width: 103%"><TableDialogref="tableRef"@getPage="GetDataFenYeWath"@tableMessage="GetTableMessage"@treeMessage="GetTreeMessage1"></TableDialog></div></div></el-col></el-row><!-- 弹出框,用于新增、修改 --><el-dialogv-model="dialogVisible":title="dialogTitle"width="30%"centerdraggabledestroy-on-close><!-- 表单组件 --><FromViewstyle="margin-top: -25px"ref="fromViewRef"@conditionParams="GetCondition"></FromView></el-dialog><!-- <el-backtop target=".page-component__scroll .el-scrollbar__wrap"></el-backtop> -->
</template><script>
import { provide, reactive, ref } from "@vue/runtime-core";
import { ElMessage, ElMessageBox } from "element-plus";export default {name: "Sys_DictTable",data() {return {activeNames: ["1"], //左侧的折叠用户,默认展开dialogVisible: false, //用于控制新增、编辑dialogTitle: "", //用于控制新增、编辑标题listData: [], //已选择的数据Dictid: "",defaultSelected: "",selectedDictIDs: "", //左侧树勾选的id(多选)};},setup() {//默认页大小let pageSize = 20;let pageNum = 1;let total = 0;//用于监听选中的数据列表let ConfigCondition = ref([]);//表单配置const ConfigurationCondition = () => {provide("formTypeConfig", ConfigCondition);};//表格配置const ConfigurationTable = () => {var tableHeader = []; // 设置表头 [fieldName字段名, label列名, width列宽, sortable排序]var tableDatas = []; // 表格数据// 设置表头 [fieldName字段名, label列名, width列宽, sortable排序]// 配置表头数据provide("tableHeaderConfig", tableHeader);// 配置单元格数据及属性/ 分页配置默认值provide("tableDataConfig", {tableData: tableDatas,});};//树形列表配置const ConfigurationTree = () => {provide("TreeConfig", { isTreeSeleteOrBtn: 1 });};//按钮配置const ConfigurationButton = () => {let CfgButtonDatas = [];CfgButtonDatas = [{btnName: "新增",btnType: "success",plain: true, //简约按钮类型,与UI相关SvgIconName: "Insert",},{btnName: "编辑",btnType: "primary",plain: true,SvgIconName: "Update",},{btnName: "删除",btnType: "danger",plain: true,SvgIconName: "Delete",},];provide("ButtonTypes", { type: 1 }); // 通常使用默认 1 按钮provide("ButtonConfig", { CfgButtonDatas: CfgButtonDatas });};//注册高级筛选查询配置、表单配置return {pageSize,pageNum,total,ConfigCondition, //表单数据,实时传递回ConfigurationCondition,ConfigurationTable,ConfigurationTree,ConfigurationButton,};},created() {//初始化配置this.ConfigurationCondition();this.ConfigurationTable();this.ConfigurationTree();this.ConfigurationButton();//加载表单、表格列头this.GetColDataList();// Get请求下,必须要在对象内添加params 参数,再嵌套一层,否则无法识别const param = {params: {pageSize: this.pageSize,pageNum: this.pageNum,},};// this.GetDataFenYe(param);//获取部门树形列表this.GetDepartMentGetDataTree();},mounted() {},methods: {//实时监听子组件发送的信息GetDataFenYeWath(Msg) {//重新赋值,避免新增、修改、删除操作this.pageSize = Msg.pageSize;this.pageNum = Msg.pageNum;let param = {params: Msg,};this.GetDataFenYe(param);},//获取用户数据,用户数据绑定在某个模块节点下,默认查询所有GetDepartMentGetDataTree() {//Get请求下,必须要在对象内添加params 参数,再嵌套一层,否则无法识别const param = {params: {},};this.$API.DicGetDataTree(param).then((res) => {//组件渲染// console.log("树", res.data.Data.lstSubset[0].DictID);this.defaultSelected = [res.data.Data.lstSubset[0].DictID];this.selectedDictIDs = [res.data.Data.lstSubset[0]];this.$refs.TreeRef.SetTreeDatas(res.data.Data.lstSubset);const param = {params: {pageSize: this.pageSize,pageNum: this.pageNum,DictIDs: res.data.Data.lstSubset[0].DictID,},};this.GetDataFenYe(param);}).catch((err) => {// this.$notify.error({// title: "消息提示",// message: err,// });});},//获取用户数据,用户数据绑定在某个模块节点下,默认查询所有GetColDataList() {//Get请求下,必须要在对象内添加params 参数,再嵌套一层,否则无法识别const param = {params: { param: "1" },};this.$API.DicGetColDataList(param).then((res) => {//组件渲染this.$refs.tableRef.SetDataTableHeader(res.data.Data);//直接将此数据类型贯通至组件中this.ConfigCondition = res.data.Data.lstSubset[0].Froms;}).catch((err) => {// this.$notify.error({// title: "消息提示",// message: err,// });});},//查询分页数据GetDataFenYe(param) {this.$API.DicGetDataFenYe(param).then((res) => {//组件渲染console.log("数据", res.data.Data);this.$refs.tableRef.SetDataTable(res.data.Data);}).catch((err) => {// this.$notify.error({// title: "消息提示",// message: err,// });});},/*** 新增* @param {*} data*/InsertFormDatas(data) {this.$API.DicInsertData(data).then((res) => {ElMessage({type: "success",message: res.data.Msg,});this.CloseForm();this.dialogVisible = false;const param = {params: {pageSize: this.pageSize,pageNum: this.pageNum,DictIDs: data.DictID,},};this.GetDataFenYe(param);}).catch((err) => {this.$notify.error({title: "消息提示",message: err,});});},/*** 修改* @param {} data*/UpdateFormDatas(data) {this.$API.DicUpdateData(data).then((res) => {ElMessage({type: "success",message: res.data.Msg,});this.CloseForm();this.dialogVisible = false;const param = {params: {pageSize: this.pageSize,pageNum: this.pageNum,DictIDs: data.DictID,},};this.GetDataFenYe(param);}).catch((err) => {this.$notify.error({title: "消息提示",message: err,});});},/*** 删除* @param {*} data*/DeleteFormDatas(data) {this.$API.DicDeletData(data).then((res) => {ElMessage({type: "success",message: res.data.Msg,});this.CloseForm();this.dialogVisible = false;const param = {params: {pageSize: this.pageSize,pageNum: this.pageNum,DictIDs: data.DictID,},};this.GetDataFenYe(param);}).catch((err) => {this.$notify.error({title: "消息提示",message: err,});});},//获取表单组件传递的信息,此处接收的表单乃是数据表格对应的表单GetCondition(datas) {console.log("组件:表单组件发送信息:" + datas);var formDatas = {};// datas.forEach((e, index) => {// for (let i = 0; i < e.length; i++) {// var keys = datas[index][i].prop;// var values = datas[index][i].value;// formDatas[keys] = values;// }// });const param = datas;//获取表单组件后,判断是新增/修改if (this.dialogTitle.search("新增") != -1) {this.InsertFormDatas(param);}if (this.dialogTitle.search("编辑") != -1) {console.log("param===========", param);this.UpdateFormDatas(param);}},//获取表格组件传递的信息GetTableMessage(msg) {//获取listDatas值this.listData =msg.type === "列表选择"? msg.listData: msg.type === "页码切换"? null: null;console.log("组件:表格发送信息:" + this.listData);},//获取树形组件传递的信息GetTreeMessage(val) {console.log("valaaa", val.data);let NodeList = JSON.parse(JSON.stringify(val.data));this.selectedDictIDs = val.data;let newParam = "";NodeList.forEach((element) => {newParam = newParam + element.DictID + ",";});//去掉最后一个逗号(如果不需要去掉,就不用写)if (newParam.length > 0) {newParam = newParam.substr(0, newParam.length - 1);}console.log("--------组件:树形列表解析后:" + newParam);const param = {params: {pageSize: this.pageSize,pageNum: this.pageNum,DictIDs: newParam,},};this.GetDataFenYe(param);},//折叠面板用户handleChange(val) {},//获取按钮组件消息GetBtnClick(val) {//拿到组件信息后,新增、修改弹出Dalodif (val.search("新增") != -1) {// this.CloseForm();this.$nextTick(() => {this.$refs.tableRef.ClearSelect();});//luif (JSON.parse(JSON.stringify(this.selectedDictIDs)).length != 1) {//警告this.$message({message: "请选择一条字典项进行新增操作!",type: "warning",});return;}//循环表单var newSelectData = JSON.parse(JSON.stringify(this.selectedDictIDs));this.ConfigCondition.forEach((item) => {newSelectData.forEach((dataitem) => {//循环找Keyfor (let key in dataitem) {if (item.prop == key && key == "DictID") {item.value = dataitem[key];}}// item[0].value = defaultSelected;});});console.log("ConfigCondition===", this.ConfigCondition);this.dialogVisible = true;this.dialogTitle = val + "字典项";}if (val.search("编辑") != -1) {//仅支持单条编辑if (JSON.parse(JSON.stringify(this.listData)).length != 1) {//警告this.$message({message: "请选择一条数据进行编辑操作!",type: "warning",});return;}//结构剖析var newListData = JSON.parse(JSON.stringify(this.listData));//循环表单this.ConfigCondition.forEach((item) => {newListData.forEach((dataitem) => {//循环找Keyfor (let key in dataitem) {if (item.prop == key) {item.value = dataitem[key];}}});});this.dialogVisible = true;this.dialogTitle = val + "字典项";}if (val.search("删除") != -1) {this.$nextTick(() => {var _this = this;//仅支持单条编辑if (JSON.parse(JSON.stringify(this.listData)).length != 1) {//警告this.$message({message: "请选择一条数据进行删除操作!",type: "warning",});return;}//结构剖析var newListData = JSON.parse(JSON.stringify(this.listData));ElMessageBox.confirm("确认删除这条信息吗?", "警告", {confirmButtonText: "确定",cancelButtonText: "取消",type: "warning",}).then(() => {_this.DeleteFormDatas(newListData[0]);}).catch(() => {});});}},//清空表单数据,解决选中某行时,点击新增按钮,响应ConfigCondition参数的清空以及取消选择CloseForm() {this.$nextTick(() => {//循环表单清空this.ConfigCondition.forEach((item) => {item.value = "";});//清空选择this.$refs.tableRef.ClearSelect();});},},
};
</script><style lang="scss" scoped>
.el-divider--vertical {display: inline-block;width: 1px;height: 53em;margin: 0 8px;vertical-align: middle;position: relative;border-left: 1px var(--el-border-color) var(--el-border-style);
}
</style>
相关文章:
封装form表单
目录 1. 源码 2. 其他页面引用 ps:请看完看明白再复用 1. 源码 <template><div style"width: 100%; height: 100%" class"form-condition"><!-- 普通表单 --><el-card shadow"hover" class"cardheigh…...
程序员如何利用公网远程访问查询本地硬盘【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…...
算法|Day42 动态规划10
LeetCode 121.买卖股票的最佳时机 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天…...
vmalert集成钉钉告警
vmalert通过在alert.rules中配置告警规则实现告警,告警规则语法与Prometheus兼容,依赖Alertmanager与prometheus-webhook-dingtalk实现钉钉告警,以下步骤: 1、构建vmalert 从源代码构建vmalert: git clone https://…...
深入解析 MyBatis 中的 <foreach> 标签:优雅处理批量操作与动态 SQL
在当今的Java应用程序开发中,数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架,为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中,<foreach>标签无疑是一个强大的工具,它使得…...
LeGO-Loam代码解析(二)--- Lego-LOAM的地面点分离、聚类、两步优化方法
1 地面点分离剔除方法 1.1 数学推导 LeGO-LOAM 中前端改进中很重要的一点就是充分利用了地面点,那首先自然是提取 对地面点的提取。 如上图,相邻的两个扫描线束的同一列打在地面上如 点所示,他们的垂直高度差 ,水平距离差 ,计算垂直高度差和水平高度差…...
程序员如何利用公网打造低成本轻量化的搜索和下载平台【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…...
构建可远程访问的企业内部论坛
文章目录 前言1.cpolar、PHPStudy2.Discuz3.打开PHPStudy,安装网页论坛所需软件4.进行网页运行环境的构建5.运行Discuz网页程序6.使用cpolar建立穿透内网的数据隧道,发布到公网7.对云端保留的空白数据隧道进行配置8.Discuz论坛搭建完毕 前言 企业在发展…...
2023河南萌新联赛第(六)场:河南理工大学-C 旅游
2023河南萌新联赛第(六)场:河南理工大学 https://ac.nowcoder.com/acm/contest/63602/C 文章目录 2023河南萌新联赛第(六)场:河南理工大学题意解题思路代码 题意 小C喜欢旅游,现在他要去DSH旅…...
C语言 常用工具型API ----------strchr()
函数原型 char *strchr(const char *str, int c) 参数 str-- 要被检索的 C 字符串。 c-- 在 str 中要搜索的字符。 功能 在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置 头文件 #include <string.h> 返回值 返回一…...
建造者模式的理论与实现
本文实践代码仓库:https://github.com/goSilver/my_practice 文章目录 一、定义二、作用三、实现四、总结 一、定义 建造者模式是一种创建复杂对象的设计模式。它将一个复杂对象的构建过程分解为多个简单的步骤,并且允许按照特定的顺序来构建对象。通过…...
非计算机科班如何顺利转码进入计算机领域?
文章目录 如何规划才能实现转码?计算机岗位发展前景?现阶段转码 总结 🎉欢迎来到Java学习路线专栏~探索非计算机科班如何顺利转码进入计算机领域 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客dz…...
【C++类和对象】类有哪些默认成员函数呢?(下)
文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数四. 取地址及const取地址操作符重载扩展内容 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡…...
springboot自定义banner的输出与源码解析
文章目录 一、介绍二、演示环境三、自定义banner1. 文本2. 图片3. placeholder占位符4. 关闭banner 四、源码分析1. 关闭banner2. banner模式3. banner打印器4. 打印banner① 获取banner② 打印banner 5. 版本号占位符的解析器6. 文本格式占位符的解析器7. 应用标题占位符的解析…...
LeetCode 141.环形链表
文章目录 💡题目分析💡解题思路🔔接口源码💡深度思考❓思考1❓思考2 题目链接👉 LeetCode 141.环形链表👈 💡题目分析 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中…...
Spring-Bean的生命周期
目录 生命周期汇总 细分生命周期 1.实例化 2.属性赋值(依赖注入) 3.Aware接口 4.BeanPostProcessor接口 5.初始化 6.销毁 测试验证 类结构 业务类 测试类 生命周期汇总 Spring Bean 的生命周期见下图 (一定记忆好下图&#x…...
Cat(3):客户端集成—简单案例
接下来编写一个简单的springboot与Cat整合的案例 1 新建springboot项目 首先创建一个Spring Boot的初始化工程。只需要勾选web依赖即可。 2 添加 Maven 添加依赖 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…...
虚拟机/双系统Ubuntu扩容
虚拟机Ubuntu扩容 1.需要删除所有的快照 2.扩展虚拟机磁盘大小 虚拟机(M)→设置(s)→硬盘(SCSI)→扩展磁盘容量 3.Ubuntu内调整分区大小 安装gparted分区工具:sudo apt-get install gparted 启动gparted并resize分区 4.最后最好建一个快照,不然gg了…...
Nginx搭建本地服务器,无需购买服务器即可测试vue项目打包后的效果
一.前言 本文是在windows环境(Linux环境下其实也大同小异)下基于Nginx实现搭建本地服务器,手把手教你部署vue项目。 二.Nginx入门 1)下载安装 进入Nginx官网下载,选择stable版本下的windows版本下载即可 2)…...
SpringBoot 接口调用出现乱码解决 中文乱码
SpringBoot 接口调用出现乱码解决 package com.cxjg.mvc.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springfra…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
