From eca5b11ea441fa1f68d0b9abe466609c603e85b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Fri, 28 Aug 2026 00:26:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E9=97=AD=E7=8E=AF=E2=80=94=E2=80=94OSS=20?= =?UTF-8?q?=E9=9D=99=E6=80=81=E5=8F=91=E5=B8=83=E4=B8=8E=E8=A7=82=E4=BC=97?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 21 ++ src/components/editor/Toolbar.vue | 5 + src/components/modals/OssSettingsModal.vue | 11 +- src/core/assets.ts | 2 +- src/core/bg.ts | 72 +++++++ src/core/share.ts | 107 ++++++++++ src/core/store.ts | 64 +----- src/core/types.ts | 3 + src/viewer/ViewerApp.vue | 217 +++++++++++++++++++++ src/viewer/main.ts | 4 + viewer.html | 16 ++ vite.config.ts | 6 + 12 files changed, 469 insertions(+), 59 deletions(-) create mode 100644 src/core/bg.ts create mode 100644 src/core/share.ts create mode 100644 src/viewer/ViewerApp.vue create mode 100644 src/viewer/main.ts create mode 100644 viewer.html diff --git a/src/App.vue b/src/App.vue index 9e4f55b..1450411 100644 --- a/src/App.vue +++ b/src/App.vue @@ -7,6 +7,8 @@ import { store } from './core/store' import { readAsDataURL, fileToImageElement } from './core/importer' import { checkImageQuota } from './core/ai' import { putAsset, isOssEnabled } from './core/assets' +import { publishDeck } from './core/share' +import { appAlert } from './core/dialog' import { isTauri, readLocalFiles } from './core/bridge' import AppDialog from './components/common/AppDialog.vue' import FileDock from './components/common/FileDock.vue' @@ -167,6 +169,24 @@ function onHome() { mode.value = 'home' } +/* ---------- 分享:发布 deck 到 OSS,生成公开只读链接 ---------- */ +async function onShare() { + try { + const { url } = await publishDeck() + try { await navigator.clipboard.writeText(url) } catch (e) { /* 剪贴板失败不阻断展示 */ } + await appAlert('分享链接已生成' + '(已复制到剪贴板)', url) + } catch (e: any) { + const msg = e?.message || String(e) + // 未配置云存储时引导到设置页 + if (msg.includes('云存储') || msg.includes('OSS')) { + await appAlert('无法分享', msg) + ossVisible.value = true + } else { + await appAlert('分享失败', msg) + } + } +} + function onImportClose() { importVisible.value = false if (mode.value === 'home') { @@ -469,6 +489,7 @@ onUnmounted(() => { @export-json="onExportJson" @import-materials="onImportMaterials" @home="onHome" + @share="onShare" @import-json="onImportJson" @export-pdf="onExportPdf" /> diff --git a/src/components/editor/Toolbar.vue b/src/components/editor/Toolbar.vue index a567722..cd2c2de 100644 --- a/src/components/editor/Toolbar.vue +++ b/src/components/editor/Toolbar.vue @@ -20,6 +20,7 @@ const emit = defineEmits<{ (e: 'import-materials'): void (e: 'export-pdf'): void (e: 'home'): void + (e: 'share'): void }>() const themeKeys = Object.keys(themes) @@ -71,6 +72,7 @@ function fileAction(a: string) { case 'import-materials': emit('import-materials'); break case 'import-json': emit('import-json'); break case 'export-pdf': emit('export-pdf'); break + case 'share': emit('share'); break case 'reset': action('reset'); break } } @@ -148,6 +150,9 @@ defineProps<{ disabledActions?: string[] }>() +