清理:优化不需要的文档
This commit is contained in:
parent
b6a838acaa
commit
23ce0923c5
167
0-待完成接入接口.md
167
0-待完成接入接口.md
|
|
@ -1,167 +0,0 @@
|
|||
# 待完成接入接口清单
|
||||
|
||||
> 更新时间: 2024-12-30
|
||||
|
||||
## 📊 总体情况
|
||||
|
||||
| 类别 | 后端接口数 | Android已接入 | 待接入 |
|
||||
|------|-----------|--------------|--------|
|
||||
| 总计 | 131 | ~85 | ~46 |
|
||||
|
||||
---
|
||||
|
||||
## ✅ 已接入模块 (无需处理)
|
||||
|
||||
| 模块 | 接口数 | 状态 |
|
||||
|------|--------|------|
|
||||
| 用户认证 | 4 | ✅ 全部接入 |
|
||||
| 用户信息 | 2 | ✅ 全部接入 |
|
||||
| 直播间 | 6 | ✅ 全部接入 |
|
||||
| 直播弹幕 | 2 | ✅ 全部接入 |
|
||||
| 礼物打赏 | 5 | ✅ 全部接入 |
|
||||
| 私聊会话 | 8 | ✅ 全部接入 |
|
||||
| 好友管理 | 9 | ✅ 全部接入 |
|
||||
| 文件上传 | 2 | ✅ 全部接入 |
|
||||
| 在线状态 | 5 | ✅ 全部接入 |
|
||||
| 离线消息 | 3 | ✅ 全部接入 |
|
||||
| 消息表情回应 | 4 | ✅ 全部接入 |
|
||||
| 关注功能 | 7 | ✅ 全部接入 |
|
||||
| 作品管理 | 13 | ✅ 全部接入 |
|
||||
| 搜索功能 | 9 | ✅ 全部接入 |
|
||||
| 支付集成 | 4 | ✅ 全部接入 |
|
||||
| 通话功能 | 10 | ✅ 全部接入 |
|
||||
|
||||
---
|
||||
|
||||
## ❌ 待接入模块
|
||||
|
||||
### 1. 群组管理 (10个接口) - 🔴 高优先级
|
||||
|
||||
后端已完成,Android端未定义接口。
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 创建群组 | `POST /api/front/groups/create` | 创建新群组 |
|
||||
| 群组列表 | `GET /api/front/groups/list` | 获取我的群组 |
|
||||
| 群组详情 | `GET /api/front/groups/{groupId}` | 获取群组信息 |
|
||||
| 更新群组 | `PUT /api/front/groups/{groupId}` | 修改群组信息 |
|
||||
| 解散群组 | `DELETE /api/front/groups/{groupId}` | 解散群组 |
|
||||
| 添加成员 | `POST /api/front/groups/{groupId}/members` | 邀请成员 |
|
||||
| 移除成员 | `DELETE /api/front/groups/{groupId}/members/{userId}` | 踢出成员 |
|
||||
| 成员列表 | `GET /api/front/groups/{groupId}/members` | 获取成员 |
|
||||
| 退出群组 | `POST /api/front/groups/{groupId}/leave` | 主动退群 |
|
||||
| 转让群主 | `POST /api/front/groups/{groupId}/transfer` | 转让群主 |
|
||||
|
||||
---
|
||||
|
||||
### 2. 群组消息 (4个接口) - 🔴 高优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 发送群消息 | `POST /api/front/groups/{groupId}/messages` | 发送消息 |
|
||||
| 群消息历史 | `GET /api/front/groups/{groupId}/messages` | 获取历史 |
|
||||
| 撤回消息 | `DELETE /api/front/groups/{groupId}/messages/{messageId}` | 撤回消息 |
|
||||
| 转发消息 | `POST /api/front/groups/{groupId}/messages/{messageId}/forward` | 转发消息 |
|
||||
|
||||
---
|
||||
|
||||
### 3. 消息搜索 (3个接口) - 🟡 中优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 搜索会话 | `GET /api/front/messages/search/conversations` | 搜索会话 |
|
||||
| 搜索消息 | `GET /api/front/messages/search/messages` | 搜索消息内容 |
|
||||
| 全局搜索 | `GET /api/front/messages/search/global` | 全局搜索 |
|
||||
|
||||
---
|
||||
|
||||
### 4. 评论功能 (8个接口) - 🟡 中优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 发布评论 | `POST /api/front/works/comment/publish` | 发布评论 |
|
||||
| 评论列表 | `GET /api/front/works/comment/list/{worksId}` | 获取评论 |
|
||||
| 点赞评论 | `POST /api/front/works/comment/like/{commentId}` | 点赞 |
|
||||
| 取消点赞 | `POST /api/front/works/comment/unlike/{commentId}` | 取消点赞 |
|
||||
| 删除评论 | `POST /api/front/works/comment/delete/{commentId}` | 删除评论 |
|
||||
| 回复列表 | `GET /api/front/works/comment/reply/list/{commentId}` | 获取回复 |
|
||||
| 评论详情 | `GET /api/front/works/comment/detail/{commentId}` | 评论详情 |
|
||||
| 检查点赞 | `GET /api/front/works/comment/check-liked/{commentId}` | 检查状态 |
|
||||
|
||||
---
|
||||
|
||||
### 5. 通知推送 (9个接口) - 🟡 中优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 通知列表 | `GET /api/front/notification/list` | 获取通知 |
|
||||
| 未读数量 | `GET /api/front/notification/unread-count` | 未读数 |
|
||||
| 标记已读 | `POST /api/front/notification/mark-read/{id}` | 单条已读 |
|
||||
| 全部已读 | `POST /api/front/notification/mark-all-read` | 全部已读 |
|
||||
| 注册FCM | `POST /api/front/notification/fcm/register` | 注册推送 |
|
||||
| 移除FCM | `POST /api/front/notification/fcm/remove` | 移除推送 |
|
||||
| 删除通知 | `DELETE /api/front/notification/{id}` | 删除单条 |
|
||||
| 清空通知 | `DELETE /api/front/notification/clear-all` | 清空全部 |
|
||||
| 按类型统计 | `GET /api/front/notification/unread-count-by-type` | 分类统计 |
|
||||
|
||||
---
|
||||
|
||||
### 6. 分类管理 (7个接口) - 🟢 低优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 直播间分类 | `GET /api/front/category/live-room` | 直播分类 |
|
||||
| 作品分类 | `GET /api/front/category/work` | 作品分类 |
|
||||
| 分类列表 | `GET /api/front/category/list` | 全部分类 |
|
||||
| 分类详情 | `GET /api/front/category/{id}` | 分类详情 |
|
||||
| 分类统计 | `GET /api/front/category/statistics` | 统计数据 |
|
||||
| 热门分类 | `GET /api/front/category/hot` | 热门分类 |
|
||||
| 子分类 | `GET /api/front/category/{parentId}/children` | 子分类 |
|
||||
|
||||
---
|
||||
|
||||
### 7. 文件上传补充 (3个接口) - 🟢 低优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 通用图片上传 | `POST /api/upload/image` | 通用图片 |
|
||||
| 通用文件上传 | `POST /api/upload/file` | 通用文件 |
|
||||
| 语音上传 | `POST /api/upload/chat/voice` | 语音消息 |
|
||||
|
||||
---
|
||||
|
||||
### 8. 直播间补充 (4个接口) - 🟢 低优先级
|
||||
|
||||
| 接口 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| 开始直播 | `POST /api/front/live/room/{id}/start` | 开播 |
|
||||
| 结束直播 | `POST /api/front/live/room/{id}/stop` | 停播 |
|
||||
| 观众列表 | `GET /api/rooms/{roomId}/viewers` | 观众列表 |
|
||||
| 手动广播人数 | `POST /api/live/online/broadcast/{roomId}` | 广播人数 |
|
||||
|
||||
---
|
||||
|
||||
## 📋 接入优先级建议
|
||||
|
||||
### 第一优先级 (核心社交)
|
||||
1. **群组管理** - 10个接口
|
||||
2. **群组消息** - 4个接口
|
||||
|
||||
### 第二优先级 (内容互动)
|
||||
3. **评论功能** - 8个接口
|
||||
4. **通知推送** - 9个接口
|
||||
|
||||
### 第三优先级 (辅助功能)
|
||||
5. **消息搜索** - 3个接口
|
||||
6. **分类管理** - 7个接口
|
||||
7. **文件上传补充** - 3个接口
|
||||
8. **直播间补充** - 4个接口
|
||||
|
||||
---
|
||||
|
||||
## 📝 备注
|
||||
|
||||
- 后端接口已全部完成 (131个)
|
||||
- Android端已接入约85个接口
|
||||
- 待接入约46个接口
|
||||
- 核心功能已基本完成,待接入的主要是群组和辅助功能
|
||||
2637
Android接口参数详细文档.md
2637
Android接口参数详细文档.md
File diff suppressed because it is too large
Load Diff
|
|
@ -1,340 +0,0 @@
|
|||
# Android应用接口真实调用情况分析报告
|
||||
|
||||
## 📊 分析概述
|
||||
|
||||
本报告详细分析了Android应用中对后端接口的**真实调用情况**,区分了"已定义但未使用"和"已实际调用"的接口。
|
||||
|
||||
**分析时间**: 2024年12月30日
|
||||
**分析范围**: android-app 和 java-backend 全部代码
|
||||
**分析方法**: 代码静态分析 + 接口定义对比
|
||||
|
||||
---
|
||||
|
||||
## ✅ 已真实调用的接口(共 45+ 个)
|
||||
|
||||
### 1. 用户认证模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `POST /api/front/login` | LoginActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/register` | LoginActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/sendCode` | LoginActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/logout` | SettingsPageActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/user` | ProfileActivity.java | ✅ 真实调用 |
|
||||
|
||||
### 2. 直播间模块 (85% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/live/public/rooms` | MainActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/live/rooms` | MainActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/live/public/rooms/{id}` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `DELETE /api/front/live/rooms/{id}` | ProfileActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/live/follow` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/live/room/{id}/start` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/live/room/{id}/stop` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/live/online/broadcast/{roomId}` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/live/public/rooms/{roomId}/messages` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/live/rooms/{roomId}/gift` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
|
||||
**未调用接口**:
|
||||
- ❌ `GET /api/front/live/public/rooms/{roomId}/viewers/count` - 已定义但未使用
|
||||
- ❌ `GET /api/front/live/rooms/{roomId}/viewers` - 已定义但未使用
|
||||
|
||||
### 3. 礼物打赏模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/gift/list` | RoomDetailActivity.java:1190 | ✅ 真实调用 |
|
||||
| `GET /api/front/gift/balance` | RoomDetailActivity.java:1588 | ✅ 真实调用 |
|
||||
| `POST /api/front/gift/send` | RoomDetailActivity.java:1636 | ✅ 真实调用 |
|
||||
| `GET /api/front/gift/recharge/options` | RoomDetailActivity.java:1387 | ✅ 真实调用 |
|
||||
| `POST /api/front/gift/recharge/create` | RoomDetailActivity.java:1460 | ✅ 真实调用 |
|
||||
| `POST /api/front/pay/payment` | RoomDetailActivity.java:1537 | ✅ 真实调用 |
|
||||
|
||||
### 4. 私聊会话模块 (90% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/conversations` | MessagesActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/conversations/search` | MessagesActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/conversations/with/{otherUserId}` | ChatActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/conversations/{id}/read` | ChatActivity.java | ✅ 真实调用 |
|
||||
| `DELETE /api/front/conversations/{id}` | MessagesActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/conversations/{id}/messages` | ChatActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/conversations/{id}/messages` | ChatActivity.java | ✅ 真实调用 |
|
||||
|
||||
**未调用接口**:
|
||||
- ❌ `DELETE /api/front/conversations/messages/{id}` - 已定义但未使用(删除单条消息功能未实现)
|
||||
|
||||
### 5. 好友管理模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/friends` | MyFriendsActivity.java | ✅ 真实调用 |
|
||||
| `DELETE /api/front/friends/{friendId}` | MyFriendsActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/friends/block/{friendId}` | MyFriendsActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/friends/unblock/{friendId}` | BlockedListActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/friends/blocked` | BlockedListActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/users/search` | AddFriendActivity.java:62 | ✅ 真实调用 |
|
||||
| `POST /api/front/friends/request` | AddFriendActivity.java:142 | ✅ 真实调用 |
|
||||
| `GET /api/front/friends/requests` | FriendRequestsActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/friends/requests/{requestId}/handle` | FriendRequestsActivity.java | ✅ 真实调用 |
|
||||
|
||||
### 6. 关注功能模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `POST /api/front/follow/follow` | UserProfileReadOnlyActivity.java:141 | ✅ 真实调用 |
|
||||
| `POST /api/front/follow/unfollow` | UserProfileReadOnlyActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/follow/status/{userId}` | UserProfileReadOnlyActivity.java:105 | ✅ 真实调用 |
|
||||
| `POST /api/front/follow/status/batch` | FishPondActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/follow/following` | FollowingListActivity.java:62 | ✅ 真实调用 |
|
||||
| `GET /api/front/follow/followers` | FansListActivity.java:62 | ✅ 真实调用 |
|
||||
| `GET /api/front/follow/stats` | ProfileActivity.java:684 | ✅ 真实调用 |
|
||||
|
||||
### 7. 作品管理模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `POST /api/front/works/publish` | PublishWorkActivity.java:766 | ✅ 真实调用 |
|
||||
| `POST /api/front/works/update` | EditWorkActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/works/delete/{worksId}` | ProfileActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/works/detail/{worksId}` | WorkDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/works/search` | SearchActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/works/user/{userId}` | ProfileActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/works/like/{worksId}` | WorkDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/works/unlike/{worksId}` | WorkDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/works/collect/{worksId}` | WorkDetailActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/works/uncollect/{worksId}` | WorkDetailActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/works/my/liked` | ProfileActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/works/my/collected` | ProfileActivity.java | ✅ 真实调用 |
|
||||
|
||||
### 8. 文件上传模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `POST /api/front/user/upload/image` | PublishWorkActivity.java:642 | ✅ 真实调用 |
|
||||
| `POST /api/front/upload/work/video` | PublishWorkActivity.java:691 | ✅ 真实调用 |
|
||||
|
||||
### 9. 在线状态模块 (80% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/online/status/{userId}` | ChatActivity.java | ✅ 真实调用 |
|
||||
| `POST /api/front/online/status/batch` | MyFriendsActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/online/room/{roomId}/count` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/online/room/{roomId}/users` | RoomDetailActivity.java | ✅ 真实调用 |
|
||||
|
||||
**未调用接口**:
|
||||
- ❌ `GET /api/front/online/stats` - 已定义但未使用(连接统计功能未实现)
|
||||
|
||||
### 10. 离线消息模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/online/offline/count/{userId}` | MessagesActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/online/offline/messages/{userId}` | MessagesActivity.java | ✅ 真实调用 |
|
||||
| `DELETE /api/front/online/offline/messages/{userId}` | MessagesActivity.java | ✅ 真实调用 |
|
||||
|
||||
### 11. 搜索功能模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/search/live-rooms` | SearchActivity.java:156 | ✅ 真实调用 |
|
||||
| `GET /api/front/search/hot` | SearchActivity.java:257 | ✅ 真实调用 |
|
||||
| `GET /api/front/search/suggestions` | SearchActivity.java:286 | ✅ 真实调用 |
|
||||
| `GET /api/front/search/history` | SearchActivity.java | ✅ 真实调用 |
|
||||
| `DELETE /api/front/search/history` | SearchActivity.java | ✅ 真实调用 |
|
||||
|
||||
### 12. 观看历史模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `POST /api/front/watch/history` | RoomDetailActivity.java:744 | ✅ 真实调用 |
|
||||
|
||||
### 13. 分类管理模块 (100% 调用)
|
||||
|
||||
| 接口 | 调用位置 | 状态 |
|
||||
|------|---------|------|
|
||||
| `GET /api/front/category/live-room` | MainActivity.java | ✅ 真实调用 |
|
||||
| `GET /api/front/category/work` | PublishWorkActivity.java | ✅ 真实调用 |
|
||||
|
||||
---
|
||||
|
||||
## ❌ 已定义但未真实调用的接口(共 8 个)
|
||||
|
||||
### 1. 直播间模块
|
||||
|
||||
```java
|
||||
// ApiService.java 中已定义,但在代码中未找到调用
|
||||
❌ GET /api/front/live/public/rooms/{roomId}/viewers/count
|
||||
- 功能: 获取观众数量
|
||||
- 原因: 使用 WebSocket 实时推送在线人数,不需要轮询
|
||||
|
||||
❌ GET /api/front/live/rooms/{roomId}/viewers
|
||||
- 功能: 获取观众列表
|
||||
- 原因: 功能未实现,UI中没有显示观众列表的入口
|
||||
```
|
||||
|
||||
### 2. 私聊模块
|
||||
|
||||
```java
|
||||
❌ DELETE /api/front/conversations/messages/{id}
|
||||
- 功能: 删除单条消息
|
||||
- 原因: UI中只实现了删除整个会话,未实现删除单条消息
|
||||
```
|
||||
|
||||
### 3. 在线状态模块
|
||||
|
||||
```java
|
||||
❌ GET /api/front/online/stats
|
||||
- 功能: 获取连接统计信息
|
||||
- 原因: 管理功能,前端应用不需要
|
||||
```
|
||||
|
||||
### 4. 消息表情回应模块(整个模块未使用)
|
||||
|
||||
```java
|
||||
❌ POST /api/front/messages/reactions/add
|
||||
❌ DELETE /api/front/messages/reactions/remove
|
||||
❌ GET /api/front/messages/{messageId}/reactions
|
||||
❌ GET /api/front/messages/{messageId}/reactions/users
|
||||
- 功能: 消息表情回应(类似微信的点赞、爱心等)
|
||||
- 原因: 功能未实现,UI设计中没有这个功能
|
||||
```
|
||||
|
||||
### 5. 搜索模块
|
||||
|
||||
```java
|
||||
❌ GET /api/front/search/users
|
||||
- 功能: 全局搜索用户
|
||||
- 原因: 使用了 /api/front/users/search 替代
|
||||
|
||||
❌ GET /api/front/search/works
|
||||
- 功能: 全局搜索作品
|
||||
- 原因: 使用了 /api/front/works/search 替代
|
||||
|
||||
❌ GET /api/front/search/all
|
||||
- 功能: 综合搜索
|
||||
- 原因: 功能未实现,当前只支持分类搜索
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 统计数据
|
||||
|
||||
### 整体调用率
|
||||
|
||||
| 模块 | 已定义接口数 | 真实调用数 | 调用率 |
|
||||
|------|------------|-----------|--------|
|
||||
| 用户认证 | 5 | 5 | 100% |
|
||||
| 直播间 | 12 | 10 | 83% |
|
||||
| 礼物打赏 | 6 | 6 | 100% |
|
||||
| 私聊会话 | 8 | 7 | 88% |
|
||||
| 好友管理 | 9 | 9 | 100% |
|
||||
| 关注功能 | 7 | 7 | 100% |
|
||||
| 作品管理 | 12 | 12 | 100% |
|
||||
| 文件上传 | 2 | 2 | 100% |
|
||||
| 在线状态 | 5 | 4 | 80% |
|
||||
| 离线消息 | 3 | 3 | 100% |
|
||||
| 搜索功能 | 8 | 5 | 63% |
|
||||
| 观看历史 | 1 | 1 | 100% |
|
||||
| 分类管理 | 2 | 2 | 100% |
|
||||
| 消息表情 | 4 | 0 | 0% |
|
||||
| **总计** | **84** | **73** | **87%** |
|
||||
|
||||
### 关键发现
|
||||
|
||||
1. **高调用率模块** (100%):
|
||||
- ✅ 用户认证、礼物打赏、好友管理、关注功能、作品管理
|
||||
- ✅ 文件上传、离线消息、观看历史、分类管理
|
||||
|
||||
2. **中等调用率模块** (80-90%):
|
||||
- ⚠️ 直播间模块 (83%) - 部分接口被 WebSocket 替代
|
||||
- ⚠️ 私聊会话 (88%) - 删除单条消息功能未实现
|
||||
- ⚠️ 在线状态 (80%) - 统计接口未使用
|
||||
|
||||
3. **低调用率模块** (< 80%):
|
||||
- ⚠️ 搜索功能 (63%) - 部分接口有替代方案
|
||||
- ❌ 消息表情 (0%) - 功能完全未实现
|
||||
|
||||
---
|
||||
|
||||
## 🔍 WebSocket 实时通信使用情况
|
||||
|
||||
### 已实现的 WebSocket 连接
|
||||
|
||||
| WebSocket | 用途 | 调用位置 | 状态 |
|
||||
|-----------|------|---------|------|
|
||||
| `ws://*/ws/live/chat/{roomId}` | 直播间弹幕 | RoomDetailActivity.java:connectChatWebSocket() | ✅ 真实使用 |
|
||||
| `ws://*/ws/live/{roomId}` | 在线人数推送 | RoomDetailActivity.java:connectOnlineCountWebSocket() | ✅ 真实使用 |
|
||||
| `ws://*/ws/private/chat` | 私聊消息 | ChatActivity.java:connectWebSocket() | ✅ 真实使用 |
|
||||
| `ws://*/ws/online/status` | 在线状态推送 | MyFriendsActivity.java:connectWebSocket() | ✅ 真实使用 |
|
||||
|
||||
**WebSocket 特性**:
|
||||
- ✅ 心跳检测机制 (30秒间隔)
|
||||
- ✅ 自动重连机制 (最多5次)
|
||||
- ✅ 连接状态管理
|
||||
- ✅ 错误处理和降级
|
||||
|
||||
---
|
||||
|
||||
## 💡 结论与建议
|
||||
|
||||
### 结论
|
||||
|
||||
1. **整体调用率很高**: 87% 的接口都在真实使用中
|
||||
2. **核心功能完整**: 用户认证、直播、私聊、好友、关注、作品等核心模块100%调用
|
||||
3. **WebSocket 替代 HTTP**: 部分实时功能使用 WebSocket 替代了 HTTP 轮询
|
||||
4. **未使用接口有原因**: 大部分未使用接口是因为功能未实现或有更好的替代方案
|
||||
|
||||
### 建议
|
||||
|
||||
#### 1. 可以删除的接口定义(降低维护成本)
|
||||
|
||||
```java
|
||||
// ApiService.java 中可以删除以下接口定义
|
||||
- GET /api/front/live/public/rooms/{roomId}/viewers/count (被 WebSocket 替代)
|
||||
- GET /api/front/online/stats (前端不需要)
|
||||
- 整个消息表情回应模块 (功能未实现)
|
||||
```
|
||||
|
||||
#### 2. 建议实现的功能
|
||||
|
||||
```java
|
||||
// 提升用户体验的功能
|
||||
✨ DELETE /api/front/conversations/messages/{id}
|
||||
- 实现删除单条消息功能
|
||||
- 增加长按消息的操作菜单
|
||||
|
||||
✨ GET /api/front/search/all
|
||||
- 实现综合搜索功能
|
||||
- 一次搜索返回用户、直播间、作品等多种结果
|
||||
```
|
||||
|
||||
#### 3. 代码优化建议
|
||||
|
||||
```java
|
||||
// 统一搜索接口
|
||||
- 将 /api/front/users/search 和 /api/front/search/users 合并
|
||||
- 将 /api/front/works/search 和 /api/front/search/works 合并
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 验证方法
|
||||
|
||||
本报告通过以下方法验证接口调用情况:
|
||||
|
||||
1. **静态代码分析**: 搜索 `apiService.` 关键字,找到所有 Retrofit 接口调用
|
||||
2. **文件定位**: 记录每个接口调用的具体文件和行号
|
||||
3. **对比分析**: 将 ApiService.java 中定义的接口与实际调用进行对比
|
||||
4. **WebSocket 分析**: 检查 WebSocket 连接代码,确认实时通信功能
|
||||
5. **交叉验证**: 检查后端 Controller 代码,确认接口实现情况
|
||||
|
||||
---
|
||||
|
||||
**报告生成时间**: 2024-12-30
|
||||
**分析工具**: 代码静态分析 + 人工审查
|
||||
**可信度**: ⭐⭐⭐⭐⭐ (非常高)
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
# Android端点赞功能实现总结
|
||||
|
||||
## ✅ 已完成的修改
|
||||
|
||||
### 1. API接口定义 (ApiService.java)
|
||||
- ✅ 添加了5个点赞相关的API方法:
|
||||
- `likeRoom()` - 点赞直播间
|
||||
- `getRoomLikeCount()` - 获取直播间点赞数
|
||||
- `getMyRoomLikeCount()` - 获取我的点赞次数
|
||||
- `getMyLikedRooms()` - 获取我点赞过的直播间列表
|
||||
- `getStreamerTotalLikes()` - 获取主播总获赞数
|
||||
|
||||
### 2. 首页直播间卡片 (item_room_waterfall.xml)
|
||||
- ✅ 修改点赞图标为粉色爱心 (ic_like_filled_24)
|
||||
- ✅ 调整点赞数颜色为 #666666
|
||||
|
||||
### 3. 首页适配器 (WaterfallRoomsAdapter.java)
|
||||
- ✅ 修改bind方法,使用真实的点赞数据
|
||||
- ✅ 从 `room.getLikeCount()` 获取点赞数
|
||||
- ✅ 如果没有点赞数,显示0
|
||||
|
||||
### 4. 直播间详情页布局 (activity_room_detail.xml)
|
||||
- ✅ 在聊天输入框旁边添加点赞按钮
|
||||
- ✅ 添加点赞数显示TextView
|
||||
|
||||
### 5. 直播间详情页逻辑 (RoomDetailActivity.java)
|
||||
- ✅ 添加 `loadLikeCount()` 方法 - 加载点赞数
|
||||
- ✅ 添加 `likeRoom()` 方法 - 点赞直播间
|
||||
- ✅ 实现点赞按钮点击事件
|
||||
- ✅ 实现点赞动画效果(缩放动画)
|
||||
- ✅ 点赞成功后更新点赞数
|
||||
- ✅ 显示点赞成功提示
|
||||
|
||||
## 🔄 还需要完成的功能
|
||||
|
||||
### 1. 个人中心布局调整 (ProfileActivity)
|
||||
需要修改 `activity_profile.xml`,将按钮调整为两行:
|
||||
- 第一行:我的关注、我的点赞、观看历史
|
||||
- 第二行:公园勋章、我的挚友
|
||||
|
||||
### 2. 创建"我的点赞"页面
|
||||
需要创建以下文件:
|
||||
- `LikedRoomsActivity.java` - 我的点赞页面
|
||||
- `activity_liked_rooms.xml` - 布局文件
|
||||
- `LikedRoomsAdapter.java` - 适配器(可选,可复用现有适配器)
|
||||
|
||||
### 3. 主播中心显示获赞数 (StreamerCenterActivity)
|
||||
需要修改:
|
||||
- `activity_streamer_center.xml` - 添加获赞数显示
|
||||
- `StreamerCenterActivity.java` - 加载获赞数
|
||||
|
||||
## 📝 实现细节
|
||||
|
||||
### 点赞功能特点
|
||||
1. **无限次点赞**:用户可以对同一个直播间无限次点赞
|
||||
2. **需要登录**:点赞功能需要用户登录
|
||||
3. **实时更新**:点赞后立即更新显示的点赞数
|
||||
4. **动画效果**:点击点赞按钮有缩放动画
|
||||
5. **防刷限制**:后端有限流保护(100次/分钟)
|
||||
|
||||
### 数据流程
|
||||
1. 用户点击点赞按钮
|
||||
2. 检查登录状态
|
||||
3. 播放动画效果
|
||||
4. 调用后端API `/api/front/live/like/room/{roomId}`
|
||||
5. 后端更新数据库
|
||||
6. 返回最新的点赞数
|
||||
7. 更新UI显示
|
||||
|
||||
### API调用示例
|
||||
|
||||
```java
|
||||
// 点赞直播间
|
||||
Map<String, Object> request = new HashMap<>();
|
||||
request.put("count", 1);
|
||||
|
||||
ApiClient.getService(this)
|
||||
.likeRoom(roomId, request)
|
||||
.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 && response.body().isOk()) {
|
||||
Map<String, Object> data = response.body().getData();
|
||||
int likeCount = ((Number) data.get("likeCount")).intValue();
|
||||
// 更新UI
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
|
||||
// 处理错误
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 🎯 下一步建议
|
||||
|
||||
### 优先级1:完成个人中心布局调整
|
||||
这是用户最常访问的页面,建议优先完成。
|
||||
|
||||
### 优先级2:创建"我的点赞"页面
|
||||
可以参考 `WatchHistoryActivity` 的实现,复用现有的适配器。
|
||||
|
||||
### 优先级3:主播中心显示获赞数
|
||||
这个功能对主播很重要,可以激励主播创作更好的内容。
|
||||
|
||||
## 🐛 可能的问题和解决方案
|
||||
|
||||
### 问题1:点赞数不更新
|
||||
**原因**:后端返回的数据格式不对
|
||||
**解决**:检查后端API返回的JSON格式,确保包含 `likeCount` 字段
|
||||
|
||||
### 问题2:点赞按钮点击无反应
|
||||
**原因**:未登录或网络错误
|
||||
**解决**:检查登录状态,查看Logcat日志
|
||||
|
||||
### 问题3:首页卡片不显示点赞数
|
||||
**原因**:Room对象中的likeCount为null
|
||||
**解决**:后端确保返回likeCount字段,前端做null检查
|
||||
|
||||
## 📊 测试清单
|
||||
|
||||
- [x] 首页卡片显示点赞数
|
||||
- [x] 直播间详情页有点赞按钮
|
||||
- [x] 点击点赞按钮有动画
|
||||
- [x] 点赞成功后数字更新
|
||||
- [x] 未登录时提示登录
|
||||
- [ ] 个人中心布局调整
|
||||
- [ ] "我的点赞"页面
|
||||
- [ ] 主播中心显示获赞数
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
目前已完成Android端点赞功能的核心部分:
|
||||
1. ✅ API接口定义
|
||||
2. ✅ 首页卡片显示点赞数
|
||||
3. ✅ 直播间详情页点赞功能
|
||||
4. ✅ 点赞动画和交互
|
||||
|
||||
剩余的工作主要是UI调整和新页面创建,这些都是相对简单的任务。
|
||||
|
||||
所有代码都已经过测试和优化,可以直接编译运行!
|
||||
116
App功能清单.md
116
App功能清单.md
|
|
@ -1,116 +0,0 @@
|
|||
# 直播平台功能清单
|
||||
|
||||
---
|
||||
|
||||
# 一、Android App 功能
|
||||
|
||||
## 1. 用户系统
|
||||
- 登录/注册(手机号验证码)
|
||||
- 个人中心(头像、昵称、签名、性别、生日)
|
||||
- 编辑个人资料
|
||||
- 查看他人主页(显示关注/粉丝/获赞数)
|
||||
- 设置页面
|
||||
|
||||
## 2. 直播功能
|
||||
- 首页直播间列表(瀑布流展示)
|
||||
- 直播间详情页(观看直播、弹幕、礼物)
|
||||
- 搜索主播/直播间
|
||||
- 手机开播(RTMP推流)
|
||||
- 直播间点赞
|
||||
|
||||
## 3. 主播系统
|
||||
- 主播认证申请
|
||||
- 主播中心(粉丝数、获赞数、收益统计)
|
||||
- 创建/管理粉丝团
|
||||
- 粉丝团成员管理
|
||||
|
||||
## 4. 社交功能
|
||||
- 关注/取消关注
|
||||
- 关注列表、粉丝列表
|
||||
- 好友列表、添加好友
|
||||
- 点赞的直播间列表
|
||||
|
||||
## 5. 消息系统
|
||||
- 消息列表、私信聊天
|
||||
- 系统通知、通知设置
|
||||
|
||||
## 6. 通话功能
|
||||
- 语音/视频通话
|
||||
- 来电界面、通话记录
|
||||
|
||||
## 7. 群组功能
|
||||
- 群组列表、创建群组
|
||||
- 群组详情、群聊天
|
||||
|
||||
## 8. 钱包系统
|
||||
- 钱包余额、充值、交易记录
|
||||
|
||||
## 9. 娱乐功能
|
||||
- 缘池(鱼塘匹配)、许愿树
|
||||
- 语音匹配、心动信号
|
||||
- 动态社区、在线交友
|
||||
- 游戏大厅(KTV、你画我猜、桌游等)
|
||||
|
||||
## 10. 作品系统
|
||||
- 发布作品、作品详情、观看历史
|
||||
|
||||
---
|
||||
|
||||
# 二、管理后台功能
|
||||
|
||||
## 1. 用户管理
|
||||
- 用户列表(查看、编辑、禁用)
|
||||
- 用户等级管理
|
||||
- 用户分组管理
|
||||
- 用户签到管理
|
||||
- 用户聊天记录
|
||||
|
||||
## 2. 直播管理
|
||||
- 直播间列表(查看、关闭、封禁)
|
||||
- 直播间分类管理
|
||||
- 直播间背景管理
|
||||
- 实时监控
|
||||
|
||||
## 3. 主播管理
|
||||
- 主播列表(审核、管理)
|
||||
- 主播认证审核
|
||||
- 主播等级管理
|
||||
- 主播家族管理
|
||||
|
||||
## 4. 礼物系统
|
||||
- 礼物管理(添加、编辑、上下架)
|
||||
- 礼物打赏记录
|
||||
- 充值套餐配置
|
||||
- 礼物配置
|
||||
|
||||
## 5. 财务管理
|
||||
- 充值订单管理
|
||||
- 提现审核(待审核、已审核)
|
||||
- 收益明细(礼物、钻石、金币)
|
||||
- 佣金管理
|
||||
- 财务统计报表
|
||||
|
||||
## 6. 社交管理
|
||||
- 好友关系管理
|
||||
- 关注记录管理
|
||||
- 群组管理
|
||||
- 粉丝团管理
|
||||
|
||||
## 7. 娱乐功能管理
|
||||
- 许愿树管理(许愿、节日、背景)
|
||||
- 缘池管理(话题、匹配配置)
|
||||
- CP配对管理
|
||||
|
||||
## 8. 系统设置
|
||||
- 管理员权限管理
|
||||
- 系统消息管理
|
||||
- 短信配置
|
||||
- 版本管理
|
||||
- 黑名单管理
|
||||
- 验证码管理
|
||||
|
||||
## 9. 数据统计
|
||||
- 仪表盘(概览数据)
|
||||
- 用户统计
|
||||
- 收益统计
|
||||
- 通话统计
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
-- ========================================
|
||||
-- 最终修复:直播管理404问题
|
||||
-- ========================================
|
||||
|
||||
-- 问题根源:
|
||||
-- 礼物打赏菜单(id=823)的component是 /liveManage/gift/records/index
|
||||
-- 这与前端独立的 giftManageRouter (/gift) 冲突
|
||||
|
||||
-- 解决方案:将礼物打赏从直播管理中移除
|
||||
|
||||
-- 步骤1:隐藏直播管理下的礼物打赏菜单
|
||||
UPDATE eb_system_menu
|
||||
SET is_show = 0
|
||||
WHERE id = 823
|
||||
AND pid = 675
|
||||
AND name = '礼物打赏';
|
||||
|
||||
-- 步骤2:确保直播管理菜单本身是显示的
|
||||
UPDATE eb_system_menu
|
||||
SET is_show = 1
|
||||
WHERE id = 675
|
||||
AND name = '直播管理';
|
||||
|
||||
-- 步骤3:确保所有直播管理的子菜单都是显示的(除了礼物打赏)
|
||||
UPDATE eb_system_menu
|
||||
SET is_show = 1
|
||||
WHERE pid = 675
|
||||
AND id != 823;
|
||||
|
||||
-- 验证修复结果
|
||||
SELECT
|
||||
'=== 直播管理菜单 ===' as section,
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort,
|
||||
CASE WHEN is_show = 1 THEN '✓ 显示' ELSE '✗ 隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE id = 675 OR pid = 675
|
||||
ORDER BY pid, sort;
|
||||
|
||||
-- 检查是否还有其他冲突
|
||||
SELECT
|
||||
'=== 可能的路径冲突 ===' as section,
|
||||
component,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(name SEPARATOR ' | ') as menu_names
|
||||
FROM eb_system_menu
|
||||
WHERE is_show = 1
|
||||
AND component LIKE '/liveManage%'
|
||||
GROUP BY component
|
||||
HAVING count > 1;
|
||||
161
QUICK_FIX.md
161
QUICK_FIX.md
|
|
@ -1,161 +0,0 @@
|
|||
# 关注功能快速修复 - 立即执行
|
||||
|
||||
## 问题
|
||||
数据库缺少 `eb_follow_record` 表,导致关注功能无法工作。
|
||||
|
||||
## 解决方案
|
||||
在服务器上直接执行SQL创建表。
|
||||
|
||||
## 立即执行以下命令
|
||||
|
||||
### 步骤1:SSH连接到服务器
|
||||
```bash
|
||||
ssh root@1.15.149.240
|
||||
```
|
||||
|
||||
### 步骤2:连接MySQL
|
||||
```bash
|
||||
mysql -u root -p
|
||||
```
|
||||
输入密码后,执行:
|
||||
```sql
|
||||
use crmeb;
|
||||
```
|
||||
|
||||
### 步骤3:创建表(复制整段执行)
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS `eb_follow_record` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`follower_id` int(11) NOT NULL COMMENT '关注者用户ID',
|
||||
`follower_nickname` varchar(50) DEFAULT NULL COMMENT '关注者昵称',
|
||||
`follower_phone` varchar(20) DEFAULT NULL COMMENT '关注者手机号',
|
||||
`followed_id` int(11) NOT NULL COMMENT '被关注者用户ID',
|
||||
`followed_nickname` varchar(50) DEFAULT NULL COMMENT '被关注者昵称',
|
||||
`followed_phone` varchar(20) DEFAULT NULL COMMENT '被关注者手机号',
|
||||
`follow_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '关注状态:1-已关注 0-已取消',
|
||||
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0-未删除 1-已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`ext_field1` varchar(100) DEFAULT NULL COMMENT '扩展字段1',
|
||||
`ext_field2` int(11) DEFAULT NULL COMMENT '扩展字段2',
|
||||
`ext_field3` varchar(200) DEFAULT NULL COMMENT '扩展字段3',
|
||||
`ext_field4` bigint(20) DEFAULT NULL COMMENT '扩展字段4',
|
||||
`ext_field5` text COMMENT '扩展字段5',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_follower_followed` (`follower_id`,`followed_id`),
|
||||
KEY `idx_follower_id` (`follower_id`),
|
||||
KEY `idx_followed_id` (`followed_id`),
|
||||
KEY `idx_follow_status` (`follow_status`),
|
||||
KEY `idx_is_deleted` (`is_deleted`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关注记录表';
|
||||
```
|
||||
|
||||
### 步骤4:验证表已创建
|
||||
```sql
|
||||
SHOW TABLES LIKE 'eb_follow_record';
|
||||
DESC eb_follow_record;
|
||||
```
|
||||
|
||||
应该看到表结构信息。
|
||||
|
||||
### 步骤5:退出MySQL
|
||||
```sql
|
||||
exit;
|
||||
```
|
||||
|
||||
### 步骤6:重启后端服务
|
||||
```bash
|
||||
cd /root/zhibo/Zhibo/zhibo-h
|
||||
./restart.sh
|
||||
```
|
||||
|
||||
等待服务重启完成(约30秒)。
|
||||
|
||||
### 步骤7:测试关注功能
|
||||
|
||||
1. 打开Android应用
|
||||
2. 登录账号
|
||||
3. 进入任意直播间
|
||||
4. 点击"关注"按钮
|
||||
5. 应该看到"已关注主播"提示
|
||||
6. 退出直播间,重新进入
|
||||
7. 按钮应显示"已关注"状态
|
||||
|
||||
### 步骤8:验证数据库记录
|
||||
```bash
|
||||
mysql -u root -p
|
||||
use crmeb;
|
||||
```
|
||||
|
||||
```sql
|
||||
-- 查看最新的关注记录
|
||||
SELECT
|
||||
fr.id,
|
||||
fr.follower_id,
|
||||
u1.nickname as follower_name,
|
||||
fr.followed_id,
|
||||
u2.nickname as followed_name,
|
||||
fr.follow_status,
|
||||
fr.create_time
|
||||
FROM eb_follow_record fr
|
||||
LEFT JOIN eb_user u1 ON fr.follower_id = u1.uid
|
||||
LEFT JOIN eb_user u2 ON fr.followed_id = u2.uid
|
||||
ORDER BY fr.create_time DESC
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
应该能看到刚才的关注记录。
|
||||
|
||||
## 如果还是不行
|
||||
|
||||
请提供以下信息:
|
||||
|
||||
1. **表是否创建成功?**
|
||||
```sql
|
||||
SHOW CREATE TABLE eb_follow_record;
|
||||
```
|
||||
|
||||
2. **Android日志**
|
||||
```bash
|
||||
adb logcat | grep "RoomDetail"
|
||||
```
|
||||
查找包含 "关注" 或 "follow" 的日志行
|
||||
|
||||
3. **后端日志**
|
||||
```bash
|
||||
tail -100 /root/zhibo/Zhibo/zhibo-h/crmeb-admin/logs/info.log | grep -i follow
|
||||
```
|
||||
|
||||
4. **测试API**
|
||||
```bash
|
||||
# 先登录获取token
|
||||
curl -X POST http://1.15.149.240:30001/api/front/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"phone":"你的手机号","password":"你的密码"}'
|
||||
|
||||
# 使用返回的token测试关注接口
|
||||
curl -X POST http://1.15.149.240:30001/api/front/follow/follow \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer 你的token" \
|
||||
-d '{"userId":主播的用户ID}'
|
||||
```
|
||||
|
||||
## 常见错误
|
||||
|
||||
### 错误1:Table already exists
|
||||
说明表已经存在,跳过创建步骤,直接重启服务。
|
||||
|
||||
### 错误2:Access denied
|
||||
检查MySQL密码是否正确。
|
||||
|
||||
### 错误3:Unknown database 'crmeb'
|
||||
数据库名可能不同,先查看:
|
||||
```sql
|
||||
SHOW DATABASES;
|
||||
```
|
||||
找到正确的数据库名。
|
||||
|
||||
## 完成!
|
||||
|
||||
执行完以上步骤后,关注功能应该可以正常工作了。
|
||||
|
|
@ -1,364 +0,0 @@
|
|||
# WebSocket 增强功能实现完成 ✅
|
||||
|
||||
## 🎉 完成概述
|
||||
|
||||
已成功为直播IM系统实现了三个核心增强功能:
|
||||
1. ✅ **心跳检测机制**
|
||||
2. ✅ **在线状态管理**
|
||||
3. ✅ **离线消息处理**
|
||||
|
||||
---
|
||||
|
||||
## 📁 新增文件清单
|
||||
|
||||
### 核心服务类(6个文件)
|
||||
|
||||
1. **在线状态管理**
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/service/OnlineStatusService.java`
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/service/impl/OnlineStatusServiceImpl.java`
|
||||
|
||||
2. **离线消息管理**
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/service/OfflineMessageService.java`
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/service/impl/OfflineMessageServiceImpl.java`
|
||||
|
||||
3. **心跳检测**
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/websocket/HeartbeatScheduler.java`
|
||||
|
||||
4. **REST API控制器**
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/controller/OnlineStatusController.java`
|
||||
|
||||
### 更新的文件(2个)
|
||||
|
||||
5. **WebSocket处理器**
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/websocket/LiveChatHandler.java` ✏️
|
||||
- `crmeb-front/src/main/java/com/zbkj/front/websocket/PrivateChatHandler.java` ✏️
|
||||
|
||||
### 文档和测试(3个)
|
||||
|
||||
6. **文档**
|
||||
- `WebSocket增强功能实现说明.md` - 详细的功能说明文档
|
||||
- `WebSocket增强功能-README.md` - 本文件
|
||||
- `测试WebSocket增强功能.html` - 可视化测试工具
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 确保Redis运行
|
||||
```bash
|
||||
# 检查Redis是否运行
|
||||
redis-cli ping
|
||||
# 应该返回: PONG
|
||||
```
|
||||
|
||||
### 2. 启动后端服务
|
||||
```bash
|
||||
cd Zhibo/zhibo-h/crmeb-front
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
### 3. 测试功能
|
||||
|
||||
#### 方式1: 使用HTML测试工具(推荐)
|
||||
1. 用浏览器打开 `测试WebSocket增强功能.html`
|
||||
2. 点击"连接直播间"或"连接私聊"
|
||||
3. 观察心跳消息和在线状态
|
||||
|
||||
#### 方式2: 使用WebSocket客户端
|
||||
```javascript
|
||||
// 连接直播间(带userId参数)
|
||||
const ws = new WebSocket('ws://localhost:8081/ws/live/chat/101?userId=123');
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
const data = JSON.parse(event.data);
|
||||
console.log('收到消息:', data);
|
||||
|
||||
// 自动响应心跳
|
||||
if (data.type === 'heartbeat') {
|
||||
ws.send(JSON.stringify({ type: 'heartbeat_response' }));
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
#### 方式3: 测试REST API
|
||||
```bash
|
||||
# 检查用户在线状态
|
||||
curl http://localhost:8081/api/front/online/status/123
|
||||
|
||||
# 获取房间在线人数
|
||||
curl http://localhost:8081/api/front/online/room/101/count
|
||||
|
||||
# 获取离线消息数量
|
||||
curl http://localhost:8081/api/front/online/offline/count/456
|
||||
|
||||
# 获取连接统计
|
||||
curl http://localhost:8081/api/front/online/stats
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 核心功能说明
|
||||
|
||||
### 1. 心跳检测 💓
|
||||
|
||||
**工作机制:**
|
||||
- 服务器每30秒向所有连接发送心跳消息
|
||||
- 客户端收到后应立即响应
|
||||
- 90秒无响应则自动断开连接
|
||||
- 每60秒检查一次超时连接
|
||||
|
||||
**心跳消息格式:**
|
||||
```json
|
||||
// 服务器发送
|
||||
{
|
||||
"type": "heartbeat",
|
||||
"timestamp": 1234567890123
|
||||
}
|
||||
|
||||
// 客户端响应
|
||||
{
|
||||
"type": "heartbeat_response"
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 在线状态管理 👥
|
||||
|
||||
**功能特性:**
|
||||
- 实时追踪用户在线/离线状态
|
||||
- 记录用户最后活跃时间
|
||||
- 管理直播间在线用户列表
|
||||
- 支持批量查询在线状态
|
||||
- 自动过期机制(5分钟无活动)
|
||||
|
||||
**Redis数据结构:**
|
||||
```
|
||||
user:online:{userId} = "1" # 在线标记
|
||||
user:last_active:{userId} = timestamp # 最后活跃时间
|
||||
room:online:{roomId} = Set<userId> # 房间在线用户
|
||||
```
|
||||
|
||||
### 3. 离线消息处理 📬
|
||||
|
||||
**功能特性:**
|
||||
- 自动保存离线消息到Redis
|
||||
- 用户上线时自动推送
|
||||
- 最多保存100条消息
|
||||
- 消息保留7天
|
||||
- 推送后自动清除
|
||||
|
||||
**工作流程:**
|
||||
1. 用户A发送消息给用户B
|
||||
2. 检查用户B是否在线
|
||||
3. 在线 → 直接推送
|
||||
4. 离线 → 保存到Redis
|
||||
5. 用户B上线 → 自动推送所有离线消息
|
||||
6. 推送完成 → 清除离线消息
|
||||
|
||||
---
|
||||
|
||||
## 📊 REST API 接口
|
||||
|
||||
### 基础URL
|
||||
```
|
||||
http://localhost:8081/api/front/online
|
||||
```
|
||||
|
||||
### 接口列表
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/status/{userId}` | 检查用户在线状态 |
|
||||
| POST | `/status/batch` | 批量检查在线状态 |
|
||||
| GET | `/room/{roomId}/users` | 获取房间在线用户 |
|
||||
| GET | `/room/{roomId}/count` | 获取房间在线人数 |
|
||||
| GET | `/offline/count/{userId}` | 获取离线消息数量 |
|
||||
| GET | `/offline/messages/{userId}` | 获取离线消息 |
|
||||
| DELETE | `/offline/messages/{userId}` | 清除离线消息 |
|
||||
| GET | `/stats` | 获取连接统计 |
|
||||
|
||||
详细的API文档请查看 `WebSocket增强功能实现说明.md`
|
||||
|
||||
---
|
||||
|
||||
## 🔍 监控和调试
|
||||
|
||||
### 查看日志
|
||||
```bash
|
||||
# 查看心跳日志
|
||||
grep "Heartbeat" logs/application.log
|
||||
|
||||
# 查看在线状态日志
|
||||
grep "OnlineStatus" logs/application.log
|
||||
|
||||
# 查看离线消息日志
|
||||
grep "OfflineMessage" logs/application.log
|
||||
```
|
||||
|
||||
### Redis监控
|
||||
```bash
|
||||
# 查看在线用户数
|
||||
redis-cli KEYS "user:online:*" | wc -l
|
||||
|
||||
# 查看某个用户的在线状态
|
||||
redis-cli GET "user:online:123"
|
||||
|
||||
# 查看房间在线用户
|
||||
redis-cli SMEMBERS "room:online:101"
|
||||
|
||||
# 查看离线消息
|
||||
redis-cli LRANGE "offline:msg:456" 0 -1
|
||||
```
|
||||
|
||||
### 性能指标
|
||||
```bash
|
||||
# 获取活跃连接数
|
||||
curl http://localhost:8081/api/front/online/stats
|
||||
|
||||
# 获取房间在线人数
|
||||
curl http://localhost:8081/api/front/online/room/101/count
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 配置说明
|
||||
|
||||
### 心跳配置
|
||||
在 `HeartbeatScheduler.java` 中可调整:
|
||||
```java
|
||||
private static final long HEARTBEAT_TIMEOUT = 90000; // 90秒超时
|
||||
private static final long HEARTBEAT_INTERVAL = 30000; // 30秒间隔
|
||||
```
|
||||
|
||||
### 在线状态配置
|
||||
在 `OnlineStatusServiceImpl.java` 中可调整:
|
||||
```java
|
||||
private static final long ONLINE_EXPIRE_SECONDS = 300; // 5分钟过期
|
||||
```
|
||||
|
||||
### 离线消息配置
|
||||
在 `OfflineMessageServiceImpl.java` 中可调整:
|
||||
```java
|
||||
private static final int MAX_OFFLINE_MESSAGES = 100; // 最多100条
|
||||
private static final long OFFLINE_MESSAGE_EXPIRE_SECONDS = 7 * 24 * 3600; // 7天
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 常见问题
|
||||
|
||||
### Q1: 心跳消息没有发送?
|
||||
**A:** 检查以下几点:
|
||||
1. 确保启动类有 `@EnableScheduling` 注解
|
||||
2. 检查 `HeartbeatScheduler` 是否被Spring扫描到
|
||||
3. 查看日志是否有错误信息
|
||||
|
||||
### Q2: 在线状态不准确?
|
||||
**A:** 可能原因:
|
||||
1. Redis连接失败 - 检查Redis是否运行
|
||||
2. 过期时间太短 - 调整 `ONLINE_EXPIRE_SECONDS`
|
||||
3. 没有正确响应心跳 - 检查客户端代码
|
||||
|
||||
### Q3: 离线消息没有推送?
|
||||
**A:** 检查:
|
||||
1. 用户连接时是否调用了推送逻辑
|
||||
2. Redis中是否有离线消息
|
||||
3. 查看日志中的错误信息
|
||||
|
||||
### Q4: WebSocket连接失败?
|
||||
**A:** 确认:
|
||||
1. 后端服务是否启动
|
||||
2. 端口8081是否被占用
|
||||
3. 防火墙是否允许WebSocket连接
|
||||
4. 连接URL是否正确(需要带userId参数)
|
||||
|
||||
---
|
||||
|
||||
## 📈 性能优化建议
|
||||
|
||||
### 1. Redis优化
|
||||
- 使用Redis集群提高可用性
|
||||
- 配置合适的过期策略
|
||||
- 定期清理过期数据
|
||||
|
||||
### 2. 连接管理
|
||||
- 限制单个用户的最大连接数
|
||||
- 实现连接池管理
|
||||
- 监控连接数量和资源使用
|
||||
|
||||
### 3. 消息处理
|
||||
- 使用消息队列处理高并发
|
||||
- 实现消息批量处理
|
||||
- 优化消息序列化
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
1. **详细功能说明**: `WebSocket增强功能实现说明.md`
|
||||
- 完整的功能介绍
|
||||
- API文档
|
||||
- 配置说明
|
||||
- 监控建议
|
||||
|
||||
2. **开发指南**: `直播IM系统开发指南.md`
|
||||
- 系统架构
|
||||
- 模块说明
|
||||
- 开发规范
|
||||
|
||||
3. **测试工具**: `测试WebSocket增强功能.html`
|
||||
- 可视化测试界面
|
||||
- 实时日志查看
|
||||
- API测试功能
|
||||
|
||||
---
|
||||
|
||||
## ✅ 功能完成度
|
||||
|
||||
| 功能模块 | 状态 | 完成度 |
|
||||
|---------|------|--------|
|
||||
| 心跳检测 | ✅ | 100% |
|
||||
| 在线状态管理 | ✅ | 100% |
|
||||
| 离线消息处理 | ✅ | 100% |
|
||||
| REST API | ✅ | 100% |
|
||||
| 文档 | ✅ | 100% |
|
||||
| 测试工具 | ✅ | 100% |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 下一步建议
|
||||
|
||||
### 短期优化
|
||||
1. 添加消息加密
|
||||
2. 实现消息撤回功能
|
||||
3. 添加消息已读回执
|
||||
4. 实现群聊功能
|
||||
|
||||
### 长期规划
|
||||
1. 引入消息队列(RabbitMQ/Kafka)
|
||||
2. 实现分布式WebSocket(多服务器)
|
||||
3. 添加消息持久化到数据库
|
||||
4. 实现消息搜索功能
|
||||
|
||||
---
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如有问题,请查看:
|
||||
1. 日志文件: `logs/application.log`
|
||||
2. Redis监控: `redis-cli monitor`
|
||||
3. 测试工具: `测试WebSocket增强功能.html`
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
所有功能已完整实现并测试通过!你的WebSocket系统现在具备:
|
||||
|
||||
✅ **稳定性** - 心跳检测保证连接健康
|
||||
✅ **实时性** - 在线状态实时更新
|
||||
✅ **可靠性** - 离线消息不丢失
|
||||
✅ **可监控** - 完整的REST API
|
||||
✅ **高性能** - Redis缓存优化
|
||||
✅ **易维护** - 清晰的日志和文档
|
||||
|
||||
**开始使用吧!** 🚀
|
||||
|
|
@ -1,589 +0,0 @@
|
|||
# WebSocket 增强功能实现说明
|
||||
|
||||
## 📋 概述
|
||||
|
||||
本文档说明了为直播IM系统新增的三个核心功能模块:
|
||||
1. **心跳检测机制** - 保持连接活跃,自动清理超时连接
|
||||
2. **在线状态管理** - 实时追踪用户在线状态和活跃时间
|
||||
3. **离线消息处理** - 保存和推送离线消息
|
||||
|
||||
---
|
||||
|
||||
## 🎯 新增文件列表
|
||||
|
||||
### 1. 在线状态管理服务
|
||||
- **接口**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/service/OnlineStatusService.java`
|
||||
- **实现**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/service/impl/OnlineStatusServiceImpl.java`
|
||||
|
||||
### 2. 离线消息管理服务
|
||||
- **接口**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/service/OfflineMessageService.java`
|
||||
- **实现**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/service/impl/OfflineMessageServiceImpl.java`
|
||||
|
||||
### 3. 心跳检测调度器
|
||||
- **文件**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/websocket/HeartbeatScheduler.java`
|
||||
|
||||
### 4. REST API 控制器
|
||||
- **文件**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/OnlineStatusController.java`
|
||||
|
||||
### 5. 更新的文件
|
||||
- `LiveChatHandler.java` - 集成在线状态和心跳检测
|
||||
- `PrivateChatHandler.java` - 集成在线状态、离线消息和心跳检测
|
||||
|
||||
---
|
||||
|
||||
## 🔧 功能详解
|
||||
|
||||
### 1. 心跳检测机制 ✅
|
||||
|
||||
#### 工作原理
|
||||
- **发送间隔**: 每30秒自动向所有活跃连接发送心跳消息
|
||||
- **超时时间**: 90秒无响应则认为连接超时
|
||||
- **检查频率**: 每60秒检查一次超时连接
|
||||
- **自动清理**: 超时连接会被自动关闭并清理
|
||||
|
||||
#### 心跳消息格式
|
||||
```json
|
||||
{
|
||||
"type": "heartbeat",
|
||||
"timestamp": 1234567890123
|
||||
}
|
||||
```
|
||||
|
||||
#### 客户端响应格式
|
||||
```json
|
||||
{
|
||||
"type": "heartbeat_response"
|
||||
}
|
||||
// 或
|
||||
{
|
||||
"type": "pong"
|
||||
}
|
||||
```
|
||||
|
||||
#### 关键方法
|
||||
- `sendHeartbeat()` - 定时发送心跳(@Scheduled,每30秒)
|
||||
- `checkTimeout()` - 定时检查超时(@Scheduled,每60秒)
|
||||
- `recordHeartbeat(sessionId)` - 记录心跳时间
|
||||
- `removeHeartbeat(sessionId)` - 移除心跳记录
|
||||
|
||||
---
|
||||
|
||||
### 2. 在线状态管理 ✅
|
||||
|
||||
#### Redis 数据结构
|
||||
```
|
||||
# 用户在线状态
|
||||
user:online:{userId} = "1" (过期时间: 5分钟)
|
||||
|
||||
# 用户最后活跃时间
|
||||
user:last_active:{userId} = timestamp (过期时间: 5分钟)
|
||||
|
||||
# 直播间在线用户集合
|
||||
room:online:{roomId} = Set<userId> (过期时间: 1小时)
|
||||
```
|
||||
|
||||
#### 核心功能
|
||||
1. **设置用户在线/离线**
|
||||
```java
|
||||
onlineStatusService.setUserOnline(userId, true/false);
|
||||
```
|
||||
|
||||
2. **检查用户是否在线**
|
||||
```java
|
||||
boolean online = onlineStatusService.isUserOnline(userId);
|
||||
```
|
||||
|
||||
3. **更新用户活跃时间**
|
||||
```java
|
||||
onlineStatusService.updateUserLastActiveTime(userId);
|
||||
```
|
||||
|
||||
4. **直播间在线管理**
|
||||
```java
|
||||
// 添加用户到房间
|
||||
onlineStatusService.addUserToRoom(roomId, userId);
|
||||
|
||||
// 移除用户
|
||||
onlineStatusService.removeUserFromRoom(roomId, userId);
|
||||
|
||||
// 获取在线人数
|
||||
Long count = onlineStatusService.getRoomOnlineCount(roomId);
|
||||
|
||||
// 获取在线用户列表
|
||||
Set<String> users = onlineStatusService.getRoomOnlineUsers(roomId);
|
||||
```
|
||||
|
||||
5. **批量检查在线状态**
|
||||
```java
|
||||
List<Integer> onlineUsers = onlineStatusService.getOnlineUsers(userIds);
|
||||
```
|
||||
|
||||
#### 自动过期机制
|
||||
- 用户在线状态5分钟无活动自动过期
|
||||
- 每次消息发送/接收会自动更新活跃时间
|
||||
- 心跳消息也会更新活跃时间
|
||||
|
||||
---
|
||||
|
||||
### 3. 离线消息处理 ✅
|
||||
|
||||
#### Redis 数据结构
|
||||
```
|
||||
# 用户离线消息队列(List)
|
||||
offline:msg:{userId} = [message1, message2, ...]
|
||||
- 最大保存100条消息
|
||||
- 过期时间: 7天
|
||||
```
|
||||
|
||||
#### 核心功能
|
||||
1. **保存离线消息**
|
||||
```java
|
||||
offlineMessageService.saveOfflineMessage(userId, messageJson);
|
||||
```
|
||||
|
||||
2. **获取离线消息**
|
||||
```java
|
||||
// 获取指定数量
|
||||
List<String> messages = offlineMessageService.getOfflineMessages(userId, 50);
|
||||
|
||||
// 获取全部
|
||||
List<String> allMessages = offlineMessageService.getAllOfflineMessages(userId);
|
||||
```
|
||||
|
||||
3. **清除离线消息**
|
||||
```java
|
||||
offlineMessageService.clearOfflineMessages(userId);
|
||||
```
|
||||
|
||||
4. **获取离线消息数量**
|
||||
```java
|
||||
Long count = offlineMessageService.getOfflineMessageCount(userId);
|
||||
```
|
||||
|
||||
#### 离线消息流程
|
||||
1. 用户A发送消息给用户B
|
||||
2. 检查用户B是否在线
|
||||
3. 如果在线 → 直接推送
|
||||
4. 如果离线 → 保存到Redis离线消息队列
|
||||
5. 用户B上线时 → 自动推送所有离线消息
|
||||
6. 推送完成后 → 清除离线消息
|
||||
|
||||
#### 消息格式
|
||||
离线消息保存时会自动添加时间戳:
|
||||
```json
|
||||
{
|
||||
"type": "chat",
|
||||
"messageId": "123",
|
||||
"userId": 456,
|
||||
"username": "张三",
|
||||
"message": "你好",
|
||||
"timestamp": 1234567890123,
|
||||
"savedAt": 1234567890456
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔌 REST API 接口
|
||||
|
||||
### 基础路径
|
||||
```
|
||||
http://localhost:8081/api/front/online
|
||||
```
|
||||
|
||||
### 接口列表
|
||||
|
||||
#### 1. 检查用户是否在线
|
||||
```http
|
||||
GET /status/{userId}
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"userId": 123,
|
||||
"online": true,
|
||||
"lastActiveTime": 1234567890123
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 批量检查用户在线状态
|
||||
```http
|
||||
POST /status/batch
|
||||
Content-Type: application/json
|
||||
|
||||
[123, 456, 789]
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"total": 3,
|
||||
"onlineCount": 2,
|
||||
"onlineUsers": [123, 456]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 获取直播间在线用户列表
|
||||
```http
|
||||
GET /room/{roomId}/users
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"roomId": "101",
|
||||
"count": 150,
|
||||
"users": ["user1", "user2", "user3"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. 获取直播间在线人数
|
||||
```http
|
||||
GET /room/{roomId}/count
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"roomId": "101",
|
||||
"count": 150
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5. 获取用户离线消息数量
|
||||
```http
|
||||
GET /offline/count/{userId}
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"userId": 123,
|
||||
"count": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 6. 获取用户离线消息
|
||||
```http
|
||||
GET /offline/messages/{userId}?limit=50
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"userId": 123,
|
||||
"messages": ["...", "..."],
|
||||
"count": 5,
|
||||
"totalCount": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 7. 清除用户离线消息
|
||||
```http
|
||||
DELETE /offline/messages/{userId}
|
||||
```
|
||||
|
||||
#### 8. 获取WebSocket连接统计
|
||||
```http
|
||||
GET /stats
|
||||
```
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"activeConnections": 256,
|
||||
"timestamp": 1234567890123
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 WebSocket 连接流程
|
||||
|
||||
### 直播间聊天连接流程
|
||||
|
||||
#### 1. 建立连接
|
||||
```
|
||||
ws://localhost:8081/ws/live/chat/{roomId}?userId={userId}
|
||||
```
|
||||
|
||||
#### 2. 连接成功后
|
||||
- ✅ 添加到房间Session映射
|
||||
- ✅ 设置用户在线状态
|
||||
- ✅ 添加用户到房间在线列表
|
||||
- ✅ 记录心跳时间
|
||||
- ✅ 发送欢迎消息
|
||||
- ✅ 广播用户加入消息
|
||||
|
||||
#### 3. 消息交互
|
||||
```json
|
||||
// 发送聊天消息
|
||||
{
|
||||
"type": "chat",
|
||||
"userId": "123",
|
||||
"nickname": "张三",
|
||||
"content": "大家好"
|
||||
}
|
||||
|
||||
// 接收心跳
|
||||
{
|
||||
"type": "heartbeat",
|
||||
"timestamp": 1234567890123
|
||||
}
|
||||
|
||||
// 响应心跳
|
||||
{
|
||||
"type": "heartbeat_response"
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. 断开连接
|
||||
- ✅ 从房间Session映射移除
|
||||
- ✅ 从房间在线列表移除
|
||||
- ✅ 移除心跳记录
|
||||
- ✅ 广播用户离开消息
|
||||
|
||||
---
|
||||
|
||||
### 私聊连接流程
|
||||
|
||||
#### 1. 建立连接
|
||||
```
|
||||
ws://localhost:8081/ws/chat/{conversationId}?userId={userId}
|
||||
```
|
||||
|
||||
#### 2. 连接成功后
|
||||
- ✅ 验证用户权限
|
||||
- ✅ 添加到会话Session映射
|
||||
- ✅ 添加到用户Session映射
|
||||
- ✅ 设置用户在线状态
|
||||
- ✅ 记录心跳时间
|
||||
- ✅ **推送离线消息**
|
||||
- ✅ 标记会话为已读
|
||||
|
||||
#### 3. 消息交互
|
||||
```json
|
||||
// 发送聊天消息
|
||||
{
|
||||
"type": "chat",
|
||||
"content": "你好",
|
||||
"messageType": "text"
|
||||
}
|
||||
|
||||
// 发送已读通知
|
||||
{
|
||||
"type": "read"
|
||||
}
|
||||
|
||||
// 发送正在输入
|
||||
{
|
||||
"type": "typing"
|
||||
}
|
||||
|
||||
// 响应心跳
|
||||
{
|
||||
"type": "heartbeat_response"
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. 离线消息处理
|
||||
- 发送消息时检查对方是否在线
|
||||
- 在线 → 直接推送
|
||||
- 离线 → 保存到Redis
|
||||
- 对方上线时自动推送
|
||||
|
||||
#### 5. 断开连接
|
||||
- ✅ 从会话Session映射移除
|
||||
- ✅ 从用户Session映射移除
|
||||
- ✅ 检查是否还有其他连接
|
||||
- ✅ 无其他连接则设置离线
|
||||
- ✅ 移除心跳记录
|
||||
|
||||
---
|
||||
|
||||
## 📊 性能优化
|
||||
|
||||
### Redis 使用优化
|
||||
1. **Key过期策略**
|
||||
- 在线状态: 5分钟自动过期
|
||||
- 离线消息: 7天自动过期
|
||||
- 房间在线列表: 1小时自动过期
|
||||
|
||||
2. **数据结构选择**
|
||||
- 在线状态: String (简单快速)
|
||||
- 离线消息: List (FIFO队列)
|
||||
- 房间在线: Set (去重、快速查询)
|
||||
|
||||
3. **批量操作**
|
||||
- 支持批量检查用户在线状态
|
||||
- 减少Redis访问次数
|
||||
|
||||
### 内存优化
|
||||
1. **离线消息限制**
|
||||
- 每个用户最多保存100条离线消息
|
||||
- 超过限制自动删除最旧的消息
|
||||
|
||||
2. **心跳记录**
|
||||
- 使用ConcurrentHashMap存储
|
||||
- 连接断开时自动清理
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试建议
|
||||
|
||||
### 1. 心跳检测测试
|
||||
```javascript
|
||||
// 客户端代码示例
|
||||
const ws = new WebSocket('ws://localhost:8081/ws/live/chat/101?userId=123');
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
const data = JSON.parse(event.data);
|
||||
|
||||
// 收到心跳,立即响应
|
||||
if (data.type === 'heartbeat') {
|
||||
ws.send(JSON.stringify({ type: 'heartbeat_response' }));
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 2. 在线状态测试
|
||||
```bash
|
||||
# 检查用户是否在线
|
||||
curl http://localhost:8081/api/front/online/status/123
|
||||
|
||||
# 获取房间在线人数
|
||||
curl http://localhost:8081/api/front/online/room/101/count
|
||||
```
|
||||
|
||||
### 3. 离线消息测试
|
||||
1. 用户A连接WebSocket
|
||||
2. 用户B断开连接(离线)
|
||||
3. 用户A发送消息给用户B
|
||||
4. 检查离线消息数量
|
||||
5. 用户B重新连接
|
||||
6. 验证是否收到离线消息
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 1. Redis 依赖
|
||||
- 确保Redis服务正常运行
|
||||
- 检查Redis配置(application.yml)
|
||||
- 建议使用Redis 5.0+
|
||||
|
||||
### 2. 定时任务
|
||||
- 心跳检测使用Spring @Scheduled
|
||||
- 确保启动类有 @EnableScheduling 注解
|
||||
- 可以通过配置调整心跳间隔
|
||||
|
||||
### 3. 并发安全
|
||||
- 使用ConcurrentHashMap和CopyOnWriteArraySet
|
||||
- 所有Session操作都是线程安全的
|
||||
- Redis操作通过RedisUtil统一管理
|
||||
|
||||
### 4. 异常处理
|
||||
- 所有关键操作都有try-catch
|
||||
- 异常不会影响其他用户
|
||||
- 详细的日志记录便于排查问题
|
||||
|
||||
---
|
||||
|
||||
## 🔧 配置说明
|
||||
|
||||
### 心跳配置(可在代码中调整)
|
||||
```java
|
||||
// HeartbeatScheduler.java
|
||||
private static final long HEARTBEAT_TIMEOUT = 90000; // 90秒超时
|
||||
private static final long HEARTBEAT_INTERVAL = 30000; // 30秒发送间隔
|
||||
```
|
||||
|
||||
### 在线状态配置
|
||||
```java
|
||||
// OnlineStatusServiceImpl.java
|
||||
private static final long ONLINE_EXPIRE_SECONDS = 300; // 5分钟过期
|
||||
```
|
||||
|
||||
### 离线消息配置
|
||||
```java
|
||||
// OfflineMessageServiceImpl.java
|
||||
private static final int MAX_OFFLINE_MESSAGES = 100; // 最多100条
|
||||
private static final long OFFLINE_MESSAGE_EXPIRE_SECONDS = 7 * 24 * 3600; // 7天
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 监控建议
|
||||
|
||||
### 1. 关键指标
|
||||
- WebSocket活跃连接数
|
||||
- 在线用户数
|
||||
- 离线消息堆积数量
|
||||
- 心跳超时次数
|
||||
|
||||
### 2. 日志监控
|
||||
```bash
|
||||
# 查看心跳日志
|
||||
grep "Heartbeat" application.log
|
||||
|
||||
# 查看在线状态日志
|
||||
grep "OnlineStatus" application.log
|
||||
|
||||
# 查看离线消息日志
|
||||
grep "OfflineMessage" application.log
|
||||
```
|
||||
|
||||
### 3. Redis 监控
|
||||
```bash
|
||||
# 查看在线用户数
|
||||
redis-cli KEYS "user:online:*" | wc -l
|
||||
|
||||
# 查看离线消息总数
|
||||
redis-cli KEYS "offline:msg:*" | wc -l
|
||||
|
||||
# 查看房间在线列表
|
||||
redis-cli SMEMBERS "room:online:101"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 完成度总结
|
||||
|
||||
| 功能模块 | 完成度 | 说明 |
|
||||
|---------|--------|------|
|
||||
| 心跳检测 | ✅ 100% | 完全实现,包括发送、检测、超时清理 |
|
||||
| 在线状态管理 | ✅ 100% | 完全实现,支持用户和房间在线状态 |
|
||||
| 离线消息处理 | ✅ 100% | 完全实现,自动保存和推送 |
|
||||
| REST API | ✅ 100% | 提供完整的查询接口 |
|
||||
| 集成到Handler | ✅ 100% | LiveChatHandler和PrivateChatHandler已集成 |
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
现在你的WebSocket系统已经具备了完整的企业级功能:
|
||||
|
||||
1. ✅ **稳定性**: 心跳检测确保连接健康
|
||||
2. ✅ **实时性**: 在线状态实时更新
|
||||
3. ✅ **可靠性**: 离线消息不丢失
|
||||
4. ✅ **可监控**: 提供完整的REST API
|
||||
5. ✅ **高性能**: Redis缓存,自动过期
|
||||
6. ✅ **易维护**: 清晰的日志和异常处理
|
||||
|
||||
所有功能都已经集成到现有的WebSocket Handler中,无需修改客户端代码即可享受这些增强功能!
|
||||
599
Zhibo/功能验证清单.md
599
Zhibo/功能验证清单.md
|
|
@ -1,599 +0,0 @@
|
|||
# WebSocket增强功能验证清单
|
||||
|
||||
## 📋 代码完整性验证
|
||||
|
||||
### ✅ 所有文件已创建
|
||||
|
||||
#### 核心服务类(8个)
|
||||
- [x] `OnlineStatusService.java` - 在线状态服务接口
|
||||
- [x] `OnlineStatusServiceImpl.java` - 在线状态服务实现
|
||||
- [x] `OfflineMessageService.java` - 离线消息服务接口
|
||||
- [x] `OfflineMessageServiceImpl.java` - 离线消息服务实现
|
||||
- [x] `HeartbeatScheduler.java` - 心跳检测调度器
|
||||
- [x] `OnlineStatusController.java` - REST API控制器
|
||||
- [x] `OfflineMessageController.java` - 离线消息REST API控制器
|
||||
- [x] `OfflineMessageCleanupTask.java` - 离线消息清理定时任务
|
||||
|
||||
#### 修改的文件(4个)
|
||||
- [x] `LiveChatHandler.java` - 已集成新功能
|
||||
- [x] `PrivateChatHandler.java` - 已集成新功能
|
||||
- [x] `CrmebFrontApplication.java` - 已添加@EnableScheduling
|
||||
- [x] `RedisUtil.java` - 已添加List操作方法(lLeftPop, lRightPop, lTrim, del)
|
||||
|
||||
#### 文档和测试(6个)
|
||||
- [x] `WebSocket增强功能实现说明.md`
|
||||
- [x] `WebSocket增强功能-README.md`
|
||||
- [x] `测试WebSocket增强功能.html`
|
||||
- [x] `检查编译问题.md`
|
||||
- [x] `离线消息功能实现说明.md`
|
||||
- [x] `测试离线消息功能.html`
|
||||
|
||||
---
|
||||
|
||||
## ✅ 代码修复验证
|
||||
|
||||
### 1. RedisUtil方法调用
|
||||
- [x] `sSet()` 替代 `sAdd()` - OnlineStatusServiceImpl
|
||||
- [x] `getListSize()` 替代 `lGetListSize()` - OfflineMessageServiceImpl
|
||||
- [x] Set<Object> 转 Set<String> - OnlineStatusServiceImpl.getRoomOnlineUsers()
|
||||
|
||||
### 2. 依赖注入
|
||||
- [x] OnlineStatusService 注入到 LiveChatHandler
|
||||
- [x] OnlineStatusService 注入到 PrivateChatHandler
|
||||
- [x] OfflineMessageService 注入到 PrivateChatHandler
|
||||
- [x] HeartbeatScheduler 可选注入到 Handler
|
||||
- [x] RedisUtil 注入到 Service实现类
|
||||
|
||||
### 3. 方法签名匹配
|
||||
- [x] LiveChatService.saveMessage() - 参数正确
|
||||
- [x] ConversationService.sendMessage() - 参数正确
|
||||
- [x] ConversationService.markAsRead() - 参数正确
|
||||
- [x] ConversationService.getById() - 参数正确
|
||||
|
||||
### 4. Spring注解
|
||||
- [x] @Service - 所有Service实现类
|
||||
- [x] @Component - HeartbeatScheduler和Handler
|
||||
- [x] @RestController - OnlineStatusController
|
||||
- [x] @Scheduled - HeartbeatScheduler定时任务
|
||||
- [x] @EnableScheduling - CrmebFrontApplication
|
||||
|
||||
---
|
||||
|
||||
## 🔧 功能实现验证
|
||||
|
||||
### 心跳检测功能
|
||||
- [x] HeartbeatScheduler 创建完成
|
||||
- [x] 每30秒发送心跳 (@Scheduled注解)
|
||||
- [x] 每60秒检查超时 (@Scheduled注解)
|
||||
- [x] 记录心跳时间 (recordHeartbeat方法)
|
||||
- [x] 移除心跳记录 (removeHeartbeat方法)
|
||||
- [x] 构建心跳消息 (buildHeartbeatMessage方法)
|
||||
- [x] 关闭超时连接 (closeTimeoutSession方法)
|
||||
- [x] Handler中集成心跳记录
|
||||
- [x] Handler中处理心跳响应
|
||||
|
||||
### 在线状态管理功能
|
||||
- [x] OnlineStatusService 接口定义
|
||||
- [x] OnlineStatusServiceImpl 实现
|
||||
- [x] 设置用户在线/离线
|
||||
- [x] 检查用户是否在线
|
||||
- [x] 更新用户活跃时间
|
||||
- [x] 添加用户到房间
|
||||
- [x] 从房间移除用户
|
||||
- [x] 获取房间在线用户
|
||||
- [x] 获取房间在线人数
|
||||
- [x] 批量检查在线状态
|
||||
- [x] Redis Key设计合理
|
||||
- [x] 自动过期机制(5分钟)
|
||||
- [x] Handler中集成在线状态
|
||||
|
||||
### 离线消息处理功能
|
||||
- [x] OfflineMessageService 接口定义
|
||||
- [x] OfflineMessageServiceImpl 实现
|
||||
- [x] 保存离线消息
|
||||
- [x] 获取离线消息(分页)
|
||||
- [x] 获取所有离线消息
|
||||
- [x] 清除离线消息
|
||||
- [x] 获取离线消息数量
|
||||
- [x] 删除指定数量的离线消息
|
||||
- [x] 消息数量限制(100条)
|
||||
- [x] 消息过期时间(7天)
|
||||
- [x] 添加保存时间戳
|
||||
- [x] PrivateChatHandler中集成
|
||||
- [x] 连接时推送离线消息
|
||||
- [x] 发送时检查在线状态
|
||||
- [x] OfflineMessageController REST API
|
||||
- [x] OfflineMessageCleanupTask 定时清理
|
||||
- [x] RedisUtil新增List操作方法
|
||||
|
||||
### REST API功能
|
||||
- [x] OnlineStatusController 创建
|
||||
- [x] 检查用户在线状态 (GET /status/{userId})
|
||||
- [x] 批量检查在线状态 (POST /status/batch)
|
||||
- [x] 获取房间在线用户 (GET /room/{roomId}/users)
|
||||
- [x] 获取房间在线人数 (GET /room/{roomId}/count)
|
||||
- [x] 获取离线消息数量 (GET /offline/count/{userId})
|
||||
- [x] 获取离线消息 (GET /offline/messages/{userId})
|
||||
- [x] 清除离线消息 (DELETE /offline/messages/{userId})
|
||||
- [x] 获取连接统计 (GET /stats)
|
||||
- [x] OfflineMessageController 创建
|
||||
- [x] 获取离线消息数量 (GET /api/front/offline-messages/count/{userId})
|
||||
- [x] 获取离线消息列表 (GET /api/front/offline-messages/list/{userId})
|
||||
- [x] 获取所有离线消息 (GET /api/front/offline-messages/all/{userId})
|
||||
- [x] 清除离线消息 (DELETE /api/front/offline-messages/clear/{userId})
|
||||
- [x] 删除指定数量 (DELETE /api/front/offline-messages/remove/{userId})
|
||||
- [x] 保存离线消息 (POST /api/front/offline-messages/save)
|
||||
|
||||
---
|
||||
|
||||
## 🧪 编译前检查
|
||||
|
||||
### 环境准备
|
||||
- [ ] JDK 8+ 已安装
|
||||
- [ ] Maven 3.6+ 已安装
|
||||
- [ ] Redis 5.0+ 已安装并运行
|
||||
- [ ] 端口8081未被占用
|
||||
|
||||
### 依赖检查
|
||||
- [x] Spring Boot 2.2.6
|
||||
- [x] Spring WebSocket
|
||||
- [x] Spring Data Redis
|
||||
- [x] Jackson (JSON处理)
|
||||
- [x] MyBatis Plus
|
||||
- [x] Swagger
|
||||
|
||||
### 配置检查
|
||||
- [ ] application.yml 中 Redis配置正确
|
||||
- [ ] Redis host: 127.0.0.1
|
||||
- [ ] Redis port: 6379
|
||||
- [ ] Redis database: 6
|
||||
|
||||
---
|
||||
|
||||
## 🚀 编译和启动
|
||||
|
||||
### 1. 清理编译
|
||||
```bash
|
||||
cd Zhibo/zhibo-h
|
||||
mvn clean compile
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
```
|
||||
[INFO] BUILD SUCCESS
|
||||
[INFO] Total time: XX s
|
||||
```
|
||||
|
||||
### 2. 打包
|
||||
```bash
|
||||
mvn clean package -DskipTests
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
```
|
||||
[INFO] BUILD SUCCESS
|
||||
[INFO] jar文件生成在 target/ 目录
|
||||
```
|
||||
|
||||
### 3. 启动服务
|
||||
```bash
|
||||
cd crmeb-front
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
**预期日志**:
|
||||
```
|
||||
[INFO] Started CrmebFrontApplication in XX seconds
|
||||
[INFO] Tomcat started on port(s): 8081
|
||||
```
|
||||
|
||||
### 4. 验证启动
|
||||
```bash
|
||||
# 检查端口
|
||||
netstat -an | grep 8081
|
||||
|
||||
# 检查Redis连接
|
||||
redis-cli ping
|
||||
# 应返回: PONG
|
||||
|
||||
# 测试API
|
||||
curl http://localhost:8081/api/front/online/stats
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 功能测试
|
||||
|
||||
### 测试1: 心跳检测
|
||||
**步骤**:
|
||||
1. 打开 `测试WebSocket增强功能.html`
|
||||
2. 连接直播间
|
||||
3. 等待30秒
|
||||
4. 观察是否收到心跳消息
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 每30秒收到一次心跳消息
|
||||
- ✅ 消息格式: `{"type":"heartbeat","timestamp":...}`
|
||||
- ✅ 客户端自动响应心跳
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 查看心跳日志
|
||||
grep "Heartbeat" logs/application.log
|
||||
```
|
||||
|
||||
### 测试2: 在线状态
|
||||
**步骤**:
|
||||
1. 用户A连接WebSocket
|
||||
2. 调用API检查用户A在线状态
|
||||
3. 用户A断开连接
|
||||
4. 再次检查在线状态
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 连接后: `{"online": true}`
|
||||
- ✅ 断开后: `{"online": false}`
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 检查用户123的在线状态
|
||||
curl http://localhost:8081/api/front/online/status/123
|
||||
|
||||
# 检查Redis中的数据
|
||||
redis-cli GET "user:online:123"
|
||||
```
|
||||
|
||||
### 测试3: 离线消息
|
||||
**步骤**:
|
||||
1. 用户A连接WebSocket
|
||||
2. 用户B断开连接(离线)
|
||||
3. 用户A发送消息给用户B
|
||||
4. 检查离线消息数量
|
||||
5. 用户B重新连接
|
||||
6. 验证是否收到离线消息
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 用户B离线时消息保存到Redis
|
||||
- ✅ 用户B上线时自动推送消息
|
||||
- ✅ 推送后离线消息被清除
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 检查用户456的离线消息数量(旧接口)
|
||||
curl http://localhost:8081/api/front/online/offline/count/456
|
||||
|
||||
# 检查用户456的离线消息数量(新接口)
|
||||
curl http://localhost:8081/api/front/offline-messages/count/456
|
||||
|
||||
# 获取离线消息列表
|
||||
curl http://localhost:8081/api/front/offline-messages/list/456?limit=50
|
||||
|
||||
# 获取所有离线消息
|
||||
curl http://localhost:8081/api/front/offline-messages/all/456
|
||||
|
||||
# 查看Redis中的离线消息
|
||||
redis-cli LRANGE "offline:msg:456" 0 -1
|
||||
|
||||
# 删除前5条离线消息
|
||||
curl -X DELETE "http://localhost:8081/api/front/offline-messages/remove/456?count=5"
|
||||
|
||||
# 清空所有离线消息
|
||||
curl -X DELETE http://localhost:8081/api/front/offline-messages/clear/456
|
||||
```
|
||||
|
||||
**使用测试页面**:
|
||||
1. 打开 `测试离线消息功能.html`
|
||||
2. 设置用户ID
|
||||
3. 保存10条测试消息
|
||||
4. 获取消息列表
|
||||
5. 删除指定数量
|
||||
6. 清空所有消息
|
||||
|
||||
### 测试4: 房间在线人数
|
||||
**步骤**:
|
||||
1. 3个用户连接到房间101
|
||||
2. 调用API获取房间在线人数
|
||||
3. 1个用户断开连接
|
||||
4. 再次获取在线人数
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 3个用户连接后: `{"count": 3}`
|
||||
- ✅ 1个用户断开后: `{"count": 2}`
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 获取房间101的在线人数
|
||||
curl http://localhost:8081/api/front/online/room/101/count
|
||||
|
||||
# 查看Redis中的房间在线用户
|
||||
redis-cli SMEMBERS "room:online:101"
|
||||
```
|
||||
|
||||
### 测试5: 超时断开
|
||||
**步骤**:
|
||||
1. 连接WebSocket
|
||||
2. 禁用自动心跳响应
|
||||
3. 等待90秒
|
||||
4. 观察连接状态
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 90秒后连接自动断开
|
||||
- ✅ 日志显示超时信息
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 查看超时日志
|
||||
grep "连接超时" logs/application.log
|
||||
```
|
||||
|
||||
### 测试6: REST API
|
||||
**步骤**: 测试所有8个API接口
|
||||
|
||||
```bash
|
||||
# 1. 检查用户在线状态
|
||||
curl http://localhost:8081/api/front/online/status/123
|
||||
|
||||
# 2. 批量检查在线状态
|
||||
curl -X POST http://localhost:8081/api/front/online/status/batch \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "[123, 456, 789]"
|
||||
|
||||
# 3. 获取房间在线用户
|
||||
curl http://localhost:8081/api/front/online/room/101/users
|
||||
|
||||
# 4. 获取房间在线人数
|
||||
curl http://localhost:8081/api/front/online/room/101/count
|
||||
|
||||
# 5. 获取离线消息数量
|
||||
curl http://localhost:8081/api/front/online/offline/count/456
|
||||
|
||||
# 6. 获取离线消息
|
||||
curl http://localhost:8081/api/front/online/offline/messages/456?limit=50
|
||||
|
||||
# 7. 清除离线消息
|
||||
curl -X DELETE http://localhost:8081/api/front/online/offline/messages/456
|
||||
|
||||
# 8. 获取连接统计
|
||||
curl http://localhost:8081/api/front/online/stats
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 所有接口返回200状态码
|
||||
- ✅ 返回数据格式正确
|
||||
- ✅ 数据内容符合预期
|
||||
|
||||
### 测试7: 离线消息专用API
|
||||
**步骤**: 测试离线消息的完整功能
|
||||
|
||||
```bash
|
||||
# 1. 保存离线消息
|
||||
curl -X POST "http://localhost:8081/api/front/offline-messages/save?userId=456" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"type":"chat","content":"测试消息","timestamp":1234567890}'
|
||||
|
||||
# 2. 批量保存测试消息(使用测试页面)
|
||||
# 打开 测试离线消息功能.html,点击"保存10条测试消息"
|
||||
|
||||
# 3. 获取离线消息数量
|
||||
curl http://localhost:8081/api/front/offline-messages/count/456
|
||||
|
||||
# 4. 获取离线消息列表(限制50条)
|
||||
curl "http://localhost:8081/api/front/offline-messages/list/456?limit=50"
|
||||
|
||||
# 5. 获取所有离线消息
|
||||
curl http://localhost:8081/api/front/offline-messages/all/456
|
||||
|
||||
# 6. 删除前5条离线消息
|
||||
curl -X DELETE "http://localhost:8081/api/front/offline-messages/remove/456?count=5"
|
||||
|
||||
# 7. 清空所有离线消息
|
||||
curl -X DELETE http://localhost:8081/api/front/offline-messages/clear/456
|
||||
|
||||
# 8. 验证清空后的数量
|
||||
curl http://localhost:8081/api/front/offline-messages/count/456
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 保存消息成功
|
||||
- ✅ 获取数量正确
|
||||
- ✅ 获取列表包含所有消息
|
||||
- ✅ 删除指定数量成功
|
||||
- ✅ 清空后数量为0
|
||||
- ✅ 所有接口返回格式正确
|
||||
|
||||
**使用测试页面验证**:
|
||||
1. 打开 `测试离线消息功能.html`
|
||||
2. 配置API地址和用户ID
|
||||
3. 依次测试所有功能按钮
|
||||
4. 观察返回结果和统计信息
|
||||
5. 验证Redis中的数据变化
|
||||
|
||||
---
|
||||
|
||||
## 📊 性能测试
|
||||
|
||||
### 并发连接测试
|
||||
**目标**: 测试100个并发WebSocket连接
|
||||
|
||||
**步骤**:
|
||||
1. 使用测试工具创建100个连接
|
||||
2. 观察服务器资源使用
|
||||
3. 检查心跳是否正常
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 所有连接成功建立
|
||||
- ✅ CPU使用率 < 50%
|
||||
- ✅ 内存使用正常
|
||||
- ✅ 心跳消息正常发送
|
||||
|
||||
### 消息吞吐量测试
|
||||
**目标**: 测试1000条消息/秒
|
||||
|
||||
**步骤**:
|
||||
1. 创建10个连接
|
||||
2. 每个连接每秒发送100条消息
|
||||
3. 观察消息处理延迟
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 消息无丢失
|
||||
- ✅ 延迟 < 100ms
|
||||
- ✅ 服务器稳定运行
|
||||
|
||||
### Redis性能测试
|
||||
**步骤**:
|
||||
1. 监控Redis内存使用
|
||||
2. 监控Redis命令执行时间
|
||||
3. 检查Key过期是否正常
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 查看Redis内存使用
|
||||
redis-cli INFO memory
|
||||
|
||||
# 查看Key数量
|
||||
redis-cli DBSIZE
|
||||
|
||||
# 查看慢查询
|
||||
redis-cli SLOWLOG GET 10
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
- ✅ 内存使用合理
|
||||
- ✅ 命令执行时间 < 10ms
|
||||
- ✅ Key自动过期正常
|
||||
|
||||
---
|
||||
|
||||
## 🐛 常见问题排查
|
||||
|
||||
### 问题1: 编译失败
|
||||
**症状**: `mvn compile` 失败
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查JDK版本: `java -version`
|
||||
2. 检查Maven版本: `mvn -version`
|
||||
3. 清理缓存: `mvn clean`
|
||||
4. 查看错误日志
|
||||
|
||||
**解决方案**: 参考 `检查编译问题.md`
|
||||
|
||||
### 问题2: 启动失败
|
||||
**症状**: 服务无法启动
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查Redis: `redis-cli ping`
|
||||
2. 检查端口: `netstat -an | grep 8081`
|
||||
3. 查看启动日志
|
||||
4. 检查配置文件
|
||||
|
||||
**解决方案**:
|
||||
- Redis未启动 → 启动Redis
|
||||
- 端口被占用 → 修改端口或关闭占用进程
|
||||
- 配置错误 → 检查application.yml
|
||||
|
||||
### 问题3: 心跳不工作
|
||||
**症状**: 没有收到心跳消息
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查@EnableScheduling注解
|
||||
2. 查看日志: `grep "Heartbeat" logs/application.log`
|
||||
3. 检查HeartbeatScheduler是否被Spring扫描
|
||||
|
||||
**解决方案**:
|
||||
- 缺少注解 → 添加@EnableScheduling
|
||||
- 未扫描到 → 检查@ComponentScan配置
|
||||
|
||||
### 问题4: 在线状态不准确
|
||||
**症状**: 用户明明在线但显示离线
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查Redis连接
|
||||
2. 查看Redis中的数据
|
||||
3. 检查过期时间设置
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 检查用户在线状态
|
||||
redis-cli GET "user:online:123"
|
||||
|
||||
# 检查Key的TTL
|
||||
redis-cli TTL "user:online:123"
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- Redis断开 → 重启Redis
|
||||
- 过期时间太短 → 调整ONLINE_EXPIRE_SECONDS
|
||||
- 未更新活跃时间 → 检查updateUserLastActiveTime调用
|
||||
|
||||
### 问题5: 离线消息未推送
|
||||
**症状**: 用户上线后没有收到离线消息
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查Redis中是否有离线消息
|
||||
2. 查看连接日志
|
||||
3. 检查推送逻辑
|
||||
|
||||
**验证命令**:
|
||||
```bash
|
||||
# 查看离线消息
|
||||
redis-cli LRANGE "offline:msg:456" 0 -1
|
||||
|
||||
# 查看推送日志
|
||||
grep "推送离线消息" logs/application.log
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- 消息未保存 → 检查saveOfflineMessage调用
|
||||
- 推送失败 → 查看异常日志
|
||||
- 消息已过期 → 检查过期时间设置
|
||||
|
||||
---
|
||||
|
||||
## ✅ 最终验证清单
|
||||
|
||||
### 代码层面
|
||||
- [x] 所有文件已创建
|
||||
- [x] 所有方法调用正确
|
||||
- [x] 所有类型转换正确
|
||||
- [x] 所有依赖注入正确
|
||||
- [x] 所有注解正确
|
||||
- [x] 所有异常处理完整
|
||||
|
||||
### 功能层面
|
||||
- [ ] 心跳检测正常工作
|
||||
- [ ] 在线状态实时更新
|
||||
- [ ] 离线消息正确保存和推送
|
||||
- [ ] REST API全部可用
|
||||
- [ ] 超时断开正常工作
|
||||
|
||||
### 性能层面
|
||||
- [ ] 100个并发连接稳定
|
||||
- [ ] 消息处理延迟低
|
||||
- [ ] Redis性能正常
|
||||
- [ ] 内存使用合理
|
||||
- [ ] CPU使用率正常
|
||||
|
||||
### 文档层面
|
||||
- [x] 功能说明文档完整
|
||||
- [x] 快速开始指南完整
|
||||
- [x] 测试工具可用
|
||||
- [x] 问题排查指南完整
|
||||
|
||||
---
|
||||
|
||||
## 🎉 验证完成
|
||||
|
||||
当所有检查项都打勾后,说明:
|
||||
|
||||
✅ **代码实现完整**
|
||||
✅ **功能测试通过**
|
||||
✅ **性能满足要求**
|
||||
✅ **文档齐全**
|
||||
|
||||
**可以正式使用了!** 🚀
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2024年12月25日
|
||||
**验证人**: [待填写]
|
||||
**验证日期**: [待填写]
|
||||
**验证结果**: [待填写]
|
||||
245
Zhibo/检查编译问题.md
245
Zhibo/检查编译问题.md
|
|
@ -1,245 +0,0 @@
|
|||
# 代码检查和修复总结
|
||||
|
||||
## ✅ 已修复的问题
|
||||
|
||||
### 1. RedisUtil方法名称不匹配
|
||||
**问题**: 使用了不存在的方法名
|
||||
- ❌ `redisUtil.sAdd()` → ✅ `redisUtil.sSet()`
|
||||
- ❌ `redisUtil.lGetListSize()` → ✅ `redisUtil.getListSize()`
|
||||
|
||||
**修复位置**:
|
||||
- `OnlineStatusServiceImpl.java` - addUserToRoom方法
|
||||
- `OfflineMessageServiceImpl.java` - saveOfflineMessage和getOfflineMessageCount方法
|
||||
|
||||
### 2. Set类型转换问题
|
||||
**问题**: `redisUtil.sGet()` 返回 `Set<Object>`,需要转换为 `Set<String>`
|
||||
|
||||
**修复**: 在 `OnlineStatusServiceImpl.getRoomOnlineUsers()` 中添加类型转换逻辑
|
||||
```java
|
||||
Set<Object> objects = redisUtil.sGet(key);
|
||||
if (objects == null) return Set.of();
|
||||
|
||||
Set<String> result = new java.util.HashSet<>();
|
||||
for (Object obj : objects) {
|
||||
if (obj != null) {
|
||||
result.add(obj.toString());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
```
|
||||
|
||||
### 3. 离线消息保存逻辑优化
|
||||
**问题**: 原来的实现没有正确设置过期时间
|
||||
|
||||
**修复**: 使用 `lSet(key, message, expireTime)` 方法,在添加消息时同时设置过期时间
|
||||
```java
|
||||
redisUtil.lSet(key, message, OFFLINE_MESSAGE_EXPIRE_SECONDS);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 验证通过的功能
|
||||
|
||||
### 1. 依赖注入
|
||||
所有Service都正确使用了 `@Autowired` 注解:
|
||||
- ✅ `OnlineStatusService` 注入到 Handler
|
||||
- ✅ `OfflineMessageService` 注入到 PrivateChatHandler
|
||||
- ✅ `HeartbeatScheduler` 使用 `@Autowired(required = false)` 可选注入
|
||||
- ✅ `RedisUtil` 注入到 Service实现类
|
||||
|
||||
### 2. 方法签名匹配
|
||||
所有调用的方法都存在于对应的Service中:
|
||||
- ✅ `LiveChatService.saveMessage(Integer, String, String, String)`
|
||||
- ✅ `LiveChatService.getRoomMessages(Integer, int)`
|
||||
- ✅ `ConversationService.sendMessage(Long, Integer, SendMessageRequest)`
|
||||
- ✅ `ConversationService.markAsRead(Long, Integer)`
|
||||
- ✅ `ConversationService.getById(Long)`
|
||||
|
||||
### 3. Spring注解
|
||||
所有类都正确标注了Spring注解:
|
||||
- ✅ `@Service` - 所有Service实现类
|
||||
- ✅ `@Component` - HeartbeatScheduler和Handler类
|
||||
- ✅ `@RestController` - OnlineStatusController
|
||||
- ✅ `@Scheduled` - HeartbeatScheduler的定时任务方法
|
||||
- ✅ `@EnableScheduling` - CrmebFrontApplication启动类
|
||||
|
||||
### 4. Redis操作
|
||||
所有Redis操作都使用了正确的方法:
|
||||
- ✅ `sSet()` - Set添加
|
||||
- ✅ `sGet()` - Set获取
|
||||
- ✅ `setRemove()` - Set删除
|
||||
- ✅ `sGetSetSize()` - Set大小
|
||||
- ✅ `lSet()` - List添加(带过期时间)
|
||||
- ✅ `lGet()` - List获取
|
||||
- ✅ `getListSize()` - List大小
|
||||
- ✅ `set()` - String设置
|
||||
- ✅ `get()` - String获取
|
||||
- ✅ `del()` - 删除Key
|
||||
- ✅ `expire()` - 设置过期时间
|
||||
|
||||
---
|
||||
|
||||
## 📋 代码完整性检查
|
||||
|
||||
### 新增文件(10个)
|
||||
1. ✅ `OnlineStatusService.java` - 接口定义完整
|
||||
2. ✅ `OnlineStatusServiceImpl.java` - 实现完整,已修复方法调用
|
||||
3. ✅ `OfflineMessageService.java` - 接口定义完整
|
||||
4. ✅ `OfflineMessageServiceImpl.java` - 实现完整,已修复方法调用
|
||||
5. ✅ `HeartbeatScheduler.java` - 定时任务完整
|
||||
6. ✅ `OnlineStatusController.java` - REST API完整
|
||||
7. ✅ `WebSocket增强功能实现说明.md` - 文档完整
|
||||
8. ✅ `WebSocket增强功能-README.md` - 文档完整
|
||||
9. ✅ `测试WebSocket增强功能.html` - 测试工具完整
|
||||
10. ✅ `检查编译问题.md` - 本文档
|
||||
|
||||
### 修改文件(3个)
|
||||
1. ✅ `LiveChatHandler.java` - 集成完成
|
||||
- 导入OnlineStatusService ✅
|
||||
- 注入依赖 ✅
|
||||
- 连接时设置在线状态 ✅
|
||||
- 断开时更新在线状态 ✅
|
||||
- 心跳记录 ✅
|
||||
- 提取userId方法 ✅
|
||||
|
||||
2. ✅ `PrivateChatHandler.java` - 集成完成
|
||||
- 导入OnlineStatusService和OfflineMessageService ✅
|
||||
- 注入依赖 ✅
|
||||
- 连接时推送离线消息 ✅
|
||||
- 发送消息时检查在线状态 ✅
|
||||
- 离线时保存消息 ✅
|
||||
- 心跳记录 ✅
|
||||
|
||||
3. ✅ `CrmebFrontApplication.java` - 添加注解
|
||||
- 添加@EnableScheduling ✅
|
||||
- 导入正确 ✅
|
||||
|
||||
---
|
||||
|
||||
## 🔍 潜在问题检查
|
||||
|
||||
### 1. 循环依赖检查
|
||||
✅ **无循环依赖**
|
||||
- HeartbeatScheduler → Handler (单向依赖)
|
||||
- Handler → Service (单向依赖)
|
||||
- Service → RedisUtil (单向依赖)
|
||||
|
||||
### 2. 空指针检查
|
||||
✅ **已处理所有可能的空指针**
|
||||
- 所有方法都检查了参数是否为null
|
||||
- Redis返回值都做了null检查
|
||||
- 使用了 `@Autowired(required = false)` 处理可选依赖
|
||||
|
||||
### 3. 并发安全检查
|
||||
✅ **线程安全**
|
||||
- 使用ConcurrentHashMap存储Session映射
|
||||
- 使用CopyOnWriteArraySet存储Session集合
|
||||
- Redis操作本身是线程安全的
|
||||
|
||||
### 4. 异常处理检查
|
||||
✅ **完整的异常处理**
|
||||
- 所有关键操作都有try-catch
|
||||
- 异常都记录了日志
|
||||
- 异常不会影响其他用户
|
||||
|
||||
---
|
||||
|
||||
## 🧪 编译验证步骤
|
||||
|
||||
### 1. 清理并编译
|
||||
```bash
|
||||
cd Zhibo/zhibo-h
|
||||
mvn clean compile
|
||||
```
|
||||
|
||||
### 2. 检查编译输出
|
||||
应该看到:
|
||||
```
|
||||
[INFO] BUILD SUCCESS
|
||||
```
|
||||
|
||||
### 3. 如果有错误
|
||||
查看错误信息,常见问题:
|
||||
- 缺少依赖:检查pom.xml
|
||||
- 方法不存在:检查方法签名
|
||||
- 类型不匹配:检查类型转换
|
||||
|
||||
---
|
||||
|
||||
## 📊 功能测试清单
|
||||
|
||||
### 启动前检查
|
||||
- [ ] Redis服务运行中
|
||||
- [ ] 配置文件正确(application.yml)
|
||||
- [ ] 端口8081未被占用
|
||||
|
||||
### 功能测试
|
||||
- [ ] 心跳检测:连接后30秒内收到心跳消息
|
||||
- [ ] 在线状态:用户连接后状态变为在线
|
||||
- [ ] 离线消息:离线时发送的消息能在上线后收到
|
||||
- [ ] REST API:所有8个接口都能正常访问
|
||||
- [ ] 超时断开:90秒无响应自动断开
|
||||
|
||||
### 性能测试
|
||||
- [ ] 100个并发连接
|
||||
- [ ] 1000条消息/秒
|
||||
- [ ] Redis内存使用正常
|
||||
- [ ] CPU使用率正常
|
||||
|
||||
---
|
||||
|
||||
## ✅ 最终确认
|
||||
|
||||
所有代码已经过检查和修复,确认:
|
||||
|
||||
1. ✅ 所有方法调用都正确
|
||||
2. ✅ 所有类型转换都正确
|
||||
3. ✅ 所有依赖注入都正确
|
||||
4. ✅ 所有注解都正确
|
||||
5. ✅ 所有异常处理都完整
|
||||
6. ✅ 所有日志记录都完整
|
||||
7. ✅ 所有文档都完整
|
||||
|
||||
**可以开始编译和测试了!** 🚀
|
||||
|
||||
---
|
||||
|
||||
## 🔧 如果遇到编译错误
|
||||
|
||||
### 常见错误1: 找不到类
|
||||
```
|
||||
error: cannot find symbol
|
||||
symbol: class OnlineStatusService
|
||||
```
|
||||
**解决**: 确保Maven已经编译了所有模块
|
||||
```bash
|
||||
mvn clean install -DskipTests
|
||||
```
|
||||
|
||||
### 常见错误2: 方法不存在
|
||||
```
|
||||
error: cannot find symbol
|
||||
symbol: method sAdd(String,String)
|
||||
```
|
||||
**解决**: 已修复,使用sSet()替代
|
||||
|
||||
### 常见错误3: 类型不匹配
|
||||
```
|
||||
error: incompatible types: Set<Object> cannot be converted to Set<String>
|
||||
```
|
||||
**解决**: 已修复,添加了类型转换
|
||||
|
||||
---
|
||||
|
||||
## 📞 需要帮助?
|
||||
|
||||
如果遇到其他问题:
|
||||
1. 查看日志文件:`logs/application.log`
|
||||
2. 检查Redis连接:`redis-cli ping`
|
||||
3. 验证端口:`netstat -an | grep 8081`
|
||||
4. 查看本文档的相关章节
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2024年12月25日
|
||||
**状态**: ✅ 所有问题已修复
|
||||
|
|
@ -1,139 +0,0 @@
|
|||
# 礼物打赏模块开发完成总结
|
||||
|
||||
## ✅ 已完成功能
|
||||
|
||||
### 1. 核心功能
|
||||
- ✅ 礼物列表管理
|
||||
- ✅ 直播间送礼
|
||||
- ✅ 私聊送礼
|
||||
- ✅ 礼物记录查询
|
||||
- ✅ 余额扣除与收益增加
|
||||
- ✅ 充值选项管理
|
||||
- ✅ 充值订单创建
|
||||
|
||||
### 2. 技术实现
|
||||
- ✅ 完整的分层架构(Model-Dao-Service-Controller)
|
||||
- ✅ 事务管理(@Transactional)
|
||||
- ✅ 参数验证(@Validated)
|
||||
- ✅ 统一响应格式(CommonResult)
|
||||
- ✅ Swagger API文档
|
||||
- ✅ 用户账单记录
|
||||
|
||||
## 📁 已创建文件清单
|
||||
|
||||
### Model层(实体类)- 3个文件
|
||||
```
|
||||
crmeb-common/src/main/java/com/zbkj/common/model/gift/
|
||||
├── Gift.java # 礼物实体
|
||||
├── GiftRecord.java # 礼物记录实体
|
||||
└── RechargeOption.java # 充值选项实体
|
||||
```
|
||||
|
||||
### Dao层(数据访问)- 3个文件
|
||||
```
|
||||
crmeb-service/src/main/java/com/zbkj/service/dao/
|
||||
├── GiftDao.java
|
||||
├── GiftRecordDao.java
|
||||
└── RechargeOptionDao.java
|
||||
```
|
||||
|
||||
### Service层(业务逻辑)- 6个文件
|
||||
```
|
||||
crmeb-service/src/main/java/com/zbkj/service/service/
|
||||
├── GiftService.java
|
||||
├── GiftRecordService.java
|
||||
├── RechargeOptionService.java
|
||||
└── impl/
|
||||
├── GiftServiceImpl.java
|
||||
├── GiftRecordServiceImpl.java
|
||||
└── RechargeOptionServiceImpl.java
|
||||
```
|
||||
|
||||
### Controller层(API接口)- 1个文件
|
||||
```
|
||||
crmeb-front/src/main/java/com/zbkj/front/controller/
|
||||
└── GiftController.java # 5个API接口
|
||||
```
|
||||
|
||||
### Request/Response(请求响应)- 7个文件
|
||||
```
|
||||
crmeb-front/src/main/java/com/zbkj/front/
|
||||
├── request/
|
||||
│ ├── SendGiftRequest.java
|
||||
│ └── CreateRechargeRequest.java
|
||||
└── response/
|
||||
├── GiftResponse.java
|
||||
├── SendGiftResponse.java
|
||||
├── UserBalanceResponse.java
|
||||
├── RechargeOptionResponse.java
|
||||
└── CreateRec
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🔧 编译问题修复
|
||||
|
||||
### 问题1:Lombok编译错误 ✅ 已修复
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment
|
||||
```
|
||||
|
||||
**修复方案**:
|
||||
在 `pom.xml` 中添加了JVM参数和注解处理器配置:
|
||||
```xml
|
||||
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.30</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
```
|
||||
|
||||
### 问题2:JSON处理代码错误 ✅ 已修复
|
||||
|
||||
**问题代码**:
|
||||
```java
|
||||
message = objectMapper.writeValueAsString(
|
||||
objectMapper.createObjectNode()
|
||||
.setAll((ObjectNode) jsonNode)
|
||||
.put("savedAt", System.currentTimeMillis())
|
||||
);
|
||||
```
|
||||
|
||||
**修复后**:
|
||||
```java
|
||||
if (jsonNode instanceof ObjectNode) {
|
||||
ObjectNode objectNode = (ObjectNode) jsonNode;
|
||||
objectNode.put("savedAt", System.currentTimeMillis());
|
||||
message = objectMapper.writeValueAsString(objectNode);
|
||||
}
|
||||
```
|
||||
|
||||
### 验证编译
|
||||
|
||||
运行以下命令验证修复:
|
||||
```bash
|
||||
cd Zhibo/zhibo-h
|
||||
mvn clean compile -DskipTests
|
||||
```
|
||||
|
||||
或使用快速修复脚本:
|
||||
```bash
|
||||
fix_and_compile.bat
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 相关文档
|
||||
|
||||
- **编译问题修复说明**:`Zhibo/编译问题修复说明.md`
|
||||
- **开发指南更新**:`直播IM系统开发指南.md` - 已标记礼物打赏模块为完成状态
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2024年
|
||||
**状态**: ✅ 所有问题已修复,可以正常编译
|
||||
|
|
@ -1,266 +0,0 @@
|
|||
# 礼物打赏模块部署清单
|
||||
|
||||
## ✅ 部署前检查
|
||||
|
||||
### 1. 数据库表检查
|
||||
```sql
|
||||
-- 执行以下SQL检查表是否存在
|
||||
SHOW TABLES LIKE 'eb_gift';
|
||||
SHOW TABLES LIKE 'eb_gift_reward_record';
|
||||
SHOW TABLES LIKE 'eb_gift_detail';
|
||||
SHOW TABLES LIKE 'eb_gift_quantity';
|
||||
```
|
||||
|
||||
**预期结果**:应该看到4个表
|
||||
|
||||
### 2. 测试数据准备
|
||||
```bash
|
||||
# 执行测试数据脚本
|
||||
mysql -u root -p your_database < zhibo-h/sql/gift_test_data.sql
|
||||
```
|
||||
|
||||
### 3. 代码文件检查
|
||||
|
||||
确认以下文件已创建:
|
||||
|
||||
**Model层(4个):**
|
||||
- [x] `crmeb-common/src/main/java/com/zbkj/common/model/gift/Gift.java`
|
||||
- [x] `crmeb-common/src/main/java/com/zbkj/common/model/gift/GiftRecord.java`
|
||||
- [x] `crmeb-common/src/main/java/com/zbkj/common/model/gift/GiftDetail.java`
|
||||
- [x] `crmeb-common/src/main/java/com/zbkj/common/model/gift/RechargeOption.java`
|
||||
|
||||
**Dao层(4个):**
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/dao/GiftDao.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/dao/GiftRecordDao.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/dao/GiftDetailDao.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/dao/RechargeOptionDao.java`
|
||||
|
||||
**Service层(6个):**
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/service/GiftService.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/service/GiftRecordService.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/service/RechargeOptionService.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/service/impl/GiftServiceImpl.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/service/impl/GiftRecordServiceImpl.java`
|
||||
- [x] `crmeb-service/src/main/java/com/zbkj/service/service/impl/RechargeOptionServiceImpl.java`
|
||||
|
||||
**Controller层(1个):**
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/controller/GiftController.java`
|
||||
|
||||
**Request/Response(7个):**
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/request/SendGiftRequest.java`
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/request/CreateRechargeRequest.java`
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/response/GiftResponse.java`
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/response/SendGiftResponse.java`
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/response/UserBalanceResponse.java`
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/response/RechargeOptionResponse.java`
|
||||
- [x] `crmeb-front/src/main/java/com/zbkj/front/response/CreateRechargeResponse.java`
|
||||
|
||||
## 🚀 部署步骤
|
||||
|
||||
### 步骤1:编译项目
|
||||
```bash
|
||||
cd zhibo-h
|
||||
mvn clean compile -DskipTests
|
||||
```
|
||||
|
||||
或使用脚本:
|
||||
```bash
|
||||
# Windows
|
||||
compile_check.bat
|
||||
```
|
||||
|
||||
**预期结果**:编译成功,无错误
|
||||
|
||||
### 步骤2:打包项目
|
||||
```bash
|
||||
mvn clean package -DskipTests
|
||||
```
|
||||
|
||||
**预期结果**:在 `crmeb-admin/target/` 目录下生成jar包
|
||||
|
||||
### 步骤3:启动服务
|
||||
```bash
|
||||
# 方式1:使用Maven
|
||||
cd crmeb-admin
|
||||
mvn spring-boot:run
|
||||
|
||||
# 方式2:使用jar包
|
||||
cd crmeb-admin/target
|
||||
java -jar crmeb-admin-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
**预期结果**:服务启动成功,监听8081端口
|
||||
|
||||
### 步骤4:验证服务
|
||||
```bash
|
||||
# 检查服务是否启动
|
||||
curl http://localhost:8081/api/front/gift/list
|
||||
```
|
||||
|
||||
**预期结果**:返回JSON格式的礼物列表
|
||||
|
||||
## 🧪 功能测试
|
||||
|
||||
### 测试1:获取礼物列表
|
||||
```bash
|
||||
curl http://localhost:8081/api/front/gift/list
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [...]
|
||||
}
|
||||
```
|
||||
|
||||
### 测试2:获取充值选项
|
||||
```bash
|
||||
curl http://localhost:8081/api/front/gift/recharge/options
|
||||
```
|
||||
|
||||
**预期结果**:返回充值选项列表
|
||||
|
||||
### 测试3:获取用户余额(需要登录)
|
||||
```bash
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:8081/api/front/gift/balance
|
||||
```
|
||||
|
||||
**预期结果**:返回用户余额
|
||||
|
||||
### 测试4:赠送礼物(需要登录)
|
||||
```bash
|
||||
curl -X POST http://localhost:8081/api/front/gift/send \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-d '{
|
||||
"roomId": 1,
|
||||
"streamerId": 2,
|
||||
"giftId": 1,
|
||||
"count": 1,
|
||||
"sceneType": 1
|
||||
}'
|
||||
```
|
||||
|
||||
**预期结果**:返回赠送成功,余额减少
|
||||
|
||||
## 📊 数据验证
|
||||
|
||||
### 验证1:检查礼物数据
|
||||
```sql
|
||||
SELECT * FROM eb_gift WHERE status = 1;
|
||||
```
|
||||
|
||||
**预期结果**:至少有5条礼物记录
|
||||
|
||||
### 验证2:检查充值选项
|
||||
```sql
|
||||
SELECT * FROM eb_gift_quantity WHERE status = 1;
|
||||
```
|
||||
|
||||
**预期结果**:至少有6条充值选项
|
||||
|
||||
### 验证3:检查打赏记录
|
||||
```sql
|
||||
SELECT * FROM eb_gift_reward_record ORDER BY reward_time DESC LIMIT 10;
|
||||
```
|
||||
|
||||
**预期结果**:赠送礼物后应该有记录
|
||||
|
||||
### 验证4:检查用户账单
|
||||
```sql
|
||||
SELECT * FROM eb_user_bill WHERE category = 'gift' ORDER BY create_time DESC LIMIT 10;
|
||||
```
|
||||
|
||||
**预期结果**:赠送礼物后应该有两条记录(一条支出,一条收入)
|
||||
|
||||
## ⚠️ 常见问题
|
||||
|
||||
### 问题1:编译失败
|
||||
**原因**:依赖缺失或版本不兼容
|
||||
**解决**:
|
||||
```bash
|
||||
mvn clean install -DskipTests
|
||||
```
|
||||
|
||||
### 问题2:服务启动失败
|
||||
**原因**:端口被占用或数据库连接失败
|
||||
**解决**:
|
||||
1. 检查8081端口是否被占用
|
||||
2. 检查 `application.yml` 中的数据库配置
|
||||
|
||||
### 问题3:接口返回401
|
||||
**原因**:未登录或token无效
|
||||
**解决**:
|
||||
1. 先调用登录接口获取token
|
||||
2. 在请求头中添加 `Authorization: Bearer YOUR_TOKEN`
|
||||
|
||||
### 问题4:余额不足
|
||||
**原因**:用户余额为0
|
||||
**解决**:
|
||||
```sql
|
||||
UPDATE eb_user SET now_money = 1000.00 WHERE uid = 1;
|
||||
```
|
||||
|
||||
### 问题5:找不到礼物
|
||||
**原因**:礼物数据未插入或状态为禁用
|
||||
**解决**:
|
||||
```sql
|
||||
-- 检查礼物数据
|
||||
SELECT * FROM eb_gift WHERE id = 1;
|
||||
|
||||
-- 启用礼物
|
||||
UPDATE eb_gift SET status = 1 WHERE id = 1;
|
||||
```
|
||||
|
||||
## 📝 部署后检查清单
|
||||
|
||||
- [ ] 服务启动成功
|
||||
- [ ] 可以访问Swagger文档(http://localhost:8081/doc.html)
|
||||
- [ ] 礼物列表接口正常返回
|
||||
- [ ] 充值选项接口正常返回
|
||||
- [ ] 用户余额接口正常返回(需要登录)
|
||||
- [ ] 赠送礼物功能正常(需要登录)
|
||||
- [ ] 数据库记录正确保存
|
||||
- [ ] 用户余额正确扣除
|
||||
- [ ] 主播收益正确增加
|
||||
- [ ] 账单记录正确生成
|
||||
|
||||
## 🎯 性能优化建议
|
||||
|
||||
### 1. 数据库索引
|
||||
```sql
|
||||
-- 为常用查询字段添加索引
|
||||
CREATE INDEX idx_gift_status ON eb_gift(status);
|
||||
CREATE INDEX idx_gift_reward_giver ON eb_gift_reward_record(giver_id);
|
||||
CREATE INDEX idx_gift_reward_receiver ON eb_gift_reward_record(receiver_id);
|
||||
CREATE INDEX idx_gift_reward_time ON eb_gift_reward_record(reward_time);
|
||||
```
|
||||
|
||||
### 2. Redis缓存
|
||||
- 缓存礼物列表(过期时间:1小时)
|
||||
- 缓存充值选项(过期时间:1天)
|
||||
- 缓存用户余额(过期时间:5分钟)
|
||||
|
||||
### 3. 并发控制
|
||||
- 使用Redis分布式锁防止重复扣款
|
||||
- 使用乐观锁更新用户余额
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如遇到问题,请按以下顺序排查:
|
||||
1. 检查服务日志
|
||||
2. 检查数据库连接
|
||||
3. 检查数据是否正确
|
||||
4. 查看详细文档
|
||||
|
||||
---
|
||||
|
||||
**部署完成后,请在此打勾**:□
|
||||
|
||||
**部署人员**:___________
|
||||
|
||||
**部署时间**:___________
|
||||
|
||||
**备注**:___________
|
||||
|
|
@ -1,391 +0,0 @@
|
|||
# 离线消息功能实现说明
|
||||
|
||||
## 📋 功能概述
|
||||
|
||||
离线消息服务是直播IM系统的核心功能之一,用于在用户离线时保存消息,并在用户重新上线时推送给用户。
|
||||
|
||||
## 🎯 核心功能
|
||||
|
||||
### 1. 消息保存
|
||||
- 当用户离线时,系统自动将发送给该用户的消息保存到Redis队列中
|
||||
- 每个用户最多保存100条离线消息(可配置)
|
||||
- 离线消息保存7天后自动过期(可配置)
|
||||
|
||||
### 2. 消息推送
|
||||
- 用户上线时,系统自动推送所有离线消息
|
||||
- 推送完成后自动清除已推送的离线消息
|
||||
|
||||
### 3. 消息管理
|
||||
- 获取离线消息数量
|
||||
- 获取离线消息列表(支持分页)
|
||||
- 删除指定数量的离线消息
|
||||
- 清空所有离线消息
|
||||
|
||||
## 🏗️ 技术架构
|
||||
|
||||
### 数据存储
|
||||
|
||||
使用Redis List存储离线消息:
|
||||
|
||||
```
|
||||
Key格式: offline:msg:{userId}
|
||||
数据结构: List
|
||||
过期时间: 7天
|
||||
最大长度: 100条
|
||||
```
|
||||
|
||||
### 核心类说明
|
||||
|
||||
#### 1. OfflineMessageService (接口)
|
||||
定义离线消息服务的所有方法:
|
||||
- `saveOfflineMessage()` - 保存离线消息
|
||||
- `getOfflineMessages()` - 获取离线消息(分页)
|
||||
- `getAllOfflineMessages()` - 获取所有离线消息
|
||||
- `clearOfflineMessages()` - 清空离线消息
|
||||
- `getOfflineMessageCount()` - 获取消息数量
|
||||
- `removeOfflineMessages()` - 删除指定数量的消息
|
||||
|
||||
#### 2. OfflineMessageServiceImpl (实现类)
|
||||
实现离线消息服务的具体逻辑:
|
||||
- 使用RedisUtil操作Redis
|
||||
- 自动添加时间戳
|
||||
- 限制消息数量
|
||||
- 设置过期时间
|
||||
|
||||
#### 3. OfflineMessageController (控制器)
|
||||
提供HTTP接口:
|
||||
- `GET /api/front/offline-messages/count/{userId}` - 获取消息数量
|
||||
- `GET /api/front/offline-messages/list/{userId}` - 获取消息列表
|
||||
- `GET /api/front/offline-messages/all/{userId}` - 获取所有消息
|
||||
- `DELETE /api/front/offline-messages/clear/{userId}` - 清空消息
|
||||
- `DELETE /api/front/offline-messages/remove/{userId}` - 删除指定数量
|
||||
- `POST /api/front/offline-messages/save` - 保存消息(测试接口)
|
||||
|
||||
#### 4. OfflineMessageCleanupTask (定时任务)
|
||||
定期清理和监控离线消息:
|
||||
- 每天凌晨3点统计离线消息使用情况
|
||||
- 每小时检查离线消息健康状况
|
||||
- 发现异常大的消息队列时发出告警
|
||||
|
||||
## 🔄 工作流程
|
||||
|
||||
### 消息发送流程
|
||||
|
||||
```
|
||||
1. 用户A发送消息给用户B
|
||||
↓
|
||||
2. 检查用户B是否在线
|
||||
↓
|
||||
3. 如果在线 → 直接推送消息
|
||||
↓
|
||||
4. 如果离线 → 保存到离线消息队列
|
||||
↓
|
||||
5. 用户B上线时 → 自动推送离线消息
|
||||
↓
|
||||
6. 推送完成 → 清除已推送的消息
|
||||
```
|
||||
|
||||
### WebSocket集成
|
||||
|
||||
在`PrivateChatHandler`中已经集成了离线消息功能:
|
||||
|
||||
```java
|
||||
@Override
|
||||
public void afterConnectionEstablished(WebSocketSession session) {
|
||||
// ... 连接建立逻辑 ...
|
||||
|
||||
// 推送离线消息
|
||||
List<String> offlineMessages = offlineMessageService.getAllOfflineMessages(userId);
|
||||
if (!offlineMessages.isEmpty()) {
|
||||
for (String offlineMsg : offlineMessages) {
|
||||
sendToSession(session, offlineMsg);
|
||||
}
|
||||
// 清除已推送的离线消息
|
||||
offlineMessageService.clearOfflineMessages(userId);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
在消息发送时检查用户是否在线:
|
||||
|
||||
```java
|
||||
// 检查对方是否在线
|
||||
if (onlineStatusService.isUserOnline(otherUserId)) {
|
||||
// 在线则直接推送
|
||||
notifyUser(otherUserId, buildNewMessageNotification(conversationId, response));
|
||||
} else {
|
||||
// 离线则保存为离线消息
|
||||
offlineMessageService.saveOfflineMessage(otherUserId, chatMsg);
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 Redis数据结构
|
||||
|
||||
### 离线消息队列
|
||||
|
||||
```redis
|
||||
# Key格式
|
||||
offline:msg:{userId}
|
||||
|
||||
# 数据类型
|
||||
List
|
||||
|
||||
# 示例数据
|
||||
LRANGE offline:msg:1 0 -1
|
||||
1) "{\"type\":\"chat\",\"content\":\"你好\",\"timestamp\":1234567890,\"savedAt\":1234567900}"
|
||||
2) "{\"type\":\"chat\",\"content\":\"在吗\",\"timestamp\":1234567891,\"savedAt\":1234567901}"
|
||||
|
||||
# 过期时间
|
||||
TTL offline:msg:1
|
||||
604800 # 7天 = 7 * 24 * 3600秒
|
||||
```
|
||||
|
||||
### 消息格式
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "chat",
|
||||
"messageId": "msg_123456",
|
||||
"userId": 2,
|
||||
"username": "张三",
|
||||
"avatarUrl": "http://example.com/avatar.jpg",
|
||||
"message": "你好,在吗?",
|
||||
"timestamp": 1234567890,
|
||||
"savedAt": 1234567900,
|
||||
"status": "sent"
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 配置说明
|
||||
|
||||
### 可配置参数
|
||||
|
||||
在`OfflineMessageServiceImpl`中:
|
||||
|
||||
```java
|
||||
// 离线消息最大保存数量(每个用户)
|
||||
private static final int MAX_OFFLINE_MESSAGES = 100;
|
||||
|
||||
// 离线消息过期时间(秒)- 7天
|
||||
private static final long OFFLINE_MESSAGE_EXPIRE_SECONDS = 7 * 24 * 3600;
|
||||
```
|
||||
|
||||
### 修改配置
|
||||
|
||||
如果需要修改配置,可以:
|
||||
|
||||
1. 直接修改常量值
|
||||
2. 或者改为从配置文件读取:
|
||||
|
||||
```java
|
||||
@Value("${offline.message.max-count:100}")
|
||||
private int maxOfflineMessages;
|
||||
|
||||
@Value("${offline.message.expire-seconds:604800}")
|
||||
private long offlineMessageExpireSeconds;
|
||||
```
|
||||
|
||||
然后在`application.yml`中配置:
|
||||
|
||||
```yaml
|
||||
offline:
|
||||
message:
|
||||
max-count: 100 # 最大保存数量
|
||||
expire-seconds: 604800 # 过期时间(7天)
|
||||
```
|
||||
|
||||
## 🧪 测试方法
|
||||
|
||||
### 1. 使用测试HTML页面
|
||||
|
||||
打开`测试离线消息功能.html`文件,可以测试:
|
||||
- 保存离线消息
|
||||
- 获取离线消息
|
||||
- 删除离线消息
|
||||
- 清空离线消息
|
||||
|
||||
### 2. 使用Postman测试
|
||||
|
||||
#### 保存离线消息
|
||||
```http
|
||||
POST http://localhost:8081/api/front/offline-messages/save?userId=1
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"type": "chat",
|
||||
"content": "测试消息",
|
||||
"timestamp": 1234567890
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取消息数量
|
||||
```http
|
||||
GET http://localhost:8081/api/front/offline-messages/count/1
|
||||
```
|
||||
|
||||
#### 获取消息列表
|
||||
```http
|
||||
GET http://localhost:8081/api/front/offline-messages/list/1?limit=50
|
||||
```
|
||||
|
||||
#### 获取所有消息
|
||||
```http
|
||||
GET http://localhost:8081/api/front/offline-messages/all/1
|
||||
```
|
||||
|
||||
#### 删除指定数量
|
||||
```http
|
||||
DELETE http://localhost:8081/api/front/offline-messages/remove/1?count=5
|
||||
```
|
||||
|
||||
#### 清空所有消息
|
||||
```http
|
||||
DELETE http://localhost:8081/api/front/offline-messages/clear/1
|
||||
```
|
||||
|
||||
### 3. 使用Redis CLI测试
|
||||
|
||||
```bash
|
||||
# 查看用户1的离线消息
|
||||
redis-cli LRANGE offline:msg:1 0 -1
|
||||
|
||||
# 查看消息数量
|
||||
redis-cli LLEN offline:msg:1
|
||||
|
||||
# 查看过期时间
|
||||
redis-cli TTL offline:msg:1
|
||||
|
||||
# 手动添加消息
|
||||
redis-cli LPUSH offline:msg:1 '{"type":"chat","content":"测试"}'
|
||||
|
||||
# 手动删除消息
|
||||
redis-cli DEL offline:msg:1
|
||||
```
|
||||
|
||||
## 📈 性能优化
|
||||
|
||||
### 1. 批量操作
|
||||
- 使用Redis Pipeline批量获取多个用户的离线消息
|
||||
- 减少网络往返次数
|
||||
|
||||
### 2. 消息限制
|
||||
- 限制每个用户最多100条离线消息
|
||||
- 超过限制时自动删除最旧的消息
|
||||
- 避免内存占用过大
|
||||
|
||||
### 3. 过期策略
|
||||
- 设置7天过期时间
|
||||
- Redis自动清理过期数据
|
||||
- 减少手动清理的开销
|
||||
|
||||
### 4. 异步推送
|
||||
- 用户上线时异步推送离线消息
|
||||
- 不阻塞WebSocket连接建立
|
||||
- 提高用户体验
|
||||
|
||||
## 🔒 安全考虑
|
||||
|
||||
### 1. 权限验证
|
||||
- 只能获取自己的离线消息
|
||||
- 需要在Controller中添加Token验证
|
||||
- 防止越权访问
|
||||
|
||||
### 2. 消息加密
|
||||
- 敏感消息可以加密存储
|
||||
- 推送时解密
|
||||
- 保护用户隐私
|
||||
|
||||
### 3. 限流保护
|
||||
- 限制API调用频率
|
||||
- 防止恶意刷接口
|
||||
- 保护系统稳定性
|
||||
|
||||
## 🐛 常见问题
|
||||
|
||||
### 1. 离线消息没有推送?
|
||||
|
||||
**可能原因:**
|
||||
- 用户没有真正离线(还有其他设备在线)
|
||||
- WebSocket连接建立失败
|
||||
- Redis连接异常
|
||||
|
||||
**解决方法:**
|
||||
- 检查在线状态服务
|
||||
- 查看WebSocket连接日志
|
||||
- 检查Redis连接
|
||||
|
||||
### 2. 离线消息丢失?
|
||||
|
||||
**可能原因:**
|
||||
- Redis数据过期
|
||||
- 消息超过100条被删除
|
||||
- Redis重启导致数据丢失
|
||||
|
||||
**解决方法:**
|
||||
- 增加过期时间
|
||||
- 增加最大消息数量
|
||||
- 启用Redis持久化(AOF/RDB)
|
||||
|
||||
### 3. 离线消息重复推送?
|
||||
|
||||
**可能原因:**
|
||||
- 清除消息失败
|
||||
- 用户多次连接
|
||||
- 并发问题
|
||||
|
||||
**解决方法:**
|
||||
- 添加消息去重逻辑
|
||||
- 使用分布式锁
|
||||
- 检查清除逻辑
|
||||
|
||||
## 📝 后续优化建议
|
||||
|
||||
### 1. 消息持久化
|
||||
- 将重要消息同时保存到MySQL
|
||||
- Redis作为缓存,MySQL作为持久化存储
|
||||
- 提高数据可靠性
|
||||
|
||||
### 2. 消息优先级
|
||||
- 支持消息优先级
|
||||
- 重要消息优先推送
|
||||
- 普通消息延迟推送
|
||||
|
||||
### 3. 消息分类
|
||||
- 支持不同类型的离线消息
|
||||
- 文本消息、图片消息、系统通知等
|
||||
- 分别处理和展示
|
||||
|
||||
### 4. 消息统计
|
||||
- 统计离线消息的发送量
|
||||
- 分析用户活跃度
|
||||
- 优化推送策略
|
||||
|
||||
### 5. 消息推送优化
|
||||
- 支持增量推送
|
||||
- 避免一次性推送大量消息
|
||||
- 提高用户体验
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [直播IM系统开发指南.md](./直播IM系统开发指南.md)
|
||||
- [WebSocket增强功能实现说明.md](./WebSocket增强功能实现说明.md)
|
||||
- [功能验证清单.md](./功能验证清单.md)
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
离线消息功能已经完整实现,包括:
|
||||
|
||||
✅ 消息保存和推送
|
||||
✅ HTTP接口管理
|
||||
✅ WebSocket集成
|
||||
✅ 定时清理任务
|
||||
✅ 测试页面
|
||||
✅ 完整文档
|
||||
|
||||
可以开始测试和使用了!
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2024-12-25
|
||||
**作者:** Kiro AI Assistant
|
||||
|
|
@ -1,339 +0,0 @@
|
|||
# 离线消息功能 - 快速开始指南
|
||||
|
||||
## 🚀 5分钟快速测试
|
||||
|
||||
### 前提条件
|
||||
|
||||
确保以下服务已启动:
|
||||
- ✅ Redis (端口6379)
|
||||
- ✅ 后端服务 (端口8081)
|
||||
|
||||
### 步骤1: 启动服务
|
||||
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd Zhibo/zhibo-h
|
||||
|
||||
# 启动后端服务
|
||||
cd crmeb-front
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
等待看到以下日志:
|
||||
```
|
||||
Started CrmebFrontApplication in XX seconds
|
||||
```
|
||||
|
||||
### 步骤2: 打开测试页面
|
||||
|
||||
在浏览器中打开:
|
||||
```
|
||||
Zhibo/测试离线消息功能.html
|
||||
```
|
||||
|
||||
### 步骤3: 配置测试参数
|
||||
|
||||
在测试页面中:
|
||||
1. **API基础地址**: `http://localhost:8081` (默认)
|
||||
2. **用户ID**: `1` (可以修改为任意数字)
|
||||
|
||||
### 步骤4: 测试保存消息
|
||||
|
||||
点击 **"保存10条测试消息"** 按钮
|
||||
|
||||
**预期结果**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "成功保存 10 条测试消息"
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤5: 查看消息
|
||||
|
||||
点击 **"获取消息列表"** 按钮
|
||||
|
||||
**预期结果**:
|
||||
- 显示统计卡片:消息数量 = 10
|
||||
- 显示消息列表,包含10条测试消息
|
||||
- 每条消息显示内容和时间戳
|
||||
|
||||
### 步骤6: 删除消息
|
||||
|
||||
1. 在 **"删除数量"** 输入框中输入 `5`
|
||||
2. 点击 **"删除指定数量"** 按钮
|
||||
|
||||
**预期结果**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "删除离线消息成功"
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤7: 验证删除
|
||||
|
||||
再次点击 **"获取消息数量"** 按钮
|
||||
|
||||
**预期结果**:
|
||||
- 消息数量 = 5 (原来10条,删除了5条)
|
||||
|
||||
### 步骤8: 清空消息
|
||||
|
||||
点击 **"清空所有消息"** 按钮,确认操作
|
||||
|
||||
**预期结果**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "清除离线消息成功"
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤9: 验证清空
|
||||
|
||||
再次点击 **"获取消息数量"** 按钮
|
||||
|
||||
**预期结果**:
|
||||
- 消息数量 = 0
|
||||
|
||||
---
|
||||
|
||||
## 🧪 使用命令行测试
|
||||
|
||||
### 测试1: 保存消息
|
||||
|
||||
```bash
|
||||
curl -X POST "http://localhost:8081/api/front/offline-messages/save?userId=1" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"type":"chat","content":"Hello World","timestamp":1234567890}'
|
||||
```
|
||||
|
||||
### 测试2: 获取数量
|
||||
|
||||
```bash
|
||||
curl http://localhost:8081/api/front/offline-messages/count/1
|
||||
```
|
||||
|
||||
### 测试3: 获取列表
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8081/api/front/offline-messages/list/1?limit=50"
|
||||
```
|
||||
|
||||
### 测试4: 删除消息
|
||||
|
||||
```bash
|
||||
curl -X DELETE "http://localhost:8081/api/front/offline-messages/remove/1?count=5"
|
||||
```
|
||||
|
||||
### 测试5: 清空消息
|
||||
|
||||
```bash
|
||||
curl -X DELETE http://localhost:8081/api/front/offline-messages/clear/1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 使用Redis CLI验证
|
||||
|
||||
### 查看离线消息
|
||||
|
||||
```bash
|
||||
# 查看用户1的所有离线消息
|
||||
redis-cli LRANGE offline:msg:1 0 -1
|
||||
|
||||
# 查看消息数量
|
||||
redis-cli LLEN offline:msg:1
|
||||
|
||||
# 查看过期时间(秒)
|
||||
redis-cli TTL offline:msg:1
|
||||
```
|
||||
|
||||
### 手动操作
|
||||
|
||||
```bash
|
||||
# 手动添加消息
|
||||
redis-cli LPUSH offline:msg:1 '{"type":"chat","content":"测试"}'
|
||||
|
||||
# 手动删除消息
|
||||
redis-cli DEL offline:msg:1
|
||||
|
||||
# 查看所有离线消息Key
|
||||
redis-cli KEYS "offline:msg:*"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 完整测试流程
|
||||
|
||||
### 场景: 用户离线时收到消息
|
||||
|
||||
#### 1. 用户A和用户B都在线
|
||||
|
||||
```bash
|
||||
# 打开两个浏览器窗口
|
||||
# 窗口1: 用户A (userId=1) 连接WebSocket
|
||||
# 窗口2: 用户B (userId=2) 连接WebSocket
|
||||
```
|
||||
|
||||
#### 2. 用户B断开连接(模拟离线)
|
||||
|
||||
```bash
|
||||
# 关闭窗口2的WebSocket连接
|
||||
```
|
||||
|
||||
#### 3. 用户A发送消息给用户B
|
||||
|
||||
```bash
|
||||
# 在窗口1中发送消息
|
||||
# 消息会被保存到Redis: offline:msg:2
|
||||
```
|
||||
|
||||
#### 4. 验证离线消息已保存
|
||||
|
||||
```bash
|
||||
# 查看用户B的离线消息数量
|
||||
curl http://localhost:8081/api/front/offline-messages/count/2
|
||||
|
||||
# 或使用Redis CLI
|
||||
redis-cli LLEN offline:msg:2
|
||||
```
|
||||
|
||||
#### 5. 用户B重新上线
|
||||
|
||||
```bash
|
||||
# 重新打开窗口2,用户B连接WebSocket
|
||||
# 系统会自动推送离线消息
|
||||
```
|
||||
|
||||
#### 6. 验证离线消息已推送并清除
|
||||
|
||||
```bash
|
||||
# 再次查看用户B的离线消息数量
|
||||
curl http://localhost:8081/api/front/offline-messages/count/2
|
||||
# 应该返回 0,因为消息已推送并清除
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 监控和调试
|
||||
|
||||
### 查看日志
|
||||
|
||||
```bash
|
||||
# 查看离线消息相关日志
|
||||
grep "OfflineMessage" logs/application.log
|
||||
|
||||
# 查看保存消息日志
|
||||
grep "保存离线消息" logs/application.log
|
||||
|
||||
# 查看推送消息日志
|
||||
grep "推送离线消息" logs/application.log
|
||||
|
||||
# 查看清除消息日志
|
||||
grep "清除离线消息" logs/application.log
|
||||
```
|
||||
|
||||
### 监控Redis
|
||||
|
||||
```bash
|
||||
# 实时监控Redis命令
|
||||
redis-cli MONITOR
|
||||
|
||||
# 查看Redis内存使用
|
||||
redis-cli INFO memory
|
||||
|
||||
# 查看Key数量
|
||||
redis-cli DBSIZE
|
||||
|
||||
# 查看离线消息Key的数量
|
||||
redis-cli KEYS "offline:msg:*" | wc -l
|
||||
```
|
||||
|
||||
### 性能测试
|
||||
|
||||
```bash
|
||||
# 批量保存1000条消息
|
||||
for i in {1..1000}; do
|
||||
curl -X POST "http://localhost:8081/api/front/offline-messages/save?userId=1" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"type\":\"chat\",\"content\":\"Message $i\",\"timestamp\":$(date +%s)}" \
|
||||
> /dev/null 2>&1
|
||||
done
|
||||
|
||||
# 查看消息数量(应该只有100条,因为有数量限制)
|
||||
curl http://localhost:8081/api/front/offline-messages/count/1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ❓ 常见问题
|
||||
|
||||
### Q1: 消息没有保存?
|
||||
|
||||
**检查步骤**:
|
||||
1. Redis是否运行: `redis-cli ping`
|
||||
2. 后端服务是否启动: `curl http://localhost:8081/api/front/online/stats`
|
||||
3. 查看错误日志: `grep "ERROR" logs/application.log`
|
||||
|
||||
### Q2: 消息没有推送?
|
||||
|
||||
**检查步骤**:
|
||||
1. 用户是否真的离线: `curl http://localhost:8081/api/front/online/status/用户ID`
|
||||
2. WebSocket是否连接成功
|
||||
3. 查看推送日志: `grep "推送离线消息" logs/application.log`
|
||||
|
||||
### Q3: 消息数量不对?
|
||||
|
||||
**原因**:
|
||||
- 离线消息最多保存100条
|
||||
- 超过100条会自动删除最旧的消息
|
||||
- 消息会在7天后自动过期
|
||||
|
||||
**解决方法**:
|
||||
- 修改 `MAX_OFFLINE_MESSAGES` 常量
|
||||
- 修改 `OFFLINE_MESSAGE_EXPIRE_SECONDS` 常量
|
||||
|
||||
### Q4: Redis中看不到数据?
|
||||
|
||||
**可能原因**:
|
||||
1. 消息已过期被删除
|
||||
2. 消息已被推送并清除
|
||||
3. Redis数据库选择错误(应该是database 0)
|
||||
|
||||
**验证方法**:
|
||||
```bash
|
||||
# 确保使用正确的数据库
|
||||
redis-cli -n 0 KEYS "offline:msg:*"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 测试成功标志
|
||||
|
||||
当你完成以上所有步骤后,应该看到:
|
||||
|
||||
✅ 消息可以成功保存
|
||||
✅ 消息可以正确获取
|
||||
✅ 消息可以删除指定数量
|
||||
✅ 消息可以全部清空
|
||||
✅ 用户上线时自动推送
|
||||
✅ 推送后自动清除
|
||||
✅ Redis中数据正确
|
||||
✅ 日志记录完整
|
||||
|
||||
**恭喜!离线消息功能已经可以正常使用了!** 🚀
|
||||
|
||||
---
|
||||
|
||||
## 📚 下一步
|
||||
|
||||
- 阅读 [离线消息功能实现说明.md](./离线消息功能实现说明.md) 了解详细实现
|
||||
- 阅读 [功能验证清单.md](./功能验证清单.md) 进行完整测试
|
||||
- 阅读 [直播IM系统开发指南.md](./直播IM系统开发指南.md) 了解整体架构
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0
|
||||
**最后更新**: 2024-12-25
|
||||
|
|
@ -1,297 +0,0 @@
|
|||
# 直播管理端完成进度报告
|
||||
|
||||
**生成日期**: 2025-12-30
|
||||
**更新时间**: 2025-12-30
|
||||
|
||||
---
|
||||
|
||||
## 一、数据库表完成情况
|
||||
|
||||
### 1.1 已有数据库表(原系统)
|
||||
|
||||
| 表名 | 说明 | 状态 |
|
||||
|------|------|------|
|
||||
| eb_gift | 礼物管理 | ✅ 已有 |
|
||||
| eb_gift_quantity | 礼物数量配置 | ✅ 已有 |
|
||||
| eb_headwear | 头饰管理 | ✅ 已有 |
|
||||
| eb_mount | 坐骑管理 | ✅ 已有 |
|
||||
| eb_mount_order | 坐骑订单 | ✅ 已有 |
|
||||
| eb_noble_level | 贵族等级 | ✅ 已有 |
|
||||
| eb_room | 直播间 | ✅ 已有 |
|
||||
| eb_room_background | 房间背景 | ✅ 已有 |
|
||||
| eb_room_flow | 房间流水 | ✅ 已有 |
|
||||
| eb_room_type | 房间类型 | ✅ 已有 |
|
||||
| eb_activity_style | 活动样式 | ✅ 已有 |
|
||||
| eb_user_level | 用户等级 | ✅ 已有 |
|
||||
|
||||
### 1.2 新增数据库表(zhibo_live_tables.sql)
|
||||
|
||||
| 表名 | 说明 | 状态 |
|
||||
|------|------|------|
|
||||
| eb_family | 家族管理 | ✅ 已创建 |
|
||||
| eb_family_member | 家族成员 | ✅ 已创建 |
|
||||
| eb_family_level | 家族等级 | ✅ 已创建 |
|
||||
| eb_dynamic | 动态管理 | ✅ 已创建 |
|
||||
| eb_dynamic_comment | 动态评论 | ✅ 已创建 |
|
||||
| eb_call | 通话记录 | ✅ 已创建 |
|
||||
| eb_session | 会话记录 | ✅ 已创建 |
|
||||
| eb_charm_level | 魅力等级 | ✅ 已创建 |
|
||||
| eb_banner | 轮播图 | ✅ 已创建 |
|
||||
| eb_blacklist | 黑名单 | ✅ 已创建 |
|
||||
| eb_follow | 关注记录 | ✅ 已创建 |
|
||||
| eb_fan_group | 粉丝团 | ✅ 已创建 |
|
||||
| eb_fan_group_member | 粉丝团成员 | ✅ 已创建 |
|
||||
| eb_lottery | 抽奖活动 | ✅ 已创建 |
|
||||
| eb_lottery_prize | 抽奖奖品 | ✅ 已创建 |
|
||||
| eb_lottery_record | 抽奖记录 | ✅ 已创建 |
|
||||
| eb_lottery_config | 抽奖配置 | ✅ 已创建 |
|
||||
| eb_lottery_probability | 抽奖概率配置 | ✅ 已创建 |
|
||||
| eb_sensitive_word | 敏感词 | ✅ 已创建 |
|
||||
| eb_system_message | 系统消息 | ✅ 已创建 |
|
||||
| eb_novice_task | 新手任务 | ✅ 已创建 |
|
||||
| eb_user_task | 用户任务进度 | ✅ 已创建 |
|
||||
| eb_user_task_record | 用户任务记录 | ✅ 已创建 |
|
||||
| eb_user_signin_record | 用户签到记录 | ✅ 已创建 |
|
||||
| eb_chat_phrase | 聊天常用语 | ✅ 已创建 |
|
||||
| eb_appeal | 申诉 | ✅ 已创建 |
|
||||
| eb_certification | 认证 | ✅ 已创建 |
|
||||
| eb_report | 举报 | ✅ 已创建 |
|
||||
| eb_withdraw | 提现 | ✅ 已创建 |
|
||||
| eb_withdraw_amount | 提现金额配置 | ✅ 已创建 |
|
||||
| eb_coin_exchange_config | 金币兑换配置 | ✅ 已创建 |
|
||||
| eb_client_version | 客户端版本 | ✅ 已创建 |
|
||||
| eb_system_version | 系统版本 | ✅ 已创建 |
|
||||
| eb_activity | 平台活动 | ✅ 已创建 |
|
||||
| eb_platform_activity | 平台活动(旧) | ✅ 已创建 |
|
||||
| eb_gift_record | 礼物记录 | ✅ 已创建 |
|
||||
| eb_feedback | 用户反馈 | ✅ 已创建 |
|
||||
| eb_friend | 好友关系 | ✅ 已创建 |
|
||||
| eb_friend_request | 好友申请 | ✅ 已创建 |
|
||||
| eb_agent | 代理商 | ✅ 已创建 |
|
||||
| eb_agent_message | 代理商消息 | ✅ 已创建 |
|
||||
| eb_agent_withdraw | 代理商提现 | ✅ 已创建 |
|
||||
| eb_chat_pay_config | 聊天付费配置 | ✅ 已创建 |
|
||||
| eb_gold_diamond_config | 金币钻石配置 | ✅ 已创建 |
|
||||
| eb_invite | 邀请记录 | ✅ 已创建 |
|
||||
| eb_match_text | 匹配文案 | ✅ 已创建 |
|
||||
| eb_member_package | 会员套餐 | ✅ 已创建 |
|
||||
| eb_sign_config | 签到配置 | ✅ 已创建 |
|
||||
| eb_user_sign | 用户签到记录 | ✅ 已创建 |
|
||||
| eb_diamond_recharge_amount | 钻石充值金额配置 | ✅ 已创建 |
|
||||
| eb_customer_service | 客服联系方式 | ✅ 已创建 |
|
||||
| eb_customer_service_group | 客服分组 | ✅ 已创建 |
|
||||
| eb_recharge_order | 充值订单 | ✅ 已创建 |
|
||||
| eb_exchange_record | 兑换记录 | ✅ 已创建 |
|
||||
|
||||
---
|
||||
|
||||
## 二、管理端前端页面完成情况
|
||||
|
||||
### 2.1 直播核心功能模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 贵族管理 | noble/list.vue | 列表/添加/编辑/删除/批量删除 | ✅ 完成 |
|
||||
| 礼物管理 | gift/index.vue | 列表/添加/编辑/删除/批量删除 | ✅ 完成 |
|
||||
| 礼物数量 | giftnum/index.vue | 礼物数量配置 | ✅ 完成 |
|
||||
| 头饰管理 | headwear/index.vue | 列表/添加/编辑/删除/批量删除 | ✅ 完成 |
|
||||
| 坐骑管理 | mount/list/index.vue | 列表/添加/编辑/删除/批量删除 | ✅ 完成 |
|
||||
| 坐骑订单 | mount/order/index.vue | 订单列表/查看 | ✅ 完成 |
|
||||
| 魅力等级 | charm/index.vue | 列表/添加/编辑/删除/批量删除 | ✅ 完成 |
|
||||
| 直播间管理 | room/list/index.vue | 列表/查看/编辑/删除 | ✅ 完成 |
|
||||
| 房间类型 | room/type/index.vue | 类型配置 | ✅ 完成 |
|
||||
| 房间背景 | room/background/index.vue | 背景管理 | ✅ 完成 |
|
||||
|
||||
### 2.2 用户社交模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 家族管理 | family/list/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
| 家族等级 | family/level/index.vue | 等级配置 | ✅ 完成 |
|
||||
| 家族成员 | family/member/index.vue | 成员管理 | ✅ 完成 |
|
||||
| 动态管理 | dynamic/list/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
| 动态评论 | dynamic/comment/index.vue | 评论管理 | ✅ 完成 |
|
||||
| 评论管理 | comment/dynamic/index.vue | 评论列表/删除 | ✅ 完成 |
|
||||
| 粉丝团 | fanGroup/list/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
| 关注记录 | follow/record/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
| 好友列表 | friend/list/index.vue | 好友管理 | ✅ 完成 |
|
||||
| 好友申请 | friend/requests/index.vue | 申请管理 | ✅ 完成 |
|
||||
| 黑名单 | blacklist/index.vue | 用户/房间黑名单 | ✅ 完成 |
|
||||
|
||||
### 2.3 通讯记录模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 通话记录 | call/list/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
| 通话统计 | call/statistics/index.vue | 统计分析 | ✅ 完成 |
|
||||
| 会话记录 | session/list/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
| 礼物记录 | giftreward/index.vue | 列表/查看/删除/批量删除 | ✅ 完成 |
|
||||
|
||||
### 2.4 运营管理模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 轮播图 | banner/index.vue | 列表/添加/编辑/删除 | ✅ 完成 |
|
||||
| 平台活动 | activity/index.vue | 列表/添加/编辑/删除/状态切换 | ✅ 完成 |
|
||||
| 抽奖活动 | lottery/index.vue | 列表/添加/编辑/删除/状态切换 | ✅ 完成 |
|
||||
| 抽奖奖品 | lottery/prize/index.vue | 奖品配置 | ✅ 完成 |
|
||||
| 系统消息 | systemMessage/list/index.vue | 列表/添加/编辑/删除 | ✅ 完成 |
|
||||
| 新手任务 | noviceTask/list/index.vue | 列表/添加/编辑/删除 | ✅ 完成 |
|
||||
| 聊天常用语 | chatphrase/index.vue | 列表/添加/编辑/删除/状态切换 | ✅ 完成 |
|
||||
| 敏感词 | sensitiveWord/list/index.vue | 列表/添加/编辑/删除 | ✅ 完成 |
|
||||
|
||||
### 2.5 审核管理模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 认证审核 | certification/index.vue | 列表/审核通过/拒绝 | ✅ 完成 |
|
||||
| 申诉管理 | appeal/index.vue | 列表/处理/回复 | ✅ 完成 |
|
||||
| 举报管理 | reportFeedback/reportList/index.vue | 列表/处理 | ✅ 完成 |
|
||||
| 用户反馈 | help/feedback/index.vue | 列表/处理/回复 | ✅ 完成 |
|
||||
|
||||
### 2.6 财务管理模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 提现待审核 | withdraw/pending/index.vue | 待审核列表 | ✅ 完成 |
|
||||
| 提现已审核 | withdraw/approved/index.vue | 已审核列表 | ✅ 完成 |
|
||||
| 提现金额配置 | withdraw/amount/index.vue | 金额配置 | ✅ 完成 |
|
||||
| 金币兑换配置 | coinexchange/index.vue | 兑换比例/手续费配置 | ✅ 完成 |
|
||||
|
||||
### 2.7 系统配置模块
|
||||
|
||||
| 模块 | 页面路径 | 功能 | 状态 |
|
||||
|------|----------|------|------|
|
||||
| 客户端版本 | clientVersion/list/index.vue | 版本管理/强制更新 | ✅ 完成 |
|
||||
|
||||
---
|
||||
|
||||
## 三、API接口文件完成情况
|
||||
|
||||
| API文件 | 说明 | 状态 |
|
||||
|---------|------|------|
|
||||
| api/noble.js | 贵族管理接口 | ✅ 完成 |
|
||||
| api/gift.js | 礼物管理接口 | ✅ 完成 |
|
||||
| api/headwear.js | 头饰管理接口 | ✅ 完成 |
|
||||
| api/mount.js | 坐骑管理接口 | ✅ 完成 |
|
||||
| api/charm.js | 魅力等级接口 | ✅ 完成 |
|
||||
| api/room.js | 直播间接口 | ✅ 完成 |
|
||||
| api/family.js | 家族管理接口 | ✅ 完成 |
|
||||
| api/dynamic.js | 动态管理接口 | ✅ 完成 |
|
||||
| api/call.js | 通话记录接口 | ✅ 完成 |
|
||||
| api/session.js | 会话记录接口 | ✅ 完成 |
|
||||
| api/fanGroup.js | 粉丝团接口 | ✅ 完成 |
|
||||
| api/follow.js | 关注记录接口 | ✅ 完成 |
|
||||
| api/blacklist.js | 黑名单接口 | ✅ 完成 |
|
||||
| api/banner.js | 轮播图接口 | ✅ 完成 |
|
||||
| api/activity.js | 平台活动接口 | ✅ 完成 |
|
||||
| api/lottery.js | 抽奖活动接口 | ✅ 完成 |
|
||||
| api/systemMessage.js | 系统消息接口 | ✅ 完成 |
|
||||
| api/noviceTask.js | 新手任务接口 | ✅ 完成 |
|
||||
| api/chatPhraseManage.js | 聊天常用语接口 | ✅ 完成 |
|
||||
| api/sensitiveWord.js | 敏感词接口 | ✅ 完成 |
|
||||
| api/certification.js | 认证审核接口 | ✅ 完成 |
|
||||
| api/appeal.js | 申诉管理接口 | ✅ 完成 |
|
||||
| api/report.js | 举报管理接口 | ✅ 完成 |
|
||||
| api/feedback.js | 用户反馈接口 | ✅ 完成 |
|
||||
| api/withdraw.js | 提现管理接口 | ✅ 完成 |
|
||||
| api/coinExchange.js | 金币兑换接口 | ✅ 完成 |
|
||||
| api/clientVersion.js | 客户端版本接口 | ✅ 完成 |
|
||||
| api/giftRecord.js | 礼物记录接口 | ✅ 完成 |
|
||||
|
||||
---
|
||||
|
||||
## 四、完成进度统计
|
||||
|
||||
### 4.1 总体进度
|
||||
|
||||
| 类别 | 总数 | 已完成 | 完成率 |
|
||||
|------|------|--------|--------|
|
||||
| 数据库表 | 66 | 66 | 100% |
|
||||
| 前端页面 | 45+ | 45+ | 100% |
|
||||
| API接口文件 | 100+ | 100+ | 100% |
|
||||
| 后端Controller | 120+ | 120+ | 100% |
|
||||
|
||||
### 4.2 功能完成度
|
||||
|
||||
- ✅ **直播核心功能**: 100% 完成
|
||||
- ✅ **用户社交功能**: 100% 完成
|
||||
- ✅ **通讯记录功能**: 100% 完成
|
||||
- ✅ **运营管理功能**: 100% 完成
|
||||
- ✅ **审核管理功能**: 100% 完成
|
||||
- ✅ **财务管理功能**: 100% 完成
|
||||
- ✅ **系统配置功能**: 100% 完成
|
||||
|
||||
---
|
||||
|
||||
## 五、数据库部署说明
|
||||
|
||||
### 5.1 执行顺序
|
||||
|
||||
1. 先执行原有数据库: `zhibo.sql`
|
||||
2. 再执行扩展表: `zhibo_live_tables.sql`
|
||||
3. 如需增量更新: `zhibo_live_tables_update.sql`
|
||||
|
||||
### 5.2 执行命令
|
||||
|
||||
```sql
|
||||
-- 1. 导入原有数据库
|
||||
source /path/to/zhibo.sql;
|
||||
|
||||
-- 2. 导入扩展表
|
||||
source /path/to/zhibo_live_tables.sql;
|
||||
|
||||
-- 3. 增量更新(可选)
|
||||
source /path/to/zhibo_live_tables_update.sql;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、后端Controller完成情况
|
||||
|
||||
### 6.1 新增/更新的Controller
|
||||
|
||||
| Controller | 路径 | 说明 | 状态 |
|
||||
|------------|------|------|------|
|
||||
| ActivityController | api/admin/activity | 平台活动管理 | ✅ 新增 |
|
||||
| LotteryController | api/admin/lottery | 抽奖活动管理 | ✅ 新增 |
|
||||
| ChatPhraseManageController | api/admin/chat-phrase | 聊天常用语管理 | ✅ 新增 |
|
||||
| CoinExchangeController | api/admin/coin-exchange | 金币兑换配置 | ✅ 新增 |
|
||||
| AppealController | api/admin/appeal | 申诉管理 | ✅ 新增 |
|
||||
| CertificationController | api/admin/certification | 认证管理 | ✅ 新增 |
|
||||
| NoviceTaskController | api/admin/novice/task | 新手任务管理 | ✅ 更新 |
|
||||
|
||||
### 6.2 已有完整的Controller
|
||||
|
||||
- BannerController (轮播图)
|
||||
- BlacklistController (黑名单)
|
||||
- CallAdminController (通话记录)
|
||||
- CharmLevelController (魅力等级)
|
||||
- DynamicController (动态管理)
|
||||
- FamilyListController (家族管理)
|
||||
- FanGroupController (粉丝团)
|
||||
- FollowRecordController (关注记录)
|
||||
- GiftAdminController (礼物管理)
|
||||
- HeadwearController (头饰管理)
|
||||
- LotteryPrizeController (抽奖奖品)
|
||||
- MountListController (坐骑管理)
|
||||
- NobleLevelController (贵族等级)
|
||||
- ReportListController (举报管理)
|
||||
- RoomController (直播间管理)
|
||||
- SensitiveWordController (敏感词)
|
||||
- SessionController (会话记录)
|
||||
- SystemMessageController (系统消息)
|
||||
- SystemVersionController (客户端版本)
|
||||
- WithdrawPendingController (提现待审核)
|
||||
- WithdrawApprovedController (提现已审核)
|
||||
- FeedbackController (用户反馈)
|
||||
|
||||
---
|
||||
|
||||
## 七、备注
|
||||
|
||||
1. 所有页面均已实现完整的CRUD功能
|
||||
2. 用户生成数据页面(动态、评论、通话、会话、粉丝团、关注、礼物记录)仅提供查看和删除功能,不提供管理端添加功能
|
||||
3. 批量删除功能已添加到所有列表页面
|
||||
4. 操作按钮已统一为一排显示,使用flex布局
|
||||
5. 所有表单验证和错误处理已完善
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
-- ========================================
|
||||
-- 添加礼物管理菜单到直播管理下
|
||||
-- ========================================
|
||||
|
||||
-- 1. 启用打赏记录菜单
|
||||
UPDATE eb_system_menu
|
||||
SET is_show = 1, name = '打赏记录'
|
||||
WHERE id = 823
|
||||
AND pid = 675;
|
||||
|
||||
-- 2. 添加礼物管理菜单
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte)
|
||||
SELECT 675, '礼物管理', '', '', '/liveManage/gift/manage/index', 'C', 801, 1, 0
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM eb_system_menu
|
||||
WHERE pid = 675 AND component = '/liveManage/gift/manage/index'
|
||||
);
|
||||
|
||||
-- 3. 验证菜单结构
|
||||
SELECT
|
||||
'=== 直播管理 - 礼物相关菜单 ===' as section,
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort,
|
||||
CASE WHEN is_show = 1 THEN '✓ 显示' ELSE '✗ 隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE pid = 675 AND (name LIKE '%礼物%' OR name LIKE '%打赏%')
|
||||
ORDER BY sort;
|
||||
|
||||
-- 4. 查看完整的直播管理菜单
|
||||
SELECT
|
||||
'=== 直播管理完整菜单 ===' as section,
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort
|
||||
FROM eb_system_menu
|
||||
WHERE id = 675 OR pid = 675
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
-- 添加礼物管理菜单到后台管理系统
|
||||
|
||||
-- 1. 查看现有菜单,找到合适的插入位置
|
||||
SELECT id, pid, name, component, sort, menu_type FROM eb_system_menu WHERE is_delte = 0 ORDER BY sort;
|
||||
|
||||
-- 2. 添加礼物管理父菜单(目录类型)
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte, create_time, update_time)
|
||||
VALUES (0, '礼物管理', 'el-icon-present', '', 'Layout', 'M', 100, 1, 0, NOW(), NOW());
|
||||
|
||||
-- 3. 获取刚插入的父菜单ID
|
||||
SET @parent_id = LAST_INSERT_ID();
|
||||
|
||||
-- 4. 添加礼物打赏子菜单(菜单类型)
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte, create_time, update_time)
|
||||
VALUES (@parent_id, '礼物打赏', 'el-icon-present', 'admin:gift:records', 'gift/records/index', 'C', 1, 1, 0, NOW(), NOW());
|
||||
|
||||
-- 5. 验证菜单是否添加成功
|
||||
SELECT
|
||||
m1.id as parent_id,
|
||||
m1.name as parent_name,
|
||||
m1.menu_type as parent_type,
|
||||
m2.id as child_id,
|
||||
m2.name as child_name,
|
||||
m2.component,
|
||||
m2.menu_type as child_type
|
||||
FROM eb_system_menu m1
|
||||
LEFT JOIN eb_system_menu m2 ON m1.id = m2.pid
|
||||
WHERE m1.name = '礼物管理' AND m1.is_delte = 0;
|
||||
|
||||
-- 6. 查看所有礼物相关菜单
|
||||
SELECT id, pid, name, icon, component, menu_type, sort, is_show
|
||||
FROM eb_system_menu
|
||||
WHERE name LIKE '%礼物%' AND is_delte = 0
|
||||
ORDER BY pid, sort;
|
||||
|
||||
-- 7. 如果需要给管理员角色分配权限(假设管理员角色ID为1)
|
||||
-- 先查看角色ID
|
||||
SELECT * FROM eb_system_role;
|
||||
|
||||
-- 获取礼物菜单的ID
|
||||
SELECT @gift_parent_id := id FROM eb_system_menu WHERE name = '礼物管理' AND is_delte = 0 LIMIT 1;
|
||||
SELECT @gift_child_id := id FROM eb_system_menu WHERE name = '礼物打赏' AND is_delte = 0 LIMIT 1;
|
||||
|
||||
-- 给管理员角色(rid=1)分配礼物管理权限
|
||||
INSERT INTO eb_system_role_menu (rid, menu_id) VALUES (1, @gift_parent_id);
|
||||
INSERT INTO eb_system_role_menu (rid, menu_id) VALUES (1, @gift_child_id);
|
||||
|
||||
-- 8. 验证角色权限
|
||||
SELECT r.id as role_id, r.role_name, m.id as menu_id, m.name as menu_name
|
||||
FROM eb_system_role r
|
||||
JOIN eb_system_role_menu rm ON r.id = rm.rid
|
||||
JOIN eb_system_menu m ON rm.menu_id = m.id
|
||||
WHERE m.name LIKE '%礼物%';
|
||||
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
-- 添加礼物打赏菜单到数据库
|
||||
|
||||
-- 1. 查看当前最大的菜单ID
|
||||
SELECT MAX(id) as max_id FROM eb_system_menu;
|
||||
|
||||
-- 2. 删除旧的礼物菜单(如果存在)
|
||||
DELETE FROM eb_system_menu WHERE path LIKE '/gift%' OR path LIKE '/giftManage%';
|
||||
|
||||
-- 3. 添加礼物打赏主菜单
|
||||
INSERT INTO eb_system_menu (pid, menu_name, path, component, is_show, sort, icon, create_time, update_time)
|
||||
VALUES (0, '礼物打赏', '/gift', 'Layout', 1, 50, 'el-icon-present', NOW(), NOW());
|
||||
|
||||
-- 获取刚插入的主菜单ID
|
||||
SET @gift_menu_id = LAST_INSERT_ID();
|
||||
|
||||
-- 4. 添加子菜单 - 礼物列表
|
||||
INSERT INTO eb_system_menu (pid, menu_name, path, component, is_show, sort, icon, create_time, update_time)
|
||||
VALUES (@gift_menu_id, '礼物列表', 'config', 'gift/config/index', 1, 1, 'el-icon-goods', NOW(), NOW());
|
||||
|
||||
-- 5. 添加子菜单 - 打赏记录
|
||||
INSERT INTO eb_system_menu (pid, menu_name, path, component, is_show, sort, icon, create_time, update_time)
|
||||
VALUES (@gift_menu_id, '打赏记录', 'records', 'gift/records/index', 1, 2, 'el-icon-document', NOW(), NOW());
|
||||
|
||||
-- 6. 添加子菜单 - 充值套餐
|
||||
INSERT INTO eb_system_menu (pid, menu_name, path, component, is_show, sort, icon, create_time, update_time)
|
||||
VALUES (@gift_menu_id, '充值套餐', 'recharge', 'gift/recharge/index', 1, 3, 'el-icon-coin', NOW(), NOW());
|
||||
|
||||
-- 7. 验证插入结果
|
||||
SELECT
|
||||
m1.id,
|
||||
m1.menu_name as '主菜单',
|
||||
m2.id as '子菜单ID',
|
||||
m2.menu_name as '子菜单',
|
||||
m2.path as '路径',
|
||||
m2.component as '组件'
|
||||
FROM eb_system_menu m1
|
||||
LEFT JOIN eb_system_menu m2 ON m1.id = m2.pid
|
||||
WHERE m1.path = '/gift'
|
||||
ORDER BY m2.sort;
|
||||
|
||||
-- 8. 查看所有礼物相关菜单
|
||||
SELECT * FROM eb_system_menu WHERE path LIKE '/gift%' OR pid IN (SELECT id FROM eb_system_menu WHERE path = '/gift');
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
-- ========================================
|
||||
-- 正确地将礼物打赏添加到直播管理下
|
||||
-- ========================================
|
||||
|
||||
-- 1. 重新启用直播管理下的礼物打赏菜单
|
||||
UPDATE eb_system_menu
|
||||
SET is_show = 1
|
||||
WHERE id = 823
|
||||
AND pid = 675
|
||||
AND name = '礼物打赏';
|
||||
|
||||
-- 2. 验证结果
|
||||
SELECT
|
||||
'=== 直播管理完整菜单 ===' as section,
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort,
|
||||
CASE WHEN is_show = 1 THEN '✓ 显示' ELSE '✗ 隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE id = 675 OR pid = 675
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
-- 添加主播管理菜单到直播管理下
|
||||
-- 请在数据库中执行
|
||||
|
||||
-- 1. 先查找直播管理的菜单ID
|
||||
SELECT id, name FROM eb_system_menu WHERE name = '直播管理';
|
||||
|
||||
-- 2. 插入主播管理菜单(假设直播管理的ID需要你替换下面的 XXX)
|
||||
-- 先执行上面的查询,获取直播管理的ID,然后替换下面的数字
|
||||
|
||||
-- 如果直播管理ID是某个数字,比如查出来是 100,就把下面的 pid 改成 100
|
||||
INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`)
|
||||
VALUES (
|
||||
(SELECT id FROM eb_system_menu WHERE name = '直播管理' LIMIT 1),
|
||||
'主播管理',
|
||||
'',
|
||||
'admin:streamer:list',
|
||||
'/liveManage/streamer/list',
|
||||
'C',
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
NOW(),
|
||||
NOW()
|
||||
);
|
||||
|
||||
-- 3. 给超级管理员分配权限
|
||||
INSERT INTO eb_system_role_menu (rid, menu_id)
|
||||
SELECT 1, id FROM eb_system_menu WHERE name = '主播管理' AND component = '/liveManage/streamer/list';
|
||||
|
||||
-- 4. 验证
|
||||
SELECT * FROM eb_system_menu WHERE name = '主播管理';
|
||||
|
||||
-- 5. 清除Redis缓存(在Redis中执行)
|
||||
-- DEL menuList
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
-- 检查当前菜单状态,找出可能导致404的原因
|
||||
|
||||
-- 1. 检查直播管理及其所有子菜单的显示状态
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort,
|
||||
CASE WHEN is_show = 1 THEN '✓ 显示' ELSE '✗ 隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE id = 675 OR pid = 675
|
||||
ORDER BY pid, sort;
|
||||
|
||||
-- 2. 检查是否有其他菜单使用了相同或相似的component路径
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show
|
||||
FROM eb_system_menu
|
||||
WHERE component LIKE '/liveManage%'
|
||||
AND is_show = 1
|
||||
ORDER BY component;
|
||||
|
||||
-- 3. 检查礼物相关菜单
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
CASE WHEN is_show = 1 THEN '✓ 显示' ELSE '✗ 隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE component LIKE '%gift%'
|
||||
ORDER BY component;
|
||||
|
||||
-- 4. 查看是否有独立的礼物管理顶级菜单
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort
|
||||
FROM eb_system_menu
|
||||
WHERE (name LIKE '%礼物%' OR component LIKE '/gift%')
|
||||
AND pid = 0
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
-- 检查礼物打赏记录数据
|
||||
|
||||
-- 1. 检查礼物记录表是否存在
|
||||
SHOW TABLES LIKE '%gift%';
|
||||
|
||||
-- 2. 查看礼物记录表结构
|
||||
DESC eb_gift_record;
|
||||
|
||||
-- 3. 查看礼物记录数量
|
||||
SELECT COUNT(*) as total_records FROM eb_gift_record;
|
||||
|
||||
-- 4. 查看最近的礼物记录
|
||||
SELECT * FROM eb_gift_record ORDER BY create_time DESC LIMIT 10;
|
||||
|
||||
-- 5. 如果没有数据,插入一些测试数据
|
||||
-- 用户43送给主播41一个玫瑰
|
||||
INSERT INTO eb_gift_record (sender_id, receiver_id, room_id, gift_id, gift_name, gift_icon, gift_price, quantity, total_price, is_anonymous, create_time)
|
||||
VALUES
|
||||
(43, 41, 8, 1, '玫瑰', 'https://example.com/gifts/rose.png', 1.00, 5, 5.00, 0, NOW()),
|
||||
(43, 41, 8, 2, '巧克力', 'https://example.com/gifts/chocolate.png', 5.00, 2, 10.00, 0, NOW()),
|
||||
(42, 41, 8, 3, '棒棒糖', 'https://example.com/gifts/lollipop.png', 10.00, 1, 10.00, 0, NOW()),
|
||||
(44, 41, 8, 5, '蛋糕', 'https://example.com/gifts/cake.png', 50.00, 1, 50.00, 0, NOW());
|
||||
|
||||
-- 6. 再次查看礼物记录
|
||||
SELECT
|
||||
g.id,
|
||||
g.gift_name,
|
||||
g.quantity,
|
||||
g.total_price,
|
||||
sender.nickname as sender_name,
|
||||
receiver.nickname as receiver_name,
|
||||
r.title as room_title,
|
||||
g.create_time
|
||||
FROM eb_gift_record g
|
||||
LEFT JOIN eb_user sender ON g.sender_id = sender.uid
|
||||
LEFT JOIN eb_user receiver ON g.receiver_id = receiver.uid
|
||||
LEFT JOIN eb_live_room r ON g.room_id = r.id
|
||||
ORDER BY g.create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 7. 查看统计数据
|
||||
SELECT
|
||||
COUNT(*) as total_count,
|
||||
SUM(total_price) as total_value,
|
||||
SUM(CASE WHEN DATE(create_time) = CURDATE() THEN 1 ELSE 0 END) as today_count,
|
||||
SUM(CASE WHEN DATE(create_time) = CURDATE() THEN total_price ELSE 0 END) as today_value
|
||||
FROM eb_gift_record;
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
-- ========================================
|
||||
-- 查看礼物表的详细结构和数据
|
||||
-- ========================================
|
||||
|
||||
-- 1. 查看 eb_gift 表结构
|
||||
SHOW FULL COLUMNS FROM eb_gift;
|
||||
|
||||
-- 2. 查看 eb_gift_config 表结构
|
||||
SHOW FULL COLUMNS FROM eb_gift_config;
|
||||
|
||||
-- 3. 查看 eb_gift 现有数据
|
||||
SELECT * FROM eb_gift LIMIT 10;
|
||||
|
||||
-- 4. 查看 eb_gift_config 现有数据
|
||||
SELECT * FROM eb_gift_config LIMIT 10;
|
||||
|
||||
-- 5. 统计礼物数量
|
||||
SELECT
|
||||
'=== 礼物统计 ===' as section,
|
||||
COUNT(*) as total_gifts,
|
||||
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) as enabled_gifts,
|
||||
SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) as disabled_gifts
|
||||
FROM eb_gift;
|
||||
|
||||
-- 6. 统计礼物配置数量
|
||||
SELECT
|
||||
'=== 礼物配置统计 ===' as section,
|
||||
COUNT(*) as total_configs
|
||||
FROM eb_gift_config;
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
-- 检查直播间8的当前状态
|
||||
SELECT id, title, like_count, comment_count, online_count, view_count
|
||||
FROM eb_live_room
|
||||
WHERE id = 8;
|
||||
|
||||
-- 检查eb_live_room_like表是否存在
|
||||
SHOW TABLES LIKE 'eb_live_room_like';
|
||||
|
||||
-- 如果表存在,查看表结构
|
||||
DESC eb_live_room_like;
|
||||
|
||||
-- 查看是否有点赞记录
|
||||
SELECT * FROM eb_live_room_like WHERE room_id = 8;
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
-- 检查直播管理相关的菜单配置
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
path,
|
||||
component,
|
||||
is_show,
|
||||
sort
|
||||
FROM eb_system_menu
|
||||
WHERE path LIKE '%live%'
|
||||
OR path LIKE '%room%'
|
||||
OR name LIKE '%直播%'
|
||||
OR name LIKE '%房间%'
|
||||
ORDER BY sort, id;
|
||||
|
||||
-- 检查是否有重复或冲突的路径
|
||||
SELECT
|
||||
path,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(name SEPARATOR ', ') as menu_names
|
||||
FROM eb_system_menu
|
||||
WHERE path LIKE '%live%' OR path LIKE '%room%'
|
||||
GROUP BY path
|
||||
HAVING count > 1;
|
||||
|
||||
-- 检查礼物菜单配置
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
path,
|
||||
component,
|
||||
is_show,
|
||||
sort
|
||||
FROM eb_system_menu
|
||||
WHERE path LIKE '%gift%'
|
||||
OR name LIKE '%礼物%'
|
||||
ORDER BY sort, id;
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
-- 查看直播间表结构
|
||||
DESCRIBE eb_live_room;
|
||||
|
||||
-- 查看所有直播间数据
|
||||
SELECT * FROM eb_live_room ORDER BY id DESC LIMIT 10;
|
||||
|
||||
-- 查看表中有哪些列
|
||||
SHOW COLUMNS FROM eb_live_room;
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
-- 查看菜单表的实际字段结构
|
||||
DESCRIBE eb_system_menu;
|
||||
|
||||
-- 或者使用这个
|
||||
SHOW COLUMNS FROM eb_system_menu;
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
-- 查看菜单表结构
|
||||
DESC eb_system_menu;
|
||||
|
||||
-- 查看现有菜单数据示例
|
||||
SELECT * FROM eb_system_menu LIMIT 5;
|
||||
|
||||
-- 查看所有列名
|
||||
SHOW COLUMNS FROM eb_system_menu;
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
-- 检查直播间ID=8是否存在
|
||||
SELECT * FROM eb_live_room WHERE id = 8;
|
||||
|
||||
-- 如果不存在,查看所有直播间
|
||||
SELECT id, room_name, streamer_id, status FROM eb_live_room ORDER BY id;
|
||||
|
||||
-- 检查live_room_like表结构
|
||||
SHOW CREATE TABLE eb_live_room_like;
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
-- 检查主播统计数据
|
||||
-- 查看所有主播的统计信息
|
||||
|
||||
SELECT
|
||||
u.uid as userId,
|
||||
u.nickname,
|
||||
u.phone,
|
||||
u.streamer_level as streamerLevel,
|
||||
-- 粉丝数
|
||||
(SELECT COUNT(*)
|
||||
FROM eb_follow_record f
|
||||
WHERE f.followed_id = u.uid
|
||||
AND f.follow_status IN ('1', '关注')
|
||||
AND f.is_deleted = 0) as fansCount,
|
||||
-- 直播间数
|
||||
(SELECT COUNT(*)
|
||||
FROM eb_live_room r
|
||||
WHERE r.uid = u.uid) as roomCount,
|
||||
-- 总点赞数
|
||||
(SELECT COALESCE(SUM(r.like_count), 0)
|
||||
FROM eb_live_room r
|
||||
WHERE r.uid = u.uid) as totalLikeCount,
|
||||
-- 本月直播次数
|
||||
(SELECT COUNT(*)
|
||||
FROM eb_live_room r
|
||||
WHERE r.uid = u.uid
|
||||
AND DATE_FORMAT(r.create_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')) as monthRooms
|
||||
FROM eb_user u
|
||||
WHERE u.is_streamer = 1
|
||||
ORDER BY u.uid;
|
||||
|
||||
-- 查看具体某个主播的详细信息(以uid=43为例)
|
||||
SELECT
|
||||
'粉丝记录' as type,
|
||||
COUNT(*) as count
|
||||
FROM eb_follow_record
|
||||
WHERE followed_id = 43
|
||||
AND follow_status IN ('1', '关注')
|
||||
AND is_deleted = 0
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'直播间' as type,
|
||||
COUNT(*) as count
|
||||
FROM eb_live_room
|
||||
WHERE uid = 43
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'总点赞数' as type,
|
||||
COALESCE(SUM(like_count), 0) as count
|
||||
FROM eb_live_room
|
||||
WHERE uid = 43;
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
-- =====================================================
|
||||
-- 查询现有用户
|
||||
-- =====================================================
|
||||
|
||||
-- 1. 查看所有用户(前50条)
|
||||
SELECT uid, nickname, phone, sex, birthday, addres, mark, status
|
||||
FROM eb_user
|
||||
ORDER BY uid DESC
|
||||
LIMIT 50;
|
||||
|
||||
-- 2. 按昵称模糊搜索测试用户
|
||||
SELECT uid, nickname, phone, sex, birthday, addres
|
||||
FROM eb_user
|
||||
WHERE nickname LIKE '%张%'
|
||||
OR nickname LIKE '%林%'
|
||||
OR nickname LIKE '%江%'
|
||||
OR nickname LIKE '%刘%'
|
||||
OR nickname LIKE '%阮%'
|
||||
OR nickname LIKE '%夏%'
|
||||
OR nickname LIKE '%吉%'
|
||||
OR nickname LIKE '%李%'
|
||||
OR nickname LIKE '%黄%'
|
||||
OR nickname LIKE '%谢%'
|
||||
OR nickname LIKE '%傅%'
|
||||
OR nickname LIKE '%洪%'
|
||||
OR nickname LIKE '%荣%'
|
||||
OR nickname LIKE '%吕%'
|
||||
OR nickname LIKE '%方%';
|
||||
|
||||
-- 3. 查看用户总数
|
||||
SELECT COUNT(*) as total_users FROM eb_user;
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 清除前端缓存并重新构建
|
||||
echo ========================================
|
||||
|
||||
cd Zhibo\admin
|
||||
|
||||
echo.
|
||||
echo [1/4] 删除 node_modules/.cache 目录...
|
||||
if exist node_modules\.cache (
|
||||
rmdir /s /q node_modules\.cache
|
||||
echo 缓存目录已删除
|
||||
) else (
|
||||
echo 缓存目录不存在,跳过
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/4] 删除 dist 目录...
|
||||
if exist dist (
|
||||
rmdir /s /q dist
|
||||
echo dist目录已删除
|
||||
) else (
|
||||
echo dist目录不存在,跳过
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [3/4] 重新构建生产环境...
|
||||
call npm run build:prod
|
||||
|
||||
echo.
|
||||
echo [4/4] 完成!
|
||||
echo.
|
||||
echo 请执行以下操作:
|
||||
echo 1. 清除浏览器缓存 (Ctrl+Shift+Delete)
|
||||
echo 2. 重新登录后台
|
||||
echo 3. 测试直播管理菜单
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
-- 对比正常工作的菜单和礼物菜单
|
||||
|
||||
-- 1. 查看直播管理菜单(这个应该是正常工作的)
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name as '菜单名',
|
||||
m.component as '组件路径',
|
||||
m.menu_type as '类型',
|
||||
m.icon,
|
||||
m.perms as '权限标识'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name = '直播管理' OR m.pid = (SELECT id FROM eb_system_menu WHERE name = '直播管理' LIMIT 1)
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
||||
-- 2. 查看礼物打赏菜单
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name as '菜单名',
|
||||
m.component as '组件路径',
|
||||
m.menu_type as '类型',
|
||||
m.icon,
|
||||
m.perms as '权限标识'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name = '礼物打赏' OR m.pid = (SELECT id FROM eb_system_menu WHERE name = '礼物打赏' LIMIT 1)
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
||||
-- 3. 查看用户管理菜单(另一个正常工作的)
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name as '菜单名',
|
||||
m.component as '组件路径',
|
||||
m.menu_type as '类型'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name = '用户管理' OR m.pid = (SELECT id FROM eb_system_menu WHERE name = '用户管理' LIMIT 1)
|
||||
ORDER BY m.pid, m.sort
|
||||
LIMIT 5;
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
-- 礼物系统完整诊断报告
|
||||
|
||||
SELECT '========== 礼物系统诊断报告 ==========' as '';
|
||||
|
||||
-- 1. 礼物记录统计
|
||||
SELECT '1. 礼物记录统计' as '';
|
||||
SELECT
|
||||
COUNT(*) as '总记录数',
|
||||
COUNT(DISTINCT sender_id) as '送礼用户数',
|
||||
COUNT(DISTINCT receiver_id) as '收礼用户数',
|
||||
SUM(total_price) as '总金额',
|
||||
AVG(total_price) as '平均金额'
|
||||
FROM eb_gift_record;
|
||||
|
||||
-- 2. 最受欢迎的礼物
|
||||
SELECT '2. 最受欢迎的礼物 TOP 5' as '';
|
||||
SELECT
|
||||
gift_name,
|
||||
COUNT(*) as '送出次数',
|
||||
SUM(quantity) as '总数量',
|
||||
SUM(total_price) as '总金额'
|
||||
FROM eb_gift_record
|
||||
GROUP BY gift_name
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 5;
|
||||
|
||||
-- 3. 收礼排行榜
|
||||
SELECT '3. 收礼排行榜 TOP 5' as '';
|
||||
SELECT
|
||||
receiver_id,
|
||||
receiver_name,
|
||||
COUNT(*) as '收礼次数',
|
||||
SUM(total_price) as '收礼总额'
|
||||
FROM eb_gift_record
|
||||
GROUP BY receiver_id, receiver_name
|
||||
ORDER BY SUM(total_price) DESC
|
||||
LIMIT 5;
|
||||
|
||||
-- 4. 送礼排行榜
|
||||
SELECT '4. 送礼排行榜 TOP 5' as '';
|
||||
SELECT
|
||||
sender_id,
|
||||
sender_name,
|
||||
COUNT(*) as '送礼次数',
|
||||
SUM(total_price) as '送礼总额'
|
||||
FROM eb_gift_record
|
||||
GROUP BY sender_id, sender_name
|
||||
ORDER BY SUM(total_price) DESC
|
||||
LIMIT 5;
|
||||
|
||||
-- 5. 按直播间统计
|
||||
SELECT '5. 直播间礼物统计' as '';
|
||||
SELECT
|
||||
r.room_id,
|
||||
lr.title as '直播间名称',
|
||||
COUNT(*) as '礼物数量',
|
||||
SUM(r.total_price) as '礼物总额'
|
||||
FROM eb_gift_record r
|
||||
LEFT JOIN eb_live_room lr ON r.room_id = lr.id
|
||||
GROUP BY r.room_id, lr.title
|
||||
ORDER BY SUM(r.total_price) DESC;
|
||||
|
||||
-- 6. 礼物配置检查
|
||||
SELECT '6. 礼物配置列表' as '';
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
price,
|
||||
sort_order,
|
||||
is_enabled,
|
||||
CASE is_enabled WHEN 1 THEN '启用' ELSE '禁用' END as '状态'
|
||||
FROM eb_gift_config
|
||||
ORDER BY sort_order;
|
||||
|
||||
-- 7. 用户虚拟货币余额
|
||||
SELECT '7. 测试用户虚拟货币余额' as '';
|
||||
SELECT
|
||||
uid,
|
||||
nickname,
|
||||
virtual_balance as '余额',
|
||||
CASE
|
||||
WHEN virtual_balance >= 10000 THEN '充足'
|
||||
WHEN virtual_balance >= 1000 THEN '正常'
|
||||
WHEN virtual_balance > 0 THEN '偏低'
|
||||
ELSE '不足'
|
||||
END as '状态'
|
||||
FROM eb_user
|
||||
WHERE uid IN (43, 44, 45)
|
||||
ORDER BY uid;
|
||||
|
||||
-- 8. 最近礼物记录
|
||||
SELECT '8. 最近 10 条礼物记录' as '';
|
||||
SELECT
|
||||
id,
|
||||
sender_name as '送礼者',
|
||||
receiver_name as '接收者',
|
||||
gift_name as '礼物',
|
||||
quantity as '数量',
|
||||
total_price as '总价',
|
||||
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as '时间'
|
||||
FROM eb_gift_record
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 9. 充值记录统计
|
||||
SELECT '9. 充值记录统计' as '';
|
||||
SELECT
|
||||
COUNT(*) as '充值记录数',
|
||||
COALESCE(SUM(virtual_amount), 0) as '充值总额',
|
||||
COUNT(CASE WHEN payment_status = 1 THEN 1 END) as '成功支付数'
|
||||
FROM eb_virtual_currency_recharge;
|
||||
|
||||
-- 10. 充值套餐配置
|
||||
SELECT '10. 充值套餐配置' as '';
|
||||
SELECT
|
||||
id,
|
||||
title as '套餐名称',
|
||||
amount as '金额',
|
||||
virtual_amount as '虚拟币',
|
||||
bonus_amount as '赠送',
|
||||
CASE is_hot WHEN 1 THEN '是' ELSE '否' END as '热门',
|
||||
CASE is_enabled WHEN 1 THEN '启用' ELSE '禁用' END as '状态'
|
||||
FROM eb_recharge_package
|
||||
ORDER BY sort_order;
|
||||
|
||||
SELECT '========== 诊断完成 ==========' as '';
|
||||
|
|
@ -1,426 +0,0 @@
|
|||
-- ============================================================
|
||||
-- 完善19个测试用户的所有字段数据
|
||||
-- 执行前请确保已运行 insert_test_users.sql
|
||||
-- ============================================================
|
||||
|
||||
-- 更新用户完整信息
|
||||
-- 字段说明:
|
||||
-- pwd: 密码(加密后),统一使用 123456
|
||||
-- real_name: 真实姓名
|
||||
-- card_id: 身份证号(测试数据)
|
||||
-- avatar: 头像URL
|
||||
-- add_ip/last_ip: IP地址
|
||||
-- now_money: 余额
|
||||
-- brokerage_price: 佣金
|
||||
-- integral: 积分
|
||||
-- experience: 经验值
|
||||
-- sign_num: 连续签到天数
|
||||
-- level: 等级
|
||||
-- user_type: 用户类型
|
||||
-- login_type: 登录类型
|
||||
-- country: 国家
|
||||
|
||||
-- 1. 张吉惟 (uid=124)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '张吉惟',
|
||||
card_id = '440101199503150011',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_1.png',
|
||||
add_ip = '192.168.1.100',
|
||||
last_ip = '192.168.1.100',
|
||||
now_money = 1580.00,
|
||||
brokerage_price = 0.00,
|
||||
integral = 2350,
|
||||
experience = 5680,
|
||||
sign_num = 15,
|
||||
level = 3,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-28 14:30:00'
|
||||
WHERE uid = 124;
|
||||
|
||||
-- 2. 林国瑞 (uid=125)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '林国瑞',
|
||||
card_id = '330102199307220022',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_2.png',
|
||||
add_ip = '192.168.1.101',
|
||||
last_ip = '192.168.1.101',
|
||||
now_money = 3250.50,
|
||||
brokerage_price = 120.00,
|
||||
integral = 4580,
|
||||
experience = 8920,
|
||||
sign_num = 28,
|
||||
level = 5,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-30 09:15:00'
|
||||
WHERE uid = 125;
|
||||
|
||||
-- 3. 林玟书 (uid=126)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '林玟书',
|
||||
card_id = '310101199711080033',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_1.png',
|
||||
add_ip = '192.168.1.102',
|
||||
last_ip = '192.168.1.102',
|
||||
now_money = 2180.00,
|
||||
brokerage_price = 50.00,
|
||||
integral = 3120,
|
||||
experience = 6450,
|
||||
sign_num = 12,
|
||||
level = 4,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-29 16:45:00'
|
||||
WHERE uid = 126;
|
||||
|
||||
-- 4. 林雅南 (uid=127)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '林雅南',
|
||||
card_id = '350102199605200044',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_2.png',
|
||||
add_ip = '192.168.1.103',
|
||||
last_ip = '192.168.1.103',
|
||||
now_money = 890.00,
|
||||
brokerage_price = 0.00,
|
||||
integral = 1560,
|
||||
experience = 3280,
|
||||
sign_num = 7,
|
||||
level = 2,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-27 11:20:00'
|
||||
WHERE uid = 127;
|
||||
|
||||
-- 5. 江奕云 (uid=128)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '江奕云',
|
||||
card_id = '320102199809120055',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_3.png',
|
||||
add_ip = '192.168.1.104',
|
||||
last_ip = '192.168.1.104',
|
||||
now_money = 4560.00,
|
||||
brokerage_price = 280.00,
|
||||
integral = 6890,
|
||||
experience = 12500,
|
||||
sign_num = 45,
|
||||
level = 6,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-31 08:00:00'
|
||||
WHERE uid = 128;
|
||||
|
||||
-- 6. 刘柏宏 (uid=129)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '刘柏宏',
|
||||
card_id = '110101199201280066',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_3.png',
|
||||
add_ip = '192.168.1.105',
|
||||
last_ip = '192.168.1.105',
|
||||
now_money = 12800.00,
|
||||
brokerage_price = 850.00,
|
||||
integral = 9560,
|
||||
experience = 18900,
|
||||
sign_num = 60,
|
||||
level = 7,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2026-01-01 10:30:00'
|
||||
WHERE uid = 129;
|
||||
|
||||
-- 7. 阮建安 (uid=130)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '阮建安',
|
||||
card_id = '450102199406180077',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_4.png',
|
||||
add_ip = '192.168.1.106',
|
||||
last_ip = '192.168.1.106',
|
||||
now_money = 2350.00,
|
||||
brokerage_price = 0.00,
|
||||
integral = 2890,
|
||||
experience = 5120,
|
||||
sign_num = 18,
|
||||
level = 3,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-26 15:40:00'
|
||||
WHERE uid = 130;
|
||||
|
||||
-- 8. 林子帆 (uid=131)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '林子帆',
|
||||
card_id = '510102199612050088',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_5.png',
|
||||
add_ip = '192.168.1.107',
|
||||
last_ip = '192.168.1.107',
|
||||
now_money = 680.00,
|
||||
brokerage_price = 0.00,
|
||||
integral = 1280,
|
||||
experience = 2560,
|
||||
sign_num = 5,
|
||||
level = 2,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-25 20:15:00'
|
||||
WHERE uid = 131;
|
||||
|
||||
-- 9. 夏志豪 (uid=132)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '夏志豪',
|
||||
card_id = '420102199508300099',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_6.png',
|
||||
add_ip = '192.168.1.108',
|
||||
last_ip = '192.168.1.108',
|
||||
now_money = 5680.00,
|
||||
brokerage_price = 320.00,
|
||||
integral = 7450,
|
||||
experience = 14200,
|
||||
sign_num = 52,
|
||||
level = 6,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-30 18:50:00'
|
||||
WHERE uid = 132;
|
||||
|
||||
-- 10. 吉茹定 (uid=133)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '吉茹定',
|
||||
card_id = '610102199704160110',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_4.png',
|
||||
add_ip = '192.168.1.109',
|
||||
last_ip = '192.168.1.109',
|
||||
now_money = 1890.00,
|
||||
brokerage_price = 45.00,
|
||||
integral = 2680,
|
||||
experience = 4890,
|
||||
sign_num = 14,
|
||||
level = 3,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-28 12:30:00'
|
||||
WHERE uid = 133;
|
||||
|
||||
-- 11. 李中冰 (uid=134)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '李中冰',
|
||||
card_id = '370102199310250121',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_7.png',
|
||||
add_ip = '192.168.1.110',
|
||||
last_ip = '192.168.1.110',
|
||||
now_money = 3450.00,
|
||||
brokerage_price = 180.00,
|
||||
integral = 5120,
|
||||
experience = 9680,
|
||||
sign_num = 35,
|
||||
level = 5,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-29 09:45:00'
|
||||
WHERE uid = 134;
|
||||
|
||||
-- 12. 黄文隆 (uid=135)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '黄文隆',
|
||||
card_id = '440102199402140132',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_8.png',
|
||||
add_ip = '192.168.1.111',
|
||||
last_ip = '192.168.1.111',
|
||||
now_money = 8920.00,
|
||||
brokerage_price = 560.00,
|
||||
integral = 8560,
|
||||
experience = 16800,
|
||||
sign_num = 58,
|
||||
level = 7,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2026-01-02 07:20:00'
|
||||
WHERE uid = 135;
|
||||
|
||||
-- 13. 谢彦文 (uid=136)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '谢彦文',
|
||||
card_id = '500102199607070143',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_9.png',
|
||||
add_ip = '192.168.1.112',
|
||||
last_ip = '192.168.1.112',
|
||||
now_money = 1560.00,
|
||||
brokerage_price = 0.00,
|
||||
integral = 2150,
|
||||
experience = 4120,
|
||||
sign_num = 10,
|
||||
level = 3,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-27 14:10:00'
|
||||
WHERE uid = 136;
|
||||
|
||||
-- 14. 傅智翔 (uid=137)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '傅智翔',
|
||||
card_id = '330102199511190154',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_10.png',
|
||||
add_ip = '192.168.1.113',
|
||||
last_ip = '192.168.1.113',
|
||||
now_money = 4280.00,
|
||||
brokerage_price = 220.00,
|
||||
integral = 5890,
|
||||
experience = 11200,
|
||||
sign_num = 42,
|
||||
level = 5,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-31 16:30:00'
|
||||
WHERE uid = 137;
|
||||
|
||||
-- 15. 洪振霞 (uid=138)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '洪振霞',
|
||||
card_id = '350102199803080165',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_5.png',
|
||||
add_ip = '192.168.1.114',
|
||||
last_ip = '192.168.1.114',
|
||||
now_money = 2680.00,
|
||||
brokerage_price = 85.00,
|
||||
integral = 3560,
|
||||
experience = 6890,
|
||||
sign_num = 22,
|
||||
level = 4,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-30 11:25:00'
|
||||
WHERE uid = 138;
|
||||
|
||||
-- 16. 刘姿婷 (uid=139)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '刘姿婷',
|
||||
card_id = '430102199706210176',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_6.png',
|
||||
add_ip = '192.168.1.115',
|
||||
last_ip = '192.168.1.115',
|
||||
now_money = 1280.00,
|
||||
brokerage_price = 0.00,
|
||||
integral = 1890,
|
||||
experience = 3560,
|
||||
sign_num = 8,
|
||||
level = 2,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-26 19:40:00'
|
||||
WHERE uid = 139;
|
||||
|
||||
-- 17. 荣姿康 (uid=140)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '荣姿康',
|
||||
card_id = '360102199609030187',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_7.png',
|
||||
add_ip = '192.168.1.116',
|
||||
last_ip = '192.168.1.116',
|
||||
now_money = 3890.00,
|
||||
brokerage_price = 150.00,
|
||||
integral = 4680,
|
||||
experience = 8560,
|
||||
sign_num = 30,
|
||||
level = 4,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2025-12-29 21:15:00'
|
||||
WHERE uid = 140;
|
||||
|
||||
-- 18. 吕致盈 (uid=141)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '吕致盈',
|
||||
card_id = '340102199812120198',
|
||||
avatar = 'crmebimage/public/user/default/avatar_female_8.png',
|
||||
add_ip = '192.168.1.117',
|
||||
last_ip = '192.168.1.117',
|
||||
now_money = 5120.00,
|
||||
brokerage_price = 380.00,
|
||||
integral = 6250,
|
||||
experience = 12800,
|
||||
sign_num = 48,
|
||||
level = 6,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2026-01-01 13:50:00'
|
||||
WHERE uid = 141;
|
||||
|
||||
-- 19. 方一强 (uid=142)
|
||||
UPDATE eb_user SET
|
||||
pwd = 'c7Nwx1WsDdewbab2TlkpUg==',
|
||||
real_name = '方一强',
|
||||
card_id = '410102199404010209',
|
||||
avatar = 'crmebimage/public/user/default/avatar_male_11.png',
|
||||
add_ip = '192.168.1.118',
|
||||
last_ip = '192.168.1.118',
|
||||
now_money = 7560.00,
|
||||
brokerage_price = 480.00,
|
||||
integral = 7890,
|
||||
experience = 15600,
|
||||
sign_num = 55,
|
||||
level = 7,
|
||||
user_type = 'h5',
|
||||
login_type = 'h5',
|
||||
country = 'CN',
|
||||
last_login_time = '2026-01-02 09:00:00'
|
||||
WHERE uid = 142;
|
||||
|
||||
-- ============================================================
|
||||
-- 验证更新结果 - 查看所有测试用户的完整信息
|
||||
-- ============================================================
|
||||
SELECT
|
||||
uid,
|
||||
account,
|
||||
nickname,
|
||||
real_name,
|
||||
sex,
|
||||
birthday,
|
||||
addres,
|
||||
phone,
|
||||
avatar,
|
||||
now_money,
|
||||
integral,
|
||||
experience,
|
||||
sign_num,
|
||||
level,
|
||||
mark,
|
||||
status,
|
||||
last_login_time
|
||||
FROM eb_user
|
||||
WHERE uid >= 124 AND uid <= 142
|
||||
ORDER BY uid;
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
-- ========================================
|
||||
-- 创建独立的礼物打赏管理菜单
|
||||
-- ========================================
|
||||
|
||||
-- 1. 先检查是否已存在礼物打赏顶级菜单
|
||||
SELECT id, pid, name, component, is_show, sort
|
||||
FROM eb_system_menu
|
||||
WHERE name = '礼物打赏' AND pid = 0;
|
||||
|
||||
-- 2. 如果不存在,创建礼物打赏顶级菜单
|
||||
-- 注意:sort值设置为99,放在直播管理(98)之后
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte)
|
||||
SELECT 0, '礼物打赏', 'el-icon-present', '', '/gift', 'M', 99, 1, 0
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM eb_system_menu WHERE name = '礼物打赏' AND pid = 0
|
||||
);
|
||||
|
||||
-- 3. 获取新创建的礼物打赏菜单ID
|
||||
SET @gift_menu_id = (SELECT id FROM eb_system_menu WHERE name = '礼物打赏' AND pid = 0 LIMIT 1);
|
||||
|
||||
-- 4. 检查是否已有打赏记录子菜单
|
||||
SELECT id, pid, name, component, is_show
|
||||
FROM eb_system_menu
|
||||
WHERE name = '打赏记录' AND component = '/gift/records/index';
|
||||
|
||||
-- 5. 如果不存在,创建打赏记录子菜单
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte)
|
||||
SELECT @gift_menu_id, '打赏记录', '', '', '/gift/records/index', 'C', 1, 1, 0
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM eb_system_menu WHERE name = '打赏记录' AND component = '/gift/records/index'
|
||||
);
|
||||
|
||||
-- 6. 验证创建结果
|
||||
SELECT
|
||||
'=== 礼物打赏菜单结构 ===' as section,
|
||||
m1.id as parent_id,
|
||||
m1.name as parent_name,
|
||||
m1.component as parent_component,
|
||||
m2.id as child_id,
|
||||
m2.name as child_name,
|
||||
m2.component as child_component,
|
||||
CASE WHEN m1.is_show = 1 AND m2.is_show = 1 THEN '✓ 都显示'
|
||||
WHEN m1.is_show = 1 THEN '父显示,子隐藏'
|
||||
ELSE '✗ 父隐藏'
|
||||
END as status
|
||||
FROM eb_system_menu m1
|
||||
LEFT JOIN eb_system_menu m2 ON m2.pid = m1.id
|
||||
WHERE m1.name = '礼物打赏' AND m1.pid = 0
|
||||
ORDER BY m2.sort;
|
||||
|
||||
-- 7. 显示所有礼物相关菜单
|
||||
SELECT
|
||||
'=== 所有礼物相关菜单 ===' as section,
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort,
|
||||
CASE WHEN is_show = 1 THEN '✓ 显示' ELSE '✗ 隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE name LIKE '%礼物%' OR name LIKE '%打赏%' OR component LIKE '%gift%'
|
||||
ORDER BY pid, sort;
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
-- ========================================
|
||||
-- 创建礼物表
|
||||
-- ========================================
|
||||
|
||||
-- 检查表是否存在
|
||||
SELECT TABLE_NAME
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = 'zhibo'
|
||||
AND TABLE_NAME = 'eb_gift';
|
||||
|
||||
-- 创建礼物表
|
||||
CREATE TABLE IF NOT EXISTS `eb_gift` (
|
||||
`id` int NOT NULL AUTO_INCREMENT COMMENT '礼物ID',
|
||||
`name` varchar(100) NOT NULL COMMENT '礼物名称',
|
||||
`icon` varchar(500) DEFAULT NULL COMMENT '礼物图标URL',
|
||||
`price` int NOT NULL DEFAULT '0' COMMENT '价格(钻石)',
|
||||
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
|
||||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1-启用,0-禁用',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '礼物描述',
|
||||
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除:0-否,1-是',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_sort` (`sort`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='礼物表';
|
||||
|
||||
-- 插入一些示例礼物数据
|
||||
INSERT INTO `eb_gift` (`name`, `icon`, `price`, `sort`, `status`, `description`) VALUES
|
||||
('玫瑰', 'https://example.com/gifts/rose.png', 1, 1, 1, '送你一朵玫瑰'),
|
||||
('巧克力', 'https://example.com/gifts/chocolate.png', 5, 2, 1, '甜蜜的巧克力'),
|
||||
('棒棒糖', 'https://example.com/gifts/lollipop.png', 10, 3, 1, '甜甜的棒棒糖'),
|
||||
('冰淇淋', 'https://example.com/gifts/icecream.png', 20, 4, 1, '清凉的冰淇淋'),
|
||||
('蛋糕', 'https://example.com/gifts/cake.png', 50, 5, 1, '美味的蛋糕'),
|
||||
('香水', 'https://example.com/gifts/perfume.png', 100, 6, 1, '迷人的香水'),
|
||||
('口红', 'https://example.com/gifts/lipstick.png', 200, 7, 1, '魅力口红'),
|
||||
('钻戒', 'https://example.com/gifts/ring.png', 500, 8, 1, '闪耀的钻戒'),
|
||||
('跑车', 'https://example.com/gifts/car.png', 1000, 9, 1, '豪华跑车'),
|
||||
('城堡', 'https://example.com/gifts/castle.png', 5000, 10, 1, '梦幻城堡')
|
||||
ON DUPLICATE KEY UPDATE name=name;
|
||||
|
||||
-- 验证数据
|
||||
SELECT
|
||||
'=== 礼物列表 ===' as section,
|
||||
id,
|
||||
name,
|
||||
price,
|
||||
sort,
|
||||
CASE WHEN status = 1 THEN '启用' ELSE '禁用' END as status,
|
||||
create_time
|
||||
FROM eb_gift
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
-- 检查并创建测试主播数据
|
||||
|
||||
-- 1. 先检查是否有主播
|
||||
SELECT '当前主播数量' as info, COUNT(*) as count FROM eb_user WHERE is_streamer = 1;
|
||||
|
||||
-- 2. 如果没有主播,将现有用户设置为主播(以uid=43为例)
|
||||
-- 请根据实际情况修改uid
|
||||
UPDATE eb_user
|
||||
SET is_streamer = 1,
|
||||
streamer_level = 1,
|
||||
streamer_certified_time = NOW()
|
||||
WHERE uid = 43 AND is_streamer = 0;
|
||||
|
||||
-- 3. 再次检查主播数量
|
||||
SELECT '更新后主播数量' as info, COUNT(*) as count FROM eb_user WHERE is_streamer = 1;
|
||||
|
||||
-- 4. 查看主播详细信息
|
||||
SELECT
|
||||
uid,
|
||||
nickname,
|
||||
phone,
|
||||
is_streamer,
|
||||
streamer_level,
|
||||
streamer_certified_time,
|
||||
(SELECT COUNT(*) FROM eb_follow_record f WHERE f.followed_id = uid AND f.follow_status IN ('1', '关注') AND f.is_deleted = 0) as fansCount,
|
||||
(SELECT COUNT(*) FROM eb_live_room r WHERE r.uid = uid) as roomCount,
|
||||
(SELECT COALESCE(SUM(r.like_count), 0) FROM eb_live_room r WHERE r.uid = uid) as totalLikeCount
|
||||
FROM eb_user
|
||||
WHERE is_streamer = 1;
|
||||
|
|
@ -1,267 +0,0 @@
|
|||
-- 调试关注页面显示问题的 SQL 脚本
|
||||
-- 用于排查为什么关注的主播直播间不显示
|
||||
|
||||
-- ============================================
|
||||
-- 第一部分:查看基础数据
|
||||
-- ============================================
|
||||
|
||||
-- 1. 查看所有用户(包括主播状态)
|
||||
SELECT
|
||||
uid,
|
||||
nickname,
|
||||
phone,
|
||||
is_streamer,
|
||||
streamer_level,
|
||||
create_time
|
||||
FROM eb_user
|
||||
ORDER BY uid;
|
||||
|
||||
-- 2. 查看所有直播间
|
||||
SELECT
|
||||
id,
|
||||
title,
|
||||
uid as streamer_uid,
|
||||
is_live,
|
||||
view_count,
|
||||
like_count,
|
||||
online_count,
|
||||
create_time,
|
||||
started_at
|
||||
FROM eb_live_room
|
||||
ORDER BY create_time DESC;
|
||||
|
||||
-- 3. 查看所有关注记录
|
||||
SELECT
|
||||
id,
|
||||
follower_id,
|
||||
follower_nickname,
|
||||
followed_id,
|
||||
followed_nickname,
|
||||
follow_status,
|
||||
is_deleted,
|
||||
create_time
|
||||
FROM eb_follow_record
|
||||
ORDER BY create_time DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 第二部分:关联查询 - 查看关注关系和直播间
|
||||
-- ============================================
|
||||
|
||||
-- 4. 查看每个用户关注了哪些主播
|
||||
SELECT
|
||||
u.uid as user_id,
|
||||
u.nickname as user_name,
|
||||
COUNT(DISTINCT fr.followed_id) as following_count,
|
||||
GROUP_CONCAT(DISTINCT fr.followed_nickname SEPARATOR ', ') as following_list
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_follow_record fr ON u.uid = fr.follower_id
|
||||
AND fr.follow_status IN ('1', '关注')
|
||||
AND fr.is_deleted = 0
|
||||
GROUP BY u.uid, u.nickname
|
||||
ORDER BY following_count DESC;
|
||||
|
||||
-- 5. 查看每个主播有多少粉丝
|
||||
SELECT
|
||||
u.uid as streamer_id,
|
||||
u.nickname as streamer_name,
|
||||
u.is_streamer,
|
||||
COUNT(DISTINCT fr.follower_id) as fans_count,
|
||||
GROUP_CONCAT(DISTINCT fr.follower_nickname SEPARATOR ', ') as fans_list
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_follow_record fr ON u.uid = fr.followed_id
|
||||
AND fr.follow_status IN ('1', '关注')
|
||||
AND fr.is_deleted = 0
|
||||
WHERE u.is_streamer = 1
|
||||
GROUP BY u.uid, u.nickname, u.is_streamer
|
||||
ORDER BY fans_count DESC;
|
||||
|
||||
-- 6. 查看每个主播的直播间状态
|
||||
SELECT
|
||||
u.uid as streamer_id,
|
||||
u.nickname as streamer_name,
|
||||
u.is_streamer,
|
||||
COUNT(DISTINCT lr.id) as room_count,
|
||||
SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) as live_room_count,
|
||||
GROUP_CONCAT(
|
||||
DISTINCT CONCAT(lr.id, ':', lr.title, '(', IF(lr.is_live=1, '直播中', '未开播'), ')')
|
||||
SEPARATOR ' | '
|
||||
) as rooms_info
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_live_room lr ON u.uid = lr.uid
|
||||
WHERE u.is_streamer = 1
|
||||
GROUP BY u.uid, u.nickname, u.is_streamer
|
||||
ORDER BY live_room_count DESC, room_count DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 第三部分:模拟关注页面的查询逻辑
|
||||
-- ============================================
|
||||
|
||||
-- 7. 模拟某个用户的关注页面应该显示的内容
|
||||
-- 替换 @USER_ID 为实际的用户ID
|
||||
SET @USER_ID = 1;
|
||||
|
||||
-- 7.1 查看该用户关注了哪些人
|
||||
SELECT
|
||||
fr.followed_id as followed_user_id,
|
||||
fr.followed_nickname,
|
||||
u.is_streamer,
|
||||
fr.follow_status,
|
||||
fr.create_time as followed_at
|
||||
FROM eb_follow_record fr
|
||||
LEFT JOIN eb_user u ON fr.followed_id = u.uid
|
||||
WHERE fr.follower_id = @USER_ID
|
||||
AND fr.follow_status IN ('1', '关注')
|
||||
AND fr.is_deleted = 0
|
||||
ORDER BY fr.create_time DESC;
|
||||
|
||||
-- 7.2 查看该用户关注的主播中,哪些有直播间
|
||||
SELECT
|
||||
u.uid as streamer_id,
|
||||
u.nickname as streamer_name,
|
||||
lr.id as room_id,
|
||||
lr.title as room_title,
|
||||
lr.is_live,
|
||||
lr.view_count,
|
||||
lr.online_count,
|
||||
lr.create_time as room_created_at,
|
||||
lr.started_at as live_started_at
|
||||
FROM eb_follow_record fr
|
||||
INNER JOIN eb_user u ON fr.followed_id = u.uid AND u.is_streamer = 1
|
||||
INNER JOIN eb_live_room lr ON u.uid = lr.uid
|
||||
WHERE fr.follower_id = @USER_ID
|
||||
AND fr.follow_status IN ('1', '关注')
|
||||
AND fr.is_deleted = 0
|
||||
ORDER BY lr.is_live DESC, lr.started_at DESC;
|
||||
|
||||
-- 7.3 查看该用户关注的主播中,哪些正在直播
|
||||
SELECT
|
||||
u.uid as streamer_id,
|
||||
u.nickname as streamer_name,
|
||||
u.avatar as streamer_avatar,
|
||||
lr.id as room_id,
|
||||
lr.title as room_title,
|
||||
lr.cover_url,
|
||||
lr.view_count,
|
||||
lr.online_count,
|
||||
lr.like_count,
|
||||
lr.started_at as live_started_at,
|
||||
TIMESTAMPDIFF(MINUTE, lr.started_at, NOW()) as live_duration_minutes
|
||||
FROM eb_follow_record fr
|
||||
INNER JOIN eb_user u ON fr.followed_id = u.uid AND u.is_streamer = 1
|
||||
INNER JOIN eb_live_room lr ON u.uid = lr.uid AND lr.is_live = 1
|
||||
WHERE fr.follower_id = @USER_ID
|
||||
AND fr.follow_status IN ('1', '关注')
|
||||
AND fr.is_deleted = 0
|
||||
ORDER BY lr.started_at DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 第四部分:诊断问题
|
||||
-- ============================================
|
||||
|
||||
-- 8. 检查是否有用户关注了主播但看不到直播间的情况
|
||||
SELECT
|
||||
'问题诊断' as diagnosis_type,
|
||||
fr.follower_id,
|
||||
u1.nickname as follower_name,
|
||||
fr.followed_id,
|
||||
u2.nickname as followed_name,
|
||||
u2.is_streamer,
|
||||
COUNT(lr.id) as room_count,
|
||||
SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) as live_room_count,
|
||||
CASE
|
||||
WHEN u2.is_streamer = 0 THEN '被关注者不是主播'
|
||||
WHEN COUNT(lr.id) = 0 THEN '主播没有创建直播间'
|
||||
WHEN SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) = 0 THEN '主播有直播间但未开播'
|
||||
ELSE '正常:主播正在直播'
|
||||
END as status_description
|
||||
FROM eb_follow_record fr
|
||||
LEFT JOIN eb_user u1 ON fr.follower_id = u1.uid
|
||||
LEFT JOIN eb_user u2 ON fr.followed_id = u2.uid
|
||||
LEFT JOIN eb_live_room lr ON u2.uid = lr.uid
|
||||
WHERE fr.follow_status IN ('1', '关注')
|
||||
AND fr.is_deleted = 0
|
||||
GROUP BY fr.follower_id, u1.nickname, fr.followed_id, u2.nickname, u2.is_streamer
|
||||
ORDER BY fr.follower_id, fr.followed_id;
|
||||
|
||||
-- 9. 检查直播间的 uid 字段是否正确关联到主播
|
||||
SELECT
|
||||
lr.id as room_id,
|
||||
lr.title as room_title,
|
||||
lr.uid as room_uid,
|
||||
u.uid as user_uid,
|
||||
u.nickname as user_nickname,
|
||||
u.is_streamer,
|
||||
CASE
|
||||
WHEN lr.uid IS NULL THEN '直播间没有关联用户ID'
|
||||
WHEN u.uid IS NULL THEN '直播间关联的用户不存在'
|
||||
WHEN u.is_streamer = 0 THEN '直播间关联的用户不是主播'
|
||||
ELSE '正常'
|
||||
END as status
|
||||
FROM eb_live_room lr
|
||||
LEFT JOIN eb_user u ON lr.uid = u.uid
|
||||
ORDER BY lr.create_time DESC;
|
||||
|
||||
-- 10. 检查关注状态字段的值分布
|
||||
SELECT
|
||||
follow_status,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(DISTINCT CONCAT(follower_nickname, '->', followed_nickname) SEPARATOR '; ') as examples
|
||||
FROM eb_follow_record
|
||||
GROUP BY follow_status;
|
||||
|
||||
-- ============================================
|
||||
-- 第五部分:修复建议
|
||||
-- ============================================
|
||||
|
||||
-- 11. 如果发现关注状态值不一致,可以执行以下修复(谨慎执行)
|
||||
-- 将字符串状态统一为数字
|
||||
-- UPDATE eb_follow_record SET follow_status = '1' WHERE follow_status = '关注';
|
||||
-- UPDATE eb_follow_record SET follow_status = '0' WHERE follow_status = '取消关注' OR follow_status = '0';
|
||||
|
||||
-- 12. 如果发现直播间的 uid 字段为空,需要修复
|
||||
-- UPDATE eb_live_room lr
|
||||
-- INNER JOIN eb_user u ON lr.streamer_name = u.nickname AND u.is_streamer = 1
|
||||
-- SET lr.uid = u.uid
|
||||
-- WHERE lr.uid IS NULL;
|
||||
|
||||
-- ============================================
|
||||
-- 第六部分:测试数据插入(用于测试)
|
||||
-- ============================================
|
||||
|
||||
-- 13. 创建测试用户和关注关系(如果需要)
|
||||
-- 注意:执行前请确认用户ID不冲突
|
||||
|
||||
-- 插入测试主播
|
||||
-- INSERT INTO eb_user (uid, nickname, phone, is_streamer, streamer_level, create_time)
|
||||
-- VALUES (100, '测试主播1', '13800000001', 1, 1, NOW());
|
||||
|
||||
-- 插入测试普通用户
|
||||
-- INSERT INTO eb_user (uid, nickname, phone, is_streamer, create_time)
|
||||
-- VALUES (101, '测试用户1', '13800000002', 0, NOW());
|
||||
|
||||
-- 插入关注记录
|
||||
-- INSERT INTO eb_follow_record (follower_id, follower_nickname, followed_id, followed_nickname, follow_status, is_deleted, create_time)
|
||||
-- VALUES (101, '测试用户1', 100, '测试主播1', '1', 0, NOW());
|
||||
|
||||
-- 插入测试直播间
|
||||
-- INSERT INTO eb_live_room (title, uid, stream_key, is_live, view_count, online_count, create_time, started_at)
|
||||
-- VALUES ('测试直播间', 100, 'test_stream_key_001', 1, 0, 0, NOW(), NOW());
|
||||
|
||||
-- ============================================
|
||||
-- 第七部分:清理测试数据
|
||||
-- ============================================
|
||||
|
||||
-- 14. 清理测试数据(如果需要)
|
||||
-- DELETE FROM eb_live_room WHERE uid = 100;
|
||||
-- DELETE FROM eb_follow_record WHERE follower_id = 101 OR followed_id = 100;
|
||||
-- DELETE FROM eb_user WHERE uid IN (100, 101);
|
||||
|
||||
-- ============================================
|
||||
-- 使用说明
|
||||
-- ============================================
|
||||
-- 1. 先执行第一部分和第二部分,查看基础数据
|
||||
-- 2. 在第三部分中,将 @USER_ID 替换为实际的用户ID,查看该用户应该看到的内容
|
||||
-- 3. 执行第四部分,诊断可能的问题
|
||||
-- 4. 根据诊断结果,参考第五部分的修复建议
|
||||
-- 5. 如果需要测试,可以使用第六部分创建测试数据
|
||||
-- 6. 测试完成后,使用第七部分清理测试数据
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
-- 调试礼物API返回的数据
|
||||
|
||||
-- 1. 检查eb_gift表中的数据
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
image,
|
||||
diamond_price,
|
||||
intimacy,
|
||||
status,
|
||||
is_heartbeat,
|
||||
level,
|
||||
sort,
|
||||
is_deleted
|
||||
FROM eb_gift
|
||||
WHERE is_deleted = 0
|
||||
ORDER BY sort ASC, id DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 2. 检查是否所有礼物都被标记为删除
|
||||
SELECT
|
||||
COUNT(*) as total_gifts,
|
||||
SUM(CASE WHEN is_deleted = 0 THEN 1 ELSE 0 END) as active_gifts,
|
||||
SUM(CASE WHEN is_deleted = 1 THEN 1 ELSE 0 END) as deleted_gifts
|
||||
FROM eb_gift;
|
||||
|
||||
-- 3. 如果is_deleted字段不存在,检查表结构
|
||||
SHOW COLUMNS FROM eb_gift LIKE 'is_deleted';
|
||||
|
||||
-- 4. 如果没有is_deleted字段,查看所有礼物
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
image,
|
||||
diamond_price,
|
||||
status
|
||||
FROM eb_gift
|
||||
ORDER BY sort ASC, id DESC
|
||||
LIMIT 10;
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
-- 删除"房间类型"和"房间背景"菜单
|
||||
|
||||
-- 先查询表结构
|
||||
-- DESCRIBE eb_system_menu;
|
||||
|
||||
-- 查询这两个菜单
|
||||
SELECT id, name FROM eb_system_menu WHERE name IN ('房间类型', '房间背景');
|
||||
|
||||
-- 删除菜单(根据名称)
|
||||
DELETE FROM eb_system_menu WHERE name = '房间类型';
|
||||
DELETE FROM eb_system_menu WHERE name = '房间背景';
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 部署主播统计数据修复
|
||||
echo ========================================
|
||||
|
||||
echo.
|
||||
echo [1/4] 编译后端项目...
|
||||
cd Zhibo\zhibo-h
|
||||
call mvn clean package -DskipTests
|
||||
if errorlevel 1 (
|
||||
echo 编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/4] 停止后端服务...
|
||||
ssh root@1.15.149.240 "cd /root/zhibo && docker-compose stop crmeb-admin"
|
||||
|
||||
echo.
|
||||
echo [3/4] 上传新的jar包...
|
||||
scp crmeb-admin\target\crmeb-admin.jar root@1.15.149.240:/root/zhibo/
|
||||
|
||||
echo.
|
||||
echo [4/4] 启动后端服务...
|
||||
ssh root@1.15.149.240 "cd /root/zhibo && docker-compose up -d crmeb-admin"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 部署完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 请等待30秒让服务完全启动,然后刷新后台管理页面
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 部署余额系统更新
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
echo [1/3] 编译后端项目...
|
||||
cd Zhibo\zhibo-h
|
||||
call mvn clean package -DskipTests
|
||||
if %errorlevel% neq 0 (
|
||||
echo 编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/3] 停止后端服务...
|
||||
ssh root@1.15.149.240 "cd /www/server/project/zhibo-h && ./stop.sh"
|
||||
|
||||
echo.
|
||||
echo [3/3] 上传并启动服务...
|
||||
scp crmeb-front/target/crmeb-front.jar root@1.15.149.240:/www/server/project/zhibo-h/
|
||||
ssh root@1.15.149.240 "cd /www/server/project/zhibo-h && ./start.sh"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 部署完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 更新内容:
|
||||
echo - 余额系统改用nowMoney字段
|
||||
echo - APP显示"余额"而不是"虎牙币"
|
||||
echo - 充值和消费都使用nowMoney字段
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 部署直播间分类功能修复
|
||||
echo ========================================
|
||||
|
||||
echo.
|
||||
echo 此脚本将部署以下修改:
|
||||
echo 1. 后端 CategoryController - 从 eb_live_room_category 表获取分类
|
||||
echo 2. 后端 LiveRoomController - 正确设置直播间的 categoryName
|
||||
echo 3. Android 端分类筛选逻辑 - 使用 categoryName 筛选
|
||||
echo.
|
||||
|
||||
echo ========================================
|
||||
echo 步骤1: 编译后端代码
|
||||
echo ========================================
|
||||
cd Zhibo\zhibo-h
|
||||
call mvn clean package -DskipTests -pl crmeb-front -am
|
||||
if %errorlevel% neq 0 (
|
||||
echo 编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 步骤2: 部署到服务器
|
||||
echo ========================================
|
||||
echo 请手动将以下文件上传到服务器:
|
||||
echo - Zhibo\zhibo-h\crmeb-front\target\crmeb-front.jar
|
||||
echo.
|
||||
echo 然后在服务器上重启后端服务:
|
||||
echo systemctl restart zhibo-backend
|
||||
echo 或
|
||||
echo docker restart zhibo-backend
|
||||
echo.
|
||||
|
||||
echo ========================================
|
||||
echo 步骤3: 重新编译 Android 应用
|
||||
echo ========================================
|
||||
cd ..\..\android-app
|
||||
call gradlew assembleDebug
|
||||
if %errorlevel% neq 0 (
|
||||
echo Android 编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 部署完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 修改说明:
|
||||
echo - 后端 /api/front/category/live 接口现在从 eb_live_room_category 表获取分类
|
||||
echo - 直播间列表接口现在正确返回 categoryName 字段
|
||||
echo - Android 端分类筛选现在使用 categoryName 而不是 type
|
||||
echo.
|
||||
echo 数据库中的分类数据:
|
||||
echo 1. 娱乐
|
||||
echo 2. 游戏
|
||||
echo 3. 音乐
|
||||
echo 4. 户外
|
||||
echo 5. 聊天
|
||||
echo.
|
||||
echo 如果直播间没有设置分类,将显示在"推荐"标签下。
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
@echo off
|
||||
echo ===================================
|
||||
echo 部署礼物管理修复
|
||||
echo ===================================
|
||||
|
||||
set SERVER=root@1.15.149.240
|
||||
set JAR_PATH=Zhibo\zhibo-h\crmeb-admin\target\crmeb-admin.jar
|
||||
set REMOTE_PATH=/root/zhibo/admin/
|
||||
|
||||
echo.
|
||||
echo [1/3] 上传JAR文件...
|
||||
scp %JAR_PATH% %SERVER%:%REMOTE_PATH%
|
||||
|
||||
echo.
|
||||
echo [2/3] 重启后台服务...
|
||||
ssh %SERVER% "cd /root/zhibo/admin && ./restart.sh"
|
||||
|
||||
echo.
|
||||
echo [3/3] 等待服务启动...
|
||||
timeout /t 10
|
||||
|
||||
echo.
|
||||
echo ===================================
|
||||
echo 部署完成!
|
||||
echo 请刷新管理后台页面查看礼物记录
|
||||
echo ===================================
|
||||
pause
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 修复礼物记录显示问题 - 快速部署
|
||||
echo ========================================
|
||||
|
||||
cd Zhibo\zhibo-h
|
||||
|
||||
echo.
|
||||
echo [1/3] 清理并编译项目...
|
||||
call mvn clean package -DskipTests -Pdev
|
||||
|
||||
if %errorlevel% neq 0 (
|
||||
echo 编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/3] 停止远程服务...
|
||||
ssh root@1.15.149.240 "cd /www/server/java && ./stop.sh"
|
||||
|
||||
echo.
|
||||
echo [3/3] 上传并启动服务...
|
||||
scp crmeb-admin\target\crmeb-admin.jar root@1.15.149.240:/www/server/java/
|
||||
ssh root@1.15.149.240 "cd /www/server/java && ./start.sh"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 部署完成!
|
||||
echo 礼物记录页面现在应该可以正常显示数据了
|
||||
echo ========================================
|
||||
pause
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 礼物系统完整部署
|
||||
echo ========================================
|
||||
|
||||
echo.
|
||||
echo [1/4] 编译后端...
|
||||
cd Zhibo\zhibo-h
|
||||
call mvn clean package -DskipTests -Pdev
|
||||
|
||||
if %errorlevel% neq 0 (
|
||||
echo 后端编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/4] 编译前端...
|
||||
cd ..\admin
|
||||
call npm run build:prod
|
||||
|
||||
if %errorlevel% neq 0 (
|
||||
echo 前端编译失败!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [3/4] 停止远程服务并上传后端...
|
||||
ssh root@1.15.149.240 "cd /www/server/java && ./stop.sh"
|
||||
scp ..\zhibo-h\crmeb-admin\target\crmeb-admin.jar root@1.15.149.240:/www/server/java/
|
||||
|
||||
echo.
|
||||
echo [4/4] 上传前端并启动服务...
|
||||
scp -r dist/* root@1.15.149.240:/www/wwwroot/admin/
|
||||
ssh root@1.15.149.240 "cd /www/server/java && ./start.sh"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 部署完成!
|
||||
echo.
|
||||
echo 访问地址:http://1.15.149.240:9527
|
||||
echo.
|
||||
echo 礼物系统菜单:
|
||||
echo - 礼物列表:管理礼物配置
|
||||
echo - 打赏记录:查看打赏记录和统计
|
||||
echo - 充值套餐:管理充值套餐
|
||||
echo ========================================
|
||||
pause
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
REM ============================================
|
||||
REM 直播系统一键部署脚本 (Windows版)
|
||||
REM 服务器地址: 1.15.149.240
|
||||
REM ============================================
|
||||
|
||||
set SERVER_IP=1.15.149.240
|
||||
set SERVER_USER=root
|
||||
set DEPLOY_PATH=/opt/zhibo
|
||||
|
||||
echo ==========================================
|
||||
echo 直播系统部署脚本 (Windows版)
|
||||
echo 目标服务器: %SERVER_IP%
|
||||
echo ==========================================
|
||||
echo.
|
||||
|
||||
REM 检查scp和ssh命令
|
||||
where scp >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo 错误: 未找到scp命令
|
||||
echo 请安装OpenSSH客户端或使用Git Bash运行deploy-to-server.sh
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [1/6] 测试SSH连接...
|
||||
ssh -o ConnectTimeout=10 %SERVER_USER%@%SERVER_IP% "echo SSH连接成功"
|
||||
if %errorlevel% neq 0 (
|
||||
echo 错误: 无法连接到服务器
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/6] 创建服务器目录结构...
|
||||
ssh %SERVER_USER%@%SERVER_IP% "mkdir -p /opt/zhibo/admin-api /opt/zhibo/front-api /opt/zhibo/admin-web /opt/zhibo/logs /opt/zhibo/scripts"
|
||||
|
||||
echo.
|
||||
echo [3/6] 上传后端JAR包...
|
||||
echo - 上传 Admin API...
|
||||
scp Zhibo/zhibo-h/crmeb-admin/target/Crmeb-admin.jar %SERVER_USER%@%SERVER_IP%:/opt/zhibo/admin-api/
|
||||
|
||||
echo - 上传 Front API...
|
||||
scp Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar %SERVER_USER%@%SERVER_IP%:/opt/zhibo/front-api/
|
||||
|
||||
echo.
|
||||
echo [4/6] 上传前端管理界面...
|
||||
scp -r Zhibo/admin/dist/* %SERVER_USER%@%SERVER_IP%:/opt/zhibo/admin-web/
|
||||
|
||||
echo.
|
||||
echo [5/6] 创建服务启动脚本...
|
||||
ssh %SERVER_USER%@%SERVER_IP% "cat > /opt/zhibo/scripts/start-admin-api.sh" < server-scripts/start-admin-api.sh
|
||||
ssh %SERVER_USER%@%SERVER_IP% "cat > /opt/zhibo/scripts/start-front-api.sh" < server-scripts/start-front-api.sh
|
||||
ssh %SERVER_USER%@%SERVER_IP% "chmod +x /opt/zhibo/scripts/*.sh"
|
||||
|
||||
echo.
|
||||
echo [6/6] 上传Nginx配置...
|
||||
scp server-scripts/zhibo.nginx.conf %SERVER_USER%@%SERVER_IP%:/etc/nginx/conf.d/zhibo.conf
|
||||
ssh %SERVER_USER%@%SERVER_IP% "nginx -t && systemctl reload nginx"
|
||||
|
||||
echo.
|
||||
echo ==========================================
|
||||
echo 部署完成!
|
||||
echo ==========================================
|
||||
echo.
|
||||
echo 请在服务器上执行以下命令启动服务:
|
||||
echo ssh %SERVER_USER%@%SERVER_IP%
|
||||
echo cd /opt/zhibo/scripts
|
||||
echo ./start-all.sh
|
||||
echo.
|
||||
echo 服务访问地址:
|
||||
echo - 管理后台: http://%SERVER_IP%
|
||||
echo - Admin API: http://%SERVER_IP%:30001
|
||||
echo - Front API: http://%SERVER_IP%:8081
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,269 +0,0 @@
|
|||
#!/bin/bash
|
||||
# ============================================
|
||||
# 直播系统一键部署脚本
|
||||
# 服务器地址: 1.15.149.240
|
||||
# ============================================
|
||||
|
||||
set -e
|
||||
|
||||
# 配置变量
|
||||
SERVER_IP="1.15.149.240"
|
||||
SERVER_USER="root"
|
||||
DEPLOY_PATH="/opt/zhibo"
|
||||
ADMIN_API_PORT=30001
|
||||
FRONT_API_PORT=8081
|
||||
|
||||
echo "=========================================="
|
||||
echo " 直播系统部署脚本"
|
||||
echo " 目标服务器: $SERVER_IP"
|
||||
echo "=========================================="
|
||||
|
||||
# 检查SSH连接
|
||||
echo ""
|
||||
echo "[1/6] 检查SSH连接..."
|
||||
ssh -o ConnectTimeout=10 ${SERVER_USER}@${SERVER_IP} "echo 'SSH连接成功'" || {
|
||||
echo "错误: 无法连接到服务器 ${SERVER_IP}"
|
||||
echo "请确保:"
|
||||
echo " 1. 服务器IP正确"
|
||||
echo " 2. SSH密钥已配置或准备好密码"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 在服务器上创建目录结构
|
||||
echo ""
|
||||
echo "[2/6] 创建服务器目录结构..."
|
||||
ssh ${SERVER_USER}@${SERVER_IP} << 'ENDSSH'
|
||||
mkdir -p /opt/zhibo/admin-api
|
||||
mkdir -p /opt/zhibo/front-api
|
||||
mkdir -p /opt/zhibo/admin-web
|
||||
mkdir -p /opt/zhibo/logs
|
||||
mkdir -p /opt/zhibo/scripts
|
||||
echo "目录创建完成"
|
||||
ENDSSH
|
||||
|
||||
# 上传后端JAR包
|
||||
echo ""
|
||||
echo "[3/6] 上传后端JAR包..."
|
||||
echo " - 上传 Admin API (Crmeb-admin.jar)..."
|
||||
scp Zhibo/zhibo-h/crmeb-admin/target/Crmeb-admin.jar ${SERVER_USER}@${SERVER_IP}:/opt/zhibo/admin-api/
|
||||
|
||||
echo " - 上传 Front API (Crmeb-front.jar)..."
|
||||
scp Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar ${SERVER_USER}@${SERVER_IP}:/opt/zhibo/front-api/
|
||||
|
||||
# 上传前端文件
|
||||
echo ""
|
||||
echo "[4/6] 上传前端管理界面..."
|
||||
scp -r Zhibo/admin/dist/* ${SERVER_USER}@${SERVER_IP}:/opt/zhibo/admin-web/
|
||||
|
||||
# 创建启动脚本
|
||||
echo ""
|
||||
echo "[5/6] 创建服务启动脚本..."
|
||||
ssh ${SERVER_USER}@${SERVER_IP} << 'ENDSSH'
|
||||
# 创建Admin API启动脚本
|
||||
cat > /opt/zhibo/scripts/start-admin-api.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
APP_NAME="Crmeb-admin"
|
||||
APP_PATH="/opt/zhibo/admin-api"
|
||||
LOG_PATH="/opt/zhibo/logs"
|
||||
JAR_FILE="${APP_PATH}/${APP_NAME}.jar"
|
||||
|
||||
# 停止旧进程
|
||||
pid=$(ps -ef | grep "${APP_NAME}.jar" | grep -v grep | awk '{print $2}')
|
||||
if [ -n "$pid" ]; then
|
||||
echo "停止旧进程: $pid"
|
||||
kill -9 $pid
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
# 启动新进程
|
||||
if [ -f "$JAR_FILE" ]; then
|
||||
echo "启动 ${APP_NAME}..."
|
||||
nohup java -Xms512m -Xmx1024m -jar $JAR_FILE \
|
||||
--spring.redis.host=127.0.0.1 \
|
||||
> ${LOG_PATH}/admin-api.log 2>&1 &
|
||||
echo "Admin API 启动成功,端口: 30001"
|
||||
else
|
||||
echo "错误: JAR文件不存在: $JAR_FILE"
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
|
||||
# 创建Front API启动脚本
|
||||
cat > /opt/zhibo/scripts/start-front-api.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
APP_NAME="Crmeb-front"
|
||||
APP_PATH="/opt/zhibo/front-api"
|
||||
LOG_PATH="/opt/zhibo/logs"
|
||||
JAR_FILE="${APP_PATH}/${APP_NAME}.jar"
|
||||
|
||||
# 停止旧进程
|
||||
pid=$(ps -ef | grep "${APP_NAME}.jar" | grep -v grep | awk '{print $2}')
|
||||
if [ -n "$pid" ]; then
|
||||
echo "停止旧进程: $pid"
|
||||
kill -9 $pid
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
# 启动新进程
|
||||
if [ -f "$JAR_FILE" ]; then
|
||||
echo "启动 ${APP_NAME}..."
|
||||
nohup java -Xms512m -Xmx1024m -jar $JAR_FILE \
|
||||
--spring.redis.host=127.0.0.1 \
|
||||
> ${LOG_PATH}/front-api.log 2>&1 &
|
||||
echo "Front API 启动成功,端口: 8081"
|
||||
else
|
||||
echo "错误: JAR文件不存在: $JAR_FILE"
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
|
||||
# 创建停止脚本
|
||||
cat > /opt/zhibo/scripts/stop-all.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
echo "停止所有服务..."
|
||||
pkill -f "Crmeb-admin.jar" 2>/dev/null && echo "Admin API 已停止" || echo "Admin API 未运行"
|
||||
pkill -f "Crmeb-front.jar" 2>/dev/null && echo "Front API 已停止" || echo "Front API 未运行"
|
||||
echo "完成"
|
||||
EOF
|
||||
|
||||
# 创建一键启动脚本
|
||||
cat > /opt/zhibo/scripts/start-all.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
echo "=========================================="
|
||||
echo " 启动所有直播系统服务"
|
||||
echo "=========================================="
|
||||
cd /opt/zhibo/scripts
|
||||
./start-admin-api.sh
|
||||
sleep 5
|
||||
./start-front-api.sh
|
||||
echo ""
|
||||
echo "所有服务启动完成!"
|
||||
echo " - Admin API: http://localhost:30001"
|
||||
echo " - Front API: http://localhost:8081"
|
||||
EOF
|
||||
|
||||
# 创建状态检查脚本
|
||||
cat > /opt/zhibo/scripts/status.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
echo "=========================================="
|
||||
echo " 服务状态检查"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Admin API (端口 30001):"
|
||||
if pgrep -f "Crmeb-admin.jar" > /dev/null; then
|
||||
echo " 状态: 运行中"
|
||||
pid=$(pgrep -f "Crmeb-admin.jar")
|
||||
echo " PID: $pid"
|
||||
else
|
||||
echo " 状态: 未运行"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Front API (端口 8081):"
|
||||
if pgrep -f "Crmeb-front.jar" > /dev/null; then
|
||||
echo " 状态: 运行中"
|
||||
pid=$(pgrep -f "Crmeb-front.jar")
|
||||
echo " PID: $pid"
|
||||
else
|
||||
echo " 状态: 未运行"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "端口监听状态:"
|
||||
netstat -tlnp 2>/dev/null | grep -E "30001|8081" || ss -tlnp | grep -E "30001|8081"
|
||||
EOF
|
||||
|
||||
chmod +x /opt/zhibo/scripts/*.sh
|
||||
echo "启动脚本创建完成"
|
||||
ENDSSH
|
||||
|
||||
# 创建Nginx配置
|
||||
echo ""
|
||||
echo "[6/6] 配置Nginx..."
|
||||
ssh ${SERVER_USER}@${SERVER_IP} << 'ENDSSH'
|
||||
# 检查Nginx是否安装
|
||||
if ! command -v nginx &> /dev/null; then
|
||||
echo "Nginx未安装,正在安装..."
|
||||
apt-get update && apt-get install -y nginx || yum install -y nginx
|
||||
fi
|
||||
|
||||
# 创建Nginx配置
|
||||
cat > /etc/nginx/conf.d/zhibo.conf << 'EOF'
|
||||
# 直播系统 - 管理后台前端
|
||||
server {
|
||||
listen 80;
|
||||
server_name admin.zhibo.local; # 可以改成你的域名
|
||||
|
||||
root /opt/zhibo/admin-web;
|
||||
index index.html;
|
||||
|
||||
# 前端静态文件
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# 代理Admin API
|
||||
location /api/admin/ {
|
||||
proxy_pass http://127.0.0.1:30001/api/admin/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
# 代理公共API
|
||||
location /api/public/ {
|
||||
proxy_pass http://127.0.0.1:30001/api/public/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
}
|
||||
|
||||
# 直播系统 - 前端API (供APP调用)
|
||||
server {
|
||||
listen 8080;
|
||||
server_name _;
|
||||
|
||||
# 代理Front API
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8081;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
||||
# WebSocket支持
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 86400;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# 测试Nginx配置
|
||||
nginx -t && systemctl reload nginx
|
||||
echo "Nginx配置完成"
|
||||
ENDSSH
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " 部署完成!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "接下来请在服务器上执行以下命令启动服务:"
|
||||
echo ""
|
||||
echo " ssh ${SERVER_USER}@${SERVER_IP}"
|
||||
echo " cd /opt/zhibo/scripts"
|
||||
echo " ./start-all.sh"
|
||||
echo ""
|
||||
echo "服务访问地址:"
|
||||
echo " - 管理后台: http://${SERVER_IP}"
|
||||
echo " - Admin API: http://${SERVER_IP}:30001"
|
||||
echo " - Front API: http://${SERVER_IP}:8081 (或通过Nginx 8080端口)"
|
||||
echo ""
|
||||
echo "常用命令:"
|
||||
echo " - 启动所有服务: /opt/zhibo/scripts/start-all.sh"
|
||||
echo " - 停止所有服务: /opt/zhibo/scripts/stop-all.sh"
|
||||
echo " - 查看服务状态: /opt/zhibo/scripts/status.sh"
|
||||
echo " - 查看日志: tail -f /opt/zhibo/logs/admin-api.log"
|
||||
echo " tail -f /opt/zhibo/logs/front-api.log"
|
||||
echo ""
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 部署礼物管理到直播管理下
|
||||
echo ========================================
|
||||
|
||||
echo.
|
||||
echo [步骤1] 请先执行 add_gift_to_live_manage_correct.sql
|
||||
echo 这会在数据库中启用礼物打赏菜单
|
||||
echo.
|
||||
pause
|
||||
|
||||
echo.
|
||||
echo [步骤2] 清除前端缓存...
|
||||
cd Zhibo\admin
|
||||
|
||||
if exist node_modules\.cache (
|
||||
rmdir /s /q node_modules\.cache
|
||||
echo 缓存已清除
|
||||
)
|
||||
|
||||
if exist dist (
|
||||
rmdir /s /q dist
|
||||
echo dist目录已清除
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [步骤3] 重新构建前端...
|
||||
call npm run build:prod
|
||||
|
||||
echo.
|
||||
echo [步骤4] 完成!
|
||||
echo.
|
||||
echo 现在请:
|
||||
echo 1. 清除浏览器缓存 (Ctrl+Shift+Delete)
|
||||
echo 2. 重新登录后台
|
||||
echo 3. 在"直播管理"菜单下查看"礼物打赏"
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 部署完整的礼物管理功能
|
||||
echo ========================================
|
||||
|
||||
echo.
|
||||
echo [步骤1] 执行数据库脚本
|
||||
echo 请依次执行以下SQL文件:
|
||||
echo 1. create_gift_table.sql - 创建礼物表
|
||||
echo 2. add_gift_manage_menu.sql - 添加菜单
|
||||
echo.
|
||||
pause
|
||||
|
||||
echo.
|
||||
echo [步骤2] 清除前端缓存...
|
||||
cd Zhibo\admin
|
||||
|
||||
if exist node_modules\.cache (
|
||||
rmdir /s /q node_modules\.cache
|
||||
echo 前端缓存已清除
|
||||
)
|
||||
|
||||
if exist dist (
|
||||
rmdir /s /q dist
|
||||
echo dist目录已清除
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [步骤3] 重新构建前端...
|
||||
call npm run build:prod
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 部署完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 现在请:
|
||||
echo 1. 清除浏览器缓存 (Ctrl+Shift+Delete)
|
||||
echo 2. 重新登录后台
|
||||
echo 3. 在"直播管理"下查看:
|
||||
echo - 打赏记录:查看礼物打赏记录
|
||||
echo - 礼物管理:管理礼物列表(添加/编辑/删除)
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
-- ========================================
|
||||
-- 诊断直播管理菜单404问题
|
||||
-- ========================================
|
||||
|
||||
-- 1. 查找所有直播相关的菜单
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort,
|
||||
CASE
|
||||
WHEN is_show = 1 THEN '显示'
|
||||
ELSE '隐藏'
|
||||
END as display_status
|
||||
FROM eb_system_menu
|
||||
WHERE name LIKE '%直播%'
|
||||
OR component LIKE '%live%'
|
||||
OR component LIKE '%room%'
|
||||
OR component LIKE '%family%'
|
||||
OR component LIKE '%fanGroup%'
|
||||
OR component LIKE '%streamer%'
|
||||
ORDER BY pid, sort, id;
|
||||
|
||||
-- 2. 查找礼物相关的菜单
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
sort
|
||||
FROM eb_system_menu
|
||||
WHERE name LIKE '%礼物%'
|
||||
OR component LIKE '%gift%'
|
||||
ORDER BY pid, sort, id;
|
||||
|
||||
-- 3. 检查是否有component路径冲突
|
||||
SELECT
|
||||
component,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(CONCAT(id, ':', name) SEPARATOR ' | ') as conflicting_menus
|
||||
FROM eb_system_menu
|
||||
WHERE is_show = 1
|
||||
AND component IS NOT NULL
|
||||
AND component != ''
|
||||
GROUP BY component
|
||||
HAVING count > 1;
|
||||
|
||||
-- ========================================
|
||||
-- 修复方案:确保component字段与前端路由path匹配
|
||||
-- ========================================
|
||||
|
||||
-- 前端路由配置:
|
||||
-- liveManageRouter.path = '/liveManage'
|
||||
-- 子路由:
|
||||
-- - 'room/list' -> '/liveManage/room/list'
|
||||
-- - 'family/list' -> '/liveManage/family/list'
|
||||
-- - 'family/level' -> '/liveManage/family/level'
|
||||
-- - 'family/member' -> '/liveManage/family/member'
|
||||
-- - 'fanGroup/list' -> '/liveManage/fanGroup/list'
|
||||
-- - 'streamer/list' -> '/liveManage/streamer/list'
|
||||
|
||||
-- 礼物路由配置:
|
||||
-- giftManageRouter.path = '/gift'
|
||||
-- 子路由:
|
||||
-- - 'records/index' -> '/gift/records/index'
|
||||
|
||||
-- 4. 查看当前直播管理菜单的component配置
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
'应该是: /liveManage' as expected_component
|
||||
FROM eb_system_menu
|
||||
WHERE name = '直播管理'
|
||||
LIMIT 1;
|
||||
|
||||
-- 5. 查看直播管理的子菜单
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
CASE
|
||||
WHEN name LIKE '%房间%' THEN '应该是: /liveManage/room/list'
|
||||
WHEN name LIKE '%家族列表%' THEN '应该是: /liveManage/family/list'
|
||||
WHEN name LIKE '%家族级别%' THEN '应该是: /liveManage/family/level'
|
||||
WHEN name LIKE '%家族成员%' THEN '应该是: /liveManage/family/member'
|
||||
WHEN name LIKE '%粉丝团%' THEN '应该是: /liveManage/fanGroup/list'
|
||||
WHEN name LIKE '%主播%' THEN '应该是: /liveManage/streamer/list'
|
||||
ELSE '未知'
|
||||
END as expected_component
|
||||
FROM eb_system_menu
|
||||
WHERE pid IN (SELECT id FROM eb_system_menu WHERE name = '直播管理')
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,167 +0,0 @@
|
|||
# 余额显示为0问题诊断
|
||||
|
||||
## 问题现象
|
||||
APP中钱包页面显示余额为0,但后台管理系统中用户有余额。
|
||||
|
||||
## 可能原因
|
||||
|
||||
### 1. 后端未部署最新代码
|
||||
**检查方法**:
|
||||
```bash
|
||||
# 查看后端日志
|
||||
ssh root@1.15.149.240 "tail -f /www/server/project/zhibo-h/logs/crmeb-front.log"
|
||||
```
|
||||
|
||||
**解决方法**:
|
||||
```bash
|
||||
# 重新部署后端
|
||||
deploy-balance-system.bat
|
||||
```
|
||||
|
||||
### 2. 数据库字段问题
|
||||
**检查方法**:
|
||||
```sql
|
||||
-- 检查now_money字段是否存在
|
||||
SHOW COLUMNS FROM eb_user LIKE 'now_money';
|
||||
|
||||
-- 查看测试用户的余额
|
||||
SELECT uid, account, nickname, now_money
|
||||
FROM eb_user
|
||||
WHERE uid = 43;
|
||||
```
|
||||
|
||||
**解决方法**:
|
||||
```sql
|
||||
-- 如果字段不存在,添加字段
|
||||
ALTER TABLE eb_user ADD COLUMN now_money DECIMAL(10,2) DEFAULT 0.00 COMMENT '用户余额';
|
||||
|
||||
-- 如果余额为0,给测试用户添加余额
|
||||
UPDATE eb_user SET now_money = 1000.00 WHERE uid = 43;
|
||||
```
|
||||
|
||||
### 3. API调用失败
|
||||
**检查方法**:
|
||||
在Android Studio中查看logcat日志:
|
||||
```bash
|
||||
adb logcat -s WalletActivity:D
|
||||
```
|
||||
|
||||
查看日志输出:
|
||||
- Response code: 应该是200
|
||||
- Is OK: 应该是true
|
||||
- Balance: 应该显示实际余额
|
||||
|
||||
**可能的错误**:
|
||||
- 401: 未登录或token过期
|
||||
- 404: API路径错误
|
||||
- 500: 服务器错误
|
||||
|
||||
### 4. APP未重新编译
|
||||
**解决方法**:
|
||||
在Android Studio中:
|
||||
1. Build -> Clean Project
|
||||
2. Build -> Rebuild Project
|
||||
3. 重新运行APP
|
||||
|
||||
## 完整诊断步骤
|
||||
|
||||
### 步骤1: 检查数据库
|
||||
```sql
|
||||
-- 执行 test_balance_api.sql
|
||||
SELECT uid, account, nickname, now_money
|
||||
FROM eb_user
|
||||
WHERE uid = 43;
|
||||
```
|
||||
|
||||
如果余额为0,执行:
|
||||
```sql
|
||||
UPDATE eb_user SET now_money = 1000.00 WHERE uid = 43;
|
||||
```
|
||||
|
||||
### 步骤2: 检查后端API
|
||||
使用curl测试(需要先获取token):
|
||||
```bash
|
||||
# 1. 登录获取token
|
||||
curl -X POST http://1.15.149.240:8080/api/front/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"account":"13800000043","password":"123456"}'
|
||||
|
||||
# 2. 使用token测试余额API
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
||||
http://1.15.149.240:8080/api/front/virtual-currency/balance
|
||||
```
|
||||
|
||||
预期返回:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"balance": 1000.00,
|
||||
"userId": 43
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤3: 检查APP日志
|
||||
```bash
|
||||
# 清除旧日志
|
||||
adb logcat -c
|
||||
|
||||
# 查看实时日志
|
||||
adb logcat -s WalletActivity:D
|
||||
|
||||
# 然后在APP中打开钱包页面
|
||||
```
|
||||
|
||||
查看日志输出,确认:
|
||||
1. API是否调用成功
|
||||
2. 返回的数据是否正确
|
||||
3. 是否有异常错误
|
||||
|
||||
### 步骤4: 重新部署
|
||||
如果以上都正常但还是显示0,重新部署:
|
||||
|
||||
```bash
|
||||
# 1. 部署后端
|
||||
deploy-balance-system.bat
|
||||
|
||||
# 2. 重新编译APP
|
||||
# 在Android Studio中 Build -> Rebuild Project
|
||||
|
||||
# 3. 重新安装APP到设备
|
||||
```
|
||||
|
||||
## 快速修复
|
||||
|
||||
如果确认是数据库余额为0的问题:
|
||||
|
||||
```sql
|
||||
-- 给所有测试用户添加余额
|
||||
UPDATE eb_user
|
||||
SET now_money = 1000.00
|
||||
WHERE uid IN (43, 44, 45, 46) AND now_money = 0;
|
||||
|
||||
-- 验证
|
||||
SELECT uid, account, nickname, now_money
|
||||
FROM eb_user
|
||||
WHERE uid IN (43, 44, 45, 46);
|
||||
```
|
||||
|
||||
然后重启APP,刷新钱包页面。
|
||||
|
||||
## 验证修复
|
||||
|
||||
1. 打开APP
|
||||
2. 登录账号(13800000043 / 123456)
|
||||
3. 进入"我的"页面
|
||||
4. 点击"钱包"
|
||||
5. 查看余额是否正确显示
|
||||
|
||||
如果显示正确,测试充值功能:
|
||||
1. 点击"充值"
|
||||
2. 选择充值套餐
|
||||
3. 选择支付方式
|
||||
4. 点击"确认充值"
|
||||
5. 返回钱包页面,查看余额是否增加
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
-- 诊断当前关注页面问题
|
||||
-- 执行这个脚本来查看具体问题所在
|
||||
|
||||
SELECT '========== 1. 检查当前登录用户的关注记录 ==========' as step;
|
||||
|
||||
-- 查看所有关注记录
|
||||
SELECT
|
||||
fr.id,
|
||||
fr.follower_id,
|
||||
fr.follower_nickname,
|
||||
fr.followed_id,
|
||||
fr.followed_nickname,
|
||||
fr.follow_status,
|
||||
fr.is_deleted,
|
||||
fr.create_time
|
||||
FROM eb_follow_record fr
|
||||
ORDER BY fr.create_time DESC
|
||||
LIMIT 20;
|
||||
|
||||
SELECT '========== 2. 检查关注状态值的分布 ==========' as step;
|
||||
|
||||
SELECT
|
||||
follow_status,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(DISTINCT CONCAT(follower_id, '->', followed_id) LIMIT 5) as examples
|
||||
FROM eb_follow_record
|
||||
GROUP BY follow_status;
|
||||
|
||||
SELECT '========== 3. 检查主播用户 ==========' as step;
|
||||
|
||||
SELECT
|
||||
u.uid,
|
||||
u.nickname,
|
||||
u.is_streamer,
|
||||
COUNT(DISTINCT lr.id) as room_count,
|
||||
SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) as live_count
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_live_room lr ON u.uid = lr.uid
|
||||
WHERE u.is_streamer = 1
|
||||
GROUP BY u.uid, u.nickname, u.is_streamer
|
||||
ORDER BY room_count DESC;
|
||||
|
||||
SELECT '========== 4. 检查所有直播间 ==========' as step;
|
||||
|
||||
SELECT
|
||||
lr.id,
|
||||
lr.uid,
|
||||
u.nickname as streamer_name,
|
||||
lr.title,
|
||||
lr.is_live,
|
||||
lr.started_at,
|
||||
lr.view_count
|
||||
FROM eb_live_room lr
|
||||
LEFT JOIN eb_user u ON lr.uid = u.uid
|
||||
ORDER BY lr.is_live DESC, lr.id DESC
|
||||
LIMIT 20;
|
||||
|
||||
SELECT '========== 5. 模拟关注页面查询(用户43) ==========' as step;
|
||||
|
||||
-- 获取用户43的关注列表
|
||||
SELECT
|
||||
'用户43的关注列表' as info,
|
||||
fr.followed_id,
|
||||
fr.followed_nickname,
|
||||
fr.follow_status,
|
||||
u.is_streamer
|
||||
FROM eb_follow_record fr
|
||||
LEFT JOIN eb_user u ON fr.followed_id = u.uid
|
||||
WHERE fr.follower_id = 43
|
||||
AND fr.is_deleted = 0;
|
||||
|
||||
-- 查找这些被关注用户的直播间
|
||||
SELECT
|
||||
'用户43关注的主播的直播间' as info,
|
||||
lr.id as room_id,
|
||||
lr.uid as streamer_uid,
|
||||
u.nickname as streamer_name,
|
||||
lr.title as room_title,
|
||||
lr.is_live,
|
||||
lr.started_at
|
||||
FROM eb_live_room lr
|
||||
INNER JOIN eb_user u ON lr.uid = u.uid
|
||||
WHERE lr.uid IN (
|
||||
SELECT fr.followed_id
|
||||
FROM eb_follow_record fr
|
||||
WHERE fr.follower_id = 43
|
||||
AND fr.is_deleted = 0
|
||||
AND fr.follow_status IN ('1', '关注')
|
||||
)
|
||||
ORDER BY lr.is_live DESC;
|
||||
|
||||
SELECT '========== 6. 检查是否有follow_status不是1的记录 ==========' as step;
|
||||
|
||||
SELECT
|
||||
follow_status,
|
||||
COUNT(*) as count
|
||||
FROM eb_follow_record
|
||||
WHERE follow_status != '1'
|
||||
GROUP BY follow_status;
|
||||
|
||||
SELECT '========== 7. 检查用户表中的is_streamer字段 ==========' as step;
|
||||
|
||||
SELECT
|
||||
is_streamer,
|
||||
COUNT(*) as count
|
||||
FROM eb_user
|
||||
GROUP BY is_streamer;
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
-- 关注功能诊断脚本
|
||||
-- 用于检查数据库表和数据状态
|
||||
|
||||
-- 1. 检查表是否存在
|
||||
SELECT
|
||||
'eb_user_follow' as table_name,
|
||||
CASE WHEN COUNT(*) > 0 THEN '✓ 存在' ELSE '✗ 不存在' END as status
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'crmeb' AND table_name = 'eb_user_follow'
|
||||
UNION ALL
|
||||
SELECT
|
||||
'eb_follow_record' as table_name,
|
||||
CASE WHEN COUNT(*) > 0 THEN '✓ 存在' ELSE '✗ 不存在' END as status
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'crmeb' AND table_name = 'eb_follow_record';
|
||||
|
||||
-- 2. 检查表结构
|
||||
SHOW CREATE TABLE eb_user_follow\G
|
||||
SHOW CREATE TABLE eb_follow_record\G
|
||||
|
||||
-- 3. 查看数据量
|
||||
SELECT 'eb_user_follow' as table_name, COUNT(*) as record_count FROM eb_user_follow
|
||||
UNION ALL
|
||||
SELECT 'eb_follow_record' as table_name, COUNT(*) as record_count FROM eb_follow_record;
|
||||
|
||||
-- 4. 查看最近的关注记录
|
||||
SELECT
|
||||
'eb_user_follow (最近10条)' as description,
|
||||
uf.*
|
||||
FROM eb_user_follow uf
|
||||
ORDER BY uf.create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
SELECT
|
||||
'eb_follow_record (最近10条)' as description,
|
||||
fr.*
|
||||
FROM eb_follow_record fr
|
||||
ORDER BY fr.create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 5. 检查用户表
|
||||
SELECT
|
||||
uid,
|
||||
nickname,
|
||||
phone,
|
||||
is_streamer,
|
||||
streamer_level
|
||||
FROM eb_user
|
||||
WHERE is_streamer = 1
|
||||
LIMIT 5;
|
||||
|
||||
-- 6. 检查直播间表
|
||||
SELECT
|
||||
id,
|
||||
uid as streamer_id,
|
||||
title,
|
||||
streamer_name,
|
||||
is_live
|
||||
FROM eb_live_room
|
||||
LIMIT 5;
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
-- 礼物系统完整诊断脚本
|
||||
|
||||
-- 1. 检查礼物记录表
|
||||
SELECT '=== 礼物记录表检查 ===' as '';
|
||||
SELECT COUNT(*) as '礼物记录总数' FROM eb_gift_record;
|
||||
SELECT * FROM eb_gift_record ORDER BY create_time DESC LIMIT 5;
|
||||
|
||||
-- 2. 检查礼物配置表
|
||||
SELECT '=== 礼物配置表检查 ===' as '';
|
||||
SELECT COUNT(*) as '礼物配置总数' FROM eb_gift_config;
|
||||
SELECT * FROM eb_gift_config ORDER BY sort_order LIMIT 5;
|
||||
|
||||
-- 3. 检查用户虚拟货币
|
||||
SELECT '=== 用户虚拟货币检查 ===' as '';
|
||||
SELECT u.uid, u.nickname, u.phone, u.virtual_balance
|
||||
FROM eb_user u
|
||||
WHERE u.uid IN (43, 44, 45)
|
||||
ORDER BY u.uid;
|
||||
|
||||
-- 4. 检查充值记录
|
||||
SELECT '=== 充值记录检查 ===' as '';
|
||||
SELECT COUNT(*) as '充值记录总数' FROM eb_virtual_currency_recharge;
|
||||
SELECT * FROM eb_virtual_currency_recharge ORDER BY create_time DESC LIMIT 5;
|
||||
|
||||
-- 5. 检查直播间
|
||||
SELECT '=== 直播间检查 ===' as '';
|
||||
SELECT id, title, uid as streamer_id, is_live as status FROM eb_live_room WHERE id IN (8, 9, 10) ORDER BY id;
|
||||
|
||||
-- 6. 如果没有测试数据,插入一些
|
||||
SELECT '=== 开始插入测试数据 ===' as '';
|
||||
|
||||
-- 确保用户有虚拟货币余额
|
||||
UPDATE eb_user
|
||||
SET virtual_balance = 10000
|
||||
WHERE uid IN (43, 44, 45) AND (virtual_balance IS NULL OR virtual_balance = 0);
|
||||
|
||||
-- 插入测试礼物记录
|
||||
INSERT INTO eb_gift_record (sender_id, sender_name, receiver_id, receiver_name, room_id, gift_id, gift_name, gift_price, quantity, total_price, create_time)
|
||||
SELECT
|
||||
43 as sender_id,
|
||||
'测试用户43' as sender_name,
|
||||
44 as receiver_id,
|
||||
'测试用户44' as receiver_name,
|
||||
8 as room_id,
|
||||
1 as gift_id,
|
||||
'玫瑰花' as gift_name,
|
||||
10 as gift_price,
|
||||
5 as quantity,
|
||||
50 as total_price,
|
||||
NOW() as create_time
|
||||
FROM DUAL
|
||||
WHERE NOT EXISTS (SELECT 1 FROM eb_gift_record WHERE sender_id = 43 AND receiver_id = 44 LIMIT 1);
|
||||
|
||||
INSERT INTO eb_gift_record (sender_id, sender_name, receiver_id, receiver_name, room_id, gift_id, gift_name, gift_price, quantity, total_price, create_time)
|
||||
SELECT
|
||||
45 as sender_id,
|
||||
'测试用户45' as sender_name,
|
||||
44 as receiver_id,
|
||||
'测试用户44' as receiver_name,
|
||||
8 as room_id,
|
||||
5 as gift_id,
|
||||
'跑车' as gift_name,
|
||||
500 as gift_price,
|
||||
1 as quantity,
|
||||
500 as total_price,
|
||||
NOW() - INTERVAL 1 HOUR as create_time
|
||||
FROM DUAL
|
||||
WHERE NOT EXISTS (SELECT 1 FROM eb_gift_record WHERE sender_id = 45 AND receiver_id = 44 LIMIT 1);
|
||||
|
||||
INSERT INTO eb_gift_record (sender_id, sender_name, receiver_id, receiver_name, room_id, gift_id, gift_name, gift_price, quantity, total_price, create_time)
|
||||
SELECT
|
||||
43 as sender_id,
|
||||
'测试用户43' as sender_name,
|
||||
45 as receiver_id,
|
||||
'测试用户45' as receiver_name,
|
||||
9 as room_id,
|
||||
1 as gift_id,
|
||||
'爱心' as gift_name,
|
||||
1 as gift_price,
|
||||
100 as quantity,
|
||||
100 as total_price,
|
||||
NOW() - INTERVAL 2 HOUR as create_time
|
||||
FROM DUAL
|
||||
WHERE (SELECT COUNT(*) FROM eb_gift_record) < 3;
|
||||
|
||||
-- 7. 验证插入结果
|
||||
SELECT '=== 验证测试数据 ===' as '';
|
||||
SELECT COUNT(*) as '当前礼物记录总数' FROM eb_gift_record;
|
||||
|
||||
SELECT
|
||||
g.id,
|
||||
g.gift_name,
|
||||
g.gift_price,
|
||||
g.quantity,
|
||||
g.total_price,
|
||||
sender.nickname as sender_name,
|
||||
receiver.nickname as receiver_name,
|
||||
g.room_id,
|
||||
g.create_time
|
||||
FROM eb_gift_record g
|
||||
LEFT JOIN eb_user sender ON g.sender_id = sender.uid
|
||||
LEFT JOIN eb_user receiver ON g.receiver_id = receiver.uid
|
||||
ORDER BY g.create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
SELECT '=== 诊断完成 ===' as '';
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
-- 诊断直播间状态问题
|
||||
|
||||
-- 1. 查看所有直播间及其状态
|
||||
SELECT id, title, streamer_id, streamer_name, status, is_live,
|
||||
stream_key, rtmp_url, hls_url, flv_url,
|
||||
create_time, update_time
|
||||
FROM eb_live_room
|
||||
ORDER BY id DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 2. 查看直播间状态字段含义
|
||||
-- status: 1=正常, 0=禁用
|
||||
-- is_live: 1=正在直播, 0=未开播
|
||||
|
||||
-- 3. 检查是否有正在直播的房间
|
||||
SELECT COUNT(*) as live_count FROM eb_live_room WHERE is_live = 1;
|
||||
|
||||
-- 4. 手动将某个直播间设置为直播中(测试用)
|
||||
-- 假设直播间ID为1,执行以下SQL:
|
||||
-- UPDATE eb_live_room SET is_live = 1 WHERE id = 1;
|
||||
|
||||
-- 5. 查看推流地址配置
|
||||
SELECT id, title, stream_key,
|
||||
CONCAT('rtmp://1.15.149.240:1935/live/', stream_key) as rtmp_push_url,
|
||||
CONCAT('http://1.15.149.240:8083/live/', stream_key, '.flv') as flv_play_url,
|
||||
CONCAT('http://1.15.149.240:8083/live/', stream_key, '.m3u8') as hls_play_url
|
||||
FROM eb_live_room
|
||||
WHERE status = 1
|
||||
ORDER BY id DESC
|
||||
LIMIT 5;
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
# 直播状态自动重置问题诊断
|
||||
|
||||
## 问题描述
|
||||
OBS推流后,直播间 `is_live` 状态会被不断重置为 0。
|
||||
|
||||
## 可能原因
|
||||
|
||||
### 1. SRS 的 `on_unpublish` 回调被触发
|
||||
当 SRS 检测到推流断开时,会调用 `on_unpublish` 回调,将 `is_live` 设置为 0。
|
||||
|
||||
**可能的触发原因:**
|
||||
- OBS 推流不稳定,频繁断开重连
|
||||
- SRS 配置的超时时间太短
|
||||
- 网络问题导致 SRS 认为推流已断开
|
||||
|
||||
### 2. Node.js 服务的 `donePublish` 事件
|
||||
Node.js 的 NodeMediaServer 也会监听推流状态,当检测到推流结束时会调用 `roomStore.setLiveStatus(streamKey, false)`。
|
||||
|
||||
## 排查步骤
|
||||
|
||||
### 步骤1:检查 Node.js 服务日志
|
||||
在服务器上查看 live-streaming 服务的日志:
|
||||
```bash
|
||||
# 如果使用 Docker
|
||||
docker logs live-streaming-api-1 --tail 100 -f
|
||||
|
||||
# 如果直接运行
|
||||
pm2 logs live-streaming
|
||||
```
|
||||
|
||||
看是否有以下日志:
|
||||
- `[SRS] 推流开始: stream=xxx`
|
||||
- `[SRS] 推流结束: stream=xxx`
|
||||
|
||||
### 步骤2:检查 Java 后端日志
|
||||
查看 Java 后端是否收到 SRS 回调:
|
||||
```bash
|
||||
# 查看后端日志
|
||||
tail -f /path/to/java-backend/logs/xxx.log
|
||||
```
|
||||
|
||||
看是否有:
|
||||
- `[SRS] 推流开始: stream=xxx`
|
||||
- `[SRS] 推流结束: stream=xxx`
|
||||
|
||||
### 步骤3:检查 SRS 配置
|
||||
查看 SRS 是否配置了正确的回调地址:
|
||||
```bash
|
||||
# 查看 SRS 配置
|
||||
cat /path/to/srs/conf/srs.conf
|
||||
```
|
||||
|
||||
应该有类似配置:
|
||||
```
|
||||
vhost __defaultVhost__ {
|
||||
http_hooks {
|
||||
enabled on;
|
||||
on_publish http://localhost:3001/api/srs/on_publish;
|
||||
on_unpublish http://localhost:3001/api/srs/on_unpublish;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤4:检查 OBS 推流状态
|
||||
确认 OBS 推流是否稳定:
|
||||
1. 查看 OBS 底部状态栏的 "丢帧" 和 "比特率"
|
||||
2. 如果频繁丢帧或比特率波动大,可能导致推流不稳定
|
||||
|
||||
## 临时解决方案
|
||||
|
||||
### 方案1:禁用 on_unpublish 回调
|
||||
修改 `live-streaming/server/routes/srs.js`,注释掉 `on_unpublish` 的数据库更新:
|
||||
|
||||
```javascript
|
||||
router.post('/on_unpublish', (req, res) => {
|
||||
const { app, stream } = req.body;
|
||||
console.log(`[SRS] 推流结束: app=${app}, stream=${stream}`);
|
||||
|
||||
// 暂时禁用自动关闭直播
|
||||
// const room = roomStore.setLiveStatus(stream, false);
|
||||
// forwardToJava('/api/front/live/srs/on_unpublish', { stream });
|
||||
|
||||
res.json({ code: 0 });
|
||||
});
|
||||
```
|
||||
|
||||
### 方案2:禁用 NodeMediaServer 的 donePublish 事件
|
||||
修改 `live-streaming/server/index.js`,注释掉 `donePublish` 事件:
|
||||
|
||||
```javascript
|
||||
// nms.on('donePublish', (id, streamPath) => {
|
||||
// const parts = String(streamPath || '').split('/').filter(Boolean);
|
||||
// const streamKey = parts[1];
|
||||
// if (streamKey) roomStore.setLiveStatus(streamKey, false);
|
||||
// });
|
||||
```
|
||||
|
||||
### 方案3:手动控制直播状态
|
||||
不依赖推流回调,改为主播手动点击"开始直播"和"结束直播"按钮来控制状态。
|
||||
|
||||
## 推荐方案
|
||||
|
||||
**建议先执行方案1和方案2**,禁用自动关闭直播的逻辑,然后观察是否还会自动重置。
|
||||
|
||||
如果问题解决,说明是 SRS 或 NodeMediaServer 的回调导致的,需要进一步排查为什么会频繁触发 unpublish 事件。
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
-- 完整诊断菜单404问题
|
||||
|
||||
-- 1. 检查直播管理菜单及其子菜单
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name,
|
||||
m.path,
|
||||
m.component,
|
||||
m.is_show,
|
||||
m.sort,
|
||||
CASE
|
||||
WHEN m.pid = 0 THEN '顶级菜单'
|
||||
ELSE CONCAT('子菜单(父ID:', m.pid, ')')
|
||||
END as menu_level
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name LIKE '%直播%'
|
||||
OR m.path LIKE '%live%'
|
||||
OR m.path LIKE '%room%'
|
||||
OR m.path LIKE '%family%'
|
||||
OR m.path LIKE '%fanGroup%'
|
||||
OR m.path LIKE '%streamer%'
|
||||
ORDER BY m.pid, m.sort, m.id;
|
||||
|
||||
-- 2. 检查礼物管理菜单
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name,
|
||||
m.path,
|
||||
m.component,
|
||||
m.is_show,
|
||||
m.sort
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name LIKE '%礼物%'
|
||||
OR m.path LIKE '%gift%'
|
||||
ORDER BY m.pid, m.sort, m.id;
|
||||
|
||||
-- 3. 检查是否有路径冲突
|
||||
SELECT
|
||||
path,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(CONCAT(id, ':', name) SEPARATOR ' | ') as conflicting_menus
|
||||
FROM eb_system_menu
|
||||
WHERE is_show = 1
|
||||
GROUP BY path
|
||||
HAVING count > 1;
|
||||
|
||||
-- 4. 检查component路径格式
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
path,
|
||||
component,
|
||||
CASE
|
||||
WHEN component LIKE '%.vue' THEN '有.vue扩展名'
|
||||
WHEN component LIKE '%/%' THEN '无.vue扩展名'
|
||||
ELSE '其他格式'
|
||||
END as component_format
|
||||
FROM eb_system_menu
|
||||
WHERE (name LIKE '%直播%' OR path LIKE '%live%' OR path LIKE '%room%')
|
||||
AND component IS NOT NULL
|
||||
AND component != '';
|
||||
|
||||
-- 5. 检查菜单是否被禁用
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
path,
|
||||
is_show,
|
||||
CASE
|
||||
WHEN is_show = 1 THEN '显示'
|
||||
ELSE '隐藏'
|
||||
END as display_status
|
||||
FROM eb_system_menu
|
||||
WHERE name LIKE '%直播%' OR path LIKE '%live%';
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
-- 详细诊断主播统计数据
|
||||
-- 这个脚本会显示每个主播的详细统计信息
|
||||
|
||||
-- 1. 查看所有主播的基本信息
|
||||
SELECT '=== 主播基本信息 ===' as info;
|
||||
SELECT uid, nickname, phone, is_streamer, streamer_level, streamer_certified_time
|
||||
FROM eb_user
|
||||
WHERE is_streamer = 1
|
||||
ORDER BY uid;
|
||||
|
||||
-- 2. 查看每个主播的粉丝数详情
|
||||
SELECT '=== 粉丝数统计 ===' as info;
|
||||
SELECT
|
||||
u.uid,
|
||||
u.nickname,
|
||||
COUNT(f.id) as fansCount,
|
||||
GROUP_CONCAT(CONCAT('粉丝ID:', f.follower_id) SEPARATOR ', ') as fansList
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_follow_record f ON f.followed_id = u.uid
|
||||
AND f.follow_status IN ('1', '关注')
|
||||
AND f.is_deleted = 0
|
||||
WHERE u.is_streamer = 1
|
||||
GROUP BY u.uid, u.nickname
|
||||
ORDER BY u.uid;
|
||||
|
||||
-- 3. 查看每个主播的直播间数量
|
||||
SELECT '=== 直播间统计 ===' as info;
|
||||
SELECT
|
||||
u.uid,
|
||||
u.nickname,
|
||||
COUNT(r.id) as roomCount,
|
||||
GROUP_CONCAT(CONCAT('房间ID:', r.id, '(', r.title, ')') SEPARATOR ', ') as roomList
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_live_room r ON r.uid = u.uid
|
||||
WHERE u.is_streamer = 1
|
||||
GROUP BY u.uid, u.nickname
|
||||
ORDER BY u.uid;
|
||||
|
||||
-- 4. 查看每个主播的总点赞数
|
||||
SELECT '=== 点赞数统计 ===' as info;
|
||||
SELECT
|
||||
u.uid,
|
||||
u.nickname,
|
||||
COALESCE(SUM(r.like_count), 0) as totalLikeCount,
|
||||
GROUP_CONCAT(CONCAT('房间ID:', r.id, '(点赞:', r.like_count, ')') SEPARATOR ', ') as likeDetails
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_live_room r ON r.uid = u.uid
|
||||
WHERE u.is_streamer = 1
|
||||
GROUP BY u.uid, u.nickname
|
||||
ORDER BY u.uid;
|
||||
|
||||
-- 5. 完整的统计汇总(与后台API返回的数据一致)
|
||||
SELECT '=== 完整统计汇总 ===' as info;
|
||||
SELECT
|
||||
u.uid as userId,
|
||||
u.nickname,
|
||||
u.phone,
|
||||
u.streamer_level as streamerLevel,
|
||||
u.streamer_certified_time as certifiedTime,
|
||||
-- 粉丝数
|
||||
(SELECT COUNT(*)
|
||||
FROM eb_follow_record f
|
||||
WHERE f.followed_id = u.uid
|
||||
AND f.follow_status IN ('1', '关注')
|
||||
AND f.is_deleted = 0) as fansCount,
|
||||
-- 直播间数
|
||||
(SELECT COUNT(*)
|
||||
FROM eb_live_room r
|
||||
WHERE r.uid = u.uid) as roomCount,
|
||||
-- 总点赞数
|
||||
(SELECT COALESCE(SUM(r.like_count), 0)
|
||||
FROM eb_live_room r
|
||||
WHERE r.uid = u.uid) as totalLikeCount,
|
||||
-- 本月直播次数
|
||||
(SELECT COUNT(*)
|
||||
FROM eb_live_room r
|
||||
WHERE r.uid = u.uid
|
||||
AND DATE_FORMAT(r.create_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')) as monthRooms,
|
||||
-- 是否被封禁
|
||||
EXISTS(SELECT 1
|
||||
FROM eb_streamer_ban b
|
||||
WHERE b.user_id = u.uid
|
||||
AND b.is_active = 1
|
||||
AND (b.ban_end_time IS NULL OR b.ban_end_time > NOW())) as isBanned
|
||||
FROM eb_user u
|
||||
WHERE u.is_streamer = 1
|
||||
ORDER BY u.uid;
|
||||
|
||||
-- 6. 检查eb_follow_record表的数据
|
||||
SELECT '=== 关注记录表检查 ===' as info;
|
||||
SELECT
|
||||
id,
|
||||
follower_id,
|
||||
followed_id,
|
||||
follow_status,
|
||||
is_deleted,
|
||||
create_time
|
||||
FROM eb_follow_record
|
||||
WHERE followed_id IN (SELECT uid FROM eb_user WHERE is_streamer = 1)
|
||||
ORDER BY followed_id, create_time DESC
|
||||
LIMIT 20;
|
||||
|
||||
-- 7. 检查eb_live_room表的like_count字段
|
||||
SELECT '=== 直播间点赞数检查 ===' as info;
|
||||
SELECT
|
||||
id,
|
||||
uid,
|
||||
title,
|
||||
like_count,
|
||||
create_time
|
||||
FROM eb_live_room
|
||||
WHERE uid IN (SELECT uid FROM eb_user WHERE is_streamer = 1)
|
||||
ORDER BY uid, create_time DESC
|
||||
LIMIT 20;
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
-- 粉丝团聊天功能数据库升级
|
||||
-- 将粉丝团与群组系统关联,复用群组消息功能
|
||||
|
||||
-- 1. 给粉丝团表添加group_id字段,关联到eb_group表
|
||||
-- 先检查字段是否存在
|
||||
SET @exist := (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'eb_fan_group'
|
||||
AND COLUMN_NAME = 'group_id');
|
||||
SET @sql := IF(@exist = 0,
|
||||
'ALTER TABLE eb_fan_group ADD COLUMN group_id BIGINT NULL COMMENT ''关联的群组ID'' AFTER anchor_name',
|
||||
'SELECT ''group_id字段已存在''');
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 2. 查看当前粉丝团数据
|
||||
SELECT id, anchor_id, anchor_name, name, badge, member_count, group_id FROM eb_fan_group;
|
||||
|
||||
-- 3. 验证表结构
|
||||
DESCRIBE eb_fan_group;
|
||||
|
||||
-- 4. 查看群组成员表结构(确认字段名)
|
||||
DESCRIBE eb_group_member;
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
-- 最终修复:使用系统能识别的路径格式
|
||||
|
||||
-- 删除礼物菜单
|
||||
DELETE FROM eb_system_menu WHERE name = '礼物打赏';
|
||||
|
||||
-- 重新添加,使用简单的路径
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte)
|
||||
VALUES (0, '礼物打赏', 'el-icon-present', 'admin:gift:records', 'gift/records/index', 'C', 50, 1, 0);
|
||||
|
||||
-- 给管理员分配权限
|
||||
INSERT IGNORE INTO eb_system_role_menu (rid, menu_id)
|
||||
SELECT 1, id FROM eb_system_menu WHERE name = '礼物打赏';
|
||||
|
||||
-- 验证
|
||||
SELECT id, name, component FROM eb_system_menu WHERE name = '礼物打赏';
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
-- 正确地将礼物打赏移到直播管理下,同时修改路径
|
||||
|
||||
-- 1. 获取直播管理ID
|
||||
SELECT @live_id := id FROM eb_system_menu WHERE name = '直播管理' AND pid = 0;
|
||||
|
||||
-- 2. 更新礼物打赏:改变父级ID AND 修改component路径
|
||||
UPDATE eb_system_menu
|
||||
SET pid = @live_id,
|
||||
component = '/liveManage/gift/records/index',
|
||||
sort = 800
|
||||
WHERE name = '礼物打赏';
|
||||
|
||||
-- 3. 验证
|
||||
SELECT name, component, pid FROM eb_system_menu WHERE name = '礼物打赏';
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
-- ========================================
|
||||
-- 查找现有的礼物相关表
|
||||
-- ========================================
|
||||
|
||||
-- 1. 查找所有包含gift的表
|
||||
SELECT
|
||||
TABLE_NAME,
|
||||
TABLE_COMMENT,
|
||||
CREATE_TIME
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = 'zhibo'
|
||||
AND TABLE_NAME LIKE '%gift%'
|
||||
ORDER BY TABLE_NAME;
|
||||
|
||||
-- 2. 查找所有包含reward的表(打赏相关)
|
||||
SELECT
|
||||
TABLE_NAME,
|
||||
TABLE_COMMENT,
|
||||
CREATE_TIME
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = 'zhibo'
|
||||
AND TABLE_NAME LIKE '%reward%'
|
||||
ORDER BY TABLE_NAME;
|
||||
|
||||
-- 3. 查找所有包含present的表(礼物相关)
|
||||
SELECT
|
||||
TABLE_NAME,
|
||||
TABLE_COMMENT,
|
||||
CREATE_TIME
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = 'zhibo'
|
||||
AND TABLE_NAME LIKE '%present%'
|
||||
ORDER BY TABLE_NAME;
|
||||
|
||||
-- 4. 如果找到了礼物表,查看其结构
|
||||
-- 请根据上面的结果,取消下面对应表的注释来查看结构
|
||||
|
||||
-- SHOW FULL COLUMNS FROM eb_gift;
|
||||
-- SHOW FULL COLUMNS FROM eb_gift_record;
|
||||
-- SHOW FULL COLUMNS FROM eb_gift_reward;
|
||||
|
||||
-- 5. 如果找到了礼物表,查看现有数据
|
||||
-- SELECT * FROM eb_gift LIMIT 10;
|
||||
-- SELECT * FROM eb_gift_record LIMIT 10;
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
-- ========================================
|
||||
-- 修复404问题:将礼物打赏从直播管理中移除
|
||||
-- ========================================
|
||||
|
||||
-- 问题分析:
|
||||
-- 1. 礼物打赏菜单(id=823)的component是 /liveManage/gift/records/index
|
||||
-- 2. 但前端有独立的 giftManageRouter,路径是 /gift
|
||||
-- 3. 这导致路由匹配冲突
|
||||
|
||||
-- 解决方案1:将礼物打赏移到独立的礼物管理菜单下
|
||||
-- 首先检查是否已有礼物管理顶级菜单
|
||||
SELECT id, pid, name, component, is_show
|
||||
FROM eb_system_menu
|
||||
WHERE name = '礼物打赏' AND pid = 0;
|
||||
|
||||
-- 如果没有,创建礼物管理顶级菜单
|
||||
-- INSERT INTO eb_system_menu (pid, name, icon, component, menu_type, sort, is_show)
|
||||
-- VALUES (0, '礼物打赏', 'el-icon-present', '/gift', 'M', 99, 1);
|
||||
|
||||
-- 方案2:直接删除礼物打赏菜单(如果不需要在直播管理下显示)
|
||||
-- DELETE FROM eb_system_menu WHERE id = 823;
|
||||
|
||||
-- 方案3:隐藏礼物打赏菜单(推荐,保留数据)
|
||||
UPDATE eb_system_menu
|
||||
SET is_show = 0
|
||||
WHERE id = 823;
|
||||
|
||||
-- 验证修改
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
name,
|
||||
component,
|
||||
is_show,
|
||||
CASE WHEN is_show = 1 THEN '显示' ELSE '隐藏' END as status
|
||||
FROM eb_system_menu
|
||||
WHERE pid = 675 -- 直播管理的子菜单
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
-- 修复余额显示问题
|
||||
|
||||
-- 1. 检查now_money字段是否存在
|
||||
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_DEFAULT, IS_NULLABLE, COLUMN_COMMENT
|
||||
FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'zhibo'
|
||||
AND TABLE_NAME = 'eb_user'
|
||||
AND COLUMN_NAME = 'now_money';
|
||||
|
||||
-- 2. 如果字段不存在,添加字段(如果已存在会报错,可以忽略)
|
||||
-- ALTER TABLE eb_user ADD COLUMN now_money DECIMAL(10,2) DEFAULT 0.00 COMMENT '用户余额';
|
||||
|
||||
-- 3. 查看所有测试用户的当前余额
|
||||
SELECT uid, account, nickname, now_money, integral, create_time
|
||||
FROM eb_user
|
||||
WHERE uid IN (43, 44, 45, 46)
|
||||
ORDER BY uid;
|
||||
|
||||
-- 4. 给测试用户添加初始余额(如果当前为0)
|
||||
UPDATE eb_user
|
||||
SET now_money = 1000.00
|
||||
WHERE uid = 43 AND now_money = 0;
|
||||
|
||||
UPDATE eb_user
|
||||
SET now_money = 500.00
|
||||
WHERE uid = 44 AND now_money = 0;
|
||||
|
||||
UPDATE eb_user
|
||||
SET now_money = 800.00
|
||||
WHERE uid = 45 AND now_money = 0;
|
||||
|
||||
UPDATE eb_user
|
||||
SET now_money = 1200.00
|
||||
WHERE uid = 46 AND now_money = 0;
|
||||
|
||||
-- 5. 验证更新结果
|
||||
SELECT uid, account, nickname, now_money
|
||||
FROM eb_user
|
||||
WHERE uid IN (43, 44, 45, 46)
|
||||
ORDER BY uid;
|
||||
|
||||
-- 6. 查看是否有充值记录表
|
||||
SELECT COUNT(*) as record_count
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'zhibo'
|
||||
AND table_name = 'eb_virtual_currency_recharge';
|
||||
|
||||
-- 7. 查看是否有交易记录表
|
||||
SELECT COUNT(*) as record_count
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'zhibo'
|
||||
AND table_name = 'eb_virtual_currency_transaction';
|
||||
|
||||
-- 8. 如果有交易记录,查看最近的记录
|
||||
-- SELECT * FROM eb_virtual_currency_transaction
|
||||
-- WHERE user_id = 43
|
||||
-- ORDER BY create_time DESC
|
||||
-- LIMIT 10;
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
-- 修复粉丝团群聊:为没有关联群组的粉丝团自动创建群组
|
||||
|
||||
-- 1. 查看当前粉丝团状态
|
||||
SELECT id, anchor_id, anchor_name, name, group_id, member_count FROM eb_fan_group;
|
||||
|
||||
-- 2. 为所有没有group_id的粉丝团创建群组并关联
|
||||
-- 这是一个存储过程,用于批量修复
|
||||
|
||||
DELIMITER //
|
||||
|
||||
DROP PROCEDURE IF EXISTS fix_fan_group_chat //
|
||||
|
||||
CREATE PROCEDURE fix_fan_group_chat()
|
||||
BEGIN
|
||||
DECLARE done INT DEFAULT FALSE;
|
||||
DECLARE v_fan_group_id INT;
|
||||
DECLARE v_anchor_id INT;
|
||||
DECLARE v_anchor_name VARCHAR(64);
|
||||
DECLARE v_name VARCHAR(64);
|
||||
DECLARE v_member_count INT;
|
||||
DECLARE v_new_group_id BIGINT;
|
||||
|
||||
-- 游标:查找所有没有group_id的粉丝团
|
||||
DECLARE cur CURSOR FOR
|
||||
SELECT id, anchor_id, anchor_name, name, member_count
|
||||
FROM eb_fan_group
|
||||
WHERE (group_id IS NULL OR group_id = 0) AND status = 1;
|
||||
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
|
||||
|
||||
OPEN cur;
|
||||
|
||||
read_loop: LOOP
|
||||
FETCH cur INTO v_fan_group_id, v_anchor_id, v_anchor_name, v_name, v_member_count;
|
||||
IF done THEN
|
||||
LEAVE read_loop;
|
||||
END IF;
|
||||
|
||||
-- 1. 创建群组
|
||||
INSERT INTO eb_group (group_name, owner_id, avatar, description, member_count, ext_field1, create_time, update_time)
|
||||
VALUES (v_name, v_anchor_id, '', CONCAT(v_anchor_name, '的粉丝团群聊'), v_member_count + 1, 'fan_group', NOW(), NOW());
|
||||
|
||||
SET v_new_group_id = LAST_INSERT_ID();
|
||||
|
||||
-- 2. 更新粉丝团的group_id
|
||||
UPDATE eb_fan_group SET group_id = v_new_group_id WHERE id = v_fan_group_id;
|
||||
|
||||
-- 3. 将主播加入群组成员(如果不存在)
|
||||
-- role: 0-普通成员 1-管理员 2-群主
|
||||
INSERT IGNORE INTO eb_group_member (group_id, user_id, nickname, role, join_time)
|
||||
VALUES (v_new_group_id, v_anchor_id, v_anchor_name, 2, NOW());
|
||||
|
||||
-- 4. 将粉丝团现有成员也加入群组
|
||||
INSERT IGNORE INTO eb_group_member (group_id, user_id, nickname, role, join_time)
|
||||
SELECT v_new_group_id, uid, nickname, 0, join_time
|
||||
FROM eb_fan_group_member
|
||||
WHERE group_id = v_fan_group_id AND status = 1;
|
||||
|
||||
END LOOP;
|
||||
|
||||
CLOSE cur;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
-- 执行修复
|
||||
CALL fix_fan_group_chat();
|
||||
|
||||
-- 删除存储过程
|
||||
DROP PROCEDURE IF EXISTS fix_fan_group_chat;
|
||||
|
||||
-- 验证结果
|
||||
SELECT fg.id, fg.name, fg.group_id, g.id as group_table_id, g.group_name, g.member_count
|
||||
FROM eb_fan_group fg
|
||||
LEFT JOIN eb_group g ON fg.group_id = g.id;
|
||||
|
||||
-- 简化版本(如果不想用存储过程,可以手动执行以下SQL):
|
||||
-- 针对粉丝团 id=4
|
||||
|
||||
-- 步骤1: 创建群组
|
||||
-- INSERT INTO eb_group (group_name, owner_id, avatar, description, member_count, ext_field1, create_time, update_time)
|
||||
-- SELECT name, anchor_id, '', CONCAT(anchor_name, '的粉丝团群聊'), member_count + 1, 'fan_group', NOW(), NOW()
|
||||
-- FROM eb_fan_group WHERE id = 4;
|
||||
|
||||
-- 步骤2: 更新粉丝团的group_id
|
||||
-- UPDATE eb_fan_group SET group_id = LAST_INSERT_ID() WHERE id = 4;
|
||||
|
||||
-- 步骤3: 将主播加入群组
|
||||
-- role: 0-普通成员 1-管理员 2-群主
|
||||
-- INSERT INTO eb_group_member (group_id, user_id, nickname, role, join_time)
|
||||
-- SELECT fg.group_id, fg.anchor_id, fg.anchor_name, 2, NOW()
|
||||
-- FROM eb_fan_group fg WHERE fg.id = 4;
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
-- 修复粉丝团菜单显示问题
|
||||
-- 当前状态:id=663 的粉丝团管理菜单 is_show=0(隐藏)
|
||||
|
||||
-- 1. 显示粉丝团管理菜单
|
||||
UPDATE eb_system_menu SET is_show = 1 WHERE id = 663;
|
||||
|
||||
-- 2. 确认修复结果
|
||||
SELECT id, pid, name, component, menu_type, sort, is_show
|
||||
FROM eb_system_menu
|
||||
WHERE name LIKE '%粉丝团%';
|
||||
|
||||
-- 3. 如果需要将粉丝团放到直播管理下面,可以执行以下SQL
|
||||
-- 先查看直播管理的菜单ID
|
||||
SELECT id, name FROM eb_system_menu WHERE name LIKE '%直播%' AND pid = 0;
|
||||
|
||||
-- 注意:id=707 已经是直播管理下的粉丝团子菜单,路径为 /liveManage/fanGroup/list
|
||||
-- 如果想使用这个,需要确保前端路由配置正确
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ==========================================
|
||||
echo 关注功能修复脚本
|
||||
echo ==========================================
|
||||
echo.
|
||||
|
||||
set DB_HOST=1.15.149.240
|
||||
set DB_USER=root
|
||||
set DB_NAME=crmeb
|
||||
|
||||
set /p DB_PASS=请输入MySQL密码:
|
||||
|
||||
echo.
|
||||
echo 正在连接数据库...
|
||||
echo.
|
||||
|
||||
mysql -h %DB_HOST% -u %DB_USER% -p%DB_PASS% %DB_NAME% < migrate_follow_data.sql
|
||||
|
||||
if %ERRORLEVEL% EQU 0 (
|
||||
echo.
|
||||
echo ==========================================
|
||||
echo √ 数据库修复完成!
|
||||
echo ==========================================
|
||||
echo.
|
||||
echo 下一步:
|
||||
echo 1. 重启后端服务
|
||||
echo 2. 重新编译Android应用
|
||||
echo 3. 测试关注功能
|
||||
) else (
|
||||
echo.
|
||||
echo ==========================================
|
||||
echo × 执行失败,请检查错误信息
|
||||
echo ==========================================
|
||||
)
|
||||
|
||||
pause
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# 关注功能修复脚本
|
||||
# 用途:创建 eb_follow_record 表并迁移数据
|
||||
|
||||
echo "=========================================="
|
||||
echo "关注功能修复脚本"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 数据库配置
|
||||
DB_HOST="1.15.149.240"
|
||||
DB_USER="root"
|
||||
DB_NAME="crmeb"
|
||||
|
||||
echo "请输入MySQL密码:"
|
||||
read -s DB_PASS
|
||||
|
||||
echo ""
|
||||
echo "正在连接数据库..."
|
||||
|
||||
# 执行SQL
|
||||
mysql -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME << 'EOF'
|
||||
|
||||
-- 创建 eb_follow_record 表
|
||||
CREATE TABLE IF NOT EXISTS `eb_follow_record` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`follower_id` int(11) NOT NULL COMMENT '关注者用户ID',
|
||||
`follower_nickname` varchar(50) DEFAULT NULL COMMENT '关注者昵称',
|
||||
`follower_phone` varchar(20) DEFAULT NULL COMMENT '关注者手机号',
|
||||
`followed_id` int(11) NOT NULL COMMENT '被关注者用户ID',
|
||||
`followed_nickname` varchar(50) DEFAULT NULL COMMENT '被关注者昵称',
|
||||
`followed_phone` varchar(20) DEFAULT NULL COMMENT '被关注者手机号',
|
||||
`follow_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '关注状态:1-已关注 0-已取消',
|
||||
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0-未删除 1-已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`ext_field1` varchar(100) DEFAULT NULL COMMENT '扩展字段1:关注来源/渠道',
|
||||
`ext_field2` int(11) DEFAULT NULL COMMENT '扩展字段2:关注类型/优先级',
|
||||
`ext_field3` varchar(200) DEFAULT NULL COMMENT '扩展字段3:特殊标记/备注',
|
||||
`ext_field4` bigint(20) DEFAULT NULL COMMENT '扩展字段4:关联数据ID',
|
||||
`ext_field5` text COMMENT '扩展字段5:JSON扩展数据',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_follower_followed` (`follower_id`,`followed_id`),
|
||||
KEY `idx_follower_id` (`follower_id`),
|
||||
KEY `idx_followed_id` (`followed_id`),
|
||||
KEY `idx_follow_status` (`follow_status`),
|
||||
KEY `idx_is_deleted` (`is_deleted`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关注记录表';
|
||||
|
||||
SELECT '✓ eb_follow_record 表创建成功' as status;
|
||||
|
||||
-- 迁移数据
|
||||
INSERT IGNORE INTO eb_follow_record (follower_id, follower_nickname, follower_phone, followed_id, followed_nickname, followed_phone, follow_status, is_deleted, create_time)
|
||||
SELECT
|
||||
uf.user_id as follower_id,
|
||||
u1.nickname as follower_nickname,
|
||||
u1.phone as follower_phone,
|
||||
uf.follow_user_id as followed_id,
|
||||
u2.nickname as followed_nickname,
|
||||
u2.phone as followed_phone,
|
||||
1 as follow_status,
|
||||
0 as is_deleted,
|
||||
uf.create_time
|
||||
FROM eb_user_follow uf
|
||||
LEFT JOIN eb_user u1 ON uf.user_id = u1.uid
|
||||
LEFT JOIN eb_user u2 ON uf.follow_user_id = u2.uid
|
||||
WHERE EXISTS (SELECT 1 FROM eb_user_follow LIMIT 1);
|
||||
|
||||
SELECT '✓ 数据迁移完成' as status;
|
||||
|
||||
-- 显示统计信息
|
||||
SELECT
|
||||
'eb_user_follow (原表)' as table_name,
|
||||
COUNT(*) as record_count
|
||||
FROM eb_user_follow
|
||||
UNION ALL
|
||||
SELECT
|
||||
'eb_follow_record (新表)' as table_name,
|
||||
COUNT(*) as record_count
|
||||
FROM eb_follow_record;
|
||||
|
||||
EOF
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "✓ 数据库修复完成!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "下一步:"
|
||||
echo "1. 重启后端服务: cd /root/zhibo/Zhibo/zhibo-h && ./restart.sh"
|
||||
echo "2. 重新编译Android应用"
|
||||
echo "3. 测试关注功能"
|
||||
else
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "✗ 执行失败,请检查错误信息"
|
||||
echo "=========================================="
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
-- 修复关注状态字段值不一致的问题
|
||||
-- 将字符串"关注"统一为数字"1"
|
||||
|
||||
-- 1. 先查看当前的状态值分布
|
||||
SELECT
|
||||
follow_status,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(DISTINCT CONCAT(follower_nickname, '->', followed_nickname) SEPARATOR '; ') as examples
|
||||
FROM eb_follow_record
|
||||
GROUP BY follow_status;
|
||||
|
||||
-- 2. 备份当前数据(可选,建议先备份)
|
||||
-- CREATE TABLE eb_follow_record_backup AS SELECT * FROM eb_follow_record;
|
||||
|
||||
-- 3. 将字符串"关注"统一为数字"1"
|
||||
UPDATE eb_follow_record
|
||||
SET follow_status = '1'
|
||||
WHERE follow_status = '关注';
|
||||
|
||||
-- 4. 将字符串"取消关注"统一为数字"0"
|
||||
UPDATE eb_follow_record
|
||||
SET follow_status = '0'
|
||||
WHERE follow_status IN ('取消关注', '未关注');
|
||||
|
||||
-- 5. 验证修复结果
|
||||
SELECT
|
||||
follow_status,
|
||||
COUNT(*) as count,
|
||||
GROUP_CONCAT(DISTINCT CONCAT(follower_nickname, '->', followed_nickname) SEPARATOR '; ') as examples
|
||||
FROM eb_follow_record
|
||||
GROUP BY follow_status;
|
||||
|
||||
-- 6. 查看修复后用户 43 的关注列表
|
||||
SELECT
|
||||
fr.followed_id,
|
||||
fr.followed_nickname,
|
||||
u.is_streamer,
|
||||
fr.follow_status,
|
||||
fr.create_time
|
||||
FROM eb_follow_record fr
|
||||
LEFT JOIN eb_user u ON fr.followed_id = u.uid
|
||||
WHERE fr.follower_id = 43
|
||||
AND fr.follow_status = '1'
|
||||
AND fr.is_deleted = 0;
|
||||
|
||||
-- 7. 查看修复后用户 43 应该看到的直播间
|
||||
SELECT
|
||||
u.uid as streamer_id,
|
||||
u.nickname as streamer_name,
|
||||
lr.id as room_id,
|
||||
lr.title as room_title,
|
||||
lr.is_live,
|
||||
lr.view_count,
|
||||
lr.online_count
|
||||
FROM eb_follow_record fr
|
||||
INNER JOIN eb_user u ON fr.followed_id = u.uid AND u.is_streamer = 1
|
||||
INNER JOIN eb_live_room lr ON u.uid = lr.uid
|
||||
WHERE fr.follower_id = 43
|
||||
AND fr.follow_status = '1'
|
||||
AND fr.is_deleted = 0
|
||||
ORDER BY lr.is_live DESC;
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
-- 完整修复礼物菜单
|
||||
|
||||
-- 步骤1: 查看eb_system_menu表结构
|
||||
DESC eb_system_menu;
|
||||
|
||||
-- 步骤2: 查看当前礼物相关菜单
|
||||
SELECT * FROM eb_system_menu WHERE menu_name LIKE '%礼物%' OR path LIKE '%gift%';
|
||||
|
||||
-- 步骤3: 删除旧的礼物菜单
|
||||
DELETE FROM eb_system_menu WHERE menu_name LIKE '%礼物%' OR path LIKE '%gift%';
|
||||
|
||||
-- 步骤4: 插入礼物打赏主菜单
|
||||
INSERT INTO eb_system_menu (pid, menu_name, path, component, is_show, sort, icon, create_time, update_time)
|
||||
VALUES (0, '礼物打赏', '/gift', 'Layout', 1, 50, 'el-icon-present', NOW(), NOW());
|
||||
|
||||
-- 步骤5: 获取主菜单ID并插入子菜单
|
||||
SET @gift_pid = (SELECT id FROM eb_system_menu WHERE path = '/gift' AND pid = 0);
|
||||
|
||||
INSERT INTO eb_system_menu (pid, menu_name, path, component, is_show, sort, icon, create_time, update_time) VALUES
|
||||
(@gift_pid, '礼物列表', 'config', 'gift/config/index', 1, 1, 'el-icon-goods', NOW(), NOW()),
|
||||
(@gift_pid, '打赏记录', 'records', 'gift/records/index', 1, 2, 'el-icon-document', NOW(), NOW()),
|
||||
(@gift_pid, '充值套餐', 'recharge', 'gift/recharge/index', 1, 3, 'el-icon-coin', NOW(), NOW());
|
||||
|
||||
-- 步骤6: 验证结果
|
||||
SELECT
|
||||
CASE WHEN m.pid = 0 THEN '主菜单' ELSE '子菜单' END as '类型',
|
||||
m.id,
|
||||
m.pid,
|
||||
m.menu_name as '菜单名称',
|
||||
m.path as '路径',
|
||||
m.component as '组件',
|
||||
m.icon as '图标',
|
||||
m.sort as '排序',
|
||||
m.is_show as '显示'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.path = '/gift' OR m.pid = @gift_pid
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
||||
-- 步骤7: 查看所有一级菜单(确认礼物打赏菜单的位置)
|
||||
SELECT id, menu_name, path, icon, sort
|
||||
FROM eb_system_menu
|
||||
WHERE pid = 0
|
||||
ORDER BY sort;
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
-- 最终修复礼物菜单 - 确保字段完全匹配
|
||||
|
||||
-- 1. 先查看现有的工作菜单示例
|
||||
SELECT * FROM eb_system_menu WHERE name = '直播管理' LIMIT 1;
|
||||
SELECT * FROM eb_system_menu WHERE pid = (SELECT id FROM eb_system_menu WHERE name = '直播管理' LIMIT 1) LIMIT 3;
|
||||
|
||||
-- 2. 删除旧的礼物菜单
|
||||
DELETE FROM eb_system_menu WHERE name IN ('礼物打赏', '礼物列表', '打赏记录', '充值套餐', '礼物管理');
|
||||
|
||||
-- 3. 添加礼物打赏主菜单
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte)
|
||||
VALUES (0, '礼物打赏', 'el-icon-present', '', '/gift', 'M', 50, 1, 0);
|
||||
|
||||
SET @gift_pid = LAST_INSERT_ID();
|
||||
|
||||
-- 4. 添加子菜单
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte) VALUES
|
||||
(@gift_pid, '礼物列表', '', 'admin:gift:config', 'gift/config/index', 'C', 1, 1, 0),
|
||||
(@gift_pid, '打赏记录', '', 'admin:gift:records', 'gift/records/index', 'C', 2, 1, 0),
|
||||
(@gift_pid, '充值套餐', '', 'admin:gift:recharge', 'gift/recharge/index', 'C', 3, 1, 0);
|
||||
|
||||
-- 5. 验证
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name,
|
||||
m.component,
|
||||
m.menu_type,
|
||||
m.sort
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name = '礼物打赏' OR m.pid = @gift_pid
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
||||
-- 6. 给管理员分配权限
|
||||
INSERT IGNORE INTO eb_system_role_menu (rid, menu_id)
|
||||
SELECT 1, id FROM eb_system_menu WHERE name IN ('礼物打赏', '礼物列表', '打赏记录', '充值套餐');
|
||||
|
||||
SELECT '菜单添加完成!请退出登录后重新登录查看' as message;
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
-- 修复礼物菜单路径 - 使用完整路径
|
||||
|
||||
-- 1. 更新子菜单的component路径为完整路径
|
||||
UPDATE eb_system_menu
|
||||
SET component = '/gift/config/index'
|
||||
WHERE name = '礼物列表' AND pid = (SELECT id FROM (SELECT id FROM eb_system_menu WHERE name = '礼物打赏' AND pid = 0) AS temp);
|
||||
|
||||
UPDATE eb_system_menu
|
||||
SET component = '/gift/records/index'
|
||||
WHERE name = '打赏记录' AND pid = (SELECT id FROM (SELECT id FROM eb_system_menu WHERE name = '礼物打赏' AND pid = 0) AS temp);
|
||||
|
||||
UPDATE eb_system_menu
|
||||
SET component = '/gift/recharge/index'
|
||||
WHERE name = '充值套餐' AND pid = (SELECT id FROM (SELECT id FROM eb_system_menu WHERE name = '礼物打赏' AND pid = 0) AS temp);
|
||||
|
||||
-- 2. 验证修复结果
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name as '菜单名',
|
||||
m.component as '组件路径',
|
||||
m.menu_type as '类型'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name = '礼物打赏' OR m.pid = (SELECT id FROM eb_system_menu WHERE name = '礼物打赏' LIMIT 1)
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
||||
SELECT '路径已修复!请刷新浏览器页面' as message;
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
-- 修复eb_live_room表的like_count字段
|
||||
-- 1. 将NULL值更新为0
|
||||
UPDATE eb_live_room SET like_count = 0 WHERE like_count IS NULL;
|
||||
|
||||
-- 2. 修改字段定义,添加默认值和NOT NULL约束
|
||||
ALTER TABLE eb_live_room
|
||||
MODIFY COLUMN like_count INT NOT NULL DEFAULT 0 COMMENT '点赞数';
|
||||
|
||||
-- 3. 同样修复其他计数字段
|
||||
UPDATE eb_live_room SET comment_count = 0 WHERE comment_count IS NULL;
|
||||
UPDATE eb_live_room SET online_count = 0 WHERE online_count IS NULL;
|
||||
UPDATE eb_live_room SET view_count = 0 WHERE view_count IS NULL;
|
||||
UPDATE eb_live_room SET share_count = 0 WHERE share_count IS NULL;
|
||||
|
||||
ALTER TABLE eb_live_room
|
||||
MODIFY COLUMN comment_count INT NOT NULL DEFAULT 0 COMMENT '评论数',
|
||||
MODIFY COLUMN online_count INT NOT NULL DEFAULT 0 COMMENT '在线人数',
|
||||
MODIFY COLUMN view_count INT NOT NULL DEFAULT 0 COMMENT '观看人数',
|
||||
MODIFY COLUMN share_count INT NOT NULL DEFAULT 0 COMMENT '分享数';
|
||||
|
||||
-- 4. 验证修复结果
|
||||
SELECT id, title, like_count, comment_count, online_count, view_count, share_count
|
||||
FROM eb_live_room
|
||||
WHERE id = 8;
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
-- 先查看菜单表结构
|
||||
SHOW COLUMNS FROM eb_system_menu;
|
||||
|
||||
-- 查看所有菜单数据,了解字段名称
|
||||
SELECT * FROM eb_system_menu LIMIT 5;
|
||||
|
||||
-- 查找直播相关的菜单(使用可能的字段名)
|
||||
-- 可能的字段:menu_name/name, menu_path/path/component, pid/parent_id
|
||||
SELECT
|
||||
id,
|
||||
pid,
|
||||
menu_name,
|
||||
component,
|
||||
is_show,
|
||||
sort
|
||||
FROM eb_system_menu
|
||||
WHERE menu_name LIKE '%直播%'
|
||||
OR component LIKE '%live%'
|
||||
OR component LIKE '%room%'
|
||||
ORDER BY sort, id;
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
-- 删除旧的eb_live_room_like表
|
||||
DROP TABLE IF EXISTS eb_live_room_like;
|
||||
|
||||
-- 重新创建正确的表结构
|
||||
CREATE TABLE `eb_live_room_like` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`user_id` INT NOT NULL COMMENT '用户ID',
|
||||
`room_id` INT NOT NULL COMMENT '直播间ID',
|
||||
`user_nickname` VARCHAR(100) DEFAULT NULL COMMENT '用户昵称',
|
||||
`like_count` INT NOT NULL DEFAULT 1 COMMENT '点赞次数',
|
||||
`last_like_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后点赞时间',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_room_id` (`room_id`),
|
||||
KEY `idx_create_time` (`create_time`),
|
||||
UNIQUE KEY `uk_user_room` (`user_id`, `room_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播间点赞记录表';
|
||||
|
||||
-- 验证表结构
|
||||
DESC eb_live_room_like;
|
||||
|
||||
-- 查看直播间8的信息
|
||||
SELECT id, title, like_count FROM eb_live_room WHERE id = 8;
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
-- 查看eb_user_bill表结构
|
||||
DESCRIBE eb_user_bill;
|
||||
|
||||
-- 查看现有的余额变动记录
|
||||
SELECT * FROM eb_user_bill WHERE uid = 43 ORDER BY id DESC LIMIT 10;
|
||||
|
||||
-- 手动插入APP充值记录(根据实际表结构调整)
|
||||
-- 如果表有create_time字段
|
||||
INSERT INTO eb_user_bill (uid, link_id, pm, title, category, type, number, balance, mark, create_time, status)
|
||||
VALUES (43, 'APP_RECHARGE', 1, '充值', 'now_money', 'recharge', 1200.00, 1001199.00, 'APP充值1200元', NOW(), 1);
|
||||
|
||||
-- 如果表没有create_time字段,查看有哪些字段
|
||||
SHOW COLUMNS FROM eb_user_bill;
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
#!/bin/bash
|
||||
# 修复 SRS 回调配置
|
||||
|
||||
echo "停止 SRS 容器..."
|
||||
docker stop srs-server
|
||||
docker rm srs-server
|
||||
|
||||
echo "创建新的 SRS 配置(包含回调)..."
|
||||
cat > /opt/live-streaming/docker/srs/srs.conf << 'EOF'
|
||||
listen 1935;
|
||||
max_connections 1000;
|
||||
daemon off;
|
||||
srs_log_tank console;
|
||||
|
||||
http_server {
|
||||
enabled on;
|
||||
listen 8080;
|
||||
dir ./objs/nginx/html;
|
||||
crossdomain on;
|
||||
}
|
||||
|
||||
http_api {
|
||||
enabled on;
|
||||
listen 1985;
|
||||
crossdomain on;
|
||||
}
|
||||
|
||||
vhost __defaultVhost__ {
|
||||
# HLS 作为备用
|
||||
hls {
|
||||
enabled on;
|
||||
hls_path ./objs/nginx/html;
|
||||
hls_fragment 2;
|
||||
hls_window 4;
|
||||
hls_cleanup on;
|
||||
}
|
||||
|
||||
# HTTP-FLV 低延迟(主要使用)
|
||||
http_remux {
|
||||
enabled on;
|
||||
mount [vhost]/[app]/[stream].flv;
|
||||
}
|
||||
|
||||
# 低延迟播放配置
|
||||
play {
|
||||
gop_cache on;
|
||||
queue_length 10;
|
||||
mw_latency 100;
|
||||
}
|
||||
|
||||
# HTTP 回调 - 推流状态通知
|
||||
http_hooks {
|
||||
enabled on;
|
||||
# 推流开始时回调 Java 后端
|
||||
on_publish http://host.docker.internal:8081/api/front/live/srs/on_publish;
|
||||
# 推流结束时回调 Java 后端
|
||||
on_unpublish http://host.docker.internal:8081/api/front/live/srs/on_unpublish;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "启动 SRS 容器..."
|
||||
docker run -d --name srs-server \
|
||||
-p 25002:1935 \
|
||||
-p 25003:8080 \
|
||||
-p 1985:1985 \
|
||||
-v /opt/live-streaming/docker/srs/srs.conf:/usr/local/srs/conf/srs.conf \
|
||||
--add-host=host.docker.internal:host-gateway \
|
||||
--restart unless-stopped \
|
||||
ossrs/srs:5
|
||||
|
||||
echo "等待 SRS 启动..."
|
||||
sleep 3
|
||||
|
||||
echo "检查 SRS 状态..."
|
||||
docker logs srs-server --tail 20
|
||||
|
||||
echo ""
|
||||
echo "完成!现在 OBS 推流时会自动通知 Java 后端更新直播状态。"
|
||||
echo ""
|
||||
echo "OBS 推流地址: rtmp://1.15.149.240:25002/live/[stream_key]"
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
-- 关注记录表(用于用户之间的关注关系)
|
||||
CREATE TABLE IF NOT EXISTS `eb_follow_record` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`follower_id` int(11) NOT NULL COMMENT '关注者用户ID',
|
||||
`follower_nickname` varchar(50) DEFAULT NULL COMMENT '关注者昵称',
|
||||
`follower_phone` varchar(20) DEFAULT NULL COMMENT '关注者手机号',
|
||||
`followed_id` int(11) NOT NULL COMMENT '被关注者用户ID',
|
||||
`followed_nickname` varchar(50) DEFAULT NULL COMMENT '被关注者昵称',
|
||||
`followed_phone` varchar(20) DEFAULT NULL COMMENT '被关注者手机号',
|
||||
`follow_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '关注状态:1-已关注 0-已取消',
|
||||
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0-未删除 1-已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`ext_field1` varchar(100) DEFAULT NULL COMMENT '扩展字段1:关注来源/渠道',
|
||||
`ext_field2` int(11) DEFAULT NULL COMMENT '扩展字段2:关注类型/优先级',
|
||||
`ext_field3` varchar(200) DEFAULT NULL COMMENT '扩展字段3:特殊标记/备注',
|
||||
`ext_field4` bigint(20) DEFAULT NULL COMMENT '扩展字段4:关联数据ID',
|
||||
`ext_field5` text COMMENT '扩展字段5:JSON扩展数据',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_follower_followed` (`follower_id`,`followed_id`),
|
||||
KEY `idx_follower_id` (`follower_id`),
|
||||
KEY `idx_followed_id` (`followed_id`),
|
||||
KEY `idx_follow_status` (`follow_status`),
|
||||
KEY `idx_is_deleted` (`is_deleted`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关注记录表';
|
||||
|
||||
-- 如果已有 eb_user_follow 表的数据,可以迁移到新表
|
||||
-- INSERT INTO eb_follow_record (follower_id, followed_id, follow_status, is_deleted, create_time)
|
||||
-- SELECT user_id, follow_user_id, 1, 0, create_time FROM eb_user_follow;
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
-- 用户关注表
|
||||
CREATE TABLE IF NOT EXISTS `eb_user_follow` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`user_id` int(11) NOT NULL COMMENT '用户ID(关注者)',
|
||||
`follow_user_id` int(11) NOT NULL COMMENT '被关注的用户ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '关注时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_follow` (`user_id`, `follow_user_id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_follow_user_id` (`follow_user_id`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户关注表';
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
-- 好友系统数据库表
|
||||
-- 请在服务器数据库中执行此脚本
|
||||
|
||||
-- 1. 好友关系表
|
||||
CREATE TABLE IF NOT EXISTS `eb_friend` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`user_id` int(11) NOT NULL COMMENT '用户ID',
|
||||
`friend_id` int(11) NOT NULL COMMENT '好友ID',
|
||||
`remark` varchar(50) DEFAULT NULL COMMENT '好友备注',
|
||||
`status` int(11) NOT NULL DEFAULT 1 COMMENT '状态:1-正常 0-已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_friend` (`user_id`, `friend_id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_friend_id` (`friend_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友关系表';
|
||||
|
||||
-- 2. 好友请求表
|
||||
CREATE TABLE IF NOT EXISTS `eb_friend_request` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`from_user_id` int(11) NOT NULL COMMENT '发起请求的用户ID',
|
||||
`to_user_id` int(11) NOT NULL COMMENT '接收请求的用户ID',
|
||||
`message` varchar(200) DEFAULT NULL COMMENT '验证消息',
|
||||
`status` int(11) NOT NULL DEFAULT 0 COMMENT '状态:0-待处理 1-已接受 2-已拒绝',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '处理时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_from_user` (`from_user_id`),
|
||||
KEY `idx_to_user` (`to_user_id`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友请求表';
|
||||
|
||||
-- 3. 用户黑名单表
|
||||
CREATE TABLE IF NOT EXISTS `eb_user_blacklist` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`user_id` int(11) NOT NULL COMMENT '用户ID',
|
||||
`blocked_user_id` int(11) NOT NULL COMMENT '被拉黑的用户ID',
|
||||
`reason` varchar(200) DEFAULT NULL COMMENT '拉黑原因',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_blocked` (`user_id`, `blocked_user_id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_blocked_user_id` (`blocked_user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户黑名单表';
|
||||
|
||||
-- 4. 私聊会话表(如果不存在)
|
||||
CREATE TABLE IF NOT EXISTS `eb_conversation` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`user1_id` int(11) NOT NULL COMMENT '用户1 ID(较小的ID)',
|
||||
`user2_id` int(11) NOT NULL COMMENT '用户2 ID(较大的ID)',
|
||||
`last_message_id` bigint(20) DEFAULT NULL COMMENT '最后一条消息ID',
|
||||
`last_message_time` datetime DEFAULT NULL COMMENT '最后消息时间',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_users` (`user1_id`, `user2_id`),
|
||||
KEY `idx_user1` (`user1_id`),
|
||||
KEY `idx_user2` (`user2_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='私聊会话表';
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
-- 群组系统数据库表
|
||||
-- 请在服务器数据库中执行此脚本
|
||||
|
||||
-- 1. 群组表
|
||||
CREATE TABLE IF NOT EXISTS `eb_group` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '群组ID',
|
||||
`group_name` varchar(100) NOT NULL COMMENT '群组名称',
|
||||
`avatar` varchar(500) DEFAULT NULL COMMENT '群头像',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '群描述',
|
||||
`announcement` varchar(1000) DEFAULT NULL COMMENT '群公告',
|
||||
`owner_id` int(11) NOT NULL COMMENT '群主用户ID',
|
||||
`member_count` int(11) NOT NULL DEFAULT 1 COMMENT '成员数量',
|
||||
`max_members` int(11) NOT NULL DEFAULT 500 COMMENT '最大成员数',
|
||||
`mute_all` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否全员禁言',
|
||||
`allow_member_invite` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否允许成员邀请',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_owner_id` (`owner_id`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群组表';
|
||||
|
||||
-- 2. 群组成员表
|
||||
CREATE TABLE IF NOT EXISTS `eb_group_member` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`group_id` bigint(20) NOT NULL COMMENT '群组ID',
|
||||
`user_id` int(11) NOT NULL COMMENT '用户ID',
|
||||
`role` tinyint(1) NOT NULL DEFAULT 0 COMMENT '角色:0-普通成员 1-管理员 2-群主',
|
||||
`nickname` varchar(50) DEFAULT NULL COMMENT '群内昵称',
|
||||
`is_muted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否被禁言',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已退出',
|
||||
`join_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_group_user` (`group_id`, `user_id`),
|
||||
KEY `idx_group_id` (`group_id`),
|
||||
KEY `idx_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群组成员表';
|
||||
|
||||
-- 3. 群消息表
|
||||
CREATE TABLE IF NOT EXISTS `eb_group_message` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '消息ID',
|
||||
`group_id` bigint(20) NOT NULL COMMENT '群组ID',
|
||||
`sender_id` int(11) NOT NULL COMMENT '发送者用户ID',
|
||||
`content` text NOT NULL COMMENT '消息内容',
|
||||
`message_type` varchar(20) NOT NULL DEFAULT 'text' COMMENT '消息类型:text/image/voice/video/file',
|
||||
`extra` varchar(1000) DEFAULT NULL COMMENT '扩展信息(JSON格式)',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_group_id` (`group_id`),
|
||||
KEY `idx_sender_id` (`sender_id`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群消息表';
|
||||
|
||||
-- 4. 群消息已读记录表(可选,用于已读回执)
|
||||
CREATE TABLE IF NOT EXISTS `eb_group_message_read` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`group_id` bigint(20) NOT NULL COMMENT '群组ID',
|
||||
`user_id` int(11) NOT NULL COMMENT '用户ID',
|
||||
`last_read_message_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '最后已读消息ID',
|
||||
`read_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '阅读时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_group_user` (`group_id`, `user_id`),
|
||||
KEY `idx_group_id` (`group_id`),
|
||||
KEY `idx_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群消息已读记录表';
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
-- 正确添加礼物打赏菜单
|
||||
|
||||
-- 1. 删除旧的礼物菜单(如果存在)
|
||||
DELETE FROM eb_system_menu WHERE name LIKE '%礼物%';
|
||||
|
||||
-- 2. 添加礼物打赏主菜单(目录类型 M)
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte, create_time, update_time)
|
||||
VALUES (0, '礼物打赏', 'el-icon-present', '', '/gift', 'M', 50, 1, 0, NOW(), NOW());
|
||||
|
||||
-- 3. 获取刚插入的主菜单ID
|
||||
SET @gift_pid = LAST_INSERT_ID();
|
||||
|
||||
-- 4. 添加子菜单 - 礼物列表(菜单类型 C)
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte, create_time, update_time)
|
||||
VALUES (@gift_pid, '礼物列表', 'el-icon-goods', 'admin:gift:config', 'gift/config/index', 'C', 1, 1, 0, NOW(), NOW());
|
||||
|
||||
-- 5. 添加子菜单 - 打赏记录(菜单类型 C)
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte, create_time, update_time)
|
||||
VALUES (@gift_pid, '打赏记录', 'el-icon-document', 'admin:gift:records', 'gift/records/index', 'C', 2, 1, 0, NOW(), NOW());
|
||||
|
||||
-- 6. 添加子菜单 - 充值套餐(菜单类型 C)
|
||||
INSERT INTO eb_system_menu (pid, name, icon, perms, component, menu_type, sort, is_show, is_delte, create_time, update_time)
|
||||
VALUES (@gift_pid, '充值套餐', 'el-icon-coin', 'admin:gift:recharge', 'gift/recharge/index', 'C', 3, 1, 0, NOW(), NOW());
|
||||
|
||||
-- 7. 验证插入结果
|
||||
SELECT
|
||||
CASE WHEN m.pid = 0 THEN '主菜单' ELSE ' └─ 子菜单' END as '层级',
|
||||
m.id as 'ID',
|
||||
m.name as '菜单名称',
|
||||
m.component as '组件路径',
|
||||
m.icon as '图标',
|
||||
m.menu_type as '类型',
|
||||
m.sort as '排序',
|
||||
CASE WHEN m.is_show = 1 THEN '显示' ELSE '隐藏' END as '状态'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name = '礼物打赏' OR m.pid = @gift_pid
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
||||
-- 8. 给管理员角色分配权限(假设管理员角色ID为1)
|
||||
-- 先查看角色
|
||||
SELECT * FROM eb_system_role LIMIT 5;
|
||||
|
||||
-- 获取所有礼物菜单ID
|
||||
SELECT @gift_main_id := id FROM eb_system_menu WHERE name = '礼物打赏' AND pid = 0 LIMIT 1;
|
||||
SELECT @gift_config_id := id FROM eb_system_menu WHERE name = '礼物列表' AND pid = @gift_main_id LIMIT 1;
|
||||
SELECT @gift_records_id := id FROM eb_system_menu WHERE name = '打赏记录' AND pid = @gift_main_id LIMIT 1;
|
||||
SELECT @gift_recharge_id := id FROM eb_system_menu WHERE name = '充值套餐' AND pid = @gift_main_id LIMIT 1;
|
||||
|
||||
-- 给管理员角色(rid=1)分配权限
|
||||
INSERT IGNORE INTO eb_system_role_menu (rid, menu_id) VALUES
|
||||
(1, @gift_main_id),
|
||||
(1, @gift_config_id),
|
||||
(1, @gift_records_id),
|
||||
(1, @gift_recharge_id);
|
||||
|
||||
-- 9. 最终验证
|
||||
SELECT '========== 菜单添加完成 ==========' as '';
|
||||
SELECT
|
||||
m.id,
|
||||
m.pid,
|
||||
m.name as '菜单名称',
|
||||
m.component as '组件',
|
||||
m.icon as '图标',
|
||||
m.sort as '排序'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.name LIKE '%礼物%' OR m.pid IN (SELECT id FROM eb_system_menu WHERE name = '礼物打赏')
|
||||
ORDER BY m.pid, m.sort;
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
-- =====================================================
|
||||
-- 插入测试用户数据
|
||||
-- 表名: eb_user
|
||||
-- 如果用户不存在,使用此脚本创建
|
||||
-- =====================================================
|
||||
|
||||
-- 张吉惟 - 男,广东深圳,1995年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_zjw', '张吉惟', '13800000001', 1, '1995-03-15', '广东-深圳', '热爱生活,喜欢交友', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 林国瑞 - 男,浙江杭州,1993年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lgr', '林国瑞', '13800000002', 1, '1993-07-22', '浙江-杭州', '程序员一枚,爱好游戏', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 林玟书 - 女,上海,1997年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lws', '林玟书', '13800000003', 2, '1997-11-08', '上海-浦东', '喜欢阅读和旅行', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 林雅南 - 女,福建厦门,1996年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lyn', '林雅南', '13800000004', 2, '1996-05-20', '福建-厦门', '文艺青年,爱好摄影', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 江奕云 - 女,江苏南京,1998年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_jyy', '江奕云', '13800000005', 2, '1998-09-12', '江苏-南京', '大学生,喜欢音乐', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 刘柏宏 - 男,北京,1992年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lbh', '刘柏宏', '13800000006', 1, '1992-01-28', '北京-朝阳', '创业者,热爱运动', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 阮建安 - 男,广西南宁,1994年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_rja', '阮建安', '13800000007', 1, '1994-06-18', '广西-南宁', '本地人,喜欢美食', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 林子帆 - 男,四川成都,1996年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lzf', '林子帆', '13800000008', 1, '1996-12-05', '四川-成都', '吃货一枚,爱好电竞', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 夏志豪 - 男,湖北武汉,1995年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_xzh', '夏志豪', '13800000009', 1, '1995-08-30', '湖北-武汉', '大学老师,喜欢篮球', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 吉茹定 - 女,陕西西安,1997年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_jrd', '吉茹定', '13800000010', 2, '1997-04-16', '陕西-西安', '历史爱好者,喜欢古风', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 李中冰 - 男,山东青岛,1993年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lzb', '李中冰', '13800000011', 1, '1993-10-25', '山东-青岛', '海边长大,喜欢冲浪', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 黄文隆 - 男,广东广州,1994年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_hwl', '黄文隆', '13800000012', 1, '1994-02-14', '广东-广州', '设计师,热爱艺术', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 谢彦文 - 男,重庆,1996年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_xyw', '谢彦文', '13800000013', 1, '1996-07-07', '重庆-渝中', '火锅爱好者,性格开朗', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 傅智翔 - 男,浙江宁波,1995年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_fzx', '傅智翔', '13800000014', 1, '1995-11-19', '浙江-宁波', '金融从业者,喜欢投资', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 洪振霞 - 女,福建福州,1998年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_hzx', '洪振霞', '13800000015', 2, '1998-03-08', '福建-福州', '护士,温柔善良', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 刘姿婷 - 女,湖南长沙,1997年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lzt', '刘姿婷', '13800000016', 2, '1997-06-21', '湖南-长沙', '主播,喜欢唱歌跳舞', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 荣姿康 - 女,江西南昌,1996年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_rzk', '荣姿康', '13800000017', 2, '1996-09-03', '江西-南昌', '教师,喜欢小动物', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 吕致盈 - 女,安徽合肥,1998年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_lzy', '吕致盈', '13800000018', 2, '1998-12-12', '安徽-合肥', '大学生,爱好绘画', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- 方一强 - 男,河南郑州,1994年生
|
||||
INSERT INTO eb_user (account, nickname, phone, sex, birthday, addres, mark, status, now_money, integral, experience, level, create_time, update_time)
|
||||
VALUES ('test_fyq', '方一强', '13800000019', 1, '1994-04-01', '河南-郑州', '销售经理,热情开朗', 1, 100.00, 100, 0, 1, NOW(), NOW());
|
||||
|
||||
-- =====================================================
|
||||
-- 验证插入结果
|
||||
-- =====================================================
|
||||
SELECT uid, nickname, sex, birthday, addres, mark
|
||||
FROM eb_user
|
||||
WHERE account LIKE 'test_%'
|
||||
ORDER BY uid;
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
-- 保持礼物打赏为独立菜单(最简单可靠的方案)
|
||||
|
||||
UPDATE eb_system_menu
|
||||
SET pid = 0, sort = 51
|
||||
WHERE name = '礼物打赏';
|
||||
|
||||
SELECT '礼物打赏已恢复为独立菜单,可以正常使用' as message;
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
-- 直播间点赞功能数据库表
|
||||
-- 执行命令: mysql -u root -p zhibo < live_room_like_tables.sql
|
||||
|
||||
USE zhibo;
|
||||
|
||||
-- 1. 创建直播间点赞记录表
|
||||
CREATE TABLE IF NOT EXISTS eb_live_room_like (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
|
||||
room_id INT NOT NULL COMMENT '直播间ID',
|
||||
user_id INT NOT NULL COMMENT '用户ID',
|
||||
user_nickname VARCHAR(50) COMMENT '用户昵称',
|
||||
like_count INT DEFAULT 1 COMMENT '点赞次数(该用户对该直播间的累计点赞)',
|
||||
last_like_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后点赞时间',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
INDEX idx_room_id (room_id),
|
||||
INDEX idx_user_id (user_id),
|
||||
UNIQUE INDEX idx_user_room (user_id, room_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播间点赞记录表';
|
||||
|
||||
-- 2. 为直播间表添加点赞数字段
|
||||
ALTER TABLE eb_live_room
|
||||
ADD COLUMN IF NOT EXISTS like_count INT DEFAULT 0 COMMENT '总点赞数' AFTER view_count;
|
||||
|
||||
-- 3. 创建索引以提升查询性能
|
||||
ALTER TABLE eb_live_room_like
|
||||
ADD INDEX IF NOT EXISTS idx_last_like_time (last_like_time);
|
||||
|
||||
-- 4. 初始化现有直播间的点赞数为0
|
||||
UPDATE eb_live_room SET like_count = 0 WHERE like_count IS NULL;
|
||||
|
||||
-- 5. 查看表结构
|
||||
DESC eb_live_room_like;
|
||||
DESC eb_live_room;
|
||||
|
||||
-- 6. 插入测试数据(可选)
|
||||
-- INSERT INTO eb_live_room_like (room_id, user_id, user_nickname, like_count)
|
||||
-- VALUES (8, 43, 'xiaofeng', 10);
|
||||
|
||||
-- 7. 验证数据
|
||||
SELECT
|
||||
'直播间点赞记录表' as table_name,
|
||||
COUNT(*) as record_count
|
||||
FROM eb_live_room_like
|
||||
UNION ALL
|
||||
SELECT
|
||||
'直播间表(有点赞数)' as table_name,
|
||||
COUNT(*) as record_count
|
||||
FROM eb_live_room
|
||||
WHERE like_count IS NOT NULL;
|
||||
|
||||
SELECT '数据库表创建完成!' as status;
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
-- 迁移关注数据脚本
|
||||
-- 步骤1: 创建新的关注记录表
|
||||
CREATE TABLE IF NOT EXISTS `eb_follow_record` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`follower_id` int(11) NOT NULL COMMENT '关注者用户ID',
|
||||
`follower_nickname` varchar(50) DEFAULT NULL COMMENT '关注者昵称',
|
||||
`follower_phone` varchar(20) DEFAULT NULL COMMENT '关注者手机号',
|
||||
`followed_id` int(11) NOT NULL COMMENT '被关注者用户ID',
|
||||
`followed_nickname` varchar(50) DEFAULT NULL COMMENT '被关注者昵称',
|
||||
`followed_phone` varchar(20) DEFAULT NULL COMMENT '被关注者手机号',
|
||||
`follow_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '关注状态:1-已关注 0-已取消',
|
||||
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0-未删除 1-已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`ext_field1` varchar(100) DEFAULT NULL COMMENT '扩展字段1:关注来源/渠道',
|
||||
`ext_field2` int(11) DEFAULT NULL COMMENT '扩展字段2:关注类型/优先级',
|
||||
`ext_field3` varchar(200) DEFAULT NULL COMMENT '扩展字段3:特殊标记/备注',
|
||||
`ext_field4` bigint(20) DEFAULT NULL COMMENT '扩展字段4:关联数据ID',
|
||||
`ext_field5` text COMMENT '扩展字段5:JSON扩展数据',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_follower_followed` (`follower_id`,`followed_id`),
|
||||
KEY `idx_follower_id` (`follower_id`),
|
||||
KEY `idx_followed_id` (`followed_id`),
|
||||
KEY `idx_follow_status` (`follow_status`),
|
||||
KEY `idx_is_deleted` (`is_deleted`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关注记录表';
|
||||
|
||||
-- 步骤2: 检查 eb_user_follow 表是否存在数据
|
||||
-- 如果存在,迁移数据到新表
|
||||
INSERT IGNORE INTO eb_follow_record (follower_id, follower_nickname, follower_phone, followed_id, followed_nickname, followed_phone, follow_status, is_deleted, create_time)
|
||||
SELECT
|
||||
uf.user_id as follower_id,
|
||||
u1.nickname as follower_nickname,
|
||||
u1.phone as follower_phone,
|
||||
uf.follow_user_id as followed_id,
|
||||
u2.nickname as followed_nickname,
|
||||
u2.phone as followed_phone,
|
||||
1 as follow_status,
|
||||
0 as is_deleted,
|
||||
uf.create_time
|
||||
FROM eb_user_follow uf
|
||||
LEFT JOIN eb_user u1 ON uf.user_id = u1.uid
|
||||
LEFT JOIN eb_user u2 ON uf.follow_user_id = u2.uid
|
||||
WHERE EXISTS (SELECT 1 FROM eb_user_follow LIMIT 1);
|
||||
|
||||
-- 步骤3: 验证数据迁移
|
||||
SELECT
|
||||
'原表记录数' as description,
|
||||
COUNT(*) as count
|
||||
FROM eb_user_follow
|
||||
UNION ALL
|
||||
SELECT
|
||||
'新表记录数' as description,
|
||||
COUNT(*) as count
|
||||
FROM eb_follow_record;
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
-- 正确地将礼物打赏移到直播管理下
|
||||
|
||||
-- 1. 获取直播管理的ID
|
||||
SELECT @live_id := id FROM eb_system_menu WHERE name = '直播管理' AND pid = 0;
|
||||
|
||||
-- 2. 更新礼物打赏,保持其类型为C(菜单),只改变父级
|
||||
UPDATE eb_system_menu
|
||||
SET pid = @live_id,
|
||||
sort = 800
|
||||
WHERE name = '礼物打赏';
|
||||
|
||||
-- 3. 验证结果
|
||||
SELECT
|
||||
'直播管理子菜单' as '类别',
|
||||
m.name as '菜单名',
|
||||
m.menu_type as '类型',
|
||||
m.component as '组件路径',
|
||||
m.sort as '排序'
|
||||
FROM eb_system_menu m
|
||||
WHERE m.pid = @live_id
|
||||
ORDER BY m.sort;
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
-- 将礼物打赏移到直播管理菜单下
|
||||
|
||||
-- 1. 获取直播管理的ID
|
||||
SELECT @live_manage_id := id FROM eb_system_menu WHERE name = '直播管理' AND pid = 0;
|
||||
|
||||
-- 2. 更新礼物打赏的pid,让它成为直播管理的子菜单
|
||||
UPDATE eb_system_menu
|
||||
SET pid = @live_manage_id, sort = 999
|
||||
WHERE name = '礼物打赏';
|
||||
|
||||
-- 3. 验证结果
|
||||
SELECT
|
||||
m1.name as '父菜单',
|
||||
m2.name as '子菜单',
|
||||
m2.component as '路径'
|
||||
FROM eb_system_menu m1
|
||||
JOIN eb_system_menu m2 ON m1.id = m2.pid
|
||||
WHERE m1.name = '直播管理'
|
||||
ORDER BY m2.sort;
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
-- 快速检查数据库中是否有主播数据
|
||||
|
||||
-- 1. 检查有多少主播
|
||||
SELECT '主播总数' as info, COUNT(*) as count FROM eb_user WHERE is_streamer = 1;
|
||||
|
||||
-- 2. 列出所有主播
|
||||
SELECT uid, nickname, phone, is_streamer, streamer_level, streamer_certified_time
|
||||
FROM eb_user
|
||||
WHERE is_streamer = 1
|
||||
LIMIT 10;
|
||||
|
||||
-- 3. 检查主播的统计数据
|
||||
SELECT
|
||||
u.uid,
|
||||
u.nickname,
|
||||
(SELECT COUNT(*) FROM eb_follow_record f WHERE f.followed_id = u.uid AND f.follow_status IN ('1', '关注') AND f.is_deleted = 0) as fansCount,
|
||||
(SELECT COUNT(*) FROM eb_live_room r WHERE r.uid = u.uid) as roomCount,
|
||||
(SELECT COALESCE(SUM(r.like_count), 0) FROM eb_live_room r WHERE r.uid = u.uid) as totalLikeCount
|
||||
FROM eb_user u
|
||||
WHERE u.is_streamer = 1
|
||||
LIMIT 10;
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
-- 快速测试礼物系统
|
||||
|
||||
-- 1. 查看表结构
|
||||
DESC eb_gift_record;
|
||||
|
||||
-- 2. 查看现有数据
|
||||
SELECT COUNT(*) as total FROM eb_gift_record;
|
||||
|
||||
-- 3. 查看最新5条记录
|
||||
SELECT * FROM eb_gift_record ORDER BY create_time DESC LIMIT 5;
|
||||
|
||||
-- 4. 检查用户虚拟货币
|
||||
SELECT uid, nickname, virtual_balance FROM eb_user WHERE uid IN (43, 44, 45);
|
||||
|
||||
-- 5. 测试插入(如果需要)
|
||||
-- INSERT INTO eb_gift_record (sender_id, sender_name, receiver_id, receiver_name, room_id, gift_id, gift_name, gift_price, quantity, total_price, create_time)
|
||||
-- VALUES (43, '测试用户43', 44, '测试用户44', 8, 1, '测试礼物', 10, 1, 10, NOW());
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
@echo off
|
||||
echo ========================================
|
||||
echo 重新编译后端礼物管理接口
|
||||
echo ========================================
|
||||
|
||||
cd Zhibo\zhibo-h
|
||||
|
||||
echo.
|
||||
echo [1/2] 清理并编译...
|
||||
call mvn clean package -DskipTests
|
||||
|
||||
echo.
|
||||
echo [2/2] 完成!
|
||||
echo.
|
||||
echo 现在请重启后端服务:
|
||||
echo 1. 停止当前运行的Java进程
|
||||
echo 2. 重新启动后端服务
|
||||
echo 3. 刷新前端页面
|
||||
echo.
|
||||
pause
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 清理前端缓存并重启
|
||||
echo ========================================
|
||||
|
||||
cd Zhibo\admin
|
||||
|
||||
echo.
|
||||
echo [1/3] 停止开发服务器...
|
||||
taskkill /F /IM node.exe 2>nul
|
||||
|
||||
echo.
|
||||
echo [2/3] 清理缓存...
|
||||
rmdir /s /q node_modules\.cache 2>nul
|
||||
rmdir /s /q dist 2>nul
|
||||
|
||||
echo.
|
||||
echo [3/3] 重新启动开发服务器...
|
||||
echo 请手动运行: npm run dev
|
||||
echo.
|
||||
echo 或者在新窗口中运行:
|
||||
start cmd /k "cd /d %cd% && npm run dev"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 完成!
|
||||
echo ========================================
|
||||
pause
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
-- 恢复礼物打赏为独立菜单
|
||||
|
||||
UPDATE eb_system_menu
|
||||
SET pid = 0, sort = 50
|
||||
WHERE name = '礼物打赏';
|
||||
|
||||
-- 验证
|
||||
SELECT id, pid, name, component FROM eb_system_menu WHERE name = '礼物打赏';
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
-- 直播间分类表
|
||||
CREATE TABLE IF NOT EXISTS `eb_live_room_category` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
|
||||
`name` varchar(50) NOT NULL COMMENT '分类名称',
|
||||
`icon` varchar(255) DEFAULT NULL COMMENT '图标(类名或URL)',
|
||||
`sort` int(11) DEFAULT 0 COMMENT '排序',
|
||||
`status` tinyint(1) DEFAULT 1 COMMENT '状态:0-禁用,1-启用',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播间分类表';
|
||||
|
||||
-- 初始化一些默认分类
|
||||
INSERT INTO `eb_live_room_category` (`name`, `icon`, `sort`, `status`) VALUES
|
||||
('娱乐', 'el-icon-video-camera', 1, 1),
|
||||
('游戏', 'el-icon-coordinate', 2, 1),
|
||||
('音乐', 'el-icon-headset', 3, 1),
|
||||
('户外', 'el-icon-location', 4, 1),
|
||||
('聊天', 'el-icon-chat-dot-round', 5, 1);
|
||||
|
||||
-- 给 eb_live_room 表添加 category_id 字段(如果不存在)
|
||||
-- ALTER TABLE `eb_live_room` ADD COLUMN `category_id` int(11) DEFAULT NULL COMMENT '分类ID' AFTER `streamer_name`;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user