我的奖品模块
一、模块定位
我的奖品页面是用户查看所有中奖记录的统一入口,涵盖实物奖品地址管理、虚拟权益领取、冠军皮肤进度展示,是活动期间用户回访的核心页面之一。
关于活动整体背景和全局规则,请见 足球季活动全局。
二、功能需求清单
2.1 页面入口
- 活动主页提供明显的「我的奖品」入口(按钮/tab/浮标)
- 活动期间和活动结束后(表彰页阶段)均可访问
2.2 奖品列表
页面展示用户在活动期间的所有中奖记录,按奖品类型分区展示:
2.2.1 冠军皮肤(始终展示)
冠军皮肤在活动期间始终显示在列表顶部,不论用户是否中奖:
| 用户状态 | 展示形式 | 说明 |
|---|---|---|
| 未达标 | 置灰显示 + 两个条件进度 | 助威球队是否夺冠 + 完课进度条(如 "7/10") |
| 已达标 | 正常显示,标记"已获得" | 活动结束后判定,详见 冠军皮肤奖励模块 |
- 完课进度数据实时获取(来自 完课数据模块)
- 助威球队夺冠状态在活动结束后才能确定
2.2.2 实物奖品(公仔挂件 / 叫叫金片)
仅在中奖后展示,每个实物奖品对应一条记录:
| 地址状态 | 展示内容 | 操作按钮 |
|---|---|---|
| 未填写 | 奖品名称 + "待填写收货地址"提示 | 「填写地址」 |
| 已填写 | 奖品名称 + 地址摘要(省市区+详细地址前10字) | 「修改地址」 |
- 点击「填写地址」或「修改地址」跳转至地址填写页,详见 收货地址模块
- 活动结束后地址变为只读,按钮改为「查看地址」,不可编辑
2.2.3 虚拟权益奖品
仅在中奖后展示,口算VIP月卡和体验课采用不同展示方式:
叫叫口算VIP月卡(激活码模式):
| 领取状态 | 展示内容 | 操作按钮 |
|---|---|---|
| 未领取 | 奖品名称 + 激活码 + "激活码已复制"提示 | 「立即领取」 |
| 已领取 | 奖品名称 + 激活码 + "已领取"标记 | 「再次领取」(方便重试) |
- 激活码在中奖时已由后端分配,展示时始终可见
- 点击「立即领取」:通过 Bridge
openBrowser在系统浏览器中打开兑换页面(https://act.cdssylkj.com/activeCode/index) - 兑换页面中用户粘贴激活码完成兑换
- "已领取"状态由前端本地记录(用户点击过即标记),不代表目标页面已完成兑换
体验课(跳转链接模式):
| 领取状态 | 展示内容 | 操作按钮 |
|---|---|---|
| 未领取 | 奖品名称 + "点击领取"引导 | 「立即领取」 |
| 已领取 | 奖品名称 + "已领取"标记 | 「再次领取」(方便链接失效时重试) |
- 点击「立即领取」跳转到对应的领取页面链接,详见 抽奖模块 2.4.1 节
- 领取链接由后端配置返回,运营可随时修改
- "已领取"状态由前端本地记录(用户点击过即标记),不代表目标页面已完成兑换
2.3 空状态
- 用户尚未中过任何奖品(且冠军皮肤未达标)时,展示空状态页面
- 空状态内容:引导文案(如"快去投票抽奖,赢取好礼吧!")+ 跳转按钮回到活动主页
三、业务规则与约束
3.1 列表排序
- 冠军皮肤始终置顶
- 其余奖品按中奖时间倒序排列(最新的在前)
3.2 数据获取
- 中奖记录从服务端接口获取(需后端提供查询接口)
- 完课进度从完课数据接口获取
- 页面每次打开时刷新数据
3.3 前置条件
- 用户必须在 App 内打开活动页面(已登录状态)
3.4 边界场景
| 场景 | 处理方式 |
|---|---|
| 用户从未中过奖 | 展示空状态,引导回主页投票抽奖 |
| 中奖记录接口请求失败 | 展示"加载失败,点击重试",不展示空状态 |
| 活动结束后访问我的奖品 | 正常展示,实物地址只读,虚拟领取入口保留 |
| 同一用户中多种奖品 | 每种奖品独立一条记录,分别展示各自状态 |
| 用户已中过口算VIP月卡(限1次) | 列表中展示该条中奖记录(含激活码),后续不会再中此奖品 |
3.5 预留 API 接口(待后端设计)
GET /api/my-prizes
Response: { prizes: [{ type, name, wonAt, addressStatus?, address?, activationCode?, redeemUrl?, redeemStatus? }], skinProgress: { teamWon, lessonsCompleted, targetLessons } }