1471 lines
60 KiB
Markdown
1471 lines
60 KiB
Markdown
|
|
# 直播IM系统开发指南
|
|||
|
|
|
|||
|
|
> **版本**: v3.5 | **更新时间**: 2024年12月26日 | **维护状态**: 🟢 活跃开发中
|
|||
|
|
|
|||
|
|
## 📋 目录
|
|||
|
|
|
|||
|
|
- [项目概述](#项目概述)
|
|||
|
|
- [系统架构](#系统架构)
|
|||
|
|
- [核心模块](#核心模块)
|
|||
|
|
- [开发任务清单](#开发任务清单)
|
|||
|
|
- [技术实现要点](#技术实现要点)
|
|||
|
|
- [部署配置](#部署配置)
|
|||
|
|
- [测试要点](#测试要点)
|
|||
|
|
- [常见问题](#常见问题)
|
|||
|
|
- [开发进度](#开发进度)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📖 项目概述
|
|||
|
|
|
|||
|
|
### 目标
|
|||
|
|
|
|||
|
|
搭建一个支持 **1-5万在线用户** 的直播+社交IM系统(单机部署)
|
|||
|
|
|
|||
|
|
### 技术栈
|
|||
|
|
|
|||
|
|
- **后端框架**: Spring Boot
|
|||
|
|
- **实时通信**: WebSocket (Netty)
|
|||
|
|
- **数据库**: MySQL 8.0
|
|||
|
|
- **缓存**: Redis 6.0
|
|||
|
|
- **反向代理**: Nginx
|
|||
|
|
- **开发语言**: Java 8+
|
|||
|
|
|
|||
|
|
### 核心场景
|
|||
|
|
|
|||
|
|
- ✅ 直播间实时弹幕(支持千人直播间)
|
|||
|
|
- ✅ 用户一对一私聊
|
|||
|
|
- ✅ 好友关系管理
|
|||
|
|
- ✅ 礼物打赏(直播间+私聊)
|
|||
|
|
- ✅ 多媒体消息(图片、语音、视频)
|
|||
|
|
- ⚠️ 社交互动通知(部分完成)
|
|||
|
|
|
|||
|
|
### 性能目标(单机)
|
|||
|
|
|
|||
|
|
| 指标 | 目标值 |
|
|||
|
|
|------|--------|
|
|||
|
|
| WebSocket连接数 | 5万+ |
|
|||
|
|
| 消息吞吐量 | 5000条/秒 |
|
|||
|
|
| 接口响应时间 (P99) | <100ms |
|
|||
|
|
| 直播间弹幕延迟 | <200ms |
|
|||
|
|
| 系统可用性 | 99%+ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🏗️ 系统架构
|
|||
|
|
|
|||
|
|
### 整体架构图
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
客户端 (Android/iOS/Web)
|
|||
|
|
↓
|
|||
|
|
Nginx (负载均衡 + WebSocket代理)
|
|||
|
|
↓
|
|||
|
|
Spring Boot应用
|
|||
|
|
├── WebSocket服务 (Netty)
|
|||
|
|
├── HTTP API服务
|
|||
|
|
├── 消息路由服务
|
|||
|
|
└── 业务逻辑服务
|
|||
|
|
↓
|
|||
|
|
数据层
|
|||
|
|
├── MySQL (持久化存储)
|
|||
|
|
├── Redis (缓存 + 在线状态 + 离线消息)
|
|||
|
|
└── 文件存储 (本地/OSS)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧩 核心模块
|
|||
|
|
|
|||
|
|
### 模块1:用户认证模块 ✅
|
|||
|
|
|
|||
|
|
**功能清单**
|
|||
|
|
- ✅ 用户注册/登录
|
|||
|
|
- ✅ JWT Token生成与验证
|
|||
|
|
- ✅ Token刷新机制
|
|||
|
|
- ✅ 用户信息管理
|
|||
|
|
|
|||
|
|
**核心类**
|
|||
|
|
- `LoginController` - 认证接口
|
|||
|
|
- `JwtUtil` - JWT工具类
|
|||
|
|
- `AuthService` - 认证业务逻辑
|
|||
|
|
- `UserService` - 用户管理
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块2:WebSocket连接管理模块 ✅
|
|||
|
|
|
|||
|
|
**功能清单**
|
|||
|
|
- ✅ WebSocket连接建立
|
|||
|
|
- ✅ 用户在线状态管理
|
|||
|
|
- ✅ 心跳检测(30秒间隔)
|
|||
|
|
- ✅ 断线重连处理
|
|||
|
|
- ✅ 连接映射维护(userId → WebSocket Session)
|
|||
|
|
|
|||
|
|
**核心类**
|
|||
|
|
- `WebSocketConfig` - WebSocket配置
|
|||
|
|
- `LiveChatHandler` - 直播间消息处理器
|
|||
|
|
- `PrivateChatHandler` - 私聊消息处理器
|
|||
|
|
- `HeartbeatScheduler` - 心跳检测定时任务
|
|||
|
|
- `OnlineStatusService` - 在线状态服务
|
|||
|
|
|
|||
|
|
**关键流程**
|
|||
|
|
|
|||
|
|
| 事件 | 处理逻辑 |
|
|||
|
|
|------|----------|
|
|||
|
|
| 用户连接 | 保存连接 → 更新Redis在线状态 → 拉取离线消息 |
|
|||
|
|
| 用户断开 | 移除连接 → 更新Redis状态 → 清理直播间在线列表 |
|
|||
|
|
| 心跳超时 | 自动断开连接(90秒超时) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块3:消息路由模块 ✅
|
|||
|
|
|
|||
|
|
**功能清单**
|
|||
|
|
- ✅ 单聊消息路由(点对点)
|
|||
|
|
- ✅ 群聊消息广播(直播间)
|
|||
|
|
- ✅ 消息分发逻辑
|
|||
|
|
- ✅ 离线消息处理
|
|||
|
|
- ✅ 登录验证(WebSocket连接需要Token验证)**2024-12-26新增**
|
|||
|
|
|
|||
|
|
**核心类**
|
|||
|
|
- `MessageRouter` - 消息路由器(内置在Handler中)
|
|||
|
|
- `MessageDispatcher` - 消息分发器(内置在Handler中)
|
|||
|
|
- `LiveChatHandler` - 广播服务
|
|||
|
|
- `OfflineMessageService` - 离线消息服务
|
|||
|
|
- `WebSocketAuthInterceptor` - WebSocket登录验证拦截器 **2024-12-26新增**
|
|||
|
|
|
|||
|
|
**登录验证机制** **2024-12-26新增**
|
|||
|
|
- 所有WebSocket连接都需要提供有效的Token
|
|||
|
|
- Token可以通过查询参数传递:`?token={token}`
|
|||
|
|
- 未登录用户无法建立WebSocket连接
|
|||
|
|
- 连接建立前会验证Token的有效性
|
|||
|
|
- 验证失败会直接拒绝连接
|
|||
|
|
|
|||
|
|
**路由策略**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
单聊消息:
|
|||
|
|
验证用户登录状态 → 查询接收者在线状态
|
|||
|
|
├── 在线 → 通过WebSocket直接推送
|
|||
|
|
└── 离线 → 存入Redis离线消息队列
|
|||
|
|
|
|||
|
|
直播间消息:
|
|||
|
|
验证用户登录状态 → 获取房间所有在线用户(Redis Set)
|
|||
|
|
└── 批量异步推送(线程池处理)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**数据库表结构完善** **2024-12-26新增**
|
|||
|
|
- ✅ LiveChat实体类添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ LiveChat实体类添加更新时间字段(update_time)
|
|||
|
|
- ✅ LiveChat实体类添加消息类型字段(message_type)
|
|||
|
|
- ✅ LiveChat实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ Conversation实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ PrivateMessage实体类添加更新时间和5个扩展字段
|
|||
|
|
- ✅ GroupMessage实体类添加5个扩展字段
|
|||
|
|
- ✅ GroupMember实体类添加5个扩展字段
|
|||
|
|
- ✅ Group实体类添加5个扩展字段
|
|||
|
|
- ✅ 所有实体类使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 所有实体类使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
**扩展字段说明**
|
|||
|
|
- ext_field1: 字符串类型,用于存储标签、分类等信息
|
|||
|
|
- ext_field2: 字符串或整数类型,用于存储备注、等级等信息
|
|||
|
|
- ext_field3: 字符串或整数类型,用于存储优先级、标签等信息
|
|||
|
|
- ext_field4: 长整型,用于存储关联数据ID
|
|||
|
|
- ext_field5: 文本类型,用于存储JSON格式的扩展数据
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块4:消息存储模块 ✅
|
|||
|
|
|
|||
|
|
**功能清单**
|
|||
|
|
- ✅ 消息持久化(MySQL)
|
|||
|
|
- ✅ 消息缓存(Redis,7天TTL)
|
|||
|
|
- ✅ 历史消息查询
|
|||
|
|
- ✅ 离线消息队列
|
|||
|
|
- ✅ 消息已读状态
|
|||
|
|
|
|||
|
|
**核心类**
|
|||
|
|
- `LiveChatService` - 消息业务逻辑
|
|||
|
|
- `LiveChatDao` - 消息数据访问
|
|||
|
|
- `OfflineMessageService` - 消息缓存服务
|
|||
|
|
- `ConversationService` - 会话管理
|
|||
|
|
|
|||
|
|
**存储策略**
|
|||
|
|
|
|||
|
|
| 存储层 | 用途 | 策略 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| MySQL | 持久化存储 | 所有消息先存MySQL |
|
|||
|
|
| Redis | 热点缓存 | 7天TTL,加速查询 |
|
|||
|
|
| Redis List | 离线消息 | 最多100条,7天过期 |
|
|||
|
|
| 分页查询 | 历史消息 | 按时间倒序,20条/页 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块5:好友关系模块 ✅ (已完成)
|
|||
|
|
**功能:**
|
|||
|
|
- 添加好友(发送申请)✅
|
|||
|
|
- 处理好友申请(同意/拒绝)✅
|
|||
|
|
- 删除好友 ✅ **使用逻辑删除**
|
|||
|
|
- 好友列表查询 ✅
|
|||
|
|
- 用户搜索 ✅
|
|||
|
|
- 好友在线状态 ✅
|
|||
|
|
- 更新好友备注 ✅
|
|||
|
|
- 获取未读请求数量 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- 所有接口都需要用户登录后才能访问
|
|||
|
|
- 由FrontTokenInterceptor拦截器统一处理
|
|||
|
|
- 未登录用户访问会返回401 UNAUTHORIZED错误
|
|||
|
|
- 所有方法都通过userService.getUserId()获取当前登录用户ID
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)**
|
|||
|
|
- `Friend` - 好友关系实体(支持JPA自动建表)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `FriendRequest` - 好友请求实体(支持JPA自动建表)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
- **DAO层(Mapper)**
|
|||
|
|
- `FriendDao` - 好友关系Mapper接口 ✅
|
|||
|
|
- `FriendRequestDao` - 好友请求Mapper接口 ✅
|
|||
|
|
- `FriendDao.xml` - MyBatis映射文件 ✅
|
|||
|
|
- `FriendRequestDao.xml` - MyBatis映射文件 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `FriendService` - 好友关系服务接口 ✅
|
|||
|
|
- `FriendServiceImpl` - 好友关系服务实现 ✅
|
|||
|
|
- ✅ 删除好友使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
- `FriendRequestService` - 好友请求服务接口 ✅
|
|||
|
|
- `FriendRequestServiceImpl` - 好友请求服务实现 ✅
|
|||
|
|
- `FriendNotificationService` - 好友通知服务接口 ✅
|
|||
|
|
- `FriendNotificationServiceImpl` - 好友通知服务实现 ✅
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `FriendController` - 好友接口(已重构为标准三层架构)✅
|
|||
|
|
- 搜索用户 (GET /api/front/users/search) ✅ **需要登录**
|
|||
|
|
- 发送好友请求 (POST /api/front/friends/request) ✅ **需要登录**
|
|||
|
|
- 获取好友请求列表 (GET /api/front/friends/requests) ✅ **需要登录**
|
|||
|
|
- 处理好友请求 (POST /api/front/friends/requests/{requestId}/handle) ✅ **需要登录**
|
|||
|
|
- 获取好友列表 (GET /api/front/friends) ✅ **需要登录**
|
|||
|
|
- 删除好友 (DELETE /api/front/friends/{friendId}) ✅ **需要登录,使用逻辑删除**
|
|||
|
|
- 更新好友备注 (PUT /api/front/friends/{friendId}/remark) ✅ **需要登录**
|
|||
|
|
- 获取未读请求数量 (GET /api/front/friends/requests/unread-count) ✅ **需要登录**
|
|||
|
|
|
|||
|
|
**✅ 已完成改进:**
|
|||
|
|
- ✅ 创建了完整的Service层(FriendService、FriendRequestService、FriendNotificationService)
|
|||
|
|
- ✅ 重构Controller,移除JdbcTemplate,改用Service层
|
|||
|
|
- ✅ 使用MyBatis-Plus进行数据访问
|
|||
|
|
- ✅ 实现标准三层架构(Controller → Service → DAO)
|
|||
|
|
- ✅ 添加JPA注解支持自动建表
|
|||
|
|
- ✅ 集成WebSocket实时通知功能
|
|||
|
|
- ✅ 完善事务管理
|
|||
|
|
- ✅ 添加详细的日志记录和异常处理
|
|||
|
|
- ✅ 所有接口都需要登录验证(FrontTokenInterceptor拦截器)
|
|||
|
|
- ✅ 删除功能使用逻辑删除(@TableLogic)
|
|||
|
|
- ✅ 添加更新时间字段(@UpdateTimestamp自动管理)
|
|||
|
|
- ✅ 预留5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**Friend实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 好友来源/标签(如:通过搜索添加、通过推荐添加等)
|
|||
|
|
- ext_field2: INT - 分组ID/优先级(用于好友分组功能)
|
|||
|
|
- ext_field3: VARCHAR(50) - 特殊标记/权限(如:特别关注、黑名单等)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**FriendRequest实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 请求来源/渠道(如:扫码添加、名片分享等)
|
|||
|
|
- ext_field2: INT - 请求类型/优先级(用于区分不同类型的好友请求)
|
|||
|
|
- ext_field3: VARCHAR(200) - 拒绝原因/备注(记录拒绝好友请求的原因)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**业务流程:**
|
|||
|
|
- 发送申请 → 保存申请记录 → 推送通知给对方 ✅
|
|||
|
|
- 同意申请 → 双向添加好友关系 → 推送通知 → 创建会话 ✅
|
|||
|
|
- 删除好友 → 逻辑删除好友关系(is_deleted=1)→ 推送通知 → 保留历史消息 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**
|
|||
|
|
- `eb_friend` - 好友关系表 ✅(支持JPA自动创建)
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_friend_request` - 好友申请表 ✅(支持JPA自动创建)
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计
|
|||
|
|
- 完整的事务管理
|
|||
|
|
- WebSocket实时通知
|
|||
|
|
- 双向好友关系自动维护
|
|||
|
|
- 支持JPA自动建表(ddl-auto: update)
|
|||
|
|
- 使用逻辑删除保护数据安全
|
|||
|
|
- 预留扩展字段便于功能扩展
|
|||
|
|
- 所有接口都需要登录验证
|
|||
|
|
|
|||
|
|
**相关文档:**
|
|||
|
|
- 详细开发文档:`好友关系模块开发文档.md` ✅
|
|||
|
|
- 完善总结:`好友模块完善总结.md` ✅
|
|||
|
|
- 快速参考:`好友模块快速参考.md` ✅
|
|||
|
|
- 测试清单:`好友模块测试清单.md` ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块6:直播间管理模块 ✅ (已完成 - 95%)
|
|||
|
|
**功能:**
|
|||
|
|
- 进入直播间 ✅
|
|||
|
|
- 离开直播间 ✅
|
|||
|
|
- 直播间在线用户列表 ✅
|
|||
|
|
- 直播间弹幕发送 ✅
|
|||
|
|
- 直播间人数统计 ✅
|
|||
|
|
- 限流防刷 ✅ **2024-12-26完成**
|
|||
|
|
- 敏感词过滤 ❌ **待实现 - 高优先级**
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- `LiveRoomController` - 直播间接口 ✅
|
|||
|
|
- `LiveRoomService` - 直播间业务逻辑 ✅
|
|||
|
|
- `RoomMemberService` - 房间成员管理 ✅ (内置在Handler中)
|
|||
|
|
- `BarrageService` - 弹幕服务 ✅ (LiveChatService)
|
|||
|
|
|
|||
|
|
**关键功能:**
|
|||
|
|
- 进入房间:加入Redis Set、广播进入消息、返回房间信息 ✅
|
|||
|
|
- 发送弹幕:频率限制(1秒1条)✅、敏感词过滤 ❌、广播给所有人 ✅
|
|||
|
|
- 离开房间:从Redis Set移除、广播离开消息 ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块7:礼物打赏模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 礼物列表管理 ✅
|
|||
|
|
- 直播间送礼 ✅
|
|||
|
|
- 私聊送礼 ✅
|
|||
|
|
- 礼物记录查询 ✅
|
|||
|
|
- 余额扣除与收益增加 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- GET /api/front/gift/list - 获取礼物列表(不需要登录)
|
|||
|
|
- GET /api/front/gift/balance - 获取用户余额(需要登录)✅
|
|||
|
|
- POST /api/front/gift/send - 赠送礼物(需要登录)✅
|
|||
|
|
- GET /api/front/gift/recharge/options - 获取充值选项(不需要登录)
|
|||
|
|
- POST /api/front/gift/recharge/create - 创建充值订单(需要登录)✅
|
|||
|
|
- 所有需要登录的接口都会检查用户登录状态
|
|||
|
|
- 未登录用户访问会返回"用户未登录,请先登录"提示
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)** - 支持JPA自动建表
|
|||
|
|
- `Gift` - 礼物实体(eb_gift)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `GiftRecord` - 礼物打赏记录实体(eb_gift_reward_record)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `GiftDetail` - 送礼物明细实体(eb_gift_detail)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `RechargeOption` - 充值选项实体(eb_gift_quantity)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
- **DAO层(Mapper)**
|
|||
|
|
- `GiftDao` - 礼物Mapper接口 ✅
|
|||
|
|
- `GiftRecordDao` - 礼物记录Mapper接口 ✅
|
|||
|
|
- `GiftDetailDao` - 礼物明细Mapper接口 ✅
|
|||
|
|
- `RechargeOptionDao` - 充值选项Mapper接口 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `GiftService` - 礼物服务接口 ✅
|
|||
|
|
- `GiftServiceImpl` - 礼物服务实现 ✅
|
|||
|
|
- `GiftRecordService` - 礼物记录服务接口 ✅
|
|||
|
|
- `GiftRecordServiceImpl` - 礼物记录服务实现 ✅
|
|||
|
|
- `RechargeOptionService` - 充值选项服务接口 ✅
|
|||
|
|
- `RechargeOptionServiceImpl` - 充值选项服务实现 ✅
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `GiftController` - 礼物接口(前端)✅
|
|||
|
|
- ✅ 添加详细的登录验证说明注释
|
|||
|
|
- ✅ 所有需要登录的接口都检查用户登录状态
|
|||
|
|
- ✅ 未登录返回友好的提示信息
|
|||
|
|
|
|||
|
|
**业务流程:**
|
|||
|
|
- 验证余额 → 扣除金币 → 增加收益 → 保存记录 → 生成账单 → 返回结果 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**(支持JPA自动创建)
|
|||
|
|
- `eb_gift` - 礼物表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_gift_reward_record` - 礼物打赏记录表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_gift_detail` - 送礼物明细表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_gift_quantity` - 礼物数量列表(充值选项)✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**API接口:**
|
|||
|
|
- `GET /api/front/gift/list` - 获取礼物列表 ✅(不需要登录)
|
|||
|
|
- `GET /api/front/gift/balance` - 获取用户余额 ✅(需要登录)
|
|||
|
|
- `POST /api/front/gift/send` - 赠送礼物 ✅(需要登录)
|
|||
|
|
- `GET /api/front/gift/recharge/options` - 获取充值选项 ✅(不需要登录)
|
|||
|
|
- `POST /api/front/gift/recharge/create` - 创建充值订单 ✅(需要登录)
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**Gift实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 礼物分类/标签(如:热门礼物、节日礼物等)
|
|||
|
|
- ext_field2: INT - 礼物等级/排序(用于礼物排序和分级)
|
|||
|
|
- ext_field3: VARCHAR(50) - 特殊标记/活动标识(如:限时礼物、活动礼物等)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**GiftRecord实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 打赏场景/来源(如:直播间打赏、私聊打赏等)
|
|||
|
|
- ext_field2: INT - 直播间ID/会话ID(记录打赏发生的场景)
|
|||
|
|
- ext_field3: VARCHAR(50) - 活动标识/特殊标记(如:活动期间打赏、首次打赏等)
|
|||
|
|
- ext_field4: BIGINT - 关联订单ID(用于关联支付订单)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**GiftDetail实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 送礼场景/来源(如:直播间、私聊等)
|
|||
|
|
- ext_field2: INT - 直播间ID/会话ID(记录送礼发生的场景)
|
|||
|
|
- ext_field3: VARCHAR(50) - 活动标识/特殊标记(如:活动期间送礼等)
|
|||
|
|
- ext_field4: BIGINT - 关联订单ID(用于关联支付订单)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**RechargeOption实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 充值类型/分类(如:普通充值、活动充值等)
|
|||
|
|
- ext_field2: INT - 赠送比例/优惠等级(如:充值100送10)
|
|||
|
|
- ext_field3: VARCHAR(50) - 活动标识/特殊标记(如:限时优惠、首充优惠等)
|
|||
|
|
- ext_field4: BIGINT - 关联活动ID(用于关联营销活动)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计(Controller → Service → DAO)
|
|||
|
|
- 使用JPA注解支持自动建表(ddl-auto: update)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 完整的事务管理(@Transactional)
|
|||
|
|
- 完善的余额和账单管理
|
|||
|
|
- 支持直播间和私聊场景
|
|||
|
|
- 使用逻辑删除保护数据安全
|
|||
|
|
- 预留扩展字段便于功能扩展
|
|||
|
|
- 所有需要登录的接口都有验证机制
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 为所有实体类添加JPA注解(@Entity、@Table、@Column等)
|
|||
|
|
- ✅ 添加数据库索引定义(@Index)
|
|||
|
|
- ✅ 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- ✅ 完善字段注释(columnDefinition)
|
|||
|
|
- ✅ 确保所有数据访问通过MyBatis-Plus完成,无SQL语句
|
|||
|
|
- ✅ 验证代码无编译错误
|
|||
|
|
- ✅ 为所有实体类添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 为所有实体类添加更新时间字段(update_time)
|
|||
|
|
- ✅ 为所有实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 为Controller添加详细的登录验证说明
|
|||
|
|
- ✅ 检查并标注哪些接口需要登录
|
|||
|
|
- ✅ 优化未登录提示信息
|
|||
|
|
|
|||
|
|
**文档:**
|
|||
|
|
- 详细开发文档:`Zhibo/zhibo-h/礼物打赏模块开发说明.md` ✅
|
|||
|
|
- 快速开始指南:`Zhibo/zhibo-h/礼物打赏模块快速开始.md` ✅
|
|||
|
|
- 部署清单:`Zhibo/礼物打赏模块部署清单.md` ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块8:多媒体消息模块 ✅ (已完成)
|
|||
|
|
**功能:**
|
|||
|
|
- 图片上传与发送 ✅
|
|||
|
|
- 语音上传与发送 ✅
|
|||
|
|
- 视频上传与发送 ✅
|
|||
|
|
- 文件存储(本地/OSS)✅
|
|||
|
|
- 缩略图生成 ✅
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- `UploadController` - 文件上传接口 ✅ (UserUploadController)
|
|||
|
|
- `FileStorageService` - 文件存储服务 ✅
|
|||
|
|
- `ImageService` - 图片处理(压缩、缩略图)✅
|
|||
|
|
- `MediaMessageService` - 多媒体消息服务 ✅
|
|||
|
|
|
|||
|
|
**处理流程:**
|
|||
|
|
- 客户端先上传文件 → 返回URL → 发送消息时带上URL和元信息 ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块9:消息已读回执模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 标记消息已读 ✅
|
|||
|
|
- 未读消息统计 ✅
|
|||
|
|
- 已读状态推送 ✅
|
|||
|
|
- 会话未读数更新 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- 所有接口都需要用户登录后才能访问
|
|||
|
|
- 由FrontTokenInterceptor拦截器统一处理
|
|||
|
|
- 未登录用户访问会返回401 UNAUTHORIZED错误
|
|||
|
|
- 所有方法都通过userService.getUserIdException()获取当前登录用户ID
|
|||
|
|
- 自动验证用户是否有权限操作会话和消息
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)** - 支持JPA自动建表
|
|||
|
|
- `Conversation` - 会话实体(eb_conversation)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(user1_deleted、user2_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 支持双向软删除(用户1和用户2可分别删除)
|
|||
|
|
- `PrivateMessage` - 私信消息实体(eb_private_message)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(sender_deleted、receiver_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 支持双向软删除(发送者和接收者可分别删除)
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `ConversationService` - 会话服务接口 ✅
|
|||
|
|
- `ConversationServiceImpl` - 会话服务实现(包含已读回执逻辑)✅
|
|||
|
|
- ✅ 删除会话使用逻辑删除(双向软删除)
|
|||
|
|
- ✅ 删除消息使用逻辑删除(双向软删除)
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `ConversationController` - 会话接口 ✅
|
|||
|
|
- 标记会话已读 (POST /api/front/conversations/{id}/read) ✅ **需要登录**
|
|||
|
|
- 获取会话列表 (GET /api/front/conversations) ✅ **需要登录**
|
|||
|
|
- 搜索会话 (GET /api/front/conversations/search) ✅ **需要登录**
|
|||
|
|
- 获取或创建会话 (POST /api/front/conversations/with/{otherUserId}) ✅ **需要登录**
|
|||
|
|
- 获取消息列表 (GET /api/front/conversations/{id}/messages) ✅ **需要登录**
|
|||
|
|
- 发送消息 (POST /api/front/conversations/{id}/messages) ✅ **需要登录**
|
|||
|
|
- 删除会话 (DELETE /api/front/conversations/{id}) ✅ **需要登录,使用逻辑删除**
|
|||
|
|
- 删除消息 (DELETE /api/front/conversations/messages/{messageId}) ✅ **需要登录,使用逻辑删除**
|
|||
|
|
|
|||
|
|
- **WebSocket处理器**
|
|||
|
|
- `PrivateChatHandler` - 私聊WebSocket处理器 ✅
|
|||
|
|
- 实时推送已读回执 ✅
|
|||
|
|
- 连接时自动标记已读 ✅
|
|||
|
|
|
|||
|
|
**实现逻辑:**
|
|||
|
|
- 用户查看消息 → 批量更新已读状态 → 推送已读回执给发送方 → 更新会话未读数 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**(支持JPA自动创建)
|
|||
|
|
- `eb_conversation` - 会话表 ✅
|
|||
|
|
- 包含逻辑删除字段(user1_deleted、user2_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_private_message` - 私信消息表 ✅
|
|||
|
|
- 包含逻辑删除字段(sender_deleted、receiver_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**Conversation实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 会话标签(如:重要、工作、朋友等)
|
|||
|
|
- ext_field2: VARCHAR(200) - 会话备注
|
|||
|
|
- ext_field3: INT - 会话置顶优先级(用于会话排序)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**PrivateMessage实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(50) - 消息来源(如:mobile、web、desktop)
|
|||
|
|
- ext_field2: BIGINT - 引用消息ID(用于消息回复功能)
|
|||
|
|
- ext_field3: VARCHAR(100) - 消息标签或分类
|
|||
|
|
- ext_field4: BIGINT - 附件大小(字节)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(如:图片尺寸、视频时长等)
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计(Controller → Service → DAO)
|
|||
|
|
- 使用JPA注解支持自动建表(ddl-auto: update)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 完整的事务管理(@Transactional)
|
|||
|
|
- 添加数据库索引定义(提升查询性能)
|
|||
|
|
- 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- WebSocket实时推送已读回执
|
|||
|
|
- 支持双向软删除(用户1和用户2可分别删除会话,发送者和接收者可分别删除消息)
|
|||
|
|
- 支持静音功能
|
|||
|
|
- 所有接口都需要登录验证
|
|||
|
|
- 自动验证用户权限(只能操作自己的会话和消息)
|
|||
|
|
- 预留扩展字段便于功能扩展
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 为Conversation实体类添加完整的JPA注解
|
|||
|
|
- ✅ 为PrivateMessage实体类添加完整的JPA注解
|
|||
|
|
- ✅ 添加数据库索引定义(idx_user1_id、idx_user2_id、idx_conversation_id等)
|
|||
|
|
- ✅ 添加唯一索引(idx_user1_user2)防止重复会话
|
|||
|
|
- ✅ 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- ✅ 完善字段注释和约束(columnDefinition)
|
|||
|
|
- ✅ 验证代码无编译错误
|
|||
|
|
- ✅ 确认所有数据访问通过MyBatis-Plus完成,无SQL语句
|
|||
|
|
- ✅ 所有接口都需要登录验证
|
|||
|
|
- ✅ 删除功能使用逻辑删除(双向软删除)
|
|||
|
|
- ✅ 添加更新时间字段(@UpdateTimestamp自动管理)
|
|||
|
|
- ✅ 预留5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块10:好友私聊消息模块 ✅ (已实现)
|
|||
|
|
**功能:**
|
|||
|
|
- 好友之间发送文本消息 ✅
|
|||
|
|
- 好友之间发送图片消息 ✅
|
|||
|
|
- 好友之间发送语音消息 ✅
|
|||
|
|
- 好友之间发送视频消息 ✅
|
|||
|
|
- 消息已读状态 ✅
|
|||
|
|
- 正在输入提示 ✅
|
|||
|
|
- 离线消息推送 ✅
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- `PrivateChatHandler` - 私聊WebSocket处理器 ✅
|
|||
|
|
- `ConversationService` - 会话服务 ✅
|
|||
|
|
- `ConversationController` - 会话接口 ✅
|
|||
|
|
- `OfflineMessageService` - 离线消息服务 ✅
|
|||
|
|
|
|||
|
|
**核心功能:**
|
|||
|
|
- 通过WebSocket实现实时消息推送 ✅
|
|||
|
|
- 支持多设备同时在线 ✅
|
|||
|
|
- 自动保存离线消息 ✅
|
|||
|
|
- 消息已读回执 ✅
|
|||
|
|
- 正在输入状态同步 ✅
|
|||
|
|
|
|||
|
|
**WebSocket路径:** `/ws/chat/{conversationId}?userId={userId}`
|
|||
|
|
|
|||
|
|
**消息类型:**
|
|||
|
|
- `chat` - 聊天消息
|
|||
|
|
- `read` - 已读通知
|
|||
|
|
- `typing` - 正在输入
|
|||
|
|
- `new_message` - 新消息通知
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块11:群组聊天模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 创建群组 ✅
|
|||
|
|
- 邀请成员加入群组 ✅
|
|||
|
|
- 群组消息发送 ✅
|
|||
|
|
- 群组消息广播 ✅
|
|||
|
|
- 群组成员管理 ✅
|
|||
|
|
- 群主/管理员权限 ✅
|
|||
|
|
- 群公告 ✅
|
|||
|
|
- @提醒功能 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- 所有接口都需要用户登录后才能访问
|
|||
|
|
- 由FrontTokenInterceptor拦截器统一处理
|
|||
|
|
- 未登录用户访问会返回401 UNAUTHORIZED错误
|
|||
|
|
- 所有方法都通过userService.getUserId()获取当前登录用户ID
|
|||
|
|
- 自动验证用户是否有权限操作群组(群主、管理员权限)
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)** - 支持JPA自动建表
|
|||
|
|
- `Group` - 群组实体(eb_group)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `GroupMember` - 群组成员实体(eb_group_member)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `GroupMessage` - 群组消息实体(eb_group_message)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
- **DAO层(Mapper)**
|
|||
|
|
- `GroupDao` - 群组Mapper接口 ✅
|
|||
|
|
- `GroupMemberDao` - 群组成员Mapper接口 ✅
|
|||
|
|
- `GroupMessageDao` - 群组消息Mapper接口 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `GroupService` - 群组服务接口 ✅
|
|||
|
|
- `GroupServiceImpl` - 群组服务实现 ✅
|
|||
|
|
- ✅ 解散群组使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
- `GroupMemberService` - 群组成员服务接口 ✅
|
|||
|
|
- `GroupMemberServiceImpl` - 群组成员服务实现 ✅
|
|||
|
|
- ✅ 移除成员使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
- ✅ 退出群组使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
- `GroupMessageService` - 群组消息服务接口 ✅
|
|||
|
|
- `GroupMessageServiceImpl` - 群组消息服务实现 ✅
|
|||
|
|
- ✅ 删除消息使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `GroupController` - 群组接口 ✅
|
|||
|
|
- 创建群组 (POST /api/front/groups/create) ✅ **需要登录**
|
|||
|
|
- 更新群组信息 (PUT /api/front/groups/{groupId}) ✅ **需要登录 + 群主/管理员权限**
|
|||
|
|
- 解散群组 (DELETE /api/front/groups/{groupId}) ✅ **需要登录 + 群主权限,使用逻辑删除**
|
|||
|
|
- 获取用户的群组列表 (GET /api/front/groups/list) ✅ **需要登录**
|
|||
|
|
- 获取群组详情 (GET /api/front/groups/{groupId}) ✅ **需要登录 + 成员权限**
|
|||
|
|
- 更新群公告 (PUT /api/front/groups/{groupId}/announcement) ✅ **需要登录 + 群主/管理员权限**
|
|||
|
|
- 设置全员禁言 (PUT /api/front/groups/{groupId}/mute-all) ✅ **需要登录 + 群主/管理员权限**
|
|||
|
|
- 邀请成员加入群组 (POST /api/front/groups/{groupId}/members/invite) ✅ **需要登录 + 成员权限**
|
|||
|
|
- 移除群成员 (DELETE /api/front/groups/{groupId}/members/{userId}) ✅ **需要登录 + 群主/管理员权限,使用逻辑删除**
|
|||
|
|
- 退出群组 (POST /api/front/groups/{groupId}/quit) ✅ **需要登录,使用逻辑删除**
|
|||
|
|
- 获取群成员列表 (GET /api/front/groups/{groupId}/members) ✅ **需要登录 + 成员权限**
|
|||
|
|
- 设置管理员 (PUT /api/front/groups/{groupId}/members/{userId}/admin) ✅ **需要登录 + 群主权限**
|
|||
|
|
- 禁言成员 (PUT /api/front/groups/{groupId}/members/{userId}/mute) ✅ **需要登录 + 群主/管理员权限**
|
|||
|
|
- 取消禁言 (PUT /api/front/groups/{groupId}/members/{userId}/unmute) ✅ **需要登录 + 群主/管理员权限**
|
|||
|
|
- 更新群昵称 (PUT /api/front/groups/{groupId}/members/nickname) ✅ **需要登录**
|
|||
|
|
- `GroupMessageController` - 群组消息接口 ✅
|
|||
|
|
- 发送群组消息 (POST /api/front/groups/{groupId}/messages) ✅ **需要登录 + 成员权限**
|
|||
|
|
- 获取群组消息列表 (GET /api/front/groups/{groupId}/messages) ✅ **需要登录 + 成员权限**
|
|||
|
|
- 撤回群组消息 (POST /api/front/groups/messages/{messageId}/recall) ✅ **需要登录 + 发送者权限**
|
|||
|
|
- 删除群组消息 (DELETE /api/front/groups/messages/{messageId}) ✅ **需要登录 + 发送者权限,使用逻辑删除**
|
|||
|
|
|
|||
|
|
**业务流程:**
|
|||
|
|
- 创建群组 → 添加群主为成员 → 邀请其他成员 ✅
|
|||
|
|
- 发送消息 → 检查权限和禁言状态 → 保存消息 → 广播给所有成员 ✅
|
|||
|
|
- 管理员权限 → 设置管理员、禁言成员、修改群公告 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**(支持JPA自动创建)
|
|||
|
|
- `eb_group` - 群组表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_group_member` - 群成员表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_group_message` - 群消息表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**Group实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(50) - 群组分类(如:工作、学习、娱乐等)
|
|||
|
|
- ext_field2: VARCHAR(200) - 群组标签
|
|||
|
|
- ext_field3: INT - 群组等级或积分
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(如:关联的直播间ID)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(如:群规则、入群问题等)
|
|||
|
|
|
|||
|
|
**GroupMember实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 成员标签(如:活跃、潜水等)
|
|||
|
|
- ext_field2: INT - 成员等级或积分
|
|||
|
|
- ext_field3: VARCHAR(200) - 自定义备注
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据
|
|||
|
|
|
|||
|
|
**GroupMessage实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(50) - 消息来源(如:mobile、web、desktop)
|
|||
|
|
- ext_field2: BIGINT - 引用消息ID(用于消息回复功能)
|
|||
|
|
- ext_field3: VARCHAR(100) - 消息优先级或标签
|
|||
|
|
- ext_field4: BIGINT - 附件大小(字节)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计(Controller → Service → DAO)
|
|||
|
|
- 使用JPA注解支持自动建表(ddl-auto: update)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 完整的事务管理(@Transactional)
|
|||
|
|
- 支持逻辑删除(@TableLogic)
|
|||
|
|
- 完善的权限管理(群主、管理员、普通成员)
|
|||
|
|
- 支持@提醒功能和全员禁言
|
|||
|
|
- 所有接口都需要登录验证
|
|||
|
|
- 所有删除操作都使用逻辑删除
|
|||
|
|
- 预留扩展字段便于功能扩展
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 创建完整的实体类(Group、GroupMember、GroupMessage)
|
|||
|
|
- ✅ 添加JPA注解支持自动建表
|
|||
|
|
- ✅ 添加数据库索引定义(提升查询性能)
|
|||
|
|
- ✅ 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- ✅ 完善字段注释和约束(columnDefinition)
|
|||
|
|
- ✅ 实现完整的Service层业务逻辑
|
|||
|
|
- ✅ 实现Controller层接口
|
|||
|
|
- ✅ 验证代码无编译错误
|
|||
|
|
- ✅ 所有接口都需要登录验证
|
|||
|
|
- ✅ 所有删除操作都使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
- ✅ 添加更新时间字段(@UpdateTimestamp自动管理)
|
|||
|
|
- ✅ 预留5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 为Controller添加详细的登录验证说明注释
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块12:消息撤回模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 撤回私聊消息(2分钟内)✅
|
|||
|
|
- 撤回群组消息(2分钟内)✅
|
|||
|
|
- 推送撤回通知 ✅
|
|||
|
|
- 更新消息状态 ✅
|
|||
|
|
- 检查撤回权限 ✅
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类扩展**
|
|||
|
|
- `PrivateMessage` - 添加撤回相关字段(is_recalled、recall_time)✅
|
|||
|
|
- `GroupMessage` - 包含撤回相关字段 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `MessageRecallService` - 消息撤回服务接口 ✅
|
|||
|
|
- `MessageRecallServiceImpl` - 消息撤回服务实现 ✅
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `MessageRecallController` - 消息撤回接口 ✅
|
|||
|
|
|
|||
|
|
**撤回逻辑:**
|
|||
|
|
- 验证权限(只能撤回自己的消息)✅
|
|||
|
|
- 验证时间(2分钟内)✅
|
|||
|
|
- 更新消息状态(is_recalled = true)✅
|
|||
|
|
- 记录撤回时间(recall_time)✅
|
|||
|
|
- 推送撤回通知(待WebSocket集成)⚠️
|
|||
|
|
|
|||
|
|
**API接口:**
|
|||
|
|
- `POST /api/front/messages/private/{messageId}/recall` - 撤回私聊消息 ✅
|
|||
|
|
- `POST /api/front/messages/group/{messageId}/recall` - 撤回群组消息 ✅
|
|||
|
|
- `GET /api/front/messages/{messageId}/can-recall` - 检查是否可以撤回 ✅
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计
|
|||
|
|
- 完整的权限验证
|
|||
|
|
- 时间限制检查(2分钟)
|
|||
|
|
- 支持私聊和群聊消息撤回
|
|||
|
|
- 完善的异常处理
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 为PrivateMessage添加撤回相关字段
|
|||
|
|
- ✅ 实现MessageRecallService服务层
|
|||
|
|
- ✅ 实现MessageRecallController接口层
|
|||
|
|
- ✅ 完善权限和时间验证逻辑
|
|||
|
|
- ✅ 验证代码无编译错误
|
|||
|
|
|
|||
|
|
**优先级:** 低 - 非核心功能
|
|||
|
|
**完成时间:** 2024-12-26
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块13:消息转发模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 转发消息给好友 ✅
|
|||
|
|
- 转发消息到群组 ✅
|
|||
|
|
- 批量转发 ✅
|
|||
|
|
- 转发历史记录 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- 所有接口都需要用户登录后才能访问
|
|||
|
|
- 由FrontTokenInterceptor拦截器统一处理
|
|||
|
|
- 未登录用户访问会返回401 UNAUTHORIZED错误
|
|||
|
|
- 所有方法都通过userService.getUserId()获取当前登录用户ID
|
|||
|
|
- 自动验证用户是否有权限转发消息(必须是消息的发送者或接收者)
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)** - 支持JPA自动建表
|
|||
|
|
- `MessageForward` - 消息转发记录实体(eb_message_forward)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
- **DAO层(Mapper)**
|
|||
|
|
- `MessageForwardDao` - 消息转发Mapper接口 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `MessageForwardService` - 消息转发服务接口 ✅
|
|||
|
|
- `MessageForwardServiceImpl` - 消息转发服务实现 ✅
|
|||
|
|
- ✅ 删除转发记录使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `MessageForwardController` - 消息转发接口 ✅
|
|||
|
|
- 转发消息给好友 (POST /api/front/messages/forward/friend) ✅ **需要登录**
|
|||
|
|
- 转发消息到群组 (POST /api/front/messages/forward/group) ✅ **需要登录**
|
|||
|
|
- 批量转发消息 (POST /api/front/messages/forward/batch) ✅ **需要登录**
|
|||
|
|
- 获取转发历史记录 (GET /api/front/messages/forward/history) ✅ **需要登录**
|
|||
|
|
- 删除转发记录 (DELETE /api/front/messages/forward/{forwardId}) ✅ **需要登录,使用逻辑删除**
|
|||
|
|
|
|||
|
|
**业务流程:**
|
|||
|
|
- 验证权限(必须是消息的发送者或接收者)✅
|
|||
|
|
- 验证好友关系或群组成员关系 ✅
|
|||
|
|
- 获取原始消息内容 ✅
|
|||
|
|
- 创建新消息(带转发标记)✅
|
|||
|
|
- 保存转发记录 ✅
|
|||
|
|
- 支持批量转发 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**(支持JPA自动创建)
|
|||
|
|
- `eb_message_forward` - 消息转发记录表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**API接口:**
|
|||
|
|
- `POST /api/front/messages/forward/friend` - 转发消息给好友 ✅ **需要登录**
|
|||
|
|
- `POST /api/front/messages/forward/group` - 转发消息到群组 ✅ **需要登录**
|
|||
|
|
- `POST /api/front/messages/forward/batch` - 批量转发消息 ✅ **需要登录**
|
|||
|
|
- `GET /api/front/messages/forward/history` - 获取转发历史记录 ✅ **需要登录**
|
|||
|
|
- `DELETE /api/front/messages/forward/{forwardId}` - 删除转发记录 ✅ **需要登录,使用逻辑删除**
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**MessageForward实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 转发来源/渠道(如:从私聊转发、从群聊转发等)
|
|||
|
|
- ext_field2: INT - 转发优先级/标记(用于区分不同类型的转发)
|
|||
|
|
- ext_field3: VARCHAR(50) - 转发状态/类型(如:普通转发、紧急转发等)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计(Controller → Service → DAO)
|
|||
|
|
- 使用JPA注解支持自动建表(ddl-auto: update)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 完整的事务管理(@Transactional)
|
|||
|
|
- 支持逻辑删除(@TableLogic)
|
|||
|
|
- 完善的权限验证(好友关系、群组成员)
|
|||
|
|
- 支持批量转发,提升用户体验
|
|||
|
|
- 添加数据库索引定义(提升查询性能)
|
|||
|
|
- 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- 所有接口都需要登录验证
|
|||
|
|
- 所有删除操作都使用逻辑删除
|
|||
|
|
- 预留5个扩展字段便于功能扩展
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 创建MessageForward实体类(支持JPA自动建表)
|
|||
|
|
- ✅ 添加数据库索引定义(idx_user_id、idx_original_message_id等)
|
|||
|
|
- ✅ 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- ✅ 完善字段注释和约束(columnDefinition)
|
|||
|
|
- ✅ 实现完整的Service层业务逻辑
|
|||
|
|
- ✅ 实现Controller层接口
|
|||
|
|
- ✅ 验证代码无编译错误
|
|||
|
|
- ✅ 扩展ConversationService,添加getPrivateMessageById和sendMessage方法
|
|||
|
|
- ✅ 为MessageForward实体类添加更新时间字段(update_time)
|
|||
|
|
- ✅ 为MessageForward实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 为Controller添加详细的登录验证说明注释
|
|||
|
|
- ✅ 所有接口都需要登录验证
|
|||
|
|
- ✅ 所有删除操作都使用逻辑删除
|
|||
|
|
|
|||
|
|
**优先级:** 低 - 辅助功能
|
|||
|
|
**完成时间:** 2024-12-26
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块14:语音/视频通话模块 ❌ (未实现)
|
|||
|
|
**功能:**
|
|||
|
|
- 一对一语音通话 ❌
|
|||
|
|
- 一对一视频通话 ❌
|
|||
|
|
- 通话邀请/接听/拒绝 ❌
|
|||
|
|
- 通话记录 ❌
|
|||
|
|
- 通话质量监控 ❌
|
|||
|
|
|
|||
|
|
**需要实现的类:**
|
|||
|
|
- `CallService` - 通话服务 ❌
|
|||
|
|
- `CallController` - 通话接口 ❌
|
|||
|
|
- `CallSignalingHandler` - 信令WebSocket处理器 ❌
|
|||
|
|
|
|||
|
|
**技术方案:**
|
|||
|
|
- 使用WebRTC实现音视频通话
|
|||
|
|
- 使用WebSocket传输信令
|
|||
|
|
- 可选:集成第三方服务(声网、腾讯云)
|
|||
|
|
|
|||
|
|
**优先级:** 低 - 高级功能
|
|||
|
|
**预计工作量:** 5-7天
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块15:消息搜索模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 搜索聊天记录 ✅
|
|||
|
|
- 按时间范围搜索 ✅
|
|||
|
|
- 按消息类型搜索 ✅
|
|||
|
|
- 搜索结果高亮 ⚠️ (前端实现)
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- 所有接口都需要用户登录后才能访问
|
|||
|
|
- 由FrontTokenInterceptor拦截器统一处理
|
|||
|
|
- 未登录用户访问会返回401 UNAUTHORIZED错误
|
|||
|
|
- 所有方法都通过userService.getUserId()获取当前登录用户ID
|
|||
|
|
- 自动验证用户是否有权限搜索消息(只能搜索自己相关的消息)
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **Service层**
|
|||
|
|
- `MessageSearchService` - 消息搜索服务接口 ✅
|
|||
|
|
- `MessageSearchServiceImpl` - 消息搜索服务实现 ✅
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `MessageSearchController` - 消息搜索接口 ✅
|
|||
|
|
- 搜索私聊消息 (GET /api/front/messages/search/private) ✅ **需要登录**
|
|||
|
|
- 搜索群组消息 (GET /api/front/messages/search/group) ✅ **需要登录**
|
|||
|
|
- 在指定会话中搜索 (GET /api/front/messages/search/conversation/{conversationId}) ✅ **需要登录**
|
|||
|
|
- 在指定群组中搜索 (GET /api/front/messages/search/group/{groupId}) ✅ **需要登录**
|
|||
|
|
- 获取搜索历史 (GET /api/front/messages/search/history) ✅ **需要登录**
|
|||
|
|
- 清除搜索历史 (DELETE /api/front/messages/search/history) ✅ **需要登录**
|
|||
|
|
|
|||
|
|
**业务流程:**
|
|||
|
|
- 搜索私聊消息 → 验证用户权限 → 关键词模糊查询 → 按时间和类型过滤 → 返回分页结果 ✅
|
|||
|
|
- 搜索群组消息 → 获取用户所在群组 → 关键词模糊查询 → 按时间和类型过滤 → 返回分页结果 ✅
|
|||
|
|
- 在指定会话/群组中搜索 → 验证权限 → 精确搜索 → 返回结果 ✅
|
|||
|
|
- 搜索历史管理 → Redis存储 → 自动过期 → 支持清除 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**
|
|||
|
|
- 使用现有的 `eb_private_message` 和 `eb_group_message` 表
|
|||
|
|
- 两个表都已包含逻辑删除字段(sender_deleted、receiver_deleted 或 is_deleted)
|
|||
|
|
- 两个表都已包含更新时间字段(update_time)
|
|||
|
|
- 两个表都已包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
**API接口:**
|
|||
|
|
- `GET /api/front/messages/search/private` - 搜索私聊消息 ✅ **需要登录**
|
|||
|
|
- `GET /api/front/messages/search/group` - 搜索群组消息 ✅ **需要登录**
|
|||
|
|
- `GET /api/front/messages/search/conversation/{conversationId}` - 在指定会话中搜索 ✅ **需要登录**
|
|||
|
|
- `GET /api/front/messages/search/group/{groupId}` - 在指定群组中搜索 ✅ **需要登录**
|
|||
|
|
- `GET /api/front/messages/search/history` - 获取搜索历史 ✅ **需要登录**
|
|||
|
|
- `DELETE /api/front/messages/search/history` - 清除搜索历史 ✅ **需要登录**
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计(Controller → Service → DAO)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 使用LIKE模糊查询实现关键词搜索
|
|||
|
|
- 支持按时间范围和消息类型过滤
|
|||
|
|
- 使用Redis ZSet存储搜索历史(按时间排序)
|
|||
|
|
- 自动保存搜索历史,30天过期
|
|||
|
|
- 完善的权限验证(只能搜索自己相关的消息)
|
|||
|
|
- 排除已删除和已撤回的消息
|
|||
|
|
- 支持分页查询,提升性能
|
|||
|
|
- 支持逻辑删除,保护数据安全
|
|||
|
|
- 所有接口都需要登录验证
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 创建MessageSearchService服务接口
|
|||
|
|
- ✅ 实现MessageSearchServiceImpl服务实现
|
|||
|
|
- ✅ 实现MessageSearchController接口层
|
|||
|
|
- ✅ 支持搜索私聊消息(全局搜索)
|
|||
|
|
- ✅ 支持搜索群组消息(全局搜索)
|
|||
|
|
- ✅ 支持在指定会话中搜索
|
|||
|
|
- ✅ 支持在指定群组中搜索
|
|||
|
|
- ✅ 支持按时间范围过滤
|
|||
|
|
- ✅ 支持按消息类型过滤
|
|||
|
|
- ✅ 实现搜索历史管理(Redis存储)
|
|||
|
|
- ✅ 扩展GroupMemberService,添加getUserGroupIds和isMember方法
|
|||
|
|
- ✅ 验证所有代码无编译错误
|
|||
|
|
- ✅ 完善权限验证和异常处理
|
|||
|
|
- ✅ 排除已删除和已撤回的消息
|
|||
|
|
- ✅ 为Controller添加详细的登录验证说明注释
|
|||
|
|
- ✅ 确认所有接口都需要登录验证
|
|||
|
|
- ✅ 确认使用现有实体类的逻辑删除和扩展字段
|
|||
|
|
- ✅ 确认PrivateMessage和GroupMessage实体类包含完整的JPA注解
|
|||
|
|
- ✅ 确认逻辑删除功能正常工作(双向软删除和单一软删除)
|
|||
|
|
- ✅ 确认更新时间字段使用@UpdateTimestamp自动管理
|
|||
|
|
- ✅ 确认预留5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 确认不创建外键,保持表独立性
|
|||
|
|
- ✅ 更新开发指南文档,添加完整的登录验证和数据库说明
|
|||
|
|
|
|||
|
|
**技术方案:**
|
|||
|
|
- 使用MySQL LIKE模糊查询(适合单机部署)
|
|||
|
|
- 未来可升级为Elasticsearch全文搜索(支持更大规模)
|
|||
|
|
|
|||
|
|
**优先级:** 中 - 提升用户体验
|
|||
|
|
**完成时间:** 2024-12-26
|
|||
|
|
|
|||
|
|
**相关文档:**
|
|||
|
|
- 完成总结:`消息搜索模块完成总结.md` ✅
|
|||
|
|
- 快速参考:`消息搜索模块快速参考.md` ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块16:消息引用/回复模块 ❌ (未实现)
|
|||
|
|
**功能:**
|
|||
|
|
- 引用消息回复 ❌
|
|||
|
|
- 显示被引用的消息 ❌
|
|||
|
|
- 点击引用跳转到原消息 ❌
|
|||
|
|
|
|||
|
|
**需要实现的类:**
|
|||
|
|
- 扩展现有的消息模型 ❌
|
|||
|
|
|
|||
|
|
**优先级:** 低 - 辅助功能
|
|||
|
|
**预计工作量:** 1-2天
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块17:消息表情回应模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 对消息添加表情回应 ✅
|
|||
|
|
- 查看谁回应了表情 ✅
|
|||
|
|
- 取消表情回应 ✅
|
|||
|
|
- 表情回应统计 ✅
|
|||
|
|
- 切换表情回应 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- POST /api/front/messages/reactions/add - 添加表情回应(需要登录)✅
|
|||
|
|
- DELETE /api/front/messages/reactions/remove - 取消表情回应(需要登录)✅
|
|||
|
|
- GET /api/front/messages/reactions/list - 获取表情回应列表(不需要登录)
|
|||
|
|
- GET /api/front/messages/reactions/statistics - 获取表情回应统计(不需要登录)
|
|||
|
|
- GET /api/front/messages/reactions/users - 获取回应用户列表(不需要登录)
|
|||
|
|
- GET /api/front/messages/reactions/check - 检查回应状态(需要登录)✅
|
|||
|
|
- POST /api/front/messages/reactions/toggle - 切换表情回应(需要登录)✅
|
|||
|
|
- 所有需要登录的接口都会检查用户登录状态
|
|||
|
|
- 未登录用户访问会返回"用户未登录,请先登录"提示
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)** - 支持JPA自动建表
|
|||
|
|
- `MessageReaction` - 消息表情回应实体(eb_message_reaction)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
- **DAO层(Mapper)**
|
|||
|
|
- `MessageReactionDao` - 消息表情回应Mapper接口 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `MessageReactionService` - 消息表情回应服务接口 ✅
|
|||
|
|
- `MessageReactionServiceImpl` - 消息表情回应服务实现 ✅
|
|||
|
|
- ✅ 取消回应使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `MessageReactionController` - 消息表情回应接口 ✅
|
|||
|
|
- ✅ 添加详细的登录验证说明注释
|
|||
|
|
- ✅ 所有需要登录的接口都检查用户登录状态
|
|||
|
|
- ✅ 未登录返回友好的提示信息
|
|||
|
|
|
|||
|
|
**业务流程:**
|
|||
|
|
- 添加表情回应 → 验证登录 → 验证参数 → 检查是否已回应 → 保存记录 ✅
|
|||
|
|
- 取消表情回应 → 验证登录 → 验证参数 → 逻辑删除记录 ✅
|
|||
|
|
- 查看回应列表 → 按表情类型分组统计 → 返回用户列表 ✅
|
|||
|
|
- 切换回应 → 验证登录 → 检查状态 → 添加或取消 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**(支持JPA自动创建)
|
|||
|
|
- `eb_message_reaction` - 消息回应表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**API接口:**
|
|||
|
|
- `POST /api/front/messages/reactions/add` - 添加表情回应 ✅(需要登录)
|
|||
|
|
- `DELETE /api/front/messages/reactions/remove` - 取消表情回应 ✅(需要登录)
|
|||
|
|
- `GET /api/front/messages/reactions/list` - 获取消息的所有表情回应 ✅(不需要登录)
|
|||
|
|
- `GET /api/front/messages/reactions/statistics` - 获取表情回应统计 ✅(不需要登录)
|
|||
|
|
- `GET /api/front/messages/reactions/users` - 获取指定表情的回应用户列表 ✅(不需要登录)
|
|||
|
|
- `GET /api/front/messages/reactions/check` - 检查用户是否已回应 ✅(需要登录)
|
|||
|
|
- `POST /api/front/messages/reactions/toggle` - 切换表情回应 ✅(需要登录)
|
|||
|
|
|
|||
|
|
**支持的表情类型:**
|
|||
|
|
- `like` - 点赞 👍
|
|||
|
|
- `love` - 爱心 ❤️
|
|||
|
|
- `haha` - 哈哈 😄
|
|||
|
|
- `wow` - 惊讶 😮
|
|||
|
|
- `sad` - 难过 😢
|
|||
|
|
- `angry` - 生气 😠
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**MessageReaction实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 回应来源/渠道(如:mobile、web、desktop)
|
|||
|
|
- ext_field2: INT - 回应优先级/权重(用于排序显示)
|
|||
|
|
- ext_field3: VARCHAR(50) - 特殊标记/类型(如:精选回应、热门回应等)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义信息)
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 标准三层架构设计(Controller → Service → DAO)
|
|||
|
|
- 使用JPA注解支持自动建表(ddl-auto: update)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 完整的事务管理(@Transactional)
|
|||
|
|
- 支持逻辑删除(@TableLogic)
|
|||
|
|
- 添加唯一索引防止重复回应(同一用户对同一消息的同一表情只能回应一次)
|
|||
|
|
- 添加数据库索引定义(提升查询性能)
|
|||
|
|
- 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- 完善的参数验证和异常处理
|
|||
|
|
- 支持私聊消息和群组消息
|
|||
|
|
- 提供切换回应功能(一键添加/取消)
|
|||
|
|
- 所有需要登录的接口都有验证机制
|
|||
|
|
- 预留扩展字段便于功能扩展
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 创建MessageReaction实体类(支持JPA自动建表)
|
|||
|
|
- ✅ 创建MessageReactionDao接口
|
|||
|
|
- ✅ 实现MessageReactionService服务层
|
|||
|
|
- ✅ 实现MessageReactionServiceImpl服务实现
|
|||
|
|
- ✅ 实现MessageReactionController接口层
|
|||
|
|
- ✅ 支持添加表情回应
|
|||
|
|
- ✅ 支持取消表情回应
|
|||
|
|
- ✅ 支持查看回应列表
|
|||
|
|
- ✅ 支持表情回应统计
|
|||
|
|
- ✅ 支持查看回应用户列表
|
|||
|
|
- ✅ 支持检查回应状态
|
|||
|
|
- ✅ 支持切换回应功能
|
|||
|
|
- ✅ 添加唯一索引防止重复回应
|
|||
|
|
- ✅ 验证所有代码无编译错误
|
|||
|
|
- ✅ 为MessageReaction实体类添加更新时间字段(update_time)
|
|||
|
|
- ✅ 为MessageReaction实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 为Controller添加详细的登录验证说明
|
|||
|
|
- ✅ 检查并标注哪些接口需要登录
|
|||
|
|
- ✅ 优化未登录提示信息
|
|||
|
|
|
|||
|
|
**优先级:** 低 - 增强互动
|
|||
|
|
**完成时间:** 2024-12-26
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块18:敏感词过滤模块 ❌ (未实现 - 高优先级)
|
|||
|
|
**功能:**
|
|||
|
|
- 敏感词库管理 ❌
|
|||
|
|
- DFA算法过滤 ❌
|
|||
|
|
- 消息内容检测 ❌
|
|||
|
|
|
|||
|
|
**需要实现的类:**
|
|||
|
|
- `SensitiveWordFilter` - 敏感词过滤器 ❌
|
|||
|
|
- `SensitiveWordService` - 敏感词管理 ❌
|
|||
|
|
- `SensitiveWordController` - 敏感词管理接口(后台)❌
|
|||
|
|
|
|||
|
|
**过滤策略:**
|
|||
|
|
- 使用DFA算法构建敏感词树 ❌
|
|||
|
|
- 消息发送前过滤 ❌
|
|||
|
|
- 替换为***或直接拒绝 ❌
|
|||
|
|
|
|||
|
|
**数据库表:**
|
|||
|
|
- `eb_sensitive_word` - 敏感词表 ❌
|
|||
|
|
|
|||
|
|
**优先级:** 🔴 高 - 内容安全必需
|
|||
|
|
**建议:** 可先使用第三方内容审核API (如阿里云、腾讯云)
|
|||
|
|
**预计工作量:** 2-3天
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 模块19:限流防刷模块 ✅ (已完成 - 2024-12-26)
|
|||
|
|
**功能:**
|
|||
|
|
- 消息发送频率限制 ✅
|
|||
|
|
- 接口调用限流 ✅
|
|||
|
|
- 基于用户ID的限流 ✅
|
|||
|
|
- 基于IP地址的限流 ✅
|
|||
|
|
- 全局限流 ✅
|
|||
|
|
- 限流配置管理 ✅
|
|||
|
|
- 限流记录日志 ✅
|
|||
|
|
|
|||
|
|
**登录验证:** ✅
|
|||
|
|
- 所有管理接口都需要管理员登录后才能访问
|
|||
|
|
- 由AdminTokenInterceptor拦截器统一处理
|
|||
|
|
- 未登录管理员访问会返回401 UNAUTHORIZED错误
|
|||
|
|
- 只有管理员才能管理限流配置
|
|||
|
|
- 限流切面通过SecurityUtil.getLoginUserVo()自动获取当前登录用户信息
|
|||
|
|
- 对于需要限流的业务接口,会自动检测用户登录状态(按用户维度限流时)
|
|||
|
|
|
|||
|
|
**已实现的类:**
|
|||
|
|
- **实体类(Entity)** - 支持JPA自动建表
|
|||
|
|
- `RateLimitConfig` - 限流配置实体(eb_rate_limit_config)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- `RateLimitRecord` - 限流记录实体(eb_rate_limit_record)✅
|
|||
|
|
- ✅ 添加逻辑删除字段(is_deleted)
|
|||
|
|
- ✅ 添加更新时间字段(update_time)
|
|||
|
|
- ✅ 添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 使用@UpdateTimestamp自动管理更新时间
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
|
|||
|
|
- **注解(Annotation)**
|
|||
|
|
- `RateLimit` - 限流注解 ✅
|
|||
|
|
|
|||
|
|
- **DAO层(Mapper)**
|
|||
|
|
- `RateLimitConfigDao` - 限流配置Mapper接口 ✅
|
|||
|
|
- `RateLimitRecordDao` - 限流记录Mapper接口 ✅
|
|||
|
|
|
|||
|
|
- **Service层**
|
|||
|
|
- `RateLimitService` - 限流服务接口 ✅
|
|||
|
|
- `RateLimitServiceImpl` - 限流服务实现 ✅
|
|||
|
|
- ✅ 删除配置使用逻辑删除(@TableLogic自动处理)
|
|||
|
|
|
|||
|
|
- **AOP切面**
|
|||
|
|
- `RateLimitAspect` - 限流切面 ✅
|
|||
|
|
- ✅ 自动获取当前登录用户信息(SecurityUtil.getLoginUserVo())
|
|||
|
|
- ✅ 支持按用户、IP、全局三种限流维度
|
|||
|
|
- ✅ 异常情况自动降级(放行),避免影响正常业务
|
|||
|
|
|
|||
|
|
- **Controller层**
|
|||
|
|
- `RateLimitController` - 限流管理接口(后台管理)✅
|
|||
|
|
- 获取限流配置 (GET /api/admin/rate-limit/config/{limitType}) ✅ **需要管理员登录**
|
|||
|
|
- 保存限流配置 (POST /api/admin/rate-limit/config) ✅ **需要管理员登录**
|
|||
|
|
- 更新限流配置 (PUT /api/admin/rate-limit/config) ✅ **需要管理员登录**
|
|||
|
|
- 删除限流配置 (DELETE /api/admin/rate-limit/config/{id}) ✅ **需要管理员登录,使用逻辑删除**
|
|||
|
|
- 初始化默认配置 (POST /api/admin/rate-limit/config/init) ✅ **需要管理员登录**
|
|||
|
|
|
|||
|
|
**限流策略:**
|
|||
|
|
- 使用Redis + 令牌桶算法 ✅
|
|||
|
|
- 弹幕:1秒1条 ✅
|
|||
|
|
- 私聊:1秒3条 ✅
|
|||
|
|
- 图片:1分钟10张 ✅
|
|||
|
|
- 接口调用:1秒10次 ✅
|
|||
|
|
|
|||
|
|
**实现方案:**
|
|||
|
|
- 使用Redis + 令牌桶算法实现 ✅
|
|||
|
|
- 支持按用户、IP、全局三种限流维度 ✅
|
|||
|
|
- AOP切面实现无侵入式限流 ✅
|
|||
|
|
- 支持动态配置限流规则 ✅
|
|||
|
|
|
|||
|
|
**数据库表:**(支持JPA自动创建)
|
|||
|
|
- `eb_rate_limit_config` - 限流配置表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
- `eb_rate_limit_record` - 限流记录表 ✅
|
|||
|
|
- 包含逻辑删除字段(is_deleted)
|
|||
|
|
- 包含更新时间字段(update_time)
|
|||
|
|
- 包含5个扩展字段(ext_field1-5)
|
|||
|
|
- 不创建外键
|
|||
|
|
|
|||
|
|
**API接口:**
|
|||
|
|
- `GET /api/admin/rate-limit/config/{limitType}` - 获取限流配置 ✅ **需要管理员登录**
|
|||
|
|
- `POST /api/admin/rate-limit/config` - 保存限流配置 ✅ **需要管理员登录**
|
|||
|
|
- `PUT /api/admin/rate-limit/config` - 更新限流配置 ✅ **需要管理员登录**
|
|||
|
|
- `DELETE /api/admin/rate-limit/config/{id}` - 删除限流配置 ✅ **需要管理员登录,使用逻辑删除**
|
|||
|
|
- `POST /api/admin/rate-limit/config/init` - 初始化默认配置 ✅ **需要管理员登录**
|
|||
|
|
|
|||
|
|
**扩展字段说明:**
|
|||
|
|
|
|||
|
|
**RateLimitConfig实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 限流策略标签(如:严格、宽松、自定义等)
|
|||
|
|
- ext_field2: INT - 优先级或等级(用于多级限流策略)
|
|||
|
|
- ext_field3: VARCHAR(50) - 特殊标记(如:VIP用户豁免、测试环境等)
|
|||
|
|
- ext_field4: BIGINT - 关联数据ID(用于关联其他业务数据)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储其他自定义配置信息)
|
|||
|
|
|
|||
|
|
**RateLimitRecord实体类扩展字段:**
|
|||
|
|
- ext_field1: VARCHAR(100) - 触发来源/渠道(如:mobile、web、desktop)
|
|||
|
|
- ext_field2: INT - 风险等级(1-低风险,2-中风险,3-高风险)
|
|||
|
|
- ext_field3: VARCHAR(50) - 处理状态(如:已处理、待处理、已忽略等)
|
|||
|
|
- ext_field4: BIGINT - 关联事件ID(用于关联其他安全事件)
|
|||
|
|
- ext_field5: TEXT - JSON扩展数据(存储详细的请求信息、设备指纹等)
|
|||
|
|
|
|||
|
|
**技术亮点:**
|
|||
|
|
- 使用Redis实现分布式限流
|
|||
|
|
- 令牌桶算法保证流量平滑
|
|||
|
|
- AOP切面实现无侵入式限流
|
|||
|
|
- 支持动态配置限流规则
|
|||
|
|
- 完整的限流日志记录
|
|||
|
|
- 异常情况自动降级(放行)
|
|||
|
|
- 支持JPA自动建表(ddl-auto: update)
|
|||
|
|
- 使用MyBatis-Plus进行数据访问,无SQL语句
|
|||
|
|
- 使用逻辑删除保护数据安全
|
|||
|
|
- 预留扩展字段便于功能扩展
|
|||
|
|
- 所有管理接口都需要管理员登录验证
|
|||
|
|
- 自动获取当前登录用户信息进行限流控制
|
|||
|
|
|
|||
|
|
**✅ 已完成改进(2024-12-26):**
|
|||
|
|
- ✅ 创建RateLimitConfig和RateLimitRecord实体类(支持JPA自动建表)
|
|||
|
|
- ✅ 创建@RateLimit注解,支持声明式限流
|
|||
|
|
- ✅ 实现RateLimitService服务层,使用Redis + 令牌桶算法
|
|||
|
|
- ✅ 实现RateLimitAspect切面,拦截带有@RateLimit注解的方法
|
|||
|
|
- ✅ 实现RateLimitController管理接口
|
|||
|
|
- ✅ 支持按用户ID、IP地址、全局三种限流维度
|
|||
|
|
- ✅ 添加数据库索引定义(提升查询性能)
|
|||
|
|
- ✅ 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
|
|||
|
|
- ✅ 完善字段注释和约束(columnDefinition)
|
|||
|
|
- ✅ 验证代码无编译错误
|
|||
|
|
- ✅ 初始化默认限流配置(弹幕、私聊、图片上传、接口调用)
|
|||
|
|
- ✅ 为RateLimitConfig实体类添加更新时间字段(update_time)
|
|||
|
|
- ✅ 为RateLimitConfig实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 为RateLimitRecord实体类添加更新时间字段(update_time)
|
|||
|
|
- ✅ 为RateLimitRecord实体类添加5个扩展字段(ext_field1-5)
|
|||
|
|
- ✅ 使用@TableLogic实现逻辑删除
|
|||
|
|
- ✅ 不创建外键,保持表独立性
|
|||
|
|
- ✅ 为Controller添加详细的登录验证说明注释
|
|||
|
|
- ✅ 检查并标注哪些接口需要管理员登录
|
|||
|
|
- ✅ 优化删除操作说明(使用逻辑删除)
|
|||
|
|
|
|||
|
|
**使用示例:**
|
|||
|
|
```java
|
|||
|
|
// 弹幕限流
|
|||
|
|
@RateLimit(type = "barrage", dimension = "user", message = "弹幕发送过于频繁")
|
|||
|
|
@PostMapping("/barrage")
|
|||
|
|
public CommonResult<String> sendBarrage() {
|
|||
|
|
return CommonResult.success("发送成功");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 私聊消息限流
|
|||
|
|
@RateLimit(type = "private_message", dimension = "user")
|
|||
|
|
@PostMapping("/message")
|
|||
|
|
public CommonResult<String> sendMessage() {
|
|||
|
|
return CommonResult.success("发送成功");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 图片上传限流
|
|||
|
|
@RateLimit(type = "image_upload", dimension = "user")
|
|||
|
|
@PostMapping("/upload")
|
|||
|
|
public CommonResult<String> uploadImage() {
|
|||
|
|
return CommonResult.success("上传成功");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 接口调用限流(按IP)
|
|||
|
|
@RateLimit(type = "api_call", dimension = "ip")
|
|||
|
|
@GetMapping("/list")
|
|||
|
|
public CommonResult<List> getList() {
|
|||
|
|
return CommonResult.success(list);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**优先级:** 🔴 高 - 防止恶意刷屏和攻击
|
|||
|
|
**完成时间:** 2024-12-26
|
|||
|
|
|
|||
|
|
**相关文档:**
|
|||
|
|
- 完成总结:`限流防刷模块完成总结.md` ✅
|
|||
|
|
- 快速参考:`限流防刷模块快速参考.md` ✅
|