@flexem/chat-box 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +638 -0
- package/miniprogram_dist/TEST_CASES.md +256 -0
- package/miniprogram_dist/assets/icons/icon-arrow-down.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-arrow-up.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-avatar-default.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-back.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-camera.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-close.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-copy.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-delete.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-edit-msg.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-edit.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-file.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-image.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-keyboard.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-menu.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-play-voice.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-plus.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-regenerate.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-thinking.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-voice.svg +1 -0
- package/miniprogram_dist/components/attachment/index.js +169 -0
- package/miniprogram_dist/components/attachment/index.json +4 -0
- package/miniprogram_dist/components/attachment/index.wxml +40 -0
- package/miniprogram_dist/components/attachment/index.wxss +119 -0
- package/miniprogram_dist/components/input-bar/index.js +934 -0
- package/miniprogram_dist/components/input-bar/index.json +6 -0
- package/miniprogram_dist/components/input-bar/index.wxml +132 -0
- package/miniprogram_dist/components/input-bar/index.wxss +324 -0
- package/miniprogram_dist/components/message/index.js +988 -0
- package/miniprogram_dist/components/message/index.json +4 -0
- package/miniprogram_dist/components/message/index.wxml +285 -0
- package/miniprogram_dist/components/message/index.wxss +575 -0
- package/miniprogram_dist/components/sidebar/index.js +506 -0
- package/miniprogram_dist/components/sidebar/index.json +4 -0
- package/miniprogram_dist/components/sidebar/index.wxml +137 -0
- package/miniprogram_dist/components/sidebar/index.wxss +264 -0
- package/miniprogram_dist/index.js +1316 -0
- package/miniprogram_dist/index.json +8 -0
- package/miniprogram_dist/index.wxml +172 -0
- package/miniprogram_dist/index.wxss +291 -0
- package/miniprogram_dist/package.json +5 -0
- package/miniprogram_dist/utils/api.js +474 -0
- package/miniprogram_dist/utils/audio.js +860 -0
- package/miniprogram_dist/utils/storage.js +168 -0
- package/package.json +27 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Chat-Box 组件测试用例
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
本文档包含 `@flexem/chat-box` 组件的功能测试用例,覆盖主要功能模块的测试场景。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 消息发送与接收
|
|
10
|
+
|
|
11
|
+
### 1.1 文本消息发送
|
|
12
|
+
|
|
13
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
14
|
+
|------|--------|----------|----------|----------|
|
|
15
|
+
| MSG-001 | 发送普通文本消息 | 已登录,有网络 | 1. 在输入框输入文字<br>2. 点击发送按钮 | 1. 用户消息显示在聊天列表<br>2. 显示 AI 正在回复的状态<br>3. AI 回复流式显示 |
|
|
16
|
+
| MSG-002 | 发送空消息 | 已登录 | 1. 不输入任何内容<br>2. 点击发送按钮 | 发送按钮不可点击或无响应 |
|
|
17
|
+
| MSG-003 | 发送长文本消息 | 已登录 | 1. 输入超过 500 字的文本<br>2. 点击发送 | 消息正常发送,AI 正常回复 |
|
|
18
|
+
| MSG-004 | 发送特殊字符 | 已登录 | 1. 输入 emoji、特殊符号<br>2. 点击发送 | 特殊字符正确显示 |
|
|
19
|
+
| MSG-005 | 未登录时发送消息 | 未登录状态 | 1. 输入文字<br>2. 点击发送 | 触发登录事件,提示需要登录 |
|
|
20
|
+
|
|
21
|
+
### 1.2 流式消息接收
|
|
22
|
+
|
|
23
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
24
|
+
|------|--------|----------|----------|----------|
|
|
25
|
+
| MSG-006 | 流式内容显示 | 发送消息后 | 观察 AI 回复过程 | 1. 内容逐字/逐段显示<br>2. 显示打字指示器动画<br>3. 自动滚动到底部 |
|
|
26
|
+
| MSG-007 | 流式思考过程显示 | AI 返回思考内容 | 观察思考过程 | 1. 思考区域显示<br>2. 可折叠/展开 |
|
|
27
|
+
| MSG-008 | 停止生成 | AI 正在回复中 | 点击停止按钮 | 1. 请求中止<br>2. 当前内容保留<br>3. 可继续发送新消息 |
|
|
28
|
+
|
|
29
|
+
### 1.3 错误处理
|
|
30
|
+
|
|
31
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
32
|
+
|------|--------|----------|----------|----------|
|
|
33
|
+
| MSG-009 | 网络错误处理 | 无网络连接 | 发送消息 | 1. 显示错误消息<br>2. 滚动到底部显示错误<br>3. 可重试 |
|
|
34
|
+
| MSG-010 | 服务器错误处理 | 服务器返回 500 | 发送消息 | 显示"抱歉,发送消息失败"错误提示 |
|
|
35
|
+
| MSG-011 | Token 过期处理 | Token 已失效 | 发送消息 | 触发登录事件,提示重新登录 |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 2. 附件功能
|
|
40
|
+
|
|
41
|
+
### 2.1 图片附件
|
|
42
|
+
|
|
43
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
44
|
+
|------|--------|----------|----------|----------|
|
|
45
|
+
| ATT-001 | 从相册选择图片 | 已授权相册权限 | 1. 点击附件按钮<br>2. 选择"从相册选择"<br>3. 选择图片 | 1. 图片显示在输入栏附件区<br>2. 显示上传进度<br>3. 上传完成后显示预览 |
|
|
46
|
+
| ATT-002 | 拍摄照片 | 已授权相机权限 | 1. 点击附件按钮<br>2. 选择"拍摄照片"<br>3. 拍照 | 照片添加到附件列表并上传 |
|
|
47
|
+
| ATT-003 | 图片预览 | 消息中有图片 | 点击消息中的图片 | 全屏预览图片 |
|
|
48
|
+
| ATT-004 | 删除附件 | 已添加附件 | 点击附件上的删除按钮 | 附件被移除 |
|
|
49
|
+
| ATT-005 | 多图片附件 | - | 选择多张图片 | 多张图片都显示并上传 |
|
|
50
|
+
|
|
51
|
+
### 2.2 文件附件
|
|
52
|
+
|
|
53
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
54
|
+
|------|--------|----------|----------|----------|
|
|
55
|
+
| ATT-006 | 上传 PDF 文件 | - | 1. 点击附件按钮<br>2. 选择文件<br>3. 选择 PDF | 1. 文件上传<br>2. 自动解析内容<br>3. 显示文件图标和名称 |
|
|
56
|
+
| ATT-007 | 上传 Word 文档 | - | 选择 .docx 文件 | 文件正常上传和解析 |
|
|
57
|
+
| ATT-008 | 上传 Excel 文件 | - | 选择 .xlsx 文件 | 文件正常上传和解析 |
|
|
58
|
+
| ATT-009 | 上传 TXT 文件 | - | 选择 .txt 文件 | 文件正常上传和解析 |
|
|
59
|
+
| ATT-010 | 上传 Markdown 文件 | - | 选择 .md 文件 | 文件正常上传和解析 |
|
|
60
|
+
| ATT-011 | 上传进度显示 | 上传中 | 观察上传过程 | 显示上传进度百分比 |
|
|
61
|
+
| ATT-012 | 上传失败处理 | 网络不稳定 | 上传文件 | 显示上传失败提示,可重试 |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 3. 语音功能
|
|
66
|
+
|
|
67
|
+
### 3.1 语音输入
|
|
68
|
+
|
|
69
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
70
|
+
|------|--------|----------|----------|----------|
|
|
71
|
+
| VOC-001 | 切换到语音模式 | 文本输入模式 | 点击语音/键盘切换按钮 | 显示"按住说话"按钮 |
|
|
72
|
+
| VOC-002 | 长按录音 | 语音模式,已授权录音权限 | 长按"按住说话"按钮 | 1. 振动反馈<br>2. 显示录音界面<br>3. 实时语音识别 |
|
|
73
|
+
| VOC-003 | 松开发送语音 | 正在录音 | 松开按钮 | 1. 停止录音<br>2. 识别结果转为文字<br>3. 自动发送 |
|
|
74
|
+
| VOC-004 | 取消录音 | 正在录音 | 手指滑出按钮区域后松开 | 1. 取消录音<br>2. 不发送消息 |
|
|
75
|
+
| VOC-005 | 录音权限未授权 | 未授权录音 | 长按语音按钮 | 提示授权录音权限 |
|
|
76
|
+
| VOC-006 | 短按不触发录音 | 语音模式 | 快速点击(<150ms) | 不启动录音,视为误触 |
|
|
77
|
+
|
|
78
|
+
### 3.2 语音播放
|
|
79
|
+
|
|
80
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
81
|
+
|------|--------|----------|----------|----------|
|
|
82
|
+
| VOC-007 | 播放 AI 消息语音 | AI 已回复 | 点击播放按钮 | 1. 显示合成中状态<br>2. 开始播放<br>3. 显示播放动画 |
|
|
83
|
+
| VOC-008 | 停止播放 | 正在播放 | 再次点击播放按钮 | 停止播放 |
|
|
84
|
+
| VOC-009 | 语音自动播放 | 开启自动播放设置 | 按住说话发送 | AI 回复时自动播放语音 |
|
|
85
|
+
| VOC-010 | 流式语音播放连贯性 | 开启自动播放 | 发送消息并观察 | 语音从前到后连贯播放,不跳跃 |
|
|
86
|
+
| VOC-011 | 语音合成失败 | TTS 服务异常 | 播放消息 | 提示合成失败,可重试 |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 4. 会话管理
|
|
91
|
+
|
|
92
|
+
### 4.1 会话列表
|
|
93
|
+
|
|
94
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
95
|
+
|------|--------|----------|----------|----------|
|
|
96
|
+
| SES-001 | 打开侧边栏 | 非流式输出状态 | 点击菜单按钮 | 侧边栏滑出,显示会话列表 |
|
|
97
|
+
| SES-002 | 流式输出时打开侧边栏 | AI 正在回复 | 点击菜单按钮 | 提示"请等待当前回复完成" |
|
|
98
|
+
| SES-003 | 关闭侧边栏 | 侧边栏已打开 | 1. 点击关闭按钮<br>2. 或点击遮罩层 | 侧边栏关闭 |
|
|
99
|
+
| SES-004 | 会话按日期分组 | 有多个会话 | 查看会话列表 | 按"今天"、"本周"、"更早"分组 |
|
|
100
|
+
| SES-005 | 加载更多会话 | 会话数量超过一页 | 滚动到列表底部 | 自动加载更多会话 |
|
|
101
|
+
|
|
102
|
+
### 4.2 会话操作
|
|
103
|
+
|
|
104
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
105
|
+
|------|--------|----------|----------|----------|
|
|
106
|
+
| SES-006 | 选择会话 | 有多个会话 | 点击某个会话 | 1. 加载该会话历史消息<br>2. 关闭侧边栏<br>3. 显示历史消息 |
|
|
107
|
+
| SES-007 | 新建对话 | - | 点击"新建对话"或下拉菜单中的"开始新对话" | 1. 创建新会话<br>2. 清空当前消息<br>3. 显示空状态 |
|
|
108
|
+
| SES-008 | 重命名会话 | 有会话 | 1. 进入编辑模式<br>2. 点击重命名<br>3. 输入新名称 | 会话名称更新 |
|
|
109
|
+
| SES-009 | 删除会话 | 有会话 | 1. 进入编辑模式<br>2. 点击删除 | 1. 确认提示<br>2. 会话被删除 |
|
|
110
|
+
| SES-010 | 搜索会话 | 有多个会话 | 在搜索框输入关键词 | 显示匹配的会话 |
|
|
111
|
+
|
|
112
|
+
### 4.3 历史消息
|
|
113
|
+
|
|
114
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
115
|
+
|------|--------|----------|----------|----------|
|
|
116
|
+
| SES-011 | 加载历史消息 | 选择有历史的会话 | 选择会话 | 1. 显示加载提示<br>2. 历史消息正确显示<br>3. 滚动到最新消息 |
|
|
117
|
+
| SES-012 | 加载更多历史 | 历史消息超过一页 | 滚动到顶部 | 显示"加载更多历史消息",点击加载 |
|
|
118
|
+
| SES-013 | 历史消息附件显示 | 历史消息含附件 | 查看历史消息 | 图片和文件附件正确显示 |
|
|
119
|
+
| SES-014 | 自动生成会话标题 | 新会话 | 发送第一条消息 | 会话标题自动根据内容生成 |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 5. 消息编辑与重新生成
|
|
124
|
+
|
|
125
|
+
### 5.1 编辑消息
|
|
126
|
+
|
|
127
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
128
|
+
|------|--------|----------|----------|----------|
|
|
129
|
+
| EDT-001 | 编辑用户消息 | 有用户消息,非流式状态 | 点击编辑按钮 | 1. 消息内容填入输入框<br>2. 可修改后重新发送 |
|
|
130
|
+
| EDT-002 | 流式输出时编辑 | AI 正在回复 | 点击编辑按钮 | 提示"请等待当前回复完成" |
|
|
131
|
+
|
|
132
|
+
### 5.2 重新生成
|
|
133
|
+
|
|
134
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
135
|
+
|------|--------|----------|----------|----------|
|
|
136
|
+
| EDT-003 | 重新生成回复 | 有用户消息 | 点击重新生成按钮 | 1. 删除该消息之后的历史<br>2. 重新发送该消息<br>3. AI 重新回复 |
|
|
137
|
+
| EDT-004 | 流式输出时重新生成 | AI 正在回复 | 点击重新生成按钮 | 提示"请等待当前回复完成" |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 6. Markdown 渲染
|
|
142
|
+
|
|
143
|
+
### 6.1 基础格式
|
|
144
|
+
|
|
145
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
146
|
+
|------|--------|----------|----------|----------|
|
|
147
|
+
| MD-001 | 标题渲染 | AI 返回标题格式 | 查看消息 | # ~ ###### 各级标题正确显示 |
|
|
148
|
+
| MD-002 | 加粗文本 | AI 返回 **text** | 查看消息 | 文本加粗显示 |
|
|
149
|
+
| MD-003 | 代码块渲染 | AI 返回代码块 | 查看消息 | 1. 显示语言标签<br>2. 语法高亮<br>3. 复制按钮 |
|
|
150
|
+
| MD-004 | 行内代码 | AI 返回 `code` | 查看消息 | 行内代码样式显示 |
|
|
151
|
+
| MD-005 | 列表渲染 | AI 返回列表 | 查看消息 | 有序/无序列表正确显示 |
|
|
152
|
+
| MD-006 | 表格渲染 | AI 返回表格 | 查看消息 | 1. 表格正确显示<br>2. 可横向滚动 |
|
|
153
|
+
| MD-007 | 引用块渲染 | AI 返回 > 引用 | 查看消息 | 引用样式正确显示 |
|
|
154
|
+
| MD-008 | 分隔线渲染 | AI 返回 --- | 查看消息 | 显示水平分隔线 |
|
|
155
|
+
| MD-009 | 图片渲染 | AI 返回  | 查看消息 | 图片正确显示,可点击预览 |
|
|
156
|
+
| MD-010 | 链接渲染 | AI 返回 [text](url) | 查看消息 | 链接可点击,复制到剪贴板 |
|
|
157
|
+
|
|
158
|
+
### 6.2 特殊功能
|
|
159
|
+
|
|
160
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
161
|
+
|------|--------|----------|----------|----------|
|
|
162
|
+
| MD-011 | 复制代码 | 消息包含代码块 | 点击代码块的复制按钮 | 代码复制到剪贴板 |
|
|
163
|
+
| MD-012 | 快捷回复渲染 | AI 返回 quick-replies 代码块 | 查看消息 | 显示可点击的快捷回复按钮 |
|
|
164
|
+
| MD-013 | 点击快捷回复 | 消息包含快捷回复 | 点击快捷回复按钮 | 自动发送该选项内容 |
|
|
165
|
+
| MD-014 | 流式输出时快捷回复 | AI 正在回复 | 点击快捷回复按钮 | 按钮禁用,提示等待 |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 7. 设置功能
|
|
170
|
+
|
|
171
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
172
|
+
|------|--------|----------|----------|----------|
|
|
173
|
+
| SET-001 | 打开下拉菜单 | - | 点击标题栏 | 下拉菜单显示 |
|
|
174
|
+
| SET-002 | 切换语音自动播放 | - | 点击"语音播放"开关 | 1. 开关状态切换<br>2. 设置保存到本地 |
|
|
175
|
+
| SET-003 | 设置持久化 | 修改设置后 | 退出并重新进入 | 设置状态保持 |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 8. UI 交互
|
|
180
|
+
|
|
181
|
+
### 8.1 滚动行为
|
|
182
|
+
|
|
183
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
184
|
+
|------|--------|----------|----------|----------|
|
|
185
|
+
| UI-001 | 发送消息自动滚动 | 有消息 | 发送新消息 | 自动滚动到底部 |
|
|
186
|
+
| UI-002 | 流式输出自动滚动 | AI 正在回复 | 观察滚动行为 | 内容更新时自动滚动(节流 200ms) |
|
|
187
|
+
| UI-003 | 错误消息自动滚动 | 发送失败 | 观察滚动行为 | 错误消息显示后滚动到底部 |
|
|
188
|
+
| UI-004 | 键盘弹出滚动 | 点击输入框 | 键盘弹出 | 自动滚动到底部,免责声明隐藏 |
|
|
189
|
+
|
|
190
|
+
### 8.2 输入栏
|
|
191
|
+
|
|
192
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
193
|
+
|------|--------|----------|----------|----------|
|
|
194
|
+
| UI-005 | 输入框自动扩展 | - | 输入多行文字 | 输入框高度自动扩展(最多 5 行) |
|
|
195
|
+
| UI-006 | 生成中显示停止按钮 | AI 正在回复 | 观察输入栏 | 发送按钮变为停止按钮 |
|
|
196
|
+
|
|
197
|
+
### 8.3 导航
|
|
198
|
+
|
|
199
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
200
|
+
|------|--------|----------|----------|----------|
|
|
201
|
+
| UI-007 | 返回按钮 | - | 点击左上角返回按钮 | 触发 back 事件,返回上一页 |
|
|
202
|
+
| UI-008 | 点击遮罩关闭下拉菜单 | 下拉菜单打开 | 点击遮罩层 | 下拉菜单关闭 |
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 9. 边界情况与异常处理
|
|
207
|
+
|
|
208
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
209
|
+
|------|--------|----------|----------|----------|
|
|
210
|
+
| ERR-001 | 网络断开恢复 | 网络断开后恢复 | 恢复网络后发送消息 | 正常发送 |
|
|
211
|
+
| ERR-002 | 快速重复发送 | - | 快速多次点击发送 | 只发送一次,防止重复 |
|
|
212
|
+
| ERR-003 | 大文件上传 | - | 上传超大文件 | 显示合适的提示 |
|
|
213
|
+
| ERR-004 | 长时间无响应 | 服务器响应慢 | 等待响应 | 有超时处理或提示 |
|
|
214
|
+
| ERR-005 | 组件销毁清理 | - | 快速进出页面 | 无内存泄漏,请求正确中止 |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 10. 性能测试
|
|
219
|
+
|
|
220
|
+
| 编号 | 测试项 | 前置条件 | 测试步骤 | 预期结果 |
|
|
221
|
+
|------|--------|----------|----------|----------|
|
|
222
|
+
| PERF-001 | 大量消息加载 | 会话有 100+ 条消息 | 加载会话 | 加载时间合理,滚动流畅 |
|
|
223
|
+
| PERF-002 | 流式输出性能 | - | 接收长回复 | UI 更新流畅,无卡顿 |
|
|
224
|
+
| PERF-003 | 多图片消息 | 消息包含多张图片 | 查看消息 | 图片懒加载,不影响滚动 |
|
|
225
|
+
| PERF-004 | Markdown 解析性能 | AI 返回长内容 | 查看消息 | 解析快速,节流生效 |
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 测试环境要求
|
|
230
|
+
|
|
231
|
+
### 设备要求
|
|
232
|
+
- iOS: iPhone 8 及以上
|
|
233
|
+
- Android: Android 7.0 及以上
|
|
234
|
+
- 微信版本: 8.0.0 及以上
|
|
235
|
+
|
|
236
|
+
### 网络要求
|
|
237
|
+
- 4G/5G 或 Wi-Fi 网络
|
|
238
|
+
- 需测试弱网和断网场景
|
|
239
|
+
|
|
240
|
+
### 权限要求
|
|
241
|
+
- 录音权限
|
|
242
|
+
- 相册权限
|
|
243
|
+
- 相机权限
|
|
244
|
+
|
|
245
|
+
### 依赖服务
|
|
246
|
+
- AI 聊天 API 服务
|
|
247
|
+
- 七牛云存储服务
|
|
248
|
+
- 微信同声传译插件(WechatSI)
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 版本信息
|
|
253
|
+
|
|
254
|
+
- 文档版本: 1.0
|
|
255
|
+
- 最后更新: 2026-01-20
|
|
256
|
+
- 组件版本: @songkaige/chat-box
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768204962039" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8727" width="200" height="200"><path d="M512 640l-204.8-256h409.6z" p-id="8728"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768205027321" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9688" width="200" height="200"><path d="M512 384l204.8 256H307.2z" p-id="9689"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768271063116" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6800" width="200" height="200"><path d="M1024 512c0-281.6-230.4-512-512-512S0 230.4 0 512s230.4 512 512 512 512-230.4 512-512z m-512 448c-249.6 0-448-198.4-448-448s198.4-448 448-448 448 198.4 448 448-198.4 448-448 448z" fill="#777777" p-id="6801"></path><path d="M627.2 505.6c44.8-38.4 76.8-89.6 76.8-153.6 0-108.8-83.2-192-192-192s-192 83.2-192 192c0 64 32 115.2 76.8 153.6-102.4 44.8-172.8 147.2-172.8 262.4 0 19.2 12.8 32 32 32s32-12.8 32-32c0-121.6 102.4-224 224-224s224 102.4 224 224c0 19.2 12.8 32 32 32s32-12.8 32-32c0-115.2-70.4-217.6-172.8-262.4zM512 480c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128-57.6 128-128 128z" fill="#777777" p-id="6802"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768271604143" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7789" width="200" height="200"><path d="M789.333333 829.354667L744.704 874.666667l-327.381333-332.757334a42.666667 42.666667 0 0 1 0-59.818666L744.704 149.333333 789.333333 194.688 477.098667 512 789.333333 829.354667z" fill="#000000" p-id="7790"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M663.04 282.24L606.72 195.2H435.84l-57.92 86.88H260.16c-7.99 0-14.82 2.87-20.47 8.6-5.69 5.75-8.51 12.68-8.51 20.83v318.24c0 7.99 2.82 14.83 8.51 20.48 5.65 5.68 12.48 8.5 20.47 8.5h575.68c8.17 0 15.03-2.74 20.6-8.25 5.56-5.52 8.37-12.27 8.37-20.24V312.1c0-8.15-2.87-15.17-8.62-21.04-5.72-5.9-12.51-8.82-20.37-8.82H663.04zM520.64 368.96c-23.97 0-44.49 8.49-61.44 25.46-16.98 16.98-25.47 37.45-25.47 61.44 0 23.98 8.49 44.45 25.47 61.44 16.95 16.98 37.47 25.46 61.44 25.46s44.46-8.48 61.44-25.46c16.98-16.99 25.46-37.46 25.46-61.44 0-23.99-8.48-44.46-25.46-61.44-16.98-16.97-37.47-25.46-61.44-25.46z m0-57.92c19.61 0 38.37 3.83 56.25 11.52 17.89 7.72 33.29 18.01 46.17 30.92 12.89 12.9 23.2 28.28 30.92 46.17a140.69 140.69 0 0 1 11.52 56.25c-0.03 19.62-3.86 38.37-11.52 56.25-7.69 17.89-18.01 33.27-30.92 46.17-12.92 12.92-28.3 23.22-46.17 30.92a141.86 141.86 0 0 1-56.25 11.52 140.88 140.88 0 0 1-56.25-11.52c-17.87-7.7-33.26-18-46.19-30.92-12.91-12.9-23.23-28.29-30.92-46.17a141.72 141.72 0 0 1-11.52-56.25 140.54 140.54 0 0 1 11.52-56.25c7.73-17.89 18.03-33.28 30.92-46.19 12.89-12.89 28.29-23.19 46.17-30.92a141.03 141.03 0 0 1 56.27-11.5z m-404.48-173.92h529.68l57.92 86.88h86.88c24 0 44.46 8.63 61.44 25.92 16.98 17.3 25.46 37.92 25.46 61.9v318.26c0 23.97-8.48 44.39-25.46 61.22-16.98 16.83-37.44 25.23-61.44 25.23H116.16c-24.01 0-44.48-8.49-61.44-25.46-16.98-16.98-25.46-37.33-25.46-61.22V311.71c0-23.98 8.48-44.53 25.46-61.66 16.96-17.13 37.43-25.71 61.44-25.69h86.88l57.92-87.32z" fill="#888888"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768274175050" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10632" width="200" height="200"><path d="M512 466.944l233.472-233.472a31.744 31.744 0 0 1 45.056 45.056L557.056 512l233.472 233.472a31.744 31.744 0 0 1-45.056 45.056L512 557.056l-233.472 233.472a31.744 31.744 0 0 1-45.056-45.056L466.944 512 233.472 278.528a31.744 31.744 0 0 1 45.056-45.056z" fill="#000000" p-id="10633"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768440444513" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4603" width="200" height="200"><path d="M931.84 675.84c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48V419.84c0-34.816-26.624-61.44-61.44-61.44h-409.6c-34.816 0-61.44 26.624-61.44 61.44v409.6c0 34.816 26.624 61.44 61.44 61.44h409.6c34.816 0 61.44-26.624 61.44-61.44v-45.056c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v45.056c0 57.344-45.056 102.4-102.4 102.4h-409.6c-57.344 0-102.4-45.056-102.4-102.4v-409.6c0-57.344 45.056-102.4 102.4-102.4h409.6c57.344 0 102.4 45.056 102.4 102.4v256z m-225.28-454.656c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48V194.56c0-34.816-26.624-61.44-61.44-61.44h-409.6c-34.816 0-61.44 26.624-61.44 61.44v409.6c0 34.816 26.624 61.44 61.44 61.44h32.768c12.288 0 20.48 8.192 20.48 20.48s-8.192 20.48-20.48 20.48h-32.768c-57.344 0-102.4-45.056-102.4-102.4v-409.6c0-57.344 45.056-102.4 102.4-102.4h409.6c57.344 0 102.4 45.056 102.4 102.4v26.624z" fill="#32373B" p-id="4604"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768269951663" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="28348" width="200" height="200"><path d="M458.2 716.6V395.1c0-18.7-15.2-33.9-33.9-33.9s-33.9 15.2-33.9 33.9v321.5c0 18.7 15.2 33.9 33.9 33.9 18.7-0.1 33.9-15.3 33.9-33.9z" p-id="28349" fill="#FF4D4F"></path><path d="M775.1 362c-18.7 0-33.9 15.2-33.9 33.9v437.6c0 13.5-11 24.5-24.5 24.5H307.5c-13.5 0-24.5-11-24.5-24.5V394.7c0-18.7-15.2-33.9-33.9-33.9s-33.9 15.2-33.9 33.9v438.8c0 50.9 41.4 92.3 92.3 92.3h409.2c50.9 0 92.3-41.4 92.3-92.3V395.9c0-18.7-15.2-33.9-33.9-33.9z" p-id="28350" fill="#FF4D4F"></path><path d="M633.6 716.6V395.1c0-18.7-15.2-33.9-33.9-33.9s-33.9 15.2-33.9 33.9v321.5c0 18.7 15.2 33.9 33.9 33.9 18.7-0.1 33.9-15.3 33.9-33.9zM891.9 244.3H750.5v-53.8c0-50.9-41.1-92.3-91.7-92.3H365.9c-50.9 0-92.3 41.4-92.3 92.3v53.8H132.1c-18.7 0-33.9 15.2-33.9 33.9s15.2 33.9 33.9 33.9h759.8c18.7 0 33.9-15.2 33.9-33.9s-15.2-33.9-33.9-33.9z m-209.2 0H341.4v-53.8c0-13.5 11-24.6 24.5-24.6h292.9c13.4 0 23.9 10.8 23.9 24.6v53.8z" p-id="28351" fill="#FF4D4F"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768440249668" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2615" width="200" height="200"><path d="M874.666667 896h-725.333334c-11.757037 0-21.333333-9.576296-21.333333-21.333333s9.576296-21.333333 21.333333-21.333334h725.333334c11.757037 0 21.333333 9.576296 21.333333 21.333334S886.423704 896 874.666667 896zM326.637037 718.696296c-5.594074 0-10.998519-2.180741-15.075556-6.257777-5.499259-5.499259-7.585185-13.558519-5.404444-21.048889l40.865185-141.274074c1.042963-3.508148 2.844444-6.637037 5.404445-9.197037l406.66074-406.660741c8.343704-8.343704 21.807407-8.343704 30.151112 0l100.503703 100.503703c3.982222 3.982222 6.257778 9.386667 6.257778 15.075556s-2.275556 11.093333-6.257778 15.075556L483.081481 671.573333c-2.56 2.56-5.688889 4.361481-9.197037 5.404445l-141.368888 40.865185c-1.896296 0.568889-3.887407 0.853333-5.878519 0.853333z m59.828148-151.514074l-28.634074 98.891852 98.891852-28.634074 387.697778-387.697778-70.352593-70.352592-387.602963 387.792592z m81.540741 89.315556z" p-id="2616"></path><path d="M804.977778 340.859259c-5.499259 0-10.903704-2.085926-15.075556-6.257778l-100.503703-100.503703c-8.343704-8.343704-8.343704-21.807407 0-30.151111s21.807407-8.343704 30.151111 0l100.503703 100.503703c8.343704 8.343704 8.343704 21.807407 0 30.151111-4.171852 4.171852-9.576296 6.257778-15.075555 6.257778z" p-id="2617"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768268816393" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="20275" width="200" height="200"><path d="M684.202667 117.248c15.893333-15.872 42.154667-15.36 58.922666 1.408l90.517334 90.517333c16.661333 16.661333 17.344 42.986667 1.429333 58.922667l-445.653333 445.653333c-7.936 7.914667-23.104 16.746667-34.218667 19.776l-143.701333 39.253334c-21.909333 5.994667-35.114667-7.104-29.568-28.949334l37.248-146.773333c2.773333-10.944 11.562667-26.346667 19.392-34.176l445.653333-445.653333zM268.736 593.066667c-2.901333 2.901333-8.106667 12.074667-9.130667 16.021333l-29.12 114.773333 111.957334-30.570666c4.437333-1.216 13.632-6.549333 16.810666-9.728l445.653334-445.653334-90.517334-90.496-445.653333 445.653334zM682.794667 178.986667l90.517333 90.517333-30.186667 30.186667-90.496-90.517334 30.165334-30.165333z m-362.026667 362.048l90.496 90.517333-30.165333 30.165333-90.517334-90.496 30.165334-30.186666zM170.666667 874.666667c0-11.776 9.429333-21.333333 21.461333-21.333334h661.077333a21.333333 21.333333 0 1 1 0 42.666667H192.128A21.333333 21.333333 0 0 1 170.666667 874.666667z" fill="#1890ff" p-id="20276" stroke="#1890ff" stroke-width="20"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M733.6228025 357.50476098L604.7119751 228.65325904V357.50476098h128.9108274zM542.89904809 419.30285644V203.00952125h-247.19238329c-8.68634009 0-16.01806641 2.98608422-21.96551513 8.96319604-5.96228028 5.97216773-8.92858886 13.28411842-8.92858888 21.93585205v556.18286133c0 8.65173364 2.96630859 16.06750512 8.92858888 21.94079613 5.94250464 5.97216773 13.27917504 8.95825195 21.96057176 8.95825195h432.59655714c8.71105981 0 16.02795386-2.98608422 21.98034668-8.96319604 5.92272973-5.86834693 8.90881324-13.28411842 8.90881396-21.93585204v-370.78857422H542.89904809zM295.72149634 141.21142578h308.99047876L820.99047875 357.50476098v432.58666968c0 25.54486108-9.04724122 47.48071313-27.14172363 65.50598122-18.10931396 18.1290896-39.9462893 27.19116234-65.55541992 27.19116234h-432.5866704c-25.56958008 0-47.42633033-9.06207276-65.5356443-27.19116234C212.06170654 837.57214379 203.00952125 815.63629174 203.00952125 790.09143067V233.90856933C203.00952125 208.36370826 212.06170654 186.53167701 230.1710205 168.40258813S270.13708472 141.21142578 295.7066648 141.21142578h0.01977563z" fill="#888888"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M675.9424 381.3376m-46.6944 0a46.6944 46.6944 0 1 0 93.3888 0 46.6944 46.6944 0 1 0-93.3888 0Z" fill="#888888"></path><path d="M777.4208 806.1952H246.5792c-33.8944 0-61.44-27.5456-61.44-61.44V279.2448c0-33.8944 27.5456-61.44 61.44-61.44h530.944c33.8944 0 61.44 27.5456 61.44 61.44v465.408c-0.1024 33.8944-27.648 61.5424-61.5424 61.5424z m20.48-186.9824v-339.968c0-11.264-9.216-20.48-20.48-20.48H246.5792c-11.264 0-20.48 9.216-20.48 20.48v292.4544l140.6976-141.0048c12.1856-11.9808 28.8768-18.432 45.9776-17.7152 17.1008 0.8192 33.1776 8.704 44.2368 21.8112l112.7424 134.0416c6.7584 8.0896 18.5344 9.728 27.2384 3.7888l38.0928-25.9072c23.7568-16.1792 56.1152-13.6192 76.9024 6.2464l85.9136 82.1248v-15.872z m-6.0416 66.7648L683.7248 582.656c-6.9632-6.5536-17.7152-7.4752-25.6-2.048l-38.0928 25.9072c-26.112 17.8176-61.2352 13.0048-81.6128-11.264L425.6768 461.312c-3.6864-4.4032-8.9088-6.9632-14.7456-7.2704-5.7344-0.3072-11.1616 1.8432-15.2576 5.8368L226.0992 629.76v114.8928c0 11.264 9.216 20.48 20.48 20.48h530.944c11.264 0 20.48-9.216 20.48-20.48v-52.9408l-6.144-5.7344z" fill="#888888"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768203619778" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6736" width="200" height="200"><path d="M741.517241 150.068966H282.482759c-72.386207 0-132.413793 60.027586-132.413793 132.413793v423.724138c0 72.386207 60.027586 132.413793 132.413793 132.413793h459.034482c72.386207 0 132.413793-60.027586 132.413793-132.413793V282.482759c0-72.386207-60.027586-132.413793-132.413793-132.413793zM820.965517 706.206897c0 44.137931-35.310345 79.448276-79.448276 79.448275H282.482759c-44.137931 0-79.448276-35.310345-79.448276-79.448275V282.482759c0-44.137931 35.310345-79.448276 79.448276-79.448276h459.034482c44.137931 0 79.448276 35.310345 79.448276 79.448276v423.724138z" fill="#000000" p-id="6737" stroke="#000000" stroke-width="15"></path><path d="M300.137931 406.068966h52.965517c10.593103 0 17.655172-7.062069 17.655173-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655173-17.655173h-52.965517c-10.593103 0-17.655172 7.062069-17.655172 17.655173v52.965517c0 10.593103 7.062069 17.655172 17.655172 17.655173zM300.137931 547.310345h52.965517c10.593103 0 17.655172-7.062069 17.655173-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655173-17.655172h-52.965517c-10.593103 0-17.655172 7.062069-17.655172 17.655172v52.965517c0 10.593103 7.062069 17.655172 17.655172 17.655173zM723.862069 600.275862H300.137931c-10.593103 0-17.655172 7.062069-17.655172 17.655172v35.310345c0 10.593103 7.062069 17.655172 17.655172 17.655173h423.724138c10.593103 0 17.655172-7.062069 17.655172-17.655173v-35.310345c0-10.593103-7.062069-17.655172-17.655172-17.655172zM423.724138 406.068966h52.965517c10.593103 0 17.655172-7.062069 17.655173-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655173-17.655173h-52.965517c-10.593103 0-17.655172 7.062069-17.655172 17.655173v52.965517c0 10.593103 7.062069 17.655172 17.655172 17.655173zM423.724138 547.310345h52.965517c10.593103 0 17.655172-7.062069 17.655173-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655173-17.655172h-52.965517c-10.593103 0-17.655172 7.062069-17.655172 17.655172v52.965517c0 10.593103 7.062069 17.655172 17.655172 17.655173zM547.310345 406.068966h52.965517c10.593103 0 17.655172-7.062069 17.655172-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655172-17.655173h-52.965517c-10.593103 0-17.655172 7.062069-17.655173 17.655173v52.965517c0 10.593103 7.062069 17.655172 17.655173 17.655173zM547.310345 547.310345h52.965517c10.593103 0 17.655172-7.062069 17.655172-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655172-17.655172h-52.965517c-10.593103 0-17.655172 7.062069-17.655173 17.655172v52.965517c0 10.593103 7.062069 17.655172 17.655173 17.655173zM723.862069 317.793103h-52.965517c-10.593103 0-17.655172 7.062069-17.655173 17.655173v52.965517c0 10.593103 7.062069 17.655172 17.655173 17.655173h52.965517c10.593103 0 17.655172-7.062069 17.655172-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655172-17.655173zM723.862069 459.034483h-52.965517c-10.593103 0-17.655172 7.062069-17.655173 17.655172v52.965517c0 10.593103 7.062069 17.655172 17.655173 17.655173h52.965517c10.593103 0 17.655172-7.062069 17.655172-17.655173v-52.965517c0-10.593103-7.062069-17.655172-17.655172-17.655172z" fill="#000000" p-id="6738" stroke="#000000" stroke-width="8"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768271764376" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9639" width="200" height="200"><path d="M858.026667 307.2H186.026667c-12.373333 0-22.186667-9.813333-22.186667-22.186667v-23.466666c0-12.373333 9.813333-22.186667 22.186667-22.186667h672c12.373333 0 22.186667 9.813333 22.186666 22.186667v23.466666c0 12.373333-9.813333 22.186667-22.186666 22.186667zM858.026667 546.133333H186.026667c-12.373333 0-22.186667-9.813333-22.186667-22.186666v-23.466667c0-12.373333 9.813333-22.186667 22.186667-22.186667h672c12.373333 0 22.186667 9.813333 22.186666 22.186667v23.466667c0 12.373333-9.813333 22.186667-22.186666 22.186666zM858.026667 785.066667H186.026667c-12.373333 0-22.186667-9.813333-22.186667-22.186667v-23.466667c0-12.373333 9.813333-22.186667 22.186667-22.186666h672c12.373333 0 22.186667 9.813333 22.186666 22.186666v23.466667c0 12.373333-9.813333 22.186667-22.186666 22.186667z" fill="#000000" p-id="9640"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768440307564" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3602" width="200" height="200"><path d="M512 0c281.6 0 512 230.4 512 512s-230.4 512-512 512S0 793.6 0 512 230.4 0 512 0z m0 42.6752C253.8752 42.6752 42.6752 253.8752 42.6752 512c0 258.1248 211.2 469.3248 469.3248 469.3248 258.1248 0 469.3248-211.2 469.3248-469.3248 0-258.1248-211.2-469.3248-469.3248-469.3248z m-117.3248 343.4496c0-70.4 49.0496-96 106.6496-57.6l170.6752 113.0752c57.6 38.4 57.6 102.4 0 145.0752l-170.6752 113.0496c-59.7248 38.4-106.6496 12.8-106.6496-57.6z" fill="#666666" p-id="3603"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768204762179" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7737" width="200" height="200"><path d="M511.998465 66.541509c-246.01816 0-445.457468 199.440331-445.457468 445.458491 0 246.017136 199.439308 445.457468 445.457468 445.457468 246.019183 0 445.459514-199.440331 445.459514-445.457468C957.457979 265.98184 758.017648 66.541509 511.998465 66.541509zM511.998465 929.808758c-230.747361 0-417.809781-187.05628-417.809781-417.808758 0-230.753501 187.06242-417.809781 417.809781-417.809781 230.748385 0 417.808758 187.05628 417.808758 417.809781C929.807223 742.752478 742.74685 929.808758 511.998465 929.808758zM775.988951 476.801337 547.194058 476.801337 547.194058 248.016677c0-19.437701-15.754822-35.193547-35.18229-35.193547-19.447934 0-35.20378 15.755846-35.20378 35.193547l0 228.783637L248.029468 476.800313c-19.447934 0-35.20378 15.755846-35.20378 35.20378 0 19.437701 15.755846 35.193547 35.20378 35.193547l228.77852 0 0 228.773404c0 19.446911 15.755846 35.202757 35.20378 35.202757 19.426445 0 35.18229-15.755846 35.18229-35.202757L547.194058 547.198663l228.794893 0c19.426445 0 35.183314-15.755846 35.183314-35.193547C811.172265 492.557182 795.41642 476.801337 775.988951 476.801337z" fill="#000000" p-id="7738" stroke="#000000" stroke-width="15"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768440214191" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1624" width="200" height="200"><path d="M720.52736 167.6288c-76.45184-43.008-167.26016-62.11584-248.50432-47.77984-19.10784 4.77184-33.44384 19.10784-23.90016 38.21568 4.77184 14.336 19.10784 23.90016 33.44384 23.90016 71.68-9.56416 143.36 4.77184 210.26816 43.008 152.94464 86.016 210.28864 277.15584 138.60864 430.08-4.77184 14.336-14.336 23.90016-14.336 23.90016l-66.90816-38.23616-14.336 215.06048c4.77184 4.77184 205.47584-100.352 205.47584-100.352l-66.90816-38.23616 14.336-28.65152c81.24416-191.1808 9.56416-415.78496-167.23968-520.9088zM352.54272 803.20512c-162.48832-90.80832-215.04-296.28416-124.25216-458.752l71.68 38.23616 14.336-210.26816-205.49632 100.352 66.90816 38.23616c-109.91616 195.93216-33.44384 439.64416 143.36 544.78848 81.24416 47.77984 172.032 62.11584 258.06848 47.77984 19.12832-4.77184 28.672-19.12832 23.90016-38.21568-4.77184-14.336-19.12832-23.90016-33.46432-23.90016-71.65952 14.31552-148.13184-0.02048-215.04-38.25664z m0 0" fill="#999999" p-id="1625"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path d="M512 348.416a742.4 742.4 0 0 1 265.386667 43.904C853.888 422.741333 896 465.237333 896 512s-42.112 89.258667-118.613333 119.68A742.4 742.4 0 0 1 512 675.584a742.4 742.4 0 0 1-265.386667-43.904C170.112 601.258667 128 558.762667 128 512s42.112-89.301333 118.613333-119.68A742.4 742.4 0 0 1 512 348.416z m0 290.816a705.322667 705.322667 0 0 0 251.733333-41.301333c60.757333-24.149333 95.616-55.466667 95.616-85.930667s-34.773333-61.781333-95.616-85.930667a705.322667 705.322667 0 0 0-251.733333-41.301333 705.322667 705.322667 0 0 0-251.733333 41.301333c-60.842667 24.149333-95.701333 55.466667-95.701334 85.930667s34.858667 61.781333 95.701334 85.930667a705.322667 705.322667 0 0 0 251.733333 41.301333z" fill="#666"/><path d="M362.453333 170.666667a238.933333 238.933333 0 0 1 145.92 73.898666 775.210667 775.210667 0 0 1 146.133334 185.642667 730.922667 730.922667 0 0 1 94.592 250.410667c11.733333 81.066667-4.266667 138.538667-44.970667 162.133333a84.096 84.096 0 0 1-42.666667 10.794667 238.677333 238.677333 0 0 1-145.92-73.898667 775.424 775.424 0 0 1-146.176-185.856 730.922667 730.922667 0 0 1-94.336-250.410667C263.253333 262.357333 279.253333 204.8 320 181.461333A84.138667 84.138667 0 0 1 362.453333 170.666667z m299.093334 646.314666a47.914667 47.914667 0 0 0 24.192-5.930666c26.538667-15.232 36.394667-60.885333 27.093333-125.269334a694.442667 694.442667 0 0 0-89.984-237.397333 749.312 749.312 0 0 0-139.008-176.853333 209.066667 209.066667 0 0 0-121.386667-64.512 47.914667 47.914667 0 0 0-24.149333 5.930666c-26.538667 15.189333-36.437333 60.885333-27.093333 125.269334a694.442667 694.442667 0 0 0 89.941333 237.397333 749.482667 749.482667 0 0 0 138.88 176.853333 209.066667 209.066667 0 0 0 121.514667 64.512z" fill="#666"/><path d="M362.453333 853.333333a84.138667 84.138667 0 0 1-42.453333-10.794666c-40.746667-23.381333-56.746667-81.066667-44.970667-162.133334a730.965333 730.965333 0 0 1 94.336-250.197333 775.381333 775.381333 0 0 1 146.218667-185.642667A238.677333 238.677333 0 0 1 661.546667 170.666667a84.096 84.096 0 0 1 42.666666 10.794666c40.746667 23.381333 56.704 81.066667 44.970667 162.133334a730.965333 730.965333 0 0 1-94.677333 250.197333 775.210667 775.210667 0 0 1-146.133334 185.642667A238.933333 238.933333 0 0 1 362.453333 853.333333z m299.093334-646.314666a209.066667 209.066667 0 0 0-121.514667 64.512 749.482667 749.482667 0 0 0-138.88 176.853333 694.442667 694.442667 0 0 0-89.941333 237.397333c-9.344 64.384 0.554667 110.037333 27.050666 125.269334a47.914667 47.914667 0 0 0 24.149334 5.930666 209.066667 209.066667 0 0 0 121.386666-64.512 749.269333 749.269333 0 0 0 139.050667-176.853333 694.442667 694.442667 0 0 0 89.941333-237.397333c9.344-64.384-0.554667-110.037333-27.093333-125.269334a47.914667 47.914667 0 0 0-24.149333-5.930666z" fill="#666"/><path d="M512 457.472A54.741333 54.741333 0 0 1 566.826667 512a54.869333 54.869333 0 0 1-109.696 0A54.741333 54.741333 0 0 1 512 457.472z m0 72.533333a18.176 18.176 0 1 0-18.304-18.005333 18.261333 18.261333 0 0 0 18.304 18.005333z" fill="#666"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg t="1768203563610" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5561" width="200" height="200"><path d="M511.998465 66.541509c-246.01816 0-445.457468 199.440331-445.457468 445.458491 0 246.017136 199.439308 445.457468 445.457468 445.457468 246.019183 0 445.459514-199.440331 445.459514-445.457468C957.457979 265.98184 758.017648 66.541509 511.998465 66.541509zM511.998465 929.808758c-230.747361 0-417.809781-187.05628-417.809781-417.808758 0-230.753501 187.06242-417.809781 417.809781-417.809781 230.748385 0 417.808758 187.05628 417.808758 417.809781C929.807223 742.752478 742.74685 929.808758 511.998465 929.808758zM569.403896 251.175623c-5.378497-5.948479-13.07683-9.764388-21.731954-9.764388-16.22759 0-29.377074 13.155624-29.377074 29.375028 0 8.109702 3.284813 15.456017 8.604982 20.775162l-0.068562 0.063445c60.150962 53.632501 98.064456 131.675972 98.064456 218.60174 0 84.918042-36.180014 161.350828-93.924159 214.84109 0.005117 0 0.022513 0.00921 0.022513 0.00921l0.00921 0.017396c-7.668657 5.300726-12.70844 14.130835-12.70844 24.157189 0 16.217357 13.149485 29.376051 29.377074 29.376051 8.113795 0 15.458063-3.28379 20.773116-8.603959l0.091074 0.093121c70.589708-64.274886 114.903983-156.907633 114.903983-259.890099C683.439092 407.67598 639.476835 315.402413 569.403896 251.175623zM394.845255 448.536596c-0.010233-0.007163-0.014326-0.007163-0.022513-0.01535-0.408299-0.387833-0.778736-0.829901-1.197268-1.208525l-0.107447 0.125867c-4.333702-3.777023-9.931187-6.145977-16.133446-6.145977-13.635555 0-24.684192 11.06194-24.684192 24.689309 0 7.18054 3.120061 13.580297 8.011464 18.098193l-0.193405 0.206708c8.085142 7.462972 13.230326 18.056238 13.230326 29.91738 0 12.266371-5.52483 23.149233-14.093996 30.628578l0.116657 0.11768 0.014326 0.01842c-4.374634 4.455475-7.084349 10.539031-7.084349 17.272385 0 13.623275 11.048637 24.678052 24.684192 24.678052 6.034437 0 11.489682-2.25025 15.773242-5.849218l0.337691 0.152473c18.297738-16.554024 29.863145-40.403199 29.863145-67.01837C423.357636 488.273622 412.327418 465.027176 394.845255 448.536596zM489.866399 356.39299c-5.175883-6.689353-13.190417-11.06194-22.297842-11.06194-15.625886 0-28.297486 12.661368-28.297486 28.29544 0 8.154727 3.496637 15.445784 9.009188 20.603247l-0.12996 0.14224c30.970362 31.601742 50.118468 74.822103 50.118468 122.559337 0 46.477544-18.229177 88.620363-47.76998 119.977535 0.067538 0.080841 0.140193 0.159636 0.207731 0.251733-5.856381 5.183046-9.622148 12.662391-9.622148 21.10569 0 15.635095 12.673647 28.296463 28.297486 28.296463 8.936533 0 16.812921-4.229325 22.001083-10.701736 39.193651-41.473577 63.283302-97.357352 63.283302-158.930709C554.665217 454.56694 529.959535 398.027226 489.866399 356.39299z" fill="#000000" p-id="5562" stroke="#000000" stroke-width="15"></path></svg>
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 附件选择器组件
|
|
3
|
+
* 支持相册、拍摄、文件选择
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
Component({
|
|
7
|
+
properties: {
|
|
8
|
+
// 是否显示
|
|
9
|
+
visible: {
|
|
10
|
+
type: Boolean,
|
|
11
|
+
value: false
|
|
12
|
+
},
|
|
13
|
+
// 最大选择数量
|
|
14
|
+
maxCount: {
|
|
15
|
+
type: Number,
|
|
16
|
+
value: 9
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
methods: {
|
|
21
|
+
/**
|
|
22
|
+
* 从相册选择
|
|
23
|
+
*/
|
|
24
|
+
chooseFromAlbum() {
|
|
25
|
+
wx.chooseMedia({
|
|
26
|
+
count: this.properties.maxCount,
|
|
27
|
+
mediaType: ['image'],
|
|
28
|
+
sourceType: ['album'],
|
|
29
|
+
success: (res) => {
|
|
30
|
+
const files = res.tempFiles.map((file, index) => ({
|
|
31
|
+
path: file.tempFilePath,
|
|
32
|
+
size: file.size,
|
|
33
|
+
type: 'image',
|
|
34
|
+
name: this.generateImageName(file.tempFilePath, index)
|
|
35
|
+
}));
|
|
36
|
+
this.triggerEvent('select', { type: 'image', files });
|
|
37
|
+
this.onClose();
|
|
38
|
+
},
|
|
39
|
+
fail: (err) => {
|
|
40
|
+
console.error('chooseFromAlbum fail:', err);
|
|
41
|
+
if (err.errMsg && err.errMsg.indexOf('cancel') === -1) {
|
|
42
|
+
wx.showToast({
|
|
43
|
+
title: '选择失败',
|
|
44
|
+
icon: 'none'
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 拍摄照片
|
|
53
|
+
*/
|
|
54
|
+
takePhoto() {
|
|
55
|
+
wx.chooseMedia({
|
|
56
|
+
count: 1,
|
|
57
|
+
mediaType: ['image'],
|
|
58
|
+
sourceType: ['camera'],
|
|
59
|
+
success: (res) => {
|
|
60
|
+
const files = res.tempFiles.map((file, index) => ({
|
|
61
|
+
path: file.tempFilePath,
|
|
62
|
+
size: file.size,
|
|
63
|
+
type: 'image',
|
|
64
|
+
name: this.generateImageName(file.tempFilePath, index, 'photo')
|
|
65
|
+
}));
|
|
66
|
+
this.triggerEvent('select', { type: 'image', files });
|
|
67
|
+
this.onClose();
|
|
68
|
+
},
|
|
69
|
+
fail: (err) => {
|
|
70
|
+
console.error('takePhoto fail:', err);
|
|
71
|
+
if (err.errMsg && err.errMsg.indexOf('cancel') === -1) {
|
|
72
|
+
wx.showToast({
|
|
73
|
+
title: '拍摄失败',
|
|
74
|
+
icon: 'none'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 选择文件
|
|
83
|
+
*/
|
|
84
|
+
chooseFile() {
|
|
85
|
+
wx.chooseMessageFile({
|
|
86
|
+
count: this.properties.maxCount,
|
|
87
|
+
type: 'file',
|
|
88
|
+
extension: ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'md'],
|
|
89
|
+
success: (res) => {
|
|
90
|
+
const files = res.tempFiles.map(file => ({
|
|
91
|
+
path: file.path,
|
|
92
|
+
size: file.size,
|
|
93
|
+
type: 'file',
|
|
94
|
+
name: file.name
|
|
95
|
+
}));
|
|
96
|
+
this.triggerEvent('select', { type: 'file', files });
|
|
97
|
+
this.onClose();
|
|
98
|
+
},
|
|
99
|
+
fail: (err) => {
|
|
100
|
+
console.error('chooseFile fail:', err);
|
|
101
|
+
if (err.errMsg && err.errMsg.indexOf('cancel') === -1) {
|
|
102
|
+
wx.showToast({
|
|
103
|
+
title: '选择失败',
|
|
104
|
+
icon: 'none'
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 获取文件名
|
|
113
|
+
*/
|
|
114
|
+
getFileName(path) {
|
|
115
|
+
const parts = path.split('/');
|
|
116
|
+
return parts[parts.length - 1];
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 生成图片文件名
|
|
121
|
+
* 微信 chooseMedia API 不返回原始文件名,只能生成一个有意义的名称
|
|
122
|
+
* @param {string} path - 临时文件路径
|
|
123
|
+
* @param {number} index - 索引(多选时用于区分)
|
|
124
|
+
* @param {string} prefix - 前缀,默认为 'image',拍照时为 'photo'
|
|
125
|
+
*/
|
|
126
|
+
generateImageName(path, index = 0, prefix = 'image') {
|
|
127
|
+
// 获取文件扩展名
|
|
128
|
+
const ext = this.getFileExtension(path) || 'jpg';
|
|
129
|
+
// 生成时间戳格式的文件名:image_20250120_143052_0.jpg
|
|
130
|
+
const now = new Date();
|
|
131
|
+
const dateStr = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}`;
|
|
132
|
+
const timeStr = `${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`;
|
|
133
|
+
return `${prefix}_${dateStr}_${timeStr}_${index}.${ext}`;
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 获取文件扩展名
|
|
138
|
+
*/
|
|
139
|
+
getFileExtension(path) {
|
|
140
|
+
const fileName = this.getFileName(path);
|
|
141
|
+
const lastDot = fileName.lastIndexOf('.');
|
|
142
|
+
if (lastDot > 0) {
|
|
143
|
+
return fileName.substring(lastDot + 1).toLowerCase();
|
|
144
|
+
}
|
|
145
|
+
return '';
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 关闭选择器
|
|
150
|
+
*/
|
|
151
|
+
onClose() {
|
|
152
|
+
this.triggerEvent('close');
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 点击遮罩关闭
|
|
157
|
+
*/
|
|
158
|
+
onMaskTap() {
|
|
159
|
+
this.onClose();
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* 阻止冒泡
|
|
164
|
+
*/
|
|
165
|
+
preventBubble() {
|
|
166
|
+
// 阻止事件冒泡
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<view class="attachment-picker-mask {{visible ? 'show' : ''}}" bindtap="onMaskTap">
|
|
2
|
+
<view class="attachment-picker-container {{visible ? 'show' : ''}}" catchtap="preventBubble">
|
|
3
|
+
<view class="picker-header">
|
|
4
|
+
<text class="picker-title">选择附件</text>
|
|
5
|
+
<view class="picker-close" bindtap="onClose">
|
|
6
|
+
<text>×</text>
|
|
7
|
+
</view>
|
|
8
|
+
</view>
|
|
9
|
+
|
|
10
|
+
<view class="picker-options">
|
|
11
|
+
<!-- 相册选择 -->
|
|
12
|
+
<view class="picker-option" bindtap="chooseFromAlbum">
|
|
13
|
+
<view class="option-icon">
|
|
14
|
+
<image src="/miniprogram_npm/@flexem/chat-box/assets/icons/icon-image.svg" mode="aspectFit" class="icon-image" />
|
|
15
|
+
</view>
|
|
16
|
+
<text class="option-text">图片</text>
|
|
17
|
+
</view>
|
|
18
|
+
|
|
19
|
+
<!-- 拍摄 -->
|
|
20
|
+
<view class="picker-option" bindtap="takePhoto">
|
|
21
|
+
<view class="option-icon">
|
|
22
|
+
<image src="/miniprogram_npm/@flexem/chat-box/assets/icons/icon-camera.svg" mode="aspectFit" class="icon-image" />
|
|
23
|
+
</view>
|
|
24
|
+
<text class="option-text">拍摄</text>
|
|
25
|
+
</view>
|
|
26
|
+
|
|
27
|
+
<!-- 文件 -->
|
|
28
|
+
<view class="picker-option" bindtap="chooseFile">
|
|
29
|
+
<view class="option-icon">
|
|
30
|
+
<image src="/miniprogram_npm/@flexem/chat-box/assets/icons/icon-file.svg" mode="aspectFit" class="icon-image" />
|
|
31
|
+
</view>
|
|
32
|
+
<text class="option-text">文件</text>
|
|
33
|
+
</view>
|
|
34
|
+
</view>
|
|
35
|
+
|
|
36
|
+
<view class="picker-cancel" bindtap="onClose">
|
|
37
|
+
<text>取消</text>
|
|
38
|
+
</view>
|
|
39
|
+
</view>
|
|
40
|
+
</view>
|