From add04dce2ad833ecbb7495a641f42fb835ddff62 Mon Sep 17 00:00:00 2001 From: 董国庆 <364620639@qq.com> Date: 星期三, 14 五月 2025 15:24:00 +0800 Subject: [PATCH] 新增实验调度逻辑 --- laboratory/src/components/DynamicComponent/index.vue | 163 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 146 insertions(+), 17 deletions(-) diff --git a/laboratory/src/components/DynamicComponent/index.vue b/laboratory/src/components/DynamicComponent/index.vue index 08b2099..ac328f7 100644 --- a/laboratory/src/components/DynamicComponent/index.vue +++ b/laboratory/src/components/DynamicComponent/index.vue @@ -30,7 +30,7 @@ <div v-if="item.type == 'richText'"> <AiEditor :ref="`editor_${item.id}`" - v-model="item.data.content" + :value="item.data.content" height="200px" placeholder="请输入内容..." /> @@ -98,20 +98,23 @@ </div> <!-- 图片上传 --> <div v-else-if="item.type == 'imageUpload'"> - <el-upload - action="#" - :file-list="item.data.imageList" - :on-change="(file, fileList) => handleImageChange(idx, fileList)" - :on-success=" - (res, file, fileList) => - handleImageSuccess(res, file, fileList, idx) - " - list-type="picture-card" - > - <i class="el-icon-plus"></i> - <div class="upload-text">上传图片</div> - </el-upload> - <div class="uploaf-notice">支持.jpg .png格式</div> + <div class="image-upload-container"> + <el-upload + action="#" + :file-list="item.data.imageList" + :on-change="(file, fileList) => handleImageChange(idx, fileList)" + :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, idx)" + :auto-upload="true" + :http-request="() => {}" + :before-upload="beforeImageUpload" + list-type="picture-card" + class="image-uploader" + > + <i class="el-icon-plus"></i> + <div class="upload-text">上传图片</div> + </el-upload> + <div class="uploaf-notice">支持.jpg .png格式</div> + </div> </div> <img src="@/assets/public/delete.png" @@ -140,6 +143,7 @@ <addTableHeader :visible.sync="tableHeaderDialog.visible" + :participants="participants" @confirm="confirmAddHeader" ></addTableHeader> <addTableData @@ -174,6 +178,10 @@ type: String, default: "", }, + participants: { + type: Array, + default: () => [] + } }, data() { return { @@ -197,6 +205,15 @@ }, methods: { addComponent(type) { + // 如果是添加自定义表格,需要检查是否已选择实验调度 + if (type === "customTable") { + if (!this.participants || this.participants.length === 0) { + this.$message.warning('请先选择实验调度'); + this.showAddDialog = false; + return; + } + } + this.showAddDialog = false; const id = Date.now() + Math.random(); let data = {}; @@ -207,6 +224,63 @@ console.log(type, "111111111111111", this.components); this.components.push({ id, type, data }); + }, + submit() { + // 获取所有组件的数据 + const data = this.components.map(component => { + let componentData = null; + + switch (component.type) { + case 'richText': + const editorRef = this.$refs[`editor_${component.id}`]; + const editor = Array.isArray(editorRef) ? editorRef[0] : editorRef; + console.log('editor ref:', editor); + const content = editor ? editor.getContent() : ''; + componentData = content && content !== '<p></p>' ? content : ''; + break; + case 'customTable': + // 获取表格数据 + componentData = { + headers: component.data.headers, + rows: component.data.rows + }; + break; + case 'fileUpload': + // 获取文件列表 + componentData = component.data.fileList; + break; + case 'imageUpload': + // 获取图片列表 + componentData = component.data.imageList; + break; + } + + return { + type: component.type, + data: componentData + }; + }); + + // 触发 submit 事件,将数据传递给父组件 + this.$emit('submit', data); + }, + confirmAddRow(formData) { + const { idx, rowIndex, isEdit } = this.rowDialog; + if (isEdit) { + // 编辑模式 + this.components[idx].data.rows[rowIndex] = { + ...formData, + updateTime: new Date().toLocaleString() + }; + } else { + // 新增模式 + this.components[idx].data.rows.push({ + ...formData, + updateTime: new Date().toLocaleString() + }); + } + this.rowDialog.visible = false; + this.rowDialog.form = {}; }, removeComponent(idx) { this.components.splice(idx, 1); @@ -299,15 +373,47 @@ .catch(() => {}); }, handleFileChange(idx, fileList) { + // 为每个文件添加默认的URL和名称 + fileList = fileList.map(file => { + if (!file.url) { + file.url = 'https://picsum.photos/200/200'; + } + if (!file.name) { + file.name = '默认文件.txt'; + } + return file; + }); this.components[idx].data.fileList = fileList; }, handleImageChange(idx, fileList) { + // 为每个文件添加默认的URL + fileList = fileList.map(file => { + if (!file.url) { + file.url = 'https://picsum.photos/200/200'; + } + return file; + }); this.components[idx].data.imageList = fileList; }, handleImageSuccess(res, file, fileList, idx) { - // 假设后端返回的图片地址在 res.url - file.url = res.url; + // 使用默认图片URL + file.url = 'https://picsum.photos/200/200'; this.components[idx].data.imageList = fileList; + }, + beforeImageUpload(file) { + const isJPG = file.type === 'image/jpeg'; + const isPNG = file.type === 'image/png'; + const isLt2M = file.size / 1024 / 1024 < 2; + + if (!isJPG && !isPNG) { + this.$message.error('上传图片只能是 JPG 或 PNG 格式!'); + return false; + } + if (!isLt2M) { + this.$message.error('上传图片大小不能超过 2MB!'); + return false; + } + return true; }, }, }; @@ -351,6 +457,29 @@ cursor: pointer; } } +.image-uploader{ + display: flex; + ::v-deep .el-upload-list__item{ +width: 104px !important; +height: 104px !important; + } +} +.image-upload-container { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + gap: 10px; +} + +::v-deep .image-uploader { + .el-upload--picture-card { + margin: 0; + } + .el-upload-list--picture-card .el-upload-list__item { + margin: 0 10px 10px 0; + } +} + ::v-deep .el-upload { width: 104px; height: 104px; -- Gitblit v1.7.1