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(() => { - +