# U8 Chat 2.0 · 搜索（会话列表搜索 / 全局分类搜索 / 聊天内部搜索）产品需求文档 PRD

| 项目 | 内容 |
|---|---|
| 文档版本 | v1.0（2026-10-08） |
| 功能模块 | ① 会话列表搜索（首页 → 搜索）② 全局分类搜索（聊天 / 群组 / 媒体 / 文件 / 语音）③ 聊天内部搜索（关键字 / 按日期 / 按成员） |
| 适用端 | 移动端 iOS / Android（本次交付）。Web / Desktop 见第八章 |
| UI 图（唯一依据） | Figma `6dsI4eKdAoZr4RP0uILIBq`：**iOS「全局搜索」SECTION `1188:85218`**（含子 SECTION「群内部搜索」`1188:87532`）· **安卓「全局搜索」SECTION `1293:101505`**（含子 SECTION「群内部搜索」`1336:64713`）。共 **iOS 28 屏 / 安卓 20 屏** |
| 口径 | **UI 图已评审通过，本 PRD 以它为准**；三处例外：① 按产品口径**砍掉「搜索链接」**（2.2）；② 按产品口径**补齐两处高亮**（列表模式关键字高亮、定位自己消息变色，见 4.3.7）；③ 把 UI 图里**重复的「未搜索时默认状态2」并掉**（见 4.1.1，屏数 29 → **28**）。其余不增不减 |
| 参照产品 | Telegram（搜索的入口、分类、长按菜单与转发交互） |

> **本 PRD 的边界**：UI 图＝**唯一依据**。凡图里画了的（页面、文案、按钮、菜单项）照做；图里**没有画**的（例如「搜索筛选器」「高级搜索」「按文件类型筛选」）**本期不做**，只在第十一章列成待确认，不自行补设计。
>
> 若某条逻辑图里看不出来（例如搜索历史保留多少条、结果怎么排序），本 PRD 按 **Telegram 的既定行为**写，并在第十一章标出需要产品/开发确认。

---

## 一、背景与目标

### 1.1 背景

U8 现在**没有搜索**：
- 会话列表顶部虽然有一个搜索框，但只能按「聊天 / 联系人」找一个**会话**；
- 想找「上个月那张图」「某人发的那个文件」时，只能翻聊天记录；
- 群里想找「某人说过的话」「某天的记录」更是没有入口。

### 1.2 目标

把搜索做成**三层**，每一层解决一个问题：

| 层 | 位置 | 解决什么 |
|---|---|---|
| ① **会话列表搜索** | 首页 → 搜索框 | 「我要找**哪个人 / 哪个群**」——找工作群、找人 |
| ② **全局分类搜索** | 同一个搜索页，切换底部 **5 个分类** | 「我要找**某个东西**」——找图、找文件、找语音 |
| ③ **聊天内部搜索** | 聊天页 → 搜索 | 「**在这个聊天里**找某句话 / 某天的记录 / 某个人说的话」 |

三层共用同一个「搜索」入口与一套视觉。

---

## 二、范围

### 2.1 本期做

| # | 模块 | 内容 | UI 画板 |
|---|---|---|---|
| ① | **会话列表搜索** | 搜索框；未搜索时的默认态（最近联系人头像 + 搜索历史）；输入后的结果（最近 / 聊天和联系人 / 消息）；「所有聊天」二级筛选；清空搜索历史（含二次确认） | iOS `1188:85507` `85699` `85837` `87427` |
| ② | **全局分类搜索** | 底部 **5 个分类**：**聊天 / 群组 / 媒体 / 文件 / 语音**；每类的列表样式、长按菜单、多选、转发 | iOS `1188:85984` `86282` `86424` `87169` `87249` `87360` `85219` `85341` `86819` `86630` `1429:88301` `1500:100804` |
| ③ | **聊天内部搜索** | 关键字搜索；按日期（日历）；按成员；点成员自动定位 / 以列表显示；两种模式切换；组合筛选；未找到 | iOS `1188:87533` `87815` `88041` `88393` `88707` `88998` `89278` `89526` `89662` `89741` `90024` `90297` |

### 2.2 本期不做（★ UI 图里没有的一律不做）

