Appearance
里程挑战模块 (Mileage Challenge)
文档版本: V3.0 更新日期: 2026-03-05 状态: 定稿 V3 变更: 文档重构——合并 PRD+详情页+打卡型原型+B端管理为单一完整文档,消除内容重复 依赖: 通用组件规范
0. 背景与目标 (Context & Goals)
问题陈述 (Problem Statement)
- 活跃度激励: 仅仅记录滑雪轨迹缺乏显性的激励机制,用户容易流失。
- 社群凝聚力: 俱乐部缺乏组织线上比赛的工具,传统的"晒数据截图"方式统计繁琐且难以验证真伪。
- 官方运营: 平台需要通过全网挑战赛(如"百万落差挑战")来维持雪季期间的 DAU。
- V2 新增 — 雪场深度绑定: 现有积累型挑战与具体雪场的关联较弱(仅作为数据过滤条件),缺乏让用户"深度探索一座雪场"的玩法。雪道打卡填补了这一空白,同时为雪场合作(B2B)开辟了新的运营工具。
成功指标 (Success Metrics)
- 参与度: 挑战赛的报名人数与完赛率。
- 粘性: 参与挑战赛用户的周均启动次数提升 20%。
- V2 新增: 雪道打卡挑战的平均打卡完成率(目标 > 40%);挑战期间用户在目标雪场的平均滑行天数(目标 > 3天)。
一、 核心逻辑与业务规则
1.1 双重身份 (Dual Identity)
本模块同时服务于 官方 (Official) 和 俱乐部 (Club)。
- 官方: 发起全网活动,具备最高权重,奖品通常由品牌赞助。
- 俱乐部: 发起私域活动,可限制仅本俱乐部成员参加,增强社群归属感。
1.2 数据来源 (Data Source)
- 自动采集: 依托 APP 内置的 GPS 轨迹记录功能。
- 有效性校验: 仅统计挑战赛时间范围内且数据有效(非车载/缆车异常数据)的滑行记录。
1.3 挑战类型分层(V2 新增)
里程挑战分为两大类型,底层逻辑完全不同:
挑战类型
├── 积累型 (Accumulation)
│ ├── 累计里程 (KM)
│ ├── 累计落差 (Vertical Drop)
│ └── 累计滑行时长 (Duration)
│
└── 打卡型 (Check-in)
└── 雪道打卡 (Trail Check-in)
├── 打卡范围:全部雪道 / 初级道 / 中级道 / 高级道
└── 排名依据:最先集齐者排名靠前两种类型的核心差异:
| 维度 | 积累型 | 打卡型 |
|---|---|---|
| 排名逻辑 | 数值累加,大者居前 | 集齐打卡,先完成者居前 |
| 成绩表示 | 单一数值 (128.5km) | 进度 + 完成时间 (12/12 ✅ 01.25 14:32) |
| 技术依赖 | 轨迹的里程/落差/时长计算 | 轨迹 × 雪道检查点匹配 |
| 激励语 | "再滑 2km 即可超越" | "还差 3 条雪道即可集齐" |
| 上榜条件 | 有有效成绩即可 | 仅集齐全部目标雪道才上榜 |
二、 积累型挑战 — 详细功能定义
2.1 发布端 (官方/Club管理台)
| 板块 | 字段/功能 | 说明/规则 |
|---|---|---|
| 基础信息 | 挑战名称 | e.g., "崇礼开板首滑挑战" |
| 挑战时间 | 开始时间 ~ 结束时间。 | |
| 排名规则 | 统计维度 | 单选: 1. 累计里程 (KM) 2. 累计落差 (Vertical Drop) 3. 累计滑行时长 (Duration) |
| 范围限制 | 可选指定雪场 (e.g., 仅限"万龙滑雪场"的数据)。 | |
| 奖励配置 | 排名奖 | 前 [3] 名的奖品描述 (支持图文)。 |
| 参与奖 | 完赛(达到基础门槛)即可获得的奖励。通常为积分/勋章。 | |
| 参与门槛 | 达标数据 | 设定最低有效数据 (e.g., 累计滑行 > 10km) 才算"完赛"。 |
| 权限控制 | 参与范围 | 1. 全网公开 (仅官方可发) 2. 仅限俱乐部成员 (Club 默认) 3. 指定群组 (关联 IM 群) |
2.2 用户端 (C-Side Flow)
A. 挑战列表
- 我的挑战: 展示已报名且进行中的挑战。
- 积累型:进度条 + 当前成绩值 + 排名
- 打卡型:进度条 + "N/N 条" + 排名(仅集齐后显示)
- 发现挑战: 推荐官方热门挑战及用户所在俱乐部的挑战。
挑战列表卡片
积累型:
┌────────────────────────────────────┐
│ [封面] 崇礼开板首滑挑战 │
│ 32.5 km · #42 · 进行中 │
│ [████████░░░░░░░░] 32% │
└────────────────────────────────────┘打卡型:
┌────────────────────────────────────┐
│ [封面] 万龙初级道打卡挑战 │
│ 5/8 条 · 进行中 │
│ [██████████░░░░░░] 63% │
│ 📍 万龙滑雪场 │
└────────────────────────────────────┘打卡型额外显示目标雪场;集齐后进度条变绿 + 显示排名和完成时间。
B. 挑战详情与排行榜
- 实时榜单: 动态刷新 Top 100 排名。
- 显示:头像、昵称、所属俱乐部、成绩数值。
- 我的战绩:
- 当前排名。
- 距离上一名/获奖区的差距 ("再滑 2km 即可超越/获奖") -> 核心激励点。
C. 数据同步逻辑
mermaid
sequenceDiagram
participant U as 用户 (App)
participant S as 服务端 (Challenge Svc)
U->>U: 结束滑行,上传轨迹
U->>S: 提交 Track Data
S->>S: 校验数据有效性 (去噪)
S->>S: 检索用户参与的所有"进行中"挑战
loop 遍历挑战
S->>S: 过滤是否符合挑战规则 (时间/雪场)
S->>S: 累加成绩 (Increment Score)
end
S->>S: 更新排行榜 (Redis ZSet)
S-->>U: 返回本次滑行更新的挑战进度三、 打卡型挑战 — 雪道打卡(V2 新增)
3.1 核心概念
一句话定义:发起人选择一个雪场,参与者通过滑行自动打卡该雪场的雪道,最先集齐指定分类(全部/初/中/高级道)的所有雪道者排名靠前。
核心机制:
- 挑战必须绑定一个具体雪场(不可选多雪场或不限雪场)。
- 系统根据雪场的雪道数据库自动生成打卡清单。
- 打卡判定基于检查点机制(非全段覆盖):每条雪道设置若干 GPS 检查点,用户的滑行轨迹经过全部检查点即判定该雪道打卡成功。
- 仅集齐目标分类全部雪道的用户才上榜,按完成时间的先后排名。未集齐者不排名。
3.2 检查点机制
3.2.1 选点规则
核心原则:基于雪道 GIS 数据自动生成,避开首尾,中段等距采样。
系统读取雪道的中心线 (Polyline) 数据,自动执行以下算法:
- 计算雪道全长 L
- 跳过首尾各 20%(起点/终点多道交汇区,GPS 无法区分)
- 在中段 60% 区间内,按雪道长度自动等距选取检查点
雪道中心线(GIS Polyline):
|--20%--|------60%------|--20%--|
跳过 ● C1 ● C2 ● C3 跳过
↑ 系统自动等距采样检查点数量(自动计算):
| 雪道长度 | 检查点数 |
|---|---|
| < 500m | 2 个 |
| 500m - 1.5km | 3 个 |
| > 1.5km | 4-5 个 |
检查点参数:
- 半径:40m(兼容 GPS 误差 + 雪道宽度)
3.2.3 匹配算法
用户上传一条完整的滑行轨迹后,服务端对每条未打卡雪道执行以下匹配流程:
输入:
- 轨迹 T = [P1, P2, ..., Pn],每个点含 (经度, 纬度, 时间戳, 海拔, 速度)
- 雪道 S 的检查点序列 C = [C1, C2, ..., Cm],每个点含 (经度, 纬度, 半径)
Step 1 — 空间命中
遍历轨迹点 T,找出进入每个检查点半径范围内的轨迹点:
- 对每个 Ci,找到第一个满足 distance(Pj, Ci) ≤ Ci.半径 的轨迹点 Pj
- 记录 hit(Ci) = Pj(首次命中的轨迹点)
- 如果某个 Ci 没有任何轨迹点命中 → 匹配失败,退出
Step 2 — 有序性校验
验证检查点的命中顺序与轨迹时间线一致:
- 要求 hit(C1).时间戳 < hit(C2).时间戳 < ... < hit(Cm).时间戳
- 如果顺序不一致 → 匹配失败(可能是反向滑行或轨迹乱序)
Step 3 — 时间窗口过滤
验证通过所有检查点的总耗时合理:
- 总耗时 = hit(Cm).时间戳 - hit(C1).时间戳
- 最短耗时 = 雪道长度 / 最大合理速度(80km/h)
- 最长耗时 = 雪道长度 / 最小合理速度(3km/h)
- 要求 最短耗时 ≤ 总耗时 ≤ 最长耗时
- 超出范围 → 匹配失败(太快=车载/数据异常,太慢=步行/排队)
Step 4 — 速度特征校验(辅助)
命中区间内的轨迹点平均速度应在合理范围:
- 平均速度 ≥ 5 km/h(排除步行上山)
- 平均速度 ≤ 80 km/h(排除车载)
全部通过 → 判定该雪道打卡成功,记录完成时间 = hit(Cm).时间戳3.2.4 检查点数据管理
- 自动生成:导入雪场雪道 GIS 数据后,系统自动计算检查点坐标,无需人工标注。
- 运营可微调:自动生成后,运营可在后台查看和微调检查点位置(极端情况下的兜底手段)。
- 版本管理:雪场开放/关闭雪道时,更新 GIS 数据后系统自动重新生成检查点。已进行中的挑战不受影响(快照机制)。
3.3 打卡范围
一个"雪道打卡"挑战对应一个打卡范围,发起人在创建时选择:
| 打卡范围 | 打卡目标 | 示例 |
|---|---|---|
| 全部雪道 | 该雪场所有雪道 | 0/25 条 |
| 初级道 | 仅初级雪道 | 0/8 条 |
| 中级道 | 仅中级雪道 | 0/10 条 |
| 高级道 | 仅高级雪道 | 0/7 条 |
一个挑战 = 一个打卡范围 = 一个排行榜 = 一套奖励。 如需覆盖多个分类,发起人创建多个挑战。
排名规则:
- 仅限集齐该范围全部雪道的用户才上榜。
- 集齐者按完成时间(最后一条雪道的打卡时间戳)升序排名。
- 未集齐者不出现在榜单中。
3.4 奖励配置
与积累型一致,发起人配置一套奖励:
- 排名奖: 前 N 名,支持雪币 + 实物奖品描述。
- 完赛奖: 集齐该范围全部雪道即可获得,支持雪币 + 实物奖品描述。
3.5 发布端配置
发起人通过标题栏下拉切换到「雪道打卡」类型后,表单字段联动变化。共享字段(封面、标题、描述、时间、报名截止、人数限制、费用、更多设置)与积累型完全一致,以下仅列差异字段:
| 区域 | 字段 | 说明 |
|---|---|---|
| 目标雪场 | 必选 | 行卡(复用「活动地点」组件),点击进入雪场选择页,仅展示有 GIS 数据的雪场 |
| 打卡范围 | 必选 | chip 四选一:全部雪道 / 初级道 / 中级道 / 高级道。选后展示雪道数量预览 |
| 排名提示 | 只读 | 一行轻提示:「⏱️ 排名规则:最先集齐全部雪道者排名靠前」 |
| 奖项设置 | Tab 变更 | 底部弹窗第二个 Tab 从「参与奖」改为「完赛奖」(集齐即得,不限名额) |
| 活动地点 | 隐藏 | 被目标雪场替代 |
| 排名规则 | 隐藏 | 三选一 chip 不显示(排名规则固定为按完成时间) |
与积累型的核心差异:没有「统计维度」选择和「参与门槛」设置。完赛由系统自动判定(集齐 = 完赛),排名按完成时间先后。
UI 实现:详见 打卡型原型设计。
3.6 用户端 — 挑战详情页
┌────────────────────────────────────┐
│ 🏔️ 万龙初级道打卡挑战 │
│ 01/15 - 02/15 · 进行中 │
├────────────────────────────────────┤
│ 📍 万龙滑雪场 · 初级道 8 条 │
├────────────────────────────────────┤
│ 📋 我的打卡进度 5/8 │
│ ┌────────────────────────────────┐ │
│ │ ✅ 银龙道 01/16 打卡 │ │
│ │ ✅ 玉龙道 01/17 打卡 │ │
│ │ ✅ 白龙道 01/18 打卡 │ │
│ │ ✅ 小龙道 01/19 打卡 │ │
│ │ ✅ 青龙道 01/20 打卡 │ │
│ │ ⬜ 云龙道 未打卡 │ │
│ │ ⬜ 雪龙道 未打卡 │ │
│ │ ⬜ 冰龙道 未打卡 │ │
│ │ 还差 3 条雪道 💪 │ │
│ └────────────────────────────────┘ │
├────────────────────────────────────┤
│ 🏆 排行榜(已集齐 2 人) │
│ ┌────────────────────────────────┐ │
│ │ 🥇 雪疯子 8/8 01/22 完成 │ │
│ │ 🥈 粉雪控 8/8 01/24 完成 │ │
│ └────────────────────────────────┘ │
│ 💡 集齐全部初级道后,你将出现在榜单 │
└────────────────────────────────────┘3.7 数据同步逻辑
mermaid
sequenceDiagram
participant U as 用户 (App)
participant S as 服务端 (Challenge Svc)
participant G as 地理围栏服务
U->>U: 结束滑行,上传轨迹
U->>S: 提交 Track Data
S->>S: 校验数据有效性 (去噪)
S->>S: 检索用户参与的所有"进行中"挑战
loop 遍历打卡型挑战
S->>G: 轨迹 GPS 点 × 雪场检查点匹配
G-->>S: 返回本次轨迹命中的雪道列表
S->>S: 更新用户打卡记录 (新增已打卡雪道)
S->>S: 检查是否集齐该挑战全部目标雪道
S->>S: 更新排行榜 (仅集齐者)
end
S-->>U: 返回本次滑行的打卡结果
Note over U: 弹出打卡成功动画<br/>"恭喜!银龙道 打卡成功 🎉<br/>还差 3 条即可集齐"四、C 端详情页
UI 交互设计,基于 通用组件规范 的页面骨架和组件库。
4.1 模块定位
场景:官方/俱乐部发起的里程/落差/时长挑战赛及雪道打卡挑战,用户通过 GPS 轨迹自动累计成绩或自动打卡。
核心交互:
- 积累型:查看规则 → 报名 → 滑雪自动累计 → 查看排名
- 打卡型:查看规则 → 报名 → 滑雪自动打卡 → 集齐上榜 → 查看排名
Tab 栏(对齐 App 现有结构):
- 积累型:
活动详情 | 里程排名 | 获奖名单 - 打卡型:
活动详情 | 打卡进度 | 排行榜 | 获奖名单
4.2 差异化插槽区
2.1 排行榜区
┌────────────────────────────────────┐
│ 🏆 实时排行榜 Top 100 ▼ │
│ ┌────────────────────────────────┐ │
│ │ 🥇 雪疯子 太舞 128.5km │ │
│ │ 🥈 粉雪控 万龙 98.2km │ │
│ │ 🥉 单板小明 云顶 87.6km │ │
│ │ 4 冰雪女王 松花湖 76.3km │ │
│ │ 5 极限骑士 北大壶 71.8km │ │
│ │ [查看完整榜单 ▼] │ │
│ └────────────────────────────────┘ │
├────────────────────────────────────┤
│ 📈 我的战绩 │
│ ┌────────────────────────────────┐ │
│ │ 当前排名 #42 │ │
│ │ 累计里程 32.5 km │ │
│ │ 距上一名 还差 2.3 km 🔥 │ │
│ └────────────────────────────────┘ │
└────────────────────────────────────┘字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
| 排行榜数据 | 数组 | 榜单条目列表 |
| 我的排名 | 整数 | 当前用户排名 |
| 我的成绩 | 小数 | 当前用户累计成绩 |
| 距上一名差距 | 小数 | 与上一名的成绩差值 |
| 距获奖区差距 | 小数 | 与获奖名次的成绩差值(可选) |
| 是否完赛 | 布尔 | 是否达到完赛门槛 |
榜单条目对象
| 字段名 | 类型 | 说明 |
|---|---|---|
| 排名 | 整数 | 名次 |
| 用户头像 | 图片 | 头像 |
| 用户昵称 | 字符串 | 昵称 |
| 所属俱乐部 | 字符串 | 俱乐部名称(可选) |
| 成绩值 | 小数 | 成绩数值 |
| 单位 | 字符串 | km/m/km/h |
排行榜交互
| 操作 | 行为 |
|---|---|
| 点击「查看完整榜单」 | 展开至 Top 100 |
| 点击榜单用户 | 跳转该用户个人主页 |
| 下拉刷新 | 刷新排行榜数据 |
2.2 挑战规则区
┌────────────────────────────────────┐
│ 📋 挑战规则 │
├────────────────────────────────────┤
│ 📊 统计维度:累计里程(公里) │
│ 🎿 有效雪场:万龙、云顶、太舞 │
│ ⏰ 挑战周期:01/15 - 02/15 │
│ 🏅 完赛门槛:累计滑行 ≥ 10km │
├────────────────────────────────────┤
│ 👥 参与范围:全网公开 │
│ (或:仅限 XX 俱乐部成员) │
├────────────────────────────────────┤
│ 🎁 奖励设置 │
│ • 🥇 第1名:品牌滑雪服一套 │
│ • 🥈 第2名:雪场年卡 │
│ • 🥉 第3名:雪具代金券 ¥500 │
│ • 🏅 完赛奖:100雪币 + 限定周边 │
└────────────────────────────────────┘字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
| 挑战类型 | 枚举 | 里程/落差/时长 |
| 有效雪场 | 数组 | 有效雪场范围(空=全部有效) |
| 开始时间 | 时间戳 | 挑战开始时间 |
| 结束时间 | 时间戳 | 挑战结束时间 |
| 完赛门槛 | 小数 | 最低有效成绩 |
| 参与范围 | 枚举 | 全网公开/仅限俱乐部成员 |
| 关联俱乐部 | 对象 | 俱乐部信息(仅限俱乐部时必填) |
| 排名奖列表 | 数组 | 前 N 名奖品配置 |
| 完赛奖 | 对象 | 完赛即得奖励 |
2.3 打卡型挑战差异化插槽区
当挑战类型为「雪道打卡」时,详情页使用以下插槽区替换 2.1 排行榜区和 2.2 挑战规则区。
2.3.1 打卡进度区
┌────────────────────────────────────┐
│ 📋 打卡进度 5/8 │
│ ┌────────────────────────────────┐ │
│ │ ✅ 银龙道 01/16 打卡 │ │
│ │ ✅ 玉龙道 01/17 打卡 │ │
│ │ ✅ 白龙道 01/18 打卡 │ │
│ │ ✅ 小龙道 01/19 打卡 │ │
│ │ ✅ 青龙道 01/20 打卡 │ │
│ │ ⬜ 云龙道 未打卡 │ │
│ │ ⬜ 雪龙道 未打卡 │ │
│ │ ⬜ 冰龙道 未打卡 │ │
│ │ 还差 3 条雪道 💪 │ │
│ └────────────────────────────────┘ │
└────────────────────────────────────┘打卡进度字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
| 已打卡数 | 整数 | 已完成的雪道数 |
| 总数 | 整数 | 该挑战目标雪道总数 |
| 雪道列表 | 数组 | 雪道打卡状态清单 |
雪道条目对象
| 字段名 | 类型 | 说明 |
|---|---|---|
| 雪道名称 | 字符串 | 雪道名称 |
| 打卡状态 | 布尔 | 是否已打卡 |
| 打卡时间 | 时间戳 | 首次打卡时间(未打卡为空) |
打卡进度交互
| 操作 | 行为 |
|---|---|
| 点击已打卡雪道 | 查看该次滑行轨迹详情 |
2.3.2 打卡型排行榜区
┌────────────────────────────────────┐
│ 🏆 排行榜(已集齐 2 人) │
│ ┌────────────────────────────────┐ │
│ │ 🥇 雪疯子 8/8 01/22 完成 │ │
│ │ 🥈 粉雪控 8/8 01/24 完成 │ │
│ └────────────────────────────────┘ │
│ 💡 集齐全部初级道后,你将出现在榜单 │
└────────────────────────────────────┘打卡型榜单条目对象
| 字段名 | 类型 | 说明 |
|---|---|---|
| 排名 | 整数 | 名次 |
| 用户头像 | 图片 | 头像 |
| 用户昵称 | 字符串 | 昵称 |
| 进度 | 字符串 | "N/N" 格式 |
| 完成时间 | 时间戳 | 最后一条雪道打卡时间 |
空状态提示: 尚无人集齐时,显示空状态:"暂无人集齐,成为第一个吧!🏔️"
2.3.3 打卡挑战规则区
┌────────────────────────────────────┐
│ 📋 挑战规则 │
├────────────────────────────────────┤
│ 🏔️ 目标雪场:万龙滑雪场 │
│ 🎿 打卡范围:初级道 8 条 │
│ ⏰ 挑战周期:01/15 - 02/15 │
│ 📊 排名方式:最先集齐者排名靠前 │
├────────────────────────────────────┤
│ 🏅 上榜条件 │
│ 集齐全部初级道即登上排行榜 │
├────────────────────────────────────┤
│ 🎁 奖励设置 │
│ • 🥇 第1名:品牌滑雪服一套 │
│ • 🥈 第2名:雪场年卡 │
│ • 🥉 第3名:雪具代金券 ¥500 │
│ • 🏅 完赛奖:集齐全部初级道 → 100雪币│
└────────────────────────────────────┘4.3 打卡型详情页原型
以下原型基于真实 App 截图迭代。
活动详情 Tab 对比

