From 67b1b78f1f4c9007a7ad1068b187051011042cdc Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Thu, 16 Jul 2026 13:28:46 +0800 Subject: [PATCH] feat(aigc): add shared work page and AIGC sharing - add new shared work page to view shared AIGC generated images and videos - add createAigcGeneratorTaskShare and getAigcGeneratorTaskShareDetail APIs - update ResultActions component to add share preparation state and native share support - remove deprecated SharePreviewPopup component and its associated styles - update AIGC detail page to generate share keys and adjust native share metadata - register the new shared work page in pages.json --- .../detail/components/ResultActions/index.vue | 21 +- .../components/SharePreviewPopup/index.vue | 99 --------- .../SharePreviewPopup/styles/index.scss | 200 ------------------ src/pages-aigc/detail/detail.vue | 57 +++-- src/pages-aigc/sharedWork/sharedWork.vue | 118 +++++++++++ src/pages-aigc/sharedWork/styles/index.scss | 116 ++++++++++ src/pages.json | 6 + src/request/api/AigcApi.js | 10 + 8 files changed, 313 insertions(+), 314 deletions(-) delete mode 100644 src/pages-aigc/detail/components/SharePreviewPopup/index.vue delete mode 100644 src/pages-aigc/detail/components/SharePreviewPopup/styles/index.scss create mode 100644 src/pages-aigc/sharedWork/sharedWork.vue create mode 100644 src/pages-aigc/sharedWork/styles/index.scss diff --git a/src/pages-aigc/detail/components/ResultActions/index.vue b/src/pages-aigc/detail/components/ResultActions/index.vue index 331804f..2f17258 100644 --- a/src/pages-aigc/detail/components/ResultActions/index.vue +++ b/src/pages-aigc/detail/components/ResultActions/index.vue @@ -4,7 +4,10 @@ {{ saving ? "保存中..." : "保存图片" }} - + @@ -14,15 +17,29 @@ const props = defineProps({ type: Boolean, default: false, }, + shareReady: { + type: Boolean, + default: false, + }, + sharePreparing: { + type: Boolean, + default: false, + }, }); -const emit = defineEmits(["save", "share"]); +const emit = defineEmits(["save", "prepare-share"]); const handleSave = () => { if (!props.saving) { emit("save"); } }; + +const handleShare = () => { + if (!props.shareReady && !props.sharePreparing) { + emit("prepare-share"); + } +}; diff --git a/src/pages-aigc/detail/components/SharePreviewPopup/styles/index.scss b/src/pages-aigc/detail/components/SharePreviewPopup/styles/index.scss deleted file mode 100644 index 7232426..0000000 --- a/src/pages-aigc/detail/components/SharePreviewPopup/styles/index.scss +++ /dev/null @@ -1,200 +0,0 @@ -.share-preview-popup { - width: calc(100vw - 28px); - max-width: 420px; - max-height: calc(100vh - 56px); - overflow-y: auto; - padding: 18px 16px 14px; - border: 1px solid rgba(73, 143, 205, 0.42); - border-radius: 20px; - background: - radial-gradient(90% 72% at 100% 0%, rgba(32, 207, 117, 0.15), rgba(32, 207, 117, 0) 60%), - linear-gradient(180deg, #dceeff 0%, #cfe7fb 100%); - box-shadow: 0 22px 54px rgba(16, 44, 73, 0.24); - box-sizing: border-box; -} - -.share-preview-badge, -.share-preview-heading, -.share-preview-title, -.share-preview-variant, -.share-preview-brand-name, -.share-preview-brand-type, -.share-preview-footer-label, -.share-preview-footer-action { - display: block; -} - -.share-preview-badge { - width: max-content; - margin: 0 auto; - padding: 3px 9px; - border-radius: 999px; - background: rgba(32, 207, 117, 0.13); - color: #0e9f61; - font-size: 10px; - line-height: 16px; - font-weight: 900; -} - -.share-preview-heading { - margin-top: 7px; - color: #173a5f; - font-size: 20px; - line-height: 26px; - font-weight: 900; - text-align: center; -} - -.share-preview-card { - margin-top: 12px; - overflow: hidden; - border: 1px solid rgba(73, 143, 205, 0.26); - border-radius: 12px; - background: rgba(255, 255, 255, 0.62); - box-shadow: 0 10px 24px rgba(23, 58, 95, 0.08); -} - -.share-preview-brand { - display: flex; - align-items: center; - gap: 10px; - padding: 12px 12px 7px; -} - -.share-preview-brand-mark { - flex: 0 0 30px; - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - background: #20cf75; - color: #173a5f; - font-size: 15px; - line-height: 30px; - font-weight: 900; -} - -.share-preview-brand-copy { - min-width: 0; -} - -.share-preview-brand-name { - overflow: hidden; - color: #173a5f; - font-size: 13px; - line-height: 18px; - font-weight: 900; - text-overflow: ellipsis; - white-space: nowrap; -} - -.share-preview-brand-type { - margin-top: 1px; - color: #6b8299; - font-size: 9px; - line-height: 12px; - font-weight: 700; -} - -.share-preview-title { - overflow: hidden; - padding: 4px 12px 0; - color: #172033; - font-size: 17px; - line-height: 23px; - font-weight: 900; - text-overflow: ellipsis; - white-space: nowrap; -} - -.share-preview-variant { - padding: 1px 12px 10px; - color: #4e7394; - font-size: 11px; - line-height: 16px; - font-weight: 800; -} - -.share-preview-image { - width: 100%; - height: 232px; - display: block; - background: #e8f2f8; -} - -.share-preview-image-placeholder { - display: flex; - align-items: center; - justify-content: center; - background: - radial-gradient(80% 85% at 50% 15%, rgba(32, 207, 117, 0.18), rgba(32, 207, 117, 0) 70%), - #e8f2f8; - color: #6b8299; - font-size: 13px; - line-height: 18px; - font-weight: 800; -} - -.share-preview-footer { - min-height: 40px; - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - padding: 0 12px; -} - -.share-preview-footer-label, -.share-preview-footer-action { - min-width: 0; - overflow: hidden; - color: #4e7394; - font-size: 10px; - line-height: 14px; - font-weight: 800; - text-overflow: ellipsis; - white-space: nowrap; -} - -.share-preview-footer-action { - flex: 0 0 auto; - color: #173a5f; -} - -.share-preview-share-button, -.share-preview-cancel-button { - width: 100%; - height: 44px; - margin: 12px 0 0; - padding: 0; - border: 0; - border-radius: 10px; - box-sizing: border-box; - font-size: 14px; - line-height: 44px; - font-weight: 900; - text-align: center; -} - -.share-preview-share-button { - background: #20cf75; - color: #ffffff; - box-shadow: 0 8px 18px rgba(32, 207, 117, 0.2); -} - -.share-preview-share-button::after { - border: 0; -} - -.share-preview-cancel-button { - margin-top: 8px; - background: rgba(255, 255, 255, 0.45); - color: #385875; -} - -.share-preview-share-button.is-pressed, -.share-preview-cancel-button.is-pressed { - opacity: 0.82; -} diff --git a/src/pages-aigc/detail/detail.vue b/src/pages-aigc/detail/detail.vue index 44826a1..225300c 100644 --- a/src/pages-aigc/detail/detail.vue +++ b/src/pages-aigc/detail/detail.vue @@ -6,7 +6,8 @@ - + + diff --git a/src/pages-aigc/sharedWork/styles/index.scss b/src/pages-aigc/sharedWork/styles/index.scss new file mode 100644 index 0000000..23b2f06 --- /dev/null +++ b/src/pages-aigc/sharedWork/styles/index.scss @@ -0,0 +1,116 @@ +.shared-work-page { + position: relative; + display: flex; + flex-direction: column; + width: 100vw; + height: 100vh; + overflow: hidden; + color: #173a5f; + background: #c5e5f8; + box-sizing: border-box; +} + +.shared-work-nav { + position: relative; + z-index: 3; + flex: 0 0 auto; + background: rgba(197, 229, 248, 0.96); +} + +.shared-work-nav :deep(.top-nav-bar > .flex) { + padding-right: 12px; + padding-left: 12px; +} + +.shared-work-nav :deep(.nav-bar-center text) { + font-size: 17px; + line-height: 23px; + font-weight: 900; +} + +.shared-work-scroll { + flex: 1 1 0; + width: 100%; + height: 0; + min-height: 0; + padding-bottom: 104px; + box-sizing: border-box; +} + +.shared-work-media { + width: 100%; + display: block; + background: #b8dced; +} + +.shared-work-media.is-video { + height: min(500px, 66vh); +} + +.shared-work-meta { + padding: 18px 18px 118px; +} + +.shared-work-title, +.shared-work-type { + display: block; +} + +.shared-work-title { + overflow: hidden; + color: #173a5f; + font-size: 20px; + line-height: 27px; + font-weight: 900; + text-overflow: ellipsis; + white-space: nowrap; +} + +.shared-work-type { + margin-top: 4px; + color: #0b7b60; + font-size: 12px; + line-height: 17px; + font-weight: 800; +} + +.shared-work-empty { + min-height: 420px; + display: flex; + align-items: center; + justify-content: center; +} + +.shared-work-cta-wrap { + position: fixed; + z-index: 4; + right: 0; + bottom: 0; + left: 0; + padding: 18px 16px calc(14px + env(safe-area-inset-bottom)); + background: linear-gradient(180deg, rgba(197, 229, 248, 0) 0%, #c5e5f8 34%); + box-sizing: border-box; +} + +.shared-work-cta { + width: 100%; + height: 54px; + margin: 0; + padding: 0; + border: 0; + border-radius: 8px; + background: #20c99a; + color: #173a5f; + font-size: 16px; + line-height: 54px; + font-weight: 900; + box-shadow: 0 10px 22px rgba(32, 201, 154, 0.2); +} + +.shared-work-cta::after { + border: 0; +} + +.shared-work-cta.is-pressed { + opacity: 0.84; +} diff --git a/src/pages.json b/src/pages.json index ee05b64..7b81a9c 100644 --- a/src/pages.json +++ b/src/pages.json @@ -182,6 +182,12 @@ "navigationStyle": "custom" } }, + { + "path": "sharedWork/sharedWork", + "style": { + "navigationStyle": "custom" + } + }, { "path": "recharge/recharge", "style": { diff --git a/src/request/api/AigcApi.js b/src/request/api/AigcApi.js index 49cfe2d..ee4c224 100644 --- a/src/request/api/AigcApi.js +++ b/src/request/api/AigcApi.js @@ -36,6 +36,14 @@ function getCreditLedgerPage(args) { return request.post("/hotelBiz/credit/ledger/page", args); } +function createAigcGeneratorTaskShare(args) { + return request.post("/hotelBiz/aigcGeneratorTask/share/create", args); +} + +function getAigcGeneratorTaskShareDetail(args) { + return request.post("/hotelBiz/aigcGeneratorTask/share/detail", args, { noToken: true }); +} + export { getAigcTemplateList, getAigcTemplateItemList, @@ -46,4 +54,6 @@ export { getRechargeOptions, rechargeCredit, getCreditLedgerPage, + createAigcGeneratorTaskShare, + getAigcGeneratorTaskShareDetail, };