From 6390fa18f5c2df1158a0d664786797b0e8b2fbf9 Mon Sep 17 00:00:00 2001
From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com>
Date: 星期三, 15 十月 2025 13:10:16 +0800
Subject: [PATCH] 提交
---
src/views/components/formDialog.vue | 48 ++++++++++++------------------------------------
1 files changed, 12 insertions(+), 36 deletions(-)
diff --git a/src/views/components/formDialog.vue b/src/views/components/formDialog.vue
index 3cb0e76..fdb0322 100644
--- a/src/views/components/formDialog.vue
+++ b/src/views/components/formDialog.vue
@@ -16,7 +16,7 @@
size="default"
ref="formRef"
:rules="state.formRules"
- label-width="150px"
+ label-width="160px"
>
<template v-for="(item, index) in config.formItems" :key="index">
<el-divider v-if="item.type === 'divider'" content-position="left">{{item.content}}</el-divider>
@@ -201,13 +201,11 @@
title: '',
formData: {},
formRules: {},
- // 文件上传相关
uploadUrl: props.uploadConfig.uploadUrl,
header: {
Authorization: getToken()
},
- fileLists: {}, // 存储各上传字段的文件列表
- // 数据列表
+ fileLists: {},
companyList: [],
deptList: [],
userList: [],
@@ -215,34 +213,29 @@
dialogImageUrl: ''
})
-// 初始化表单数据
const initFormData = () => {
const formData = {}
state.fileLists = {}
- // 初始化普通表单项
props.config.formItems?.forEach(item => {
- // 对于多选选择框,默认值为空数组
+
if (item.type === 'select' && item.multiple) {
formData[item.prop] = Array.isArray(item.defaultValue) ? item.defaultValue : []
} else {
formData[item.prop] = item.defaultValue !== undefined ? item.defaultValue : null
}
- // 初始化文件上传字段的文件列表
if (item.type === 'upload') {
state.fileLists[item.prop] = []
}
})
- // 初始化表单规则
const formRules = {}
props.config.formItems?.forEach(item => {
if (item.rules) {
formRules[item.prop] = item.rules
}
- // 为文件上传字段添加自定义验证规则
if (item.type === 'upload' && item.required) {
formRules[item.prop] = formRules[item.prop] || []
formRules[item.prop].push({
@@ -258,7 +251,6 @@
})
}
- // 为多选选择框添加自定义验证规则
if (item.type === 'select' && item.multiple && item.required) {
formRules[item.prop] = formRules[item.prop] || []
formRules[item.prop].push({
@@ -278,16 +270,13 @@
state.formRules = formRules
}
-// 获取选项数据
const getOptions = (options) => {
if (!options) return []
- // 如果是函数,执行函数获取选项
if (typeof options === 'function') {
return options()
}
- // 如果是数组,直接返回
if (Array.isArray(options)) {
return options
}
@@ -298,17 +287,14 @@
const getCascaderOptions = (item) => {
if (!item.options) return []
- // 如果是函数,执行函数获取选项
if (typeof item.options === 'function') {
return item.options()
}
- // 如果是数组,直接返回
if (Array.isArray(item.options)) {
return item.options
}
- // 如果是响应式引用
if (item.options && typeof item.options === 'object' && 'value' in item.options) {
return item.options.value
}
@@ -316,7 +302,6 @@
return []
}
-// 文件上传前的校验
const beforeUpload = (rawFile, item) => {
const maxSize = item.maxSize || 5
if (rawFile.size / 1024 / 1024 > maxSize) {
@@ -326,12 +311,10 @@
return true
}
-// 文件上传成功处理
const handleUploadSuccess = (res, uploadFile, prop) => {
if (res.code === 200) {
ElMessage.success('上传成功')
} else {
- // 上传失败,移除文件
state.fileLists[prop] = state.fileLists[prop].filter(file => file.uid !== uploadFile.uid)
ElMessage.warning(res.message || '文件上传失败')
}
@@ -340,7 +323,6 @@
}).join(',')
}
-// 文件移除处理
const handleRemove = async (file, uploadFiles, prop) => {
try {
if(file.uid){
@@ -363,12 +345,10 @@
state.dialogVisible = true
}
-// 超出文件数量限制提示
const showTip = () => {
ElMessage.warning('超出文件上传数量')
}
-// 处理事件
const handleEvent = async (eventName, value) => {
try {
if (eventName === 'getUserListByRole' && props.dataLoader.getUserListByRole) {
@@ -390,12 +370,11 @@
}
}
-// 打开对话框
const openDialog = async (type, initialData) => {
state.title = type === 'add' ? '新增' : type === 'edit' ? '编辑' : type === 'rectify' ? '整改' : '查看'
- // 初始化表单数据
+
initFormData()
- // 加载初始数据
+
try {
if (props.dataLoader.loadInitialData) {
const initialData = await props.dataLoader.loadInitialData(id)
@@ -405,11 +384,10 @@
console.error('无初始数据:', error)
}
- // 如果有初始数据,填充表单
if (initialData) {
Object.keys(state.formData).forEach(key => {
if (key in initialData) {
- // 对于多选字段,确保值是数组
+
const item = props.config.formItems.find(i => i.prop === key)
if (item && item.type === 'select' && item.multiple) {
state.formData[key] = Array.isArray(initialData[key]) ? initialData[key] : (initialData[key] ? [initialData[key]] : [])
@@ -419,7 +397,7 @@
}
})
state.formData.id = initialData.id || null
- // 初始化文件上传字段的文件列表
+
props.config.formItems?.forEach(item => {
if (item.type === 'upload' && initialData[item.prop]) {
state.fileLists[item.prop] = [{
@@ -448,10 +426,9 @@
try {
const valid = await formRef.value.validate()
if (valid) {
- // 准备提交数据
+
const submitData = { ...state.formData }
- // 对于多选字段,如果是空数组则转为null(根据后端需求)
props.config.formItems?.forEach(item => {
if (item.type === 'select' && item.multiple &&
Array.isArray(submitData[item.prop]) &&
@@ -460,7 +437,6 @@
}
})
- // 触发提交事件
emit('submit', submitData, state.title)
}
} catch (error) {
@@ -469,20 +445,20 @@
}
}
-// 关闭对话框
+
const closeDialog = () => {
formRef.value.clearValidate()
formRef.value.resetFields()
dialogVisible.value = false
}
-// 暴露方法给父组件
+
defineExpose({
openDialog,
closeDialog
})
-// 初始化
+
initFormData()
</script>
@@ -499,7 +475,7 @@
margin-top: 7px;
}
-// 多选选择框样式调整
+
:deep(.el-select__tags) {
white-space: nowrap;
overflow: hidden;
--
Gitblit v1.9.2