|
|
@ -0,0 +1,233 @@ |
|
|
|
|
|
<template> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div v-for="(item, index) in formConfig" :key="index"> |
|
|
|
|
|
<template v-if="item.type === 'cardItem'"> |
|
|
|
|
|
<div class="grid-container"> |
|
|
|
|
|
<div v-for="(sItem, sIndex) in item.config" class="form-item" :class="sItem.span == 1 ? 'full-row' : ''" |
|
|
|
|
|
:key="sIndex"> |
|
|
|
|
|
<template v-if="sItem.type === 'input'"> |
|
|
|
|
|
<div class="form-title">{{ sItem.label }}</div> |
|
|
|
|
|
<el-input :maxlength="sItem.maxlength || 30" :disabled="sItem.disabled" |
|
|
|
|
|
v-model="formFields[sIndex]" :class="sItem.borderType | getBorderType" |
|
|
|
|
|
:placeholder="sItem.placeholder ? sItem.placeholder : ('请输入' + sItem.label)" /> |
|
|
|
|
|
</template> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</template> |
|
|
|
|
|
<template v-else-if="item.type === 'conditionItem'"> |
|
|
|
|
|
<div class="form-item "> |
|
|
|
|
|
<div class="form-title fs-16">{{ item.label }}</div> |
|
|
|
|
|
<div v-for="(sItem, sIndex) in item.config" class="flex"> |
|
|
|
|
|
<div class="flex1 mr-24"> |
|
|
|
|
|
<div class="form-title">{{ sItem.label }}</div> |
|
|
|
|
|
<div class="flex"> |
|
|
|
|
|
<el-select class="flex1" v-model="formFields[sIndex]" multiple placeholder="请选择"> |
|
|
|
|
|
<el-option |
|
|
|
|
|
v-for="op in sItem.options" |
|
|
|
|
|
:key="op.value" |
|
|
|
|
|
:label="op.label" |
|
|
|
|
|
:value="op.value"> |
|
|
|
|
|
</el-option> |
|
|
|
|
|
</el-select> |
|
|
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="flex1" v-show = "isShowOther(formFields[sIndex])"> |
|
|
|
|
|
<div class="form-title">其他</div> |
|
|
|
|
|
<div class="flex"> |
|
|
|
|
|
<el-input v-model="formFields[sItem.otherCode]" :class="sItem.borderType | getBorderType"></el-input> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</template> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
|
export default { |
|
|
|
|
|
components: { |
|
|
|
|
|
}, |
|
|
|
|
|
props: { |
|
|
|
|
|
formConfig: { |
|
|
|
|
|
type: Array, |
|
|
|
|
|
value: () => [], |
|
|
|
|
|
}, |
|
|
|
|
|
formData: { |
|
|
|
|
|
type: Object, |
|
|
|
|
|
value: () => ({}) |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
data() { |
|
|
|
|
|
return { |
|
|
|
|
|
formFields: {},//表单双休绑定字段 |
|
|
|
|
|
allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写 |
|
|
|
|
|
}; |
|
|
|
|
|
}, |
|
|
|
|
|
watch: { |
|
|
|
|
|
immediate: true, |
|
|
|
|
|
formData: { |
|
|
|
|
|
handler(v) { |
|
|
|
|
|
this.handleFormField(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
mounted() { |
|
|
|
|
|
this.handleFormField(); |
|
|
|
|
|
}, |
|
|
|
|
|
filters: { |
|
|
|
|
|
getBorderType(type) { |
|
|
|
|
|
const typeObj = { |
|
|
|
|
|
orange: "orange-border", |
|
|
|
|
|
green: "green-border", |
|
|
|
|
|
blue: "blue-border", |
|
|
|
|
|
} |
|
|
|
|
|
return typeObj[type] || "" |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
}, |
|
|
|
|
|
methods: { |
|
|
|
|
|
isShowOther(v = []){ |
|
|
|
|
|
return v.includes(-1); |
|
|
|
|
|
}, |
|
|
|
|
|
//根据formConifg回填form表单数据 |
|
|
|
|
|
handleFormField() { |
|
|
|
|
|
const result = {}; |
|
|
|
|
|
let config = {}; |
|
|
|
|
|
const { formConfig, formData } = this; |
|
|
|
|
|
formConfig.forEach((item) => { |
|
|
|
|
|
if (item.config) { |
|
|
|
|
|
config = { ...config, ...item.config } |
|
|
|
|
|
Object.keys(item.config).forEach(key => { |
|
|
|
|
|
const currentConfig = item.config[key]; |
|
|
|
|
|
result[key] = formData[key]; |
|
|
|
|
|
if(currentConfig.otherCode){//如果有其它的字段需要赋值给formData |
|
|
|
|
|
const {otherCode} = currentConfig; |
|
|
|
|
|
result[otherCode] = formData[otherCode] |
|
|
|
|
|
config[otherCode] = {label:"其他",type:"input"} |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
console.log(item.config,"config") |
|
|
|
|
|
if(item.config?.otherCode){ |
|
|
|
|
|
config[item.config?.otherCode] = item.config?.otherCode; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
this.formFields = result; |
|
|
|
|
|
this.allFieldsConfig = config; |
|
|
|
|
|
console.log(config, "allFieldsConfig") |
|
|
|
|
|
}, |
|
|
|
|
|
getFormData() { |
|
|
|
|
|
const { formFields, allFieldsConfig } = this; |
|
|
|
|
|
for (const key in formFields) { |
|
|
|
|
|
if (!formFields[key]) { |
|
|
|
|
|
const o = allFieldsConfig[key]; |
|
|
|
|
|
let prefix = ""; |
|
|
|
|
|
if (o.type === "input") { |
|
|
|
|
|
prefix = "填写" |
|
|
|
|
|
} else { |
|
|
|
|
|
prefix = "选择" |
|
|
|
|
|
} |
|
|
|
|
|
this.$message.error(`${o.label}还未${prefix}请${prefix}后再提交`); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return formFields; |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
} |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" > |
|
|
|
|
|
.grid-container { |
|
|
|
|
|
display: grid; |
|
|
|
|
|
grid-template-columns: repeat(2, 1fr); |
|
|
|
|
|
/* 默认2列 */ |
|
|
|
|
|
gap: 0 24px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.form-item { |
|
|
|
|
|
background: #fff; |
|
|
|
|
|
padding: 20px; |
|
|
|
|
|
border-radius: 8px; |
|
|
|
|
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); |
|
|
|
|
|
margin-top: 24px; |
|
|
|
|
|
padding: 24px; |
|
|
|
|
|
border-radius: 5px 5px; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* 或者使用 span 语法 */ |
|
|
|
|
|
.full-row { |
|
|
|
|
|
grid-column: span 2; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.form-title { |
|
|
|
|
|
margin-bottom: 12px; |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
font-weight: normal; |
|
|
|
|
|
color:#606266; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.orange-border { |
|
|
|
|
|
input { |
|
|
|
|
|
border-color: #f9c588; |
|
|
|
|
|
|
|
|
|
|
|
&:focus { |
|
|
|
|
|
border-color: #f9c588; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
|
|
|
border-color: #f9c588; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.green-border { |
|
|
|
|
|
input { |
|
|
|
|
|
border-color: green; |
|
|
|
|
|
|
|
|
|
|
|
&:focus { |
|
|
|
|
|
border-color: green; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
|
|
|
border-color: green; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.blue-border { |
|
|
|
|
|
input { |
|
|
|
|
|
border-color: #4ea2ff; |
|
|
|
|
|
|
|
|
|
|
|
&:focus { |
|
|
|
|
|
border-color: #4ea2ff; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
|
|
|
border-color: #4ea2ff; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
.fs-16{ |
|
|
|
|
|
font-size: 0.96rem; |
|
|
|
|
|
font-weight: bold; |
|
|
|
|
|
color:#464647 |
|
|
|
|
|
} |
|
|
|
|
|
.flex1{ |
|
|
|
|
|
flex:1; |
|
|
|
|
|
} |
|
|
|
|
|
.flex{ |
|
|
|
|
|
display: flex; |
|
|
|
|
|
} |
|
|
|
|
|
.mr-24{ |
|
|
|
|
|
margin-right: 24px; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |