287 lines
6.8 KiB
Markdown
287 lines
6.8 KiB
Markdown
# 在线状态模块
|
||
|
||
## 模块概述
|
||
在线状态模块负责管理和查询用户的在线状态,包括单个用户在线状态、批量查询、房间在线人数统计等功能。
|
||
|
||
## 相关文件
|
||
- `RoomDetailActivity.java` - 直播间详情(显示在线人数)
|
||
- `ConversationsAdapter.java` - 会话列表(显示好友在线状态)
|
||
- `FriendsAdapter.java` - 好友列表(显示在线状态)
|
||
|
||
---
|
||
|
||
## 接口列表
|
||
|
||
### 1. 查询用户在线状态
|
||
**接口地址**: `GET /api/front/online/status/{userId}`
|
||
|
||
**路径参数**:
|
||
```
|
||
userId: integer // 用户ID
|
||
```
|
||
|
||
**请求参数**: 无
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": {
|
||
"userId": "integer", // 用户ID
|
||
"isOnline": "boolean", // 是否在线
|
||
"lastOnlineTime": "long", // 最后在线时间戳
|
||
"status": "string" // 状态: online/offline/busy
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 批量查询用户在线状态
|
||
**接口地址**: `POST /api/front/online/status/batch`
|
||
|
||
**请求参数**:
|
||
```json
|
||
[1, 2, 3, 4, 5] // 用户ID数组
|
||
```
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": {
|
||
"1": {
|
||
"userId": 1,
|
||
"isOnline": true,
|
||
"lastOnlineTime": 1703001234567,
|
||
"status": "online"
|
||
},
|
||
"2": {
|
||
"userId": 2,
|
||
"isOnline": false,
|
||
"lastOnlineTime": 1703000000000,
|
||
"status": "offline"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 获取房间在线人数
|
||
**接口地址**: `GET /api/front/online/room/{roomId}/count`
|
||
|
||
**路径参数**:
|
||
```
|
||
roomId: string // 房间ID
|
||
```
|
||
|
||
**请求参数**: 无
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": {
|
||
"roomId": "string", // 房间ID
|
||
"onlineCount": "integer" // 在线人数
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 4. 获取房间在线用户列表
|
||
**接口地址**: `GET /api/front/online/room/{roomId}/users`
|
||
|
||
**路径参数**:
|
||
```
|
||
roomId: string // 房间ID
|
||
```
|
||
|
||
**请求参数**: 无
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": {
|
||
"roomId": "string",
|
||
"onlineCount": "integer",
|
||
"users": [
|
||
{
|
||
"userId": "integer",
|
||
"nickname": "string",
|
||
"avatar": "string",
|
||
"joinTime": "long" // 进入房间时间
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 5. 获取连接统计信息
|
||
**接口地址**: `GET /api/front/online/stats`
|
||
|
||
**请求参数**: 无
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": {
|
||
"totalOnlineUsers": "integer", // 总在线用户数
|
||
"totalConnections": "integer", // 总连接数
|
||
"totalRooms": "integer", // 总房间数
|
||
"activeRooms": "integer", // 活跃房间数
|
||
"serverTime": "long" // 服务器时间戳
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 功能说明
|
||
|
||
### 在线状态类型
|
||
|
||
| 状态 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| 在线 | online | 用户当前在线 |
|
||
| 离线 | offline | 用户已离线 |
|
||
| 忙碌 | busy | 用户在线但忙碌 |
|
||
|
||
### 状态更新机制
|
||
- 用户登录时自动设置为在线
|
||
- 用户退出登录时设置为离线
|
||
- WebSocket连接断开时设置为离线
|
||
- 心跳检测维持在线状态
|
||
|
||
### 房间在线统计
|
||
- 实时统计房间内的在线用户数
|
||
- 通过WebSocket实时推送在线人数变化
|
||
- 支持查询房间内的在线用户列表
|
||
|
||
---
|
||
|
||
## 使用场景
|
||
|
||
### 1. 好友列表显示在线状态
|
||
```java
|
||
// 获取好友列表后,批量查询在线状态
|
||
List<Integer> friendIds = new ArrayList<>();
|
||
for (Friend friend : friends) {
|
||
friendIds.add(friend.getUserId());
|
||
}
|
||
|
||
ApiService apiService = ApiClient.getService(context);
|
||
Call<ApiResponse<Map<String, Object>>> call =
|
||
apiService.checkUsersOnline(friendIds);
|
||
|
||
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
|
||
@Override
|
||
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
|
||
Response<ApiResponse<Map<String, Object>>> response) {
|
||
if (response.isSuccessful() && response.body() != null) {
|
||
Map<String, Object> statusMap = response.body().getData();
|
||
// 更新好友列表的在线状态
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
|
||
// 处理错误
|
||
}
|
||
});
|
||
```
|
||
|
||
### 2. 直播间显示在线人数
|
||
```java
|
||
// 进入直播间后获取在线人数
|
||
ApiService apiService = ApiClient.getService(context);
|
||
Call<ApiResponse<Map<String, Object>>> call =
|
||
apiService.getRoomOnlineCount(roomId);
|
||
|
||
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
|
||
@Override
|
||
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
|
||
Response<ApiResponse<Map<String, Object>>> response) {
|
||
if (response.isSuccessful() && response.body() != null) {
|
||
Map<String, Object> data = response.body().getData();
|
||
int onlineCount = (int) data.get("onlineCount");
|
||
// 更新UI显示在线人数
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
|
||
// 处理错误
|
||
}
|
||
});
|
||
|
||
// 同时通过WebSocket监听在线人数变化
|
||
// 参考 WebSocket通信模块文档
|
||
```
|
||
|
||
### 3. 会话列表显示对方在线状态
|
||
```java
|
||
// 获取会话列表后,查询对方在线状态
|
||
for (Conversation conversation : conversations) {
|
||
int otherUserId = conversation.getOtherUserId();
|
||
|
||
ApiService apiService = ApiClient.getService(context);
|
||
Call<ApiResponse<Map<String, Object>>> call =
|
||
apiService.checkUserOnline(otherUserId);
|
||
|
||
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
|
||
@Override
|
||
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
|
||
Response<ApiResponse<Map<String, Object>>> response) {
|
||
if (response.isSuccessful() && response.body() != null) {
|
||
Map<String, Object> data = response.body().getData();
|
||
boolean isOnline = (boolean) data.get("isOnline");
|
||
// 更新会话列表的在线状态
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
|
||
// 处理错误
|
||
}
|
||
});
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## WebSocket实时推送
|
||
|
||
在线状态变化可以通过WebSocket实时推送,详见 [WebSocket通信模块](./04-WebSocket通信模块.md)。
|
||
|
||
**推送消息格式**:
|
||
```json
|
||
{
|
||
"type": "online_status",
|
||
"userId": 123,
|
||
"isOnline": true,
|
||
"status": "online"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
1. 批量查询建议一次不超过100个用户ID
|
||
2. 在线状态有缓存,可能存在几秒延迟
|
||
3. 建议配合WebSocket实现实时状态更新
|
||
4. 房间在线人数通过WebSocket实时推送更准确
|
||
5. 离线时间超过5分钟的用户会显示最后在线时间
|
||
6. 频繁查询在线状态可能影响性能,建议合理控制查询频率
|