= [
+ {
+ title: '配置',
+ key: 'config',
+ width: 240,
+ fixed: 'left',
+ render: (_, row) => (
+
+
+ {row.name}
+ {row.is_default ? 默认 : null}
+
+ #{row.id}
+ {formatText(row.merchant_id)}
+
+ ),
+ },
+ {
+ title: '服务商 / 方式',
+ key: 'provider',
+ width: 170,
+ render: (_, row) => (
+
+ {providerLabels[row.provider] ?? row.provider}
+ {payWayLabels[row.pay_way] ?? formatText(row.pay_way)}
+ {formatText(row.sign_type)}
+
+ ),
+ },
+ {
+ title: '环境 / 状态',
+ key: 'status',
+ width: 150,
+ render: (_, row) => (
+
+
+ {statusLabels[row.status] ?? row.status}
+
+ {row.environment === 'production' ? '生产' : '沙箱'}
+
+ ),
+ },
+ {
+ title: '引用 / 交易',
+ key: 'usage',
+ width: 170,
+ align: 'right',
+ render: (_, row) => (
+
+ {row.total_transactions} 笔
+ 引用 {row.reference_count}
+ {formatMoney(row.total_amount_cent)}
+
+ ),
+ },
+ {
+ title: '回调地址',
+ key: 'notify',
+ width: 240,
+ render: (_, row) => (
+
+ {formatText(row.notify_url)}
+
+ ),
+ },
+ {
+ title: '最近使用',
+ dataIndex: 'last_used_at',
+ width: 170,
+ render: value => formatDateTime(value),
+ },
+ {
+ title: '操作',
+ key: 'actions',
+ width: 150,
+ fixed: 'right',
+ render: (_, row) => (
+
+ }
+ disabled={!canUpdate}
+ onClick={() => openEdit(row)}
+ >
+ 编辑
+
+ }
+ disabled={!canDelete}
+ onClick={() => remove(row)}
+ >
+ 删除
+
+
+ ),
+ },
+ ]
+
+ const applyFilters = () => {
+ setFilters({
+ provider: draft.provider,
+ pay_way: draft.pay_way,
+ status: draft.status,
+ environment: draft.environment,
+ })
+ setPage(1)
+ }
+
+ const resetFilters = () => {
+ setDraft({})
+ setFilters({})
+ setPage(1)
+ }
+
+ return (
+
+ )
+}
diff --git a/frontend/src/features/admin/api.ts b/frontend/src/features/admin/api.ts
index aeff7bd..64eb94d 100644
--- a/frontend/src/features/admin/api.ts
+++ b/frontend/src/features/admin/api.ts
@@ -46,9 +46,15 @@ import type {
AdminOrderPage,
AdminOrderQuery,
AdminPaymentChannel,
+ AdminPaymentConfig,
AdminPaymentConfigOption,
+ AdminPaymentConfigPage,
+ AdminPaymentConfigPayload,
+ AdminPaymentConfigQuery,
AdminReceivedListingPage,
AdminReceivedListingQuery,
+ AdminSyncSiteAccountsPayload,
+ AdminSyncSiteAccountsResult,
AdminSystemConfig,
AdminSystemConfigUpdatePayload,
AdminUser,
@@ -944,6 +950,53 @@ export async function fetchAdminPaymentConfigOptions() {
return data.data.items ?? []
}
+export async function syncAdminDistributionSiteAccounts(
+ siteId: number,
+ payload: AdminSyncSiteAccountsPayload
+) {
+ const { data } = await adminClient.post>(
+ `/admin/distribution/sites/${siteId}/sync-accounts`,
+ payload
+ )
+ return data.data
+}
+
+export async function fetchAdminPaymentConfigs(query: AdminPaymentConfigQuery) {
+ const { data } = await adminClient.get>>(
+ '/admin/payment-configs',
+ { params: compactParams(query) }
+ )
+ return {
+ items: data.data.items ?? [],
+ total: data.data.total ?? 0,
+ page: data.data.page ?? query.page ?? 1,
+ page_size: data.data.page_size ?? query.page_size ?? 20,
+ }
+}
+
+export async function createAdminPaymentConfig(payload: AdminPaymentConfigPayload) {
+ const { data } = await adminClient.post>(
+ '/admin/payment-configs',
+ payload
+ )
+ return data.data
+}
+
+export async function updateAdminPaymentConfig(
+ id: number,
+ payload: Partial
+) {
+ const { data } = await adminClient.put>(
+ `/admin/payment-configs/${id}`,
+ payload
+ )
+ return data.data
+}
+
+export async function deleteAdminPaymentConfig(id: number) {
+ await adminClient.delete(`/admin/payment-configs/${id}`)
+}
+
export async function fetchFinanceDisbursements(query: FinanceDisbursementQuery) {
const { data } = await adminClient.get>>(
'/admin/finance/disbursements',
diff --git a/frontend/src/features/admin/types.ts b/frontend/src/features/admin/types.ts
index e0d030f..319a180 100644
--- a/frontend/src/features/admin/types.ts
+++ b/frontend/src/features/admin/types.ts
@@ -1280,3 +1280,78 @@ export interface AdminDistributionAnalytics {
total_order_user_count: number
trend_days: AdminDistributionTrendPoint[]
}
+
+export interface AdminSyncSiteAccountsPayload {
+ listing_ids?: number[]
+ clean_stale_listings: boolean
+ default_shelf_ratio_delta: number
+}
+
+export interface AdminSyncSiteAccountsResult {
+ synced_count: number
+ skipped_count: number
+ updated_count: number
+ reenabled_count: number
+ disabled_stale_count: number
+ total_active: number
+}
+
+/** 主站支付配置;密钥字段后端默认不返回。 */
+export interface AdminPaymentConfig {
+ id: number
+ name: string
+ provider: string
+ merchant_id: string
+ gateway_url: string
+ notify_url: string
+ jump_url: string
+ pay_way: string
+ jspay_flag: string
+ sign_type: string
+ extra_config?: Record
+ is_default: boolean
+ status: string
+ environment: string
+ business_tags: string[]
+ reference_count: number
+ total_transactions: number
+ total_amount_cent: number
+ last_used_at?: string | null
+ created_at: string
+ updated_at: string
+}
+
+export interface AdminPaymentConfigPage {
+ items: AdminPaymentConfig[]
+ total: number
+ page: number
+ page_size: number
+}
+
+export interface AdminPaymentConfigQuery {
+ provider?: string
+ pay_way?: string
+ status?: string
+ environment?: string
+ page?: number
+ page_size?: number
+}
+
+export interface AdminPaymentConfigPayload {
+ name: string
+ provider: string
+ merchant_id: string
+ gateway_url?: string
+ sign_key?: string
+ notify_key?: string
+ notify_url?: string
+ jump_url?: string
+ pay_way?: string
+ jspay_flag?: string
+ sign_type?: string
+ extra_config?: Record
+ is_default?: boolean
+ status?: string
+ environment?: string
+ business_tags?: string[]
+}
diff --git a/frontend/src/layouts/AdminLayout.tsx b/frontend/src/layouts/AdminLayout.tsx
index d0586b5..b1ff8dd 100644
--- a/frontend/src/layouts/AdminLayout.tsx
+++ b/frontend/src/layouts/AdminLayout.tsx
@@ -137,6 +137,7 @@ const allNavGroups: NavGroup[] = [
icon: ,
children: [
{ key: '/system-configs', label: '系统配置', permission: 'system_config:view' },
+ { key: '/payment-configs', label: '支付配置', permission: 'payment_config:list' },
{ key: '/audit-logs', label: '审计日志', permission: 'audit_log:view' },
],
},
@@ -168,6 +169,7 @@ const sectionMeta: Record = {
'/distribution/invitation': { title: '邀请返利', description: '配置分站邀请好友的返利比例。' },
'/announcements': { title: '公告管理', description: '维护主站与分站公告。' },
'/system-configs': { title: '系统配置', description: '维护首页、发布、订单与支付配置。' },
+ '/payment-configs': { title: '支付配置', description: '维护主站支付商户、渠道与回调参数。' },
'/audit-logs': { title: '审计日志', description: '查看高风险操作与变更记录。' },
}
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index 9963673..1415c93 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -39,6 +39,12 @@ export default defineConfig({
if (id.includes('@tanstack') || id.includes('/zustand/') || id.includes('/axios/')) {
return 'vendor-data'
}
+ if (id.includes('/@ant-design/icons/')) {
+ return 'vendor-antd-icons'
+ }
+ if (id.includes('/dayjs/')) {
+ return 'vendor-date'
+ }
return undefined
},
},