打卡进度 Tab(打卡型新增)

排行榜 Tab 对比

获奖名单 Tab 对比

4.4 发布者卡片配置
| 发起身份 | 展示样式 |
|---|---|
| 官方 | 雪哒官方头像 + ✅官方认证 |
| 俱乐部 | 俱乐部头像 + 🏔️俱乐部标签 + 成员数 |
4.5 完赛感言区
┌────────────────────────────────────┐
│ 🗣️ 完赛感言 (23条) [更多] │
│ ┌────────────────────────────────┐ │
│ │ 👤 雪疯子 🥇 第1名 │ │
│ │ 终于登顶了!感谢队友陪练! │ │
│ │ 累计 128.5km · 01/28 │ │
│ └────────────────────────────────┘ │
└────────────────────────────────────┘4.6 报名流程(底部抽屉)
交互:统一使用底部抽屉模式,保持交互一致性
5.1 积累型报名抽屉
┌────────────────────────────────────┐
│ 报名挑战 [×] │
├────────────────────────────────────┤
│ 挑战名称:崇礼开板首滑挑战 │
│ 挑战周期:01/15 - 02/15 │
│ 有效雪场:万龙、云顶、太舞 │
├────────────────────────────────────┤
│ ⓘ 报名后,您在有效雪场的滑行数据将 │
│ 自动计入挑战成绩。 │
├────────────────────────────────────┤
│ ☑ 我已阅读并同意《挑战规则》 │
├────────────────────────────────────┤
│ [确认报名] │
└────────────────────────────────────┘5.2 打卡型报名抽屉(V2 新增)
┌────────────────────────────────────┐
│ 报名挑战 [×] │
├────────────────────────────────────┤
│ 挑战名称:万龙初级道打卡挑战 │
│ 挑战周期:01/15 - 02/15 │
│ 目标雪场:万龙滑雪场 │
│ 打卡范围:初级道 8 条 │
├────────────────────────────────────┤
│ ⓘ 报名后,在万龙滑雪场滑行时系统将 │
│ 自动匹配雪道检查点完成打卡。 │
├────────────────────────────────────┤
│ ☑ 我已阅读并同意《挑战规则》 │
├────────────────────────────────────┤
│ [确认报名] │
└────────────────────────────────────┘差异:打卡型展示「目标雪场」+「打卡范围」替代「有效雪场」,提示文案改为打卡匹配说明。
付费挑战:若挑战设置报名费,底部抽屉显示费用明细和支付按钮
4.7 须知规则区配置
标题:📋 数据说明
6.1 积累型默认内容
- 仅统计挑战周期内的有效滑行数据
- 数据来源:APP 内置 GPS 轨迹记录
- 异常数据(车载/缆车)将被自动过滤
- 榜单每 5 分钟更新一次
6.2 打卡型默认内容(V2 新增)
- 仅统计挑战周期内的有效滑行数据
- 数据来源:APP 内置 GPS 轨迹记录
- 打卡判定基于 GPS 检查点自动匹配,无需手动操作
- 同一雪道重复滑行不重复打卡,仅记录首次打卡时间
- 集齐全部目标雪道后自动上榜,按完成时间排名
- 打卡结果在每次滑行结束后即时返回
4.8 底部操作栏配置
布局结构(三列版本)
┌─────────────────────────────────────────┐
│ [咨询] [收藏] │ ¥价格/免费 │ [主操作按钮] │
└─────────────────────────────────────────┘| 元素 | 说明 |
|---|---|
| 咨询按钮 | 图标+文字,点击联系客服 |
| 收藏按钮 | 图标+文字,切换收藏状态 |
| 价格区 | 免费 或 ¥{报名费} |
| 主按钮 | 见下表 |
主按钮状态
| 状态 | 按钮文案 | 按钮样式 | 左侧信息 |
|---|---|---|---|
| 未报名 | 报名挑战 | 蓝色填充 | 价格 |
| 已报名(积累型) | 去滑雪 | 绿色填充 | — |
| 已报名未集齐(打卡型) | 去滑雪 | 绿色填充 | 进度 5/8 |
| 已集齐(打卡型) | 已集齐 🎉 | 蓝色描边 | 排名 #3 |
| 挑战未开始 | 敬请期待 | 灰色置灰 | — |
| 已结束 | 已结束 | 灰色置灰 | — |
与雪友组局保持一致的三列布局,适用于社交属性较强的活动页面。
4.9 打卡成功反馈
每次滑行结束后,若有新雪道被打卡成功,触发以下反馈。
8.1 Toast 通知(即时)
┌────────────────────────────────────┐
│ 🎉 银龙道 打卡成功! │
│ 当前进度 5/8 · 还差 3 条即可集齐 │
└────────────────────────────────────┘| 属性 | 说明 |
|---|---|
| 触发时机 | 滑行结束 + 服务端返回打卡结果后 |
| 展示时长 | 3 秒自动消失,可手动滑走 |
| 多道打卡 | 单次滑行打卡多条雪道时,逐条展示(间隔 0.5s) |
| 点击行为 | 跳转该挑战详情页(打卡进度区) |
8.2 集齐庆祝弹窗
┌────────────────────────────────────┐
│ 🎊 │
│ 恭喜集齐全部初级道! │
│ │
│ 完成时间 01/25 14:32 │
│ 当前排名 🥉 第3名 │
│ │
│ [查看排行榜] [分享] │
└────────────────────────────────────┘| 属性 | 说明 |
|---|---|
| 触发条件 | 最后一条雪道打卡成功(进度 N/N) |
| 展示方式 | 全屏模态弹窗 + 撒花动效 |
| 包含信息 | 完成时间 + 当前排名 + 分享入口 |
8.3 Push 通知
| 场景 | 通知文案 |
|---|---|
| 单道打卡 | 🎿 银龙道打卡成功!还差3条集齐「万龙初级道打卡挑战」 |
| 集齐 | 🎊 恭喜集齐全部初级道!当前排名第3名,快来查看 |
4.10 关联信息展示规则
V1.3 新增:遵循通用组件规范中的 ClubCard / ResortCard 定义
9.1 关联俱乐部 (ClubCard)
位置:发布者卡片下方
条件渲染:仅当活动配置了关联俱乐部时显示
9.2 关联雪场 (ResortCard)
位置:赛事规则区下方(页面底部)
条件渲染:仅当活动配置了关联雪场时显示
五、发布端 — 创建页
一、类型切换
标题栏下拉选择器(复用现有 里程挑战 ▾ 控件):
| 选项 | 对应类型 | 说明 |
|---|---|---|
| 里程挑战 | 积累型 | 现有逻辑不变 |
| 雪道打卡 | 打卡型 | 切换后联动显隐下方字段 |
切换时表单数据不清空(共享字段保留,专属字段各自缓存)。
二、发布端 — 创建页