| 不做的事 | 说明 |
|---|---|---|
| ★ **搜索链接** | **U8 不支持搜索链接** —— 分类里**不做「链接」**（UI 图里画了这一类，按产品口径砍掉；本 PRD 与演示页均已去掉，iOS 屏数 33 → 29）。连带的「拷贝链接」菜单项、「链接已拷贝到剪贴板」提示**一并不做** |
| 搜索筛选器 / 高级搜索（按时间范围、按消息类型、按发送者筛选） | UI 图里**没有**这个入口，本期不做 |
| 文件分类里的「按类型筛选」（只 apk / 只 mp4） | UI 图里没有 |
| 搜索结果的**二次排序**（按相关度 / 时间） | UI 图里没有排序入口，按时间倒序展示 |
| 全局搜索里搜「消息」的**全文索引设置页** | 超范围 |
| 搜索结果页的**批量删除** | UI 图里只有「转发 / 选择」 |
| 聊天内部搜索的结果**导出 / 分享** | 超范围 |
| 语音转文字、图片 OCR、以图搜图 | 超范围 |
| Web / Desktop 端搜索 | 本次只交付移动端 |
| 深色模式、大字号无障碍 | 随全局一起排期 |

---

## 三、名词与统一口径

| 名词 | 含义 |
|---|---|
| **搜索入口** | 首页（会话列表）顶部的搜索框；以及聊天页顶部的搜索 |
| **默认态** | 打开搜索但**还没输入**关键字时的页面（联系人头像 + 搜索历史） |
| **搜索历史** | 你**点击过的搜索结果**的记录，显示在「最近」分区（iOS 图上的「最近」） |
| **五个分类** | 聊天 / 群组 / 媒体 / 文件 / 语音（底部悬浮胶囊 Tab） |
| **结果分区** | 输入关键字后，结果按来源分成「最近」「聊天和联系人」「消息」三块（iOS `85699`） |
| **二级筛选** | iOS 图上的「**所有聊天 ⌄**」→ 可切「所有聊天 / 私聊 / 群聊」（`85837`） |
| **聊天内部搜索** | 在**某一个聊天里**搜索：关键字 / 按日期 / 按成员 |
| **两种浏览模式** | 聊天内部搜索命中后可以「**以列表模式显示**」或「**以聊天模式显示**」互相切换（`88998` / `89526`） |
| **来源标记** | 文件 / 语音条目上标注它来自**哪个会话**（图上显示为「小说资源管理群」这类灰字） |

---

## 四、功能详情

## 4.1 会话列表搜索

### 4.1.1 入口与默认态（iOS `1188:85507`）

**入口**：首页（会话列表）顶部搜索框 → 点击进入搜索页。

**默认态（还没输入）自上而下**：

| 区块 | 内容 | 规则 |
|---|---|---|
| 顶部搜索框 | 放大镜 + 占位「搜索」；右侧一颗 **✕ 圆形按钮** | 点 ✕ = **退出搜索页**，回到会话列表；点搜索框进入输入态并唤起键盘 |
| **最近联系人头像** | 横向一排圆形头像（可左右滑），带**在线绿点** | 显示最近的联系人；点某人 = **直接进该聊天** |
| **「最近」分区** | 标题「最近」+ 右侧「**清空**」 | 「最近」= **搜索历史**（点击过的结果）；「清空」→ 4.1.5 |
| 历史条目 | 头像 + 名字 + **状态行** | 状态行按对象类型显示：私聊＝`在线` / `最近上线于 4分钟前` / `最近上线于昨天 13:10` / `最近上线于 07/19/26`；群＝`290位群成员` |
| 底部 **分类 Tab** | 聊天 / 群组 / 媒体 / 文件 / 语音 | **悬浮胶囊**，默认选中「聊天」；切分类见 4.2 |

> 画板 `1188:85603`（「未搜索时默认状态2」）与 `85507` 是**同一状态的两种排布**（只有联系人头像行的间距 / 滚动位置不同，没有规则差异）—— 已按产品 2026-10-09 口径**合并为一屏**，本 PRD 只保留 `85507`。

### 4.1.2 输入关键字后的结果（iOS `1188:85699`）

输入 **「大哥」** 后，页面自上而下：

