zhibo/Zhibo/zhibo-h/群组聊天模块快速参考.md

485 lines
12 KiB
Markdown
Raw Normal View History

# 群组聊天模块快速参考
> **模块**: 模块11 - 群组聊天模块
> **状态**: ✅ 已完成
> **更新时间**: 2024年12月26日
---
## 📋 核心功能
### 群组管理
- ✅ 创建群组
- ✅ 更新群组信息
- ✅ 解散群组(逻辑删除)
- ✅ 获取群组列表
- ✅ 获取群组详情
- ✅ 更新群公告
- ✅ 设置全员禁言
### 成员管理
- ✅ 邀请成员加入
- ✅ 移除成员(逻辑删除)
- ✅ 退出群组(逻辑删除)
- ✅ 获取成员列表
- ✅ 设置管理员
- ✅ 禁言/取消禁言成员
- ✅ 更新群昵称
### 消息管理
- ✅ 发送群组消息
- ✅ 获取消息列表
- ✅ 撤回消息2分钟内
- ✅ 删除消息(逻辑删除)
-@提醒功能
---
## 🔑 API接口
### 群组管理接口
```http
# 创建群组
POST /api/front/groups/create
Content-Type: application/json
Authorization: Bearer {token}
{
"groupName": "我的群组",
"avatar": "https://example.com/avatar.jpg",
"description": "群组描述"
}
# 更新群组信息
PUT /api/front/groups/{groupId}
Content-Type: application/json
Authorization: Bearer {token}
{
"groupName": "新群组名称",
"avatar": "https://example.com/new-avatar.jpg",
"description": "新描述",
"announcement": "群公告"
}
# 解散群组(逻辑删除)
DELETE /api/front/groups/{groupId}
Authorization: Bearer {token}
# 获取用户的群组列表
GET /api/front/groups/list
Authorization: Bearer {token}
# 获取群组详情
GET /api/front/groups/{groupId}
Authorization: Bearer {token}
# 更新群公告
PUT /api/front/groups/{groupId}/announcement
Content-Type: application/json
Authorization: Bearer {token}
{
"announcement": "新的群公告内容"
}
# 设置全员禁言
PUT /api/front/groups/{groupId}/mute-all
Content-Type: application/json
Authorization: Bearer {token}
{
"muteAll": true
}
```
### 成员管理接口
```http
# 邀请成员加入群组
POST /api/front/groups/{groupId}/members/invite
Content-Type: application/json
Authorization: Bearer {token}
{
"userIds": [1001, 1002, 1003]
}
# 移除群成员(逻辑删除)
DELETE /api/front/groups/{groupId}/members/{userId}
Authorization: Bearer {token}
# 退出群组(逻辑删除)
POST /api/front/groups/{groupId}/quit
Authorization: Bearer {token}
# 获取群成员列表
GET /api/front/groups/{groupId}/members
Authorization: Bearer {token}
# 设置管理员
PUT /api/front/groups/{groupId}/members/{userId}/admin
Content-Type: application/json
Authorization: Bearer {token}
{
"isAdmin": true
}
# 禁言成员
PUT /api/front/groups/{groupId}/members/{userId}/mute
Content-Type: application/json
Authorization: Bearer {token}
{
"muteEndTime": 1703606400000
}
# 取消禁言
PUT /api/front/groups/{groupId}/members/{userId}/unmute
Authorization: Bearer {token}
# 更新群昵称
PUT /api/front/groups/{groupId}/members/nickname
Content-Type: application/json
Authorization: Bearer {token}
{
"nickname": "我的群昵称"
}
```
### 消息管理接口
```http
# 发送群组消息
POST /api/front/groups/{groupId}/messages
Content-Type: application/json
Authorization: Bearer {token}
{
"messageType": "text",
"content": "消息内容",
"mediaUrl": "",
"atUserIds": [1001, 1002],
"atAll": false
}
# 获取群组消息列表
GET /api/front/groups/{groupId}/messages?page=1&pageSize=20
Authorization: Bearer {token}
# 撤回群组消息
POST /api/front/groups/messages/{messageId}/recall
Authorization: Bearer {token}
# 删除群组消息(逻辑删除)
DELETE /api/front/groups/messages/{messageId}
Authorization: Bearer {token}
```
---
## 🗄️ 数据库表结构
### eb_group群组表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 群组ID主键 |
| group_name | VARCHAR(50) | 群组名称 |
| avatar | VARCHAR(255) | 群组头像 |
| owner_id | INT | 群主ID |
| announcement | VARCHAR(500) | 群公告 |
| description | VARCHAR(200) | 群组描述 |
| max_members | INT | 最大成员数默认200 |
| member_count | INT | 当前成员数 |
| allow_member_invite | TINYINT(1) | 是否允许成员邀请 |
| mute_all | TINYINT(1) | 是否全员禁言 |
| is_deleted | TINYINT(1) | 是否删除(逻辑删除) |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
| ext_field1 | VARCHAR(50) | 扩展字段1群组分类 |
| ext_field2 | VARCHAR(200) | 扩展字段2群组标签 |
| ext_field3 | INT | 扩展字段3群组等级 |
| ext_field4 | BIGINT | 扩展字段4关联数据ID |
| ext_field5 | TEXT | 扩展字段5JSON扩展数据 |
### eb_group_member群成员表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 成员ID主键 |
| group_id | BIGINT | 群组ID |
| user_id | INT | 用户ID |
| nickname | VARCHAR(50) | 群昵称 |
| role | TINYINT | 成员角色0-普通 1-管理员 2-群主) |
| is_muted | TINYINT(1) | 是否禁言 |
| mute_end_time | DATETIME | 禁言到期时间 |
| unread_count | INT | 未读消息数 |
| is_silent | TINYINT(1) | 是否静音 |
| is_deleted | TINYINT(1) | 是否删除(逻辑删除) |
| join_time | DATETIME | 加入时间 |
| update_time | DATETIME | 更新时间 |
| ext_field1 | VARCHAR(100) | 扩展字段1成员标签 |
| ext_field2 | INT | 扩展字段2成员等级 |
| ext_field3 | VARCHAR(200) | 扩展字段3自定义备注 |
| ext_field4 | BIGINT | 扩展字段4关联数据ID |
| ext_field5 | TEXT | 扩展字段5JSON扩展数据 |
### eb_group_message群消息表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 消息ID主键 |
| group_id | BIGINT | 群组ID |
| sender_id | INT | 发送者ID |
| message_type | VARCHAR(20) | 消息类型 |
| content | VARCHAR(2000) | 消息内容 |
| media_url | VARCHAR(500) | 媒体URL |
| at_user_ids | VARCHAR(500) | @的用户ID列表 |
| at_all | TINYINT(1) | 是否@全体成员 |
| is_recalled | TINYINT(1) | 是否已撤回 |
| recall_time | DATETIME | 撤回时间 |
| is_deleted | TINYINT(1) | 是否删除(逻辑删除) |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
| ext_field1 | VARCHAR(50) | 扩展字段1消息来源 |
| ext_field2 | BIGINT | 扩展字段2引用消息ID |
| ext_field3 | VARCHAR(100) | 扩展字段3消息标签 |
| ext_field4 | BIGINT | 扩展字段4附件大小 |
| ext_field5 | TEXT | 扩展字段5JSON扩展数据 |
---
## 🔐 权限说明
### 成员角色
- **群主role=2**:拥有所有权限
- **管理员role=1**:可以管理成员、禁言、修改群公告
- **普通成员role=0**:可以发送消息、邀请成员
### 权限矩阵
| 操作 | 群主 | 管理员 | 普通成员 |
|------|------|--------|---------|
| 创建群组 | ✅ | ✅ | ✅ |
| 更新群组信息 | ✅ | ✅ | ❌ |
| 解散群组 | ✅ | ❌ | ❌ |
| 更新群公告 | ✅ | ✅ | ❌ |
| 设置全员禁言 | ✅ | ✅ | ❌ |
| 邀请成员 | ✅ | ✅ | ✅ |
| 移除成员 | ✅ | ✅ | ❌ |
| 退出群组 | ❌ | ✅ | ✅ |
| 设置管理员 | ✅ | ❌ | ❌ |
| 禁言成员 | ✅ | ✅ | ❌ |
| 发送消息 | ✅ | ✅ | ✅ |
| 撤回消息 | ✅ | ✅ | ✅(仅自己) |
---
## 💡 使用示例
### 创建群组并邀请成员
```javascript
// 1. 创建群组
const createGroupResponse = await fetch('/api/front/groups/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
groupName: '技术交流群',
avatar: 'https://example.com/group-avatar.jpg',
description: '讨论技术问题的群组'
})
});
const group = await createGroupResponse.json();
const groupId = group.data.id;
// 2. 邀请成员
await fetch(`/api/front/groups/${groupId}/members/invite`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
userIds: [1001, 1002, 1003]
})
});
```
### 发送群组消息
```javascript
// 发送文本消息
await fetch(`/api/front/groups/${groupId}/messages`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
messageType: 'text',
content: '大家好!',
atUserIds: [],
atAll: false
})
});
// 发送@消息
await fetch(`/api/front/groups/${groupId}/messages`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
messageType: 'text',
content: '@张三 @李四 请查看这个问题',
atUserIds: [1001, 1002],
atAll: false
})
});
// 发送@全体成员消息
await fetch(`/api/front/groups/${groupId}/messages`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
messageType: 'text',
content: '@全体成员 重要通知!',
atUserIds: [],
atAll: true
})
});
```
### 管理员操作
```javascript
// 设置管理员
await fetch(`/api/front/groups/${groupId}/members/${userId}/admin`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
isAdmin: true
})
});
// 禁言成员禁言1小时
const muteEndTime = Date.now() + 3600000;
await fetch(`/api/front/groups/${groupId}/members/${userId}/mute`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
muteEndTime: muteEndTime
})
});
// 设置全员禁言
await fetch(`/api/front/groups/${groupId}/mute-all`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
muteAll: true
})
});
```
---
## ⚠️ 注意事项
### 登录验证
- 所有接口都需要登录后才能访问
- 未登录会返回401 UNAUTHORIZED错误
- Token通过Authorization头传递
### 权限验证
- 权限验证在Service层进行
- 权限不足会抛出异常并返回错误信息
- 群主不能退出群组(需要先转让群主)
### 逻辑删除
- 解散群组、移除成员、退出群组、删除消息都使用逻辑删除
- 逻辑删除的数据不会真正从数据库中删除
- 可以通过is_deleted字段查询已删除的数据
### 消息撤回
- 只能撤回2分钟内的消息
- 只能撤回自己发送的消息
- 撤回后消息不会被删除,只是标记为已撤回
### 扩展字段
- 预留了5个扩展字段ext_field1-5
- 可以根据业务需求自定义使用
- 建议使用JSON格式存储复杂数据
---
## 🔧 技术实现
### JPA自动建表
```java
@Entity
@Table(name = "eb_group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@TableLogic
private Boolean isDeleted;
@UpdateTimestamp
private Date updateTime;
}
```
### 逻辑删除
```java
// MyBatis-Plus会自动处理逻辑删除
groupDao.deleteById(groupId); // 实际执行UPDATE eb_group SET is_deleted=1 WHERE id=?
```
### 自动时间管理
```java
@CreationTimestamp // 创建时自动设置
private Date createTime;
@UpdateTimestamp // 更新时自动设置
private Date updateTime;
```
---
## 📚 相关文档
- [直播IM系统开发指南.md](./直播IM系统开发指南.md) - 完整的开发指南
- [群组聊天模块登录验证完善总结.md](./群组聊天模块登录验证完善总结.md) - 详细的完善总结
- [群组聊天和消息撤回模块完成总结.md](./群组聊天和消息撤回模块完成总结.md) - 模块完成总结
---
**最后更新**: 2024年12月26日
**模块状态**: ✅ 已完成
**代码质量**: ✅ 优秀