优化领取页第一步文案示意与 Mock 表单

- 游戏编号文案与红色提示,底部增加编号位置示意图
- 压缩商品信息卡片,示意图移至最下方
- 开发 Mock 在待填 UID 步骤下 UID 改为可选
This commit is contained in:
yml2213
2026-07-10 18:14:10 +08:00
parent 36fb994acd
commit 827baf4ab2
5 changed files with 221 additions and 85 deletions
@@ -128,82 +128,20 @@ export default function AdminDevMockPage() {
<Row gutter={[16, 16]}>
<Col xs={24} xl={12}>
<Card title="1. lewan 领取(强制 UID" bordered={false}>
<Form
layout="vertical"
initialValues={{
step: 'binding',
uid: status?.defaultUid || '10001',
productNo: '套餐_1----3676797936',
}}
onFinish={(values) => lewanMutation.mutate(values)}
>
<Form.Item
label="页面步骤"
name="step"
tooltip="uid=只到填 UIDbinding=已预填 UID 且角色匹配;confirm/result=后续步骤"
>
<Select
options={[
{ value: 'uid', label: 'uid · 待填 UID' },
{ value: 'binding', label: 'binding · 绑定且 UID 已匹配(推荐)' },
{ value: 'confirm', label: 'confirm · 待确认兑换' },
{ value: 'result', label: 'result · 已完成' },
]}
/>
</Form.Item>
<Form.Item label="游戏 UID" name="uid" rules={[{ required: true, message: '请填 UID' }]}>
<Input placeholder="10001" />
</Form.Item>
<Form.Item label="91 商品 productNo" name="productNo">
<Input placeholder="套餐_1----3676797936" />
</Form.Item>
<Form.Item label="订单号 orderNo(可空自动生成)" name="orderNo">
<Input placeholder="留空自动 MOCK91…" />
</Form.Item>
<Button type="primary" htmlType="submit" loading={lewanMutation.isPending} block>
lewan Mock
</Button>
</Form>
<LewanMockForm
defaultUid={status?.defaultUid || '10001'}
loading={lewanMutation.isPending}
onSubmit={(values) => lewanMutation.mutate(values)}
/>
</Card>
</Col>
<Col xs={24} xl={12}>
<Card title="2. feifei 领取(拼 UID 到 H5" bordered={false}>
<Form
layout="vertical"
initialValues={{
step: 'ready',
uid: '166909256',
productName: '套装-浪漫天命',
}}
onFinish={(values) => feifeiMutation.mutate(values)}
>
<Form.Item label="页面步骤" name="step">
<Select
options={[
{ value: 'uid', label: 'uid · 待填 UID' },
{ value: 'ready', label: 'ready · 已填 UID,可打开 H5(推荐)' },
{ value: 'completed', label: 'completed · 模拟成功' },
{ value: 'failed', label: 'failed · 模拟失败' },
]}
/>
</Form.Item>
<Form.Item label="游戏 UID" name="uid" rules={[{ required: true, message: '请填 UID' }]}>
<Input placeholder="166909256" />
</Form.Item>
<Form.Item label="商品名" name="productName">
<Input />
</Form.Item>
<Form.Item label="H5 链接(可空用 mock 地址)" name="h5Url">
<Input placeholder="http://skin-exchange.../h5/bind?code=..." />
</Form.Item>
<Form.Item label="订单号 orderNo(可空)" name="orderNo">
<Input placeholder="留空自动 MOCKFF…" />
</Form.Item>
<Button type="primary" htmlType="submit" loading={feifeiMutation.isPending} block>
feifei Mock
</Button>
</Form>
<FeifeiMockForm
loading={feifeiMutation.isPending}
onSubmit={(values) => feifeiMutation.mutate(values)}
/>
</Card>
</Col>
@@ -357,3 +295,136 @@ export default function AdminDevMockPage() {
</section>
)
}
function LewanMockForm({
defaultUid,
loading,
onSubmit,
}: {
defaultUid: string
loading: boolean
onSubmit: (values: Record<string, unknown>) => void
}) {
const [form] = Form.useForm()
const step = Form.useWatch('step', form)
const uidRequired = step !== 'uid'
return (
<Form
form={form}
layout="vertical"
initialValues={{
step: 'uid',
uid: defaultUid || '10001',
productNo: '套餐_1----3676797936',
}}
onFinish={onSubmit}
>
<Form.Item
label="页面步骤"
name="step"
tooltip="uid=只到填编号第一步;binding=已预填编号且角色匹配;confirm/result=后续步骤"
>
<Select
options={[
{ value: 'uid', label: 'uid · 待填 UID(第一步)' },
{ value: 'binding', label: 'binding · 绑定且 UID 已匹配(推荐)' },
{ value: 'confirm', label: 'confirm · 待确认兑换' },
{ value: 'result', label: 'result · 已完成' },
]}
/>
</Form.Item>
<Form.Item
label="游戏 UID"
name="uid"
required={uidRequired}
rules={
uidRequired
? [{ required: true, whitespace: true, message: '后续步骤请填写游戏 UID' }]
: []
}
extra={
step === 'uid'
? '「待填 UID」步骤可不填,打开领取页会停留在第一步让用户填写'
: '后续步骤用于模拟已提交的编号,建议与默认角色一致(如 10001)'
}
>
<Input allowClear placeholder={defaultUid || '10001'} />
</Form.Item>
<Form.Item label="91 商品 productNo" name="productNo">
<Input placeholder="套餐_1----3676797936" />
</Form.Item>
<Form.Item label="订单号 orderNo(可空自动生成)" name="orderNo">
<Input placeholder="留空自动 MOCK91…" />
</Form.Item>
<Button type="primary" htmlType="submit" loading={loading} block>
lewan Mock
</Button>
</Form>
)
}
function FeifeiMockForm({
loading,
onSubmit,
}: {
loading: boolean
onSubmit: (values: Record<string, unknown>) => void
}) {
const [form] = Form.useForm()
const step = Form.useWatch('step', form)
const uidRequired = step !== 'uid'
return (
<Form
form={form}
layout="vertical"
initialValues={{
step: 'uid',
uid: '166909256',
productName: '套装-浪漫天命',
}}
onFinish={onSubmit}
>
<Form.Item label="页面步骤" name="step">
<Select
options={[
{ value: 'uid', label: 'uid · 待填 UID(第一步)' },
{ value: 'ready', label: 'ready · 已填 UID,可打开 H5(推荐)' },
{ value: 'completed', label: 'completed · 模拟成功' },
{ value: 'failed', label: 'failed · 模拟失败' },
]}
/>
</Form.Item>
<Form.Item
label="游戏 UID"
name="uid"
required={uidRequired}
rules={
uidRequired
? [{ required: true, whitespace: true, message: '后续步骤请填写游戏 UID' }]
: []
}
extra={
step === 'uid'
? '「待填 UID」步骤可不填,打开领取页会停留在第一步让用户填写'
: '后续步骤用于模拟已提交的编号'
}
>
<Input allowClear placeholder="166909256" />
</Form.Item>
<Form.Item label="商品名" name="productName">
<Input />
</Form.Item>
<Form.Item label="H5 链接(可空用 mock 地址)" name="h5Url">
<Input placeholder="http://skin-exchange.../h5/bind?code=..." />
</Form.Item>
<Form.Item label="订单号 orderNo(可空)" name="orderNo">
<Input placeholder="留空自动 MOCKFF…" />
</Form.Item>
<Button type="primary" htmlType="submit" loading={loading} block>
feifei Mock
</Button>
</Form>
)
}
+21 -13
View File
@@ -1,6 +1,7 @@
import { Alert, Button, Card, Input, Space, Typography } from 'antd'
import { Button, Card, Input, Space, Typography } from 'antd'
import type { ClaimProductInfo } from '@/types/claim'
import { ClaimProductItems, InfoTile } from './claim-shared'
import gameRoleIdGuide from '@/assets/claim/game-role-id-guide.jpg'
export function ClaimUidStep({
uidInput,
@@ -17,38 +18,45 @@ export function ClaimUidStep({
}) {
return (
<Card className="claim-content-card">
<Typography.Title level={2}> 1 UID</Typography.Title>
<Typography.Title level={2}> 1 </Typography.Title>
<p className="claim-muted">
UID
</p>
<div className="claim-info-grid">
<div className="claim-info-grid claim-info-grid-compact">
<InfoTile label="领取商品" value={product?.title || '-'} />
<InfoTile label="商品数量" value={String(product?.quantity || 0)} />
</div>
<ClaimProductItems product={product} />
<ClaimProductItems product={product} compact />
<Space direction="vertical" size={12} style={{ width: '100%' }}>
<Input
size="large"
placeholder="请输入游戏 UID"
placeholder="请输入游戏编号(纯数字)"
value={uidInput}
maxLength={64}
inputMode="numeric"
onChange={(event) => onChange(event.target.value)}
onPressEnter={onSubmit}
/>
<Button type="primary" size="large" loading={submitting} onClick={onSubmit} block>
UID
</Button>
</Space>
<Alert
type="info"
showIcon
style={{ marginTop: 16 }}
message="UID 需与游戏内角色 ID 一致,填错将导致无法发货。"
/>
<p className="claim-uid-warning">
</p>
<div className="claim-uid-guide">
<img
src={gameRoleIdGuide}
alt="游戏编号位置示意:复制游戏内角色编号提交纯数字"
className="claim-uid-guide-image"
/>
<p className="claim-uid-guide-caption"></p>
</div>
</Card>
)
}
@@ -186,7 +186,7 @@ function resolveProgressText(options: {
isUidMatched: boolean
}) {
if (!options.hasExpectedUid) {
return '请填写游戏 UID'
return '请填写游戏编号'
}
if (options.isFeifeiFlow) {
return options.feifei?.rechargeStatusLabel || `UID ${options.expectedUid},请打开领取链接`