| 分区 | 内容 | 规则 |
|---|---|---|
| 搜索框 | 关键字「大哥」+ 框内**清空 ✕** + 右侧**关闭 ✕** | 框内 ✕ = 清空关键字回到默认态 |
| **「最近」** | 命中关键字的**搜索历史**（「我是大哥」「请叫我大哥大」） | 与历史做**前缀/包含匹配** |
| **「聊天和联系人」** | 命中的**会话与联系人**：私聊（头像 + 名字）、群（拼图头像 + 群名） | 命中范围＝**会话名 / 联系人名**（含备注名？见待确认 ③） |
| **「消息」** | 右侧带「**所有聊天 ⌄**」筛选；每条 = 会话头像 + **会话名（粗）** + 时间；下一行 = **发送者** + **消息内容摘要** | 上限按 TG；列表可滚动加载 |
| 底部 | 分类 Tab（当前「聊天」） | 切换到其它分类 → 4.2 |

**要点**
1. 「消息」区展示的是**每个会话里最匹配的一条**（不是一条条罗列全部命中），点进去 = 跳到该会话并定位到那条消息。
2. 群消息结果里，第二行才显示**发送者**（`Jioy` / `安丽` / `张妮`），私聊结果不显示发送者。
3. 结果**分区顺序固定**：最近 → 聊天和联系人 → 消息。

### 4.1.3 「所有聊天」二级筛选（iOS `1188:85837`）

点「**所有聊天 ⌄**」展开二级筛选（图上是展开态）：

| 选项 | 含义 |
|---|---|
| **所有聊天** | 不限（默认） |
| **私聊** | 只在 1 对 1 会话里找 |
| **群聊** | 只在群里找 |

- 筛选**只作用于「消息」分区**（聊天和联系人分区不受影响）。
- 选完自动收起下拉。

### 4.1.4 清空搜索历史（iOS `1188:87427`）

点「最近」右侧的「**清空**」→ 弹出确认：

| 元素 | 文案 |
|---|---|
| 标题 | `您确定要清空搜索历史记录？` |
| 按钮 | `取消` / `确定清空`（红色，破坏性操作） |

- 确认后：**「最近」分区消失**（页面只剩联系人头像行），关键字与其它分区不受影响。
- 取消：什么都不变。

---

## 4.2 全局分类搜索

### 4.2.1 分类 Tab（五个）

**位置**：搜索页**底部悬浮胶囊**（与底部 Tab 同款样式），自左至右：

**聊天 · 群组 · 媒体 · 文件 · 语音**

| 分类 | 未输入关键字时 | 输入关键字后 |
|---|---|---|
| **聊天** | 默认态（联系人 + 搜索历史）→ 见 4.1.1 | 分区结果（最近 / 聊天和联系人 / 消息）→ 见 4.1.2 |
| **群组** | 群组列表（见 4.2.3） | 命中关键字的群组 |
| **媒体** | **最近的媒体**（图片/视频网格）→ 见 4.2.4 | 命中关键字的媒体 |
| **文件** | **最近的文件**列表 → 见 4.2.5 | 命中关键字的文件 |
| **语音** | **最近的语音**列表 → 见 4.2.6 | 命中关键字的语音 |

**规则**
1. 分类**切换保留关键字**：在「聊天」里输入「大哥」后切到「媒体」，关键字继续生效（`1429:88301` 就是「媒体 + 关键字 大哥」的结果）。
2. 每个分类都**先在未输入时展示"最近的"**（媒体/文件/语音都有），这样"没想好搜什么"也能用。
3. 列表**按时间倒序**（今天 → 昨天 → 周二 → 07/12 这类相对/绝对时间分组）。

### 4.2.2 聊天分类

见 4.1（默认态与结果）。

### 4.2.3 群组分类（iOS `1500:100804`）

**条目 = 两行**（照 UI 图）：

| 位置 | 内容 |
|---|---|
| 左 | 群头像（方形圆角，拼图） |
| 第一行 | **群名**（加粗） |
| 第二行 | **`@username`**（紫色）+ 空格 + **`N位群成员`**（灰字） |

> ⚠️ 群 ID 与群人数**都在第二行**、和群名**分行**显示 —— 不要挤在一行。

**规则**
1. 未输入关键字时列出**你加入的群**（按最近活跃）；输入后按群名 / username 匹配。
2. 点某群 = **进入该群**。
3. 长按 / 多选等操作：**UI 图上没有**，本期不做。

### 4.2.4 媒体分类（iOS `1188:85984` / `1429:88301` / `87360`）

**未输入时（`85984`）**：**图片/视频网格**（3 列），视频右下角带**时长**（`1:28` / `1:39:17` / `32:09`）。

**滚动时（`87360`）**：出现**月份分组标题**（`2026 年 7 月`），即列表按**月份分段**。

