From 4e58a30b70e15e2933e46737f56d8e0fc77a9b18 Mon Sep 17 00:00:00 2001 From: wwwwwwwww <526125649@qq.com> Date: Wed, 10 Jun 2026 13:09:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=94=AF=E4=BB=98=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5=E9=9D=A2=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-admin/src/api/index.ts | 4 ++ .../src/pages/AdminPaymentConfig.tsx | 45 +++++++------------ video-gen-api/app/api/v1/admin.py | 28 ++++++++++++ 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/video-gen-admin/src/api/index.ts b/video-gen-admin/src/api/index.ts index 649dc3cb..cf274fea 100644 --- a/video-gen-admin/src/api/index.ts +++ b/video-gen-admin/src/api/index.ts @@ -207,6 +207,10 @@ export async function updatePaymentConfig(id: string, value: string): Promise): Promise { + await api.put('/admin/payment-configs/batch', configs); +} + export async function getAdminNotifications(): Promise<{ total: number; items: any[] }> { return api.get('/admin/notifications'); } diff --git a/video-gen-admin/src/pages/AdminPaymentConfig.tsx b/video-gen-admin/src/pages/AdminPaymentConfig.tsx index 7eff246b..6ca418d8 100644 --- a/video-gen-admin/src/pages/AdminPaymentConfig.tsx +++ b/video-gen-admin/src/pages/AdminPaymentConfig.tsx @@ -5,18 +5,10 @@ import { import { SaveOutlined, WechatOutlined, AlipayCircleOutlined, DollarOutlined, } from '@ant-design/icons'; -import { getPaymentConfigs, updatePaymentConfig } from '../api'; - -interface PaymentConfig { - id: string; - key: string; - value: string; - description?: string; -} +import { getPaymentConfigs, batchUpdatePaymentConfigs } from '../api'; const AdminPaymentConfig: React.FC = () => { const [saving, setSaving] = useState(false); - const [configs, setConfigs] = useState([]); const [wechatEnabled, setWechatEnabled] = useState(false); const [alipayEnabled, setAlipayEnabled] = useState(false); const [form] = Form.useForm(); @@ -24,9 +16,8 @@ const AdminPaymentConfig: React.FC = () => { const load = async () => { try { const data = await getPaymentConfigs(); - setConfigs(data); const map: Record = {}; - data.forEach((c: PaymentConfig) => { map[c.key] = c.value; }); + data.forEach((c: any) => { map[c.key] = c.value; }); form.setFieldsValue({ wechat_mch_id: map['payment_wechat_mch_id'] || '', wechat_api_key: map['payment_wechat_api_key'] || '', @@ -51,25 +42,19 @@ const AdminPaymentConfig: React.FC = () => { try { const values = await form.validateFields(); setSaving(true); - const updates: [string, string][] = [ - ['payment_wechat_enabled', String(wechatEnabled)], - ['payment_wechat_mch_id', values.wechat_mch_id || ''], - ['payment_wechat_api_key', values.wechat_api_key || ''], - ['payment_wechat_cert_path', values.wechat_cert_path || ''], - ['payment_wechat_notify_url', values.wechat_notify_url || ''], - ['payment_alipay_enabled', String(alipayEnabled)], - ['payment_alipay_app_id', values.alipay_app_id || ''], - ['payment_alipay_private_key', values.alipay_private_key || ''], - ['payment_alipay_public_key', values.alipay_public_key || ''], - ['payment_alipay_notify_url', values.alipay_notify_url || ''], - ['payment_alipay_gateway', values.alipay_gateway || ''], - ]; - for (const [key, value] of updates) { - const cfg = configs.find(c => c.key === key); - if (cfg) { - await updatePaymentConfig(cfg.id, value); - } - } + await batchUpdatePaymentConfigs({ + payment_wechat_enabled: String(wechatEnabled), + payment_wechat_mch_id: values.wechat_mch_id || '', + payment_wechat_api_key: values.wechat_api_key || '', + payment_wechat_cert_path: values.wechat_cert_path || '', + payment_wechat_notify_url: values.wechat_notify_url || '', + payment_alipay_enabled: String(alipayEnabled), + payment_alipay_app_id: values.alipay_app_id || '', + payment_alipay_private_key: values.alipay_private_key || '', + payment_alipay_public_key: values.alipay_public_key || '', + payment_alipay_notify_url: values.alipay_notify_url || '', + payment_alipay_gateway: values.alipay_gateway || '', + }); message.success('支付配置已保存'); load(); } catch { diff --git a/video-gen-api/app/api/v1/admin.py b/video-gen-api/app/api/v1/admin.py index bbf732b6..327cced3 100644 --- a/video-gen-api/app/api/v1/admin.py +++ b/video-gen-api/app/api/v1/admin.py @@ -412,6 +412,34 @@ async def list_payment_configs( ] +@router.put("/payment-configs/batch") +async def batch_update_payment_configs( + req: dict[str, str], + admin: User = Depends(get_admin_user), + db: AsyncSession = Depends(get_db), +): + """Batch upsert payment configs. Creates missing keys, updates existing ones.""" + from app.utils.id_gen import generate_id + + for key, value in req.items(): + if not key.startswith("payment_"): + continue + result = await db.execute( + select(SystemConfig).where(SystemConfig.key == key).limit(1) + ) + config = result.scalar_one_or_none() + if config: + config.value = value + else: + db.add(SystemConfig( + id=generate_id(), + key=key, + value=value, + )) + await db.flush() + return {"ok": True} + + @router.put("/payment-configs/{config_id}") async def update_payment_config( config_id: str,