2.1 字段差异表
仅列出有差异的字段。未列出的字段(封面、标题、描述、时间、报名截止、限制人数、费用与权益、更多设置)两种类型完全一致。
| 字段 | 积累型 | 打卡型 | 复用组件 |
|---|---|---|---|
| 提示横幅 | 🧭 轨迹数据自动采集 | 📍 轨迹自动采集 · 雪道自动打卡 | Banner 卡片 |
| 排名规则 | 三选一 chip(里程/落差/时长) | 一行轻提示:「⏱️ 最先集齐全部雪道者排名靠前」 | chip-card → hint-line |
| 目标雪场 | — | 🆕 必选,点击进入雪场选择页 | 复用「活动地点」行卡 |
| 打卡范围 | — | 🆕 四选一 chip + 雪道数预览 | 复用「报名截止时间」chip 卡 |
| 活动地点 | 请选择 | — 隐藏(被目标雪场替代) | — |
| 奖项设置 | 排名奖 + 参与奖 | 排名奖 + 完赛奖 | 复用底部弹窗,Tab 名变更 |
2.2 字段顺序(打卡型)
标题栏「雪道打卡 ▾」
├── 提示横幅(文案变更)
├── 封面 / 标题 / 描述 ← 不变
├── 🆕 目标雪场 ← 替代排名规则位置
├── 🆕 打卡范围 + 雪道数预览
├── ⏱️ 排名轻提示(一行文案)
├── 🎁 奖项设置(完赛奖 Tab)
├── ⏰ 时间 ← 不变
├── 📅 报名截止 ← 不变
├── 👥 限制人数 ← 不变
├── 💰 费用与权益 ← 不变
├── ⚙️ 更多设置 ← 不变
└── [发布]2.3 目标雪场选择页
- 列表展示所有雪场,仅 GIS 数据已就绪的雪场可选
- 未接入 GIS 的雪场灰显 + 提示「暂无雪道数据」
- 选中后返回创建页,行卡右侧显示雪场名称
2.4 打卡范围
| chip 选项 | 含义 |
|---|---|
| 全部雪道 | 该雪场全部雪道 |
| 初级道 | 仅初级难度雪道 |
| 中级道 | 仅中级难度雪道 |
| 高级道 | 仅高级难度雪道 |
选中后下方显示预览条:🎿 {难度} 共 N 条 · 集齐即完赛
必须先选目标雪场才能选打卡范围(未选雪场时 chip 置灰)。
2.5 完赛奖(奖项弹窗变更)
复用现有「添加奖项」底部弹窗,Tab 变更:参与奖 → 完赛奖
完赛奖 = 集齐全部目标雪道即可获得,不限名额。
六、发起人管理(B 端)
一、入口与导航
导航路径:
我的 Tab → 我的活动 → 我发起的 → 点击挑战卡片 → 挑战管理详情页注:普通用户无法发起里程挑战,此功能仅对官方运营和俱乐部管理员开放。
二、挑战管理详情页
┌────────────────────────────────────┐
│ ← 挑战管理 │
├────────────────────────────────────┤
│ 🏆 崇礼开板首滑挑战 │
│ 01/15 - 02/15 · 进行中 │
├────────────────────────────────────┤
│ 📊 参与概况 │
│ ┌────────────────────────────────┐ │
│ │ 已报名 128 人 │ │
│ │ 有效成绩 86 人 │ │
│ │ 完赛人数 23 人 │ │
│ └────────────────────────────────┘ │
├────────────────────────────────────┤
│ 🏅 排行榜预览 │
│ ┌────────────────────────────────┐ │
│ │ 🥇 雪疯子 128.5km │ │
│ │ 🥈 粉雪控 98.2km │ │
│ │ 🥉 单板小明 87.6km │ │
│ │ [查看完整榜单] │ │
│ └────────────────────────────────┘ │
├────────────────────────────────────┤
│ [发公告] [编辑规则] [结束挑战] │
└────────────────────────────────────┘三、核心功能
3.1 参与概况
积累型
| 指标 | 说明 |
|---|---|
| 已报名 | 总报名人数 |
| 有效成绩 | 有至少一次有效轨迹的人数 |
| 完赛人数 | 达到完赛门槛的人数 |
打卡型(V2 新增)
| 指标 | 说明 |
|---|---|
| 已报名 | 总报名人数 |
| 已打卡 | 至少打卡 1 条雪道的人数 |
| 已集齐 | 集齐全部目标雪道的人数 |
打卡进度分布(打卡型独有):
┌────────────────────────────────────┐
│ 📊 打卡进度分布 │
│ ┌────────────────────────────────┐ │
│ │ 8/8 (集齐) ████████████ 12人 │ │
│ │ 6-7/8 ██████████ 9人 │ │
│ │ 3-5/8 ████████ 7人 │ │
│ │ 1-2/8 ████ 4人 │ │
│ │ 0/8 ██ 2人 │ │
│ └────────────────────────────────┘ │
└────────────────────────────────────┘3.2 排行榜管理
积累型
- 查看实时排行榜(成绩数值排序)
- 导出参与者数据(CSV)
- 查看单个用户详细轨迹
打卡型(V2 新增)
- 查看实时排行榜(仅集齐者,按完成时间排序)
- 导出参与者数据(CSV,含每条雪道打卡时间)
- 查看单个用户的打卡清单(哪些雪道已打卡/未打卡)
- 查看单个用户的滑行轨迹与检查点命中详情
3.3 发公告
向所有参与者推送公告:
- 规则变更通知
- 活动提醒
- 获奖公告
3.4 编辑规则
可编辑字段(挑战进行中也可修改):
- 奖品设置
- 完赛门槛(仅积累型,且仅可降低)
不可编辑:
- 挑战周期
- 挑战类型(积累型/打卡型)
- 积累型:有效雪场范围、统计维度
- 打卡型:目标雪场、打卡范围
3.5 结束挑战
流程:
- 点击「结束挑战」
- 确认当前排行榜为最终成绩
- 生成获奖名单
- 跳转雪币发放确认
四、雪币奖励发放
4.1 发放前提
| 条件 | 说明 |
|---|---|
| 余额校验 | 创建挑战时预扣雪币,确保发起人账户余额充足 |
| 适用角色 | 官方俱乐部、认证俱乐部(主理人账户) |
4.2 发放流程
挑战结束
↓
自动生成获奖名单(基于排行榜)
↓
发起人在 App 内确认发放
↓
系统从发起人雪币余额扣除
↓
发放到获奖用户钱包
↓
发送获奖通知(站内信 + Push)4.3 奖励配置
创建挑战时配置:
| 配置项 | 示例 |
|---|---|
| 奖励档位 | Top 1 = 1000 雪币 / Top 2-3 = 500 雪币 / Top 4-10 = 100 雪币 |
| 完赛奖励 | 达到门槛即获得 50 雪币(可选) |
4.4 发放确认页
┌────────────────────────────────────┐
│ ← 确认发放奖励 │
├────────────────────────────────────┤
│ 🏆 崇礼开板首滑挑战 │
│ 获奖人数:13人 │
├────────────────────────────────────┤
│ 奖励明细 │
│ ┌────────────────────────────────┐ │
│ │ 🥇 雪疯子 +1000 雪币 │ │
│ │ 🥈 粉雪控 +500 雪币 │ │
│ │ 🥉 单板小明 +500 雪币 │ │
│ │ ... │ │
│ └────────────────────────────────┘ │
├────────────────────────────────────┤
│ 总计发放:3500 雪币 │
│ 当前余额:12000 雪币 │
│ 发放后余额:8500 雪币 │
├────────────────────────────────────┤
│ [取消] [确认发放] │
└────────────────────────────────────┘4.5 发放记录
发放完成后可在「活动管理 - 发放记录」查看:
| 字段 | 说明 |
|---|---|
| 发放时间 | 确认发放的时间 |
| 获奖人数 | 实际发放人数 |
| 发放总额 | 本次发放雪币总数 |
| 状态 | 已发放 / 发放中 / 发放失败 |
五、挑战状态
| 状态 | 说明 |
|---|---|
| 未开始 | 挑战尚未开始 |
| 进行中 | 挑战正在进行 |
| 已结束 | 挑战自然结束或提前结束 |
| 待发放 | 挑战结束,等待发起人确认发放奖励 |
| 已发放 | 雪币奖励已发放完成 |
| 已取消 | 发起人取消(需退款) |
七、验收标准
7.1 验收标准
10.1 通用(原有)
- 有效性过滤:非有效雪场的轨迹不计入成绩
- 时间范围过滤:挑战周期外的轨迹不计入
- 重复报名拦截:已报名用户再次点击显示「去滑雪」
- 俱乐部隔离:仅限俱乐部成员的挑战,非成员报名时提示「请先加入俱乐部」
10.2 积累型专属(原有 + 修正)
- 排行榜实时性:上传轨迹后 5 分钟内排名更新
- 差距提示准确:「距上一名还差 X km」计算正确
- 完赛状态标记:达到门槛后显示「已完赛」标签
10.3 打卡型专属(V2 新增)
- 打卡判定准确:滑行轨迹经过雪道全部检查点后,该雪道自动标记为已打卡
- 集齐才上榜:未集齐该挑战全部目标雪道的用户不出现在排行榜中
- 打卡反馈:滑行结束后若有新雪道打卡成功,弹出 Toast 通知(3s 自动消失)
- 去重:同一雪道重复滑行不重复打卡
- 空状态:无人集齐时,显示空状态提示文案
- 集齐庆祝:最后一条雪道打卡成功时弹出全屏庆祝弹窗,含排名和分享入口
- 排名准确:集齐者按完成时间(最后一条雪道打卡时间戳)升序排列
10.4 发起人管理(B 端)
7.2 B 端验收
- 可查看实时排行榜和参与统计
- 可向所有参与者发送公告
- 编辑规则时遵循限制条件
- 结束挑战时生成正确的获奖名单
- 取消挑战时自动退款并通知用户
- 创建挑战时校验发起人雪币余额
- 结束后可确认发放雪币奖励
- 发放记录可追溯
- V2 — 打卡型参与概况正确显示打卡进度分布
- V2 — 打卡型排行榜仅展示集齐者,按完成时间排序
- V2 — 打卡型导出 CSV 含每条雪道打卡时间
八、文档修订记录
| 版本 | 日期 | 变更内容 |
|---|---|---|
| V1.0 | 2024-05-20 | 初始版本,定义积累型挑战(里程/落差/速度) |
| V2.0 | 2026-02-25 | 1. 新增"挑战类型"顶层分层(积累型 / 打卡型) 2. 新增"雪道打卡"挑战(一个挑战=一个打卡范围=一个榜单) 3. 统计维度修正为"累计滑行时长" 4. 基于 GIS 数据自动生成检查点 |
| V3.0 | 2026-03-05 | 文档重构:合并 PRD+详情页+打卡型原型+B端管理为单一文档,消除 5 处内容重复 |
