群组聊天模块快速参考
模块: 模块11 - 群组聊天模块
状态: ✅ 已完成
更新时间: 2024年12月26日
📋 核心功能
群组管理
- ✅ 创建群组
- ✅ 更新群组信息
- ✅ 解散群组(逻辑删除)
- ✅ 获取群组列表
- ✅ 获取群组详情
- ✅ 更新群公告
- ✅ 设置全员禁言
成员管理
- ✅ 邀请成员加入
- ✅ 移除成员(逻辑删除)
- ✅ 退出群组(逻辑删除)
- ✅ 获取成员列表
- ✅ 设置管理员
- ✅ 禁言/取消禁言成员
- ✅ 更新群昵称
消息管理
- ✅ 发送群组消息
- ✅ 获取消息列表
- ✅ 撤回消息(2分钟内)
- ✅ 删除消息(逻辑删除)
- ✅ @提醒功能
🔑 API接口
群组管理接口
# 创建群组
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
}
成员管理接口
# 邀请成员加入群组
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": "我的群昵称"
}
消息管理接口
# 发送群组消息
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 |
扩展字段5:JSON扩展数据 |
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 |
扩展字段5:JSON扩展数据 |
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 |
扩展字段5:JSON扩展数据 |
🔐 权限说明
成员角色
- 群主(role=2):拥有所有权限
- 管理员(role=1):可以管理成员、禁言、修改群公告
- 普通成员(role=0):可以发送消息、邀请成员
权限矩阵
| 操作 |
群主 |
管理员 |
普通成员 |
| 创建群组 |
✅ |
✅ |
✅ |
| 更新群组信息 |
✅ |
✅ |
❌ |
| 解散群组 |
✅ |
❌ |
❌ |
| 更新群公告 |
✅ |
✅ |
❌ |
| 设置全员禁言 |
✅ |
✅ |
❌ |
| 邀请成员 |
✅ |
✅ |
✅ |
| 移除成员 |
✅ |
✅ |
❌ |
| 退出群组 |
❌ |
✅ |
✅ |
| 设置管理员 |
✅ |
❌ |
❌ |
| 禁言成员 |
✅ |
✅ |
❌ |
| 发送消息 |
✅ |
✅ |
✅ |
| 撤回消息 |
✅ |
✅ |
✅(仅自己) |
💡 使用示例
创建群组并邀请成员
// 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]
})
});
发送群组消息
// 发送文本消息
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
})
});
管理员操作
// 设置管理员
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自动建表
@Entity
@Table(name = "eb_group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@TableLogic
private Boolean isDeleted;
@UpdateTimestamp
private Date updateTime;
}
逻辑删除
// MyBatis-Plus会自动处理逻辑删除
groupDao.deleteById(groupId); // 实际执行:UPDATE eb_group SET is_deleted=1 WHERE id=?
自动时间管理
@CreationTimestamp // 创建时自动设置
private Date createTime;
@UpdateTimestamp // 更新时自动设置
private Date updateTime;
📚 相关文档
最后更新: 2024年12月26日
模块状态: ✅ 已完成
代码质量: ✅ 优秀