From f0c7f4845fb40bb75b2c9eb61a790e9b8ea7401a Mon Sep 17 00:00:00 2001 From: zhangwei <1504152376@qq.com> Date: 星期三, 27 八月 2025 11:25:43 +0800 Subject: [PATCH] 'feat上传附件及预览文件' --- src/views/system/dept/detail.vue | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 160 insertions(+), 19 deletions(-) diff --git a/src/views/system/dept/detail.vue b/src/views/system/dept/detail.vue index 2cb6698..1e3f834 100644 --- a/src/views/system/dept/detail.vue +++ b/src/views/system/dept/detail.vue @@ -11,6 +11,11 @@ interface Emits { (e: "backListPage"): void; } +import MaterialIconThemePdf from "~icons/material-icon-theme/pdf"; +import MaterialIconThemeImage from "~icons/material-icon-theme/image"; +import MaterialIconThemeWord from "~icons/material-icon-theme/word"; +import MaterialIconThemeTable from "~icons/material-icon-theme/table"; +import MaterialIconThemeZip from "~icons/material-icon-theme/zip"; const emit = defineEmits<Emits>(); const props = defineProps({ nowID: null @@ -23,26 +28,79 @@ defineOptions({ name: "itemdetail" }); +const convertFujianToObjects = (fujianStr, fujianNameStr) => { + // 鍒嗗壊瀛楃涓蹭负鏁扮粍骞惰繃婊ょ┖鍊� + const srcArray = fujianStr.split(",").filter(Boolean); + const nameArray = fujianNameStr.split(",").filter(Boolean); + + // 鎻愬彇鏂囦欢鍚庣紑浣滀负valu + const getFileExtension = fileName => { + const lastDotIndex = fileName.lastIndexOf("."); + // 濡傛灉娌℃湁鍚庣紑鎴栨枃浠跺悕浠ョ偣缁撳熬锛岃繑鍥炵┖瀛楃涓� + if (lastDotIndex === -1 || lastDotIndex === fileName.length - 1) { + return ""; + } + return fileName.slice(lastDotIndex + 1).toLowerCase(); + }; + + // 鏄犲皠涓虹洰鏍囧璞℃暟缁� + return srcArray.map((src, index) => { + // 纭繚鍚嶇О鏁扮粍鏈夊搴旂储寮曠殑鍏冪礌 + const name = nameArray[index]?.trim() || `鏈煡鏂囦欢${index + 1}`; + + return { + name: name, + filePath: src.trim(), + fileType: getFileExtension(name) + }; + }); +}; onMounted(async () => { let res = await getTenderOrderDetail({ id: props.nowID }); state.nowInfo = res.result; + if (state.nowInfo.fujian) { + state.nowInfo.fujianList = convertFujianToObjects( + state.nowInfo.fujian, + state.nowInfo.fujianName + ); + } }); const backListPage = () => { emit("backListPage"); }; const previewPdf = pdfUrl => { - addDialog({ - title: `棰勮pdf`, - props: {}, - width: "60%", - draggable: true, - fullscreen: deviceDetection(), - fullscreenIcon: true, - sureBtnLoading: true, - closeOnClickModal: false, - contentRenderer: () => h(pdfPreview, { pdfSrc: pdfUrl }) - // jsx 璇硶 锛堟敞鎰忓湪.vue鏂囦欢鍚敤jsx璇硶锛岄渶瑕佸湪script寮�鍚痩ang="tsx"锛� - }); + console.log(pdfUrl, "pdfUrl"); + + switch (pdfUrl.fileType) { + case "png": + showImg(pdfUrl.filePath); + break; + case "jepg": + showImg(pdfUrl.filePath); + break; + case "pdf": + addDialog({ + title: `棰勮pdf`, + props: {}, + width: "60%", + draggable: true, + fullscreen: deviceDetection(), + fullscreenIcon: true, + sureBtnLoading: true, + closeOnClickModal: false, + contentRenderer: () => h(pdfPreview, { fileInfo: pdfUrl }) + // jsx 璇硶 锛堟敞鎰忓湪.vue鏂囦欢鍚敤jsx璇硶锛岄渶瑕佸湪script寮�鍚痩ang="tsx"锛� + }); + break; + default: + window.location.href = pdfUrl.filePath; + break; + } +}; +const showPreview = ref(false); +const showImg = (name: string | number) => { + showPreview.value = true; + state.srcList = [name]; }; </script> @@ -135,6 +193,7 @@ </el-button> <el-button v-if="state.nowInfo.zhaobiaowenjian" + :disabled="!!state.nowInfo.changeOrder" type="primary" plain size="small" @@ -142,20 +201,96 @@ > 涓婁紶鍙樻洿鍏憡 </el-button> + <el-button + type="primary" + plain + size="small" + @click="changeDialog('涓婁紶鍙樻洿', state.nowInfo)" + > + 淇敼鏍囬 + </el-button> </el-form-item> <el-form-item v-if="state.nowInfo.zhaobiaowenjian" label=" "> <div class="border-1 w-[100%] rounded-md p-3"> <p>{{ state.nowInfo.projectName }}</p> - <p>涓婁紶鏃堕棿锛�2025-8-12 13:41:00</p> - <el-button + <p>涓婁紶鏃堕棿锛歿{ state.nowInfo.fabuDate }}</p> + <p + class="flex items-center cursor-pointer" + @click=" + previewPdf({ + name: state.nowInfo.zhaobiaowenjian, + filePath: state.nowInfo.zhaobiaowenjianName, + fileType: 'pdf' + }) + " + > + 鎷涙爣鏂囦欢锛�<MaterialIconThemePdf + style="font-size: 1.5em" + />{{ state.nowInfo.zhaobiaowenjianName }} + </p> + <p + v-if="state.nowInfo?.changeOrder" + class="flex items-center cursor-pointer" + @click=" + previewPdf({ + name: state.nowInfo.changeOrder.biangengwenjianName, + filePath: state.nowInfo.changeOrder.biangengwenjian, + fileType: 'pdf' + }) + " + > + 鍙樻洿鍏憡锛� + <MaterialIconThemePdf style="font-size: 1.5em" /> + {{ state.nowInfo.changeOrder.biangengwenjianName }} + </p> + <div v-if="state.nowInfo.fujian" class="flex"> + 闄勪欢锛� + <div> + <p + v-for="item in state.nowInfo.fujianList" + :key="item.src" + class="flex items-center cursor-pointer" + @click="previewPdf(item)" + > + <MaterialIconThemeImage + v-if=" + item.fileType == 'png' || + item.fileType == 'jepg' + " + style="font-size: 1.5em" + /> + <MaterialIconThemePdf + v-else-if="item.fileType == 'pdf'" + style="font-size: 1.5em" + /> + <MaterialIconThemeTable + v-else-if="item.fileType == 'xlsx'" + style="font-size: 1.5em" + /> + <MaterialIconThemeWord + v-else-if=" + item.fileType == 'doc' || + item.fileType == 'docx' + " + style="font-size: 1.5em" + /> + <MaterialIconThemeZip + v-else + style="font-size: 1.5em" + /> + {{ item.name }} + </p> + </div> + </div> + <!-- <el-button type="primary" plain size="small" @click="previewPdf(state.nowInfo.zhaobiaowenjian)" > 鐐瑰嚮棰勮 - </el-button> - <el-button + </el-button> --> + <!-- <el-button v-if="state.nowInfo?.changeOrder" type="primary" plain @@ -165,15 +300,15 @@ " > 鐐瑰嚮棰勮鍙樻洿鍏憡 - </el-button> - <el-button + </el-button> --> + <!-- <el-button type="primary" plain size="small" @click="changeDialog('涓婁紶鍙樻洿', state.nowInfo)" > 淇敼鏍囬 - </el-button> + </el-button> --> </div> </el-form-item> <!-- <el-form-item label="纾嬪晢鏂囦欢锛�"> @@ -242,6 +377,12 @@ </el-tabs> </el-card> </div> + <el-image-viewer + v-if="showPreview" + :url-list="state.srcList" + show-progress + @close="showPreview = false" + /> </div> </template> -- Gitblit v1.9.1