Skip to content

里程挑战模块 (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) 数据,自动执行以下算法:

  1. 计算雪道全长 L
  2. 跳过首尾各 20%(起点/终点多道交汇区,GPS 无法区分)
  3. 在中段 60% 区间内,按雪道长度自动等距选取检查点
雪道中心线(GIS Polyline):

|--20%--|------60%------|--20%--|
  跳过    ● C1  ● C2  ● C3   跳过
         ↑ 系统自动等距采样

检查点数量(自动计算)

雪道长度检查点数
< 500m2 个
500m - 1.5km3 个
> 1.5km4-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

排行榜 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 结束挑战

流程

  1. 点击「结束挑战」
  2. 确认当前排行榜为最终成绩
  3. 生成获奖名单
  4. 跳转雪币发放确认

四、雪币奖励发放

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 通用(原有)

  1. 有效性过滤:非有效雪场的轨迹不计入成绩
  2. 时间范围过滤:挑战周期外的轨迹不计入
  3. 重复报名拦截:已报名用户再次点击显示「去滑雪」
  4. 俱乐部隔离:仅限俱乐部成员的挑战,非成员报名时提示「请先加入俱乐部」

10.2 积累型专属(原有 + 修正)

  1. 排行榜实时性:上传轨迹后 5 分钟内排名更新
  2. 差距提示准确:「距上一名还差 X km」计算正确
  3. 完赛状态标记:达到门槛后显示「已完赛」标签

10.3 打卡型专属(V2 新增)

  1. 打卡判定准确:滑行轨迹经过雪道全部检查点后,该雪道自动标记为已打卡
  2. 集齐才上榜:未集齐该挑战全部目标雪道的用户不出现在排行榜中
  3. 打卡反馈:滑行结束后若有新雪道打卡成功,弹出 Toast 通知(3s 自动消失)
  4. 去重:同一雪道重复滑行不重复打卡
  5. 空状态:无人集齐时,显示空状态提示文案
  6. 集齐庆祝:最后一条雪道打卡成功时弹出全屏庆祝弹窗,含排名和分享入口
  7. 排名准确:集齐者按完成时间(最后一条雪道打卡时间戳)升序排列

10.4 发起人管理(B 端)

7.2 B 端验收

  1. 可查看实时排行榜和参与统计
  2. 可向所有参与者发送公告
  3. 编辑规则时遵循限制条件
  4. 结束挑战时生成正确的获奖名单
  5. 取消挑战时自动退款并通知用户
  6. 创建挑战时校验发起人雪币余额
  7. 结束后可确认发放雪币奖励
  8. 发放记录可追溯
  9. V2 — 打卡型参与概况正确显示打卡进度分布
  10. V2 — 打卡型排行榜仅展示集齐者,按完成时间排序
  11. V2 — 打卡型导出 CSV 含每条雪道打卡时间

八、文档修订记录

版本日期变更内容
V1.02024-05-20初始版本,定义积累型挑战(里程/落差/速度)
V2.02026-02-251. 新增"挑战类型"顶层分层(积累型 / 打卡型)
2. 新增"雪道打卡"挑战(一个挑战=一个打卡范围=一个榜单)
3. 统计维度修正为"累计滑行时长"
4. 基于 GIS 数据自动生成检查点

| V3.0 | 2026-03-05 | 文档重构:合并 PRD+详情页+打卡型原型+B端管理为单一文档,消除 5 处内容重复 |