From 98417ff8c6ad9a4f27fd367488c092326baf8a03 Mon Sep 17 00:00:00 2001 From: marco Date: Sat, 20 Jun 2026 01:35:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(ad):=20=E3=80=8C=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E3=80=8D=E6=94=B9=E3=80=8C=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E3=80=8D,=E5=8A=A0=E7=A9=BF=E5=B1=B1?= =?UTF-8?q?=E7=94=B2=E9=85=8D=E7=BD=AE=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 顶部广告配置面板:app_id / 3 场景广告位ID / 激励验签密钥(Password) / 3 场景开关, 读写 /admin/api/ad-config - 原报表保留为下方「收益报表」;左侧菜单更名「广告管理」 Co-Authored-By: Claude Opus 4.8 --- src/app/(main)/ad-revenue/page.tsx | 95 +++++++++++++++++++++++++++++- src/app/(main)/layout.tsx | 2 +- 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/app/(main)/ad-revenue/page.tsx b/src/app/(main)/ad-revenue/page.tsx index 8515de2..c6cb94e 100644 --- a/src/app/(main)/ad-revenue/page.tsx +++ b/src/app/(main)/ad-revenue/page.tsx @@ -10,6 +10,8 @@ import { Col, DatePicker, Divider, + Form, + Input, InputNumber, Modal, Popover, @@ -17,6 +19,7 @@ import { Select, Space, Statistic, + Switch, Table, Tag, Typography, @@ -268,6 +271,95 @@ function TrendChart({ points }: { points: TrendPoint[] }) { // 广告数据页:单表 —— 按 用户×类型×应用×代码位 聚合,一行同时给出 // 展示条数 / 收益 / 应发金币 / 实发金币 / 是否一致(发奖对账下沉到聚合级)。 +// 广告配置面板:穿山甲 app_id / 各场景广告位ID / 验签密钥 / 各场景开关。 +// 客户端(发版后)从 /api/v1/platform/ad-config 拉取;此处经 admin /ad-config 读写。 +interface AdCfg { + app_id: string; + reward_code_id: string; + compare_feed_code_id: string; + coupon_feed_code_id: string; + reward_mkey: string; + reward_enabled: boolean; + compare_ad_enabled: boolean; + coupon_ad_enabled: boolean; +} + +function AdConfigPanel() { + const { message } = App.useApp(); + const [form] = Form.useForm(); + const [saving, setSaving] = useState(false); + const load = useCallback(async () => { + try { + const r = await api.get('/admin/api/ad-config'); + form.setFieldsValue(r.data); + } catch (e) { + message.error(errMsg(e, '广告配置加载失败')); + } + }, [form, message]); + useEffect(() => { + load(); + }, [load]); + const save = async () => { + const v = await form.validateFields(); + setSaving(true); + try { + await api.patch('/admin/api/ad-config', v); + message.success('已保存。客户端下次拉取生效(应用ID需冷启,广告位ID即时)'); + load(); + } catch (e) { + message.error(errMsg(e, '保存失败')); + } finally { + setSaving(false); + } + }; + return ( + + 保存 + + } + > + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +} + export default function AdRevenuePage() { const { message } = App.useApp(); const [range, setRange] = useState<[Dayjs, Dayjs]>([dayjs(), dayjs()]); @@ -412,8 +504,9 @@ export default function AdRevenuePage() { return (
+ -

广告数据

+

收益报表