From 40e90fef4fc8601769cef3306c5dd8a3d5e56426 Mon Sep 17 00:00:00 2001 From: Guarp Date: Sat, 8 Mar 2025 21:24:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=B7=E6=B1=82=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=B0=8F=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Editor.vue | 52 +- src/pages/Test_page.vue | 9 +- src/pages/Tools_home.vue | 1 + src/pages/blogPages/SingleBlog_page.vue | 24 + .../RequestTester/requestTester_page.vue | 490 ++++++++++++++++++ src/router/index.js | 8 + src/store/index.js | 3 + src/utils/imageResource.js | 5 + 8 files changed, 571 insertions(+), 21 deletions(-) create mode 100644 src/pages/blogPages/SingleBlog_page.vue create mode 100644 src/pages/toolPages/RequestTester/requestTester_page.vue create mode 100644 src/utils/imageResource.js diff --git a/src/pages/Editor.vue b/src/pages/Editor.vue index fae9a74..10605f4 100644 --- a/src/pages/Editor.vue +++ b/src/pages/Editor.vue @@ -60,21 +60,15 @@ editorConfig.MENU_CONF.uploadImage = { fieldName: "image", // 后端接收字段名 async customUpload(file, insertFn) { - - const index = imagesCache.value.length; // 当前图片索引 - - // 读取图片尺寸 + const index = imagesCache.value.length; const imageSize = await getImageSize(file); - - // 存入缓存 + const objectURL = URL.createObjectURL(file); // 生成 blob URL imagesCache.value.push({ file, + url: objectURL, // 保存 blob URL originalWidth: imageSize.width, - originalHeight: imageSize.height + originalHeight: imageSize.height, }); - - // 生成临时预览 URL - const objectURL = URL.createObjectURL(file); insertFn(objectURL, `image-${index}`, objectURL); // 插入编辑器 } }; @@ -155,10 +149,30 @@ const submitBlog = async () => { let content = editorRef.value.getHtml(); // 获取 HTML 内容 - const images = [...imagesCache.value]; // 复制图片数组 + let images = [...imagesCache.value]; // 复制图片数组 - // 解析 `` 并处理宽高 + // 解析 `` 并提取所有 blob URL const imgTags = content.match(/]+>/g) || []; + const usedUrls = new Set(); // 记录编辑器中使用的 blob URL + + imgTags.forEach((imgTag) => { + const srcMatch = imgTag.match(/src=["']([^"']+)["']/); + if (srcMatch) { + usedUrls.add(srcMatch[1]); // 将使用的 blob URL 添加到 Set 中 + } + }); + + // 清理 imagesCache 中未被使用的图片 + images = images.filter((img) => { + const isUsed = usedUrls.has(img.url); + if (!isUsed) { + URL.revokeObjectURL(img.url); // 释放未使用的 blob URL + } + return isUsed; // 只保留编辑器中仍在使用的图片 + }); + + // 更新 imagesCache + imagesCache.value = images; // 创建 blob URL 到索引的映射 const urlToIndexMap = new Map(); @@ -185,8 +199,8 @@ const submitBlog = async () => { const styleMatch = imgTag.match(/style=["']([^"']+)["']/); let width = "", height = ""; - // 获取图片的原始尺寸(从 images 中根据 blob URL 匹配) - const imageData = images.find((img) => URL.createObjectURL(img.file) === src); + // 从 images 中根据保存的 url 匹配图片数据 + const imageData = images.find((img) => img.url === src); // 使用保存的 url 比较 const originalWidth = imageData?.originalWidth || 0; const originalHeight = imageData?.originalHeight || 0; @@ -217,7 +231,6 @@ const submitBlog = async () => { } }); - // 2️⃣ 构造表单数据 const formData = new FormData(); formData.append("title", title); @@ -225,20 +238,21 @@ const submitBlog = async () => { formData.append("allow_comments", allowComments); formData.append("draft", true); - images.forEach((imgData, index) => { - formData.append(`images[${index}]`, imgData.file); // 按索引存储图片 + console.log(images); + images.forEach((imgData) => { + formData.append(`images`, imgData.file); // 按索引存储图片 }); console.log(Object.fromEntries(formData.entries())); - // 3️⃣ 发送请求 + // 3️⃣ 发送请求 api.post('/blogs', formData, { headers: { "Content-Type": "multipart/form-data", }, }).then(response => { if (response.code === 0) { - swal.window('success', `提交成功, 博客id${response.blogId || '未找到blogId字段'}`); + swal.window('success', `提交成功, 博客id${response.blogId || '未找到blogId字段'}`, 'ok', '好的'); return; } swal.window('error', '提交失败', `code字段为${response.code}; 错误信息: ${response.message}`, 'ok', '好的'); diff --git a/src/pages/Test_page.vue b/src/pages/Test_page.vue index 9a77c14..77cc9f5 100644 --- a/src/pages/Test_page.vue +++ b/src/pages/Test_page.vue @@ -1,7 +1,12 @@