From a48007a44d4ffb4ca59ec7bc769b4e4f74259719 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Sep 2026 19:18:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E6=94=AF=E4=BB=98&=E4=BB=98?= =?UTF-8?q?=E8=B4=B9=E8=8F=9C=E5=8D=95=E6=8C=89=E5=8F=82=E8=80=83=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E9=87=8D=E6=9E=84=E5=B9=B6=E6=96=B0=E5=A2=9E=E6=8F=90?= =?UTF-8?q?=E7=8E=B0=E7=AD=96=E7=95=A5=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 子菜单重组为知识付费/余额充值/VIP会员/创作分成/推广返佣/收款接口/提现策略 - 收款接口页 1:1 复刻 Zibll 双下拉结构,仅保留支付宝/微信/PayPal/Stripe/易支付 - 订单前缀/流水号前缀/提现单号前缀配置保留并移入收款接口页 - 知识付费/推广返佣按参考主题全字段复刻,余额充值并入充值卡配置 - 新增 tabbed/between_number/page_select 表单控件及后端 pages 搜索源 - 清理旧 SPA 组件、无消费者 REST 端点与废弃配置键(不写双路兼容) - 更新存量契约测试至新 schema 文件 --- assets/admin/src/api/modules/index.js | 2 - assets/admin/src/api/modules/payment.js | 7 - assets/admin/src/components/form/AksField.vue | 104 +++ .../src/components/form/AksFormRenderer.vue | 40 +- assets/admin/src/constants/sections/index.js | 2 +- .../admin/src/constants/sections/payment.js | 69 +- .../src/pages/payment/PaymentChargeCard.vue | 529 ----------- .../src/pages/payment/PaymentGateway.vue | 131 --- .../src/pages/payment/PaymentRevenue.vue | 319 ------- .../src/pages/payment/PaymentSectionPage.vue | 103 -- .../components/ChargeCardDetailDrawer.vue | 89 -- .../src/router/component-loaders/index.js | 2 - .../src/router/component-loaders/payment.js | 3 - assets/admin/src/router/index.js | 4 +- .../src/schema/sections/payment/affiliate.js | 187 +++- .../src/schema/sections/payment/cardPass.js | 59 -- .../src/schema/sections/payment/gateway.js | 375 ++++++-- .../src/schema/sections/payment/index.js | 7 +- .../src/schema/sections/payment/knowledge.js | 238 +++++ .../src/schema/sections/payment/order.js | 94 -- .../src/schema/sections/payment/recharge.js | 152 ++- .../src/schema/sections/payment/revenue.js | 36 +- .../admin/src/schema/sections/payment/vip.js | 234 +++-- .../src/schema/sections/payment/withdrawal.js | 38 +- src/Admin/PageDisplayController.php | 4 +- src/Admin/PaymentController.php | 224 ----- src/Admin/Schema/SchemaPayment.php | 876 +++++++++++------- src/Admin/SchemaProvider.php | 62 +- src/Core/ScriptsPart1c.php | 9 +- src/Payment/CommissionLedger.php | 4 +- src/Payment/Gateway.php | 47 +- src/Payment/UserOrders.php | 2 +- src/Settings/CreditsPaymentGroups.php | 4 +- src/Settings/PaymentRuntime.php | 255 +++-- .../asset-ledger-contract.test.cjs | 2 +- .../financial-flow-contract.test.cjs | 2 +- 36 files changed, 2042 insertions(+), 2273 deletions(-) delete mode 100644 assets/admin/src/api/modules/payment.js delete mode 100644 assets/admin/src/pages/payment/PaymentChargeCard.vue delete mode 100644 assets/admin/src/pages/payment/PaymentGateway.vue delete mode 100644 assets/admin/src/pages/payment/PaymentRevenue.vue delete mode 100644 assets/admin/src/pages/payment/PaymentSectionPage.vue delete mode 100644 assets/admin/src/pages/payment/components/ChargeCardDetailDrawer.vue delete mode 100644 assets/admin/src/router/component-loaders/payment.js delete mode 100644 assets/admin/src/schema/sections/payment/cardPass.js create mode 100644 assets/admin/src/schema/sections/payment/knowledge.js delete mode 100644 assets/admin/src/schema/sections/payment/order.js diff --git a/assets/admin/src/api/modules/index.js b/assets/admin/src/api/modules/index.js index 9aeb8de0..9e9d622f 100644 --- a/assets/admin/src/api/modules/index.js +++ b/assets/admin/src/api/modules/index.js @@ -2,7 +2,6 @@ import { globalApiMethods } from './global.js' import { pageDisplayApiMethods } from './page-display.js' import { permissionsApiMethods } from './permissions.js' import { usersApiMethods } from './users.js' -import { paymentApiMethods } from './payment.js' import { extensionsApiMethods } from './extensions.js' import { toolsApiMethods } from './tools.js' import { schemaApiMethods } from './schema.js' @@ -13,7 +12,6 @@ export const apiMethods = { ...pageDisplayApiMethods, ...permissionsApiMethods, ...usersApiMethods, - ...paymentApiMethods, ...extensionsApiMethods, ...toolsApiMethods, ...schemaApiMethods, diff --git a/assets/admin/src/api/modules/payment.js b/assets/admin/src/api/modules/payment.js deleted file mode 100644 index 0707c187..00000000 --- a/assets/admin/src/api/modules/payment.js +++ /dev/null @@ -1,7 +0,0 @@ -export const paymentApiMethods = { - /* ================================================================ - * 支付&付费 (Payment) - * ================================================================ */ - - getPaymentOverview() { return this.request('/payment/overview') }, -} diff --git a/assets/admin/src/components/form/AksField.vue b/assets/admin/src/components/form/AksField.vue index 0169deb4..148c0858 100644 --- a/assets/admin/src/components/form/AksField.vue +++ b/assets/admin/src/components/form/AksField.vue @@ -142,6 +142,22 @@ @update:value="emit('update:modelValue', $event)" /> + + + + +
+ + — + + {{ schema.unit }} +
+
{{ schema.spacingLabels?.[0] || '上' }}
@@ -807,6 +849,9 @@ onMounted(() => { if (props.schema.type === 'async_select') { loadAsyncOptions() } + if (props.schema.type === 'page_select') { + loadPages() + } }) // ============ User Select (async search) ============ @@ -850,6 +895,31 @@ function handleUserSearch(query) { }, 300) } +// ============ Page Select (async page list) ============ +const pageOptions = ref([]) +const pageLoading = ref(false) +let pageSearchTimer = null + +async function loadPages(query = '') { + pageLoading.value = true + try { + const selected = props.modelValue ? [props.modelValue] : [] + const res = await api.searchPageDisplayOptions('pages', query, query ? [] : selected) + const items = res?.data || res || [] + pageOptions.value = Array.isArray(items) ? items : [] + } catch (e) { + console.warn('[AksField] page load failed:', e) + pageOptions.value = [] + } finally { + pageLoading.value = false + } +} + +function handlePageSearch(query) { + clearTimeout(pageSearchTimer) + pageSearchTimer = setTimeout(() => loadPages(query), 250) +} + const fieldClasses = computed(() => ({ 'aksrt-field--disabled': props.schema.disabled, 'aksrt-field--inline': props.schema.inline, @@ -870,6 +940,21 @@ function updateDimension(part, value) { emit('update:modelValue', { ...current, [part]: value }) } +// ============ Between Number (min/max pair) ============ +function betweenValue(part) { + const current = props.modelValue && typeof props.modelValue === 'object' && !Array.isArray(props.modelValue) + ? props.modelValue + : {} + return current[part] !== undefined ? current[part] : (props.schema.default?.[part] ?? 0) +} + +function updateBetween(part, value) { + const current = props.modelValue && typeof props.modelValue === 'object' && !Array.isArray(props.modelValue) + ? props.modelValue + : {} + emit('update:modelValue', { ...current, [part]: value }) +} + // ============ Spacing ============ function updateSpacing(part, value) { const current = props.modelValue || {} @@ -1115,6 +1200,25 @@ function confirmRepeaterModal() { font-size: 14px; } +/* Between number (min/max) */ +.aksrt-field__between { + display: flex; + align-items: center; + gap: 8px; + max-width: 360px; +} + +.aksrt-field__between-sep { + color: var(--aksrt-color-border-strong); + font-size: 14px; +} + +.aksrt-field__between-unit { + color: var(--aksrt-color-muted); + font-size: 13px; + white-space: nowrap; +} + /* Spacing field */ .aksrt-field__spacing { display: grid; diff --git a/assets/admin/src/components/form/AksFormRenderer.vue b/assets/admin/src/components/form/AksFormRenderer.vue index 94eda249..9d7ea2b9 100644 --- a/assets/admin/src/components/form/AksFormRenderer.vue +++ b/assets/admin/src/components/form/AksFormRenderer.vue @@ -56,8 +56,33 @@