**输入关键字后（`1429:88301`）**：媒体以**列表**形式展示，每条：

| 位置 | 内容 |
|---|---|
| 左 | 缩略图（视频带时长角标） |
| 中 | 发送者名（`Jioy` / `安丽`）+ 消息内容（`大哥们，请吃饭吧`） |
| 右下/右上 | 来源会话（`紧急对接需求群` / `人力资源部门群` / `Gorilla Case`）+ 时间（`12:02` / `昨天`） |

> 注意：媒体**未输入时是网格、输入后是列表** —— 这是 UI 图画的两套版式，照做。

### 4.2.5 文件分类（iOS `1188:86282` / `86819`）

**条目结构 = 两行**（照 UI 图）：

| 位置 | 内容 |
|---|---|
| 左 | **文件类型图标**：橙色圆角方块 + **白色**类型文字（`apk` / `mp4` / `txt` / `zip` / `7z`） |
| 第一行 | **文件名**（加粗，**过长时末尾 `…` 截断，绝不换行**） |
| 第二行 | **`↓ 12.9MB · 来源会话`** —— 一个**下载箭头** + 文件大小 + `·` + 来源会话，**同一行** |
| 右 | **时间** |

> ⚠️ 两个易错点：① 类型图标是**橙底白字**（不是浅灰底）；② 大小与来源会话**在同一行**用 `·` 连接，不要拆成两行。
> ⚠️ **长文件名只在行内截断**：像 `config_v38qqcqq11i38qq11iajopjol...` 这种必须显示成 `…`，**不能撑破一行、也不能压到右侧时间上**。

**长按（`86819`）→ 菜单**：`转发` / `在聊天中查看` / `选择`。

### 4.2.6 语音分类（iOS `1188:86424` / `86630`）

**条目结构 = 两行**（照 UI 图）：

| 位置 | 内容 |
|---|---|
| 左 | **紫色圆形播放按钮**（不是发送者头像） |
| 第一行 | **`发送者名 › 来源会话`** —— 名字 + 一个 `›` 箭头 + 群名，**同一行** |
| 第二行 | **时长**（`0:09` / `0:32`，灰字） |
| 右 | **时间** |

> ⚠️ 易错点：左边是**播放按钮**不是头像；发送者名与来源会话**用 `›` 连在同一行**（不要上下两行）。

**长按（`86630`）→ 菜单**：`转发` / `在聊天中查看` / `选择`。

### 4.2.7 长按 / 多选 / 转发（媒体、文件、语音 通用）

| 动作 | 规则 |
|---|---|
| **长按** | 弹出操作菜单（各分类菜单项见上）；背景**模糊 + 压暗**，被长按的条目高亮 |
| **选择** | 进入多选态：**顶部「已选 N 条」**，每条左侧出现**勾选圈**；底部换成「**转发**」等操作（UI `87249`） |
| **转发（单条）** | 复用**已有的转发页**：顶部「转发」+ 搜索 + 会话列表 + 底部「聊天 / 联系人」切换；进入后可直接点会话发送（`85219`） |
| **转发（多条）** | 转发页顶部变「**发送**」，右上角「选择」→ 多选会话（`85341`）；发出后消息为「转发消息」+ `[媒体]` 占位 |
| **不做什么** | 结果页**没有删除**（UI 图上没有），也没有「保存到相册」、**没有「拷贝链接」**（U8 不支持搜索链接） |

---

## 4.3 聊天内部搜索

### 4.3.1 入口与默认态（iOS `1188:87533`）

**入口**：聊天页（单聊或群聊）→ 顶部搜索。

**默认态**：顶部变成搜索框 `在此聊天中搜索`（+ 右侧 ✕ 关闭），下方**就是原来的聊天记录**（不切换页面）。

**左下角两颗圆形入口按钮**（悬浮在聊天页左下）：

| 按钮 | 图标 | 打开什么 |
|---|---|---|
| 左边 | **日历** | 「搜索」面板：**按日期**选日期 → 4.3.3 |
| 右边 | **人像** | 「搜索」面板：**按成员**选人 → 4.3.4 |

> 这两颗按钮**只在搜索态**（顶部是「在此聊天中搜索」时）出现。
>
> **发送者名字在气泡里**（群聊的既有表现）：名字是**气泡内的第一行**（在气泡内部、内容上方），并且**按人着色** —— UI 图上 `张磊` / `杨小红` 是蓝色 `#008cd7`、`噜噜咕噜` 是橙色 `#e57100`。**自己的消息（紫色气泡）不带名字行**。进入搜索态不改这个规则。

