Appearance
社交活动发布模块 (Social & Professional Activities)
文档版本: V1.2 更新日期: 2024-05-20 状态: 评审中
0. 背景与目标 (Context & Goals)
问题陈述 (Problem Statement)
- 用户痛点:雪友在滑雪出行时难以找到水平相当的伙伴(拼车/拼房/搭子)或线下聚会局;教练和摄影师缺乏高效的获客与排期管理工具,常依赖微信群接龙,信息混乱且无履约保障。
- 商业价值:通过高频的组局与工具化服务(教学/跟拍),提升 APP 打开率与用户粘性,并为二期交易抽佣建立基础。
成功指标 (Success Metrics)
- 发布成功率:进入发布页到成功发布活动的转化率 > 60%。
- 履约率:发布活动中最终状态为
已结束的比例 > 40%。 - 客诉率:因自动取消或排期冲突导致的用户投诉 < 1%。
一、 角色与活动类型
| 发布身份 | 活动类型 | 核心意图 | 专属字段/功能 | 准入要求 |
|---|---|---|---|---|
| 普通雪友 | 约搭子 | 拼车、拼房、纯滑雪搭子 | - | - |
| 普通雪友 | 聚会 (Gathering) | 饭局、剧本杀、KTV | 聚会标签 (#火锅 #桌游)、性别限制 | - |
| 认证教练 | 教学拼课 | 找学员、拼野雪教学 | 多时段排期、教学类别、水平要求 | 需 教练 认证 |
| 认证摄影师 | 摄影跟拍 | 约拍、跟拍服务 | 多时段排期、交付周期、跟拍类型 | 需 摄影师 认证 |
注:俱乐部官方活动将由独立的"俱乐部管理后台"发布,不在本模块范围内。但在本模块中,雪友发起的活动可关联其所在的俱乐部,用于社群引流。
二、 核心场景流程
2.1 状态流转图 (Lifecycle)
从"生效"与"取消"维度管理生命周期。
mermaid
stateDiagram-v2
[*] --> 招募中: 发布活动
招募中 --> 已生效: 达到最低参与人数
招募中 --> 已取消: 触发自动取消规则 / 发起人主动取消
招募中 --> 已取消: 所有人退出
已生效 --> 已结束: 活动时间结束
已生效 --> 已取消: 发起人因故取消 (需赔付)
已结束 --> [*]
已取消 --> [*]
state 招募中 {
[*] --> 名额未满
名额未满 --> 名额已满: 报名人数达到上限
名额已满 --> 名额未满: 有人退出
}2.2 报名与超额处理流程
mermaid
flowchart TD
Start[用户点击报名] --> CheckLimit{名额已满?}
CheckLimit -- 未满 --> CheckPay{需支付?}
%% 正常报名流程
CheckPay -- 免费/线下AA --> Success[报名成功]
CheckPay -- 线上支付 --> Pay[发起支付]
Pay -- 成功 --> Success
%% 超额处理流程
CheckLimit -- 已满 --> CheckType{超额策略?}
CheckType -- 禁止超额 --> Reject[提示名额已满]
CheckType -- 允许等位 --> JoinWaitlist[支付并加入等位列表]
JoinWaitlist --> WaitNotify[提示当前排位]
CheckType -- 允许摇号 --> JoinPool[支付并加入抽签池]
JoinPool --> PoolNotify[等待开奖通知]
%% 补位逻辑 (异步)
Success --> JoinGroup[自动加入 IM 群组]
JoinGroup --> DeductInventory[扣减库存]
UserExit[有人退出] --> ReleaseInventory[释放库存]
ReleaseInventory --> CheckWaitlist{有等位者?}
CheckWaitlist -- 是 --> AutoMove[队首自动补位]
AutoMove --> Success三、 详细字段定义
3.1 基础设置 (通用)
| 字段名称 | 类型 | 必填 | 逻辑/约束 | 默认值 |
|---|---|---|---|---|
| 标题 | 文本 | 是 | 最多 30 字。 | - |
| 地点 | 地点 | 是 | 关联雪场 POI。 | - |
| 活动说明 | 富文本 | 否 | 支持文字与图片。 | - |
3.2 身份与类型专属设置
A. 雪友 - 聚会 (Gathering)
| 字段 | 类型 | 说明 |
|---|---|---|
| 聚会主题 | 标签选择 | #火锅 #烧烤 #桌游 #KTV #其他 |
| 性别要求 | 单选 | 不限 / 仅男 / 仅女 |
| 时间 | 单点时间 | e.g., 晚上 20:00 |
B. 教练/摄影师 - 职业排期 (Professional Scheduling)
支持多时段与周期性发布
| 字段 | 交互逻辑 | 说明 |
|---|---|---|
| 发布模式 | 切换 | 单日多时段 / 周期性重复 |
| 日期范围 | 日历选择 | e.g., 2023-12-01 至 2024-03-15 |
| 重复规则 | 多选标签 | 每天 / 工作日 / 周末 / 节假日 |
| 每日时段 | 动态列表 (List) | 可添加多个具体的服务时段。 e.g., 09:00-12:00, 13:30-16:30 |
3.3 费用与权益
| 字段名称 | 交互逻辑 | 细则 |
|---|---|---|
| 收费模式 | 切换标签 | 1. 免费活动 2. 线下AA (仅展示预估费用) 3. 线上支付 (真金白银交易, 平台托管) |
| 单价 | 数字输入 | 仅"线上支付"有效。精确到 0.01 元。 |
| 退改政策 | 下拉选择 | 1. 随时退 (活动开始前均可退) 2. 24小时前可退 (标准) 3. 不可退 (强约束) |
3.4 高级设置
| 区域 | 字段 | 交互/逻辑 |
|---|---|---|
| 人数控制 | 限制人数 | 整数输入, 最小 1, 最大 100. |
| 允许超额报名 | 开关。 开启时显示子选项: - 报名等位: 先到先得排队。 - 报名摇号: 随机抽取入选者。 | |
| 活动对象 | 准入范围 | 单选: 1. 所有用户 2. 仅限实名认证 3. 仅限俱乐部成员 |
| 生效风控 | 自动取消活动 | 开关。 开启时需填写规则: "活动开始前 [24] 小时内,若报名人数不足 [2] 人,由系统自动处理退款通知。" |
| 社群引流 | 关联俱乐部 | 选择发起人加入的俱乐部,活动将展示在俱乐部页。 |
| 即时通讯 | 群聊功能 | 默认开启。 活动发布成功后,系统自动创建 App 内 IM 群组,报名成功者自动入群。 |
| 活动管理 | 管理与我的发布 | 详见 管理与我的发布。 - 编辑:仅限无人报名时。 - 取消:进行中活动。 - 删除:已结束/已取消活动。 |
四、 复杂逻辑详解
4.1 自动取消 (Auto-Cancellation)
mermaid
flowchart TD
Timer("定时任务 (每分钟)") --> FindActs{查找活动}
FindActs --> Filter[筛选: 招募中 + 开启自动取消]
Filter --> CheckTime{"当前时间 ≥ (开始时间 - 设定阈值)?"}
CheckTime -- 否 --> Skip[跳过]
CheckTime -- 是 --> CheckCount{"当前人数 < 最低生效人数?"}
CheckCount -- 否 --> Lock["锁定活动: 不再触发自动取消"]
CheckCount -- 是 --> ExecCancel[执行取消]
ExecCancel --> UpdateStatus[状态变更为: 已取消]
UpdateStatus --> Refund[触发自动退款]
Refund --> Notify["发送取消通知 (短信/推送)"]五、 验收标准 (Acceptance Criteria)
- 聚会场景:确认选择"聚会"类型时,出现"聚会主题"标签云 (#火锅 等)。
- 排期场景:教练发布一个"12月全月,每周末,9点/13点"的活动,需在日历上正确生成约 8-10 天 x 2 时段 = 16-20 个独立的 sku 或活动实例。
- 群聊场景:报名成功后,检查"消息"列表应出现该活动的群聊。
- 自动取消:T-24h 且人数不足时,活动自动变更为 Cancelled。
六、 不做范围 (Out-of-Scope)
- 保险售卖:MVP 阶段暂不捆绑保险销售。
- 跨天排期:暂不支持单个 SKU 跨越 24 点(如通宵活动需拆分)。
C 端详情页
雪友组局详情页 PRD
版本: V2.0
更新日期: 2026-01-21
依赖: 通用组件规范更新内容: TypeSwitcher 类型切换器、4 种组局类型专属字段、关联信息展示规则
一、模块定位
场景:雪友发起的社交活动(拼车/拼房/搭子/聚会),或认证教练/摄影师的单次服务。
核心交互:查看详情 → 报名 → 自动入群
二、差异化插槽区
2.0 TypeSwitcher 活动类型切换器
V2.0 新增:支持 4 种组局类型切换
┌────────────────────────────────────┐
│ [👥 搭子] [🚗 拼车] [🏨 拼房] [🍽️ 聚会] │
└────────────────────────────────────┘| 类型标识 | 中文名称 | 图标 | 说明 |
|---|---|---|---|
| SKI_BUDDY | 搭子 | 👥 | 找滑雪搭子/教练/摄影 |
| CARPOOL | 拼车 | 🚗 | 往返雪场拼车 |
| HOTEL | 拼房 | 🏨 | 酒店拼房 |
| DINING | 聚会 | 🍽️ | 火锅/饭局/KTV 等 |
交互:横向标签切换,所选类型高亮
2.1 各类型专属字段
2.1.1 搭子 (SKI_BUDDY)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| gender | Enum | 否 | 性别要求(不限/限男/限女) |
| skillLevel | Enum | 否 | 能力要求(不限/初级/中级/高级) |
2.1.2 拼车 (CARPOOL)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| gender | Enum | 否 | 性别要求 |
| departure | Object | 是 | 出发地(名称+时间) |
| destination | Object | 是 | 目的地(名称+预计时间) |
| tripType | Enum | 是 | 单程/往返 |
| car | String | 否 | 车型 |
| seats | Integer | 是 | 座位数 |
| canCarryBoard | Boolean | 否 | 可放雪板 |
| canCarryLuggage | Boolean | 否 | 可放行李 |
2.1.3 拼房 (HOTEL)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| roomType | Enum | 是 | 类型(雪票/住宿/雪票+住宿) |
| gender | Enum | 否 | 性别要求 |
| hotelName | String | 否 | 酒店名称 |
2.1.4 聚会 (DINING)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| gender | Enum | 否 | 性别要求 |
| expectedCount | Integer | 否 | 预计人数 |
| budgetPerPerson | Integer | 否 | 人均预算(元) |
| theme | Array | 否 | 聚会标签(#火锅 #桌游 等) |
2.2 报名信息区
┌────────────────────────────────────┐
│ 📍 太舞滑雪小镇 · W酒店大堂 │
│ 📅 01/25 周六 20:00 │
│ 👥 3/6 人 · 仅差3人即可成行 │
├────────────────────────────────────┤
│ 🏷️ 标签 │
│ ┌────────────────────────────────┐ │
│ │ #火锅 #拼房 #女生友好 │ │
│ └────────────────────────────────┘ │
├────────────────────────────────────┤
│ 📋 报名人列表 │
│ ┌────────────────────────────────┐ │
│ │ [头像1] [头像2] [头像3] +3 │ │
│ └────────────────────────────────┘ │
└────────────────────────────────────┘通用字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
| 活动地点 | 地点 | 关联雪场 POI |
| 活动时间 | 时间戳 | 活动开始时间 |
| 当前人数 | 整数 | 已报名人数 |
| 人数上限 | 整数 | 最大可报名人数 |
| 最低人数 | 整数 | 成行所需最低人数 |
| 聚会标签 | 数组 | 标签列表(#火锅 #拼车 等) |
| 已报名用户 | 数组 | 用户头像列表 |
人数状态展示
| 条件 | 展示文案 |
|---|---|
| 当前人数 < 最低人数 | 👥 {当前}/{上限}人 · 仅差{最低-当前}人即可成行 |
| 最低人数 ≤ 当前人数 < 上限 | 👥 {当前}/{上限}人 · 已成行 (绿色) |
| 当前人数 = 上限 | 👥 {当前}/{上限}人 · 已满员 (橙色) |
2.2 费用信息区
┌────────────────────────────────────┐
│ 💰 费用说明 │
├────────────────────────────────────┤
│ 收费模式:线下AA │
│ 预估费用:约 ¥150/人 │
│ │
│ ⚠️ 实际费用以现场结算为准 │
└────────────────────────────────────┘字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
| 收费模式 | 枚举 | 免费/线下AA/线上支付 |
| 单价 | 金额 | 线上支付模式下的价格 |
| 预估费用 | 金额 | AA 模式下的预估金额 |
收费模式展示
| 收费模式 | 展示样式 |
|---|---|
| 免费 | 💰 免费活动 |
| 线下AA | 预估费用:约¥{预估费用}/人 + ⚠️ 提示 |
| 线上支付 | 💰 ¥{单价}/人 + 平台托管说明 |
2.3 拼车信息区(CARPOOL 场景专属)
┌────────────────────────────────────┐
│ 🚗 拼车信息 │
├────────────────────────────────────┤
│ ● 北土城地铁站C口 │
│ 出发 06:00 [单程] │
│ │ │
│ ● 崇礼万龙雪场 │
│ 预计到达 约08:30 │
├────────────────────────────────────┤
│ 🚙 别克 GL8 · 银色 │
│ 👥 3/4 个空位 │
│ ✅ 可放雪板 ✅ 可放行李 │
└────────────────────────────────────┘字段定义
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| departure.name | String | 是 | 出发地点名称 |
| departure.time | String | 是 | 出发时间 |
| destination.name | String | 是 | 目的地名称 |
| destination.time | String | 否 | 预计到达时间 |
| tripType | Enum | 是 | 单程 / 往返 |
| car | String | 否 | 车型信息(可选) |
| seats.total | Integer | 是 | 总座位数 |
| seats.available | Integer | 是 | 剩余座位数 |
| canCarryBoard | Boolean | 否 | 是否可放雪板 |
| canCarryLuggage | Boolean | 否 | 是否可放行李 |
展示规则
- 路线时间线:使用圆点+竖线视觉连接出发地与目的地
- 行程类型:右上角标签展示「单程」或「往返」
- 车型:可选字段,未填写时不展示
- 行李标签:仅在对应字段为 true 时展示
三、须知规则区配置
标题:📋 活动须知
内容来源(根据发布配置动态生成):
| 配置项 | 展示文案 |
|---|---|
| 准入范围 = 所有用户 | (不显示) |
| 准入范围 = 仅限实名 | • 准入范围:仅限实名认证用户 |
| 准入范围 = 仅限俱乐部 | • 准入范围:仅限 {俱乐部名称} 成员 |
| 性别要求 = 仅女 | • 性别要求:仅限女生报名 |
| 性别要求 = 仅男 | • 性别要求:仅限男生报名 |
| 自动取消开启 | • 自动取消:活动前{N}小时不足{M}人将自动取消退款 |
| 退改政策 = 随时退 | • 取消规则:活动开始前均可取消 |
| 退改政策 = 24小时前可退 | • 取消规则:活动前24小时可取消 |
| 退改政策 = 不可退 | • 取消规则:报名后不可取消 |
四、关联信息展示规则
V2.0 新增:遵循通用组件规范中的 ClubCard / ResortCard 定义
4.1 关联俱乐部 (ClubCard)
位置:发起人卡片下方
条件渲染:仅当活动配置了关联俱乐部时显示
4.2 关联雪场 (ResortCard)
位置:活动须知区下方(页面底部)
条件渲染:仅当活动配置了关联雪场时显示
五、发布者卡片配置
| 发起身份 | 展示样式 |
|---|---|
| 普通雪友 | 用户头像 + 昵称 + 「实名认证」标签 |
| 认证教练 | 用户头像 + 昵称 + 🎿认证教练 + 评分 |
| 认证摄影师 | 用户头像 + 昵称 + 📷认证摄影师 + 评分 |
五、报名流程(底部抽屉)
5.1 免费/AA 活动
┌────────────────────────────────────┐
│ 确认报名 [×] │
├────────────────────────────────────┤
│ 活动:太舞周末火锅局 │
│ 时间:01/25 周六 20:00 │
│ 地点:W酒店大堂 │
├────────────────────────────────────┤
│ 报名人信息 │
│ 姓名 * [ ] │
│ 手机号 * [🔒 138****8888 ] │
│ ⓘ 默认使用注册手机号 │
├────────────────────────────────────┤
│ ☑ 我已阅读并同意《活动须知》 │
├────────────────────────────────────┤
│ ⓘ 报名成功后将自动加入活动群聊 │
├────────────────────────────────────┤
│ [确认报名] │
└────────────────────────────────────┘5.2 线上支付活动
┌────────────────────────────────────┐
│ 确认报名 [×] │
├────────────────────────────────────┤
│ 活动:初级教学拼课 │
│ 时间:01/26 周日 09:00-12:00 │
│ 地点:云顶初级道 │
├────────────────────────────────────┤
│ 报名人信息 │
│ 姓名 * [ ] │
│ 手机号 * [🔒 138****8888 ] │
│ ⓘ 默认使用注册手机号 │
│ 滑雪水平 [初级 ▼] │
├────────────────────────────────────┤
│ 费用明细 │
│ ¥199 × 1人 = ¥199 │
├────────────────────────────────────┤
│ [确认支付 ¥199] │
└────────────────────────────────────┘5.3 异常流程
参见 通用组件规范 中关于「报名异常处理」的定义。支持以下错误类型反馈:
- 名额已满 (FULL)
- 报名截止 (EXPIRED)
- 活动取消 (CANCELLED)
- 无报名资格 (NO_QUALIFICATION)
- 网络异常 (NETWORK)
5.5 退出/取消报名流程 (Participant Cancel)
场景:已报名的用户因故无法参加,需发起退款/退出。
交互入口:
- 主入口:
我的 Tab(底部导航) →内容广场(卡片区) →我的参与(右侧卡片)。 - 交互动作:点击目标活动卡片进入详情页(或唤起管理弹窗)进行取消操作。
┌────────────────────────────────────┐
│ 我的报名信息 [×] │
├────────────────────────────────────┤
│ 状态:✅ 报名成功 │
│ 凭证:8293-2938-1234 │
├────────────────────────────────────┤
│ [进入群聊] [查看订单详情] │
├────────────────────────────────────┤
│ ⚠️ 如无法参加,请提前取消。 │
│ [ 取消报名/退款 ] │
└────────────────────────────────────┘取消规则判定:
- 免费/AA:直接退出,释放名额。
- 付费:根据「退改政策」判断:
- 符合退款:自动原路退回,释放名额。
- 不符退款:弹窗提示「当前已过退款截止时间,无法取消,建议自行转让」。
六、底部操作栏配置
| 元素 | 内容 |
|---|---|
| 左侧信息 | 按收费模式展示(见标题区价格规范) |
| 主按钮 | 我要报名 |
| 状态变体 | 已报名:进入群聊 / 已满员:已满员 / 已结束:已结束 |
七、群聊功能
自动入群逻辑:
报名成功
↓
检查活动是否有群聊
↓ 有
将用户加入群聊
↓
跳转「报名成功」页,显示「进入群聊」按钮报名成功页:
┌────────────────────────────────────┐
│ ✅ 报名成功 │
├────────────────────────────────────┤
│ 太舞周末火锅局 │
│ 📅 01/25 周六 20:00 │
│ 📍 W酒店大堂 │
├────────────────────────────────────┤
│ 💬 已自动加入活动群聊 │
├────────────────────────────────────┤
│ [进入群聊] [返回首页] │
└────────────────────────────────────┘七、群聊功能 (原七)
... (Previous content of Section 7) ...
八、管理操作
发起人管理入口: 所有管理操作(编辑活动 / 取消活动 / 删除活动)统一收敛至 「我的」-「我的发布」 列表页进行操作。 详情页内不提供发起人的编辑/取消入口,保持详情页作为信息展示与报名的纯粹性。
详细交互规范请查阅:管理与我的发布
九、不做范围 (原八)
以下功能不在 MVP 范围内:
- ❌ 等位机制:满员后加入等位列表,有人退出自动递补
- ❌ 摇号机制:满员后加入抽签池,随机抽取入选者
九、验收标准
- 准入校验:仅限女生活动,男性用户报名时弹出提示拒绝
- 人数状态正确:实时展示当前/最大人数及成行状态
- 自动入群:报名成功后 3 秒内自动加入活动群
- 标签展示:正确渲染聚会标签和性别要求标签
- AA 费用提示:线下 AA 活动明确提示「实际费用以现场结算为准」
- 自动取消提示:开启自动取消的活动在须知中展示规则
- 退改政策展示:须知区正确展示退改政策文案
- 满员状态:当前人数达到上限时,按钮变为「已满员」且不可点击
