chequite / chat
离心式聊天包
Requires
- laravel/framework: ^10.0
- laravel/passport: ^11.0.0
- lcobucci/jwt: ^5.0.0
This package is not auto-updated.
Last update: 2024-09-30 17:30:39 UTC
README
目录
- 简介
- 依赖关系
- 安装
- 配置
- 重要事项
- API 方法
- Websockets
- 事件和监听器用于定制和改进服务器部分
1. 简介
用于在 Laravel 项目中快速安装聊天的包。
2. 依赖关系
laravel/framework: ^10.0
laravel/passport: ^11.0.0
lcobucci/jwt: ^5.0.0
3. 安装
composer require chequite/chat
4. 配置
首先需要部署 centrifugo。通过 Docker 部署非常方便。
-
拉取 centrifugo 镜像:
docker pull centrifugo/centrifugo
-
创建配置文件的目录
mkdir /var/centrifugo
-
创建配置文件
nano /var/centrifugo/config.json
-
在文件中记录设置。默认情况下,配置将如下所示: {
"allow_subscribe_for_client": true,
"api_key": "5af3d597bd452745a937c0ffda270fab060419e27s93f61d4f48e3409015df9ece",
"token_hmac_secret_key": "8b1482f10d8d47ac838549c8eac07edf3077a00ac6f6886fd5434f896c401cfb8e",
"admin": true,
"admin_password": "MoskowCityB@c9",
"admin_secret": "3fb95b5b93dad7269b7275c525726e86f47e123f1df1158770bfdc27a2fbab1e",
"allowed_origins": ["https://"]
}
allow_subscribe_for_client - 允许客户端订阅频道
api_key - 用于 API 请求的密钥,请生成一个随机字符串并插入此处
token_hmac_secret_key - 用于应用程序的秘密密钥,也生成一个随机字符串
admin - 启用管理面板以进行调试和跟踪离心式的工作
admin_password - 管理面板的密码
admin_secret - 以管理员身份请求的密钥
allowed_origins - 允许的域名。必须指定将发送请求的所有域名。如果没有指定,则将收到 403 错误。 -
启动容器
docker run -v /var/centrifugo/config.json:/centrifugo/config.json -p 8000:8000 centrifugo/centrifugo centrifugo -c config.json
-
安装包和启动离心式后,需要在 .env 文件中添加密钥
CENTRIFUGO_URL - 您的 centrifugo 服务器的 URL (示例 http://3.22.83.190:8000,可能是一个命名的域名)
CENTRIFUGO_API_KEY - 在 centrifugo 服务器配置中指定的 api key (示例 5af3d5s97bd452745a937c0fda270fab060419e2793af61d4f48e3409015df)
CENTRIFUGO_SECRET= 您在 centrifugo 服务器配置中指定的秘密密钥 (示例 8b1a482f10d8d47ac83s8549c8e07edf3077a00ac6f6886fd5434f896c401cf)
-
安装包后运行包的迁移:
php artisan migrate
-
为 storage 目录创建符号链接:
php artisan storage:link
官方文档: https://centrifugal.dev/
5. 重要事项
1. 在注册和登录时,需要在服务器上生成令牌并将其返回给客户端。
JwtService::generateJwt($user->id)
- 生成所需的令牌
2. 消息默认设置为已读
- 当用户打开聊天时
- 当用户发送消息时
在打开对话时如何读取消息需要在客户端思考,下面有端点
3. 离心式令牌存活一小时。必须在此间隔内更新它。我在每次页面重新加载时更新它,因为我不太擅长客户端部分
6. API 方法
1. 获取当前用户信息
- 端点:
/api/get-user-info
- 方法:
GET
示例响应
{ "id": 1, "avatar": "https://your-domain.ru/path/to/file", "name": "Петр Петров" }
响应字段说明
2. 获取聊天列表
- 端点:
/api/chats
- 方法:
GET
描述
获取当前用户的聊天列表
示例响应
{ "id": 137, "companion_name": "Михаил Михайлов", "avatar": "https://your-domain.ru/path/to/file", "last_message": { "text": "Текст сообщения", "timestamp": "15:33", "sender_id": 9, "sender_name": "Сергей Сергеев", "was_read": true } }
响应字段说明
3. 创建聊天
- 端点:
/api/chats
- 方法:
POST
描述
为当前用户与选定的用户创建聊天
必填参数
示例响应
{ "chatId": 138 }
响应字段说明
3. 获取聊天消息
- 端点:
/api/chats/{chatId}/messages
- 方法:
GET
URL参数
示例响应
{ "chatId": 138, "messages": { { "text": "Привет", "was_read": true, "timestamp": "16:53", "user": { "id": 3, "email": "user@gmail.com", "avatar": "https://your-domain.ru/path/to/file", "is_online": false, "name": "Алексей Алексеев", "last_seen_at": "24.01.2024 15:30" }, } }, "companion": { "id": 3, "email": "user@gmail.com", "avatar": "https://your-domain.ru/path/to/file", "is_online": false, "name": "Алексей Алексеев", "last_seen_at": "24.01.2024 15:30", } }
响应字段说明
4. 发送消息
- 端点:
/api/chats/{chatId}/messages
- 方法:
POST
URL参数
示例响应
{ "text": "Hello world!", "user": { "id": 5, "email": "email@gmail.com", "avatar": "https://your-domain.ru/path/to/file", "is_online": false, "name": "Александр Александров", "last_seen_at": "25.01.2024 10:15" }, "was_read": true, "timestamp": "11:30" }
响应字段说明
5. 通知用户正在输入
- 端点:
/api/typing
- 方法:
POST
必填参数
示例响应
{ }
响应参数
空对象
6. 搜索用户
- 端点:
/api/search-users
- 方法:
GET
必填GET参数
示例响应
{ { "id": 3, "email": "email@gmail.com", "avatar": "https://your-domain.ru/path/to/file", "is_online": false, "name": "Филип Филипов", "last_seen_at": "24.01.2024 19:17" }, { "id": 157, "email": "email2@gmail.com", "avatar": "https://your-domain.ru/path/to/file", "is_online": true, "name": "Филип Сергеев", "last_seen_at": null } }
响应字段说明
7. 更新Centrifugo令牌
- 端点:
/api/update-centrifugo-token
- 方法:
GET
示例响应
{ "centrifugo_token": "ass2jajdwk2kasdkaskgkbkbggb5ib5o412kf2occe3" }
8. 通知用户已阅读消息
- 端点:
/api/chats/{chatId}/messages/{messageId}
- 方法:
POST
描述
该请求用于当用户在聊天中收到消息时,向服务器报告已阅读
URL参数
示例响应
{ }
响应参数
空对象
7. WebSockets
我在客户端使用Centrifuge包处理WebSockets: https://github.com/centrifugal/centrifuge-js。根据文档很容易理解。唯一需要注意的是,在订阅频道时需要传递Centrifuge令牌。
1. 监听聊天列表更新
- 频道名称:
user-{userId}-chats
传入频道的数据
2. 监听聊天消息更新
- 频道名称:
user-{chatId}-messages
传入频道的数据
3. 监听对方在线/离线状态更新
- 频道名称:
user-{userId}-status
传入频道的数据
4. 监听消息输入事件
- 频道名称:
chat.{chatId}
传入频道的数据
5. 客户端如何订阅聊天消息更新示例
const sub = this.centrifuge.newSubscription(`user-${chatId}-messages`); sub.on('publication', (response) => { this.currentChat.messages.push(JSON.parse(response.data)) this.scrollToBottom(); }); sub.subscribe()
8. 事件和监听器用于自定义和改进服务器部分
-
聊天更新事件 Dd1\Chat\Events\ChatsUpdated
-
发送消息/更新当前聊天事件 Dd1\Chat\Events\MessageSent
-
输入事件 Dd1\Chat\Events\TypingEvent
-
在线/离线状态更新事件 Dd1\Chat\Events\UserStatusUpdatedEvent