### 4.3.2 关键字搜索（iOS `1188:87815`）

在搜索框输入关键字（图上示例 `什么`）后：

- 搜索框内显示关键字 + 清空 ✕；
- 下方**聊天记录定位到命中的消息**，并且 **命中的关键字在消息文本里高亮** —— 设计稿里是一个矩形色块 `Rectangle 544824`：**填充亮黄 `#ffe628`、尺寸 30×21**（正好盖住 2 个字的关键字「什么」），**只盖关键字那几个字，不是整条消息**；
- 命中的结果可以在**聊天模式**（定位到原文）和**列表模式**之间切换（见 4.3.5）。

### 4.3.3 按日期（iOS `1188:88041`）

点左下**日历**按钮 → 底部弹起**半个月屏面板**：

| 元素 | 内容 |
|---|---|
| 左上 | **✕**（关闭面板） |
| 标题 | `搜索` |
| 月份行 | `2026 年 9 月` + `›`（月份选择）；右侧 `‹` `›` 翻月 |
| 星期行 | `周日 周一 周二 周三 周四 周五 周六` |
| 日期网格 | `1` – `30`；**选中的日期是紫色实心圆** |
| 底部 | **紫色「完成」按钮** |

**规则**
1. 选某一天 → 点「完成」→ 面板收起，聊天记录**跳到那一天**（该天的消息定位 / 按天过滤）。
2. 面板弹起时背景聊天页**压暗**；点 ✕ 或遮罩 = 关闭面板，不改变当前位置。
3. 月份可翻（`‹` `›`）。

### 4.3.4 按成员（iOS `1188:88393` / `88707` / `90297`）

点左下**人像**按钮 → 搜索框变成 `来自：`，下方弹出一块**悬浮成员面板**：

| 元素 | 内容 |
|---|---|
| 搜索框 | `来自：`（+ 清空 ✕）—— **在面板里再搜成员**（`88707`：输入 `噜噜咕噜` → 只剩这一人） |
| 成员行 | 头像 + **名字** + `@username` |
| 滚动 | 成员多时面板**加高**（`90297` 的「最高高度列表」显示 18 人），到最高后内部滚动 |

**规则**
1. 点某个成员 → 面板收起 → **聊天记录自动定位到该成员的首条命中消息**（`88998`）。
   并且 **被定位的那条消息「整条气泡变色」**：设计稿在它上面盖了一层名为 `变色` 的覆盖层 —— 填充 `#e57100`、**不透明度 15%**，**气泡本体（218×48）和气泡角（10×15）都盖**，视觉上是**很浅的暖橙色底**，与白色气泡区分开。
   > **所有人都变色**：UI 图 `89278`（定位到自己发的消息）那一屏**没有画**变色层，但按产品口径（2026-10-09）**自己的消息同样变色** —— 规则统一，不区分是谁发的（见 4.3.7）。
2. 定位后：
   - 顶部悬浮一枚**计数胶囊**：`1/16`（当前第 1 条 / 共 16 条）；
   - 计数胶囊右侧：**`以 列表 模式显示`**（切换按钮）。
3. **自己发的消息**也能被定位（`89278`），**并且同样变色**（规则同上，不区分是谁发的）。

### 4.3.5 两种浏览模式（iOS `88998` ↔ `89526`）

| 模式 | 长什么样 | 切换按钮 |
|---|---|---|
| **聊天模式** | 就是聊天记录本身，定位到命中的那条；顶部 `1/16` 计数 | `以 列表 模式显示` |
| **列表模式** | 纯结果列表：每条 = 发送者 + 内容（过长截断）+ 时间；**命中关键字同样高亮**；底部一行 `16条消息`、顶部 `1/16` | `以 聊天 模式显示` |

**规则**
1. 计数 `N/M` 表示**当前第 N 条 / 共 M 条命中**；聊天模式下上下切换命中项，聊天记录跟着定位。
2. 列表模式下点某条 = 回到聊天模式并定位到该条。
3. 列表条目里**图片类消息显示 `[图片]`** 占位。

### 4.3.6 组合筛选与「未找到」（iOS `89741` / `89662` / `90024`）

- **成员 + 关键字可以叠加**：先选成员（`来自：噜噜咕噜`），再在搜索框输入关键字（`什么`）→ 结果为「**该成员 + 含该关键字**」（`89741`）。
- 列表模式下同样可以叠加关键字（`89662`）。
- **未找到（`90024`）**：关键字**没有命中**时，**在聊天记录上浮出一条白色圆角提示卡**（带阴影）：左侧一个「**文档 + 放大镜**」图标 + 文字 `未找到相关信息`；位置在**屏幕中部偏左**（贴着左边约 20pt，不是居中、也不带遮罩）。
  ⚠️ 它**不是整页空态** —— 成员筛选定位到的消息**仍然正常显示在下面**（该条照常变色），只是关键字这一层没有结果。

### 4.3.7 高亮规则汇总（★ 全部照 UI 图，逐条给出处）

| 场景 | 高亮 | 出处（画板 / 图层） |
|---|---|---|
| **关键字命中** | 消息文本里的**关键字**加**亮黄底色 `#ffe628`**（只盖关键字那几个字，不是整条消息） | `1188:87815` 的 `Rectangle 544824`（30×21，正好 2 个字） |
| **按成员定位** | **被定位的那条消息整条气泡**盖一层 `#e57100`、**不透明度 15%** 的「变色」层（气泡本体 + 气泡角） | `1188:88998` 的 `变色/1排`（218×48）+ `变色/气泡角`（10×15） |
| **两者可叠加** | 成员 + 关键字同时生效时，**气泡变色 + 关键字亮黄同时出现** | `1188:89741`（两种高亮同屏） |
| **列表模式** | **同样高亮关键字**（亮黄 `#ffe628`）—— 与聊天模式规则一致 | UI 图 `1188:89662` 里**没画**黄底，按产品口径 2026-10-09 补齐 |
| **自己发的消息** | 定位到**自己**发的消息时**同样变色**（不区分是谁发的） | UI 图 `1188:89278` 里**没画**变色层，按产品口径 2026-10-09 补齐 |
| **发送者名字** | **按人着色**（群聊既有表现）：`张磊` / `杨小红` 蓝 `#008cd7`、`噜噜咕噜` 橙 `#e57100` | 各屏一致 |

> **⚠️ 表里最后两行（列表模式高亮、自己消息变色）是 UI 图里没有画的** —— 按产品口径 2026-10-09 **补齐**，规则与聊天模式保持一致（不留「同一功能两种表现」的口子）。实现按本表做，UI 出图时请把这两处补上。

---

## 五、屏清单（与 UI 画板一一对应）

### 5.1 iOS · 会话列表搜索（4 屏）

| # | 屏 | 画板 node |
|---|---|---|
| 1 | 首页-聊天-搜索-未搜索时默认状态 | `1188:85507` |
| 2 | 首页-聊天-已搜索 | `1188:85699` |
| 3 | 首页-聊天-已搜索-所有聊天切换 | `1188:85837` |
| 4 | 首页-聊天-搜索-未搜索时默认状态-清空提示 | `1188:87427` |

### 5.2 iOS · 全局分类搜索（12 屏）

| # | 屏 | 画板 node |
|---|---|---|
| 5 | 首页-搜索媒体-未搜索时-媒体 | `1188:85984` |
| 6 | 首页-搜索媒体-关键字搜索-媒体 | `1429:88301` |
| 7 | 首页-搜索媒体-媒体(长按) | `1188:87169` |
| 8 | 首页-搜索媒体-媒体(长按)-选择 | `1188:87249` |
| 9 | 首页-搜索媒体-未搜索时-媒体(滑动出现时间) | `1188:87360` |
| 10 | 首页-搜索媒体-媒体(长按)-选择-转发 | `1188:85219` |
| 11 | 首页-搜索媒体-媒体(长按)-选择-转发(多选) | `1188:85341` |
| 12 | 首页-搜索文件 | `1188:86282` |
| 13 | 首页-搜索文件-文件(长按) | `1188:86819` |
| 14 | 首页-搜索语音 | `1188:86424` |
| 15 | 首页-搜索语音-语音(长按) | `1188:86630` |
| 16 | 首页-搜索群组 | `1500:100804` |

### 5.3 iOS · 聊天内部搜索（12 屏）

| # | 屏 | 画板 node |
|---|---|---|
| 17 | 聊天详情-聊天内部搜索 | `1188:87533` |
| 18 | 聊天详情-聊天内部搜索-输入关键字搜索 | `1188:87815` |
| 19 | 聊天详情-聊天内部搜索-按日期 | `1188:88041` |
| 20 | 聊天详情-聊天内部搜索-按成员 | `1188:88393` |
| 21 | 聊天详情-聊天内部搜索-按成员-搜索成员 | `1188:88707` |
| 22 | 聊天详情-聊天内部搜索-按成员-点击成员-自动定位 | `1188:88998` |
| 23 | 聊天详情-聊天内部搜索-按成员-点击成员-自动定位-自己消息 | `1188:89278` |
| 24 | 聊天详情-聊天内部搜索-按成员-点击成员-以列表显示 | `1188:89526` |
| 25 | 聊天详情-聊天内部搜索-按成员-点击成员-以列表显示-加入关键字搜索 | `1188:89662` |
| 26 | 聊天详情-聊天内部搜索-按成员-点击成员-加入关键字搜索 | `1188:89741` |
| 27 | 聊天详情-聊天内部搜索-未找到相关信息 | `1188:90024` |
| 28 | 聊天详情-聊天内部搜索-按成员-最高高度列表 | `1188:90297` |

### 5.4 安卓：与 iOS **同屏同规则**（20 屏）

安卓 SECTION `1293:101505`（全局）+ `1336:64713`（聊天内部）覆盖同样的屏，**规则完全一致**，只是版式按安卓（412×892）。对应的安卓屏 node：

| 分组 | 安卓 node |
|---|---|
| 会话列表搜索 | `1448:97674` `1448:97773` `1448:97925` `1448:98088` `1448:100025` |
| 媒体 | `1448:98188` `1448:99933` `1448:99870` `1448:98245` `1448:98362` `1448:99214` `1448:99414` `1448:99642` |
| 文件 | `1448:98596` |
| 语音 | `1448:98746` |
| 群组 | `1501:100928` |
| 聊天内部搜索 | `1336:64714` `64842` `64972` `65129` `65360` `65492` `65635` `65780` `65924` `66069` `66177` `66286` |

> 安卓少了 iOS 的「媒体长按（未选择）」等屏 —— 按 iOS 的规则实现，安卓只是没有单独出图。

---

## 六、异常与边界

| # | 情况 | 处理 |
|---|---|---|
| ① | 关键字**一个字符都没有** | 停在**默认态**（联系人 + 搜索历史），不出现「未找到」 |
| ② | 关键字**没有命中**（会话列表搜索） | 各分区不显示；「消息」区显示空态（UI 图上没有专门画空态，见待确认 ⑥） |
| ③ | 聊天内部搜索**关键字没有命中** | **在聊天记录上浮出一条** `未找到相关信息` 提示（白底圆角 + 图标），**不是整页空态**（UI `90024`） |
| ④ | 搜索时**网络断开** | 只搜本地缓存结果；顶部提示网络异常（沿用既有提示文案） |
| ⑤ | **空群 / 新群**（成员面板只有自己） | 成员面板只列出实际成员 |
| ⑥ | **群成员很多**（面板到最高高度） | 面板加高到上限后**内部滚动**（UI `90297`） |
| ⑦ | 搜索历史**为空** | 「最近」分区**整块不显示**（不留空标题） |
| ⑧ | 清空历史后**再搜索** | 新点击的结果重新写入「最近」 |
| ⑨ | 转发时**原消息已被删除** | 转发失败并提示「消息已不存在」（沿用既有转发失败文案） |
| ⑩ | 媒体/文件/语音**没有内容** | 该分类列表为空（UI 图上没有空态，见待确认 ⑤） |

---

## 七、跨端

| 端 | 本次 |
|---|---|
| iOS / Android | ★ **本次交付**，同规则、两套版式（见 5.4） |
| Web / Desktop | **本次不出屏**。规则与移动端一致，等排期时按本 PRD 落 |
| 官方客服号「U8 Chat」会话 | 聊天内部搜索**同样可用**（它就是普通会话） |

---

## 八、文案

| 位置 | 文案 |
|---|---|
| 会话列表搜索框占位 | `搜索` |
| 聊天内部搜索框占位 | `在此聊天中搜索` |
| 按成员时的搜索框 | `来自：` |
| 分区标题 | `最近` / `聊天和联系人` / `消息` |
| 二级筛选 | `所有聊天` / `私聊` / `群聊` |
| 分类 Tab | `聊天` / `群组` / `媒体` / `文件` / `语音` |
| 清空历史 | 标题 `您确定要清空搜索历史记录？`；按钮 `取消` / `确定清空` |
| 长按菜单（媒体/文件/语音） | `在聊天中查看` / `转发` / `选择` |
| 按日期面板 | 标题 `搜索`；月份 `2026 年 9 月`；按钮 `完成` |
| 结果计数 | `1/16` |
| 模式切换 | `以 列表 模式显示` / `以 聊天 模式显示` |
| 列表模式底部 | `16条消息` |
| 空结果 | `未找到相关信息` |
| 状态行（私聊） | `在线` / `最近上线于 4分钟前` / `最近上线于昨天 13:10` / `最近上线于 07/19/26` |
| 状态行（群） | `290位群成员` |

> 以上全部**照 UI 图**，一字不改；本 PRD 不新增任何用户可见文案。

---

## 九、接口与埋点（建议）

| # | 能力 | 说明 |
|---|---|---|
| ① | 全局搜索 | 一个接口按 `keyword + category(chat/group/media/file/voice) + filter(all/private/group) + offset` 返回；各分类返回各自的条目结构 |
| ② | 未输入时的「最近」 | 媒体 / 文件 / 语音各自一个「最近列表」接口（按时间倒序，分页） |
| ③ | 搜索历史 | 本地存 + 服务端同步（点击过的结果才写入，见 3.搜索历史） |
| ④ | 聊天内部搜索 | `chat_id + (keyword | date | member_id) + offset`；返回命中消息 id 列表 + 总数（对应 `1/16` 的 16） |
| ⑤ | 定位 | 命中消息 id → 客户端在聊天记录里定位 |
| ⑥ | 转发 | 复用既有的转发接口（搜索结果转发按**原消息**转发） |
| ⑦ | 埋点 | 进搜索页 / 切分类 / 输入关键字（长度、是否命中）/ 点结果（哪个分区）/ 长按菜单项 / 转发 / 按日期 / 按成员 / 模式切换 / 清空历史 |

---

## 十、待确认

| # | 问题 | 影响 |
|---|---|---|
| ① | **搜索历史保留多少条**、什么时候写（点击结果时写？）—— UI 图看不出来 | 本地存储与同步 |
| ② | **各分类「最近的…」默认展示多少条**、是否分页（媒体网格一次加载多少） | 接口分页参数 |
| ③ | 「聊天和联系人」的匹配范围：**昵称 / 备注名 / 账号名 / 手机号**分别搜不搜？ | 后端匹配字段 |
| ④ | 媒体为什么**未输入时是网格、输入后是列表** —— 确认这是有意的两套版式 | 前端实现 |
| ⑤ | **空态**：全局搜索无结果、各分类无内容时显示什么？（UI 图没画） | 需要 UI 补 |
| ⑥ | 群组分类**点进去之后**、媒体/文件/语音**点进去之后**的行为（直接打开？还是另开预览页？）UI 图没画 | 交互补全 |
| ⑦ | 「最近联系人头像」的**排序与数量**（最近聊天？最近联系人？最多几个） | 接口 |
| ⑧ | 「消息」分区每个会话只显示**一条**还是要**多条**？（图上每个会话一条） | 后端聚合方式 |
| ⑨ | 结果**去重与排序**：同一会话命中多条时怎么排；置顶会话是否优先 | 后端 |
| ⑩ | **请 UI 补两处图**：列表模式的关键字高亮、定位到自己消息时的变色层 —— 产品已拍板「都要有」 | UI 出图 |

---

## 十一、相对 UI 图（本次不动什么）

| 项 | 口径 |
|---|---|
| UI 图已评审 | **本 PRD 不新增、不修改任何页面与文案**；图上没有的功能一律不做（见 2.2）。**唯一按产品口径砍掉的是「链接」分类**（UI 图画了，但 U8 不支持搜索链接） |
| 图上逻辑看不出来的部分 | 按 **Telegram 的既定行为** + 上文「待确认」两处标注，**不自行补设计** |
| 旧交付物 | `搜索功能/` 目录里 2026-09-11 的《会话列表搜索 PRD》是**早期版本**（只覆盖会话列表搜索），本次以本 PRD 与 iOS「全局搜索」SECTION `1188:85218` 为准；旧文件保留不动 |

---

*本 PRD 以 Figma 画板为唯一依据。评审时请对照 iPad/iPhone 设计稿一起看：第六章的文案表可以直接做「文案核对清单」。*
