From e4b41b714c7873bcf65dbc683600a7fb27ec13ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B7=A6=E8=BE=B0=E5=8B=87?= Date: Mon, 20 Jul 2026 20:53:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(huawei-review):=20=E5=8D=8E=E4=B8=BA?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「数据配置」组下新增「华为审核开关」页,两态单选(不能关闭 / 可关闭)+ 保存, 展示当前生效值与最后修改时间。页面文案写清生效范围,避免过审后忘记切回: 仅华为 ROM 生效(荣耀 MagicOS 不受影响)、只影响快速设置步、客户端重进 App 才变。 Co-Authored-By: Claude Opus 4.8 --- src/app/(main)/huawei-review/page.tsx | 103 ++++++++++++++++++++++++++ src/app/(main)/layout.tsx | 2 + 2 files changed, 105 insertions(+) create mode 100644 src/app/(main)/huawei-review/page.tsx diff --git a/src/app/(main)/huawei-review/page.tsx b/src/app/(main)/huawei-review/page.tsx new file mode 100644 index 0000000..4274991 --- /dev/null +++ b/src/app/(main)/huawei-review/page.tsx @@ -0,0 +1,103 @@ +'use client'; + +import { useCallback, useEffect, useState } from 'react'; +import { Alert, App, Button, Card, Descriptions, Radio, Skeleton, Tag } from 'antd'; +import { api, errMsg } from '@/lib/api'; +import { formatUtcTime } from '@/lib/format'; + +// 华为审核开关:控制新手引导「快速设置」权限步能否被用户退出。 +// 华为应用市场审核要求该页必须可关闭(引导视频页不在要求内),平时保持「不能关闭」以保住权限开启率, +// 送审期间切「可关闭」。落在 app_config 的 huawei_review 行,客户端经 /api/v1/platform/huawei-review 拉。 +type Mode = 'default' | 'review'; + +interface HuaweiReview { + mode: Mode; + updated_at: string | null; +} + +const MODE_LABEL: Record = { + default: '不能关闭', + review: '可关闭', +}; + +export default function HuaweiReviewPage() { + const { message } = App.useApp(); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + // saved = 服务端当前值(用于「有没有改动」判断);mode = 编辑中的值 + const [saved, setSaved] = useState(null); + const [mode, setMode] = useState('default'); + + const load = useCallback(async () => { + try { + const r = await api.get('/admin/api/huawei-review'); + setSaved(r.data); + setMode(r.data.mode); + } catch (e) { + message.error(errMsg(e, '华为审核开关加载失败')); + } finally { + setLoading(false); + } + }, [message]); + + useEffect(() => { + load(); + }, [load]); + + const save = async () => { + setSaving(true); + try { + const r = await api.patch('/admin/api/huawei-review', { mode }); + setSaved(r.data); + setMode(r.data.mode); + message.success('已保存。客户端下次进新手引导时拉取生效'); + } catch (e) { + message.error(errMsg(e, '保存失败')); + } finally { + setSaving(false); + } + }; + + const dirty = saved !== null && saved.mode !== mode; + + return ( + + 保存 + + } + > + + {loading ? ( + + ) : ( + <> + + + {saved ? ( + {MODE_LABEL[saved.mode]} + ) : ( + '-' + )} + + + {saved?.updated_at ? formatUtcTime(saved.updated_at) : '从未修改过(默认不能关闭)'} + + +
华为快速设置页是否可关闭
+ setMode(e.target.value as Mode)}> + 不能关闭 + 可关闭 + + + )} +
+ ); +} diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx index b2c7c8d..c1c37a0 100644 --- a/src/app/(main)/layout.tsx +++ b/src/app/(main)/layout.tsx @@ -16,6 +16,7 @@ import { MoneyCollectOutlined, NotificationOutlined, ProfileOutlined, + SafetyCertificateOutlined, SettingOutlined, ShareAltOutlined, TeamOutlined, @@ -78,6 +79,7 @@ const NAV_GROUPS: NavGroup[] = [ children: [ { key: '/config', icon: , label: '系统配置' }, { key: '/ad-revenue', icon: , label: '广告配置' }, + { key: '/huawei-review', icon: , label: '华为审核开关' }, { key: '/users', icon: , label: '用户管理' }, ], }, -- 2.52.0