# 项目文档 ## 1. 技术框架 (Technical Framework) 本项目基于 **微信小程序 (WeChat Mini Program)** 平台开发。 * **核心框架**: 微信小程序原生框架 (Native) * **组件框架**: `glass-easel` (在 `app.json` 中配置) * **样式版本**: v2 * **插件**: `WechatSI` (微信同声传译插件,版本 0.3.6) - 用于语音识别。 * **基础库版本**: 3.11.0 ## 2. 环境 (Environment) * **开发工具**: 微信开发者工具 (WeChat DevTools) * **运行环境**: 微信客户端 (iOS/Android/PC) * **API 服务器**: `https://wx-xcx-check.blv-oa.com:4433` * **权限要求**: * `scope.userLocation`: 用于获取用户地理位置 (打卡/显示附近门店)。 * `scope.record`: 用于语音输入功能。 * `scope.speechRecognition`: 用于语音识别。 ## 3. 项目结构 (Project Structure) ```text e:\Sync\WxCheck\CommunicationRecords ├── app.js # 小程序逻辑 ├── app.json # 小程序公共配置 (页面路由、窗口设置、插件声明) ├── app.wxss # 小程序公共样式 ├── project.config.json # 项目配置文件 ├── sitemap.json # 站点地图配置 ├── assets/ # 静态资源目录 ├── images/ # 图片资源目录 ├── pages/ # 页面目录 │ ├── chat/ # 聊天/主功能页面 │ │ ├── chat.js # 页面逻辑 (核心业务) │ │ ├── chat.json # 页面配置 │ │ ├── chat.wxml # 页面结构 │ │ ├── chat.wxss # 页面样式 │ │ └── mock.js # 本地模拟数据 │ └── logs/ # 日志页面 (标准模板) └── utils/ # 工具类目录 ├── authorize.js # 权限申请工具 └── util.js # 通用工具函数 (时间格式化等) ``` ## 4. 功能 (Features) 本项目主要功能为 **"宝来威智能AI"** 对话记录系统,包含以下核心功能: 1. **智能对话/记录**: * 支持 **文本输入**。 * 支持 **语音输入** (按住说话),利用 `WechatSI` 插件实时转换为文本。 2. **消息类型区分**: * 支持发送不同类型的消息 (代码中体现为 `qsendText` 和 `gsendText`,对应 `MessageType` 1 和 2)。 * **Tab 切换**: 可在界面上筛选显示 "全部"、"私有" (Type 1) 或 "全局" (Type 2) 消息。 3. **历史记录**: * 从服务器分页加载历史对话记录。 * **下拉刷新**: 下拉页面加载更早的历史消息。 4. **地理位置**: * 发送消息时自动获取当前地理位置 (GCJ02坐标) 并上传。 5. **本地缓存**: * 使用 `wx.getStorageSync('openid')` 获取用户标识。 ## 5. 用途 (Usage/Purpose) 该项目用于 **宝来威 (BLV)** 内部或客户的沟通记录与检查 (WxCheck)。用户可以通过文字或语音的方式记录信息,系统会自动识别语音内容并上传至服务器,同时记录发送时的地理位置。主要用于工作流中的信息采集、汇报或智能助手交互。 ## 6. 数据结构 (Data Structure) ### 6.1 前端消息对象 (Message Object) 在 `chat.js` 的 `msgList` 中使用的数据格式: ```javascript { id: Number | String, // 消息ID (本地生成或服务器返回) content: String, // 消息内容 date: String, // 日期字符串 (YYYY-MM-DD) time: String, // 完整时间字符串 (YYYY-MM-DD HH:mm) isSelf: Number, // 消息类型标识 (1: 私有/用户, 2: 全局/AI) showDate: Boolean // 是否显示日期分割线 } ``` ### 6.2 API 接口数据 **发送消息 (AddConversation)** * **URL**: `/api/Check/AddConversation` * **Method**: POST * **Request**: ```javascript { UserKey: String, // 用户 OpenID ConversationContent: String,// 内容 SendMethod: String, // 发送方式 ('text' 或 'voice') UserLocation: String, // 坐标 'latitude,longitude' MessageType: Number // 消息类型 (1 或 2) } ``` **获取历史记录 (GetConversationsByPage)** * **URL**: `/api/Check/GetConversationsByPage` * **Method**: POST * **Request**: ```javascript { UserKey: String, Page: Number, PageSize: Number, MessageType: Number // 0 代表全部 } ``` ## 7. 前端结构和操作流程 (Frontend Structure & Flow) ### 7.1 核心页面: `pages/chat/chat` * **初始化 (`onLoad`)**: 1. 调用 `loadHistory()` -> `GetConversations()` 从服务器获取第一页历史数据。 2. 调用 `initRecordManager()` 初始化语音识别插件,绑定 `onStart`, `onRecognize`, `onStop`, `onError` 事件。 3. 调用 `GetmyScrollhight()` 计算滚动区域高度,适配不同屏幕。 * **发送消息流程**: * **文本**: 用户输入 -> 点击发送 -> `qsendText`/`gsendText` -> `pushMsg` (渲染到列表) -> `upload` (调用 `wx.getLocation` 获取位置 -> 调用 `post` 上传服务器)。 * **语音**: 用户按住按钮 (`handleTouchStart`) -> `manager.start` 开始录音 -> 用户松开 (`handleTouchEnd`) -> `manager.stop` 停止录音 -> `onStop` 回调获取识别文本 -> `pushMsg` & `upload`。 * **交互细节**: * **上滑取消**: 在录音过程中,如果手指上滑超过一定距离 (`handleTouchMove`),则触发 "取消发送" 逻辑。 * **Tab 切换**: `tabSelect` 函数根据 `isSelf` 字段过滤 `OriginalmsgList` 中的数据,更新 `msgList` 用于渲染。 * **下拉加载**: 使用 `scroll-view` 的 `refresher-enabled` 特性,触发 `onRefresh` -> `loadData` 加载下一页数据并拼接到列表头部。 ### 7.2 工具类 * **`utils/authorize.js`**: 封装了 `authorizeBatch` 函数,用于批量申请小程序权限 (如录音、位置),采用串行 Promise 链式调用,确保用户依次处理授权请求。