diff --git a/frontend/package.json b/frontend/package.json index d2a6deded7..14efbfdb8e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@lobehub/icons": "^4.0.2", + "@stripe/stripe-js": "^9.0.1", "@tanstack/vue-virtual": "^3.13.23", "@vueuse/core": "^10.7.0", "axios": "^1.13.5", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 505b72f388..9698352b52 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@lobehub/icons': specifier: ^4.0.2 version: 4.0.2(@lobehub/ui@4.9.2)(@types/react@19.2.7)(antd@6.1.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@stripe/stripe-js': + specifier: ^9.0.1 + version: 9.0.1 '@tanstack/vue-virtual': specifier: ^3.13.23 version: 3.13.23(vue@3.5.26(typescript@5.6.3)) @@ -1379,6 +1382,10 @@ packages: peerDependencies: react: '>= 16.3.0' + '@stripe/stripe-js@9.0.1': + resolution: {integrity: sha512-un0URSosrW7wNr7xZ5iI2mC9mdeXZ3KERoVlA2RdmeLXYxHUPXq0yHzir2n/MtyXXEdSaELtz4WXGS6dzPEeKA==} + engines: {node: '>=12.16'} + '@tanstack/virtual-core@3.13.23': resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} @@ -5819,6 +5826,8 @@ snapshots: dependencies: react: 19.2.3 + '@stripe/stripe-js@9.0.1': {} + '@tanstack/virtual-core@3.13.23': {} '@tanstack/vue-virtual@3.13.23(vue@3.5.26(typescript@5.6.3))': diff --git a/frontend/src/components/layout/AppSidebar.vue b/frontend/src/components/layout/AppSidebar.vue index b909178abf..1a740adbfb 100644 --- a/frontend/src/components/layout/AppSidebar.vue +++ b/frontend/src/components/layout/AppSidebar.vue @@ -467,35 +467,6 @@ const ChevronDoubleLeftIcon = { ) } -const SoraIcon = { - render: () => - h( - 'svg', - { fill: 'none', viewBox: '0 0 24 24', stroke: 'currentColor', 'stroke-width': '1.5' }, - [ - h('path', { - 'stroke-linecap': 'round', - 'stroke-linejoin': 'round', - d: 'M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09z' - }) - ] - ) -} - -const ReceiptIcon = { - render: () => - h( - 'svg', - { fill: 'none', viewBox: '0 0 24 24', stroke: 'currentColor', 'stroke-width': '1.5' }, - [ - h('path', { - 'stroke-linecap': 'round', - 'stroke-linejoin': 'round', - d: 'M9 14.25l6-6m4.5-3.493V21.75l-3.75-1.5-3.75 1.5-3.75-1.5-3.75 1.5V4.757c0-1.108.806-2.057 1.907-2.185a48.507 48.507 0 0111.186 0c1.1.128 1.907 1.077 1.907 2.185zM9.75 9h.008v.008H9.75V9zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm4.125 4.5h.008v.008h-.008V13.5zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z' - }) - ] - ) -} const OrderIcon = { render: () => @@ -549,9 +520,6 @@ const userNavItems = computed((): NavItem[] => { { path: '/keys', label: t('nav.apiKeys'), icon: KeyIcon }, { path: '/usage', label: t('nav.usage'), icon: ChartIcon, hideInSimpleMode: true }, { path: '/subscriptions', label: t('nav.mySubscriptions'), icon: CreditCardIcon, hideInSimpleMode: true }, - ...(appStore.cachedPublicSettings?.sora_client_enabled - ? [{ path: '/sora', label: t('nav.sora'), icon: SoraIcon }] - : []), ...(appStore.cachedPublicSettings?.payment_enabled ? [ { @@ -590,9 +558,6 @@ const personalNavItems = computed((): NavItem[] => { { path: '/keys', label: t('nav.apiKeys'), icon: KeyIcon }, { path: '/usage', label: t('nav.usage'), icon: ChartIcon, hideInSimpleMode: true }, { path: '/subscriptions', label: t('nav.mySubscriptions'), icon: CreditCardIcon, hideInSimpleMode: true }, - ...(appStore.cachedPublicSettings?.sora_client_enabled - ? [{ path: '/sora', label: t('nav.sora'), icon: SoraIcon }] - : []), ...(appStore.cachedPublicSettings?.payment_enabled ? [ { diff --git a/frontend/src/views/admin/orders/AdminOrdersView.vue b/frontend/src/views/admin/orders/AdminOrdersView.vue index 7291055988..f588165bed 100644 --- a/frontend/src/views/admin/orders/AdminOrdersView.vue +++ b/frontend/src/views/admin/orders/AdminOrdersView.vue @@ -288,7 +288,7 @@ async function loadOrders() { keyword: orderSearch.value || undefined, status: orderFilters.status || undefined, payment_type: orderFilters.payment_type || undefined, order_type: orderFilters.order_type || undefined, }) - orders.value = res.data.data || [] + orders.value = res.data.items || [] orderPagination.total = res.data.total || 0 } catch (err: unknown) { appStore.showError(err instanceof Error ? err.message : String(err)) diff --git a/frontend/src/views/user/PaymentView.vue b/frontend/src/views/user/PaymentView.vue index 190971f0e8..c9e4f391cd 100644 --- a/frontend/src/views/user/PaymentView.vue +++ b/frontend/src/views/user/PaymentView.vue @@ -37,11 +37,11 @@ @select="selectedMethod = $event" /> -
+
{{ t('payment.amountLabel') }} - \u00A5{{ amount.toFixed(2) }} + \u00A5{{ validAmount.toFixed(2) }}
{{ t('payment.fee') }} ({{ feeRate }}%) @@ -58,7 +58,7 @@ {{ t('common.processing') }} - {{ t('payment.createOrder') }} \u00A5{{ (feeRate > 0 && amount > 0 ? totalAmount : amount).toFixed(2) }} + {{ t('payment.createOrder') }} \u00A5{{ (feeRate > 0 && validAmount > 0 ? totalAmount : validAmount).toFixed(2) }}

{{ errorMessage }}