<template> <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" custom-class="dict-dialog" append-to-body> <el-form ref="dataForm" :rules="rules" :model="dictForm" label-position="right" label-width="80px"> <el-row :gutter="20"> <el-col :span="9"> <el-form-item label="字典编码" prop="dictCode"> <el-input v-model.trim="dictForm.dictCode" type="text" placeholder="必填" /> </el-form-item> </el-col> <el-col :span="9"> <el-form-item label="字典名称" prop="dictName"> <el-input v-model.trim="dictForm.dictName" type="text" placeholder="必填" /> </el-form-item> </el-col> <el-col :span="5" :offset="1"> <el-button type="primary" @click="addDetail"> 添加 </el-button> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="18"> <el-form-item label="字典描述" prop="tips"> <el-input v-model.trim="dictForm.dictTips" type="text" placeholder="非必填" /> </el-form-item> </el-col> </el-row> <div class="divider" /> <el-row v-for="(detail,index) in details" :key="index" :gutter="10"> <el-col :span="6"> <el-form-item :required="true" label="值"> <el-input v-model="detail.value" style="width:100%" placeholder="必填" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item :required="true" label="名称"> <el-input v-model="detail.name" style="width:100%" placeholder="必填" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item :required="true" label="排序"> <el-input-number v-model.number="detail.num" style="width:100%" placeholder="必填" /> </el-form-item> </el-col> <el-col :span="2" :offset="1"> <el-button type="primary" @click="deleteDetail(index)"> 删除 </el-button> </el-col> </el-row> </el-form> <div slot="footer" class="dialog-footer"> <el-button :loading="btnLoading" type="primary" @click="saveData"> 保存 </el-button> <el-button @click="cancel"> 取消 </el-button> </div> </el-dialog> </template> <script> import { addDict, updateDict } from '@/api/system/dict' export default { name: 'EditDict', data() { return { dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update dictForm: { dictId: '', dictCode: '', dictName: '', dictTips: '', dictValues: '' }, // 表单 details: [], // 字典详情解构 textMap: { update: '编辑', create: '新增' }, // 表头显示标题 btnLoading: false, // 保存按钮的加载中状态 rules: { dictCode: [{ required: true, message: '字典编码不能为空', trigger: ['blur'] }], dictName: [{ required: true, message: '字典名称不能为空', trigger: ['blur'] }], value: [{ required: true, message: '值不能为空', trigger: ['blur'] }], name: [{ required: true, message: '名称不能为空', trigger: ['blur'] }], num: [{ required: true, message: '排序不能为空' }, { type: 'number', message: '必须为数字值' }] } // 前端校验规则 } }, methods: { // 初始化对话框 initDialog: function(dialogStatus, row = null) { this.dialogStatus = dialogStatus this.dialogFormVisible = true this.btnLoading = false // this.fetchPcode() if (dialogStatus === 'create') { // 如果是新增,清除验证 this.resetForm() this.$nextTick(() => { this.$refs['dataForm'].clearValidate() }) } else if (dialogStatus === 'update') { // 如果是修改,将row中数据填写到输入框中 this.dictForm = { dictId: row.id, dictCode: row.code, dictName: row.name, dictTips: row.tips, dictValues: row.detail } this.stringToArray() } }, // 字典详情字符串转数组 stringToArray() { const detailArr = this.dictForm.dictValues.split(';') this.details = [] for (const detail of detailArr) { const detailItem = detail.split(':') const item = { value: detailItem[0], name: detailItem[1], num: detailItem[2] } this.details.push(item) } }, arrayToString() { let detailArray = '' const details = this.details let passFlag = true if (details.length === 0) { passFlag = false this.$message.warning('至少有一个字典值') return passFlag } details.forEach((detail, index) => { if (detail.value === '' || detail.name === '') { passFlag = false } detailArray += detail.value + ':' + detail.name + ':' + detail.num if (index !== (details.length - 1)) { detailArray += ';' } }) if (!passFlag) { this.$message.warning('请将字典值和名称都填全后再进行保存') } this.dictForm.dictValues = detailArray return passFlag }, // 重置表单 resetForm() { this.dictForm = { dictId: '', dictCode: '', dictName: '', dictTips: '', dictValues: '' } this.details = [] }, // 保存数据 saveData: function() { const flag = this.arrayToString() if (flag) { if (this.dialogStatus === 'update') { this.updateData() } else if (this.dialogStatus === 'create') { this.createData() } } }, addDetail() { this.details.push({ value: '', name: '', num: '' }) }, deleteDetail(index) { this.details.splice(index, 1) }, // 新增数据 createData: function() { this.$refs['dataForm'].validate((valid) => { console.log(this.dictForm) if (valid) { this.btnLoading = true addDict(this.dictForm).then(response => { if (response.code === 200) { this.$confirm('新增成功,是否继续新增?', '提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'info' }).then(() => { this.btnLoading = false this.resetForm() this.$nextTick(() => { this.$refs['dataForm'].clearValidate() }) }).catch(() => { this.$emit('watchChild') this.dialogFormVisible = false }) } }).catch(_ => { // 异常情况,loading置为false this.btnLoading = false }) } }) }, // 修改数据 updateData: function() { this.$refs['dataForm'].validate((valid) => { if (valid) { this.btnLoading = true updateDict(this.dictForm).then(response => { if (response.code === 200) { this.$message.success('修改成功') this.$emit('watchChild') this.dialogFormVisible = false } }).catch(_ => { // 异常情况,loading置为false this.btnLoading = false }) } }) }, cancel: function() { this.dialogFormVisible = false this.$emit('watchChild') } } } </script> <style rel="stylesheet/scss" lang="scss" > .dict-dialog{ width:900px; .divider{ height: 5px; border-bottom: 1px dashed #e7eaec; margin-bottom: 15px; } } </style>