From a2e4d0d245b346f113d73dd2ce25f0d1bd196815 Mon Sep 17 00:00:00 2001 From: Mohan Date: Mon, 10 Aug 2026 09:03:23 +0800 Subject: [PATCH] feat(component): paste image upload in editor content --- src/views/admin/ArticleEditorView.vue | 48 ++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/views/admin/ArticleEditorView.vue b/src/views/admin/ArticleEditorView.vue index e8b97c9..d9fc050 100644 --- a/src/views/admin/ArticleEditorView.vue +++ b/src/views/admin/ArticleEditorView.vue @@ -19,6 +19,45 @@ const loading = ref(false) const saving = ref(false) const error = ref(null) const uploading = ref(false) +const pasting = ref(false) + +async function uploadFile(file: File): Promise { + try { + const resp = await mediaApi.apiMediaUploadPost(file, 'images') + const stored = resp.data.data + return stored?.url ?? null + } catch (e) { + console.error(e) + error.value = '图片上传失败' + return null + } +} + +async function onPaste(event: ClipboardEvent) { + const items = event.clipboardData?.items + if (!items) return + const files: File[] = [] + for (const item of items) { + if (item.type.startsWith('image/')) { + const file = item.getAsFile() + if (file) files.push(file) + } + } + if (files.length === 0) return + event.preventDefault() + pasting.value = true + error.value = null + try { + for (const file of files) { + const url = await uploadFile(file) + if (url) { + content.value += `\n![${file.name}](${url})\n` + } + } + } finally { + pasting.value = false + } +} async function loadTags() { try { @@ -144,7 +183,14 @@ onMounted(() => { - +