From cadddb5c3f110f763663f30eca96546a8addbd0d Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Sun, 12 Jul 2026 21:14:22 +0800 Subject: [PATCH] feat(aigc): fully integrate backend API and replace mock data - Replace all static mock data with real backend API calls for templates, generation tasks, credit balance and recharge - Remove deprecated mock data files including templates.js, versionOptions.js, records.js and packages.js - Add useCurrentCredit composable for fetching and managing user credit balance - Update all components to align with new backend data shapes (e.g. templateItemId instead of id) - Add loading and disabled states for interactive UI elements - Implement full WeChat mini-program payment flow for credit recharge - Fix template and record card UI styling and media handling - Set developVersion flag to true for testing environment --- .../components/AigcTopBar/index.vue | 6 +- src/pages-aigc/detail/detail.vue | 10 +- .../home/components/TemplateCard/index.vue | 31 +-- .../components/TemplateCard/styles/index.scss | 2 +- .../components/TemplateCarousel/index.vue | 4 +- src/pages-aigc/home/data/templates.js | 48 ---- src/pages-aigc/home/home.vue | 35 ++- src/pages-aigc/hooks/useCurrentCredit.js | 22 ++ .../recharge/components/BalanceCard/index.vue | 9 +- .../components/CustomAmountCard/index.vue | 24 +- .../components/RechargeFooter/index.vue | 18 +- .../RechargeFooter/styles/index.scss | 4 + src/pages-aigc/recharge/data/packages.js | 28 -- src/pages-aigc/recharge/recharge.vue | 123 +++++---- .../record/components/RecordCard/index.vue | 61 ++++- .../components/RecordCard/styles/index.scss | 5 + .../record/components/RecordList/index.vue | 4 +- src/pages-aigc/record/data/records.js | 16 -- src/pages-aigc/record/record.vue | 63 +++-- .../components/PhotoPickDrawer/index.vue | 83 ++++-- .../PhotoPickDrawer/styles/index.scss | 8 + .../components/TemplateVersionHero/index.vue | 22 +- .../components/VersionOptionCard/index.vue | 17 +- .../VersionOptionCard/styles/index.scss | 9 + .../components/VersionOptionList/index.vue | 4 +- .../useTemplate/data/versionOptions.js | 14 - src/pages-aigc/useTemplate/useTemplate.vue | 252 ++++++++++++++++-- src/request/api/AigcApi.js | 34 +++ src/request/base/config.js | 2 +- 29 files changed, 655 insertions(+), 303 deletions(-) delete mode 100644 src/pages-aigc/home/data/templates.js create mode 100644 src/pages-aigc/hooks/useCurrentCredit.js delete mode 100644 src/pages-aigc/recharge/data/packages.js delete mode 100644 src/pages-aigc/record/data/records.js delete mode 100644 src/pages-aigc/useTemplate/data/versionOptions.js create mode 100644 src/request/api/AigcApi.js diff --git a/src/pages-aigc/components/AigcTopBar/index.vue b/src/pages-aigc/components/AigcTopBar/index.vue index d0ca07e..5e6faf8 100644 --- a/src/pages-aigc/components/AigcTopBar/index.vue +++ b/src/pages-aigc/components/AigcTopBar/index.vue @@ -11,7 +11,7 @@ {{ rechargeLabel }} - {{ points }} + {{ displayPoints }} 积分 @@ -30,7 +30,7 @@ import { computed, onMounted, ref } from "vue"; import { zniconsMap } from "@/static/fonts/znicons.js"; -defineProps({ +const props = defineProps({ points: { type: [Number, String], default: 0, @@ -57,6 +57,8 @@ const topbarStyle = computed(() => ({ "--aigc-capsule-safe-width": `${capsuleSafeWidth.value}px`, })); +const displayPoints = computed(() => Number(props.points) || 0); + onMounted(() => { try { const systemInfo = uni.getSystemInfoSync(); diff --git a/src/pages-aigc/detail/detail.vue b/src/pages-aigc/detail/detail.vue index 8b0a2ab..8fd6ac2 100644 --- a/src/pages-aigc/detail/detail.vue +++ b/src/pages-aigc/detail/detail.vue @@ -18,17 +18,23 @@ diff --git a/src/pages-aigc/home/components/TemplateCard/styles/index.scss b/src/pages-aigc/home/components/TemplateCard/styles/index.scss index 54c9bef..7d8c4c5 100644 --- a/src/pages-aigc/home/components/TemplateCard/styles/index.scss +++ b/src/pages-aigc/home/components/TemplateCard/styles/index.scss @@ -36,7 +36,7 @@ flex: 0 0 var(--template-card-media-height, 358px); height: var(--template-card-media-height, 358px); overflow: hidden; - background: var(--memory-accent); + background: #0f7069; } .template-image, diff --git a/src/pages-aigc/home/components/TemplateCarousel/index.vue b/src/pages-aigc/home/components/TemplateCarousel/index.vue index d4c7bee..11d3d01 100644 --- a/src/pages-aigc/home/components/TemplateCarousel/index.vue +++ b/src/pages-aigc/home/components/TemplateCarousel/index.vue @@ -22,7 +22,7 @@ diff --git a/src/pages-aigc/home/data/templates.js b/src/pages-aigc/home/data/templates.js deleted file mode 100644 index ecb077c..0000000 --- a/src/pages-aigc/home/data/templates.js +++ /dev/null @@ -1,48 +0,0 @@ -export const aigcTemplates = [ - { - id: "glass-boat-postcard", - title: "鸳鸯湖明信片", - desc: "适合朋友圈分享的旅行纪念内容", - note: "图片版100积分 · 动效视频版200积分/5秒内", - badge: "同源双版本", - buttonText: "选这个模板", - cover: "https://oss.nianxx.cn/mp/static/xiaoqi/glass-boat-postcard.gif", - tone: "postcard", - accent: "#0a4d46", - }, - { - id: "bridge-memory", - title: "秘境探险时光", - desc: "在鸳鸯湖划船时留下美好回忆", - note: "图片版100积分 · 动效视频版200积分/5秒内", - badge: "同源双版本", - buttonText: "选这个模板", - cover: "https://oss.nianxx.cn/config/2f642480fdd79f40a07a56c79317a77c.mp4", - tone: "emerald", - accent: "#0f7069", - }, - { - id: "waterfall-story", - title: "卧龙潭粘土拍立得", - desc: "用粘土数字形象,从画框中走向屏幕前", - note: "图片版100积分 · 动效视频版200积分/5秒内", - badge: "同源双版本", - buttonText: "选这个模板", - cover: "https://oss.nianxx.cn/config/70cef08f598ac30bf42c34ed31dda9bd.mp4", - tone: "aqua", - accent: "#155e75", - }, - // { - // id: "culture-postcard", - // title: "瑶山古寨印象", - // desc: "把民族风情做成旅行收藏卡", - // note: "图片版100积分 · 动效视频版200积分/5秒内", - // badge: "同源双版本", - // buttonText: "选这个模板", - // cover: "https://oss.nianxx.cn/mp/static/xiaoqi/card-culture-1.png", - // tone: "forest", - // accent: "#36563d", - // }, -]; - -export const aigcFlowSteps = ["选模板", "传素材", "添积分", "出结果"]; diff --git a/src/pages-aigc/home/home.vue b/src/pages-aigc/home/home.vue index de5ee07..a27d0e2 100644 --- a/src/pages-aigc/home/home.vue +++ b/src/pages-aigc/home/home.vue @@ -14,18 +14,40 @@ diff --git a/src/pages-aigc/hooks/useCurrentCredit.js b/src/pages-aigc/hooks/useCurrentCredit.js new file mode 100644 index 0000000..fbd8e21 --- /dev/null +++ b/src/pages-aigc/hooks/useCurrentCredit.js @@ -0,0 +1,22 @@ +import { ref } from "vue"; +import { getCurrentCredit } from "@/request/api/AigcApi.js"; + +export function useCurrentCredit() { + const pointBalance = ref(0); + + const fetchCurrentCredit = async () => { + try { + const res = await getCurrentCredit(); + if (res?.code === 0) { + pointBalance.value = Number(res.data) || 0; + } + } catch (error) { + console.error("获取当前积分失败", error); + } + }; + + return { + pointBalance, + fetchCurrentCredit, + }; +} diff --git a/src/pages-aigc/recharge/components/BalanceCard/index.vue b/src/pages-aigc/recharge/components/BalanceCard/index.vue index 3ce3e9c..33c5c50 100644 --- a/src/pages-aigc/recharge/components/BalanceCard/index.vue +++ b/src/pages-aigc/recharge/components/BalanceCard/index.vue @@ -2,8 +2,7 @@ 当前可用积分 - {{ balance.points }} - {{ balance.ruleText }} + {{ points }} 积分明细 @@ -12,9 +11,9 @@ diff --git a/src/pages-aigc/recharge/components/RechargeFooter/index.vue b/src/pages-aigc/recharge/components/RechargeFooter/index.vue index 0bd36ea..dba7b58 100644 --- a/src/pages-aigc/recharge/components/RechargeFooter/index.vue +++ b/src/pages-aigc/recharge/components/RechargeFooter/index.vue @@ -1,11 +1,15 @@ @@ -14,14 +18,14 @@ import { computed } from "vue"; const props = defineProps({ - points: { - type: Number, - default: 0, - }, price: { type: Number, default: 0, }, + loading: { + type: Boolean, + default: false, + }, }); const emit = defineEmits(["pay"]); diff --git a/src/pages-aigc/recharge/components/RechargeFooter/styles/index.scss b/src/pages-aigc/recharge/components/RechargeFooter/styles/index.scss index 1ced102..ea65417 100644 --- a/src/pages-aigc/recharge/components/RechargeFooter/styles/index.scss +++ b/src/pages-aigc/recharge/components/RechargeFooter/styles/index.scss @@ -42,3 +42,7 @@ font-weight: 900; white-space: nowrap; } + +.recharge-pay-button.is-disabled { + opacity: 0.48; +} diff --git a/src/pages-aigc/recharge/data/packages.js b/src/pages-aigc/recharge/data/packages.js deleted file mode 100644 index cb786e4..0000000 --- a/src/pages-aigc/recharge/data/packages.js +++ /dev/null @@ -1,28 +0,0 @@ -export const rechargeBalance = { - points: 0, - ruleText: "图片版 100积分/次 · 动效视频版 200积分/次", -}; - -export const rechargePackages = [ - { - id: "points-1000", - points: 1000, - price: 9.5, - originalPrice: 10, - discount: "9.5折", - }, - { - id: "points-3000", - points: 3000, - price: 27, - originalPrice: 30, - discount: "9折", - }, - { - id: "points-5000", - points: 5000, - price: 42.5, - originalPrice: 50, - discount: "8.5折", - }, -]; diff --git a/src/pages-aigc/recharge/recharge.vue b/src/pages-aigc/recharge/recharge.vue index d88ecc2..a7469b5 100644 --- a/src/pages-aigc/recharge/recharge.vue +++ b/src/pages-aigc/recharge/recharge.vue @@ -13,25 +13,17 @@ - - @@ -40,51 +32,34 @@ diff --git a/src/pages-aigc/record/components/RecordCard/index.vue b/src/pages-aigc/record/components/RecordCard/index.vue index 1e99662..2ae581e 100644 --- a/src/pages-aigc/record/components/RecordCard/index.vue +++ b/src/pages-aigc/record/components/RecordCard/index.vue @@ -1,11 +1,21 @@