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 (
+ -

广告数据

+

收益报表