From de6a8266f7a47ebd0a77d99d7e7710065ea4ee5d Mon Sep 17 00:00:00 2001 From: Jafeng <2998840497@qq.com> Date: Wed, 27 May 2026 13:57:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E6=8F=90=E5=8F=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E6=98=BE=E7=A4=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form-template/form-cell/form-files.vue | 32 ++++++++++++++++--- pages/message/common-phrases.vue | 27 ++++++++++++++-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/components/form-template/form-cell/form-files.vue b/components/form-template/form-cell/form-files.vue index 4409eec..27d29de 100644 --- a/components/form-template/form-cell/form-files.vue +++ b/components/form-template/form-cell/form-files.vue @@ -40,13 +40,23 @@ const files = computed(() => { if (Array.isArray(v)) { return v .map((i) => { - if (typeof i === 'string') return { url: normalizeFileUrl(i) }; - if (i && typeof i === 'object' && i.url) return { url: normalizeFileUrl(String(i.url)) }; + if (typeof i === 'string') return { url: normalizeFileUrl(i), name: getFileNameFromUrl(i) }; + if (i && typeof i === 'object' && i.url) { + const url = normalizeFileUrl(String(i.url)); + return { + ...i, + url, + name: i.name || i.fileName || getFileNameFromUrl(url), + }; + } return null; }) .filter(Boolean); } - if (typeof v === 'string' && v) return [{ url: normalizeFileUrl(v) }]; + if (typeof v === 'string' && v) { + const url = normalizeFileUrl(v); + return [{ url, name: getFileNameFromUrl(url) }]; + } return []; }); @@ -74,7 +84,21 @@ async function add() { } const url = await chooseAndUploadImage({ count: 1 }); if (!url) return; - emitValue([...files.value, { url }]); + emitValue([...files.value, { url, name: getFileNameFromUrl(url) }]); +} + +function getFileNameFromUrl(url) { + const cleanUrl = String(url || '').split('?')[0].split('#')[0]; + const rawName = cleanUrl.split('/').pop() || ''; + if (!rawName) return ''; + + let fileName = rawName; + try { + fileName = decodeURIComponent(rawName); + } catch (error) { + fileName = rawName; + } + return fileName.replace(/^\d{10,}[-_]/, ''); } diff --git a/pages/message/common-phrases.vue b/pages/message/common-phrases.vue index 116f87c..cb08211 100644 --- a/pages/message/common-phrases.vue +++ b/pages/message/common-phrases.vue @@ -405,19 +405,40 @@ const normalizeCategory = (item, categoryType) => { const normalizeFiles = (files) => { if (!Array.isArray(files)) return []; return files - .map((item) => { - if (typeof item === "string") return { type: "image", url: normalizeFileUrl(item) }; + .map((item, index) => { + if (typeof item === "string") { + const url = normalizeFileUrl(item); + return { type: "image", url, name: getFileDisplayName({ url }, index) }; + } const url = item?.url || item?.URL || item?.download_url; if (!url) return null; return { type: item.type || "image", url: normalizeFileUrl(url), - name: item.name || item.fileName || "", + name: getFileDisplayName({ ...item, url }, index), }; }) .filter(Boolean); }; +const getFileNameFromUrl = (url) => { + const cleanUrl = String(url || "").split("?")[0].split("#")[0]; + const rawName = cleanUrl.split("/").pop() || ""; + if (!rawName) return ""; + + let fileName = rawName; + try { + fileName = decodeURIComponent(rawName); + } catch (error) { + fileName = rawName; + } + return fileName.replace(/^\d{10,}[-_]/, ""); +}; + +const getFileDisplayName = (file, index = 0) => { + return file?.name || file?.fileName || file?.originalname || getFileNameFromUrl(file?.url || file?.URL || file?.download_url) || `图片${index + 1}`; +}; + const normalizePhrase = (item, phraseType) => ({ id: item._id || item.id, cateId: item.cateId || item.categoryId,