← API | 列表 | 信号功能设计文档v2
提示信息
# 信号功能设计文档 v2

---

## 一、什么是信号

用户不发动态、不刷匹配,而是主动发出一个**交友意图**,这个意图就叫「信号」。

信号由系统限量推荐给可能感兴趣的人,对方若有兴趣需主动收取,收取后才能回复。

**完整链路:**
```
发信号 → 系统推荐 → 对方收取 → 对方回复 → 信号主开启聊天 → 进入私聊
```

**公屏链路(付费曝光):**
```
付费 + 审核通过 → 信号出现在公屏 → 任何人直接回复 → 进入信号主收件箱
```

---

## 二、信号分类

每位用户最多同时持有 **5 条信号**,每个分类限发 1 条。

| 图标 | 分类 | 核心意图 |
|------|------|----------|
| 💘 | 想脱单 | 认真找对象 |
| 🌀 | 想约出来 | 线下见个面 |
| 🎯 | 找搭子 | 一起做某件事(游戏/运动/旅行等) |
| 🔄 | 技能交换 | 互相提供价值,用技能换技能 |
| 🧭 | 好奇心 | 轻社交,想遇到有意思的人 |

「找搭子」暂为大类,后期根据数据决定是否拆子标签。

**信号内容格式:**
- 文字:所有用户可用
- 图片 / 语音:仅限实名认证用户

**回复格式:** 所有人只能回复文字(防骚扰,不受认证状态影响)

---

## 三、信号有效期与归档

- 信号有效期 **7 天**
- 到期前 24 小时推送提醒:「你的信号即将到期,要修改或重新发布吗?」
- 过期后进入「归档」,作为历史记录保留,不强制删除
- 用户可随时重新发布一条新信号,平台不限制发布频次,鼓励持续发布优质内容

---

## 四、收件箱

承载两类互动记录:

| 类型 | 说明 |
|------|------|
| 收取信号 | 我主动收取了别人的信号 |
| 收取回复 | 别人回复了我发出的信号(含公屏回复) |

**列表展示:** 对方头像、昵称、认证标识、内容预览、状态标签、互动时间

**排序:** 按最后互动时间倒序,有新互动排到顶部

**互动时间取值:**

| 场景 | 显示时间 |
|------|----------|
| 刚收取信号 | 收取时间 |
| 我回复后 | 回复时间 |
| 别人回复我 | 我收取回复的时间 |

---

## 五、信号详情页

### 情况 A:我收取了别人的信号

- 可回复一次文字
- 回复后底部输入框消失,状态变为「已回复,等待对方开启聊天」
- **等待态安抚:** A 查看 B 的回复时,系统向 B 推送轻提示「对方已看到你的回复」,降低等待焦虑,不破坏「信号主掌握开启权」的核心设计

### 情况 B:别人回复了我的信号

- 底部出现 **【进入聊天】** 按钮
- 点击后进入聊天页,携带 `signal_id`、`reply_content`、`is_im_opened`

---

## 六、开启聊天流程(信号主视角)

满足以下**两个条件同时成立**时,输入框上方显示对方回复内容作为引用:

1. 本地无与该用户的聊天记录(`messages.isEmpty`)
2. 该条互动记录的 `is_im_opened = 0`

> **防重复引用:** 若曾删除聊天记录后重新进入,因 `is_im_opened` 已为 1,不会再次触发引用,直接进入普通私聊。

**发送第一条消息时,客户端连发两条独立消息:**

1. **信号卡片**(Content Type 110 / `signal_quote`):携带 `signal_id` + 对方回复文字
2. **真实回复**:信号主输入的纯文本或媒体内容

**服务端处理(`Message.send` 拦截):**
```
If 消息携带 signal_id:
    begin transaction
    查库:对方是否回复过该信号且 is_im_opened = 0
    If 存在:
        标记 reply.is_im_opened = 1
        标记 receive.status = 2(已互动)
    commit
调用 OpenIM 发送消息
```

**客户端乐观更新:** 首条消息发送成功后立即调用 `SignalInboxController.markImOpened`,将内存中 `is_im_opened` 置为 1。

---

## 七、聊天限制机制(防诈骗)

### 条数限制
对方未回复前,最多发送 **2 条消息**。

### 媒体类型限制
双方互相关注(互关)前,只能发**文字消息**。

### 解除条件

| 条件 | 解除内容 |
|------|----------|
| 对方回复 | 解除条数限制 |
| 双方互关 | 解除媒体类型限制 |

---

## 八、信号 → IM 迁移

- 信号主发出第一条消息后 IM 正式建立,后续走私聊体系
- 收件箱记录不立即删除,短期双列并存属正常交接态
- **定时清理:** 已开启聊天的收件箱记录 N 天后自动清理(建议 3~5 天,待定)

---

## 九、边缘场景:A 和 B 互相回复了对方的信号

- 谁先发消息谁创建会话
- 假设 A 先通过信号 A1 开启聊天,IM 建立后携带 A1 的信号卡片
- B 再从收件箱点击信号 B1 的【进入聊天】时,检测到会话已存在,直接跳转至已有聊天页,不重复创建会话

---

## 十、曝光机制

### 常规曝光
- 优先推荐给当前在线用户
- 每日固定曝光额度,采用「活跃 → 冷却 → 再曝光」节奏

### 公屏曝光(付费)
- 用户购买曝光包后,信号出现在首页公屏区域
- 展示形式:跑马灯 / 置顶信号流(待定)
- 任何人可直接回复公屏信号,无需经过收取动作,回复直接进入信号主收件箱
- 曝光收益与回复质量由信号内容本身决定,平台不干预

---

## 十一、商业化方案

### 实名认证(免费)
- 通过身份验证后获得认证标识
- 解锁信号发布图片 / 语音的权限
- 冷启动阶段可先以手机号注册替代,待用户量达到一定规模后接入正式实名认证(建议接入支付宝 / 微信实人认证 SDK)

### 曝光包(付费增值)
- 按时间购买,如:置顶 3 天 / 7 天
- 购买后需通过人工或自动审核
- 审核通过后信号出现在公屏
- 无订阅制,纯按需购买

---

## 十二、待确认项

- 收取信号 / 收取回复的每日上限(是否按认证状态区分)
- 信号曝光权重算法细节
- 公屏展示形式(跑马灯 vs 信号流)
- 曝光包定价与时长档位
- 审核机制(人工 or 自动 or 混合)
- 收件箱已开启聊天记录清理时间(建议 3~5 天)
- 冷启动期实名认证的过渡方案