diff --git a/0-待完成接入接口.md b/0-待完成接入接口.md deleted file mode 100644 index b14c635c..00000000 --- a/0-待完成接入接口.md +++ /dev/null @@ -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个接口 -- 核心功能已基本完成,待接入的主要是群组和辅助功能 diff --git a/Android接口参数详细文档.md b/Android接口参数详细文档.md deleted file mode 100644 index 64e9835e..00000000 --- a/Android接口参数详细文档.md +++ /dev/null @@ -1,2637 +0,0 @@ -# Android应用接口参数详细文档 - -## 📋 文档说明 - -本文档详细列出了Android应用中**真实调用的所有接口**的请求参数和响应参数示例。 - -**文档版本**: v1.0 -**更新时间**: 2024-12-30 -**接口总数**: 73个真实调用的接口 -**基础URL**: `http://your-server:port` - ---- - -## 📑 目录 - -1. [用户认证模块](#1-用户认证模块) -2. [直播间模块](#2-直播间模块) -3. [礼物打赏模块](#3-礼物打赏模块) -4. [私聊会话模块](#4-私聊会话模块) -5. [好友管理模块](#5-好友管理模块) -6. [关注功能模块](#6-关注功能模块) -7. [作品管理模块](#7-作品管理模块) -8. [文件上传模块](#8-文件上传模块) -9. [在线状态模块](#9-在线状态模块) -10. [离线消息模块](#10-离线消息模块) -11. [搜索功能模块](#11-搜索功能模块) -12. [观看历史模块](#12-观看历史模块) -13. [分类管理模块](#13-分类管理模块) - ---- - -## 1. 用户认证模块 - -### 1.1 账号密码登录 - -**接口地址**: `POST /api/front/login` - -**请求参数**: -```json -{ - "account": "18888888888", - "password": "123456" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| account | String | 是 | 手机号(账号) | -| password | String | 是 | 密码,6-18位 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "token": "98c65b9c67894f7f8989166d49239c6be", - "type": null, - "key": null, - "uid": 120, - "nikeName": "新用户", - "phone": "18888888888" - } -} -``` - -**响应字段说明**: -| 字段名 | 类型 | 说明 | -|--------|------|------| -| token | String | 用户登录密钥,后续请求需携带 | -| type | String | 状态:login-登录,register-注册,start-注册起始页,登录时为null | -| key | String | 注册key,登录时为null | -| uid | Integer | 登录用户ID | -| nikeName | String | 登录用户昵称 | -| phone | String | 登录用户手机号 | - - -### 1.2 用户注册 - -**接口地址**: `POST /api/front/register` - -**请求参数**: -```json -{ - "phone": "18888888888", - "password": "123456", - "verificationCode": "123456", - "nickname": "新用户" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| phone | String | 是 | 手机号 | -| password | String | 是 | 密码,6-18位 | -| verificationCode | String | 否 | 短信验证码 | -| nickname | String | 否 | 用户昵称 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "type": "register", - "key": null, - "uid": 121, - "nikeName": "新用户", - "phone": "18888888889" - } -} -``` - -**响应字段说明**: -| 字段名 | 类型 | 说明 | -|--------|------|------| -| token | String | 用户登录密钥 | -| type | String | 状态:register表示注册成功 | -| key | String | 注册key | -| uid | Integer | 新注册用户ID | -| nikeName | String | 用户昵称 | -| phone | String | 用户手机号 | - -### 1.3 发送验证码 - -**接口地址**: `POST /api/front/sendCode` - -**请求参数**: -``` -phone=18888888888 -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| phone | String | 是 | 手机号 | - -**响应示例**: -```json -{ - "code": 200, - "message": "发送成功", - "data": "发送成功" -} -``` - -### 1.4 退出登录 - -**接口地址**: `GET /api/front/logout` - -**请求头**: -``` -Authori-zation: TOKEN_USER: -``` - -**重要说明**: -- 请求头名称是 `Authori-zation`(注意:Authori和zation之间有连字符 `-`) -- Token值需要加上前缀 `TOKEN_USER:` -- 例如:`Authori-zation: TOKEN_USER:98c65b9c67894f7f8989166d49239c6be` - -**请求参数**: 无 - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": null -} -``` - -### 1.5 获取用户信息 - -**接口地址**: `GET /api/front/user` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: 无 - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "uid": 120, - "nickname": "新用户", - "avatar": "https://example.com/avatar.jpg", - "phone": "18888888888", - "nowMoney": 100.50, - "integral": 500, - "experience": 1000, - "brokeragePrice": 50.00, - "level": 1, - "isPromoter": false, - "couponCount": 5, - "vip": false, - "vipIcon": "", - "vipName": "", - "rechargeSwitch": true, - "collectCount": 10 - } -} -``` - -**响应字段说明**: -| 字段名 | 类型 | 说明 | -|--------|------|------| -| uid | Integer | 用户ID | -| nickname | String | 用户昵称 | -| avatar | String | 用户头像URL | -| phone | String | 手机号码 | -| nowMoney | BigDecimal | 用户余额 | -| integral | Integer | 用户剩余积分 | -| experience | Integer | 用户剩余经验 | -| brokeragePrice | BigDecimal | 佣金金额 | -| level | Integer | 用户等级 | -| isPromoter | Boolean | 是否为推广员 | -| couponCount | Integer | 用户优惠券数量 | -| vip | Boolean | 是否为会员 | -| vipIcon | String | 会员图标 | -| vipName | String | 会员名称 | -| rechargeSwitch | Boolean | 小程序充值开关 | -| collectCount | Integer | 用户收藏数量 | - ---- - -## 2. 直播间模块 - -### 2.1 获取直播间列表 - -**接口地址**: `GET /api/front/live/public/rooms` - -**请求参数**: 无(可选登录) - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": "1", - "title": "精彩直播间", - "streamerName": "主播昵称", - "streamerId": 1001, - "streamerAvatar": "https://example.com/avatar.jpg", - "streamerLevel": 5, - "streamKey": "live_stream_key_123", - "isLive": true, - "viewerCount": 1234, - "likeCount": 5678, - "shareCount": 100, - "description": "直播间描述", - "coverImage": "https://example.com/cover.jpg", - "categoryId": 1, - "categoryName": "娱乐", - "type": "video", - "notice": "直播间公告", - "tags": ["热门", "推荐"], - "isFollowing": false, - "createTime": "2024-12-30T10:00:00", - "startTime": "2024-12-30T10:30:00", - "streamUrls": { - "rtmp": "rtmp://server:25002/live/stream_key", - "flv": "http://server:25003/live/stream_key.flv", - "hls": "http://server:25003/live/stream_key.m3u8" - } - } - ] -} -``` - - -### 2.2 创建直播间 - -**接口地址**: `POST /api/front/live/rooms` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "title": "我的直播间", - "streamerName": "主播昵称", - "type": "video", - "categoryId": 1, - "description": "直播间描述", - "coverImage": "https://example.com/cover.jpg", - "tags": "热门,推荐", - "notice": "欢迎来到我的直播间" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| title | String | 是 | 直播间标题 | -| streamerName | String | 是 | 主播名称 | -| type | String | 否 | 直播类型,默认video | -| categoryId | Integer | 否 | 分类ID | -| description | String | 否 | 直播间描述 | -| coverImage | String | 否 | 封面图片URL | -| tags | String | 否 | 标签,逗号分隔 | -| notice | String | 否 | 直播间公告 | - -**响应示例**: -```json -{ - "code": 200, - "message": "创建成功", - "data": { - "id": "10", - "title": "我的直播间", - "streamKey": "live_stream_key_456", - "streamUrls": { - "rtmp": "rtmp://server:25002/live/stream_key_456", - "flv": "http://server:25003/live/stream_key_456.flv", - "hls": "http://server:25003/live/stream_key_456.m3u8" - }, - "isLive": false, - "createTime": "2024-12-30T11:00:00" - } -} -``` - -### 2.3 获取直播间详情 - -**接口地址**: `GET /api/front/live/public/rooms/{id}` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Integer | 是 | 直播间ID | - -**响应示例**: 同2.1中的单个直播间对象 - -### 2.4 删除直播间 - -**接口地址**: `DELETE /api/front/live/rooms/{id}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Integer | 是 | 直播间ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "删除成功", - "data": null -} -``` - -### 2.5 开始直播 - -**接口地址**: `POST /api/front/live/room/{id}/start` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Integer | 是 | 直播间ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "success": true, - "message": "直播已开始" - } -} -``` - -### 2.6 结束直播 - -**接口地址**: `POST /api/front/live/room/{id}/stop` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Integer | 是 | 直播间ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "success": true, - "message": "直播已结束" - } -} -``` - -### 2.7 关注/取消关注主播 - -**接口地址**: `POST /api/front/live/follow` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "streamerId": 1001, - "action": "follow" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| streamerId | Integer | 是 | 主播用户ID | -| action | String | 是 | 操作类型:follow(关注) / unfollow(取消关注) | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "success": true, - "message": "关注成功", - "isFollowing": true - } -} -``` - -### 2.8 广播在线人数 - -**接口地址**: `POST /api/live/online/broadcast/{roomId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| roomId | String | 是 | 直播间ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "广播成功", - "data": { - "roomId": "1", - "onlineCount": 1234 - } -} -``` - - -### 2.9 获取直播间弹幕消息 - -**接口地址**: `GET /api/front/live/public/rooms/{roomId}/messages` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| roomId | Integer | 是 | 直播间ID | - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| limit | Integer | 否 | 获取数量,默认50 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": 1001, - "roomId": 1, - "userId": 2001, - "nickname": "用户昵称", - "avatar": "https://example.com/avatar.jpg", - "content": "主播好棒!", - "type": "text", - "createTime": "2024-12-30T12:00:00", - "timestamp": 1735542000000 - } - ] -} -``` - -### 2.10 赠送礼物 - -**接口地址**: `POST /api/front/live/rooms/{roomId}/gift` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| roomId | Integer | 是 | 直播间ID | - -**请求参数**: -```json -{ - "giftId": 1, - "count": 1, - "streamerId": 1001, - "receiverId": 1001 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| giftId | Integer | 是 | 礼物ID | -| count | Integer | 是 | 赠送数量 | -| streamerId | Integer | 是 | 主播ID(接收者) | -| receiverId | Integer | 是 | 接收者ID(同streamerId) | - -**响应示例**: -```json -{ - "code": 200, - "message": "赠送成功", - "data": { - "success": true, - "giftRecordId": 10001, - "giftId": 1, - "giftName": "玫瑰花", - "count": 1, - "totalPrice": 10.00, - "newBalance": 90.50, - "sendTime": 1735542000000, - "message": "赠送成功" - } -} -``` - ---- - -## 3. 礼物打赏模块 - -### 3.1 获取礼物列表 - -**接口地址**: `GET /api/front/gift/list` - -**请求参数**: 无 - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": "1", - "name": "玫瑰花", - "price": 10, - "iconUrl": "https://example.com/gift/rose.png", - "description": "浪漫的玫瑰花", - "level": 1, - "animation": "https://example.com/animation/rose.svga", - "sort": 1 - }, - { - "id": "2", - "name": "跑车", - "price": 1000, - "iconUrl": "https://example.com/gift/car.png", - "description": "豪华跑车", - "level": 5, - "animation": "https://example.com/animation/car.svga", - "sort": 2 - } - ] -} -``` - -### 3.2 获取用户金币余额 - -**接口地址**: `GET /api/front/gift/balance` - -**请求头**: -``` -Authorization: Bearer -``` - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "userId": 1001, - "coinBalance": 100.50, - "totalRecharge": 500.00, - "totalConsume": 399.50, - "vipLevel": 3 - } -} -``` - -### 3.3 赠送礼物 - -**接口地址**: `POST /api/front/gift/send` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "roomId": 1, - "giftId": 1, - "count": 5, - "streamerId": 1001 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| roomId | Integer | 是 | 直播间ID | -| giftId | Integer | 是 | 礼物ID | -| count | Integer | 是 | 赠送数量 | -| streamerId | Integer | 是 | 主播ID(接收者) | - -**响应示例**: -```json -{ - "code": 200, - "message": "赠送成功", - "data": { - "success": true, - "giftRecordId": 10002, - "giftId": 1, - "giftName": "玫瑰花", - "count": 5, - "totalPrice": 50.00, - "newBalance": 50.50, - "sendTime": 1735542100000, - "message": "赠送成功" - } -} -``` - -### 3.4 获取充值选项列表 - -**接口地址**: `GET /api/front/gift/recharge/options` - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": "1", - "coinAmount": 60, - "price": 6.00, - "discountLabel": "首充优惠", - "isHot": true, - "sort": 1 - }, - { - "id": "2", - "coinAmount": 300, - "price": 30.00, - "discountLabel": "热门", - "isHot": true, - "sort": 2 - } - ] -} -``` - - -### 3.5 创建充值订单 - -**接口地址**: `POST /api/front/gift/recharge/create` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "optionId": 1, - "coinAmount": 60, - "price": 6.00 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| optionId | Integer | 是 | 充值选项ID | -| coinAmount | BigDecimal | 是 | 金币数量 | -| price | BigDecimal | 是 | 支付金额 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "orderId": "RCH1735542200ABC123", - "orderNo": "RO1735542200", - "coinAmount": 60, - "price": 6.00, - "paymentUrl": "https://pay.example.com/pay?orderId=RCH1735542200ABC123", - "createTime": 1735542200000 - } -} -``` - -### 3.6 支付订单 - -**接口地址**: `POST /api/front/pay/payment` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "orderId": "RCH1735542200ABC123", - "paymentMethod": "alipay" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| orderId | String | 是 | 订单ID | -| paymentMethod | String | 是 | 支付方式:alipay/wechat | - -**响应示例**: -```json -{ - "code": 200, - "message": "支付成功", - "data": { - "success": true, - "orderId": "RCH1735542200ABC123", - "paymentStatus": "paid", - "newBalance": 110.50 - } -} -``` - ---- - -## 4. 私聊会话模块 - -### 4.1 获取会话列表 - -**接口地址**: `GET /api/front/conversations` - -**请求头**: -``` -Authorization: Bearer -``` - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": 1001, - "otherUserId": 2001, - "otherUserNickname": "好友昵称", - "otherUserAvatar": "https://example.com/avatar.jpg", - "lastMessage": "最后一条消息内容", - "lastMessageTime": "2024-12-30T12:00:00", - "unreadCount": 3, - "isOnline": true, - "createTime": "2024-12-29T10:00:00", - "updateTime": "2024-12-30T12:00:00" - } - ] -} -``` - -### 4.2 搜索会话 - -**接口地址**: `GET /api/front/conversations/search` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| keyword | String | 否 | 搜索关键词 | - -**响应示例**: 同4.1 - -### 4.3 获取或创建会话 - -**接口地址**: `POST /api/front/conversations/with/{otherUserId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| otherUserId | Integer | 是 | 对方用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "conversationId": 1001, - "created": false - } -} -``` - -### 4.4 标记会话已读 - -**接口地址**: `POST /api/front/conversations/{id}/read` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Long | 是 | 会话ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": true -} -``` - -### 4.5 删除会话 - -**接口地址**: `DELETE /api/front/conversations/{id}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Long | 是 | 会话ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "删除成功", - "data": true -} -``` - - -### 4.6 获取消息列表 - -**接口地址**: `GET /api/front/conversations/{id}/messages` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Long | 是 | 会话ID | - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": 10001, - "conversationId": 1001, - "senderId": 1001, - "senderNickname": "发送者昵称", - "senderAvatar": "https://example.com/avatar.jpg", - "receiverId": 2001, - "content": "你好,在吗?", - "contentType": "text", - "status": "sent", - "isRead": false, - "createTime": "2024-12-30T12:00:00", - "timestamp": 1735542000000 - } - ] -} -``` - -### 4.7 发送私信 - -**接口地址**: `POST /api/front/conversations/{id}/messages` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Long | 是 | 会话ID | - -**请求参数**: -```json -{ - "content": "你好,在吗?", - "contentType": "text" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| content | String | 是 | 消息内容 | -| contentType | String | 否 | 消息类型:text/image/video,默认text | - -**响应示例**: -```json -{ - "code": 200, - "message": "发送成功", - "data": { - "id": 10002, - "conversationId": 1001, - "senderId": 1001, - "senderNickname": "我的昵称", - "senderAvatar": "https://example.com/my-avatar.jpg", - "receiverId": 2001, - "content": "你好,在吗?", - "contentType": "text", - "status": "sent", - "isRead": false, - "createTime": "2024-12-30T12:01:00", - "timestamp": 1735542060000 - } -} -``` - ---- - -## 5. 好友管理模块 - -### 5.1 搜索用户 - -**接口地址**: `GET /api/front/users/search` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| keyword | String | 是 | 搜索关键词(用户名/手机号) | -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 5, - "list": [ - { - "userId": 2001, - "nickname": "用户昵称", - "avatar": "https://example.com/avatar.jpg", - "phone": "188****8888", - "level": 3, - "signature": "个性签名", - "isFriend": false, - "isFollowing": false - } - ] - } -} -``` - -### 5.2 发送好友请求 - -**接口地址**: `POST /api/front/friends/request` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "targetUserId": 2001, - "message": "你好,我想加你为好友" -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| targetUserId | Integer | 是 | 目标用户ID | -| message | String | 否 | 验证消息 | - -**响应示例**: -```json -{ - "code": 200, - "message": "好友请求已发送", - "data": true -} -``` - -### 5.3 获取好友请求列表 - -**接口地址**: `GET /api/front/friends/requests` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 3, - "list": [ - { - "requestId": 1001, - "fromUserId": 2001, - "fromUserNickname": "申请者昵称", - "fromUserAvatar": "https://example.com/avatar.jpg", - "message": "你好,我想加你为好友", - "status": "pending", - "createTime": "2024-12-30T10:00:00" - } - ] - } -} -``` - - -### 5.4 处理好友请求 - -**接口地址**: `POST /api/front/friends/requests/{requestId}/handle` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| requestId | Long | 是 | 好友请求ID | - -**请求参数**: -```json -{ - "accept": true -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| accept | Boolean | 是 | true=接受,false=拒绝 | - -**响应示例**: -```json -{ - "code": 200, - "message": "已接受好友请求", - "data": true -} -``` - -### 5.5 获取好友列表 - -**接口地址**: `GET /api/front/friends` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 10, - "list": [ - { - "friendId": 2001, - "nickname": "好友昵称", - "avatar": "https://example.com/avatar.jpg", - "level": 3, - "signature": "个性签名", - "isOnline": true, - "lastOnlineTime": 1735542000000, - "createTime": "2024-12-29T10:00:00" - } - ] - } -} -``` - -### 5.6 删除好友 - -**接口地址**: `DELETE /api/front/friends/{friendId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| friendId | Integer | 是 | 好友用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "删除成功", - "data": true -} -``` - -### 5.7 拉黑好友 - -**接口地址**: `POST /api/front/friends/block/{friendId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| friendId | Integer | 是 | 好友用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "拉黑成功", - "data": true -} -``` - -### 5.8 取消拉黑 - -**接口地址**: `POST /api/front/friends/unblock/{friendId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| friendId | Integer | 是 | 好友用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "取消拉黑成功", - "data": true -} -``` - -### 5.9 获取黑名单列表 - -**接口地址**: `GET /api/front/friends/blocked` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 2, - "list": [ - { - "userId": 3001, - "nickname": "被拉黑用户", - "avatar": "https://example.com/avatar.jpg", - "blockTime": "2024-12-30T10:00:00" - } - ] - } -} -``` - ---- - -## 6. 关注功能模块 - -### 6.1 关注用户 - -**接口地址**: `POST /api/front/follow/follow` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "userId": 2001 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 被关注用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "success": true, - "message": "关注成功", - "isFollowing": true - } -} -``` - - -### 6.2 取消关注 - -**接口地址**: `POST /api/front/follow/unfollow` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "userId": 2001 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 被取消关注用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "success": true, - "message": "取消关注成功", - "isFollowing": false - } -} -``` - -### 6.3 检查关注状态 - -**接口地址**: `GET /api/front/follow/status/{userId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 目标用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "isFollowing": true, - "userId": 2001 - } -} -``` - -### 6.4 批量检查关注状态 - -**接口地址**: `POST /api/front/follow/status/batch` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "userIds": [2001, 2002, 2003] -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userIds | List | 是 | 用户ID列表 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "statusMap": { - "2001": true, - "2002": false, - "2003": true - } - } -} -``` - -### 6.5 获取关注列表 - -**接口地址**: `GET /api/front/follow/following` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 15, - "list": [ - { - "userId": 2001, - "nickname": "关注的用户", - "avatar": "https://example.com/avatar.jpg", - "level": 5, - "signature": "个性签名", - "isOnline": true, - "followTime": "2024-12-29T10:00:00", - "mutualFollow": true - } - ] - } -} -``` - -### 6.6 获取粉丝列表 - -**接口地址**: `GET /api/front/follow/followers` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 50, - "list": [ - { - "userId": 3001, - "nickname": "粉丝昵称", - "avatar": "https://example.com/avatar.jpg", - "level": 2, - "signature": "个性签名", - "isOnline": false, - "followTime": "2024-12-28T15:00:00", - "mutualFollow": false - } - ] - } -} -``` - -### 6.7 获取关注统计 - -**接口地址**: `GET /api/front/follow/stats` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 否 | 用户ID,不传则查询当前用户 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "userId": 1001, - "followingCount": 15, - "followersCount": 50, - "mutualFollowCount": 8 - } -} -``` - ---- - -## 7. 作品管理模块 - -### 7.1 发布作品 - -**接口地址**: `POST /api/front/works/publish` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "title": "我的作品标题", - "description": "作品描述内容", - "coverUrl": "https://example.com/cover.jpg", - "videoUrl": "https://example.com/video.mp4", - "categoryId": 1, - "tags": "热门,推荐", - "location": "北京市", - "isPublic": true -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| title | String | 是 | 作品标题 | -| description | String | 否 | 作品描述 | -| coverUrl | String | 是 | 封面图片URL | -| videoUrl | String | 是 | 视频URL | -| categoryId | Integer | 否 | 分类ID | -| tags | String | 否 | 标签,逗号分隔 | -| location | String | 否 | 地理位置 | -| isPublic | Boolean | 否 | 是否公开,默认true | - -**响应示例**: -```json -{ - "code": 200, - "message": "发布成功", - "data": 10001 -} -``` - - -### 7.2 编辑作品 - -**接口地址**: `POST /api/front/works/update` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "id": 10001, - "title": "修改后的标题", - "description": "修改后的描述", - "coverUrl": "https://example.com/new-cover.jpg", - "categoryId": 2, - "tags": "热门,精选", - "isPublic": true -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | Long | 是 | 作品ID | -| title | String | 否 | 作品标题 | -| description | String | 否 | 作品描述 | -| coverUrl | String | 否 | 封面图片URL | -| categoryId | Integer | 否 | 分类ID | -| tags | String | 否 | 标签 | -| isPublic | Boolean | 否 | 是否公开 | - -**响应示例**: -```json -{ - "code": 200, - "message": "更新成功", - "data": true -} -``` - -### 7.3 删除作品 - -**接口地址**: `POST /api/front/works/delete/{worksId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| worksId | Long | 是 | 作品ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "删除成功", - "data": true -} -``` - -### 7.4 获取作品详情 - -**接口地址**: `GET /api/front/works/detail/{worksId}` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| worksId | Long | 是 | 作品ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "id": 10001, - "title": "作品标题", - "description": "作品描述", - "coverUrl": "https://example.com/cover.jpg", - "videoUrl": "https://example.com/video.mp4", - "authorId": 1001, - "authorNickname": "作者昵称", - "authorAvatar": "https://example.com/avatar.jpg", - "categoryId": 1, - "categoryName": "娱乐", - "tags": ["热门", "推荐"], - "location": "北京市", - "viewCount": 1234, - "likeCount": 567, - "commentCount": 89, - "shareCount": 45, - "collectCount": 123, - "isLiked": false, - "isCollected": false, - "isPublic": true, - "createTime": "2024-12-30T10:00:00", - "updateTime": "2024-12-30T11:00:00" - } -} -``` - -### 7.5 搜索作品 - -**接口地址**: `POST /api/front/works/search` - -**请求参数**: -```json -{ - "keyword": "搜索关键词", - "categoryId": 1, - "sortBy": "hot", - "page": 1, - "pageSize": 20 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| keyword | String | 否 | 搜索关键词 | -| categoryId | Integer | 否 | 分类ID | -| sortBy | String | 否 | 排序方式:hot(热门)/new(最新)/like(点赞) | -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 100, - "list": [ - { - "id": 10001, - "title": "作品标题", - "coverUrl": "https://example.com/cover.jpg", - "authorId": 1001, - "authorNickname": "作者昵称", - "authorAvatar": "https://example.com/avatar.jpg", - "viewCount": 1234, - "likeCount": 567, - "isLiked": false, - "createTime": "2024-12-30T10:00:00" - } - ] - } -} -``` - -### 7.6 获取用户作品列表 - -**接口地址**: `GET /api/front/works/user/{userId}` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 用户ID | - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: 同7.5 - -### 7.7 点赞作品 - -**接口地址**: `POST /api/front/works/like/{worksId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| worksId | Long | 是 | 作品ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "点赞成功", - "data": true -} -``` - -### 7.8 取消点赞 - -**接口地址**: `POST /api/front/works/unlike/{worksId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| worksId | Long | 是 | 作品ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "取消点赞成功", - "data": true -} -``` - - -### 7.9 收藏作品 - -**接口地址**: `POST /api/front/works/collect/{worksId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| worksId | Long | 是 | 作品ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "收藏成功", - "data": true -} -``` - -### 7.10 取消收藏 - -**接口地址**: `POST /api/front/works/uncollect/{worksId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| worksId | Long | 是 | 作品ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "取消收藏成功", - "data": true -} -``` - -### 7.11 获取我点赞的作品 - -**接口地址**: `GET /api/front/works/my/liked` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: 同7.5 - -### 7.12 获取我收藏的作品 - -**接口地址**: `GET /api/front/works/my/collected` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: 同7.5 - ---- - -## 8. 文件上传模块 - -### 8.1 上传图片 - -**接口地址**: `POST /api/front/user/upload/image` - -**请求头**: -``` -Authorization: Bearer -Content-Type: multipart/form-data -``` - -**请求参数**: -``` -file: (binary) -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| file | File | 是 | 图片文件 | - -**响应示例**: -```json -{ - "code": 200, - "message": "上传成功", - "data": { - "url": "https://example.com/uploads/images/20241230/abc123.jpg", - "fileName": "abc123.jpg", - "fileSize": 102400, - "fileType": "image/jpeg", - "uploadTime": 1735542000000 - } -} -``` - -### 8.2 上传视频 - -**接口地址**: `POST /api/front/upload/work/video` - -**请求头**: -``` -Authorization: Bearer -Content-Type: multipart/form-data -``` - -**请求参数**: -``` -file: (binary) -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| file | File | 是 | 视频文件 | - -**响应示例**: -```json -{ - "code": 200, - "message": "上传成功", - "data": { - "url": "https://example.com/uploads/videos/20241230/video123.mp4", - "fileName": "video123.mp4", - "fileSize": 10485760, - "fileType": "video/mp4", - "duration": 120, - "uploadTime": 1735542000000 - } -} -``` - ---- - -## 9. 在线状态模块 - -### 9.1 检查用户是否在线 - -**接口地址**: `GET /api/front/online/status/{userId}` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "userId": 2001, - "isOnline": true, - "lastOnlineTime": 1735542000000, - "status": "online" - } -} -``` - -### 9.2 批量检查用户在线状态 - -**接口地址**: `POST /api/front/online/status/batch` - -**请求参数**: -```json -[2001, 2002, 2003] -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| - | List | 是 | 用户ID列表 | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "2001": { - "userId": 2001, - "isOnline": true, - "lastOnlineTime": 1735542000000, - "status": "online" - }, - "2002": { - "userId": 2002, - "isOnline": false, - "lastOnlineTime": 1735540000000, - "status": "offline" - } - } -} -``` - -### 9.3 获取直播间在线人数 - -**接口地址**: `GET /api/front/online/room/{roomId}/count` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| roomId | String | 是 | 直播间ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "success", - "data": { - "roomId": "1", - "onlineCount": 1234 - } -} -``` - ---- - -## 10. 离线消息模块 - -### 10.1 获取离线消息数量 - -**接口地址**: `GET /api/front/online/offline/count/{userId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "totalCount": 10, - "unreadCount": 8 - } -} -``` - -### 10.2 获取离线消息列表 - -**接口地址**: `GET /api/front/online/offline/messages/{userId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 用户ID | - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认50 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "pageNum": 1, - "pageSize": 50, - "total": 10, - "list": [ - { - "id": 10001, - "conversationId": 1001, - "senderId": 2001, - "senderNickname": "发送者昵称", - "senderAvatar": "https://example.com/avatar.jpg", - "content": "你好,在吗?", - "contentType": "text", - "createTime": "2024-12-30T10:00:00", - "timestamp": 1735538400000, - "isRead": false - } - ] - } -} -``` - -### 10.3 清空离线消息 - -**接口地址**: `DELETE /api/front/online/offline/messages/{userId}` - -**请求头**: -``` -Authorization: Bearer -``` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | Integer | 是 | 用户ID | - -**响应示例**: -```json -{ - "code": 200, - "message": "清空成功", - "data": true -} -``` - ---- - -## 11. 搜索功能模块 - -### 11.1 搜索直播间 - -**接口地址**: `GET /api/front/search/live-rooms` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| keyword | String | 是 | 搜索关键词 | -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 10, - "list": [ - { - "id": "1", - "title": "直播间标题", - "streamerName": "主播昵称", - "streamerId": 1001, - "streamerAvatar": "https://example.com/avatar.jpg", - "streamerLevel": 5, - "isLive": true, - "viewerCount": 1234, - "likeCount": 5678, - "coverImage": "https://example.com/cover.jpg", - "categoryName": "娱乐", - "isFollowing": false - } - ] - } -} -``` - -### 11.2 获取热门搜索词 - -**接口地址**: `GET /api/front/search/hot` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| limit | Integer | 否 | 返回数量,默认10 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": [ - { - "keyword": "热门关键词1", - "searchCount": 10000, - "rank": 1, - "isHot": true - }, - { - "keyword": "热门关键词2", - "searchCount": 8000, - "rank": 2, - "isHot": true - } - ] -} -``` - -### 11.3 获取搜索建议 - -**接口地址**: `GET /api/front/search/suggestions` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| keyword | String | 是 | 搜索关键词 | -| limit | Integer | 否 | 返回数量,默认10 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": [ - "搜索建议1", - "搜索建议2", - "搜索建议3" - ] -} -``` - -### 11.4 获取搜索历史 - -**接口地址**: `GET /api/front/search/history` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| limit | Integer | 否 | 返回数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": [ - { - "keyword": "搜索词1", - "searchTime": "2024-12-30T12:00:00", - "timestamp": 1735542000000 - }, - { - "keyword": "搜索词2", - "searchTime": "2024-12-30T11:00:00", - "timestamp": 1735538400000 - } - ] -} -``` - -### 11.5 清空搜索历史 - -**接口地址**: `DELETE /api/front/search/history` - -**请求头**: -``` -Authorization: Bearer -``` - -**响应示例**: -```json -{ - "code": 200, - "message": "清空成功", - "data": true -} -``` - ---- - -## 12. 观看历史模块 - -### 12.1 添加观看历史 - -**接口地址**: `POST /api/front/watch/history` - -**请求头**: -``` -Authorization: Bearer -``` - -**请求参数**: -```json -{ - "roomId": "1", - "duration": 120 -} -``` - -**参数说明**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| roomId | String | 是 | 直播间ID | -| duration | Integer | 否 | 观看时长(秒) | - -**响应示例**: -```json -{ - "code": 200, - "message": "添加成功", - "data": true -} -``` - -### 12.2 获取观看历史列表 - -**接口地址**: `GET /api/front/watch/history` - -**请求头**: -``` -Authorization: Bearer -``` - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "pageNum": 1, - "pageSize": 20, - "total": 50, - "list": [ - { - "id": 1001, - "roomId": "1", - "roomTitle": "直播间标题", - "roomCover": "https://example.com/cover.jpg", - "streamerId": 2001, - "streamerNickname": "主播昵称", - "streamerAvatar": "https://example.com/avatar.jpg", - "duration": 120, - "watchTime": "2024-12-30T12:00:00", - "timestamp": 1735542000000 - } - ] - } -} -``` - -### 12.3 清空观看历史 - -**接口地址**: `DELETE /api/front/watch/history` - -**请求头**: -``` -Authorization: Bearer -``` - -**响应示例**: -```json -{ - "code": 200, - "message": "清空成功", - "data": true -} -``` - ---- - -## 13. 分类管理模块 - -### 13.1 获取直播间分类列表 - -**接口地址**: `GET /api/front/category/live-room` - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": [ - { - "id": 1, - "name": "娱乐", - "type": "room", - "icon": "https://example.com/icon/entertainment.png", - "sort": 1, - "isHot": true, - "description": "娱乐分类" - }, - { - "id": 2, - "name": "游戏", - "type": "room", - "icon": "https://example.com/icon/game.png", - "sort": 2, - "isHot": true, - "description": "游戏分类" - } - ] -} -``` - -### 13.2 获取作品分类列表 - -**接口地址**: `GET /api/front/category/work` - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": [ - { - "id": 1, - "name": "搞笑", - "type": "works", - "icon": "https://example.com/icon/funny.png", - "sort": 1, - "isHot": true, - "description": "搞笑分类" - }, - { - "id": 2, - "name": "音乐", - "type": "works", - "icon": "https://example.com/icon/music.png", - "sort": 2, - "isHot": true, - "description": "音乐分类" - } - ] -} -``` - -### 13.3 获取分类详情 - -**接口地址**: `GET /api/front/category/{categoryId}` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| categoryId | Integer | 是 | 分类ID | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "id": 1, - "name": "娱乐", - "type": "room", - "icon": "https://example.com/icon/entertainment.png", - "sort": 1, - "isHot": true, - "description": "娱乐分类", - "contentCount": 1234, - "createTime": "2024-01-01T00:00:00" - } -} -``` - -### 13.4 根据分类获取内容列表 - -**接口地址**: `GET /api/front/category/{categoryId}/content` - -**路径参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| categoryId | Integer | 是 | 分类ID | - -**查询参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| sortBy | String | 否 | 排序方式:hot/new/popular,默认hot | -| page | Integer | 否 | 页码,默认1 | -| pageSize | Integer | 否 | 每页数量,默认20 | - -**响应示例**: -```json -{ - "code": 200, - "message": null, - "data": { - "categoryId": 1, - "categoryName": "娱乐", - "pageNum": 1, - "pageSize": 20, - "total": 100, - "list": [ - { - "id": "1", - "title": "直播间标题", - "type": "room", - "coverImage": "https://example.com/cover.jpg", - "streamerName": "主播昵称", - "streamerId": 1001, - "streamerAvatar": "https://example.com/avatar.jpg", - "isLive": true, - "viewerCount": 1234, - "likeCount": 5678 - } - ] - } -} -``` - ---- - -## 📝 附录 - -### A. 通用响应格式 - -所有接口都遵循统一的响应格式: - -```json -{ - "code": 200, - "message": "success", - "data": {} -} -``` - -**响应字段说明**: -| 字段名 | 类型 | 说明 | -|--------|------|------| -| code | Integer | 状态码:200=成功,其他=失败 | -| message | String | 响应消息 | -| data | Object/Array | 响应数据 | - -### B. 常见状态码 - -| 状态码 | 说明 | -|--------|------| -| 200 | 请求成功 | -| 400 | 请求参数错误 | -| 401 | 未授权,需要登录 | -| 403 | 禁止访问 | -| 404 | 资源不存在 | -| 500 | 服务器内部错误 | - -### C. 认证说明 - -大部分接口需要在请求头中携带Token: - -``` -Authorization: Bearer -``` - -Token通过登录接口获取,有效期为7天。 - -### D. 分页参数说明 - -支持分页的接口统一使用以下参数: - -| 参数名 | 类型 | 默认值 | 说明 | -|--------|------|--------|------| -| page | Integer | 1 | 页码,从1开始 | -| pageSize | Integer | 20 | 每页数量 | - -分页响应格式: - -```json -{ - "pageNum": 1, - "pageSize": 20, - "total": 100, - "list": [] -} -``` - -### E. WebSocket连接说明 - -**私聊WebSocket地址**: `ws://your-server:port/ws/private-chat?token=` - -**直播间WebSocket地址**: `ws://your-server:port/ws/live-chat?roomId=&token=` - -**礼物WebSocket地址**: `ws://your-server:port/ws/gift?roomId=&token=` - -### F. 文件上传说明 - -文件上传接口使用 `multipart/form-data` 格式: - -- 图片支持格式:jpg, jpeg, png, gif -- 图片大小限制:5MB -- 视频支持格式:mp4, avi, mov -- 视频大小限制:100MB - -### G. 测试账号 - -**测试账号1**: -- 账号:18888888888 -- 密码:123456 - -**测试账号2**: -- 账号:18888888889 -- 密码:123456 - ---- - -## 📞 技术支持 - -如有问题,请联系技术支持团队。 - -**文档结束** - diff --git a/Android接口真实调用情况分析报告.md b/Android接口真实调用情况分析报告.md deleted file mode 100644 index 45af98e1..00000000 --- a/Android接口真实调用情况分析报告.md +++ /dev/null @@ -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 -**分析工具**: 代码静态分析 + 人工审查 -**可信度**: ⭐⭐⭐⭐⭐ (非常高) diff --git a/Android端点赞功能实现总结.md b/Android端点赞功能实现总结.md deleted file mode 100644 index 90c3ef03..00000000 --- a/Android端点赞功能实现总结.md +++ /dev/null @@ -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 request = new HashMap<>(); -request.put("count", 1); - -ApiClient.getService(this) - .likeRoom(roomId, request) - .enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - Map data = response.body().getData(); - int likeCount = ((Number) data.get("likeCount")).intValue(); - // 更新UI - } - } - - @Override - public void onFailure(Call>> 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调整和新页面创建,这些都是相对简单的任务。 - -所有代码都已经过测试和优化,可以直接编译运行! diff --git a/App功能清单.md b/App功能清单.md deleted file mode 100644 index 6fe4c373..00000000 --- a/App功能清单.md +++ /dev/null @@ -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. 数据统计 -- 仪表盘(概览数据) -- 用户统计 -- 收益统计 -- 通话统计 diff --git a/FINAL_FIX_LIVE_404.sql b/FINAL_FIX_LIVE_404.sql deleted file mode 100644 index 0c2ad60a..00000000 --- a/FINAL_FIX_LIVE_404.sql +++ /dev/null @@ -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; diff --git a/QUICK_FIX.md b/QUICK_FIX.md deleted file mode 100644 index fcd1f962..00000000 --- a/QUICK_FIX.md +++ /dev/null @@ -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; -``` -找到正确的数据库名。 - -## 完成! - -执行完以上步骤后,关注功能应该可以正常工作了。 diff --git a/Zhibo/WebSocket增强功能-README.md b/Zhibo/WebSocket增强功能-README.md deleted file mode 100644 index 71fdd2d4..00000000 --- a/Zhibo/WebSocket增强功能-README.md +++ /dev/null @@ -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 # 房间在线用户 -``` - -### 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缓存优化 -✅ **易维护** - 清晰的日志和文档 - -**开始使用吧!** 🚀 diff --git a/Zhibo/WebSocket增强功能实现说明.md b/Zhibo/WebSocket增强功能实现说明.md deleted file mode 100644 index 0342f28a..00000000 --- a/Zhibo/WebSocket增强功能实现说明.md +++ /dev/null @@ -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 (过期时间: 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 users = onlineStatusService.getRoomOnlineUsers(roomId); - ``` - -5. **批量检查在线状态** - ```java - List onlineUsers = onlineStatusService.getOnlineUsers(userIds); - ``` - -#### 自动过期机制 -- 用户在线状态5分钟无活动自动过期 -- 每次消息发送/接收会自动更新活跃时间 -- 心跳消息也会更新活跃时间 - ---- - -### 3. 离线消息处理 ✅ - -#### Redis 数据结构 -``` -# 用户离线消息队列(List) -offline:msg:{userId} = [message1, message2, ...] -- 最大保存100条消息 -- 过期时间: 7天 -``` - -#### 核心功能 -1. **保存离线消息** - ```java - offlineMessageService.saveOfflineMessage(userId, messageJson); - ``` - -2. **获取离线消息** - ```java - // 获取指定数量 - List messages = offlineMessageService.getOfflineMessages(userId, 50); - - // 获取全部 - List 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中,无需修改客户端代码即可享受这些增强功能! diff --git a/Zhibo/功能验证清单.md b/Zhibo/功能验证清单.md deleted file mode 100644 index a9ded2cc..00000000 --- a/Zhibo/功能验证清单.md +++ /dev/null @@ -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 转 Set - 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日 -**验证人**: [待填写] -**验证日期**: [待填写] -**验证结果**: [待填写] diff --git a/Zhibo/检查编译问题.md b/Zhibo/检查编译问题.md deleted file mode 100644 index 39cc6d95..00000000 --- a/Zhibo/检查编译问题.md +++ /dev/null @@ -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`,需要转换为 `Set` - -**修复**: 在 `OnlineStatusServiceImpl.getRoomOnlineUsers()` 中添加类型转换逻辑 -```java -Set objects = redisUtil.sGet(key); -if (objects == null) return Set.of(); - -Set 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 cannot be converted to Set -``` -**解决**: 已修复,添加了类型转换 - ---- - -## 📞 需要帮助? - -如果遇到其他问题: -1. 查看日志文件:`logs/application.log` -2. 检查Redis连接:`redis-cli ping` -3. 验证端口:`netstat -an | grep 8081` -4. 查看本文档的相关章节 - ---- - -**最后更新**: 2024年12月25日 -**状态**: ✅ 所有问题已修复 diff --git a/Zhibo/礼物打赏模块完成总结.md b/Zhibo/礼物打赏模块完成总结.md deleted file mode 100644 index 93d0be9e..00000000 --- a/Zhibo/礼物打赏模块完成总结.md +++ /dev/null @@ -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 --J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED - - - org.projectlombok - lombok - 1.18.30 - - -``` - -### 问题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年 -**状态**: ✅ 所有问题已修复,可以正常编译 diff --git a/Zhibo/礼物打赏模块部署清单.md b/Zhibo/礼物打赏模块部署清单.md deleted file mode 100644 index f5a0e1bc..00000000 --- a/Zhibo/礼物打赏模块部署清单.md +++ /dev/null @@ -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. 查看详细文档 - ---- - -**部署完成后,请在此打勾**:□ - -**部署人员**:___________ - -**部署时间**:___________ - -**备注**:___________ diff --git a/Zhibo/离线消息功能实现说明.md b/Zhibo/离线消息功能实现说明.md deleted file mode 100644 index 1a5f4925..00000000 --- a/Zhibo/离线消息功能实现说明.md +++ /dev/null @@ -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 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 diff --git a/Zhibo/离线消息快速开始.md b/Zhibo/离线消息快速开始.md deleted file mode 100644 index f3c224a8..00000000 --- a/Zhibo/离线消息快速开始.md +++ /dev/null @@ -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 diff --git a/Zhibo/管理端完成进度报告.md b/Zhibo/管理端完成进度报告.md deleted file mode 100644 index 7fe0e558..00000000 --- a/Zhibo/管理端完成进度报告.md +++ /dev/null @@ -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. 所有表单验证和错误处理已完善 diff --git a/add_gift_manage_menu.sql b/add_gift_manage_menu.sql deleted file mode 100644 index 832a7632..00000000 --- a/add_gift_manage_menu.sql +++ /dev/null @@ -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; diff --git a/add_gift_menu.sql b/add_gift_menu.sql deleted file mode 100644 index 5a755d2f..00000000 --- a/add_gift_menu.sql +++ /dev/null @@ -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 '%礼物%'; - diff --git a/add_gift_menus_correct.sql b/add_gift_menus_correct.sql deleted file mode 100644 index e69de29b..00000000 diff --git a/add_gift_menus_to_database.sql b/add_gift_menus_to_database.sql deleted file mode 100644 index 964fb1df..00000000 --- a/add_gift_menus_to_database.sql +++ /dev/null @@ -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'); diff --git a/add_gift_to_live_manage_correct.sql b/add_gift_to_live_manage_correct.sql deleted file mode 100644 index adfeff4e..00000000 --- a/add_gift_to_live_manage_correct.sql +++ /dev/null @@ -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; diff --git a/add_streamer_menu.sql b/add_streamer_menu.sql deleted file mode 100644 index 6a0c10fd..00000000 --- a/add_streamer_menu.sql +++ /dev/null @@ -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 diff --git a/check_current_menu_status.sql b/check_current_menu_status.sql deleted file mode 100644 index 2c93b6c9..00000000 --- a/check_current_menu_status.sql +++ /dev/null @@ -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; diff --git a/check_gift_records.sql b/check_gift_records.sql deleted file mode 100644 index 32751ac7..00000000 --- a/check_gift_records.sql +++ /dev/null @@ -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; diff --git a/check_gift_table_structure.sql b/check_gift_table_structure.sql deleted file mode 100644 index 97c77af9..00000000 --- a/check_gift_table_structure.sql +++ /dev/null @@ -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; diff --git a/check_like_status.sql b/check_like_status.sql deleted file mode 100644 index 8638f85d..00000000 --- a/check_like_status.sql +++ /dev/null @@ -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; diff --git a/check_live_menu_config.sql b/check_live_menu_config.sql deleted file mode 100644 index a69afa0a..00000000 --- a/check_live_menu_config.sql +++ /dev/null @@ -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; diff --git a/check_live_room_structure.sql b/check_live_room_structure.sql deleted file mode 100644 index 87cb76e4..00000000 --- a/check_live_room_structure.sql +++ /dev/null @@ -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; diff --git a/check_menu_table_columns.sql b/check_menu_table_columns.sql deleted file mode 100644 index e25c5cba..00000000 --- a/check_menu_table_columns.sql +++ /dev/null @@ -1,5 +0,0 @@ --- 查看菜单表的实际字段结构 -DESCRIBE eb_system_menu; - --- 或者使用这个 -SHOW COLUMNS FROM eb_system_menu; diff --git a/check_menu_table_structure.sql b/check_menu_table_structure.sql deleted file mode 100644 index c620b0a8..00000000 --- a/check_menu_table_structure.sql +++ /dev/null @@ -1,8 +0,0 @@ --- 查看菜单表结构 -DESC eb_system_menu; - --- 查看现有菜单数据示例 -SELECT * FROM eb_system_menu LIMIT 5; - --- 查看所有列名 -SHOW COLUMNS FROM eb_system_menu; diff --git a/check_room_8.sql b/check_room_8.sql deleted file mode 100644 index e14dc295..00000000 --- a/check_room_8.sql +++ /dev/null @@ -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; diff --git a/check_streamer_stats.sql b/check_streamer_stats.sql deleted file mode 100644 index 2eaaccf7..00000000 --- a/check_streamer_stats.sql +++ /dev/null @@ -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; diff --git a/check_users.sql b/check_users.sql deleted file mode 100644 index 7e1d1cbb..00000000 --- a/check_users.sql +++ /dev/null @@ -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; diff --git a/clear_frontend_cache.bat b/clear_frontend_cache.bat deleted file mode 100644 index 078674c8..00000000 --- a/clear_frontend_cache.bat +++ /dev/null @@ -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 diff --git a/compare_working_menu.sql b/compare_working_menu.sql deleted file mode 100644 index ebef5a3a..00000000 --- a/compare_working_menu.sql +++ /dev/null @@ -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; diff --git a/complete_gift_diagnosis.sql b/complete_gift_diagnosis.sql deleted file mode 100644 index bd88fd42..00000000 --- a/complete_gift_diagnosis.sql +++ /dev/null @@ -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 ''; diff --git a/complete_test_users.sql b/complete_test_users.sql deleted file mode 100644 index f75c3a4c..00000000 --- a/complete_test_users.sql +++ /dev/null @@ -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; diff --git a/create_gift_menu.sql b/create_gift_menu.sql deleted file mode 100644 index 1b755184..00000000 --- a/create_gift_menu.sql +++ /dev/null @@ -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; diff --git a/create_gift_table.sql b/create_gift_table.sql deleted file mode 100644 index b44180aa..00000000 --- a/create_gift_table.sql +++ /dev/null @@ -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; diff --git a/create_test_streamer_if_needed.sql b/create_test_streamer_if_needed.sql deleted file mode 100644 index 0f01e243..00000000 --- a/create_test_streamer_if_needed.sql +++ /dev/null @@ -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; diff --git a/debug_follow_rooms.sql b/debug_follow_rooms.sql deleted file mode 100644 index b20185ce..00000000 --- a/debug_follow_rooms.sql +++ /dev/null @@ -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. 测试完成后,使用第七部分清理测试数据 diff --git a/debug_gift_api_response.sql b/debug_gift_api_response.sql deleted file mode 100644 index d0976b91..00000000 --- a/debug_gift_api_response.sql +++ /dev/null @@ -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; diff --git a/delete_room_menus.sql b/delete_room_menus.sql deleted file mode 100644 index 1dfa0a6d..00000000 --- a/delete_room_menus.sql +++ /dev/null @@ -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 = '房间背景'; diff --git a/deploy-backend-streamer-fix.bat b/deploy-backend-streamer-fix.bat deleted file mode 100644 index 41a2fd4b..00000000 --- a/deploy-backend-streamer-fix.bat +++ /dev/null @@ -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 diff --git a/deploy-balance-system.bat b/deploy-balance-system.bat deleted file mode 100644 index 8a58f87b..00000000 --- a/deploy-balance-system.bat +++ /dev/null @@ -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 diff --git a/deploy-category-fix.bat b/deploy-category-fix.bat deleted file mode 100644 index 78cabad8..00000000 --- a/deploy-category-fix.bat +++ /dev/null @@ -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 diff --git a/deploy-commands.txt b/deploy-commands.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/deploy-gift-fix.bat b/deploy-gift-fix.bat deleted file mode 100644 index 9fea0f57..00000000 --- a/deploy-gift-fix.bat +++ /dev/null @@ -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 diff --git a/deploy-gift-records-fix.bat b/deploy-gift-records-fix.bat deleted file mode 100644 index feddc185..00000000 --- a/deploy-gift-records-fix.bat +++ /dev/null @@ -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 diff --git a/deploy-gift-system-complete.bat b/deploy-gift-system-complete.bat deleted file mode 100644 index 9b419231..00000000 --- a/deploy-gift-system-complete.bat +++ /dev/null @@ -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 diff --git a/deploy-to-server.bat b/deploy-to-server.bat deleted file mode 100644 index 05d23981..00000000 --- a/deploy-to-server.bat +++ /dev/null @@ -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 diff --git a/deploy-to-server.sh b/deploy-to-server.sh deleted file mode 100644 index eb818001..00000000 --- a/deploy-to-server.sh +++ /dev/null @@ -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 "" diff --git a/deploy_gift_in_live.bat b/deploy_gift_in_live.bat deleted file mode 100644 index 0f18e3bf..00000000 --- a/deploy_gift_in_live.bat +++ /dev/null @@ -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 diff --git a/deploy_gift_manage_complete.bat b/deploy_gift_manage_complete.bat deleted file mode 100644 index b61ce1fc..00000000 --- a/deploy_gift_manage_complete.bat +++ /dev/null @@ -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 diff --git a/diagnose_and_fix_live_menu.sql b/diagnose_and_fix_live_menu.sql deleted file mode 100644 index 6d864953..00000000 --- a/diagnose_and_fix_live_menu.sql +++ /dev/null @@ -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; diff --git a/diagnose_balance_issue.md b/diagnose_balance_issue.md deleted file mode 100644 index 9343ff0d..00000000 --- a/diagnose_balance_issue.md +++ /dev/null @@ -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. 返回钱包页面,查看余额是否增加 diff --git a/diagnose_current_follow_issue.sql b/diagnose_current_follow_issue.sql deleted file mode 100644 index 14239586..00000000 --- a/diagnose_current_follow_issue.sql +++ /dev/null @@ -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; diff --git a/diagnose_follow_issue.sql b/diagnose_follow_issue.sql deleted file mode 100644 index d8ce5595..00000000 --- a/diagnose_follow_issue.sql +++ /dev/null @@ -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; diff --git a/diagnose_gift_system.sql b/diagnose_gift_system.sql deleted file mode 100644 index 219a60be..00000000 --- a/diagnose_gift_system.sql +++ /dev/null @@ -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 ''; diff --git a/diagnose_live_status.sql b/diagnose_live_status.sql deleted file mode 100644 index e7b4d7e1..00000000 --- a/diagnose_live_status.sql +++ /dev/null @@ -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; diff --git a/diagnose_live_status_issue.md b/diagnose_live_status_issue.md deleted file mode 100644 index ea522583..00000000 --- a/diagnose_live_status_issue.md +++ /dev/null @@ -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 事件。 diff --git a/diagnose_menu_404.sql b/diagnose_menu_404.sql deleted file mode 100644 index 92e436fe..00000000 --- a/diagnose_menu_404.sql +++ /dev/null @@ -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%'; diff --git a/diagnose_streamer_stats_detail.sql b/diagnose_streamer_stats_detail.sql deleted file mode 100644 index d2bec0c0..00000000 --- a/diagnose_streamer_stats_detail.sql +++ /dev/null @@ -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; diff --git a/fan_group_chat_upgrade.sql b/fan_group_chat_upgrade.sql deleted file mode 100644 index 4d29c90c..00000000 --- a/fan_group_chat_upgrade.sql +++ /dev/null @@ -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; diff --git a/final_fix_gift_menu.sql b/final_fix_gift_menu.sql deleted file mode 100644 index 7d4516cb..00000000 --- a/final_fix_gift_menu.sql +++ /dev/null @@ -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 = '礼物打赏'; diff --git a/final_move_gift_to_live.sql b/final_move_gift_to_live.sql deleted file mode 100644 index 13e8fb48..00000000 --- a/final_move_gift_to_live.sql +++ /dev/null @@ -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 = '礼物打赏'; diff --git a/find_existing_gift_tables.sql b/find_existing_gift_tables.sql deleted file mode 100644 index 2262c45d..00000000 --- a/find_existing_gift_tables.sql +++ /dev/null @@ -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; diff --git a/fix_404_remove_gift_from_live.sql b/fix_404_remove_gift_from_live.sql deleted file mode 100644 index 54f9b116..00000000 --- a/fix_404_remove_gift_from_live.sql +++ /dev/null @@ -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; diff --git a/fix_balance_display.sql b/fix_balance_display.sql deleted file mode 100644 index 1cbb4d4a..00000000 --- a/fix_balance_display.sql +++ /dev/null @@ -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; diff --git a/fix_fan_group_chat.sql b/fix_fan_group_chat.sql deleted file mode 100644 index 0cb50124..00000000 --- a/fix_fan_group_chat.sql +++ /dev/null @@ -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; diff --git a/fix_fan_group_menu.sql b/fix_fan_group_menu.sql deleted file mode 100644 index dcc175ee..00000000 --- a/fix_fan_group_menu.sql +++ /dev/null @@ -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 --- 如果想使用这个,需要确保前端路由配置正确 diff --git a/fix_follow_feature.bat b/fix_follow_feature.bat deleted file mode 100644 index aaf692d8..00000000 --- a/fix_follow_feature.bat +++ /dev/null @@ -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 diff --git a/fix_follow_feature.sh b/fix_follow_feature.sh deleted file mode 100644 index ed8fd732..00000000 --- a/fix_follow_feature.sh +++ /dev/null @@ -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 diff --git a/fix_follow_status.sql b/fix_follow_status.sql deleted file mode 100644 index e37719b6..00000000 --- a/fix_follow_status.sql +++ /dev/null @@ -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; diff --git a/fix_gift_menu_complete.sql b/fix_gift_menu_complete.sql deleted file mode 100644 index 845ed3ed..00000000 --- a/fix_gift_menu_complete.sql +++ /dev/null @@ -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; diff --git a/fix_gift_menu_final.sql b/fix_gift_menu_final.sql deleted file mode 100644 index 7a3fb295..00000000 --- a/fix_gift_menu_final.sql +++ /dev/null @@ -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; diff --git a/fix_gift_menu_paths.sql b/fix_gift_menu_paths.sql deleted file mode 100644 index 6153b6e8..00000000 --- a/fix_gift_menu_paths.sql +++ /dev/null @@ -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; diff --git a/fix_like_count_field.sql b/fix_like_count_field.sql deleted file mode 100644 index d4db2e12..00000000 --- a/fix_like_count_field.sql +++ /dev/null @@ -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; diff --git a/fix_live_auto_start.md b/fix_live_auto_start.md deleted file mode 100644 index e69de29b..00000000 diff --git a/fix_live_menu_404.sql b/fix_live_menu_404.sql deleted file mode 100644 index 8704549f..00000000 --- a/fix_live_menu_404.sql +++ /dev/null @@ -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; diff --git a/fix_live_room_like_table.sql b/fix_live_room_like_table.sql deleted file mode 100644 index 1a507de9..00000000 --- a/fix_live_room_like_table.sql +++ /dev/null @@ -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; diff --git a/fix_recharge_bill.sql b/fix_recharge_bill.sql deleted file mode 100644 index acf3d8be..00000000 --- a/fix_recharge_bill.sql +++ /dev/null @@ -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; diff --git a/fix_srs_callback.sh b/fix_srs_callback.sh deleted file mode 100644 index 3d00b563..00000000 --- a/fix_srs_callback.sh +++ /dev/null @@ -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]" diff --git a/follow_record_table.sql b/follow_record_table.sql deleted file mode 100644 index 04751170..00000000 --- a/follow_record_table.sql +++ /dev/null @@ -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; diff --git a/follow_tables.sql b/follow_tables.sql deleted file mode 100644 index 7d41d9f6..00000000 --- a/follow_tables.sql +++ /dev/null @@ -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='用户关注表'; diff --git a/friend_tables.sql b/friend_tables.sql deleted file mode 100644 index fb2fc81b..00000000 --- a/friend_tables.sql +++ /dev/null @@ -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='私聊会话表'; diff --git a/group_tables.sql b/group_tables.sql deleted file mode 100644 index 5caa8602..00000000 --- a/group_tables.sql +++ /dev/null @@ -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='群消息已读记录表'; diff --git a/insert_gift_menus_correct.sql b/insert_gift_menus_correct.sql deleted file mode 100644 index 745a0943..00000000 --- a/insert_gift_menus_correct.sql +++ /dev/null @@ -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; diff --git a/insert_test_users.sql b/insert_test_users.sql deleted file mode 100644 index 9999a107..00000000 --- a/insert_test_users.sql +++ /dev/null @@ -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; diff --git a/keep_gift_independent.sql b/keep_gift_independent.sql deleted file mode 100644 index 15be9cfd..00000000 --- a/keep_gift_independent.sql +++ /dev/null @@ -1,7 +0,0 @@ --- 保持礼物打赏为独立菜单(最简单可靠的方案) - -UPDATE eb_system_menu -SET pid = 0, sort = 51 -WHERE name = '礼物打赏'; - -SELECT '礼物打赏已恢复为独立菜单,可以正常使用' as message; diff --git a/live_room_like_tables.sql b/live_room_like_tables.sql deleted file mode 100644 index e7519c33..00000000 --- a/live_room_like_tables.sql +++ /dev/null @@ -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; diff --git a/migrate_follow_data.sql b/migrate_follow_data.sql deleted file mode 100644 index 9f4a67d0..00000000 --- a/migrate_follow_data.sql +++ /dev/null @@ -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; diff --git a/move_gift_to_live_correctly.sql b/move_gift_to_live_correctly.sql deleted file mode 100644 index 8b7c0c94..00000000 --- a/move_gift_to_live_correctly.sql +++ /dev/null @@ -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; diff --git a/move_gift_to_live_manage.sql b/move_gift_to_live_manage.sql deleted file mode 100644 index 3fbbed32..00000000 --- a/move_gift_to_live_manage.sql +++ /dev/null @@ -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; diff --git a/quick_check_data.sql b/quick_check_data.sql deleted file mode 100644 index 505d6fe1..00000000 --- a/quick_check_data.sql +++ /dev/null @@ -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; diff --git a/quick_test_gift_system.sql b/quick_test_gift_system.sql deleted file mode 100644 index 5546cd0e..00000000 --- a/quick_test_gift_system.sql +++ /dev/null @@ -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()); diff --git a/rebuild_backend_gift.bat b/rebuild_backend_gift.bat deleted file mode 100644 index 1f275b32..00000000 --- a/rebuild_backend_gift.bat +++ /dev/null @@ -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 diff --git a/restart_frontend.bat b/restart_frontend.bat deleted file mode 100644 index d918a1f1..00000000 --- a/restart_frontend.bat +++ /dev/null @@ -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 diff --git a/restore_gift_menu.sql b/restore_gift_menu.sql deleted file mode 100644 index b9d1e1c9..00000000 --- a/restore_gift_menu.sql +++ /dev/null @@ -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 = '礼物打赏'; diff --git a/room_category_table.sql b/room_category_table.sql deleted file mode 100644 index 503c2680..00000000 --- a/room_category_table.sql +++ /dev/null @@ -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`; diff --git a/run_emulator.bat b/run_emulator.bat deleted file mode 100644 index 443a7a7f..00000000 --- a/run_emulator.bat +++ /dev/null @@ -1,75 +0,0 @@ -@echo off -setlocal -chcp 65001 >nul - -set "ROOT=%~dp0" - -if "%JAVA_HOME%"=="" ( - if exist "%ProgramFiles%\Android\Android Studio\jbr" set "JAVA_HOME=%ProgramFiles%\Android\Android Studio\jbr" -) -if not "%JAVA_HOME%"=="" set "PATH=%JAVA_HOME%\bin;%PATH%" -where java >nul 2>&1 -if errorlevel 1 ( - echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - echo Please install JDK 17 and set JAVA_HOME, then reopen terminal and rerun. - exit /b 1 -) - -set "GRADLE_BAT=" -for /f "delims=" %%G in ('where gradle.bat 2^>nul') do set "GRADLE_BAT=%%G" -if "%GRADLE_BAT%"=="" ( - for /f "delims=" %%G in ('where gradle 2^>nul') do set "GRADLE_BAT=%%G" -) -if "%GRADLE_BAT%"=="" ( - set "GRADLE_BAT=D:\soft\gradle-8.1\bin\gradle.bat" - if not exist "%GRADLE_BAT%" set "GRADLE_BAT=D:\soft\gradle-8.1-bin\bin\gradle.bat" - if not exist "%GRADLE_BAT%" set "GRADLE_BAT=D:\soft\gradle-8.1-bin\gradle-8.1\bin\gradle.bat" -) - -if "%GRADLE_BAT%"=="" ( - echo Gradle not found in PATH. - echo Please install Gradle 8.x and ensure 'gradle' is available in PATH, then rerun. - exit /b 1 -) -if not exist "%GRADLE_BAT%" ( - echo Gradle not found: %GRADLE_BAT% - echo Please update GRADLE_BAT in run_emulator.bat to point to your gradle.bat, e.g. D:\soft\gradle-8.1\bin\gradle.bat - exit /b 1 -) - -where npm >nul 2>&1 -if errorlevel 1 ( - echo npm not found in PATH - exit /b 1 -) - -echo Starting backend in a new window... -start "live-backend" cmd /k "cd /d ""%ROOT%archive\extras\live-streaming"" ^&^& if not exist node_modules (npm install) ^&^& set PORT=3001 ^&^& set PUBLIC_SRS_HOST=10.0.2.2 ^&^& set PUBLIC_SRS_RTMP_PORT=1935 ^&^& set PUBLIC_SRS_HTTP_PORT=8080 ^&^& npm run dev" - -echo Preparing Android project (wrapper/build/install)... -pushd "%ROOT%android-app" - -if not exist gradlew.bat ( - call "%GRADLE_BAT%" wrapper --gradle-version 8.1 - if errorlevel 1 ( - popd - exit /b 1 - ) - if not exist gradlew.bat ( - echo Failed to generate gradlew.bat. Please ensure JAVA_HOME points to a valid JDK 17 installation. - popd - exit /b 1 - ) -) - -call "%CD%\gradlew.bat" :app:installDebug -if errorlevel 1 ( - popd - exit /b 1 -) - -popd - -echo. -echo Installed. Make sure your Android Emulator is running, then open the app "Live Streaming". -endlocal diff --git a/simple_gift_menu_records_only.sql b/simple_gift_menu_records_only.sql deleted file mode 100644 index 5dd4b8b8..00000000 --- a/simple_gift_menu_records_only.sql +++ /dev/null @@ -1,17 +0,0 @@ --- 简化版:只添加打赏记录菜单(最重要的功能) - --- 删除所有礼物相关菜单 -DELETE FROM eb_system_menu WHERE name LIKE '%礼物%'; - --- 只添加打赏记录菜单(作为一级菜单,不需要子菜单) -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, pid, name, component, menu_type FROM eb_system_menu WHERE name = '礼物打赏'; - -SELECT '简化菜单创建完成!刷新浏览器后,点击"礼物打赏"直接进入打赏记录页面' as message; diff --git a/streamer_menu.sql b/streamer_menu.sql deleted file mode 100644 index ee1a9b05..00000000 --- a/streamer_menu.sql +++ /dev/null @@ -1,74 +0,0 @@ --- 主播管理菜单配置 --- 请在数据库中执行此脚本 - --- 1. 首先查找直播管理的菜单ID -SELECT id, pid, name, component FROM eb_system_menu WHERE name = '直播管理' OR component LIKE '%liveManage%'; - --- 2. 查找直播管理下的子菜单,确认结构 -SELECT id, pid, name, component, sort FROM eb_system_menu WHERE pid IN ( - SELECT id FROM eb_system_menu WHERE name = '直播管理' OR component LIKE '%liveManage%' -) ORDER BY sort DESC; - --- 3. 添加主播管理菜单(需要根据上面查询结果修改 pid 值) --- 假设直播管理的菜单ID是 @live_manage_id,请根据实际查询结果替换 - --- 方式一:如果知道直播管理的ID(例如是 XXX),直接插入 --- INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`) --- VALUES (XXX, '主播管理', '', 'admin:streamer:list', '/liveManage/streamer/list', 'C', 10, 1, 0, NOW(), NOW()); - --- 方式二:使用变量(推荐) -SET @live_manage_id = (SELECT id FROM eb_system_menu WHERE name = '直播管理' LIMIT 1); - --- 检查是否已存在主播管理菜单 -SELECT * FROM eb_system_menu WHERE name = '主播管理' AND pid = @live_manage_id; - --- 如果不存在,插入主播管理菜单 -INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`) -SELECT @live_manage_id, '主播管理', '', 'admin:streamer:list', '/liveManage/streamer/list', 'C', 5, 1, 0, NOW(), NOW() -FROM DUAL -WHERE NOT EXISTS (SELECT 1 FROM eb_system_menu WHERE name = '主播管理' AND pid = @live_manage_id); - --- 4. 获取新插入的菜单ID -SET @streamer_menu_id = (SELECT id FROM eb_system_menu WHERE name = '主播管理' AND pid = @live_manage_id LIMIT 1); - --- 5. 添加主播管理的权限按钮(可选) -INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`) -SELECT @streamer_menu_id, '主播列表', '', 'admin:streamer:list', '', 'A', 1, 1, 0, NOW(), NOW() -FROM DUAL -WHERE @streamer_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM eb_system_menu WHERE perms = 'admin:streamer:list' AND menu_type = 'A'); - -INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`) -SELECT @streamer_menu_id, '主播详情', '', 'admin:streamer:detail', '', 'A', 2, 1, 0, NOW(), NOW() -FROM DUAL -WHERE @streamer_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM eb_system_menu WHERE perms = 'admin:streamer:detail'); - -INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`) -SELECT @streamer_menu_id, '封禁主播', '', 'admin:streamer:ban', '', 'A', 3, 1, 0, NOW(), NOW() -FROM DUAL -WHERE @streamer_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM eb_system_menu WHERE perms = 'admin:streamer:ban'); - -INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`, `is_delte`, `create_time`, `update_time`) -SELECT @streamer_menu_id, '解封主播', '', 'admin:streamer:unban', '', 'A', 4, 1, 0, NOW(), NOW() -FROM DUAL -WHERE @streamer_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM eb_system_menu WHERE perms = 'admin:streamer:unban'); - --- 6. 给超级管理员角色分配权限(角色ID通常是1) --- 先查询角色菜单关联表 -SELECT * FROM eb_system_role_menu WHERE rid = 1 ORDER BY menu_id DESC LIMIT 10; - --- 添加菜单权限到超级管理员角色 -INSERT IGNORE INTO eb_system_role_menu (rid, menu_id) -SELECT 1, id FROM eb_system_menu WHERE name = '主播管理' OR perms LIKE 'admin:streamer:%'; - --- 7. 验证结果 -SELECT m.id, m.pid, m.name, m.perms, m.component, m.menu_type -FROM eb_system_menu m -WHERE m.name = '主播管理' OR m.perms LIKE 'admin:streamer:%' -ORDER BY m.id; - --- 8. 清除Redis缓存(需要在Redis中执行) --- DEL menuList - --- 提示:执行完SQL后,需要清除Redis缓存才能看到新菜单 --- 可以在Redis中执行: DEL menuList --- 或者重启后端服务 diff --git a/streamer_tables.sql b/streamer_tables.sql deleted file mode 100644 index 2ab639b0..00000000 --- a/streamer_tables.sql +++ /dev/null @@ -1,61 +0,0 @@ --- 主播认证系统数据库表 --- 请在服务器数据库中执行此脚本 - --- 1. 在用户表中添加主播相关字段 --- 注意:如果字段已存在会报错,可以忽略 - --- 添加主播认证状态字段 -ALTER TABLE `eb_user` ADD COLUMN `is_streamer` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否是认证主播:0-否 1-是'; - --- 添加主播认证时间 -ALTER TABLE `eb_user` ADD COLUMN `streamer_certified_time` datetime DEFAULT NULL COMMENT '主播认证时间'; - --- 添加主播等级 -ALTER TABLE `eb_user` ADD COLUMN `streamer_level` int(11) NOT NULL DEFAULT 0 COMMENT '主播等级:0-普通 1-初级 2-中级 3-高级 4-金牌'; - --- 添加主播简介 -ALTER TABLE `eb_user` ADD COLUMN `streamer_intro` varchar(500) DEFAULT NULL COMMENT '主播简介'; - --- 添加主播标签 -ALTER TABLE `eb_user` ADD COLUMN `streamer_tags` varchar(200) DEFAULT NULL COMMENT '主播标签,逗号分隔'; - --- 2. 主播认证申请表 -CREATE TABLE IF NOT EXISTS `eb_streamer_application` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '申请ID', - `user_id` int(11) NOT NULL COMMENT '用户ID', - `real_name` varchar(50) NOT NULL COMMENT '真实姓名', - `id_card` varchar(20) NOT NULL COMMENT '身份证号', - `id_card_front` varchar(500) DEFAULT NULL COMMENT '身份证正面照片', - `id_card_back` varchar(500) DEFAULT NULL COMMENT '身份证背面照片', - `intro` varchar(500) DEFAULT NULL COMMENT '主播简介', - `experience` varchar(1000) DEFAULT NULL COMMENT '直播经验描述', - `category_ids` varchar(100) DEFAULT NULL COMMENT '擅长分类ID,逗号分隔', - `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态:0-待审核 1-审核通过 2-审核拒绝', - `reject_reason` varchar(200) DEFAULT NULL COMMENT '拒绝原因', - `reviewer_id` int(11) DEFAULT NULL COMMENT '审核人ID', - `review_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`), - KEY `idx_user_id` (`user_id`), - KEY `idx_status` (`status`), - KEY `idx_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='主播认证申请表'; - --- 3. 主播封禁记录表 -CREATE TABLE IF NOT EXISTS `eb_streamer_ban` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID', - `user_id` int(11) NOT NULL COMMENT '主播用户ID', - `ban_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '封禁类型:1-临时封禁 2-永久封禁', - `ban_reason` varchar(500) NOT NULL COMMENT '封禁原因', - `ban_start_time` datetime NOT NULL COMMENT '封禁开始时间', - `ban_end_time` datetime DEFAULT NULL COMMENT '封禁结束时间(永久封禁为空)', - `operator_id` int(11) NOT NULL COMMENT '操作人ID', - `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否生效:0-已解除 1-生效中', - `unban_time` datetime DEFAULT NULL COMMENT '解封时间', - `unban_operator_id` int(11) DEFAULT NULL COMMENT '解封操作人ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_is_active` (`is_active`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='主播封禁记录表'; diff --git a/test_balance_api.bat b/test_balance_api.bat deleted file mode 100644 index a4a58182..00000000 --- a/test_balance_api.bat +++ /dev/null @@ -1,25 +0,0 @@ -@echo off -echo ======================================== -echo 测试余额API -echo ======================================== -echo. - -echo 测试用户ID: 43 -echo API地址: http://1.15.149.240:8080/api/front/virtual-currency/balance -echo. - -echo [1] 测试获取余额API(需要token) -echo. -echo 请先在APP中登录,然后查看logcat日志: -echo adb logcat -s WalletActivity:D -echo. -echo 或者使用curl测试(需要替换YOUR_TOKEN): -echo curl -H "Authorization: Bearer YOUR_TOKEN" http://1.15.149.240:8080/api/front/virtual-currency/balance -echo. - -echo [2] 检查数据库中的余额 -echo 连接数据库执行: -echo SELECT uid, account, nickname, now_money FROM eb_user WHERE uid = 43; -echo. - -pause diff --git a/test_balance_api.sql b/test_balance_api.sql deleted file mode 100644 index c03b4ef3..00000000 --- a/test_balance_api.sql +++ /dev/null @@ -1,20 +0,0 @@ --- 测试余额API - 检查用户余额数据 - --- 1. 查看测试用户的余额 -SELECT uid, account, nickname, now_money, integral -FROM eb_user -WHERE uid IN (43, 44, 45, 46) -ORDER BY uid; - --- 2. 检查now_money字段是否存在 -SHOW COLUMNS FROM eb_user LIKE 'now_money'; - --- 3. 给测试用户添加一些余额(如果为0) -UPDATE eb_user -SET now_money = 1000.00 -WHERE uid = 43 AND now_money = 0; - --- 4. 再次查看余额 -SELECT uid, account, nickname, now_money -FROM eb_user -WHERE uid = 43; diff --git a/test_follow_manually.sql b/test_follow_manually.sql deleted file mode 100644 index fc29634e..00000000 --- a/test_follow_manually.sql +++ /dev/null @@ -1,56 +0,0 @@ --- 手动测试关注功能 --- 请根据实际情况修改用户ID - --- 假设: --- 用户A (uid=1) 关注 用户B (uid=2) - --- 1. 查看用户信息 -SELECT uid, nickname, phone, is_streamer FROM eb_user WHERE uid IN (1, 2); - --- 2. 手动插入一条关注记录到 eb_follow_record -INSERT INTO eb_follow_record ( - follower_id, - follower_nickname, - follower_phone, - followed_id, - followed_nickname, - followed_phone, - follow_status, - is_deleted -) -SELECT - 1 as follower_id, - u1.nickname as follower_nickname, - u1.phone as follower_phone, - 2 as followed_id, - u2.nickname as followed_nickname, - u2.phone as followed_phone, - 1 as follow_status, - 0 as is_deleted -FROM eb_user u1, eb_user u2 -WHERE u1.uid = 1 AND u2.uid = 2; - --- 3. 验证插入结果 -SELECT * FROM eb_follow_record WHERE follower_id = 1 AND followed_id = 2; - --- 4. 测试查询关注状态 -SELECT COUNT(*) as is_following -FROM eb_follow_record -WHERE follower_id = 1 - AND followed_id = 2 - AND follow_status = 1 - AND is_deleted = 0; - --- 5. 测试统计粉丝数 -SELECT COUNT(*) as fans_count -FROM eb_follow_record -WHERE followed_id = 2 - AND follow_status = 1 - AND is_deleted = 0; - --- 6. 测试统计关注数 -SELECT COUNT(*) as following_count -FROM eb_follow_record -WHERE follower_id = 1 - AND follow_status = 1 - AND is_deleted = 0; diff --git a/test_gift_api.md b/test_gift_api.md deleted file mode 100644 index b526c9a4..00000000 --- a/test_gift_api.md +++ /dev/null @@ -1,59 +0,0 @@ -# 测试礼物管理API - -## 1. 测试后端接口 - -在浏览器中打开开发者工具(F12),然后访问礼物管理页面,查看Network标签页中的请求: - -### 检查请求 -- URL: `/api/admin/gift/list?page=1&limit=20` -- Method: GET -- Status: 应该是 200 - -### 检查响应格式 -后端应该返回这样的格式: -```json -{ - "code": 200, - "message": "success", - "data": { - "list": [...], - "total": 20, - "page": 1, - "limit": 20, - "totalPage": 1 - } -} -``` - -## 2. 如果返回格式不对 - -检查后端日志,看是否有错误信息。 - -## 3. 直接测试SQL - -在数据库中执行: -```sql -SELECT id, name, image, diamond_price as diamondPrice, intimacy, status, - is_heartbeat as isHeartbeat, buy_type as buyType, belong, remark, - level, sort, create_time as createTime, update_time as updateTime -FROM eb_gift -WHERE is_deleted = 0 -ORDER BY sort ASC, id DESC -LIMIT 20 OFFSET 0; -``` - -应该能看到20条礼物记录。 - -## 4. 常见问题 - -### 问题1: 404错误 -- 确认后端服务已重启 -- 确认GiftAdminController已编译 - -### 问题2: 数据为空 -- 检查数据库中是否有数据 -- 检查is_deleted字段是否都是0 - -### 问题3: 前端报错 -- 清除浏览器缓存 -- 重新构建前端:`npm run build:prod` diff --git a/test_srs_callback.bat b/test_srs_callback.bat deleted file mode 100644 index dc3e2062..00000000 --- a/test_srs_callback.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off -echo 测试 SRS 回调接口 -echo. - -REM 测试 on_publish 回调(开播) -echo 1. 测试开播回调... -curl -X POST "http://1.15.149.240:8081/api/front/live/srs/on_publish" -H "Content-Type: application/json" -d "{\"stream\":\"8eda93d7d01244a8aeebe493d948eb1c\"}" -echo. -echo. - -echo 2. 检查数据库状态... -echo 请在数据库中执行: SELECT id, title, is_live FROM eb_live_room WHERE id = 45; -echo. - -pause diff --git a/test_streamer_api.bat b/test_streamer_api.bat deleted file mode 100644 index ddc55f6f..00000000 --- a/test_streamer_api.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo off -echo ======================================== -echo 测试主播统计API -echo ======================================== - -echo. -echo 测试后台管理API: /api/admin/streamer/list -echo. - -curl -X GET "http://1.15.149.240:8080/api/admin/streamer/list?page=1&limit=10" ^ - -H "Content-Type: application/json" ^ - | jq . - -echo. -echo ======================================== -echo 测试完成 -echo ======================================== -pause diff --git a/test_streamer_stats.sql b/test_streamer_stats.sql deleted file mode 100644 index 6bbb4152..00000000 --- a/test_streamer_stats.sql +++ /dev/null @@ -1,126 +0,0 @@ --- 测试主播统计数据 --- 用于验证粉丝数、关注数等统计是否正确 - --- 1. 查看所有主播用户 -SELECT uid, nickname, is_streamer, streamer_level, phone -FROM eb_user -WHERE is_streamer = 1 -ORDER BY uid; - --- 2. 查看关注记录表的数据 -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 -LIMIT 20; - --- 3. 统计每个用户的粉丝数(有多少人关注了我) -SELECT - u.uid, - u.nickname, - u.is_streamer, - COUNT(fr.id) as fans_count -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; - --- 4. 统计每个用户的关注数(我关注了多少人) -SELECT - u.uid, - u.nickname, - u.is_streamer, - COUNT(fr.id) as following_count -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 -WHERE u.is_streamer = 1 -GROUP BY u.uid, u.nickname, u.is_streamer -ORDER BY following_count DESC; - --- 5. 查看某个特定主播的详细统计(替换 USER_ID 为实际的用户ID) -SET @USER_ID = 1; - -SELECT - '粉丝数' as stat_type, - COUNT(*) as count -FROM eb_follow_record -WHERE followed_id = @USER_ID - AND follow_status IN ('1', '关注') - AND is_deleted = 0 - -UNION ALL - -SELECT - '关注数' as stat_type, - COUNT(*) as count -FROM eb_follow_record -WHERE follower_id = @USER_ID - AND follow_status IN ('1', '关注') - AND is_deleted = 0 - -UNION ALL - -SELECT - '直播间数' as stat_type, - COUNT(*) as count -FROM eb_live_room -WHERE uid = @USER_ID - -UNION ALL - -SELECT - '正在直播' as stat_type, - COUNT(*) as count -FROM eb_live_room -WHERE uid = @USER_ID - AND is_live = 1; - --- 6. 查看谁关注了某个主播 -SELECT - fr.follower_id, - u.nickname as follower_nickname, - fr.follow_status, - fr.create_time -FROM eb_follow_record fr -LEFT JOIN eb_user u ON fr.follower_id = u.uid -WHERE fr.followed_id = @USER_ID - AND fr.follow_status IN ('1', '关注') - AND fr.is_deleted = 0 -ORDER BY fr.create_time DESC; - --- 7. 查看某个主播关注了谁 -SELECT - fr.followed_id, - u.nickname as followed_nickname, - 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 = @USER_ID - AND fr.follow_status IN ('1', '关注') - AND fr.is_deleted = 0 -ORDER BY fr.create_time DESC; - --- 8. 检查关注状态的数据类型和值 -SELECT - follow_status, - COUNT(*) as count, - GROUP_CONCAT(DISTINCT CONCAT('ID:', id) SEPARATOR ', ') as sample_ids -FROM eb_follow_record -GROUP BY follow_status; - --- 9. 修复可能的数据问题:将字符串状态统一为数字 --- UPDATE eb_follow_record SET follow_status = '1' WHERE follow_status = '关注'; --- UPDATE eb_follow_record SET follow_status = '0' WHERE follow_status = '取消关注'; diff --git a/test_user_43_follow.sql b/test_user_43_follow.sql deleted file mode 100644 index b6bdcdbb..00000000 --- a/test_user_43_follow.sql +++ /dev/null @@ -1,98 +0,0 @@ --- 测试用户 43 (xiaofeng) 的关注页面 --- 该用户关注了用户 41 (夏至已至),而用户 41 有一个正在直播的房间 - -SET @USER_ID = 43; - --- 1. 查看用户 43 关注了哪些人 -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; - --- 2. 查看用户 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, - 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; - --- 3. 查看用户 43 关注的主播中,哪些正在直播 -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.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; - --- 4. 诊断:为什么可能看不到 --- 检查关注状态的值 -SELECT - '关注状态检查' as check_type, - follow_status, - COUNT(*) as count -FROM eb_follow_record -WHERE follower_id = @USER_ID -GROUP BY follow_status; - --- 5. 检查被关注用户的主播状态 -SELECT - '被关注用户检查' as check_type, - u.uid, - u.nickname, - u.is_streamer, - fr.follow_status -FROM eb_follow_record fr -LEFT JOIN eb_user u ON fr.followed_id = u.uid -WHERE fr.follower_id = @USER_ID; - --- 6. 检查直播间的 uid 关联 -SELECT - '直播间关联检查' as check_type, - lr.id as room_id, - lr.title, - lr.uid as room_uid, - lr.is_live, - u.uid as user_uid, - u.nickname, - u.is_streamer -FROM eb_live_room lr -LEFT JOIN eb_user u ON lr.uid = u.uid -WHERE lr.uid IN ( - SELECT followed_id - FROM eb_follow_record - WHERE follower_id = @USER_ID - AND follow_status IN ('1', '关注') - AND is_deleted = 0 -); diff --git a/update_gift_reward_menu.sql b/update_gift_reward_menu.sql deleted file mode 100644 index cc9057f8..00000000 --- a/update_gift_reward_menu.sql +++ /dev/null @@ -1,37 +0,0 @@ --- 更新现有的"打赏记录"菜单,使用我们新创建的页面 - --- 1. 查看现有的打赏记录菜单 -SELECT id, pid, name, component, menu_type, is_show -FROM eb_system_menu -WHERE name LIKE '%打赏%' OR name LIKE '%记录%' -AND is_delte = 0 -ORDER BY pid, sort; - --- 2. 找到"打赏记录"菜单(ID应该是633,在礼物打赏管理532下) --- 更新它的component为我们新创建的页面 -UPDATE eb_system_menu -SET component = 'gift/records/index', - name = '礼物打赏记录', - update_time = NOW() -WHERE id = 633; - --- 3. 验证更新 -SELECT id, pid, name, component, menu_type, is_show -FROM eb_system_menu -WHERE id = 633; - --- 4. 确保父菜单(礼物打赏管理)是显示的 -UPDATE eb_system_menu -SET is_show = 1 -WHERE id = 532; - --- 5. 查看更新后的菜单结构 -SELECT - m1.id as parent_id, - m1.name as parent_name, - m2.id as child_id, - m2.name as child_name, - m2.component -FROM eb_system_menu m1 -LEFT JOIN eb_system_menu m2 ON m1.id = m2.pid -WHERE m1.id = 532 AND m1.is_delte = 0; diff --git a/update_test_users.sql b/update_test_users.sql deleted file mode 100644 index 2d942a26..00000000 --- a/update_test_users.sql +++ /dev/null @@ -1,169 +0,0 @@ --- ===================================================== --- 测试用户数据更新脚本 --- 为测试用户添加地址、生日、性别等信息 --- 表名: eb_user --- ===================================================== - --- 张吉惟 - 男,广东深圳,1995年生 -UPDATE eb_user SET - addres = '广东-深圳', - birthday = '1995-03-15', - sex = 1, - mark = '热爱生活,喜欢交友' -WHERE nickname = '张吉惟'; - --- 林国瑞 - 男,浙江杭州,1993年生 -UPDATE eb_user SET - addres = '浙江-杭州', - birthday = '1993-07-22', - sex = 1, - mark = '程序员一枚,爱好游戏' -WHERE nickname = '林国瑞'; - --- 林玟书 - 女,上海,1997年生 -UPDATE eb_user SET - addres = '上海-浦东', - birthday = '1997-11-08', - sex = 2, - mark = '喜欢阅读和旅行' -WHERE nickname = '林玟书'; - --- 林雅南 - 女,福建厦门,1996年生 -UPDATE eb_user SET - addres = '福建-厦门', - birthday = '1996-05-20', - sex = 2, - mark = '文艺青年,爱好摄影' -WHERE nickname = '林雅南'; - --- 江奕云 - 女,江苏南京,1998年生 -UPDATE eb_user SET - addres = '江苏-南京', - birthday = '1998-09-12', - sex = 2, - mark = '大学生,喜欢音乐' -WHERE nickname = '江奕云'; - --- 刘柏宏 - 男,北京,1992年生 -UPDATE eb_user SET - addres = '北京-朝阳', - birthday = '1992-01-28', - sex = 1, - mark = '创业者,热爱运动' -WHERE nickname = '刘柏宏'; - --- 阮建安 - 男,广西南宁,1994年生 -UPDATE eb_user SET - addres = '广西-南宁', - birthday = '1994-06-18', - sex = 1, - mark = '本地人,喜欢美食' -WHERE nickname = '阮建安'; - --- 林子帆 - 男,四川成都,1996年生 -UPDATE eb_user SET - addres = '四川-成都', - birthday = '1996-12-05', - sex = 1, - mark = '吃货一枚,爱好电竞' -WHERE nickname = '林子帆'; - --- 夏志豪 - 男,湖北武汉,1995年生 -UPDATE eb_user SET - addres = '湖北-武汉', - birthday = '1995-08-30', - sex = 1, - mark = '大学老师,喜欢篮球' -WHERE nickname = '夏志豪'; - --- 吉茹定 - 女,陕西西安,1997年生 -UPDATE eb_user SET - addres = '陕西-西安', - birthday = '1997-04-16', - sex = 2, - mark = '历史爱好者,喜欢古风' -WHERE nickname = '吉茹定'; - --- 李中冰 - 男,山东青岛,1993年生 -UPDATE eb_user SET - addres = '山东-青岛', - birthday = '1993-10-25', - sex = 1, - mark = '海边长大,喜欢冲浪' -WHERE nickname = '李中冰'; - --- 黄文隆 - 男,广东广州,1994年生 -UPDATE eb_user SET - addres = '广东-广州', - birthday = '1994-02-14', - sex = 1, - mark = '设计师,热爱艺术' -WHERE nickname = '黄文隆'; - --- 谢彦文 - 男,重庆,1996年生 -UPDATE eb_user SET - addres = '重庆-渝中', - birthday = '1996-07-07', - sex = 1, - mark = '火锅爱好者,性格开朗' -WHERE nickname = '谢彦文'; - --- 傅智翔 - 男,浙江宁波,1995年生 -UPDATE eb_user SET - addres = '浙江-宁波', - birthday = '1995-11-19', - sex = 1, - mark = '金融从业者,喜欢投资' -WHERE nickname = '傅智翔'; - --- 洪振霞 - 女,福建福州,1998年生 -UPDATE eb_user SET - addres = '福建-福州', - birthday = '1998-03-08', - sex = 2, - mark = '护士,温柔善良' -WHERE nickname = '洪振霞'; - --- 刘姿婷 - 女,湖南长沙,1997年生 -UPDATE eb_user SET - addres = '湖南-长沙', - birthday = '1997-06-21', - sex = 2, - mark = '主播,喜欢唱歌跳舞' -WHERE nickname = '刘姿婷'; - --- 荣姿康 - 女,江西南昌,1996年生 -UPDATE eb_user SET - addres = '江西-南昌', - birthday = '1996-09-03', - sex = 2, - mark = '教师,喜欢小动物' -WHERE nickname = '荣姿康'; - --- 吕致盈 - 女,安徽合肥,1998年生 -UPDATE eb_user SET - addres = '安徽-合肥', - birthday = '1998-12-12', - sex = 2, - mark = '大学生,爱好绘画' -WHERE nickname = '吕致盈'; - --- 方一强 - 男,河南郑州,1994年生 -UPDATE eb_user SET - addres = '河南-郑州', - birthday = '1994-04-01', - sex = 1, - mark = '销售经理,热情开朗' -WHERE nickname = '方一强'; - --- ===================================================== --- 验证更新结果 --- ===================================================== -SELECT uid, nickname, sex, birthday, addres, mark -FROM eb_user -WHERE nickname IN ( - '张吉惟', '林国瑞', '林玟书', '林雅南', '江奕云', - '刘柏宏', '阮建安', '林子帆', '夏志豪', '吉茹定', - '李中冰', '黄文隆', '谢彦文', '傅智翔', '洪振霞', - '刘姿婷', '荣姿康', '吕致盈', '方一强' -); diff --git a/user_activity_tables.sql b/user_activity_tables.sql deleted file mode 100644 index b9552fd2..00000000 --- a/user_activity_tables.sql +++ /dev/null @@ -1,76 +0,0 @@ --- 用户活动记录相关表 --- 包括点赞记录和查看历史 - --- 1. 直播间点赞记录表 -CREATE TABLE IF NOT EXISTS `eb_live_room_like` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `user_id` int(11) NOT NULL COMMENT '用户ID', - `room_id` varchar(50) NOT NULL COMMENT '直播间ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '点赞时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_user_room` (`user_id`, `room_id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_room_id` (`room_id`), - KEY `idx_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播间点赞记录表'; - --- 2. 作品点赞记录表 -CREATE TABLE IF NOT EXISTS `eb_work_like` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `user_id` int(11) NOT NULL COMMENT '用户ID', - `work_id` bigint(20) NOT NULL COMMENT '作品ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '点赞时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_user_work` (`user_id`, `work_id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_work_id` (`work_id`), - KEY `idx_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='作品点赞记录表'; - --- 3. 心愿点赞记录表 -CREATE TABLE IF NOT EXISTS `eb_wish_like` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `user_id` int(11) NOT NULL COMMENT '用户ID', - `wish_id` bigint(20) NOT NULL COMMENT '心愿ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '点赞时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_user_wish` (`user_id`, `wish_id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_wish_id` (`wish_id`), - KEY `idx_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='心愿点赞记录表'; - --- 4. 查看历史记录表 -CREATE TABLE IF NOT EXISTS `eb_view_history` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `user_id` int(11) NOT NULL COMMENT '用户ID', - `target_type` varchar(20) NOT NULL COMMENT '目标类型:room-直播间, work-作品, profile-用户主页', - `target_id` varchar(50) NOT NULL COMMENT '目标ID', - `target_title` varchar(255) DEFAULT NULL COMMENT '目标标题', - `view_duration` int(11) DEFAULT 0 COMMENT '观看时长(秒)', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '查看时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_target` (`target_type`, `target_id`), - KEY `idx_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='查看历史记录表'; - --- 插入一些测试数据(可选) - --- 测试直播间点赞记录 --- INSERT INTO eb_live_room_like (user_id, room_id, create_time) --- VALUES --- (43, '8', '2026-01-03 14:30:00'), --- (43, '1', '2026-01-03 13:20:00'); - --- 测试查看历史记录 --- INSERT INTO eb_view_history (user_id, target_type, target_id, target_title, view_duration, create_time) --- VALUES --- (43, 'room', '8', '火影忍者', 1200, '2026-01-03 14:25:00'), --- (43, 'room', '1', '11', 300, '2026-01-03 13:15:00'), --- (43, 'profile', '41', '夏至已至', 60, '2026-01-03 14:19:00'); - --- 查询验证 --- SELECT * FROM eb_live_room_like WHERE user_id = 43; --- SELECT * FROM eb_view_history WHERE user_id = 43; diff --git a/verify_fans_count.sql b/verify_fans_count.sql deleted file mode 100644 index aed470a4..00000000 --- a/verify_fans_count.sql +++ /dev/null @@ -1,77 +0,0 @@ --- 快速验证粉丝数统计 --- 用于确认关注数据和统计逻辑是否正确 - --- 1. 查看所有主播 -SELECT - uid, - nickname, - phone, - is_streamer, - streamer_level -FROM eb_user -WHERE is_streamer = 1 -ORDER BY uid; - --- 2. 查看所有关注记录 -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; - --- 3. 统计每个主播的粉丝数(正确的统计方式) -SELECT - u.uid as '主播ID', - u.nickname as '主播昵称', - COUNT(fr.id) as '粉丝数' -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 -ORDER BY COUNT(fr.id) DESC; - --- 4. 查看具体某个主播的粉丝列表(替换 1 为实际的主播ID) -SELECT - fr.follower_id as '粉丝ID', - u.nickname as '粉丝昵称', - u.phone as '粉丝手机号', - fr.follow_status as '关注状态', - fr.create_time as '关注时间' -FROM eb_follow_record fr -LEFT JOIN eb_user u ON fr.follower_id = u.uid -WHERE fr.followed_id = 1 -- 替换为实际的主播ID - AND fr.follow_status IN ('1', '关注') - AND fr.is_deleted = 0 -ORDER BY fr.create_time DESC; - --- 5. 检查关注状态字段的值分布 -SELECT - follow_status as '状态值', - COUNT(*) as '记录数', - GROUP_CONCAT(DISTINCT id ORDER BY id LIMIT 5) as '示例ID' -FROM eb_follow_record -GROUP BY follow_status; - --- 6. 检查是否有被逻辑删除的记录 -SELECT - is_deleted as '删除标记', - COUNT(*) as '记录数' -FROM eb_follow_record -GROUP BY is_deleted; - --- 7. 如果发现状态值不一致,可以执行以下修复(谨慎执行) --- 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'; - --- 8. 测试插入一条关注记录(用于测试) --- 注意:需要替换为实际存在的用户ID --- INSERT INTO eb_follow_record (follower_id, follower_nickname, followed_id, followed_nickname, follow_status, is_deleted, create_time) --- VALUES (2, '测试用户', 1, '测试主播', '1', 0, NOW()); diff --git a/verify_gift_menu.sql b/verify_gift_menu.sql deleted file mode 100644 index 9ad612a6..00000000 --- a/verify_gift_menu.sql +++ /dev/null @@ -1,53 +0,0 @@ --- 验证礼物管理菜单是否正确添加 - --- 1. 查看礼物管理菜单 -SELECT - id, - pid, - name, - icon, - component, - menu_type, - sort, - is_show -FROM eb_system_menu -WHERE (name LIKE '%礼物%' OR pid IN (SELECT id FROM eb_system_menu WHERE name = '礼物管理')) -AND is_delte = 0 -ORDER BY pid, sort; - --- 2. 查看菜单层级结构 -SELECT - CONCAT(REPEAT(' ', CASE WHEN m.pid = 0 THEN 0 ELSE 1 END), m.name) as menu_tree, - m.id, - m.component, - m.menu_type, - m.is_show -FROM eb_system_menu m -WHERE (m.name = '礼物管理' OR m.pid = (SELECT id FROM eb_system_menu WHERE name = '礼物管理' LIMIT 1)) -AND m.is_delte = 0 -ORDER BY m.pid, m.sort; - --- 3. 查看管理员角色的礼物管理权限 -SELECT - r.id as role_id, - r.role_name, - m.id as menu_id, - m.name as menu_name, - m.component -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 '%礼物%' -AND r.id = 1; - --- 4. 查看礼物配置数据 -SELECT id, name, price, sort_order, is_enabled -FROM eb_gift_config -ORDER BY sort_order -LIMIT 10; - --- 5. 查看充值套餐数据 -SELECT id, amount, virtual_amount, bonus_amount, title, is_enabled -FROM eb_recharge_package -ORDER BY sort_order -LIMIT 10; diff --git a/verify_menu_after_fix.sql b/verify_menu_after_fix.sql deleted file mode 100644 index 6cafedd9..00000000 --- a/verify_menu_after_fix.sql +++ /dev/null @@ -1,20 +0,0 @@ --- 验证菜单修复后的状态 - -SELECT - '直播管理(参考)' as '对比', - m.id, - m.name, - m.component -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 3; - -SELECT - '礼物打赏(当前)' as '对比', - m.id, - m.name, - m.component -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; diff --git a/virtual_currency_and_gift_system.sql b/virtual_currency_and_gift_system.sql deleted file mode 100644 index 72963fd4..00000000 --- a/virtual_currency_and_gift_system.sql +++ /dev/null @@ -1,125 +0,0 @@ --- 虚拟货币和礼物系统数据库表 - --- 1. 用户虚拟货币余额表(扩展eb_user表的字段) --- 检查并添加virtual_balance字段 -SET @col_exists = 0; -SELECT COUNT(*) INTO @col_exists -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'eb_user' -AND COLUMN_NAME = 'virtual_balance'; - -SET @sql = IF(@col_exists = 0, - 'ALTER TABLE eb_user ADD COLUMN virtual_balance DECIMAL(10,2) DEFAULT 0.00 COMMENT ''虚拟货币余额''', - 'SELECT ''Column virtual_balance already exists'' AS message'); -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- 2. 虚拟货币充值记录表 -CREATE TABLE IF NOT EXISTS eb_virtual_currency_recharge ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '充值记录ID', - user_id INT NOT NULL COMMENT '用户ID', - order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单号', - amount DECIMAL(10,2) NOT NULL COMMENT '充值金额(人民币)', - virtual_amount DECIMAL(10,2) NOT NULL COMMENT '获得的虚拟货币数量', - payment_method VARCHAR(20) NOT NULL COMMENT '支付方式:alipay/wechat/balance', - payment_status TINYINT DEFAULT 0 COMMENT '支付状态:0-待支付,1-已支付,2-已取消', - transaction_id VARCHAR(100) COMMENT '第三方支付交易号', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - pay_time DATETIME COMMENT '支付时间', - INDEX idx_user_id (user_id), - INDEX idx_order_no (order_no), - INDEX idx_create_time (create_time) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='虚拟货币充值记录表'; - --- 3. 虚拟货币消费记录表 -CREATE TABLE IF NOT EXISTS eb_virtual_currency_transaction ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '交易记录ID', - user_id INT NOT NULL COMMENT '用户ID', - transaction_type VARCHAR(20) NOT NULL COMMENT '交易类型:recharge-充值,gift-送礼,refund-退款', - amount DECIMAL(10,2) NOT NULL COMMENT '交易金额(正数为收入,负数为支出)', - balance_after DECIMAL(10,2) NOT NULL COMMENT '交易后余额', - related_id INT COMMENT '关联ID(礼物记录ID、充值记录ID等)', - description VARCHAR(200) COMMENT '交易描述', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - INDEX idx_user_id (user_id), - INDEX idx_transaction_type (transaction_type), - INDEX idx_create_time (create_time) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='虚拟货币交易记录表'; - --- 4. 礼物配置表 -CREATE TABLE IF NOT EXISTS eb_gift_config ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '礼物ID', - name VARCHAR(50) NOT NULL COMMENT '礼物名称', - icon VARCHAR(200) NOT NULL COMMENT '礼物图标URL', - price DECIMAL(10,2) NOT NULL COMMENT '礼物价格(虚拟货币)', - animation VARCHAR(200) COMMENT '礼物动画效果', - sort_order INT DEFAULT 0 COMMENT '排序', - is_enabled TINYINT DEFAULT 1 COMMENT '是否启用:0-禁用,1-启用', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - INDEX idx_sort_order (sort_order) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='礼物配置表'; - --- 5. 礼物赠送记录表 -CREATE TABLE IF NOT EXISTS eb_gift_record ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '礼物记录ID', - sender_id INT NOT NULL COMMENT '送礼者ID', - receiver_id INT NOT NULL COMMENT '接收者ID(主播ID)', - room_id INT COMMENT '直播间ID', - gift_id INT NOT NULL COMMENT '礼物ID', - gift_name VARCHAR(50) NOT NULL COMMENT '礼物名称', - gift_icon VARCHAR(200) COMMENT '礼物图标', - gift_price DECIMAL(10,2) NOT NULL COMMENT '礼物价格', - quantity INT DEFAULT 1 COMMENT '数量', - total_price DECIMAL(10,2) NOT NULL COMMENT '总价格', - is_anonymous TINYINT DEFAULT 0 COMMENT '是否匿名:0-否,1-是', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - INDEX idx_sender_id (sender_id), - INDEX idx_receiver_id (receiver_id), - INDEX idx_room_id (room_id), - INDEX idx_create_time (create_time) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='礼物赠送记录表'; - --- 6. 充值套餐配置表 -CREATE TABLE IF NOT EXISTS eb_recharge_package ( - id INT PRIMARY KEY AUTO_INCREMENT COMMENT '套餐ID', - amount DECIMAL(10,2) NOT NULL COMMENT '充值金额(人民币)', - virtual_amount DECIMAL(10,2) NOT NULL COMMENT '获得的虚拟货币', - bonus_amount DECIMAL(10,2) DEFAULT 0 COMMENT '赠送的虚拟货币', - title VARCHAR(50) COMMENT '套餐标题', - description VARCHAR(200) COMMENT '套餐描述', - is_hot TINYINT DEFAULT 0 COMMENT '是否热门推荐', - sort_order INT DEFAULT 0 COMMENT '排序', - is_enabled TINYINT DEFAULT 1 COMMENT '是否启用', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - INDEX idx_sort_order (sort_order) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值套餐配置表'; - --- 插入默认充值套餐 -INSERT INTO eb_recharge_package (amount, virtual_amount, bonus_amount, title, description, is_hot, sort_order) VALUES -(6, 60, 0, '6元', '获得60虚拟币', 0, 1), -(30, 300, 30, '30元', '获得330虚拟币(赠送30)', 0, 2), -(68, 680, 88, '68元', '获得768虚拟币(赠送88)', 1, 3), -(128, 1280, 200, '128元', '获得1480虚拟币(赠送200)', 1, 4), -(328, 3280, 680, '328元', '获得3960虚拟币(赠送680)', 0, 5), -(648, 6480, 1520, '648元', '获得8000虚拟币(赠送1520)', 0, 6); - --- 插入默认礼物配置 -INSERT INTO eb_gift_config (name, icon, price, sort_order) VALUES -('玫瑰', 'https://example.com/gifts/rose.png', 1, 1), -('巧克力', 'https://example.com/gifts/chocolate.png', 5, 2), -('棒棒糖', 'https://example.com/gifts/lollipop.png', 10, 3), -('冰淇淋', 'https://example.com/gifts/icecream.png', 20, 4), -('蛋糕', 'https://example.com/gifts/cake.png', 50, 5), -('香水', 'https://example.com/gifts/perfume.png', 100, 6), -('口红', 'https://example.com/gifts/lipstick.png', 200, 7), -('钻戒', 'https://example.com/gifts/ring.png', 520, 8), -('跑车', 'https://example.com/gifts/car.png', 1314, 9), -('城堡', 'https://example.com/gifts/castle.png', 5200, 10); - --- 查看表结构 -SHOW TABLES LIKE 'eb_%gift%'; -SHOW TABLES LIKE 'eb_%virtual%'; -SHOW TABLES LIKE 'eb_%recharge%'; diff --git a/个人资料页面和直播间点赞功能优化.md b/个人资料页面和直播间点赞功能优化.md deleted file mode 100644 index cbb5329d..00000000 --- a/个人资料页面和直播间点赞功能优化.md +++ /dev/null @@ -1,144 +0,0 @@ -# 个人资料页面和直播间点赞功能优化 - -## 完成时间 -2026-01-03 - -## 修改内容 - -### 1. 直播间点赞按钮显示优化 - -#### 修改文件 -- `android-app/app/src/main/res/layout/activity_room_detail_new.xml` - -#### 修改内容 -- 在礼物按钮旁边添加了点赞按钮 -- 点赞按钮使用FrameLayout包裹,底部显示点赞数 -- 点赞按钮图标使用粉色(#FF4081) -- 点赞数显示在按钮底部,使用紫色背景 - -#### 布局结构 -``` -输入框 -> 点赞按钮(带点赞数) -> 礼物按钮 -> 发送按钮 -``` - -### 2. 个人资料页面快捷操作优化 - -#### 修改文件 -- `android-app/app/src/main/res/layout/activity_profile.xml` -- `android-app/app/src/main/java/com/example/livestreaming/ProfileActivity.java` - -#### 修改内容 -将原来的"公园勋章"、"观看历史"、"我的挚友"三个快捷入口改为: - -1. **我的关注** - - 图标:ic_person_add_24(紫色) - - 显示关注人数 - - 点击跳转到关注列表页面 - -2. **我的收藏** - - 图标:ic_like_24(粉色 #FF4081) - - 显示收藏的直播间数量 - - 点击跳转到收藏列表页面(LikedRoomsActivity) - -3. **我的挚友** - - 图标:ic_heart_24(玫红色 #E91E63) - - 显示挚友人数 - - 点击跳转到挚友列表页面 - -### 3. 新增关注列表页面 - -#### 新增文件 -- `android-app/app/src/main/java/com/example/livestreaming/FollowingActivity.java` -- `android-app/app/src/main/res/layout/activity_following.xml` - -#### 功能说明 -- 显示当前用户关注的所有用户列表 -- 使用FriendsAdapter复用好友列表的UI -- 支持点击跳转到用户主页 -- 显示用户在线状态、互关状态、个性签名等信息 - -#### API接口 -- 接口:`GET /api/front/follow/following/list` -- 参数:page(页码)、limit(每页数量) -- 返回:分页的关注用户列表 - -### 4. 新增图标资源 - -#### 新增文件 -- `android-app/app/src/main/res/drawable/ic_person_add_24.xml` - -#### 说明 -- 添加人物图标,用于"我的关注"快捷入口 -- Material Design风格的矢量图标 - -### 5. 数据加载优化 - -#### ProfileActivity数据加载 -在`loadFollowStats()`方法中: -- 加载关注数并更新快捷操作区域的显示 -- 新增`loadLikedRoomsCount()`方法加载收藏数 -- 使用`getLikedRooms`接口获取收藏的直播间总数 - -#### RoomDetailActivity点赞功能 -- 点赞按钮已实现点击动画效果 -- 自动加载并显示直播间点赞数 -- 点赞后实时更新点赞数显示 - -### 6. AndroidManifest.xml更新 - -注册了新的Activity: -```xml - -``` - -## 功能特点 - -1. **直观的UI设计** - - 点赞按钮紧邻礼物按钮,方便用户操作 - - 点赞数实时显示在按钮上 - - 使用不同颜色区分不同功能按钮 - -2. **完整的数据流** - - 从后端API加载真实数据 - - 支持实时更新 - - 错误处理友好 - -3. **良好的用户体验** - - 点击动画反馈 - - 登录状态检查 - - 空状态提示 - -## 使用说明 - -### 直播间点赞 -1. 进入直播间(RoomDetailActivity) -2. 点击底部的粉色点赞按钮 -3. 点赞数会实时更新显示 - -### 查看我的关注 -1. 进入个人资料页面 -2. 点击"我的关注"快捷入口 -3. 查看关注列表,点击用户可进入其主页 - -### 查看我的收藏 -1. 进入个人资料页面 -2. 点击"我的收藏"快捷入口 -3. 查看收藏的直播间列表 - -## 注意事项 - -1. 所有功能都需要用户登录后才能使用 -2. 数据从后端API实时加载 -3. 网络错误会有友好提示 -4. 支持下拉刷新和分页加载 - -## 编译说明 - -如果遇到资源找不到的错误,请确保以下文件存在: -- `ic_person_add_24.xml` - 添加人物图标 -- `ic_like_24.xml` - 点赞图标 -- `ic_heart_24.xml` - 心形图标 - -所有图标都已创建,可以直接编译运行。 diff --git a/主播中心粉丝数问题排查.md b/主播中心粉丝数问题排查.md deleted file mode 100644 index 1af0d9f0..00000000 --- a/主播中心粉丝数问题排查.md +++ /dev/null @@ -1,169 +0,0 @@ -# 主播中心粉丝数问题排查指南 - -## 问题描述 -主播中心页面显示粉丝数为 0,即使有用户关注了该主播。 - -## 已修复的问题 - -### 1. 后端统计接口修复 -**文件**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/StreamerController.java` - -**修复内容**: -- 修正了粉丝数查询的 SQL 语句 -- 原来使用了错误的字段名 `follow_user_id` -- 现在使用正确的字段 `followed_id`(被关注者ID) -- 添加了状态过滤条件:`follow_status IN ('1', '关注') AND is_deleted = 0` -- 同时添加了关注数统计(我关注了多少人) - -**修复后的代码**: -```java -// 获取粉丝数(统计有多少人关注了我) -try { - String fansSql = "SELECT COUNT(*) FROM eb_follow_record WHERE followed_id = ? AND follow_status IN ('1', '关注') AND is_deleted = 0"; - Integer fansCount = jdbcTemplate.queryForObject(fansSql, Integer.class, userId); - stats.put("fansCount", fansCount != null ? fansCount : 0); -} catch (Exception e) { - log.error("获取粉丝数失败", e); - stats.put("fansCount", 0); -} - -// 获取关注数(统计我关注了多少人) -try { - String followingSql = "SELECT COUNT(*) FROM eb_follow_record WHERE follower_id = ? AND follow_status IN ('1', '关注') AND is_deleted = 0"; - Integer followingCount = jdbcTemplate.queryForObject(followingSql, Integer.class, userId); - stats.put("followingCount", followingCount != null ? followingCount : 0); -} catch (Exception e) { - log.error("获取关注数失败", e); - stats.put("followingCount", 0); -} -``` - -## 验证步骤 - -### 1. 重新部署后端 -```bash -# 已编译完成,需要重启服务 -# 在服务器上执行: -cd /root/zhibo/Zhibo/zhibo-h/crmeb-front -./restart.sh -``` - -### 2. 使用 SQL 验证数据 -运行 `test_streamer_stats.sql` 中的查询来验证数据: - -```sql --- 查看某个主播的粉丝数 -SET @USER_ID = 1; -- 替换为实际的主播用户ID - -SELECT - '粉丝数' as stat_type, - COUNT(*) as count -FROM eb_follow_record -WHERE followed_id = @USER_ID - AND follow_status IN ('1', '关注') - AND is_deleted = 0; - --- 查看谁关注了这个主播 -SELECT - fr.follower_id, - u.nickname as follower_nickname, - fr.follow_status, - fr.create_time -FROM eb_follow_record fr -LEFT JOIN eb_user u ON fr.follower_id = u.uid -WHERE fr.followed_id = @USER_ID - AND fr.follow_status IN ('1', '关注') - AND fr.is_deleted = 0 -ORDER BY fr.create_time DESC; -``` - -### 3. 测试 API 接口 -使用 Postman 或 curl 测试接口: - -```bash -# 获取主播统计数据 -curl -X GET "http://your-server/api/front/streamer/stats" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -预期返回: -```json -{ - "code": 200, - "message": "success", - "data": { - "nickname": "主播昵称", - "avatar": "头像URL", - "streamerLevel": 1, - "fansCount": 实际粉丝数, - "followingCount": 关注数, - "likesCount": 获赞数, - "giftsCount": 礼物数, - "totalIncome": 总收益, - "hasActiveRoom": true/false - } -} -``` - -### 4. Android 端测试 -1. 重新启动 Android 应用 -2. 登录主播账号 -3. 进入主播中心 -4. 查看粉丝数是否正确显示 - -## 可能的其他问题 - -### 1. 数据库中没有关注记录 -检查 `eb_follow_record` 表是否有数据: -```sql -SELECT COUNT(*) FROM eb_follow_record; -``` - -如果没有数据,需要: -- 确认关注功能是否正常工作 -- 检查关注接口是否正确插入数据 - -### 2. follow_status 字段值不一致 -检查状态值: -```sql -SELECT DISTINCT follow_status, COUNT(*) -FROM eb_follow_record -GROUP BY follow_status; -``` - -如果发现状态值不一致,可以统一: -```sql --- 将字符串状态统一为数字 -UPDATE eb_follow_record SET follow_status = '1' WHERE follow_status = '关注'; -UPDATE eb_follow_record SET follow_status = '0' WHERE follow_status = '取消关注'; -``` - -### 3. Android 端缓存问题 -- 清除应用数据 -- 重新登录 -- 或者在代码中添加强制刷新逻辑 - -### 4. Token 过期或权限问题 -- 确认用户已登录 -- 确认 Token 有效 -- 确认用户是主播身份(is_streamer = 1) - -## 相关文件 - -- 后端接口: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/StreamerController.java` -- Android 页面: `android-app/app/src/main/java/com/example/livestreaming/StreamerCenterActivity.java` -- API 接口定义: `android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java` -- 数据库表: `eb_follow_record` -- 测试 SQL: `test_streamer_stats.sql` - -## 下一步 - -1. 重启后端服务 -2. 运行 SQL 验证数据 -3. 测试 API 接口 -4. 在 Android 端验证显示 - -如果问题仍然存在,请检查: -- 后端日志中是否有错误信息 -- Android 端网络请求是否成功 -- 返回的数据格式是否正确 diff --git a/余额系统改造说明.md b/余额系统改造说明.md deleted file mode 100644 index 4ff13082..00000000 --- a/余额系统改造说明.md +++ /dev/null @@ -1,93 +0,0 @@ -# 余额系统改造说明 - -## 改造内容 - -### 1. 前端显示修改 -- **APP端**:将所有"虎牙币"改为"余额" - - `activity_wallet.xml` - 钱包页面标题 - - `item_recharge_package.xml` - 充值套餐显示 - - `RechargePackageAdapter.java` - 充值套餐适配器 - -### 2. 后端字段修改 -- **余额字段**:从 `virtual_balance` 改为 `now_money` -- **涉及文件**: - - `VirtualCurrencyController.java` - 虚拟货币控制器 - - `GiftSystemController.java` - 礼物系统控制器 - -### 3. 功能说明 - -#### 余额查询 -- **接口**:`GET /api/front/virtual-currency/balance` -- **字段**:使用 `eb_user.now_money` -- **返回**:用户当前余额 - -#### 充值功能 -- **接口**:`POST /api/front/virtual-currency/recharge/create` -- **操作**:充值金额增加到 `eb_user.now_money` -- **记录**:在 `eb_virtual_currency_recharge` 表记录充值订单 -- **交易**:在 `eb_virtual_currency_transaction` 表记录交易明细 - -#### 礼物打赏 -- **接口**:`POST /api/front/gift-system/send` -- **操作**:从 `eb_user.now_money` 扣除礼物价格 -- **记录**:在 `eb_gift_record` 表记录礼物赠送 -- **交易**:在 `eb_virtual_currency_transaction` 表记录消费明细 - -## 数据库字段 - -### eb_user 表 -```sql -now_money DECIMAL(10,2) DEFAULT 0.00 COMMENT '用户余额' -``` - -### 优势 -1. **统一管理**:所有余额相关操作都使用 `now_money` 字段 -2. **兼容性好**:`now_money` 是系统原有字段,无需新建 -3. **易于扩展**:后续可以添加更多余额相关功能 - -## 部署步骤 - -### 1. 编译后端 -```bash -cd Zhibo\zhibo-h -mvn clean package -DskipTests -``` - -### 2. 部署到服务器 -```bash -# 使用部署脚本 -deploy-balance-system.bat -``` - -### 3. 编译APP -在Android Studio中重新编译APP - -## 测试验证 - -### 1. 余额查询 -- 登录APP -- 进入钱包页面 -- 查看余额显示是否正确 - -### 2. 充值测试 -- 选择充值套餐 -- 使用模拟支付 -- 验证余额是否增加 - -### 3. 礼物打赏测试 -- 进入直播间 -- 送出礼物 -- 验证余额是否扣除 - -## 注意事项 - -1. **数据迁移**:如果之前使用了 `virtual_balance`,需要将数据迁移到 `now_money` -2. **并发控制**:余额扣除使用数据库事务保证原子性 -3. **余额不足**:送礼物时会检查余额,不足时提示充值 - -## 后续优化 - -1. 添加余额变动推送通知 -2. 支持真实支付接口(支付宝/微信) -3. 添加余额提现功能(针对主播) -4. 完善交易记录查询和导出 diff --git a/使用教程.md b/使用教程.md deleted file mode 100644 index af195b14..00000000 --- a/使用教程.md +++ /dev/null @@ -1,594 +0,0 @@ -# Android 直播系统完整使用教程 - -## 目录 -1. [系统架构说明](#系统架构说明) -2. [环境准备](#环境准备) -3. [启动后端服务](#启动后端服务) -4. [Android Studio 使用教程](#android-studio-使用教程) -5. [OBS Studio 推流教程](#obs-studio-推流教程) -6. [完整操作流程](#完整操作流程) -7. [常见问题解决](#常见问题解决) - ---- - -## 系统架构说明 - -``` -┌──────────────┐ -│ 电脑 OBS │ ← 你在这里推流(摄像头/屏幕) -└──────┬───────┘ - │ RTMP 推流 - ↓ -┌──────────────┐ -│ SRS 服务器 │ ← 接收推流,转换格式 -│ (Docker) │ -└──────┬───────┘ - │ - ↓ -┌──────────────┐ -│ Node.js 后端 │ ← 管理直播间,提供 API -└──────┬───────┘ - │ REST API - ↓ -┌──────────────┐ -│ Android 应用 │ ← 观看直播 -│ (模拟器) │ -└──────────────┘ -``` - -**角色说明**: -- **OBS**:主播端,用于推流(发送视频) -- **Android 应用**:观众端,用于观看直播 -- **后端服务**:管理直播间,连接 OBS 和 Android - ---- - -## 环境准备 - -### 1. 必需软件 - -#### ✅ 已安装 -- [x] Node.js -- [x] Docker Desktop -- [x] Android Studio -- [x] Android 模拟器 - -#### 📥 需要下载 -- [ ] **OBS Studio** - 推流软件 - - 下载地址:https://obsproject.com/download - - 选择 Windows 版本 - - 安装后重启电脑 - -### 2. 检查 Docker 容器 - -打开命令行,运行: -```bash -docker ps -``` - -应该看到 `srs-server` 容器正在运行: -``` -CONTAINER ID IMAGE PORTS NAMES -f24a21e0bc02 ossrs/srs:5 0.0.0.0:1935->1935/tcp srs-server - 0.0.0.0:8080->8080/tcp - 0.0.0.0:1985->1985/tcp -``` - -如果没有运行,启动它: -```bash -cd live-streaming -docker-compose up -d -``` - ---- - -## 启动后端服务 - -### 步骤 1:打开命令行 - -在项目根目录打开 PowerShell 或 CMD - -### 步骤 2:进入后端目录 -```bash -cd live-streaming -``` - -### 步骤 3:启动服务器 -```bash -node server/index.js -``` - -### 步骤 4:验证服务器运行 - -你应该看到类似输出: -``` -[RoomStore] Loaded 1 rooms from storage -[Media Server] Embedded NodeMediaServer disabled (EMBEDDED_MEDIA_SERVER=0). -API 服务运行在 http://localhost:3001 -API 服务也可通过 http://0.0.0.0:3001 访问(用于 Android 模拟器) -SRS RTMP: rtmp://localhost:1935/live/{streamKey} -SRS HTTP: http://localhost:8080/live/{streamKey}.flv -``` - -**⚠️ 重要**:保持这个命令行窗口打开,不要关闭! - -### 步骤 5:测试服务器(可选) - -打开浏览器访问: -``` -http://localhost:3001/health -``` - -应该看到: -```json -{"status":"ok","timestamp":"2025-12-16T09:30:00.000Z"} -``` - ---- - -## Android Studio 使用教程 - -### 步骤 1:打开项目 - -1. 启动 **Android Studio** -2. 点击 **Open** -3. 选择 `android-app` 文件夹 -4. 点击 **OK** - -### 步骤 2:等待 Gradle 同步 - -- 首次打开会自动下载依赖 -- 等待底部状态栏显示 "Gradle sync finished" -- 可能需要 5-10 分钟 - -### 步骤 3:启动 Android 模拟器 - -#### 方法 A:使用现有模拟器 -1. 点击顶部工具栏的设备下拉菜单 -2. 选择一个模拟器(如 Pixel 5 API 34) -3. 点击绿色的 ▶️ **Run** 按钮 - -#### 方法 B:创建新模拟器 -1. 点击 **Tools** → **Device Manager** -2. 点击 **Create Device** -3. 选择 **Phone** → **Pixel 5** -4. 点击 **Next** -5. 选择系统镜像(推荐 **API 34**) -6. 点击 **Next** → **Finish** -7. 点击 ▶️ 启动模拟器 - -### 步骤 4:运行应用 - -1. 等待模拟器完全启动(显示主屏幕) -2. 在 Android Studio 中点击 ▶️ **Run 'app'** -3. 应用会自动安装并启动 - -### 步骤 5:创建直播间 - -在 Android 应用中: - -1. 点击右上角的 **"开始直播"** 按钮 -2. 填写信息: - - **直播间标题**:例如 "我的第一次直播" - - **主播名称**:例如 "小明" -3. 点击 **"创建"** - -### 步骤 6:获取推流地址 - -创建成功后会显示一个对话框,包含: - -``` -推流地址: -rtmp://10.0.2.2:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - -电脑本机 OBS 可用: -rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - -⚠️ 注意: -1. Android 应用只能观看直播 -2. 需要用 OBS 在电脑上推流 -3. OBS 设置:服务器填上面地址即可 -4. 推流后在应用中观看 -``` - -**📋 复制推流地址**: -- 点击 **"复制地址"** 按钮 -- 这个地址稍后在 OBS 中使用 - -### 步骤 7:查看直播间列表 - -- 点击 **"知道了"** 关闭对话框 -- 你会看到刚创建的直播间 -- 状态显示 **"未开播"**(灰色) - ---- - -## OBS Studio 推流教程 - -### 步骤 1:下载并安装 OBS - -1. 访问 https://obsproject.com/download -2. 下载 Windows 版本 -3. 安装(使用默认设置) -4. 启动 OBS Studio - -### 步骤 2:首次配置向导(如果出现) - -如果是第一次打开 OBS,会出现配置向导: - -1. **使用信息**:选择 "优化推流,录制次之" -2. **视频设置**: - - 基础分辨率:1920x1080 - - FPS:30 -3. **推流信息**:选择 "我将使用自定义流媒体服务器" -4. 点击 **"下一步"** 完成 - -### 步骤 3:配置推流设置 - -#### 3.1 打开设置 -- 点击右下角 **"设置"** 按钮 -- 或者菜单栏:**文件** → **设置** - -#### 3.2 配置推流 -1. 左侧选择 **"推流"** -2. **服务**:选择 "自定义..." -3. **服务器**:粘贴从 Android 应用复制的地址 - ``` - rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - ``` - - **⚠️ 重要**: - - 如果地址是 `rtmp://10.0.2.2:1935/...`,改成 `rtmp://localhost:1935/...` - - 完整地址包含 streamKey,不需要单独填写串流密钥 - -4. **串流密钥**:留空(因为已经包含在服务器地址中) -5. 点击 **"应用"** - -#### 3.3 配置输出(可选,优化画质) -1. 左侧选择 **"输出"** -2. **输出模式**:简单 -3. **视频比特率**:2500 Kbps -4. **编码器**:x264 -5. 点击 **"应用"** - -#### 3.4 配置视频(可选) -1. 左侧选择 **"视频"** -2. **基础分辨率**:1920x1080 -3. **输出分辨率**:1280x720 -4. **常用 FPS 值**:30 -5. 点击 **"确定"** - -### 步骤 4:添加视频源 - -#### 方法 A:添加摄像头 -1. 在 **"来源"** 区域点击 **+** 号 -2. 选择 **"视频捕获设备"** -3. 命名:例如 "摄像头" -4. 点击 **"确定"** -5. **设备**:选择你的摄像头 -6. 点击 **"确定"** - -#### 方法 B:添加屏幕捕获 -1. 在 **"来源"** 区域点击 **+** 号 -2. 选择 **"显示器捕获"** -3. 命名:例如 "屏幕" -4. 点击 **"确定"** -5. **显示器**:选择要捕获的屏幕 -6. 点击 **"确定"** - -#### 方法 C:添加窗口捕获 -1. 在 **"来源"** 区域点击 **+** 号 -2. 选择 **"窗口捕获"** -3. 命名:例如 "浏览器" -4. 点击 **"确定"** -5. **窗口**:选择要捕获的窗口 -6. 点击 **"确定"** - -### 步骤 5:调整画面 - -- 拖动红色边框调整大小 -- 拖动中心调整位置 -- 右键源 → **变换** → **适应屏幕** 可以自动适配 - -### 步骤 6:开始推流 - -1. 点击右下角 **"开始推流"** 按钮 -2. 按钮变成 **"停止推流"**,底部状态栏显示: - ``` - 直播中 | 00:00:15 | 2500 kb/s | 0 丢帧 - ``` - -**✅ 推流成功标志**: -- 状态栏显示 "直播中" -- 有比特率数据(如 2500 kb/s) -- 丢帧数为 0 或很少 - -**❌ 推流失败标志**: -- 提示 "连接失败" -- 状态栏显示红色错误 -- 检查推流地址是否正确 - -### 步骤 7:在 Android 应用中观看 - -1. 回到 Android 模拟器 -2. 在直播间列表中,你的直播间状态应该变成 **"直播中"**(红色) -3. 点击直播间进入 -4. 等待 2-3 秒,视频开始播放 -5. 你应该能看到 OBS 中的画面 - ---- - -## 完整操作流程 - -### 🎬 完整演示流程 - -#### 第一步:启动所有服务(5 分钟) - -```bash -# 1. 启动 Docker(如果未运行) -cd live-streaming -docker-compose up -d - -# 2. 启动后端服务器 -node server/index.js -# 保持窗口打开! -``` - -#### 第二步:启动 Android 应用(3 分钟) - -1. 打开 Android Studio -2. 打开 `android-app` 项目 -3. 启动模拟器 -4. 运行应用(点击 ▶️) - -#### 第三步:创建直播间(1 分钟) - -1. 在 Android 应用中点击 **"开始直播"** -2. 填写标题和主播名称 -3. 点击 **"创建"** -4. 点击 **"复制地址"** 复制推流地址 -5. 点击 **"知道了"** - -#### 第四步:配置 OBS(2 分钟) - -1. 打开 OBS Studio -2. 点击 **"设置"** → **"推流"** -3. 服务:选择 "自定义..." -4. 服务器:粘贴推流地址(改 `10.0.2.2` 为 `localhost`) -5. 点击 **"确定"** - -#### 第五步:添加视频源(2 分钟) - -1. 点击 **"来源"** 区域的 **+** 号 -2. 选择 **"视频捕获设备"**(摄像头)或 **"显示器捕获"**(屏幕) -3. 配置并确定 - -#### 第六步:开始直播(1 分钟) - -1. 在 OBS 中点击 **"开始推流"** -2. 等待 2-3 秒 -3. 回到 Android 模拟器 -4. 点击直播间进入 -5. 观看直播!🎉 - ---- - -## 常见问题解决 - -### ❌ 问题 1:Android 应用显示"网络错误" - -**原因**:后端服务器未启动 - -**解决**: -```bash -cd live-streaming -node server/index.js -``` - -验证:浏览器访问 http://localhost:3001/health - ---- - -### ❌ 问题 2:OBS 提示"连接失败" - -**原因 A**:推流地址错误 - -**解决**: -1. 检查地址格式:`rtmp://localhost:1935/live/{streamKey}` -2. 确保使用 `localhost` 而不是 `10.0.2.2` -3. 确保包含完整的 streamKey - -**原因 B**:SRS 服务器未运行 - -**解决**: -```bash -docker ps -# 如果没有 srs-server,运行: -cd live-streaming -docker-compose up -d -``` - ---- - -### ❌ 问题 3:Android 应用显示"未开播" - -**原因**:后端无法检测到推流 - -**解决**: -1. 确认 OBS 正在推流(状态栏显示"直播中") -2. 检查后端日志是否有错误 -3. 重启后端服务器 -4. 在 Android 应用中下拉刷新 - -**验证推流状态**: -浏览器访问 http://localhost:1985/api/v1/streams/ -应该看到你的 streamKey - ---- - -### ❌ 问题 4:视频播放黑屏 - -**原因 A**:HLS 转码未启用 - -**解决**: -检查 `live-streaming/.env` 中是否有 FFmpeg 配置 -```env -FFMPEG_PATH=C:\path\to\ffmpeg.exe -``` - -**原因 B**:网络延迟 - -**解决**: -- 等待 5-10 秒 -- 退出直播间重新进入 -- 检查网络连接 - -**原因 C**:Android 播放器不支持格式 - -**解决**: -查看后端日志,确认 HLS 地址可用 - ---- - -### ❌ 问题 5:模拟器无法连接到后端 - -**原因**:防火墙阻止 - -**解决**: -```powershell -# 以管理员身份运行 PowerShell -netsh advfirewall firewall add rule name="Node.js API" dir=in action=allow protocol=TCP localport=3001 -``` - ---- - -### ❌ 问题 6:重启后端后房间消失 - -**原因**:已修复!现在房间会自动保存 - -**验证**: -检查 `live-streaming/data/rooms.json` 文件是否存在 - ---- - -### ❌ 问题 7:OBS 画面卡顿 - -**原因**:比特率过高或电脑性能不足 - -**解决**: -1. OBS 设置 → 输出 -2. 降低视频比特率:2500 → 1500 Kbps -3. 降低分辨率:1080p → 720p -4. 降低帧率:60fps → 30fps - ---- - -## 快速参考 - -### 端口说明 -| 端口 | 服务 | 用途 | -|------|------|------| -| 1935 | RTMP | OBS 推流 | -| 8080 | HTTP-FLV/HLS | 视频播放 | -| 1985 | SRS API | 推流状态检测 | -| 3001 | Node.js API | Android 应用接口 | - -### 关键地址 -| 用途 | 地址 | -|------|------| -| OBS 推流 | `rtmp://localhost:1935/live/{streamKey}` | -| Android API | `http://10.0.2.2:3001/api/` | -| 健康检查 | `http://localhost:3001/health` | -| SRS 状态 | `http://localhost:1985/api/v1/streams/` | - -### 常用命令 -```bash -# 启动后端 -cd live-streaming -node server/index.js - -# 启动 Docker -docker-compose up -d - -# 查看 Docker 容器 -docker ps - -# 停止 Docker -docker-compose down - -# 查看端口占用 -netstat -ano | findstr :3001 -``` - ---- - -## 视频教程(建议录制) - -如果你想录制视频教程,可以按照以下脚本: - -### 📹 脚本大纲 - -1. **开场**(30秒) - - "大家好,今天教大家如何搭建一个 Android 直播系统" - - 展示最终效果:OBS 推流 → Android 观看 - -2. **环境准备**(2分钟) - - 展示必需软件 - - 检查 Docker 运行状态 - -3. **启动后端**(1分钟) - - 打开命令行 - - 运行 `node server/index.js` - - 展示成功日志 - -4. **Android Studio**(3分钟) - - 打开项目 - - 启动模拟器 - - 运行应用 - - 创建直播间 - - 复制推流地址 - -5. **OBS 配置**(3分钟) - - 打开设置 - - 配置推流地址 - - 添加视频源 - - 开始推流 - -6. **观看直播**(1分钟) - - 回到 Android 应用 - - 点击直播间 - - 展示播放效果 - -7. **结尾**(30秒) - - 总结关键步骤 - - 提醒常见问题 - ---- - -## 下一步学习 - -### 🚀 进阶功能 -- [ ] 添加聊天功能 -- [ ] 添加礼物打赏 -- [ ] 添加观众人数统计 -- [ ] 支持多个直播间 -- [ ] 添加直播回放 - -### 📚 推荐资源 -- OBS 官方文档:https://obsproject.com/wiki/ -- SRS 文档:https://ossrs.net/ -- Android ExoPlayer:https://exoplayer.dev/ - ---- - -## 技术支持 - -如果遇到问题: -1. 查看本教程的"常见问题解决"部分 -2. 查看 `android-app/问题修复总结.md` -3. 查看后端日志输出 -4. 查看 Android Studio 的 Logcat - ---- - -**祝你使用愉快!🎉** diff --git a/修复直播间主播数据.sql b/修复直播间主播数据.sql deleted file mode 100644 index 18fcdaae..00000000 --- a/修复直播间主播数据.sql +++ /dev/null @@ -1,49 +0,0 @@ -USE zhibo; - --- 1. 查看当前有哪些主播 -SELECT uid, nickname, phone, is_streamer -FROM eb_user -WHERE is_streamer = 1 -ORDER BY uid -LIMIT 10; - --- 2. 查看有多少直播间的uid为空或无效 -SELECT - COUNT(*) as total_rooms, - SUM(CASE WHEN uid IS NULL OR uid = 0 THEN 1 ELSE 0 END) as invalid_uid_count, - SUM(CASE WHEN uid IS NOT NULL AND uid > 0 THEN 1 ELSE 0 END) as valid_uid_count -FROM eb_live_room; - --- 3. 查看uid无效的直播间 -SELECT id, uid, title, streamer_name, stream_key -FROM eb_live_room -WHERE uid IS NULL OR uid = 0 OR uid NOT IN (SELECT uid FROM eb_user) -LIMIT 10; - --- 4. 选择一个默认主播(选择第一个认证主播,或者指定某个uid) --- 假设选择 uid=318 作为默认主播(根据之前的数据,这个用户有很多关注记录) -SET @default_streamer_id = 318; - --- 验证这个主播是否存在 -SELECT uid, nickname, phone, is_streamer -FROM eb_user -WHERE uid = @default_streamer_id; - --- 5. 将所有uid无效的直播间分配给默认主播 -UPDATE eb_live_room -SET uid = @default_streamer_id, - streamer_name = (SELECT nickname FROM eb_user WHERE uid = @default_streamer_id) -WHERE uid IS NULL OR uid = 0 OR uid NOT IN (SELECT uid FROM eb_user); - --- 6. 验证修复结果 -SELECT - COUNT(*) as total_rooms, - SUM(CASE WHEN uid IS NULL OR uid = 0 THEN 1 ELSE 0 END) as invalid_uid_count, - SUM(CASE WHEN uid IS NOT NULL AND uid > 0 THEN 1 ELSE 0 END) as valid_uid_count -FROM eb_live_room; - --- 7. 查看修复后的直播间 -SELECT id, uid, title, streamer_name, is_live -FROM eb_live_room -ORDER BY id DESC -LIMIT 10; diff --git a/修复表默认值.sql b/修复表默认值.sql deleted file mode 100644 index 61364293..00000000 --- a/修复表默认值.sql +++ /dev/null @@ -1,19 +0,0 @@ -USE zhibo; - --- 修改 follow_status 字段的默认值为'关注' -ALTER TABLE eb_follow_record -MODIFY COLUMN follow_status varchar(20) NOT NULL DEFAULT '关注' COMMENT '关注状态:关注-已关注 0-已取消'; - --- 验证修改 -SHOW CREATE TABLE eb_follow_record; - --- 更新现有的错误记录 -UPDATE eb_follow_record -SET follow_status = '关注' -WHERE follow_status = '0' AND is_deleted = 0; - --- 查看更新后的记录 -SELECT id, follower_id, followed_id, follow_status, is_deleted, create_time -FROM eb_follow_record -ORDER BY create_time DESC -LIMIT 10; diff --git a/关注功能修复说明.md b/关注功能修复说明.md deleted file mode 100644 index a40a6446..00000000 --- a/关注功能修复说明.md +++ /dev/null @@ -1,154 +0,0 @@ -# 关注功能修复说明 - -## 问题原因 - -系统中存在两个关注表的不一致问题: -1. **数据库实际表**: `eb_user_follow` (字段: `user_id`, `follow_user_id`) -2. **Java代码使用**: `eb_follow_record` (字段: `follower_id`, `followed_id`) - -导致关注功能无法正常工作。 - -## 解决方案 - -创建 `eb_follow_record` 表并迁移现有数据。 - -## 执行步骤 - -### 1. 连接到MySQL数据库 - -```bash -mysql -h 1.15.149.240 -u root -p -use crmeb; -``` - -### 2. 执行迁移脚本 - -```bash -source migrate_follow_data.sql; -``` - -或者直接执行SQL: - -```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:关联数据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 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; -``` - -### 3. 验证数据 - -```sql --- 查看新表数据 -SELECT * FROM eb_follow_record LIMIT 10; - --- 统计记录数 -SELECT COUNT(*) FROM eb_follow_record; - --- 查看某个用户的关注记录 -SELECT * FROM eb_follow_record WHERE follower_id = 你的用户ID; -``` - -### 4. 重启后端服务 - -```bash -cd /root/zhibo/Zhibo/zhibo-h -./restart.sh -``` - -### 5. 重新编译Android应用 - -在Android Studio中: -1. Build -> Clean Project -2. Build -> Rebuild Project -3. 重新安装到设备 - -## 测试步骤 - -1. 登录应用 -2. 进入任意直播间 -3. 点击"关注"按钮 -4. 查看是否提示"已关注主播" -5. 退出直播间,重新进入 -6. 检查按钮是否显示"已关注"状态 - -## 验证数据库 - -```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 -WHERE fr.follow_status = 1 AND fr.is_deleted = 0 -ORDER BY fr.create_time DESC -LIMIT 20; -``` - -## 已修复的代码 - -### 后端 -- ✅ StreamerAdminController: 粉丝数统计SQL -- ✅ UserMapper.xml: 关注数和粉丝数查询 -- ✅ FollowController: 关注接口 -- ✅ LiveRoomController: 房间详情返回关注状态 - -### Android -- ✅ ApiService: 接口路径修正 -- ✅ RoomDetailActivity: - - 使用正确的 streamerId - - 加载房间信息 - - 更新关注按钮状态 - - 添加详细日志 - -## 注意事项 - -1. 执行SQL前请先备份数据库 -2. 确保 `eb_user` 表存在且有数据 -3. 如果 `eb_user_follow` 表没有数据,迁移步骤会自动跳过 -4. 新的关注记录会自动保存到 `eb_follow_record` 表 diff --git a/关注和作品模块对接总结.md b/关注和作品模块对接总结.md deleted file mode 100644 index 5f669b31..00000000 --- a/关注和作品模块对接总结.md +++ /dev/null @@ -1,457 +0,0 @@ -# 关注和作品模块对接总结 - -## 📋 任务概述 - -根据 `模块文档/06-关注功能模块.md` 和 `模块文档/07-作品管理模块.md` 的接口文档要求,完成了关注功能模块和作品管理模块的后端接口对接工作。 - -**完成时间**: 2024-12-30 -**工作内容**: -1. 实体类字段补齐 -2. Request/Response对象更新 -3. Service层实现完善 -4. Mapper XML更新 -5. 数据库更新脚本 -6. 文档编写 - ---- - -## ✅ 完成的工作清单 - -### 1. 实体类更新 - -#### Works.java -**文件**: `crmeb-common/src/main/java/com/zbkj/common/model/works/Works.java` - -**新增字段**: -```java -@Column(name = "type", nullable = false, length = 32, - columnDefinition = "VARCHAR(32) DEFAULT 'IMAGE' COMMENT '作品类型:IMAGE-图片 VIDEO-视频'") -private String type = "IMAGE"; -``` - -**说明**: 添加作品类型字段,用于区分图片作品和视频作品 - ---- - -### 2. Request对象更新 - -#### WorksRequest.java -**文件**: `crmeb-common/src/main/java/com/zbkj/common/request/WorksRequest.java` - -**更新内容**: -- 添加 `type` 字段(必填) -- `coverImage` 改为 `coverUrl`(统一命名) -- `images` (String) 改为 `imageUrls` (List)(更符合前端使用) - -**修改前**: -```java -private String coverImage; -private String images; -``` - -**修改后**: -```java -@NotBlank(message = "作品类型不能为空") -private String type; - -@NotBlank(message = "封面图片URL不能为空") -private String coverUrl; - -private List imageUrls; -``` - ---- - -### 3. Response对象更新 - -#### WorksResponse.java -**文件**: `crmeb-common/src/main/java/com/zbkj/common/response/WorksResponse.java` - -**更新内容**: -- 添加 `type` 字段 -- `coverImage` 改为 `coverUrl` -- `images` (String) 改为 `imageUrls` (List) -- `userName` 改为 `authorName`(符合文档要求) -- `userAvatar` 改为 `authorAvatar`(符合文档要求) - -**字段映射对照表**: -| 原字段名 | 新字段名 | 类型变化 | -|---------|---------|---------| -| coverImage | coverUrl | 无 | -| images | imageUrls | String → List | -| userName | authorName | 无 | -| userAvatar | authorAvatar | 无 | - ---- - -### 4. SearchRequest更新 - -#### WorksSearchRequest.java -**文件**: `crmeb-common/src/main/java/com/zbkj/common/request/WorksSearchRequest.java` - -**新增字段**: -```java -@ApiModelProperty(value = "作品类型:IMAGE-图片 VIDEO-视频") -private String type; -``` - -**说明**: 支持按作品类型筛选 - ---- - -### 5. Service层实现完善 - -#### WorksServiceImpl.java -**文件**: `crmeb-service/src/main/java/com/zbkj/service/service/impl/WorksServiceImpl.java` - -**主要更新**: - -1. **发布作品方法**: -```java -// 正确处理type字段 -works.setType(request.getType()); -works.setCoverImage(request.getCoverUrl()); - -// 处理图片列表(List转String存储) -if (request.getImageUrls() != null && !request.getImageUrls().isEmpty()) { - works.setImages(String.join(",", request.getImageUrls())); -} -``` - -2. **搜索作品方法**: -```java -// 添加作品类型筛选 -if (StrUtil.isNotBlank(request.getType())) { - queryWrapper.eq(Works::getType, request.getType()); -} -``` - -3. **响应对象转换**: -```java -// 正确映射字段名 -response.setType(works.getType()); -response.setCoverUrl(works.getCoverImage()); -response.setAuthorName(user.getNickname()); -response.setAuthorAvatar(user.getAvatar()); - -// 处理图片列表(String转List) -if (StrUtil.isNotBlank(works.getImages())) { - String[] imageArray = works.getImages().split(","); - response.setImageUrls(Arrays.asList(imageArray)); -} -``` - ---- - -### 6. Mapper XML更新 - -#### FollowRecordDao.xml -**文件**: `crmeb-service/src/main/resources/mapper/FollowRecordDao.xml` - -**更新内容**: - -1. **关注列表查询**: - - `avatarUrl` 改为 `avatar`(符合文档要求) - - 移除 `phone` 字段(隐私保护) - -2. **粉丝列表查询**: - - `avatarUrl` 改为 `avatar` - - `isFollowBack` 改为 `isMutualFollow`(符合文档要求) - - 移除 `phone` 字段 - -**修改前**: -```xml -u.avatar as avatarUrl, -u.phone, -... -CASE ... END as isFollowBack -``` - -**修改后**: -```xml -u.avatar, -... -CASE ... END as isMutualFollow -``` - ---- - -### 7. 数据库更新 - -#### 数据库更新-关注和作品模块.sql -**文件**: `Zhibo/zhibo-h/数据库更新-关注和作品模块.sql` - -**更新内容**: -1. 为 `eb_works` 表添加 `type` 字段 -2. 为 `type` 字段添加索引 -3. 验证所有表结构 -4. 验证所有索引 -5. 数据完整性检查 - -**执行方式**: -```bash -mysql -u root -p < 数据库更新-关注和作品模块.sql -``` - ---- - -## 📊 接口对接情况 - -### 关注功能模块(7个接口) - -| 序号 | 接口路径 | 方法 | 状态 | 备注 | -|-----|---------|------|------|------| -| 1 | /api/front/follow/follow | POST | ✅ | 参数和返回值完全一致 | -| 2 | /api/front/follow/unfollow | POST | ✅ | 参数和返回值完全一致 | -| 3 | /api/front/follow/status/{userId} | GET | ✅ | 参数和返回值完全一致 | -| 4 | /api/front/follow/status/batch | POST | ✅ | 参数和返回值完全一致 | -| 5 | /api/front/follow/following | GET | ✅ | 参数和返回值完全一致 | -| 6 | /api/front/follow/followers | GET | ✅ | 参数和返回值完全一致 | -| 7 | /api/front/follow/stats | GET | ✅ | 参数和返回值完全一致 | - -**完成度**: 7/7 (100%) - ---- - -### 作品管理模块(13个接口) - -| 序号 | 接口路径 | 方法 | 状态 | 备注 | -|-----|---------|------|------|------| -| 1 | /api/front/works/publish | POST | ✅ | 已支持type字段 | -| 2 | /api/front/works/update | POST | ✅ | 参数和返回值完全一致 | -| 3 | /api/front/works/delete/{worksId} | POST | ✅ | 使用逻辑删除 | -| 4 | /api/front/works/detail/{worksId} | GET | ✅ | 已支持type和新字段 | -| 5 | /api/front/works/search | POST | ✅ | 已支持type筛选 | -| 6 | /api/front/works/user/{userId} | GET | ✅ | 参数和返回值完全一致 | -| 7 | /api/front/works/like/{worksId} | POST | ✅ | 参数和返回值完全一致 | -| 8 | /api/front/works/unlike/{worksId} | POST | ✅ | 参数和返回值完全一致 | -| 9 | /api/front/works/collect/{worksId} | POST | ✅ | 参数和返回值完全一致 | -| 10 | /api/front/works/uncollect/{worksId} | POST | ✅ | 参数和返回值完全一致 | -| 11 | /api/front/works/my/liked | GET | ✅ | 参数和返回值完全一致 | -| 12 | /api/front/works/my/collected | GET | ✅ | 参数和返回值完全一致 | -| 13 | /api/front/works/share/{worksId} | POST | ✅ | 参数和返回值完全一致 | - -**完成度**: 13/13 (100%) - ---- - -## 🎯 关键技术实现 - -### 1. 逻辑删除 -所有删除操作都使用逻辑删除,不进行物理删除: -- 关注记录: `follow_status = 0` 表示已取消 -- 作品: `is_deleted = 1` 表示已删除 -- 作品关系: `is_deleted = 1` 表示已取消 - -**优点**: -- 数据可恢复 -- 保留历史记录 -- 便于数据分析 - -### 2. 无外键约束 -按照要求,所有表都不创建外键约束: -- 通过应用层逻辑保证数据一致性 -- 提高数据库性能 -- 便于分库分表 - -### 3. SQL语句分离 -所有SQL语句都写在Mapper XML文件中: -- 便于维护和优化 -- 支持复杂查询 -- 提高代码可读性 - -### 4. 层次分明 -代码结构清晰,职责明确: -``` -Controller层 (接口层) - ↓ 参数验证、权限检查 -Service层 (业务逻辑层) - ↓ 业务处理、事务管理 -Dao层 (数据访问层) - ↓ 数据库操作 -Mapper XML (SQL语句) -``` - ---- - -## 📝 生成的文档 - -### 1. 关注和作品模块对接完成报告.md -**内容**: 详细的对接报告,包括所有修改内容、接口对比、部署步骤等 - -### 2. 关注和作品模块-快速参考.md -**内容**: 快速参考文档,包括所有接口的请求示例和响应示例 - -### 3. 关注和作品模块验证清单.md -**内容**: 完整的验证清单,用于测试所有接口功能 - -### 4. 数据库更新-关注和作品模块.sql -**内容**: 数据库更新脚本,包括字段添加和验证 - ---- - -## 🔍 代码质量检查 - -### 编译检查 -✅ 所有修改的文件都通过了编译检查,无语法错误 - -**检查的文件**: -- Works.java -- WorksRequest.java -- WorksResponse.java -- WorksServiceImpl.java - -### 代码规范 -✅ 所有代码都符合项目规范: -- 使用Lombok简化代码 -- 使用Swagger注解生成API文档 -- 使用JPA注解定义实体 -- 使用MyBatis-Plus简化CRUD操作 - ---- - -## 🚀 部署指南 - -### 1. 数据库更新 -```bash -# 连接数据库 -mysql -u root -p - -# 执行更新脚本 -source /path/to/数据库更新-关注和作品模块.sql - -# 验证更新结果 -# 脚本会自动输出验证信息 -``` - -### 2. 后端编译 -```bash -cd Zhibo/zhibo-h -mvn clean package -DskipTests -``` - -### 3. 重启服务 -```bash -# 停止服务 -./shell/stopFront.sh - -# 启动服务 -./shell/startFront.sh - -# 查看日志 -tail -f logs/front.log -``` - -### 4. 验证接口 -使用 `关注和作品模块验证清单.md` 中的测试命令验证所有接口 - ---- - -## ⚠️ 注意事项 - -### 1. 字段名变化 -前端调用时需要注意以下字段名变化: - -| 模块 | 原字段名 | 新字段名 | -|-----|---------|---------| -| 作品 | coverImage | coverUrl | -| 作品 | images (String) | imageUrls (Array) | -| 作品 | userName | authorName | -| 作品 | userAvatar | authorAvatar | -| 关注 | avatarUrl | avatar | -| 关注 | isFollowBack | isMutualFollow | - -### 2. 作品类型 -发布作品时必须指定type字段: -- `IMAGE`: 图片作品(需要提供imageUrls) -- `VIDEO`: 视频作品(需要提供videoUrl) - -### 3. 数据类型转换 -- 后端存储: `images` 字段存储为逗号分隔的字符串 -- 前端使用: `imageUrls` 字段为字符串数组 -- Service层自动处理转换 - -### 4. 在线状态判断 -用户在线状态基于最后登录时间: -- 5分钟内有活动视为在线 -- 可在SQL中调整时间阈值 - ---- - -## 📊 工作量统计 - -### 代码修改 -- 实体类: 1个文件 -- Request对象: 2个文件 -- Response对象: 1个文件 -- Service实现: 1个文件 -- Mapper XML: 1个文件 - -### 文档编写 -- 对接完成报告: 1份 -- 快速参考文档: 1份 -- 验证清单: 1份 -- 对接总结: 1份 - -### 数据库脚本 -- 更新脚本: 1个 - -**总计**: 10个文件 - ---- - -## ✅ 验证结果 - -### 编译验证 -- [x] 所有Java文件编译通过 -- [x] 无语法错误 -- [x] 无类型错误 - -### 接口验证 -- [x] 关注功能模块7个接口参数正确 -- [x] 关注功能模块7个接口返回值正确 -- [x] 作品管理模块13个接口参数正确 -- [x] 作品管理模块13个接口返回值正确 - -### 业务逻辑验证 -- [x] 逻辑删除实现正确 -- [x] 无外键约束 -- [x] SQL语句分离 -- [x] 层次结构清晰 - ---- - -## 🎉 总结 - -本次对接工作已完成,所有接口都已按照文档要求实现: - -1. ✅ **实体类字段补齐**: Works实体类添加了type字段 -2. ✅ **Request/Response更新**: 所有字段名都与文档要求一致 -3. ✅ **Service层完善**: 正确处理新字段和类型转换 -4. ✅ **Mapper XML更新**: 字段名与文档要求一致 -5. ✅ **数据库更新**: 提供了完整的更新脚本 -6. ✅ **文档编写**: 提供了完整的文档和验证清单 - -**接口完成度**: 20/20 (100%) -**代码质量**: 优秀 -**文档完整性**: 完整 -**可部署性**: 可以直接部署 - ---- - -## 📞 后续工作 - -### 建议测试项 -1. 使用验证清单测试所有接口 -2. 进行压力测试验证性能 -3. 进行安全测试验证权限控制 - -### 可能的优化 -1. 添加缓存提高查询性能 -2. 添加消息队列处理异步任务 -3. 添加搜索引擎提高搜索性能 - ---- - -**完成时间**: 2024-12-30 -**状态**: ✅ 对接完成,可以进行测试和部署 diff --git a/关注页面修复说明.md b/关注页面修复说明.md deleted file mode 100644 index 776b233e..00000000 --- a/关注页面修复说明.md +++ /dev/null @@ -1,173 +0,0 @@ -# 关注页面修复说明 - -## 问题描述 -首页的"关注"标签页不显示已关注主播的直播间,即使用户已经关注了正在直播的主播。 - -## 问题原因 -原来的 `showFollowTab()` 方法实现有误: -- 显示的是推荐用户列表,而不是已关注主播的直播间 -- 使用了 `RecommendUserAdapter` 而不是房间适配器 -- 没有调用接口获取已关注主播的直播间 - -## 修复方案 - -### 1. 修改 `showFollowTab()` 方法 -**文件**: `android-app/app/src/main/java/com/example/livestreaming/MainActivity.java` - -**修改内容**: -- 移除推荐用户相关的代码 -- 使用房间列表适配器显示直播间 -- 调用新的 `fetchFollowedStreamersRooms()` 方法获取数据 - -### 2. 新增 `fetchFollowedStreamersRooms()` 方法 -获取已关注主播的直播间列表: - -```java -private void fetchFollowedStreamersRooms() { - // 1. 检查登录状态 - if (!AuthHelper.isLoggedIn(this)) { - // 显示未登录提示 - return; - } - - // 2. 获取所有直播间 - ApiClient.getService().getRooms() - .enqueue(new Callback>>() { - @Override - public void onResponse(...) { - // 3. 获取已关注的用户列表 - ApiClient.getService().getFollowingList(1, 1000) - .enqueue(new Callback<...>() { - @Override - public void onResponse(...) { - // 4. 筛选出已关注主播的直播间 - // 5. 更新UI显示 - } - }); - } - }); -} -``` - -### 3. 新增空状态处理方法 - -**`showNoFollowedStreamersState()`**: -- 显示"还没有关注主播"的提示 -- 提供"去发现"按钮,跳转到发现页面 - -**`showNoLiveFollowedStreamersState()`**: -- 显示"关注的主播都不在线"的提示 -- 提供"刷新"按钮重新加载 - -## 实现逻辑 - -### 数据获取流程 -``` -1. 用户点击"关注"标签 - ↓ -2. 检查登录状态 - ↓ -3. 获取所有直播间列表 (GET /api/front/live/public/rooms) - ↓ -4. 获取已关注用户列表 (GET /api/front/follow/following) - ↓ -5. 筛选:room.uid in followedUserIds - ↓ -6. 显示筛选后的直播间列表 -``` - -### 空状态处理 -``` -- 未登录 → 提示"请先登录" + "去登录"按钮 -- 没有关注 → 提示"还没有关注主播" + "去发现"按钮 -- 都不在线 → 提示"关注的主播都不在线" + "刷新"按钮 -- 网络错误 → 提示"网络错误" + "重试"按钮 -``` - -## 使用的API接口 - -### 1. 获取直播间列表 -``` -GET /api/front/live/public/rooms -``` - -### 2. 获取关注列表 -``` -GET /api/front/follow/following?page=1&pageSize=1000 -``` - -返回数据格式: -```json -{ - "code": 200, - "data": { - "list": [ - { - "uid": 1, - "nickname": "主播昵称", - "avatar": "头像URL", - ... - } - ], - "total": 10 - } -} -``` - -## 测试步骤 - -### 1. 未登录状态 -- 打开APP,点击"关注"标签 -- 应该显示"请先登录"提示 -- 点击"去登录"按钮,跳转到登录页面 - -### 2. 已登录但未关注任何人 -- 登录后,点击"关注"标签 -- 应该显示"还没有关注主播"提示 -- 点击"去发现"按钮,跳转到发现页面 - -### 3. 已关注但主播不在线 -- 关注一些主播(但他们都没有开播) -- 点击"关注"标签 -- 应该显示"关注的主播都不在线"提示 -- 点击"刷新"按钮重新加载 - -### 4. 已关注且主播在线 -- 关注一些正在直播的主播 -- 点击"关注"标签 -- 应该显示这些主播的直播间列表 -- 点击直播间可以进入观看 - -## 注意事项 - -1. **性能优化**: - - 关注列表使用较大的 pageSize (1000) 一次性获取 - - 如果用户关注数量很多,可以考虑分页加载 - -2. **数据刷新**: - - 下拉刷新会重新获取数据 - - 从其他页面返回时不会自动刷新,需要用户手动刷新 - -3. **错误处理**: - - 网络错误会显示错误提示和重试按钮 - - 接口返回错误会显示相应的空状态 - -4. **用户体验**: - - 首次加载显示骨架屏 - - 刷新时显示下拉刷新动画 - - 空状态提供明确的操作指引 - -## 相关文件 - -- Android 主页面: `android-app/app/src/main/java/com/example/livestreaming/MainActivity.java` -- API 接口定义: `android-app/app/src/main/java/com/example/livestreaming/net/ApiService.java` -- 后端关注接口: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/FollowController.java` -- 后端直播间接口: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java` - -## 后续优化建议 - -1. **添加缓存**:缓存关注列表,减少网络请求 -2. **实时更新**:使用 WebSocket 实时更新主播上线状态 -3. **排序优化**:优先显示正在直播的主播 -4. **推送通知**:关注的主播开播时发送推送通知 -5. **快速关注**:在关注页面也可以快速取消关注 diff --git a/关注页面问题已修复.md b/关注页面问题已修复.md deleted file mode 100644 index b91aca15..00000000 --- a/关注页面问题已修复.md +++ /dev/null @@ -1,201 +0,0 @@ -# 关注页面问题已修复 ✅ - -## 问题根本原因 - -**后端API返回的字段名与Android端期望的不匹配** - -- **Android端期望**:关注列表API返回的用户对象中包含 `uid` 字段 -- **后端实际返回**:只有 `userId` 字段,没有 `uid` 字段 -- **结果**:Android端无法提取用户ID,导致无法匹配直播间 - -## 已完成的修复 - -### 1. 修改后端SQL映射文件 - -文件:`Zhibo/zhibo-h/crmeb-service/src/main/resources/mapper/FollowRecordDao.xml` - -**修改内容**: -```xml - -SELECT - u.uid as userId, - u.nickname, - ... - - -SELECT - u.uid as userId, - u.uid as uid, -- 新增:同时返回uid字段 - u.nickname, - ... -``` - -这样后端API会同时返回 `userId` 和 `uid` 两个字段,兼容Android端的期望。 - -### 2. 重新编译后端代码 - -已成功编译: -``` -[INFO] BUILD SUCCESS -[INFO] Total time: 54.118 s -[INFO] Finished at: 2026-01-03T15:19:45+08:00 -``` - -编译后的jar文件位置: -``` -Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar -``` - -## 部署步骤 - -### 步骤1:部署后端代码 - -如果在服务器上,执行: -```bash -cd /root/zhibo/Zhibo/zhibo-h/crmeb-front -cp target/Crmeb-front.jar ./ -./restart.sh -``` - -或者重启服务: -```bash -sudo systemctl restart zhibo-front -``` - -### 步骤2:验证修复 - -#### 方法1:使用curl测试API -```bash -curl -X GET "http://your-server/api/front/follow/following?page=1&pageSize=10" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -期望返回: -```json -{ - "code": 200, - "message": "success", - "data": { - "list": [ - { - "userId": 41, - "uid": 41, // ✅ 现在包含uid字段 - "nickname": "夏至已至", - "avatar": "...", - ... - } - ] - } -} -``` - -#### 方法2:Android端测试 -1. 重启Android应用 -2. 登录用户43 (xiaofeng) -3. 点击"关注"标签页 -4. 应该能看到已关注主播的直播间 - -#### 方法3:查看Android日志 -在Logcat中应该看到: -``` -获取到关注列表,数量: 1 -关注的用户ID: 41, 昵称: 夏至已至 -所有直播间数量: X -直播间: 火影忍者, uid=41, isLive=true, 是否匹配=true -匹配成功!添加直播间: 火影忍者 -筛选后的直播间数量: 1 -``` - -## 技术细节 - -### Android端的匹配逻辑 - -```java -// MainActivity.java 中的代码 -for (Map user : followingList) { - Object uidObj = user.get("uid"); // 期望获取uid字段 - if (uidObj instanceof Number) { - int uid = ((Number) uidObj).intValue(); - followedUserIds.add(uid); - } -} - -// 然后用这些ID去匹配直播间 -for (Room room : allRoomsList) { - Integer roomUid = room.getUid(); - if (roomUid != null && followedUserIds.contains(roomUid)) { - filteredRooms.add(room); // 匹配成功 - } -} -``` - -### 后端的SQL查询 - -```sql --- 获取关注列表时,同时返回userId和uid -SELECT - u.uid as userId, -- 保持兼容性 - u.uid as uid, -- Android端需要的字段 - u.nickname, - u.avatar, - u.mark as signature, - fr.create_time as followTime, - CASE - WHEN TIMESTAMPDIFF(MINUTE, u.last_login_time, NOW()) < 5 THEN 1 - ELSE 0 - END as isOnline -FROM eb_follow_record fr -JOIN eb_user u ON fr.followed_id = u.uid -WHERE fr.follower_id = #{userId} - AND (fr.follow_status = 1 OR fr.follow_status = '关注') - AND fr.is_deleted = 0 -ORDER BY fr.create_time DESC -``` - -## 其他可能需要的修复 - -如果部署后仍然有问题,可能还需要: - -### 1. 修复数据库数据 -```bash -mysql -u root -p zhibo < final_fix_follow_issue.sql -``` - -这个脚本会: -- 修复关注状态值("关注" → "1") -- 确保主播标识正确 -- 创建测试数据 - -### 2. 检查数据库连接 -```sql --- 确认关注记录存在 -SELECT * FROM eb_follow_record WHERE follower_id = 43; - --- 确认主播存在 -SELECT * FROM eb_user WHERE uid = 41 AND is_streamer = 1; - --- 确认直播间存在 -SELECT * FROM eb_live_room WHERE uid = 41; -``` - -## 预期结果 - -修复完成后: - -✅ 关注列表API返回包含 `uid` 字段的用户对象 -✅ Android端能正确提取用户ID -✅ Android端能匹配到已关注主播的直播间 -✅ 关注页面显示已关注主播的直播间 -✅ 支持下拉刷新 -✅ 正在直播的房间优先显示 - -## 总结 - -这是一个典型的**前后端字段名不匹配**问题: -- 后端只返回 `userId` -- Android端期望 `uid` -- 解决方案:后端同时返回两个字段,保持兼容性 - -修复非常简单,只需要在SQL中添加一行 `u.uid as uid`,然后重新编译部署即可。 - -现在请部署后端代码,然后测试关注页面功能! diff --git a/关注页面问题总结.md b/关注页面问题总结.md deleted file mode 100644 index c449db7d..00000000 --- a/关注页面问题总结.md +++ /dev/null @@ -1,209 +0,0 @@ -# 关注页面问题总结 - -## 问题现象 -用户 43 (xiaofeng) 关注了用户 41 (夏至已至),而用户 41 有一个正在直播的房间(火影忍者),但是在关注页面看不到这个直播间。 - -## 数据库现状 - -### 1. 用户数据 -- **用户 43 (xiaofeng)**:is_streamer = 1(主播) -- **用户 41 (夏至已至)**:is_streamer = 1(主播) - -### 2. 关注记录 -``` -id: 12 -follower_id: 43 (xiaofeng) -followed_id: 41 (夏至已至) -follow_status: "关注" (字符串) -is_deleted: 0 -create_time: 2026-01-03 14:19:16 -``` - -### 3. 直播间数据 -用户 41 有 3 个直播间: -- **房间 8:火影忍者 (is_live = 1,正在直播)** -- 房间 1:11 (is_live = 0) -- 房间 9:aedfsd (is_live = 0) - -## 问题原因 - -### 主要问题:关注状态字段值不一致 - -**数据库中的值**:`follow_status = "关注"` (字符串) - -**后端查询条件**: -```sql -WHERE follow_status IN ('1', '关注') -``` - -**Android 端查询条件**: -```java -WHERE follow_status IN ('1', '关注') -``` - -虽然查询条件包含了 `'关注'`,但是: -1. 数据类型不一致可能导致索引失效 -2. 不同数据库版本对字符串比较的处理可能不同 -3. 字段定义为 `tinyint(4)` 但存储了字符串值 - -## 解决方案 - -### 方案 1:统一关注状态值(推荐) - -执行 `fix_follow_status.sql` 脚本: - -```sql --- 将字符串"关注"统一为数字"1" -UPDATE eb_follow_record -SET follow_status = '1' -WHERE follow_status = '关注'; - --- 将字符串"取消关注"统一为数字"0" -UPDATE eb_follow_record -SET follow_status = '0' -WHERE follow_status IN ('取消关注', '未关注'); -``` - -### 方案 2:修改查询条件 - -如果不想修改数据,可以修改查询条件: - -**后端修改**: -```java -// 修改前 -WHERE follow_status IN ('1', '关注') - -// 修改后 -WHERE (follow_status = '1' OR follow_status = '关注') -``` - -**但这不是最佳实践**,因为: -- 性能较差 -- 数据不规范 -- 可能导致其他问题 - -## 执行步骤 - -### 1. 备份数据(重要!) -```sql -CREATE TABLE eb_follow_record_backup AS -SELECT * FROM eb_follow_record; -``` - -### 2. 执行修复脚本 -```bash -mysql -u root -p zhibo < fix_follow_status.sql -``` - -### 3. 验证修复结果 -执行 `test_user_43_follow.sql` 验证: -```bash -mysql -u root -p zhibo < test_user_43_follow.sql -``` - -预期结果: -- 用户 43 应该能看到用户 41 的关注记录 -- 应该能看到用户 41 的 3 个直播间 -- 应该能看到正在直播的"火影忍者"房间 - -### 4. 重启后端服务 -```bash -cd /root/zhibo/Zhibo/zhibo-h/crmeb-front -./restart.sh -``` - -### 5. 测试 Android 应用 -1. 登录用户 43 (xiaofeng) -2. 进入"关注"标签页 -3. 应该能看到用户 41 的直播间"火影忍者" - -## 预防措施 - -### 1. 修改数据库表定义 -确保 `follow_status` 字段使用数字类型: -```sql -ALTER TABLE eb_follow_record -MODIFY COLUMN follow_status TINYINT(4) NOT NULL DEFAULT 1 -COMMENT '关注状态:1-已关注 0-已取消'; -``` - -### 2. 添加数据库约束 -```sql -ALTER TABLE eb_follow_record -ADD CONSTRAINT chk_follow_status -CHECK (follow_status IN (0, 1)); -``` - -### 3. 后端代码规范 -在插入/更新关注记录时,统一使用数字: -```java -record.setFollowStatus("1"); // 关注 -record.setFollowStatus("0"); // 取消关注 -``` - -### 4. 添加单元测试 -测试关注功能的各种场景,确保数据一致性。 - -## 其他发现 - -### 1. 直播间表缺少字段 -`eb_live_room` 表缺少 `cover_url` 字段,SQL 查询会报错。 - -**解决方案**: -```sql --- 检查字段是否存在 -SHOW COLUMNS FROM eb_live_room LIKE 'cover_url'; - --- 如果不存在,添加字段 -ALTER TABLE eb_live_room -ADD COLUMN cover_url VARCHAR(255) DEFAULT NULL -COMMENT '直播间封面图' -AFTER title; -``` - -### 2. 用户头像字段 -`eb_user` 表应该有 `avatar` 字段用于存储用户头像。 - -**检查**: -```sql -SHOW COLUMNS FROM eb_user LIKE 'avatar'; -``` - -## 测试用例 - -### 测试用例 1:已关注且主播在线 -- **用户**:43 (xiaofeng) -- **关注**:41 (夏至已至) -- **直播间**:火影忍者 (is_live = 1) -- **预期**:能在关注页面看到这个直播间 - -### 测试用例 2:已关注但主播不在线 -- **用户**:43 (xiaofeng) -- **关注**:41 (夏至已至) -- **直播间**:11, aedfsd (is_live = 0) -- **预期**:显示"关注的主播都不在线" - -### 测试用例 3:未关注任何人 -- **用户**:新用户 -- **关注**:无 -- **预期**:显示"还没有关注主播" - -### 测试用例 4:未登录 -- **用户**:未登录 -- **预期**:显示"请先登录" - -## 相关文件 - -- 测试脚本:`test_user_43_follow.sql` -- 修复脚本:`fix_follow_status.sql` -- 调试脚本:`debug_follow_rooms.sql` -- Android 代码:`android-app/app/src/main/java/com/example/livestreaming/MainActivity.java` -- 后端代码:`Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/FollowController.java` - -## 总结 - -问题的根本原因是 **关注状态字段值不一致**:数据库中存储的是字符串 `"关注"`,而字段定义是 `tinyint(4)`。 - -**最佳解决方案**:执行 `fix_follow_status.sql` 统一将状态值改为数字 `'1'` 和 `'0'`。 - -修复后,用户 43 应该能在关注页面看到用户 41 正在直播的"火影忍者"房间。 diff --git a/创建关注表-zhibo数据库.sql b/创建关注表-zhibo数据库.sql deleted file mode 100644 index 6b99c25b..00000000 --- a/创建关注表-zhibo数据库.sql +++ /dev/null @@ -1,63 +0,0 @@ --- 在 zhibo 数据库中创建关注记录表 -USE zhibo; - --- 创建 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; -SHOW CREATE TABLE eb_follow_record; - --- 如果 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); - --- 显示统计 -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; - -SELECT '✓ 完成!' as status; diff --git a/双端交互逻辑设计报告.md b/双端交互逻辑设计报告.md deleted file mode 100644 index 649628f8..00000000 --- a/双端交互逻辑设计报告.md +++ /dev/null @@ -1,4667 +0,0 @@ -# 直播平台双端交互逻辑设计报告 - -> 生成时间:2024年12月29日 -> 版本:V2.0 -> 设计范围:Android移动端 + Vue管理端 -> 重点优化:缘池(多板块社区)、许愿树(节日祝福留言板) - ---- - -## 目录 - -1. [系统架构总览](#一系统架构总览) -2. [双端功能对照表](#二双端功能对照表) -3. [核心交互流程设计](#三核心交互流程设计) -4. [缘池重新设计方案](#四缘池重新设计方案多板块交流社区) -5. [许愿树重新设计方案](#五许愿树重新设计方案节日愿望祝福留言板) -6. [API接口设计规范](#六api接口设计规范) -7. [数据库设计](#七数据库设计) -8. [实时通信设计](#八实时通信设计) -9. [管理端配套功能](#九管理端配套功能) -10. [开发实施计划](#十开发实施计划) - ---- - -## 一、系统架构总览 - -### 1.1 整体架构图 - -``` -┌─────────────────────────────────────────────────────────────────────────────┐ -│ 用户层 (User Layer) │ -├─────────────────────────────────┬───────────────────────────────────────────┤ -│ Android 移动端 (APP) │ Vue 管理端 (Admin) │ -│ ┌─────────────────────────┐ │ ┌─────────────────────────────────┐ │ -│ │ 首页 │ 缘池 │许愿树│消息│我的│ │ │ 仪表盘 │ 用户 │ 直播 │ 社区 │ 活动 │ │ -│ └─────────────────────────┘ │ └─────────────────────────────────┘ │ -└─────────────────────────────────┴───────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────────────┐ -│ 网关层 (Gateway Layer) │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ -│ │ API网关 │ │ 负载均衡 │ │ 限流熔断 │ │ 统一认证 (JWT) │ │ -│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────────────┘ │ -└─────────────────────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────────────┐ -│ 服务层 (Service Layer) │ -│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────────┐ │ -│ │ 用户服务 │ │ 直播服务 │ │ 社区服务 │ │ 活动服务 │ │ 消息服务 │ │ -│ │ (User) │ │ (Live) │ │(Community)│ │(Activity) │ │ (Message) │ │ -│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ └───────────────┘ │ -└─────────────────────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────────────┐ -│ 数据层 (Data Layer) │ -│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────────┐ │ -│ │ MySQL │ │ Redis │ │ MongoDB │ │ OSS │ │ Elasticsearch│ │ -│ │ (主数据) │ │ (缓存) │ │ (动态) │ │ (文件) │ │ (搜索) │ │ -│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ └───────────────┘ │ -└─────────────────────────────────────────────────────────────────────────────┘ -``` - -### 1.2 技术栈对照 - -| 层级 | 移动端 (Android) | 管理端 (Vue) | 后端 (Java) | -|------|------------------|--------------|-------------| -| 框架 | Android SDK | Vue 2.x + Element UI | Spring Boot | -| 网络 | Retrofit2 + OkHttp | Axios | Spring MVC | -| 状态 | SharedPreferences | Vuex | Redis Session | -| 实时 | WebSocket | WebSocket | Netty | -| 存储 | SQLite/Room | LocalStorage | MySQL + Redis | - ---- - -## 二、双端功能对照表 - -### 2.1 核心功能模块对照 - -| 功能模块 | 移动端功能 | 管理端功能 | 交互关系 | -|----------|------------|------------|----------| -| **用户认证** | 登录/注册/验证码 | 用户列表/封禁/等级 | 管理端管控用户状态 | -| **直播观看** | 观看/弹幕/礼物 | 房间管理/弹幕审核 | 管理端可关闭直播间 | -| **社交互动** | 好友/群组/私聊 | 好友关系/会话监管 | 管理端可解除关系 | -| **缘池社区** | 板块浏览/发帖/互动 | 板块管理/内容审核 | 管理端配置板块 | -| **许愿树** | 发布祝福/查看/互动 | 活动配置/内容审核 | 管理端配置节日活动 | -| **礼物打赏** | 发送礼物/充值 | 礼物配置/打赏记录 | 管理端配置礼物 | -| **消息通知** | 接收推送/消息列表 | 系统消息/推送管理 | 管理端发送通知 | -| **个人中心** | 资料编辑/作品管理 | 用户详情/内容审核 | 管理端可修改资料 | - -### 2.2 数据流向图 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 数据流向示意图 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 (APP) 后端服务 管理端 (Admin) │ -│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ -│ │ 用户 │ ──── 请求 ────▶ │ API │ ◀── 请求 ─── │ 运营 │ │ -│ │ 操作 │ ◀─── 响应 ──── │ 服务 │ ─── 响应 ──▶ │ 操作 │ │ -│ └─────────┘ └─────────┘ └─────────┘ │ -│ │ │ │ │ -│ │ ▼ │ │ -│ │ ┌─────────┐ │ │ -│ │ │ 数据库 │ │ │ -│ │ │ + 缓存 │ │ │ -│ │ └─────────┘ │ │ -│ │ │ │ │ -│ │ ┌───────────────────┼───────────────────┐ │ │ -│ │ ▼ ▼ ▼ │ │ -│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐│ │ -│ └───▶│WebSocket│◀──────▶│ 消息队列│◀───────▶│ 推送 │◀┘ │ -│ │ 实时 │ │ (Redis) │ │ 服务 │ │ -│ └─────────┘ └─────────┘ └─────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - ---- - -## 三、核心交互流程设计 - -### 3.1 用户认证流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 用户认证交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 发送验证码请求 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 2. 生成验证码 │ │ -│ │ │ 存入Redis(5分钟) │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 3. 返回发送成功 │ │ │ -│ │ │ │ │ -│ │ 4. 提交登录/注册 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 5. 验证码校验 │ │ -│ │ │ 用户状态检查 │ │ -│ │ │ 生成JWT Token │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 6. 返回Token+用户信息 │ │ │ -│ │ │ │ │ -│ │ 7. 存储Token │ │ │ -│ │ 进入首页 │ │ │ -│ │ │ │ │ -│ │ │ 8. 记录登录日志 ──────────▶ │ │ -│ │ │ │ 9. 可查│ -│ │ │ │ 看 │ -│ │ │ │ 日志 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 3.2 直播观看交互流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 直播观看交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 进入直播间 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 2. 获取房间信息 │ │ -│ │ │ 获取播放地址 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 3. 返回房间详情 │ │ │ -│ │ │ │ │ -│ │ 4. 建立WebSocket连接 │ │ │ -│ │ ═══════════════════════════│ │ │ -│ │ │ 5. 加入房间 │ │ -│ │ │ 更新在线人数 │ │ -│ │ │ │ │ -│ │ 6. 发送弹幕 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 7. 敏感词过滤 │ │ -│ │ │ 广播给房间用户 │ │ -│ │ ◀═══════════════════════════│ │ │ -│ │ 8. 接收弹幕推送 │ │ │ -│ │ │ │ │ -│ │ │ ◀─────── │ 9. 关闭│ -│ │ │ 10. 强制关闭直播 │ 直播 │ -│ │ ◀═══════════════════════════│ │ │ -│ │ 11. 收到关闭通知 │ │ │ -│ │ 退出直播间 │ │ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 3.3 礼物打赏交互流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 礼物打赏交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 获取礼物列表 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 2. 查询礼物配置 │ │ -│ │ ◀───────────────────────── │ (从Redis缓存) │ │ -│ │ 3. 返回礼物列表 │ │ │ -│ │ │ │ │ -│ │ 4. 发送礼物 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 5. 校验余额 │ │ -│ │ │ 扣除金币 │ │ -│ │ │ 增加主播收益 │ │ -│ │ │ 记录打赏流水 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 6. 返回发送成功 │ │ │ -│ │ │ │ │ -│ │ │ 7. 广播礼物特效 │ │ -│ │ ◀═══════════════════════════│ (WebSocket) │ │ -│ │ 8. 显示礼物动画 │ │ │ -│ │ │ │ │ -│ │ │ 9. 记录打赏日志 ──────────▶ │ │ -│ │ │ │ 10.可查│ -│ │ │ │ 看 │ -│ │ │ │ 记录 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - ---- - -## 四、缘池重新设计方案(多板块交流社区) - -### 4.1 设计理念 - -将原有的"附近用户匹配"功能升级为**多板块交流社区**,打造一个集内容分享、兴趣交流、社交互动于一体的综合社区平台。 - -### 4.2 功能架构 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 缘池 - 多板块交流社区 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────────────┐ │ │ -│ │ │ 搜索 │ │ 发布 │ │ 通知 │ │ 消息 │ │ 个人中心 │ │ │ -│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 板块分类标签 │ │ -│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ -│ │ │推荐│ │热门│ │游戏│ │音乐│ │美食│ │旅行│ │情感│ │更多│ │ │ -│ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 内容流区域 │ │ -│ │ ┌─────────────────────────────────────────────────────────┐ │ │ -│ │ │ 帖子卡片 │ │ │ -│ │ │ ┌──────┐ ┌─────────────────────────────────────────┐ │ │ │ -│ │ │ │ 头像 │ │ 用户名 · 板块标签 · 发布时间 │ │ │ │ -│ │ │ └──────┘ └─────────────────────────────────────────┘ │ │ │ -│ │ │ ┌─────────────────────────────────────────────────────┐│ │ │ -│ │ │ │ 帖子内容文字... ││ │ │ -│ │ │ └─────────────────────────────────────────────────────┘│ │ │ -│ │ │ ┌─────────────────────────────────────────────────────┐│ │ │ -│ │ │ │ 图片/视频区域 (九宫格/单图/视频) ││ │ │ -│ │ │ └─────────────────────────────────────────────────────┘│ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────────────────┐│ │ │ -│ │ │ │ 👍 点赞│ │ 💬 评论│ │ ↗ 分享│ │ ⭐ 收藏 ││ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────────────────┘│ │ │ -│ │ └─────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────────────┐ │ │ -│ │ │ 更多帖子卡片... │ │ │ -│ │ └─────────────────────────────────────────────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 悬浮发布按钮 │ │ -│ │ ┌───┐ │ │ -│ │ │ + │ │ │ -│ │ └───┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 4.3 板块分类设计 - -| 板块ID | 板块名称 | 图标 | 描述 | 排序 | -|--------|----------|------|------|------| -| 1 | 推荐 | 🔥 | 算法推荐热门内容 | 1 | -| 2 | 热门 | 📈 | 24小时热度排行 | 2 | -| 3 | 游戏 | 🎮 | 游戏攻略、组队、分享 | 3 | -| 4 | 音乐 | 🎵 | 音乐分享、翻唱、原创 | 4 | -| 5 | 美食 | 🍜 | 美食探店、食谱分享 | 5 | -| 6 | 旅行 | ✈️ | 旅行攻略、风景分享 | 6 | -| 7 | 情感 | 💕 | 情感交流、心情分享 | 7 | -| 8 | 穿搭 | 👗 | 穿搭分享、时尚潮流 | 8 | -| 9 | 宠物 | 🐱 | 萌宠分享、养宠经验 | 9 | -| 10 | 运动 | ⚽ | 运动健身、赛事讨论 | 10 | -| 11 | 学习 | 📚 | 学习交流、知识分享 | 11 | -| 12 | 直播 | 📺 | 直播预告、主播互动 | 12 | - -### 4.4 移动端页面设计 - -#### 4.4.1 社区首页 (CommunityActivity) - -```java -// 页面结构 -CommunityActivity -├── TopBar (顶部栏) -│ ├── SearchButton (搜索按钮) -│ ├── TitleText (缘池) -│ ├── NotificationButton (通知) -│ └── PublishButton (发布) -├── CategoryTabs (板块标签) -│ └── TabLayout (可滑动标签) -├── ContentList (内容列表) -│ └── RecyclerView (瀑布流/列表) -│ └── PostCardAdapter (帖子卡片适配器) -├── FloatingActionButton (悬浮发布按钮) -└── BottomNavigation (底部导航) -``` - -#### 4.4.2 帖子详情页 (PostDetailActivity) - -```java -// 页面结构 -PostDetailActivity -├── TopBar (顶部栏) -│ ├── BackButton (返回) -│ ├── TitleText (帖子详情) -│ ├── ShareButton (分享) -│ └── MoreButton (更多) -├── PostContent (帖子内容) -│ ├── UserInfo (用户信息) -│ ├── ContentText (文字内容) -│ ├── MediaArea (图片/视频) -│ ├── LocationTag (位置标签) -│ └── TimeInfo (发布时间) -├── ActionBar (操作栏) -│ ├── LikeButton (点赞) -│ ├── CommentButton (评论) -│ ├── ShareButton (分享) -│ └── FavoriteButton (收藏) -├── CommentList (评论列表) -│ └── RecyclerView -│ └── CommentAdapter -└── CommentInput (评论输入框) - ├── EditText (输入框) - ├── EmojiButton (表情) - └── SendButton (发送) -``` - -#### 4.4.3 发布帖子页 (PublishPostActivity) - -```java -// 页面结构 -PublishPostActivity -├── TopBar (顶部栏) -│ ├── CloseButton (关闭) -│ ├── TitleText (发布动态) -│ └── PublishButton (发布) -├── ContentInput (内容输入) -│ └── EditText (多行文本) -├── MediaPicker (媒体选择) -│ ├── ImageGrid (图片网格) -│ ├── AddImageButton (添加图片) -│ └── VideoPreview (视频预览) -├── CategorySelector (板块选择) -│ └── ChipGroup (标签组) -├── LocationPicker (位置选择) -│ └── LocationText (位置文本) -├── TopicInput (话题输入) -│ └── ChipGroup (话题标签) -└── PrivacySelector (可见范围) - └── RadioGroup (公开/好友可见/私密) -``` - -### 4.5 交互流程设计 - -#### 4.5.1 发布帖子流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 发布帖子交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 点击发布按钮 │ │ │ -│ │ 打开发布页面 │ │ │ -│ │ │ │ │ -│ │ 2. 选择图片/视频 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 3. 上传文件到OSS │ │ -│ │ ◀───────────────────────── │ 返回文件URL │ │ -│ │ 4. 显示上传进度 │ │ │ -│ │ │ │ │ -│ │ 5. 填写内容 │ │ │ -│ │ 选择板块 │ │ │ -│ │ 添加话题 │ │ │ -│ │ 选择位置 │ │ │ -│ │ │ │ │ -│ │ 6. 点击发布 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 7. 内容审核 │ │ -│ │ │ 敏感词过滤 │ │ -│ │ │ 图片审核 │ │ -│ │ │ 保存到数据库 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 8. 发布成功 │ │ │ -│ │ 跳转到帖子详情 │ │ │ -│ │ │ │ │ -│ │ │ 9. 推送给关注者 │ │ -│ │ │ 更新热度排行 │ │ -│ │ │ │ │ -│ │ │ 10. 记录发布日志 ─────────▶ │ │ -│ │ │ │ 11.可审│ -│ │ │ │ 核 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -#### 4.5.2 浏览帖子流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 浏览帖子交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 进入缘池页面 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 2. 获取板块列表 │ │ -│ │ │ 获取推荐帖子 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 3. 显示板块和帖子 │ │ │ -│ │ │ │ │ -│ │ 4. 切换板块 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 5. 获取板块帖子 │ │ -│ │ │ (分页加载) │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 6. 显示板块帖子 │ │ │ -│ │ │ │ │ -│ │ 7. 下拉刷新 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 8. 获取最新帖子 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 9. 更新列表 │ │ │ -│ │ │ │ │ -│ │ 10. 上拉加载更多 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 11. 获取下一页 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 12. 追加到列表 │ │ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 4.6 缘池API接口设计 - -#### 4.6.1 移动端API (前台) - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 缘池社区 - 移动端API接口 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 板块管理 │ -│ ├── GET /api/front/community/categories # 获取板块列表 │ -│ └── GET /api/front/community/categories/{id} # 获取板块详情 │ -│ │ -│ 帖子管理 │ -│ ├── GET /api/front/community/posts # 获取帖子列表 │ -│ │ ?categoryId={id}&page={page}&pageSize={size}&sort={sort} │ -│ ├── GET /api/front/community/posts/{id} # 获取帖子详情 │ -│ ├── POST /api/front/community/posts # 发布帖子 │ -│ ├── PUT /api/front/community/posts/{id} # 编辑帖子 │ -│ └── DELETE /api/front/community/posts/{id} # 删除帖子 │ -│ │ -│ 互动功能 │ -│ ├── POST /api/front/community/posts/{id}/like # 点赞帖子 │ -│ ├── DELETE /api/front/community/posts/{id}/like # 取消点赞 │ -│ ├── POST /api/front/community/posts/{id}/favorite # 收藏帖子 │ -│ ├── DELETE /api/front/community/posts/{id}/favorite # 取消收藏 │ -│ └── POST /api/front/community/posts/{id}/share # 分享帖子 │ -│ │ -│ 评论功能 │ -│ ├── GET /api/front/community/posts/{id}/comments # 获取评论列表 │ -│ ├── POST /api/front/community/posts/{id}/comments # 发表评论 │ -│ ├── POST /api/front/community/comments/{id}/reply # 回复评论 │ -│ ├── DELETE /api/front/community/comments/{id} # 删除评论 │ -│ └── POST /api/front/community/comments/{id}/like # 点赞评论 │ -│ │ -│ 搜索功能 │ -│ ├── GET /api/front/community/search # 搜索帖子 │ -│ │ ?keyword={keyword}&categoryId={id}&page={page} │ -│ └── GET /api/front/community/topics # 获取热门话题 │ -│ │ -│ 用户相关 │ -│ ├── GET /api/front/community/users/{id}/posts # 获取用户帖子 │ -│ ├── GET /api/front/community/my/posts # 我的帖子 │ -│ ├── GET /api/front/community/my/favorites # 我的收藏 │ -│ └── GET /api/front/community/my/likes # 我的点赞 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -#### 4.6.2 管理端API (后台) - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 缘池社区 - 管理端API接口 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 板块管理 │ -│ ├── GET /api/admin/community/categories # 获取板块列表 │ -│ ├── POST /api/admin/community/categories # 创建板块 │ -│ ├── PUT /api/admin/community/categories/{id} # 编辑板块 │ -│ ├── DELETE /api/admin/community/categories/{id} # 删除板块 │ -│ └── PUT /api/admin/community/categories/sort # 板块排序 │ -│ │ -│ 帖子审核 │ -│ ├── GET /api/admin/community/posts # 获取帖子列表 │ -│ │ ?status={status}&categoryId={id}&page={page} │ -│ ├── GET /api/admin/community/posts/{id} # 获取帖子详情 │ -│ ├── PUT /api/admin/community/posts/{id}/audit # 审核帖子 │ -│ │ body: {status: "approved"|"rejected", reason: ""} │ -│ ├── PUT /api/admin/community/posts/{id}/top # 置顶帖子 │ -│ ├── PUT /api/admin/community/posts/{id}/recommend # 推荐帖子 │ -│ └── DELETE /api/admin/community/posts/{id} # 删除帖子 │ -│ │ -│ 评论管理 │ -│ ├── GET /api/admin/community/comments # 获取评论列表 │ -│ ├── PUT /api/admin/community/comments/{id}/audit # 审核评论 │ -│ └── DELETE /api/admin/community/comments/{id} # 删除评论 │ -│ │ -│ 话题管理 │ -│ ├── GET /api/admin/community/topics # 获取话题列表 │ -│ ├── POST /api/admin/community/topics # 创建话题 │ -│ ├── PUT /api/admin/community/topics/{id} # 编辑话题 │ -│ └── DELETE /api/admin/community/topics/{id} # 删除话题 │ -│ │ -│ 数据统计 │ -│ ├── GET /api/admin/community/statistics # 社区统计 │ -│ ├── GET /api/admin/community/statistics/posts # 帖子统计 │ -│ └── GET /api/admin/community/statistics/users # 用户活跃统计 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 4.7 数据模型设计 - -#### 4.7.1 帖子数据模型 - -```json -// Post (帖子) -{ - "id": 10001, - "userId": 1001, - "userInfo": { - "id": 1001, - "nickname": "小明", - "avatar": "https://xxx/avatar.jpg", - "level": 5, - "isVip": true - }, - "categoryId": 3, - "categoryName": "游戏", - "content": "今天吃鸡成功!分享一下我的游戏心得...", - "images": [ - "https://xxx/img1.jpg", - "https://xxx/img2.jpg" - ], - "video": null, - "location": { - "name": "广西南宁", - "latitude": 22.82, - "longitude": 108.32 - }, - "topics": ["#吃鸡", "#游戏攻略"], - "visibility": "public", - "likeCount": 128, - "commentCount": 32, - "shareCount": 15, - "favoriteCount": 45, - "viewCount": 1024, - "isLiked": false, - "isFavorited": false, - "isTop": false, - "isRecommend": true, - "status": "approved", - "createdAt": "2024-12-29T10:30:00Z", - "updatedAt": "2024-12-29T10:30:00Z" -} -``` - -#### 4.7.2 评论数据模型 - -```json -// Comment (评论) -{ - "id": 20001, - "postId": 10001, - "userId": 1002, - "userInfo": { - "id": 1002, - "nickname": "小红", - "avatar": "https://xxx/avatar2.jpg" - }, - "content": "写得太好了,学到了!", - "parentId": null, - "replyTo": null, - "likeCount": 15, - "isLiked": false, - "status": "approved", - "createdAt": "2024-12-29T11:00:00Z", - "replies": [ - { - "id": 20002, - "userId": 1001, - "userInfo": {...}, - "content": "谢谢支持!", - "parentId": 20001, - "replyTo": { - "id": 1002, - "nickname": "小红" - }, - "createdAt": "2024-12-29T11:05:00Z" - } - ] -} -``` - ---- - -## 五、许愿树重新设计方案(节日愿望祝福留言板) - -### 5.1 设计理念 - -将许愿树打造为**节日愿望祝福留言板**,结合节日氛围,让用户可以发布祝福、许愿、互动,营造温馨的社区氛围。 - -### 5.2 功能架构 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 许愿树 - 节日愿望祝福留言板 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 🌳 许愿树 🔔 通知 🔍 搜索 │ │ │ -│ │ └────────────────────────────────────────────────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 节日活动Banner │ │ -│ │ ┌────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 🎄 元旦许愿活动 │ │ │ -│ │ │ 许下新年愿望,赢取丰厚奖励! │ │ │ -│ │ │ 活动时间:2024.12.31 - 2025.01.03 │ │ │ -│ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 倒计时: 02:15:30:45 │ │ │ │ -│ │ │ └──────────────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 节日分类标签 │ │ -│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ -│ │ │全部│ │元旦│ │春节│ │情人│ │生日│ │祝福│ │许愿│ │ │ -│ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 许愿树3D展示区 │ │ -│ │ ┌────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 🌳 │ │ │ -│ │ │ /│\ │ │ │ -│ │ │ / │ \ │ │ │ -│ │ │ 🎀 / │ \ 🎁 │ │ │ -│ │ │ / │ \ │ │ │ -│ │ │ 🌟 / │ \ ⭐ │ │ │ -│ │ │ / │ \ │ │ │ -│ │ │ 💝 / │ \ 🎊 │ │ │ -│ │ │ ───────────────── │ │ │ -│ │ │ │ │ │ -│ │ │ 点击树上的装饰物查看祝福 │ │ │ -│ │ └────────────────────────────────────────────────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 祝福留言瀑布流 │ │ -│ │ ┌─────────────────────────────────────────────────────────┐ │ │ -│ │ │ 祝福卡片 │ │ │ -│ │ │ ┌──────┐ ┌─────────────────────────────────────────┐ │ │ │ -│ │ │ │ 头像 │ │ 用户名 · 元旦祝福 · 1小时前 │ │ │ │ -│ │ │ └──────┘ └─────────────────────────────────────────┘ │ │ │ -│ │ │ ┌─────────────────────────────────────────────────────┐│ │ │ -│ │ │ │ 🎉 新年快乐!愿新的一年万事如意,心想事成! ││ │ │ -│ │ │ └─────────────────────────────────────────────────────┘│ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ ❤️ 128 │ │ 💬 32 │ │ 🎁 送礼│ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ └─────────────────────────────────────────────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ 发布祝福按钮 │ │ -│ │ ┌─────────────────┐ │ │ -│ │ │ ✨ 发布祝福 │ │ │ -│ │ └─────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 5.3 节日活动分类 - -| 活动ID | 节日名称 | 图标 | 活动时间 | 主题色 | -|--------|----------|------|----------|--------| -| 1 | 元旦 | 🎉 | 12.31-01.03 | #FF6B6B | -| 2 | 春节 | 🧧 | 农历除夕-正月十五 | #E74C3C | -| 3 | 情人节 | 💕 | 02.13-02.15 | #FF69B4 | -| 4 | 妇女节 | 🌸 | 03.07-03.09 | #FFB6C1 | -| 5 | 清明节 | 🌿 | 清明前后3天 | #90EE90 | -| 6 | 劳动节 | 💪 | 04.30-05.03 | #FFA500 | -| 7 | 母亲节 | 🌹 | 5月第二个周日 | #FF1493 | -| 8 | 儿童节 | 🎈 | 05.31-06.02 | #87CEEB | -| 9 | 父亲节 | 👔 | 6月第三个周日 | #4169E1 | -| 10 | 端午节 | 🐲 | 端午前后3天 | #228B22 | -| 11 | 七夕 | 🌙 | 农历七月初七 | #9370DB | -| 12 | 中秋节 | 🥮 | 中秋前后3天 | #FFD700 | -| 13 | 国庆节 | 🇨🇳 | 09.30-10.07 | #FF0000 | -| 14 | 圣诞节 | 🎄 | 12.24-12.26 | #228B22 | -| 15 | 生日祝福 | 🎂 | 全年 | #FF69B4 | -| 16 | 日常祝福 | ✨ | 全年 | #9B59B6 | - -### 5.4 移动端页面设计 - -#### 5.4.1 许愿树首页 (WishTreeActivity) - -```java -// 页面结构 -WishTreeActivity -├── TopBar (顶部栏) -│ ├── TitleImage (许愿树Logo) -│ ├── NotificationButton (通知) -│ └── SearchButton (搜索) -├── ActivityBanner (活动Banner) -│ ├── ActivityTitle (活动标题) -│ ├── ActivityDesc (活动描述) -│ ├── CountdownTimer (倒计时) -│ └── JoinButton (参与按钮) -├── CategoryTabs (节日分类标签) -│ └── TabLayout (可滑动标签) -├── WishTreeView (许愿树3D展示) -│ ├── TreeImage (树图片) -│ ├── DecorationItems (装饰物) -│ │ └── 点击查看祝福详情 -│ └── AnimationEffect (动画效果) -├── WishList (祝福列表) -│ └── RecyclerView (瀑布流) -│ └── WishCardAdapter (祝福卡片适配器) -├── PublishButton (发布祝福按钮) -└── BottomNavigation (底部导航) -``` - -#### 5.4.2 发布祝福页 (PublishWishActivity) - -```java -// 页面结构 -PublishWishActivity -├── TopBar (顶部栏) -│ ├── CloseButton (关闭) -│ ├── TitleText (发布祝福) -│ └── PublishButton (发布) -├── WishTypeSelector (祝福类型选择) -│ ├── WishType (许愿) -│ ├── BlessingType (祝福) -│ └── ThankType (感谢) -├── FestivalSelector (节日选择) -│ └── ChipGroup (节日标签) -├── ContentInput (内容输入) -│ ├── EditText (祝福文字) -│ └── CharacterCount (字数统计) -├── BackgroundSelector (背景选择) -│ └── HorizontalScrollView (背景模板) -├── DecorationSelector (装饰选择) -│ └── GridView (装饰图标) -├── PrivacySelector (可见范围) -│ └── RadioGroup (公开/好友/私密) -└── PreviewArea (预览区域) - └── WishCardPreview (祝福卡片预览) -``` - -#### 5.4.3 祝福详情页 (WishDetailActivity) - -```java -// 页面结构 -WishDetailActivity -├── TopBar (顶部栏) -│ ├── BackButton (返回) -│ ├── TitleText (祝福详情) -│ ├── ShareButton (分享) -│ └── MoreButton (更多) -├── WishCard (祝福卡片) -│ ├── Background (背景) -│ ├── Decorations (装饰) -│ ├── UserInfo (用户信息) -│ ├── WishContent (祝福内容) -│ ├── FestivalTag (节日标签) -│ └── TimeInfo (发布时间) -├── ActionBar (操作栏) -│ ├── LikeButton (点赞/送心) -│ ├── CommentButton (评论) -│ ├── GiftButton (送礼物) -│ └── ShareButton (分享) -├── CommentList (评论列表) -│ └── RecyclerView -│ └── CommentAdapter -└── CommentInput (评论输入框) - ├── EditText (输入框) - ├── EmojiButton (表情) - └── SendButton (发送) -``` - -### 5.5 交互流程设计 - -#### 5.5.1 发布祝福流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 发布祝福交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 点击发布祝福 │ │ │ -│ │ 打开发布页面 │ │ │ -│ │ │ │ │ -│ │ 2. 获取节日活动列表 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 3. 返回当前活动 │ │ -│ │ ◀───────────────────────── │ 和节日列表 │ │ -│ │ 4. 显示节日选项 │ │ │ -│ │ │ │ │ -│ │ 5. 选择祝福类型 │ │ │ -│ │ 选择节日 │ │ │ -│ │ 输入祝福内容 │ │ │ -│ │ 选择背景和装饰 │ │ │ -│ │ │ │ │ -│ │ 6. 点击发布 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 7. 内容审核 │ │ -│ │ │ 敏感词过滤 │ │ -│ │ │ 保存到数据库 │ │ -│ │ │ 挂到许愿树上 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 8. 发布成功 │ │ │ -│ │ 显示祝福动画 │ │ │ -│ │ │ │ │ -│ │ │ 9. 更新许愿树装饰 │ │ -│ │ │ 推送给关注者 │ │ -│ │ │ │ │ -│ │ │ 10. 记录发布日志 ─────────▶ │ │ -│ │ │ │ 11.可审│ -│ │ │ │ 核 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -#### 5.5.2 节日活动流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 节日活动交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 管理端 后端 移动端 │ -│ │ │ │ │ -│ │ 1. 创建节日活动 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 2. 保存活动配置 │ │ -│ │ │ 设置活动时间 │ │ -│ │ │ 配置奖励规则 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 3. 创建成功 │ │ │ -│ │ │ │ │ -│ │ 4. 配置活动Banner │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 5. 保存Banner配置 │ │ -│ │ │ │ │ -│ │ │ 6. 活动开始时 │ │ -│ │ │ 推送通知 ──────────────▶ │ │ -│ │ │ │ 7. 收到│ -│ │ │ │ 通知 │ -│ │ │ │ │ -│ │ │ ◀─────── │ 8. 进入│ -│ │ │ 9. 返回活动信息 │ 许愿 │ -│ │ │ ──────────────────────────▶ │ 树 │ -│ │ │ │ │ -│ │ │ ◀─────── │ 10.参与│ -│ │ │ 11. 记录参与 │ 活动 │ -│ │ │ 发放奖励 │ │ -│ │ │ ──────────────────────────▶ │ │ -│ │ │ │ 12.收到│ -│ │ │ │ 奖励 │ -│ │ │ │ │ -│ │ 13. 查看活动数据 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 14. 返回统计数据 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 15. 显示活动报表 │ │ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 5.6 许愿树API接口设计 - -#### 5.6.1 移动端API (前台) - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 许愿树 - 移动端API接口 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 活动管理 │ -│ ├── GET /api/front/wishtree/activities # 获取活动列表 │ -│ ├── GET /api/front/wishtree/activities/current # 获取当前活动 │ -│ └── GET /api/front/wishtree/activities/{id} # 获取活动详情 │ -│ │ -│ 节日分类 │ -│ ├── GET /api/front/wishtree/festivals # 获取节日列表 │ -│ └── GET /api/front/wishtree/festivals/{id} # 获取节日详情 │ -│ │ -│ 祝福管理 │ -│ ├── GET /api/front/wishtree/wishes # 获取祝福列表 │ -│ │ ?festivalId={id}&type={type}&page={page}&pageSize={size} │ -│ ├── GET /api/front/wishtree/wishes/{id} # 获取祝福详情 │ -│ ├── POST /api/front/wishtree/wishes # 发布祝福 │ -│ ├── PUT /api/front/wishtree/wishes/{id} # 编辑祝福 │ -│ └── DELETE /api/front/wishtree/wishes/{id} # 删除祝福 │ -│ │ -│ 互动功能 │ -│ ├── POST /api/front/wishtree/wishes/{id}/like # 点赞祝福 │ -│ ├── DELETE /api/front/wishtree/wishes/{id}/like # 取消点赞 │ -│ ├── POST /api/front/wishtree/wishes/{id}/gift # 送礼物 │ -│ └── POST /api/front/wishtree/wishes/{id}/share # 分享祝福 │ -│ │ -│ 评论功能 │ -│ ├── GET /api/front/wishtree/wishes/{id}/comments # 获取评论列表 │ -│ ├── POST /api/front/wishtree/wishes/{id}/comments # 发表评论 │ -│ └── DELETE /api/front/wishtree/comments/{id} # 删除评论 │ -│ │ -│ 许愿树展示 │ -│ ├── GET /api/front/wishtree/tree # 获取许愿树数据 │ -│ │ 返回树上的装饰物和祝福位置 │ -│ └── GET /api/front/wishtree/tree/decorations # 获取装饰物列表 │ -│ │ -│ 用户相关 │ -│ ├── GET /api/front/wishtree/my/wishes # 我的祝福 │ -│ ├── GET /api/front/wishtree/my/received # 收到的祝福 │ -│ └── GET /api/front/wishtree/my/gifts # 收到的礼物 │ -│ │ -│ 背景和装饰 │ -│ ├── GET /api/front/wishtree/backgrounds # 获取背景模板 │ -│ └── GET /api/front/wishtree/decorations # 获取装饰素材 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -#### 5.6.2 管理端API (后台) - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 许愿树 - 管理端API接口 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 活动管理 │ -│ ├── GET /api/admin/wishtree/activities # 获取活动列表 │ -│ ├── POST /api/admin/wishtree/activities # 创建活动 │ -│ ├── PUT /api/admin/wishtree/activities/{id} # 编辑活动 │ -│ ├── DELETE /api/admin/wishtree/activities/{id} # 删除活动 │ -│ ├── PUT /api/admin/wishtree/activities/{id}/status # 活动状态 │ -│ └── GET /api/admin/wishtree/activities/{id}/stats # 活动统计 │ -│ │ -│ 节日管理 │ -│ ├── GET /api/admin/wishtree/festivals # 获取节日列表 │ -│ ├── POST /api/admin/wishtree/festivals # 创建节日 │ -│ ├── PUT /api/admin/wishtree/festivals/{id} # 编辑节日 │ -│ └── DELETE /api/admin/wishtree/festivals/{id} # 删除节日 │ -│ │ -│ 祝福审核 │ -│ ├── GET /api/admin/wishtree/wishes # 获取祝福列表 │ -│ │ ?status={status}&festivalId={id}&page={page} │ -│ ├── GET /api/admin/wishtree/wishes/{id} # 获取祝福详情 │ -│ ├── PUT /api/admin/wishtree/wishes/{id}/audit # 审核祝福 │ -│ │ body: {status: "approved"|"rejected", reason: ""} │ -│ ├── PUT /api/admin/wishtree/wishes/{id}/recommend # 推荐祝福 │ -│ └── DELETE /api/admin/wishtree/wishes/{id} # 删除祝福 │ -│ │ -│ 评论管理 │ -│ ├── GET /api/admin/wishtree/comments # 获取评论列表 │ -│ ├── PUT /api/admin/wishtree/comments/{id}/audit # 审核评论 │ -│ └── DELETE /api/admin/wishtree/comments/{id} # 删除评论 │ -│ │ -│ 素材管理 │ -│ ├── GET /api/admin/wishtree/backgrounds # 获取背景列表 │ -│ ├── POST /api/admin/wishtree/backgrounds # 上传背景 │ -│ ├── DELETE /api/admin/wishtree/backgrounds/{id} # 删除背景 │ -│ ├── GET /api/admin/wishtree/decorations # 获取装饰列表 │ -│ ├── POST /api/admin/wishtree/decorations # 上传装饰 │ -│ └── DELETE /api/admin/wishtree/decorations/{id} # 删除装饰 │ -│ │ -│ 数据统计 │ -│ ├── GET /api/admin/wishtree/statistics # 许愿树统计 │ -│ ├── GET /api/admin/wishtree/statistics/wishes # 祝福统计 │ -│ └── GET /api/admin/wishtree/statistics/users # 用户参与统计 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 5.7 数据模型设计 - -#### 5.7.1 祝福数据模型 - -```json -// Wish (祝福) -{ - "id": 30001, - "userId": 1001, - "userInfo": { - "id": 1001, - "nickname": "小明", - "avatar": "https://xxx/avatar.jpg", - "level": 5 - }, - "type": "blessing", // wish(许愿), blessing(祝福), thank(感谢) - "festivalId": 1, - "festivalName": "元旦", - "activityId": 100, - "content": "🎉 新年快乐!愿新的一年万事如意,心想事成!", - "backgroundId": 5, - "backgroundUrl": "https://xxx/bg5.jpg", - "decorations": [ - {"id": 1, "type": "star", "position": {"x": 10, "y": 20}}, - {"id": 2, "type": "ribbon", "position": {"x": 80, "y": 30}} - ], - "treePosition": { - "x": 150, - "y": 200, - "decorationType": "gift" - }, - "visibility": "public", - "likeCount": 256, - "commentCount": 48, - "giftCount": 15, - "shareCount": 32, - "isLiked": false, - "isRecommend": true, - "status": "approved", - "createdAt": "2024-12-29T10:30:00Z" -} -``` - -#### 5.7.2 活动数据模型 - -```json -// Activity (活动) -{ - "id": 100, - "name": "元旦许愿活动", - "description": "许下新年愿望,赢取丰厚奖励!", - "festivalId": 1, - "bannerUrl": "https://xxx/banner.jpg", - "startTime": "2024-12-31T00:00:00Z", - "endTime": "2025-01-03T23:59:59Z", - "rules": [ - "每人每天可发布3条祝福", - "获赞最多的祝福可获得奖励", - "分享活动可获得额外金币" - ], - "rewards": [ - {"rank": 1, "prize": "1000金币", "icon": "🥇"}, - {"rank": 2, "prize": "500金币", "icon": "🥈"}, - {"rank": 3, "prize": "300金币", "icon": "🥉"} - ], - "participantCount": 12580, - "wishCount": 35680, - "status": "active", - "createdAt": "2024-12-25T10:00:00Z" -} -``` - ---- - -## 六、API接口设计规范 - -### 6.1 接口规范总览 - -#### 6.1.1 URL命名规范 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ API URL命名规范 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 基础路径 │ -│ ├── 移动端API: /api/front/... │ -│ └── 管理端API: /api/admin/... │ -│ │ -│ 资源命名 │ -│ ├── 使用复数名词: /users, /posts, /wishes │ -│ ├── 使用小写字母: /community/posts │ -│ ├── 使用连字符: /wish-tree (不推荐), /wishtree (推荐) │ -│ └── 避免动词: /getUsers (错误), /users (正确) │ -│ │ -│ HTTP方法 │ -│ ├── GET - 查询资源 │ -│ ├── POST - 创建资源 │ -│ ├── PUT - 更新资源 (全量) │ -│ ├── PATCH - 更新资源 (部分) │ -│ └── DELETE - 删除资源 │ -│ │ -│ 示例 │ -│ ├── GET /api/front/community/posts # 获取帖子列表 │ -│ ├── GET /api/front/community/posts/123 # 获取帖子详情 │ -│ ├── POST /api/front/community/posts # 创建帖子 │ -│ ├── PUT /api/front/community/posts/123 # 更新帖子 │ -│ ├── DELETE /api/front/community/posts/123 # 删除帖子 │ -│ └── POST /api/front/community/posts/123/like # 点赞帖子 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -#### 6.1.2 响应格式规范 - -```json -// 成功响应 -{ - "code": 200, - "message": "success", - "data": { - // 业务数据 - } -} - -// 分页响应 -{ - "code": 200, - "message": "success", - "data": { - "list": [...], - "total": 100, - "page": 1, - "pageSize": 20, - "totalPages": 5 - } -} - -// 错误响应 -{ - "code": 400, - "message": "参数错误", - "data": null, - "errors": [ - {"field": "content", "message": "内容不能为空"} - ] -} -``` - -#### 6.1.3 错误码规范 - -| 错误码 | 说明 | 场景 | -|--------|------|------| -| 200 | 成功 | 请求成功 | -| 400 | 参数错误 | 请求参数不合法 | -| 401 | 未授权 | 未登录或Token过期 | -| 403 | 禁止访问 | 无权限访问 | -| 404 | 资源不存在 | 请求的资源不存在 | -| 409 | 冲突 | 资源已存在 | -| 422 | 业务错误 | 业务逻辑错误 | -| 429 | 请求过多 | 触发限流 | -| 500 | 服务器错误 | 服务器内部错误 | - -### 6.2 认证授权规范 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 认证授权流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ Token格式 (JWT) │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ Header: Authorization: Bearer │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ Token结构 │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ { │ │ -│ │ "userId": 1001, │ │ -│ │ "nickname": "小明", │ │ -│ │ "role": "user", │ │ -│ │ "exp": 1735488000, │ │ -│ │ "iat": 1735401600 │ │ -│ │ } │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ 权限级别 │ -│ ├── public - 无需登录 (直播列表、帖子列表) │ -│ ├── user - 需要登录 (发帖、评论、点赞) │ -│ ├── vip - VIP用户 (特殊功能) │ -│ └── admin - 管理员 (后台管理) │ -│ │ -│ Token刷新 │ -│ ├── Access Token: 有效期2小时 │ -│ ├── Refresh Token: 有效期7天 │ -│ └── 刷新接口: POST /api/front/auth/refresh │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - ---- - -## 七、数据库设计 - -### 7.1 缘池社区数据表 - -```sql --- 板块分类表 -CREATE TABLE `community_category` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '板块ID', - `name` varchar(50) NOT NULL COMMENT '板块名称', - `icon` varchar(50) DEFAULT NULL COMMENT '板块图标', - `description` varchar(200) DEFAULT NULL COMMENT '板块描述', - `sort` int DEFAULT 0 COMMENT '排序', - `status` tinyint DEFAULT 1 COMMENT '状态: 0-禁用, 1-启用', - `post_count` int DEFAULT 0 COMMENT '帖子数量', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='社区板块表'; - --- 帖子表 -CREATE TABLE `community_post` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '帖子ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `category_id` bigint NOT NULL COMMENT '板块ID', - `content` text NOT NULL COMMENT '帖子内容', - `images` json DEFAULT NULL COMMENT '图片列表', - `video` varchar(500) DEFAULT NULL COMMENT '视频URL', - `location` json DEFAULT NULL COMMENT '位置信息', - `topics` json DEFAULT NULL COMMENT '话题标签', - `visibility` varchar(20) DEFAULT 'public' COMMENT '可见范围', - `like_count` int DEFAULT 0 COMMENT '点赞数', - `comment_count` int DEFAULT 0 COMMENT '评论数', - `share_count` int DEFAULT 0 COMMENT '分享数', - `favorite_count` int DEFAULT 0 COMMENT '收藏数', - `view_count` int DEFAULT 0 COMMENT '浏览数', - `is_top` tinyint DEFAULT 0 COMMENT '是否置顶', - `is_recommend` tinyint DEFAULT 0 COMMENT '是否推荐', - `status` varchar(20) DEFAULT 'pending' COMMENT '状态: pending/approved/rejected', - `reject_reason` varchar(200) DEFAULT NULL COMMENT '拒绝原因', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_category_id` (`category_id`), - KEY `idx_status` (`status`), - KEY `idx_created_at` (`created_at`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='社区帖子表'; - --- 帖子评论表 -CREATE TABLE `community_comment` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论ID', - `post_id` bigint NOT NULL COMMENT '帖子ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `content` varchar(500) NOT NULL COMMENT '评论内容', - `parent_id` bigint DEFAULT NULL COMMENT '父评论ID', - `reply_to_user_id` bigint DEFAULT NULL COMMENT '回复用户ID', - `like_count` int DEFAULT 0 COMMENT '点赞数', - `status` varchar(20) DEFAULT 'approved' COMMENT '状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `idx_post_id` (`post_id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_parent_id` (`parent_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='帖子评论表'; - --- 帖子点赞表 -CREATE TABLE `community_post_like` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `post_id` bigint NOT NULL COMMENT '帖子ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_post_user` (`post_id`, `user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='帖子点赞表'; - --- 帖子收藏表 -CREATE TABLE `community_post_favorite` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `post_id` bigint NOT NULL COMMENT '帖子ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_post_user` (`post_id`, `user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='帖子收藏表'; - --- 话题表 -CREATE TABLE `community_topic` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '话题ID', - `name` varchar(50) NOT NULL COMMENT '话题名称', - `description` varchar(200) DEFAULT NULL COMMENT '话题描述', - `cover` varchar(500) DEFAULT NULL COMMENT '话题封面', - `post_count` int DEFAULT 0 COMMENT '帖子数量', - `view_count` int DEFAULT 0 COMMENT '浏览数量', - `is_hot` tinyint DEFAULT 0 COMMENT '是否热门', - `status` tinyint DEFAULT 1 COMMENT '状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='话题表'; -``` - -### 7.2 许愿树数据表 - -```sql --- 节日表 -CREATE TABLE `wishtree_festival` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '节日ID', - `name` varchar(50) NOT NULL COMMENT '节日名称', - `icon` varchar(50) DEFAULT NULL COMMENT '节日图标', - `description` varchar(200) DEFAULT NULL COMMENT '节日描述', - `theme_color` varchar(20) DEFAULT NULL COMMENT '主题色', - `start_date` varchar(20) DEFAULT NULL COMMENT '开始日期(MM-DD)', - `end_date` varchar(20) DEFAULT NULL COMMENT '结束日期(MM-DD)', - `is_lunar` tinyint DEFAULT 0 COMMENT '是否农历', - `sort` int DEFAULT 0 COMMENT '排序', - `status` tinyint DEFAULT 1 COMMENT '状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节日表'; - --- 活动表 -CREATE TABLE `wishtree_activity` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '活动ID', - `name` varchar(100) NOT NULL COMMENT '活动名称', - `description` text COMMENT '活动描述', - `festival_id` bigint DEFAULT NULL COMMENT '关联节日ID', - `banner_url` varchar(500) DEFAULT NULL COMMENT 'Banner图片', - `start_time` datetime NOT NULL COMMENT '开始时间', - `end_time` datetime NOT NULL COMMENT '结束时间', - `rules` json DEFAULT NULL COMMENT '活动规则', - `rewards` json DEFAULT NULL COMMENT '奖励配置', - `participant_count` int DEFAULT 0 COMMENT '参与人数', - `wish_count` int DEFAULT 0 COMMENT '祝福数量', - `status` varchar(20) DEFAULT 'draft' COMMENT '状态: draft/active/ended', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `idx_festival_id` (`festival_id`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许愿树活动表'; - --- 祝福表 -CREATE TABLE `wishtree_wish` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '祝福ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `type` varchar(20) NOT NULL COMMENT '类型: wish/blessing/thank', - `festival_id` bigint DEFAULT NULL COMMENT '节日ID', - `activity_id` bigint DEFAULT NULL COMMENT '活动ID', - `content` varchar(500) NOT NULL COMMENT '祝福内容', - `background_id` bigint DEFAULT NULL COMMENT '背景ID', - `decorations` json DEFAULT NULL COMMENT '装饰配置', - `tree_position` json DEFAULT NULL COMMENT '树上位置', - `visibility` varchar(20) DEFAULT 'public' COMMENT '可见范围', - `like_count` int DEFAULT 0 COMMENT '点赞数', - `comment_count` int DEFAULT 0 COMMENT '评论数', - `gift_count` int DEFAULT 0 COMMENT '礼物数', - `share_count` int DEFAULT 0 COMMENT '分享数', - `is_recommend` tinyint DEFAULT 0 COMMENT '是否推荐', - `status` varchar(20) DEFAULT 'pending' COMMENT '状态', - `reject_reason` varchar(200) DEFAULT NULL COMMENT '拒绝原因', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_festival_id` (`festival_id`), - KEY `idx_activity_id` (`activity_id`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='祝福表'; - --- 祝福评论表 -CREATE TABLE `wishtree_comment` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论ID', - `wish_id` bigint NOT NULL COMMENT '祝福ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `content` varchar(500) NOT NULL COMMENT '评论内容', - `parent_id` bigint DEFAULT NULL COMMENT '父评论ID', - `like_count` int DEFAULT 0 COMMENT '点赞数', - `status` varchar(20) DEFAULT 'approved' COMMENT '状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `idx_wish_id` (`wish_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='祝福评论表'; - --- 祝福点赞表 -CREATE TABLE `wishtree_wish_like` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `wish_id` bigint NOT NULL COMMENT '祝福ID', - `user_id` bigint NOT NULL COMMENT '用户ID', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_wish_user` (`wish_id`, `user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='祝福点赞表'; - --- 背景模板表 -CREATE TABLE `wishtree_background` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '背景ID', - `name` varchar(50) NOT NULL COMMENT '背景名称', - `url` varchar(500) NOT NULL COMMENT '背景图片URL', - `thumbnail` varchar(500) DEFAULT NULL COMMENT '缩略图', - `festival_id` bigint DEFAULT NULL COMMENT '关联节日', - `is_free` tinyint DEFAULT 1 COMMENT '是否免费', - `price` int DEFAULT 0 COMMENT '价格(金币)', - `sort` int DEFAULT 0 COMMENT '排序', - `status` tinyint DEFAULT 1 COMMENT '状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='背景模板表'; - --- 装饰素材表 -CREATE TABLE `wishtree_decoration` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '装饰ID', - `name` varchar(50) NOT NULL COMMENT '装饰名称', - `type` varchar(20) NOT NULL COMMENT '类型: star/ribbon/gift/heart等', - `url` varchar(500) NOT NULL COMMENT '装饰图片URL', - `festival_id` bigint DEFAULT NULL COMMENT '关联节日', - `is_free` tinyint DEFAULT 1 COMMENT '是否免费', - `price` int DEFAULT 0 COMMENT '价格(金币)', - `sort` int DEFAULT 0 COMMENT '排序', - `status` tinyint DEFAULT 1 COMMENT '状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='装饰素材表'; -``` - ---- - -## 八、实时通信设计 - -### 8.1 WebSocket连接管理 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ WebSocket连接架构 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 连接地址 │ -│ ├── 直播弹幕: ws://host/ws/live/chat/{roomId} │ -│ ├── 私聊消息: ws://host/ws/chat/{userId} │ -│ ├── 社区通知: ws://host/ws/community/{userId} │ -│ └── 许愿树通知: ws://host/ws/wishtree/{userId} │ -│ │ -│ 消息格式 │ -│ ┌─────────────────────────────────────────────────────────────────┐ │ -│ │ { │ │ -│ │ "type": "chat|like|comment|gift|system", │ │ -│ │ "action": "send|receive|notify", │ │ -│ │ "data": {...}, │ │ -│ │ "timestamp": 1735488000000 │ │ -│ │ } │ │ -│ └─────────────────────────────────────────────────────────────────┘ │ -│ │ -│ 心跳机制 │ -│ ├── 心跳间隔: 30秒 │ -│ ├── 心跳消息: {"type": "ping"} │ -│ ├── 心跳响应: {"type": "pong"} │ -│ └── 超时断开: 90秒无响应 │ -│ │ -│ 重连机制 │ -│ ├── 最大重连次数: 5次 │ -│ ├── 重连间隔: 递增 (5s, 10s, 15s, 20s, 25s) │ -│ └── 重连成功后: 重新订阅消息 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 8.2 消息类型定义 - -```json -// 社区帖子点赞通知 -{ - "type": "like", - "action": "notify", - "data": { - "postId": 10001, - "userId": 1002, - "nickname": "小红", - "avatar": "https://xxx/avatar.jpg", - "message": "赞了你的帖子" - }, - "timestamp": 1735488000000 -} - -// 社区帖子评论通知 -{ - "type": "comment", - "action": "notify", - "data": { - "postId": 10001, - "commentId": 20001, - "userId": 1002, - "nickname": "小红", - "content": "写得太好了!", - "message": "评论了你的帖子" - }, - "timestamp": 1735488000000 -} - -// 许愿树祝福通知 -{ - "type": "wish", - "action": "notify", - "data": { - "wishId": 30001, - "userId": 1002, - "nickname": "小红", - "type": "like", - "message": "为你的祝福点赞" - }, - "timestamp": 1735488000000 -} - -// 许愿树礼物通知 -{ - "type": "gift", - "action": "notify", - "data": { - "wishId": 30001, - "userId": 1002, - "nickname": "小红", - "giftId": 5, - "giftName": "爱心", - "giftIcon": "❤️", - "message": "送了你一个爱心" - }, - "timestamp": 1735488000000 -} - -// 系统通知 -{ - "type": "system", - "action": "notify", - "data": { - "title": "活动开始", - "content": "元旦许愿活动已开始,快来参与吧!", - "link": "/wishtree/activity/100" - }, - "timestamp": 1735488000000 -} -``` - ---- - -## 九、管理端配套功能 - -### 9.1 缘池社区管理模块 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 缘池社区管理 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 路由: /communityManage │ -│ │ -│ ├── /communityManage/category/list # 板块管理 │ -│ │ ├── 板块列表 (表格展示) │ -│ │ ├── 新增板块 (弹窗表单) │ -│ │ ├── 编辑板块 (弹窗表单) │ -│ │ ├── 删除板块 (确认弹窗) │ -│ │ └── 板块排序 (拖拽排序) │ -│ │ │ -│ ├── /communityManage/post/list # 帖子管理 │ -│ │ ├── 帖子列表 (表格展示) │ -│ │ │ ├── 筛选: 板块/状态/时间 │ -│ │ │ ├── 搜索: 内容/用户 │ -│ │ │ └── 操作: 审核/置顶/推荐/删除 │ -│ │ ├── 帖子详情 (抽屉展示) │ -│ │ └── 批量审核 (多选操作) │ -│ │ │ -│ ├── /communityManage/comment/list # 评论管理 │ -│ │ ├── 评论列表 (表格展示) │ -│ │ ├── 评论审核 (通过/拒绝) │ -│ │ └── 评论删除 (确认弹窗) │ -│ │ │ -│ ├── /communityManage/topic/list # 话题管理 │ -│ │ ├── 话题列表 (表格展示) │ -│ │ ├── 新增话题 (弹窗表单) │ -│ │ ├── 编辑话题 (弹窗表单) │ -│ │ └── 设为热门 (开关操作) │ -│ │ │ -│ └── /communityManage/statistics # 数据统计 │ -│ ├── 帖子统计 (折线图) │ -│ ├── 用户活跃 (柱状图) │ -│ ├── 板块热度 (饼图) │ -│ └── 话题排行 (排行榜) │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 9.2 许愿树管理模块 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 许愿树管理 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 路由: /wishtreeManage │ -│ │ -│ ├── /wishtreeManage/festival/list # 节日管理 │ -│ │ ├── 节日列表 (表格展示) │ -│ │ ├── 新增节日 (弹窗表单) │ -│ │ │ ├── 节日名称 │ -│ │ │ ├── 节日图标 │ -│ │ │ ├── 主题颜色 │ -│ │ │ ├── 日期范围 │ -│ │ │ └── 是否农历 │ -│ │ ├── 编辑节日 (弹窗表单) │ -│ │ └── 删除节日 (确认弹窗) │ -│ │ │ -│ ├── /wishtreeManage/activity/list # 活动管理 │ -│ │ ├── 活动列表 (表格展示) │ -│ │ ├── 新增活动 (页面表单) │ -│ │ │ ├── 基本信息 (名称/描述/时间) │ -│ │ │ ├── 关联节日 │ -│ │ │ ├── Banner配置 │ -│ │ │ ├── 活动规则 │ -│ │ │ └── 奖励配置 │ -│ │ ├── 编辑活动 (页面表单) │ -│ │ ├── 活动状态 (开启/关闭) │ -│ │ └── 活动统计 (数据报表) │ -│ │ │ -│ ├── /wishtreeManage/wish/list # 祝福管理 │ -│ │ ├── 祝福列表 (表格展示) │ -│ │ │ ├── 筛选: 节日/活动/状态/时间 │ -│ │ │ ├── 搜索: 内容/用户 │ -│ │ │ └── 操作: 审核/推荐/删除 │ -│ │ ├── 祝福详情 (抽屉展示) │ -│ │ └── 批量审核 (多选操作) │ -│ │ │ -│ ├── /wishtreeManage/comment/list # 评论管理 │ -│ │ ├── 评论列表 (表格展示) │ -│ │ ├── 评论审核 (通过/拒绝) │ -│ │ └── 评论删除 (确认弹窗) │ -│ │ │ -│ ├── /wishtreeManage/material/list # 素材管理 │ -│ │ ├── 背景管理 │ -│ │ │ ├── 背景列表 (卡片展示) │ -│ │ │ ├── 上传背景 (弹窗表单) │ -│ │ │ └── 删除背景 (确认弹窗) │ -│ │ └── 装饰管理 │ -│ │ ├── 装饰列表 (卡片展示) │ -│ │ ├── 上传装饰 (弹窗表单) │ -│ │ └── 删除装饰 (确认弹窗) │ -│ │ │ -│ └── /wishtreeManage/statistics # 数据统计 │ -│ ├── 祝福统计 (折线图) │ -│ ├── 活动效果 (柱状图) │ -│ ├── 节日热度 (饼图) │ -│ └── 用户参与 (排行榜) │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 9.3 管理端菜单配置 - -```json -// 新增菜单配置 (eb_system_menu表) -[ - { - "id": 200, - "pid": 0, - "name": "缘池社区", - "icon": "el-icon-chat-dot-round", - "path": "/communityManage", - "sort": 5, - "children": [ - {"id": 201, "name": "板块管理", "path": "/communityManage/category/list"}, - {"id": 202, "name": "帖子管理", "path": "/communityManage/post/list"}, - {"id": 203, "name": "评论管理", "path": "/communityManage/comment/list"}, - {"id": 204, "name": "话题管理", "path": "/communityManage/topic/list"}, - {"id": 205, "name": "数据统计", "path": "/communityManage/statistics"} - ] - }, - { - "id": 300, - "pid": 0, - "name": "许愿树", - "icon": "el-icon-present", - "path": "/wishtreeManage", - "sort": 6, - "children": [ - {"id": 301, "name": "节日管理", "path": "/wishtreeManage/festival/list"}, - {"id": 302, "name": "活动管理", "path": "/wishtreeManage/activity/list"}, - {"id": 303, "name": "祝福管理", "path": "/wishtreeManage/wish/list"}, - {"id": 304, "name": "评论管理", "path": "/wishtreeManage/comment/list"}, - {"id": 305, "name": "素材管理", "path": "/wishtreeManage/material/list"}, - {"id": 306, "name": "数据统计", "path": "/wishtreeManage/statistics"} - ] - } -] -``` - ---- - -## 十、开发实施计划 - -### 10.1 开发阶段规划 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 开发实施计划 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 第一阶段: 基础架构 (1周) │ -│ ├── 数据库表创建 │ -│ ├── 后端基础接口开发 │ -│ ├── API文档编写 │ -│ └── 接口联调测试 │ -│ │ -│ 第二阶段: 缘池社区 (2周) │ -│ ├── 移动端 │ -│ │ ├── 社区首页UI │ -│ │ ├── 帖子详情页 │ -│ │ ├── 发布帖子页 │ -│ │ ├── 评论功能 │ -│ │ └── 点赞/收藏/分享 │ -│ └── 管理端 │ -│ ├── 板块管理页面 │ -│ ├── 帖子管理页面 │ -│ ├── 评论管理页面 │ -│ └── 话题管理页面 │ -│ │ -│ 第三阶段: 许愿树 (2周) │ -│ ├── 移动端 │ -│ │ ├── 许愿树首页UI │ -│ │ ├── 许愿树3D展示 │ -│ │ ├── 发布祝福页 │ -│ │ ├── 祝福详情页 │ -│ │ └── 节日活动页 │ -│ └── 管理端 │ -│ ├── 节日管理页面 │ -│ ├── 活动管理页面 │ -│ ├── 祝福管理页面 │ -│ └── 素材管理页面 │ -│ │ -│ 第四阶段: 实时通信 (1周) │ -│ ├── WebSocket服务搭建 │ -│ ├── 消息推送实现 │ -│ ├── 通知系统集成 │ -│ └── 心跳重连机制 │ -│ │ -│ 第五阶段: 测试优化 (1周) │ -│ ├── 功能测试 │ -│ ├── 性能优化 │ -│ ├── Bug修复 │ -│ └── 上线准备 │ -│ │ -│ 总计: 7周 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -### 10.2 技术要点清单 - -| 模块 | 技术要点 | 优先级 | -|------|----------|--------| -| 缘池社区 | 瀑布流布局、图片压缩上传、内容审核 | 高 | -| 许愿树 | 3D展示效果、节日主题切换、活动倒计时 | 高 | -| 实时通信 | WebSocket连接管理、消息推送、心跳重连 | 高 | -| 内容审核 | 敏感词过滤、图片审核、人工复审 | 高 | -| 数据统计 | 实时统计、图表展示、数据导出 | 中 | -| 性能优化 | 列表分页、图片懒加载、缓存策略 | 中 | - -### 10.3 风险评估 - -| 风险项 | 影响程度 | 应对措施 | -|--------|----------|----------| -| 内容审核压力大 | 高 | 引入AI审核+人工复审 | -| 实时通信稳定性 | 高 | 心跳检测+断线重连 | -| 图片上传慢 | 中 | 压缩+分片上传+CDN | -| 数据量增长快 | 中 | 分表分库+归档策略 | -| 节日活动并发高 | 中 | 限流+缓存+队列 | - ---- - -## 十一、总结 - -本报告详细设计了直播平台双端(Android移动端 + Vue管理端)的交互逻辑,重点对**缘池**和**许愿树**两个模块进行了重新设计: - -### 缘池 - 多板块交流社区 -- 从单一的"附近用户匹配"升级为综合性社区平台 -- 支持12+个兴趣板块,满足不同用户需求 -- 完整的帖子发布、评论、点赞、收藏、分享功能 -- 管理端配套板块管理、内容审核、数据统计功能 - -### 许愿树 - 节日愿望祝福留言板 -- 结合节日氛围,打造温馨的祝福互动平台 -- 支持16+个节日主题,全年覆盖 -- 创新的许愿树3D展示效果 -- 完整的活动配置、祝福管理、素材管理功能 - -### 核心价值 -1. **提升用户粘性**:丰富的社区内容和节日活动 -2. **增强社交属性**:多维度的互动方式 -3. **运营灵活性**:管理端可配置板块、活动、素材 -4. **数据可视化**:完整的统计分析功能 - ---- - -## 十二、详细界面设计描述 - -本章节提供所有界面的详细视觉设计描述,包括布局、颜色、组件、交互效果等,为UI设计和前端开发提供精确参考。 - -### 12.1 移动端界面设计 - -#### 12.1.1 缘池社区 - 首页界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 (系统状态栏,深色/浅色自适应) │ -├────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 (高度: 56dp, 背景: #FFFFFF) │ │ -│ │ ┌────┐ ┌────┬────┐│ │ -│ │ │ ☰ │ 🎣 缘池 │ 🔔 │ ✏️ ││ │ -│ │ │菜单│ (标题, 字号18sp, 加粗, #333333) │通知│发布││ │ -│ │ └────┘ └────┴────┘│ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 搜索栏 (高度: 44dp, 圆角: 22dp, 背景: #F5F5F5) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 🔍 搜索帖子、话题、用户... │ │ │ -│ │ │ (提示文字, 字号14sp, #999999) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 板块分类标签栏 (高度: 48dp, 可横向滑动) │ │ -│ │ ┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐ │ │ -│ │ │推荐││热门││游戏││音乐││美食││旅行││情感││更多│ │ │ -│ │ │ 🔥 ││ 📈 ││ 🎮 ││ 🎵 ││ 🍜 ││ ✈️ ││ 💕 ││ ··· │ │ │ -│ │ └────┘└────┘└────┘└────┘└────┘└────┘└────┘└────┘ │ │ -│ │ (选中: #FF6B6B, 未选中: #666666, 字号13sp) │ │ -│ │ (选中标签下方有3dp圆角指示条) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 内容列表区域 (瀑布流/列表切换, 支持下拉刷新上拉加载) │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────────┐ │ │ -│ │ │ 帖子卡片 (圆角: 12dp, 阴影: 2dp, 背景: #FFFFFF) │ │ │ -│ │ │ 内边距: 12dp │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────┐ 用户名 · 游戏 · 2小时前 │ │ │ -│ │ │ │头像│ (头像: 40dp圆形, 用户名: 14sp #333333) │ │ │ -│ │ │ │40dp│ (板块标签: 12sp #FF6B6B, 时间: 12sp #999999) │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 今天吃鸡成功!分享一下我的游戏心得,希望对大家 │ │ │ -│ │ │ 有帮助... │ │ │ -│ │ │ (正文: 15sp, #333333, 最多显示3行, 超出显示...) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌─────────┬─────────┬─────────┐ │ │ │ -│ │ │ │ 图片1 │ 图片2 │ 图片3 │ (九宫格布局) │ │ │ -│ │ │ │ 圆角8dp │ 圆角8dp │ 圆角8dp │ (间距: 4dp) │ │ │ -│ │ │ └─────────┴─────────┴─────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │👍 128 │ │💬 32 │ │↗ 分享 │ │⭐ 收藏 │ │ │ │ -│ │ │ │(点赞) │ │(评论) │ │ │ │ │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ (操作按钮: 12sp, #666666, 点击态: #FF6B6B) │ │ │ -│ │ └─────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (更多帖子卡片...) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 悬浮发布按钮 (右下角, 距边缘16dp) │ │ -│ │ ┌──────────┐ │ │ -│ │ │ ✚ │ │ │ -│ │ │ 56dp │ │ │ -│ │ │ 圆形按钮 │ │ │ -│ │ │ #FF6B6B │ │ │ -│ │ │ 阴影6dp │ │ │ -│ │ └──────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ 底部导航栏 (高度: 56dp, 背景: #FFFFFF, 顶部1px分割线) │ -│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │ -│ │ 🏠 │ 🎣 │ 🌳 │ 💬 │ 👤 │ │ -│ │ 首页 │ 缘池 │ 许愿树 │ 消息 │ 我的 │ │ -│ │ #999999 │ #FF6B6B │ #999999 │ #999999 │ #999999 │ │ -│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │ -│ (选中: #FF6B6B, 未选中: #999999, 图标24dp, 文字10sp) │ -└────────────────────────────────────────────────────────────────┘ -``` - -**界面设计规范:** - -| 元素 | 规格 | 颜色 | 说明 | -|------|------|------|------| -| 状态栏 | 系统默认 | 自适应 | 支持沉浸式 | -| 顶部导航 | 高度56dp | 背景#FFFFFF | 标题居中 | -| 搜索栏 | 高度44dp, 圆角22dp | 背景#F5F5F5 | 点击跳转搜索页 | -| 板块标签 | 高度48dp | 选中#FF6B6B | 可横向滑动 | -| 帖子卡片 | 圆角12dp, 阴影2dp | 背景#FFFFFF | 内边距12dp | -| 用户头像 | 40dp圆形 | - | 点击进入主页 | -| 图片区域 | 九宫格/单图/视频 | 圆角8dp | 点击查看大图 | -| 悬浮按钮 | 56dp圆形 | #FF6B6B | 阴影6dp | -| 底部导航 | 高度56dp | 背景#FFFFFF | 5个Tab | - -**交互效果:** -- 下拉刷新:显示加载动画,刷新成功后列表回到顶部 -- 上拉加载:显示"加载中...",无更多数据显示"没有更多了" -- 帖子卡片:点击进入详情,长按显示操作菜单 -- 图片:单击查看大图,支持手势缩放 -- 点赞:点击后图标变红,数字+1,有心跳动画 -- 悬浮按钮:点击展开发布选项(图文/视频) - - -#### 12.1.2 缘池社区 - 帖子详情界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 (高度: 56dp) │ │ -│ │ ┌────┐ ┌────┬────┐│ │ -│ │ │ ← │ 帖子详情 │ ↗ │ ··· ││ │ -│ │ │返回│ │分享│更多││ │ -│ │ └────┘ └────┴────┘│ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 帖子内容区域 (可滚动) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 用户信息区 │ │ │ -│ │ │ ┌────┐ ┌──────┐ │ │ │ -│ │ │ │头像│ 小明 │+ 关注│ │ │ │ -│ │ │ │48dp│ Lv.5 · 游戏达人 │ 按钮 │ │ │ │ -│ │ │ │圆形│ (等级标签: 渐变背景, 圆角10dp) │#FF6B6B│ │ │ │ -│ │ │ └────┘ └──────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 帖子正文 │ │ │ -│ │ │ │ │ │ -│ │ │ 今天吃鸡成功!分享一下我的游戏心得,希望对大家有 │ │ │ -│ │ │ 帮助。首先要选择合适的落点,建议新手选择偏远地区 │ │ │ -│ │ │ 先发育,等装备成型后再参与战斗... │ │ │ -│ │ │ │ │ │ -│ │ │ (正文: 16sp, 行高1.6, #333333) │ │ │ -│ │ │ │ │ │ -│ │ │ #吃鸡攻略 #游戏心得 #新手教程 │ │ │ -│ │ │ (话题标签: 14sp, #FF6B6B, 可点击) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 图片/视频区域 │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 图片1 (宽度100%) │ │ │ │ -│ │ │ │ 圆角: 8dp │ │ │ │ -│ │ │ │ 点击查看大图 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ -│ │ │ │ 图片2 │ │ 图片3 │ │ │ │ -│ │ │ └─────────────────┘ └─────────────────┘ │ │ │ -│ │ │ (多图: 第一张大图, 其余小图排列) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 位置和时间 │ │ │ -│ │ │ 📍 广西南宁 · 2024-12-29 10:30 │ │ │ -│ │ │ (字号: 13sp, 颜色: #999999) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 互动数据栏 (分割线上方) │ │ │ -│ │ │ 👁 1024浏览 · 👍 128点赞 · ⭐ 45收藏 │ │ │ -│ │ │ (字号: 13sp, 颜色: #666666) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ════════════════════════════════════════════════════════ │ │ -│ │ (分割线: 8dp高度, 背景#F5F5F5) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 评论区标题 │ │ │ -│ │ │ 全部评论 (32) 按热度 ▼ │ │ │ -│ │ │ (标题: 16sp加粗, 排序: 14sp #666666) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 评论项 │ │ │ -│ │ │ ┌────┐ 小红 · 1小时前 │ │ │ -│ │ │ │头像│ 写得太好了,学到了! │ │ │ -│ │ │ │36dp│ 👍 15 │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 回复区 (背景: #F8F8F8, 圆角: 8dp) │ │ │ │ -│ │ │ │ 小明 回复 小红: 谢谢支持! │ │ │ │ -│ │ │ │ 小红 回复 小明: 期待更多分享~ │ │ │ │ -│ │ │ │ 查看全部3条回复 > │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (更多评论...) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 底部操作栏 (高度: 56dp, 背景: #FFFFFF, 顶部阴影) │ │ -│ │ ┌────────────────────────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ -│ │ │ 说点什么... │ │ 👍 │ │ 💬 │ │ ⭐ │ │ ↗ │ │ │ -│ │ │ (输入框, 圆角20dp) │ │128 │ │ 32 │ │ 45 │ │分享│ │ │ -│ │ └────────────────────────┘ └────┘ └────┘ └────┘ └────┘ │ │ -│ │ (输入框点击弹出键盘和完整输入界面) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**评论输入弹窗设计:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ (半透明遮罩层, 点击关闭) │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 评论输入面板 (从底部弹出, 圆角顶部16dp) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 多行输入框 (最小高度100dp, 最大高度200dp) │ │ │ -│ │ │ │ │ │ -│ │ │ 输入评论内容... │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 工具栏 │ │ │ -│ │ │ ┌────┐ ┌────┐ ┌────┐ ┌──────────────┐ │ │ │ -│ │ │ │ 😊 │ │ @ │ │ # │ │ 发送 │ │ │ │ -│ │ │ │表情│ │艾特│ │话题│ │ #FF6B6B │ │ │ │ -│ │ │ └────┘ └────┘ └────┘ └──────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (键盘区域) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.1.3 缘池社区 - 发布帖子界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────┐ ┌────────┐ │ │ -│ │ │ ✕ │ 发布动态 │ 发布 │ │ │ -│ │ │关闭│ │ #FF6B6B│ │ │ -│ │ └────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 内容输入区域 │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 文本输入框 (最小高度: 150dp) │ │ │ -│ │ │ │ │ │ -│ │ │ 分享你的想法... │ │ │ -│ │ │ (提示文字: 16sp, #CCCCCC) │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ 500/500 │ │ │ -│ │ │ (字数统计, 右下角)│ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 媒体选择区域 │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 图片1 │ │ 图片2 │ │ 图片3 │ │ + │ │ │ │ -│ │ │ │ ┌──┐ │ │ │ │ │ │ 添加 │ │ │ │ -│ │ │ │ │✕│ │ │ │ │ │ │ 图片 │ │ │ │ -│ │ │ │ └──┘ │ │ │ │ │ │ │ │ │ │ -│ │ │ │ 80x80dp│ │ 80x80dp│ │ 80x80dp│ │ 80x80dp│ │ │ │ -│ │ │ │ 圆角8dp│ │ 圆角8dp│ │ 圆角8dp│ │虚线边框│ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ (最多9张图片, 右上角有删除按钮) │ │ │ -│ │ │ (支持拖拽排序) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 选项设置区域 (列表形式) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 📂 选择板块 游戏 > │ │ │ -│ │ │ (左侧图标24dp, 标题16sp, 右侧值14sp #666666) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ ───────────────────────────────────────────────────── │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ # 添加话题 #吃鸡 #游戏 > │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ ───────────────────────────────────────────────────── │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 📍 添加位置 广西南宁 > │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ ───────────────────────────────────────────────────── │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 👁 谁可以看 公开 > │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 草稿提示 (如有草稿) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 📝 有一篇未发布的草稿 恢复 | 删除│ │ │ -│ │ │ (背景: #FFF9E6, 边框: #FFE082) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**板块选择弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ (半透明遮罩) │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 选择板块 (底部弹窗, 最大高度60%) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 标题栏 │ │ │ -│ │ │ ──────────── 选择板块 ──────────── │ │ │ -│ │ │ (居中标题, 16sp加粗, 顶部有拖拽指示条) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 板块网格 (3列, 间距12dp) │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 🔥 │ │ 📈 │ │ 🎮 │ │ │ │ -│ │ │ │ 推荐 │ │ 热门 │ │ 游戏 │ │ │ │ -│ │ │ │ (选中态) │ │ │ │ │ │ │ │ -│ │ │ │ 边框红色 │ │ │ │ │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 🎵 │ │ 🍜 │ │ ✈️ │ │ │ │ -│ │ │ │ 音乐 │ │ 美食 │ │ 旅行 │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 💕 │ │ 👗 │ │ 🐱 │ │ │ │ -│ │ │ │ 情感 │ │ 穿搭 │ │ 宠物 │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ │ (每个板块: 圆角12dp, 背景#F5F5F5, 高度80dp) │ │ │ -│ │ │ (选中: 边框2dp #FF6B6B, 背景#FFF0F0) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.1.4 许愿树 - 首页界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 (渐变背景: #FF6B6B → #FF8E8E) │ │ -│ │ ┌────┐ ┌────┬────┐│ │ -│ │ │ ☰ │ 🌳 许愿树 │ 🔔 │ 🔍 ││ │ -│ │ │ │ (白色文字, 带阴影) │ │ ││ │ -│ │ └────┘ └────┴────┘│ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 活动Banner区域 (高度: 180dp, 圆角: 16dp, 边距: 16dp) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ╔════════════════════════════════════════════════╗ │ │ │ -│ │ │ ║ 🎄 元旦许愿活动 ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ 许下新年愿望,赢取丰厚奖励! ║ │ │ │ -│ │ │ ║ (描述文字: 14sp, 白色, 80%透明度) ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ ┌─────────────────────────────────────────┐ ║ │ │ │ -│ │ │ ║ │ ⏰ 距活动结束: 02天 15:30:45 │ ║ │ │ │ -│ │ │ ║ │ (倒计时: 背景半透明黑, 圆角8dp) │ ║ │ │ │ -│ │ │ ║ └─────────────────────────────────────────┘ ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ ┌──────────────┐ ║ │ │ │ -│ │ │ ║ │ 立即参与 → │ (按钮: 白色背景, 红色文字) ║ │ │ │ -│ │ │ ║ └──────────────┘ ║ │ │ │ -│ │ │ ╚════════════════════════════════════════════════╝ │ │ │ -│ │ │ (背景: 节日主题渐变色, 可配置) │ │ │ -│ │ │ (支持轮播, 底部有指示点) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 节日分类标签 (高度: 44dp, 可横向滑动) │ │ -│ │ ┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐ │ │ -│ │ │全部││元旦││春节││情人││生日││祝福││许愿│ │ │ -│ │ │ ✨ ││ 🎉 ││ 🧧 ││ 💕 ││ 🎂 ││ 🙏 ││ ⭐ │ │ │ -│ │ └────┘└────┘└────┘└────┘└────┘└────┘└────┘ │ │ -│ │ (选中: 背景#FF6B6B, 白色文字, 圆角16dp) │ │ -│ │ (未选中: 背景#F5F5F5, #666666文字) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 许愿树3D展示区域 (高度: 280dp) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ ⭐ │ │ │ -│ │ │ / \ │ │ │ -│ │ │ / \ │ │ │ -│ │ │ 🎀 / \ 🎁 │ │ │ -│ │ │ / 🌳 \ │ │ │ -│ │ │ 🌟 / /|\ \ ⭐ │ │ │ -│ │ │ / / | \ \ │ │ │ -│ │ │ 💝 / / | \ \ 🎊 │ │ │ -│ │ │ / / | \ \ │ │ │ -│ │ │ ───────────────────── │ │ │ -│ │ │ │ │ │ -│ │ │ (树上装饰物可点击, 显示对应祝福) │ │ │ -│ │ │ (装饰物有呼吸灯动画效果) │ │ │ -│ │ │ (支持左右滑动旋转树) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌─────────────────────────┐ │ │ │ -│ │ │ │ 点击装饰物查看祝福详情 │ │ │ │ -│ │ │ │ (提示文字, 渐隐动画) │ │ │ │ -│ │ │ └─────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ (背景: 渐变色, 与节日主题匹配) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 祝福列表区域 (瀑布流布局) │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────────┐ │ │ -│ │ │ 祝福卡片 (圆角: 16dp, 有节日主题背景) │ │ │ -│ │ │ ┌────────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 背景图/渐变色 (节日主题) │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ ┌────┐ │ │ │ │ -│ │ │ │ │头像│ 小明 · 元旦祝福 · 1小时前 │ │ │ │ -│ │ │ │ │36dp│ (白色文字, 带阴影) │ │ │ │ -│ │ │ │ └────┘ │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 🎉 新年快乐! │ │ │ │ -│ │ │ │ 愿新的一年万事如意,心想事成! │ │ │ │ -│ │ │ │ (祝福内容: 16sp, 白色, 最多3行) │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ │ -│ │ │ │ │ ❤️ 128 │ │ 💬 32 │ │ 🎁 送礼│ │ │ │ │ -│ │ │ │ │ (送心) │ │ (评论) │ │ │ │ │ │ │ -│ │ │ │ └────────┘ └────────┘ └────────┘ │ │ │ │ -│ │ │ │ (操作按钮: 白色, 半透明背景) │ │ │ │ -│ │ │ └────────────────────────────────────────────────┘ │ │ │ -│ │ └─────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (更多祝福卡片...) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 发布祝福按钮 (底部居中, 距底部导航16dp) │ │ -│ │ ┌──────────────────────────┐ │ │ -│ │ │ ✨ 发布祝福 │ │ │ -│ │ │ (渐变背景, 圆角24dp) │ │ │ -│ │ │ (宽度: 200dp, 高度: 48dp)│ │ │ -│ │ │ (阴影: 8dp) │ │ │ -│ │ └──────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ 底部导航栏 │ -└────────────────────────────────────────────────────────────────┘ -``` - -**许愿树装饰物点击弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ (点击树上装饰物后, 显示祝福预览卡片) │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 祝福预览卡片 (居中显示, 宽度80%, 圆角16dp) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 背景: 节日主题渐变 │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │头像│ 小红 │ │ │ -│ │ │ │48dp│ 元旦祝福 │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 🎉 祝大家新年快乐,万事如意! │ │ │ -│ │ │ 希望新的一年大家都能实现自己的愿望~ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 查看详情 → │ │ │ │ -│ │ │ │ (按钮: 白色背景, 主题色文字) │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ (点击卡片外区域关闭) │ │ -│ │ (卡片有缩放弹出动画) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.1.5 许愿树 - 发布祝福界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────┐ ┌────────┐ │ │ -│ │ │ ✕ │ 发布祝福 │ 发布 │ │ │ -│ │ │ │ │ #FF6B6B│ │ │ -│ │ └────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 祝福类型选择 (高度: 80dp) │ │ -│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ -│ │ │ ⭐ │ │ 🙏 │ │ 💝 │ │ │ -│ │ │ 许愿 │ │ 祝福 │ │ 感谢 │ │ │ -│ │ │ (选中态) │ │ │ │ │ │ │ -│ │ │ 边框#FF6B6B│ │ │ │ │ │ │ -│ │ └────────────┘ └────────────┘ └────────────┘ │ │ -│ │ (每个类型: 圆角12dp, 背景#F8F8F8) │ │ -│ │ (选中: 边框2dp, 背景#FFF5F5) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 节日选择 (横向滚动) │ │ -│ │ 选择节日: │ │ -│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ -│ │ │ 🎉 │ │ 🧧 │ │ 💕 │ │ 🎂 │ │ ✨ │ │ ··· │ │ │ -│ │ │元旦│ │春节│ │情人│ │生日│ │日常│ │更多│ │ │ -│ │ │选中│ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ │ │ -│ │ (选中: 背景主题色, 白色文字) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 祝福内容输入 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 输入框 (高度: 120dp, 圆角: 12dp, 背景: #F8F8F8) │ │ │ -│ │ │ │ │ │ -│ │ │ 写下你的祝福... │ │ │ -│ │ │ (提示文字: 16sp, #CCCCCC) │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ 200/200 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 背景选择 │ │ -│ │ 选择背景: │ │ -│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ -│ │ │ 背景1 │ │ 背景2 │ │ 背景3 │ │ 背景4 │ │ 背景5 │ │ │ -│ │ │ 渐变红 │ │ 渐变金 │ │ 星空 │ │ 烟花 │ │ 雪花 │ │ │ -│ │ │ (选中) │ │ │ │ │ │ │ │ │ │ │ -│ │ │ ✓勾选 │ │ │ │ │ │ │ │ │ │ │ -│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ -│ │ (每个背景: 60x80dp, 圆角8dp) │ │ -│ │ (选中: 右下角显示白色勾选图标) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 装饰选择 │ │ -│ │ 添加装饰: │ │ -│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ -│ │ │ ⭐ │ │ 🎀 │ │ 🎁 │ │ 💝 │ │ 🌟 │ │ 🎊 │ │ ❄️ │ │ │ -│ │ │星星│ │蝴蝶│ │礼物│ │爱心│ │闪光│ │彩带│ │雪花│ │ │ -│ │ │ ✓ │ │ ✓ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ │ │ -│ │ (可多选, 选中显示勾选标记) │ │ -│ │ (每个装饰: 48x48dp, 圆角8dp, 背景#F5F5F5) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 预览区域 │ │ -│ │ 预览效果: │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ╔════════════════════════════════════════════════╗ │ │ │ -│ │ │ ║ (实时预览祝福卡片效果) ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ ⭐ 🎀 ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ 🎉 新年快乐! ║ │ │ │ -│ │ │ ║ 愿新的一年万事如意... ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ ⭐ 🎀 ║ │ │ │ -│ │ │ ╚════════════════════════════════════════════════╝ │ │ │ -│ │ │ (背景和装饰实时更新) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 可见范围 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 👁 谁可以看 公开 > │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.1.6 许愿树 - 祝福详情界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 (透明, 沉浸式) │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 祝福卡片大图展示区域 (高度: 50%屏幕) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ╔════════════════════════════════════════════════╗ │ │ │ -│ │ │ ║ (节日主题背景) ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ ⭐ 装饰物动画效果 🎀 ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ ┌────┐ ║ │ │ │ -│ │ │ ║ │头像│ 小明 ║ │ │ │ -│ │ │ ║ │56dp│ Lv.5 · 元旦祝福 ║ │ │ │ -│ │ │ ║ └────┘ ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ 🎉 新年快乐! ║ │ │ │ -│ │ │ ║ 愿新的一年万事如意,心想事成! ║ │ │ │ -│ │ │ ║ 希望大家都能实现自己的愿望, ║ │ │ │ -│ │ │ ║ 新的一年加油! ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ 🌟 💝 ║ │ │ │ -│ │ │ ║ ║ │ │ │ -│ │ │ ║ 2024-12-29 10:30 ║ │ │ │ -│ │ │ ╚════════════════════════════════════════════════╝ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ │ -│ │ │ │ ← │ (返回按钮, 白色, 左上角) │ ↗ │ │ │ │ -│ │ │ │返回│ │分享│ │ │ │ -│ │ │ └────┘ └────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 互动数据区域 (白色背景, 圆角顶部16dp) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ ❤️ 256 │ │ 💬 48 │ │ 🎁 15 │ │ │ │ -│ │ │ │ 送心 │ │ 评论 │ │ 礼物 │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ │ (三等分布局, 点击有动画效果) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 评论区域 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 全部评论 (48) 按热度 ▼ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 评论项 │ │ │ -│ │ │ ┌────┐ 小红 · 30分钟前 │ │ │ -│ │ │ │头像│ 新年快乐!祝福收到啦~ │ │ │ -│ │ │ │36dp│ ❤️ 12 │ │ │ -│ │ │ └────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (更多评论...) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 底部操作栏 │ │ -│ │ ┌────────────────────────┐ ┌────┐ ┌────┐ ┌────────────┐ │ │ -│ │ │ 写下你的祝福... │ │ ❤️ │ │ 💬 │ │ 🎁 送礼 │ │ │ -│ │ │ (输入框) │ │256 │ │ 48 │ │ (渐变按钮)│ │ │ -│ │ └────────────────────────┘ └────┘ └────┘ └────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**送礼物弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ (半透明遮罩) │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 送礼物面板 (底部弹窗, 高度50%) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 标题栏 │ │ │ -│ │ │ ──────────── 送礼物 ──────────── │ │ │ -│ │ │ 余额: 💰 1280 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 礼物列表 (网格布局, 4列) │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ ❤️ │ │ 🌹 │ │ 🎁 │ │ 💎 │ │ │ │ -│ │ │ │ 爱心 │ │ 玫瑰 │ │ 礼盒 │ │ 钻石 │ │ │ │ -│ │ │ │ 1金币 │ │ 5金币 │ │ 10金币 │ │ 50金币 │ │ │ │ -│ │ │ │ (选中) │ │ │ │ │ │ │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 🚀 │ │ 🏆 │ │ 👑 │ │ 🎆 │ │ │ │ -│ │ │ │ 火箭 │ │ 奖杯 │ │ 皇冠 │ │ 烟花 │ │ │ │ -│ │ │ │100金币 │ │200金币 │ │500金币 │ │999金币 │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ (选中: 边框#FF6B6B, 背景#FFF5F5) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 数量选择 │ │ │ -│ │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────────────┐ │ │ │ -│ │ │ │ 1 │ │ 10 │ │ 66 │ │ 99 │ │520 │ │ 自定义 │ │ │ │ -│ │ │ │选中│ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 发送按钮 │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 赠送 ❤️ x1 (1金币) │ │ │ │ -│ │ │ │ (渐变背景, 圆角24dp) │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -### 12.2 管理端界面设计 - -#### 12.2.1 缘池社区 - 板块管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 缘池社区 - 板块管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 📂 板块管理 ┌──────────┐ │ │ │ -│ │ │ 管理社区板块分类,支持排序和状态控制 │ + 新增板块│ │ │ │ -│ │ │ │ (蓝色) │ │ │ │ -│ │ │ └──────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 搜索筛选栏 │ │ -│ │ ┌────────────────┐ ┌────────────────┐ ┌────────┐ ┌────────┐ │ │ -│ │ │ 板块名称 │ │ 状态 ▼ │ │ 搜索 │ │ 重置 │ │ │ -│ │ │ 请输入板块名称 │ │ 全部 │ │ (蓝色) │ │ (灰色) │ │ │ -│ │ └────────────────┘ └────────────────┘ └────────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 数据表格 (Element UI Table) │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ ☐ │ 排序 │ 图标 │ 板块名称 │ 描述 │ 帖子数 │ 状态 │ 操作 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ ≡ │ 🔥 │ 推荐 │ 算法推荐热门 │ 1280 │ 启用 │ 编辑 │ │ │ -│ │ │ │ (拖拽)│ │ │ 内容 │ │ (绿) │ 禁用 │ │ │ -│ │ │ │ │ │ │ │ │ │ 删除 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ ≡ │ 📈 │ 热门 │ 24小时热度 │ 856 │ 启用 │ 编辑 │ │ │ -│ │ │ │ │ │ │ 排行 │ │ (绿) │ 禁用 │ │ │ -│ │ │ │ │ │ │ │ │ │ 删除 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ ≡ │ 🎮 │ 游戏 │ 游戏攻略、 │ 2340 │ 启用 │ 编辑 │ │ │ -│ │ │ │ │ │ │ 组队、分享 │ │ (绿) │ 禁用 │ │ │ -│ │ │ │ │ │ │ │ │ │ 删除 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ ≡ │ 🎵 │ 音乐 │ 音乐分享、 │ 1120 │ 禁用 │ 编辑 │ │ │ -│ │ │ │ │ │ │ 翻唱、原创 │ │ (灰) │ 启用 │ │ │ -│ │ │ │ │ │ │ │ │ │ 删除 │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (表格支持拖拽排序, 拖拽时显示蓝色指示线) │ │ -│ │ (状态列: 启用-绿色标签, 禁用-灰色标签) │ │ -│ │ (操作列: 文字按钮, 蓝色-编辑, 橙色-禁用/启用, 红色-删除) │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 分页组件 │ │ -│ │ 共 12 条记录 < 1 2 3 ... 5 > 每页 10 条 ▼ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -**新增/编辑板块弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 新增板块 (Dialog, 宽度500px) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ✕ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 表单内容 │ │ │ -│ │ │ │ │ │ -│ │ │ 板块名称 * │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 请输入板块名称 │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 板块图标 * │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 🔥 ▼ (Emoji选择器) │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 板块描述 │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 请输入板块描述 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 排序 │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 0 ▲ ▼ │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 状态 │ │ │ -│ │ │ ○ 启用 ● 禁用 │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 取消 │ │ 确定 │ │ │ │ -│ │ │ │ (灰色) │ │ (蓝色) │ │ │ │ -│ │ │ └────────┘ └────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.2.2 缘池社区 - 帖子管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 缘池社区 - 帖子管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 📝 帖子管理 │ │ │ -│ │ │ 审核和管理社区帖子内容 │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 数据统计卡片 (4列) │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ 全部帖子 │ │ 待审核 │ │ 已通过 │ │ 已拒绝 │ │ │ -│ │ │ 12,580 │ │ 128 │ │ 11,892 │ │ 560 │ │ │ -│ │ │ (蓝色) │ │ (橙色) │ │ (绿色) │ │ (红色) │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 搜索筛选栏 │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │ │ -│ │ │ 板块 ▼ │ │ 状态 ▼ │ │ 时间范围 │ │ 搜索内容/用户 │ │ │ -│ │ │ 全部 │ │ 全部 │ │ 选择日期 │ │ 🔍 │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────┐ ┌────────┐ ┌──────────────────────────────────────────────┐ │ │ -│ │ │ 搜索 │ │ 重置 │ │ ☐ 只看置顶 ☐ 只看推荐 ☐ 只看有图/视频 │ │ │ -│ │ └────────┘ └────────┘ └──────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 批量操作栏 │ │ -│ │ 已选择 3 项 ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ -│ │ │批量通过│ │批量拒绝│ │批量置顶│ │批量删除│ │ │ -│ │ │ (绿色) │ │ (橙色) │ │ (蓝色) │ │ (红色) │ │ │ -│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 数据表格 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │☐│ID │用户 │板块│内容预览 │图片│互动数据 │状态│时间 │操作│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│10001 │┌────┐ │游戏│今天吃鸡成功!│3张 │👍128 │待审│12-29 │查看│ │ │ -│ │ │ │ ││头像│ │ │分享一下我的 │ │💬32 │核 │10:30 │通过│ │ │ -│ │ │ │ │└────┘ │ │游戏心得... │ │⭐45 │(橙)│ │拒绝│ │ │ -│ │ │ │ │小明 │ │ │ │ │ │ │删除│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│10002 │┌────┐ │美食│周末探店!发现│5张 │👍256 │已通│12-29 │查看│ │ │ -│ │ │ │ ││头像│ │ │一家超好吃的 │ │💬48 │过 │09:15 │置顶│ │ │ -│ │ │ │ │└────┘ │ │火锅店... │ │⭐89 │(绿)│ │推荐│ │ │ -│ │ │ │ │小红 │ │ │ │ │📌 │ │删除│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│10003 │┌────┐ │情感│最近心情不太好│0张 │👍12 │已拒│12-28 │查看│ │ │ -│ │ │ │ ││头像│ │ │想找人聊聊... │ │💬5 │绝 │22:30 │恢复│ │ │ -│ │ │ │ │└────┘ │ │ │ │⭐2 │(红)│ │删除│ │ │ -│ │ │ │ │小李 │ │ │ │ │ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (内容预览: 最多显示30字, 超出显示...) │ │ -│ │ (图片列: 显示图片数量, 点击可预览) │ │ -│ │ (状态标签: 待审核-橙色, 已通过-绿色, 已拒绝-红色) │ │ -│ │ (置顶帖子显示📌图标) │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 分页组件 │ │ -│ │ 共 12,580 条记录 < 1 2 3 ... 629 > 每页 20 条 ▼ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -**帖子详情抽屉:** - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ ┌─────────┐│ -│ │帖子详情 ││ -│ │ (抽屉) ││ -│ (主页面内容, 半透明遮罩) │ 宽400px ││ -│ │ ││ -│ │ ┌─────┐ ││ -│ │ │ ✕ │ ││ -│ │ └─────┘ ││ -│ │ ││ -│ │ 用户信息 ││ -│ │ ┌─────┐ ││ -│ │ │头像 │ ││ -│ │ │小明 │ ││ -│ │ │ID: │ ││ -│ │ │1001 │ ││ -│ │ └─────┘ ││ -│ │ ││ -│ │ 帖子内容 ││ -│ │ ────── ││ -│ │ 今天吃鸡││ -│ │ 成功! ││ -│ │ 分享... ││ -│ │ ││ -│ │ 图片预览 ││ -│ │ ┌─┬─┬─┐ ││ -│ │ │1│2│3│ ││ -│ │ └─┴─┴─┘ ││ -│ │ ││ -│ │ 互动数据 ││ -│ │ 👍128 ││ -│ │ 💬32 ││ -│ │ ⭐45 ││ -│ │ ││ -│ │ 审核操作 ││ -│ │ ┌─────┐ ││ -│ │ │通过 │ ││ -│ │ └─────┘ ││ -│ │ ┌─────┐ ││ -│ │ │拒绝 │ ││ -│ │ └─────┘ ││ -│ │ ││ -│ └─────────┘│ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.2.3 许愿树 - 活动管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 许愿树 - 活动管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 🎉 活动管理 ┌──────────┐ │ │ │ -│ │ │ 配置和管理许愿树节日活动 │ + 新增活动│ │ │ │ -│ │ │ │ (蓝色) │ │ │ │ -│ │ │ └──────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 活动状态Tab │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ -│ │ │ 全部 (8) │ │进行中 (2)│ │未开始 (3)│ │已结束 (3)│ │ │ -│ │ │ (选中) │ │ │ │ │ │ │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 活动卡片列表 (卡片式布局, 3列) │ │ -│ │ │ │ -│ │ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │ │ -│ │ │ 🎄 元旦许愿活动 │ │ 🧧 春节祝福活动 │ │ 💕 情人节活动 │ │ │ -│ │ │ ┌─────────────────┐ │ │ ┌─────────────────┐ │ │ ┌─────────────────┐ │ │ │ -│ │ │ │ (Banner预览图) │ │ │ │ (Banner预览图) │ │ │ │ (Banner预览图) │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ └─────────────────┘ │ │ └─────────────────┘ │ │ └─────────────────┘ │ │ │ -│ │ │ │ │ │ │ │ │ │ -│ │ │ 状态: 🟢 进行中 │ │ 状态: 🟡 未开始 │ │ 状态: ⚫ 已结束 │ │ │ -│ │ │ │ │ │ │ │ │ │ -│ │ │ 时间: │ │ 时间: │ │ 时间: │ │ │ -│ │ │ 12.31 - 01.03 │ │ 01.28 - 02.12 │ │ 02.13 - 02.15 │ │ │ -│ │ │ │ │ │ │ │ │ │ -│ │ │ 参与: 12,580人 │ │ 参与: 0人 │ │ 参与: 8,920人 │ │ │ -│ │ │ 祝福: 35,680条 │ │ 祝福: 0条 │ │ 祝福: 25,430条 │ │ │ -│ │ │ │ │ │ │ │ │ │ -│ │ │ ┌─────┐ ┌─────┐ │ │ ┌─────┐ ┌─────┐ │ │ ┌─────┐ ┌─────┐ │ │ │ -│ │ │ │编辑 │ │统计 │ │ │ │编辑 │ │开启 │ │ │ │查看 │ │统计 │ │ │ │ -│ │ │ └─────┘ └─────┘ │ │ └─────┘ └─────┘ │ │ └─────┘ └─────┘ │ │ │ -│ │ │ ┌─────┐ ┌─────┐ │ │ ┌─────┐ │ │ ┌─────┐ │ │ │ -│ │ │ │关闭 │ │删除 │ │ │ │删除 │ │ │ │复制 │ │ │ │ -│ │ │ └─────┘ └─────┘ │ │ └─────┘ │ │ └─────┘ │ │ │ -│ │ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘ │ │ -│ │ │ │ -│ │ (进行中: 绿色状态点, 未开始: 黄色状态点, 已结束: 灰色状态点) │ │ -│ │ (卡片hover时显示阴影效果) │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -**新增/编辑活动页面:** - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 许愿树 - 新增活动 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ ← 返回 新增活动 ┌────────────────┐│ │ │ -│ │ │ │ 保存并发布 ││ │ │ -│ │ │ │ (蓝色按钮) ││ │ │ -│ │ │ └────────────────┘│ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 表单内容 (两列布局) │ │ -│ │ │ │ -│ │ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │ │ -│ │ │ 基本信息 │ │ Banner配置 │ │ │ -│ │ │ ─────────────────────────── │ │ ─────────────────────────── │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ 活动名称 * │ │ Banner图片 * │ │ │ -│ │ │ ┌───────────────────────┐ │ │ ┌───────────────────────┐ │ │ │ -│ │ │ │ 元旦许愿活动 │ │ │ │ ┌─────────────────┐ │ │ │ │ -│ │ │ └───────────────────────┘ │ │ │ │ │ │ │ │ │ -│ │ │ │ │ │ │ 点击上传图片 │ │ │ │ │ -│ │ │ 关联节日 │ │ │ │ 建议尺寸: │ │ │ │ │ -│ │ │ ┌───────────────────────┐ │ │ │ │ 750x300px │ │ │ │ │ -│ │ │ │ 🎉 元旦 ▼ │ │ │ │ │ │ │ │ │ │ -│ │ │ └───────────────────────┘ │ │ │ └─────────────────┘ │ │ │ │ -│ │ │ │ │ └───────────────────────┘ │ │ │ -│ │ │ 活动时间 * │ │ │ │ │ -│ │ │ ┌───────────┐ 至 ┌───────┐ │ │ 主题颜色 │ │ │ -│ │ │ │ 2024-12-31│ │01-03 │ │ │ ┌───────────────────────┐ │ │ │ -│ │ │ └───────────┘ └───────┘ │ │ │ #FF6B6B 🎨 选择颜色 │ │ │ │ -│ │ │ │ │ └───────────────────────┘ │ │ │ -│ │ │ 活动描述 │ │ │ │ │ -│ │ │ ┌───────────────────────┐ │ └─────────────────────────────┘ │ │ -│ │ │ │ 许下新年愿望,赢取丰 │ │ │ │ -│ │ │ │ 厚奖励! │ │ ┌─────────────────────────────┐ │ │ -│ │ │ │ │ │ │ 奖励配置 │ │ │ -│ │ │ └───────────────────────┘ │ │ ─────────────────────────── │ │ │ -│ │ │ │ │ │ │ │ -│ │ └─────────────────────────────┘ │ ┌───────────────────────┐ │ │ │ -│ │ │ │ + 添加奖励项 │ │ │ │ -│ │ ┌─────────────────────────────┐ │ └───────────────────────┘ │ │ │ -│ │ │ 活动规则 │ │ │ │ │ -│ │ │ ─────────────────────────── │ │ 🥇 第1名: 1000金币 │ │ │ -│ │ │ │ │ 🥈 第2名: 500金币 │ │ │ -│ │ │ ┌───────────────────────┐ │ │ 🥉 第3名: 300金币 │ │ │ -│ │ │ │ + 添加规则 │ │ │ │ │ │ -│ │ │ └───────────────────────┘ │ │ (可拖拽排序, 可删除) │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ • 每人每天可发布3条祝福 │ └─────────────────────────────┘ │ │ -│ │ │ • 获赞最多的祝福可获得奖励 │ │ │ -│ │ │ • 分享活动可获得额外金币 │ │ │ -│ │ │ │ │ │ -│ │ │ (可拖拽排序, 可删除) │ │ │ -│ │ └─────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - - -#### 12.2.4 许愿树 - 祝福管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 许愿树 - 祝福管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ ✨ 祝福管理 │ │ │ -│ │ │ 审核和管理用户发布的祝福内容 │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 数据统计卡片 │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ 全部祝福 │ │ 待审核 │ │ 已通过 │ │ 已拒绝 │ │ │ -│ │ │ 35,680 │ │ 256 │ │ 34,892 │ │ 532 │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 搜索筛选栏 │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐ │ │ -│ │ │ 节日 ▼ │ │ 活动 ▼ │ │ 类型 ▼ │ │ 状态 ▼ │ │ 搜索内容/用户 │ │ │ -│ │ │ 全部 │ │ 全部 │ │ 全部 │ │ 全部 │ │ 🔍 │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────┐ ┌────────┐ │ │ -│ │ │ 搜索 │ │ 重置 │ │ │ -│ │ └────────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 祝福卡片列表 (卡片式布局, 可切换为表格) │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ ☐ 祝福卡片 │ │ │ -│ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ -│ │ │ │ ╔═══════════════════════════════════════════════════════════╗ │ │ │ │ -│ │ │ │ ║ (节日主题背景预览) ║ │ │ │ │ -│ │ │ │ ║ ║ │ │ │ │ -│ │ │ │ ║ ┌────┐ 小明 · 元旦祝福 · 许愿 ║ │ │ │ │ -│ │ │ │ ║ │头像│ 2024-12-29 10:30 ║ │ │ │ │ -│ │ │ │ ║ └────┘ ║ │ │ │ │ -│ │ │ │ ║ ║ │ │ │ │ -│ │ │ │ ║ 🎉 新年快乐!愿新的一年万事如意,心想事成! ║ │ │ │ │ -│ │ │ │ ║ ║ │ │ │ │ -│ │ │ │ ╚═══════════════════════════════════════════════════════════╝ │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 互动数据: ❤️ 256 💬 48 🎁 15 │ │ │ │ -│ │ │ │ 状态: 🟢 已通过 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ │ -│ │ │ │ │ 查看 │ │ 推荐 │ │ 拒绝 │ │ 删除 │ │ │ │ │ -│ │ │ │ │ (蓝色) │ │ (绿色) │ │ (橙色) │ │ (红色) │ │ │ │ │ -│ │ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ │ -│ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ -│ │ └─────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (更多祝福卡片...) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 分页组件 │ │ -│ │ 共 35,680 条记录 < 1 2 3 ... 1784 > 每页 20 条 ▼ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -#### 12.2.5 许愿树 - 素材管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 许愿树 - 素材管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ Tab切换 │ │ -│ │ ┌──────────────────┐ ┌──────────────────┐ │ │ -│ │ │ 🖼️ 背景模板 (24) │ │ ✨ 装饰素材 (48) │ │ │ -│ │ │ (选中) │ │ │ │ │ -│ │ └──────────────────┘ └──────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 操作栏 │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐│ │ -│ │ │ 节日筛选 ▼ │ │ 状态筛选 ▼ │ │ + 上传背景模板 ││ │ -│ │ │ 全部 │ │ 全部 │ │ (蓝色按钮) ││ │ -│ │ └──────────────┘ └──────────────┘ └──────────────────┘│ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 素材卡片网格 (4列) │ │ -│ │ │ │ -│ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────┐ │ │ -│ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────┐ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ │ 背景预览 │ │ │ │ 背景预览 │ │ │ │ 背景预览 │ │ │ │ 背景 │ │ │ │ -│ │ │ │ (渐变红) │ │ │ │ (渐变金) │ │ │ │ (星空) │ │ │ │ 预览 │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────┘ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ 新年红 │ │ 金色祝福 │ │ 星空许愿 │ │ 烟花绽放 │ │ │ -│ │ │ 🎉 元旦 │ │ 🧧 春节 │ │ ✨ 通用 │ │ 🎉 元旦 │ │ │ -│ │ │ 免费 │ │ 免费 │ │ 10金币 │ │ 20金币 │ │ │ -│ │ │ 🟢 启用 │ │ 🟢 启用 │ │ 🟢 启用 │ │ ⚫ 禁用 │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │ │ ┌────┐ │ │ │ -│ │ │ │编辑│ │删除│ │ │ │编辑│ │删除│ │ │ │编辑│ │删除│ │ │ │启用│ │ │ │ -│ │ │ └────┘ └────┘ │ │ └────┘ └────┘ │ │ └────┘ └────┘ │ │ └────┘ │ │ │ -│ │ └────────────────┘ └────────────────┘ └────────────────┘ └────────────┘ │ │ -│ │ │ │ -│ │ (更多素材卡片...) │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -**上传素材弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 上传背景模板 (Dialog, 宽度600px) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 图片上传区域 │ │ │ -│ │ │ ┌────────────────────────────────────────────────┐ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 📤 点击或拖拽上传 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 支持 JPG、PNG 格式 │ │ │ │ -│ │ │ │ 建议尺寸: 750x1200px │ │ │ │ -│ │ │ │ 最大: 2MB │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ └────────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 素材名称 * │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 请输入素材名称 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 关联节日 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 请选择节日 ▼ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 价格设置 │ │ -│ │ ○ 免费 ● 付费 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 10 金币 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 排序 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 0 ▲ ▼ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 取消 │ │ 确定 │ │ │ │ -│ │ │ └────────┘ └────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - -### 12.2.6 直播模块界面设计(核心功能) - -由于直播是平台的核心业务,本节详细描述直播相关的所有界面设计。 - ---- - -## 十三、直播模块详细界面设计(核心) - -直播功能是整个平台的核心,包括直播首页、直播间观看、开播推流、礼物打赏、弹幕互动等完整功能链路。 - -### 13.1 移动端直播界面 - -#### 13.1.1 直播首页界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 (沉浸式, 透明) │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 (高度: 56dp, 背景: #FFFFFF) │ │ -│ │ ┌────┐ ┌──────────────────────────────┐ ┌────┐ ┌────┐ │ │ -│ │ │ ☰ │ │ 🔍 搜索主播、房间... │ │ 📷 │ │ 👤 │ │ │ -│ │ │菜单│ │ (搜索框, 圆角20dp, #F5F5F5) │ │扫码│ │头像│ │ │ -│ │ └────┘ └──────────────────────────────┘ └────┘ └────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部Tab切换 (高度: 44dp) │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ -│ │ │ 关注 │ │ 推荐 │ │ 附近 │ │ │ -│ │ │ (选中) │ │ │ │ │ │ │ -│ │ │ #FF6B6B │ │ #666666 │ │ #666666 │ │ │ -│ │ │ ════════ │ │ │ │ │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ │ │ -│ │ (选中Tab下方有3dp红色指示条) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 分类标签栏 (高度: 40dp, 可横向滑动) │ │ -│ │ ┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐ │ │ -│ │ │全部││热门││游戏││才艺││户外││音乐││聊天││更多│ │ │ -│ │ │选中││ ││ 🎮 ││ 🎤 ││ 🏕️ ││ 🎵 ││ 💬 ││ ··· │ │ │ -│ │ └────┘└────┘└────┘└────┘└────┘└────┘└────┘└────┘ │ │ -│ │ (选中: 背景#FF6B6B, 白色文字, 圆角12dp) │ │ -│ │ (未选中: 背景透明, #666666文字) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 直播间列表 (瀑布流布局, 2列) │ │ -│ │ │ │ -│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ -│ │ │ 直播间卡片 │ │ 直播间卡片 │ │ │ -│ │ │ ┌─────────────────┐ │ │ ┌─────────────────┐ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ │ 封面图片 │ │ │ │ 封面图片 │ │ │ │ -│ │ │ │ (圆角12dp) │ │ │ │ (圆角12dp) │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ │ ┌─────────────┐ │ │ │ │ ┌─────────────┐ │ │ │ │ -│ │ │ │ │🔴 直播中 │ │ │ │ │ │👁 12.5万 │ │ │ │ │ -│ │ │ │ │(左上角标签) │ │ │ │ │ │(右上角人数) │ │ │ │ │ -│ │ │ │ └─────────────┘ │ │ │ │ └─────────────┘ │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ └─────────────────┘ │ │ └─────────────────┘ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ 王者荣耀五排上分 │ │ 深夜唱歌陪伴 │ │ │ -│ │ │ (标题: 14sp, 最多2行)│ │ (标题: 14sp) │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ ┌────┐ 小明 │ │ ┌────┐ 小红 │ │ │ -│ │ │ │头像│ (主播名) │ │ │头像│ (主播名) │ │ │ -│ │ │ │24dp│ │ │ │24dp│ │ │ │ -│ │ │ └────┘ │ │ └────┘ │ │ │ -│ │ └─────────────────────┘ └─────────────────────┘ │ │ -│ │ │ │ -│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ -│ │ │ (更多直播间卡片...) │ │ (更多直播间卡片...) │ │ │ -│ │ └─────────────────────┘ └─────────────────────┘ │ │ -│ │ │ │ -│ │ (支持下拉刷新, 上拉加载更多) │ │ -│ │ (卡片点击进入直播间) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 开播悬浮按钮 (右下角, 距边缘16dp) │ │ -│ │ ┌──────────┐ │ │ -│ │ │ 📹 │ │ │ -│ │ │ 开播 │ │ │ -│ │ │ 56dp │ │ │ -│ │ │ #FF6B6B │ │ │ -│ │ │ 阴影6dp │ │ │ -│ │ └──────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ 底部导航栏 (高度: 56dp) │ -│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │ -│ │ 🏠 │ 🎣 │ 🌳 │ 💬 │ 👤 │ │ -│ │ 首页 │ 缘池 │ 许愿树 │ 消息 │ 我的 │ │ -│ │ #FF6B6B │ #999999 │ #999999 │ #999999 │ #999999 │ │ -│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**直播间卡片设计规范:** - -| 元素 | 规格 | 说明 | -|------|------|------| -| 卡片宽度 | (屏幕宽度-48dp)/2 | 两列瀑布流 | -| 封面比例 | 3:4 | 竖版封面 | -| 封面圆角 | 12dp | 顶部圆角 | -| 直播标签 | 左上角, 背景#FF4D4F | 显示"直播中" | -| 观看人数 | 右上角, 半透明黑背景 | 显示观看人数 | -| 标题字号 | 14sp | 最多显示2行 | -| 主播头像 | 24dp圆形 | 左下角 | -| 主播名称 | 12sp, #666666 | 头像右侧 | - -#### 13.1.2 直播间观看界面(竖屏模式) - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 (透明, 沉浸式) │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 视频播放区域 (全屏背景) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ 直播视频流画面 │ │ │ -│ │ │ (ExoPlayer/IjkPlayer) │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 顶部信息栏 (半透明渐变背景, 从上到下) │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ │ -│ │ │ │ ← │ │ ✕ │ │ │ │ -│ │ │ │返回│ │关闭│ │ │ │ -│ │ │ └────┘ └────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 主播信息卡片 (圆角20dp, 半透明黑背景) │ │ │ │ -│ │ │ │ ┌────┐ ┌──────┐ │ │ │ │ -│ │ │ │ │头像│ 小明 │+ 关注│ │ │ │ │ -│ │ │ │ │48dp│ 🔴 直播中 · 👁 12.5万 │ 按钮 │ │ │ │ │ -│ │ │ │ │圆形│ (在线人数实时更新) │ │ │ │ │ │ -│ │ │ │ └────┘ └──────┘ │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 房间标题: 王者荣耀五排上分,来一起玩! │ │ │ │ -│ │ │ │ (白色文字, 16sp, 带阴影) │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 功能按钮区 (右侧垂直排列) │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ 🔊 │ │ │ │ -│ │ │ │音量│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ ⛶ │ │ │ │ -│ │ │ │全屏│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ ↗ │ │ │ │ -│ │ │ │分享│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ ··· │ │ │ │ -│ │ │ │更多│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 弹幕显示区域 (覆盖在视频上方, 从下往上滚动) │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ 🎁 小红 送出 火箭x1 │ │ │ -│ │ │ (礼物消息: 金色背景, 特殊样式) │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ 小明: 主播打得真好! │ │ │ -│ │ │ (普通弹幕: 白色文字, 半透明黑背景, 圆角16dp) │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ 👑 VIP用户: 支持主播! │ │ │ -│ │ │ (VIP弹幕: 金色边框, 特殊标识) │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ 🎉 欢迎 小李 进入直播间 │ │ │ -│ │ │ (系统消息: 蓝色文字) │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (弹幕从底部进入, 向上滚动, 最多显示10条) │ │ -│ │ (新弹幕有淡入动画, 旧弹幕淡出) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 礼物特效层 (全屏覆盖, 播放礼物动画) │ │ -│ │ │ │ -│ │ ┌─────────────────────────┐ │ │ -│ │ │ 🚀 │ │ │ -│ │ │ 火箭特效动画 │ │ │ -│ │ │ (Lottie/SVGA动画) │ │ │ -│ │ └─────────────────────────┘ │ │ -│ │ │ │ -│ │ (大礼物: 全屏动画, 持续3-5秒) │ │ -│ │ (小礼物: 右侧飘过动画) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 底部互动栏 (高度: 56dp, 半透明黑背景) │ │ -│ │ ┌────────────────────────┐ ┌────┐ ┌────┐ ┌────────────┐ │ │ -│ │ │ 说点什么... │ │ 💬 │ │ 🎁 │ │ 💰 1280 │ │ │ -│ │ │ (弹幕输入框) │ │弹幕│ │礼物│ │ (余额) │ │ │ -│ │ │ (圆角20dp, 半透明) │ │开关│ │面板│ │ 充值入口 │ │ │ -│ │ └────────────────────────┘ └────┘ └────┘ └────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -#### 12.3.1 移动端设计规范 - -| 设计元素 | 规格 | 说明 | -|----------|------|------| -| **颜色规范** | | | -| 主题色 | #FF6B6B | 用于按钮、选中状态、强调元素 | -| 辅助色 | #FF8E8E | 用于渐变、hover状态 | -| 成功色 | #52C41A | 用于成功提示、通过状态 | -| 警告色 | #FAAD14 | 用于警告提示、待审核状态 | -| 错误色 | #FF4D4F | 用于错误提示、拒绝状态 | -| 文字主色 | #333333 | 用于标题、正文 | -| 文字次色 | #666666 | 用于次要文字、描述 | -| 文字辅助色 | #999999 | 用于提示文字、时间 | -| 背景色 | #F5F5F5 | 用于页面背景、分割区域 | -| 卡片背景 | #FFFFFF | 用于卡片、弹窗背景 | -| **字体规范** | | | -| 大标题 | 18sp, 加粗 | 页面标题 | -| 标题 | 16sp, 加粗 | 卡片标题、区块标题 | -| 正文 | 15sp, 常规 | 帖子内容、祝福内容 | -| 次要文字 | 14sp, 常规 | 用户名、标签 | -| 辅助文字 | 13sp, 常规 | 时间、位置、统计数据 | -| 小文字 | 12sp, 常规 | 标签、按钮文字 | -| 底部导航 | 10sp, 常规 | Tab文字 | -| **间距规范** | | | -| 页面边距 | 16dp | 左右边距 | -| 卡片间距 | 12dp | 卡片之间的间距 | -| 内容间距 | 8dp | 元素之间的间距 | -| 紧凑间距 | 4dp | 紧密排列的元素 | -| **圆角规范** | | | -| 大圆角 | 16dp | 卡片、弹窗 | -| 中圆角 | 12dp | 按钮、输入框 | -| 小圆角 | 8dp | 图片、标签 | -| 全圆角 | 50% | 头像、圆形按钮 | -| **阴影规范** | | | -| 轻阴影 | 2dp | 卡片默认阴影 | -| 中阴影 | 4dp | 悬浮按钮、弹窗 | -| 重阴影 | 8dp | 底部操作栏 | - -#### 12.3.2 管理端设计规范 - -| 设计元素 | 规格 | 说明 | -|----------|------|------| -| **颜色规范** | | | -| 主题色 | #409EFF | Element UI默认蓝色 | -| 成功色 | #67C23A | 通过、启用状态 | -| 警告色 | #E6A23C | 待审核、警告状态 | -| 危险色 | #F56C6C | 拒绝、删除操作 | -| 信息色 | #909399 | 禁用、次要信息 | -| 文字主色 | #303133 | 标题、正文 | -| 文字次色 | #606266 | 次要文字 | -| 文字辅助色 | #909399 | 提示文字 | -| 边框色 | #DCDFE6 | 输入框、表格边框 | -| 背景色 | #F5F7FA | 页面背景 | -| **字体规范** | | | -| 页面标题 | 20px, 加粗 | 页面主标题 | -| 卡片标题 | 16px, 加粗 | 卡片、区块标题 | -| 正文 | 14px, 常规 | 表格内容、表单 | -| 辅助文字 | 12px, 常规 | 提示、描述 | -| **组件规范** | | | -| 表格行高 | 48px | 数据表格 | -| 按钮高度 | 32px/36px/40px | 小/中/大按钮 | -| 输入框高度 | 32px/36px/40px | 小/中/大输入框 | -| 卡片圆角 | 4px | Element UI默认 | -| 弹窗宽度 | 500px/600px/800px | 小/中/大弹窗 | - -#### 12.3.3 动画效果规范 - -| 动画类型 | 时长 | 缓动函数 | 应用场景 | -|----------|------|----------|----------| -| 页面切换 | 300ms | ease-in-out | Activity切换 | -| 弹窗显示 | 250ms | ease-out | 底部弹窗、对话框 | -| 弹窗隐藏 | 200ms | ease-in | 关闭弹窗 | -| 按钮点击 | 150ms | ease | 按钮缩放反馈 | -| 列表项 | 200ms | ease | 列表项进入动画 | -| 点赞动画 | 300ms | spring | 心跳效果 | -| 加载动画 | 1000ms | linear | 循环加载 | -| 刷新动画 | 500ms | ease-out | 下拉刷新 | -| 许愿树装饰 | 2000ms | ease-in-out | 呼吸灯效果 | -| 祝福卡片 | 400ms | spring | 弹出缩放 | - -#### 12.3.4 交互反馈规范 - -| 交互类型 | 反馈方式 | 说明 | -|----------|----------|------| -| 按钮点击 | 缩放+颜色变化 | 0.95缩放,颜色加深 | -| 列表点击 | 背景色变化 | 显示#F5F5F5背景 | -| 长按操作 | 震动+菜单 | 50ms震动,显示操作菜单 | -| 下拉刷新 | 加载动画+文字 | 显示"正在刷新..." | -| 上拉加载 | 加载动画+文字 | 显示"加载中..." | -| 操作成功 | Toast提示 | 显示2秒后消失 | -| 操作失败 | Toast提示 | 显示错误信息 | -| 网络错误 | 空状态页面 | 显示重试按钮 | -| 无数据 | 空状态页面 | 显示引导文字 | - ---- - -> 界面设计描述完成 -> -> 本章节提供了移动端和管理端所有核心界面的详细设计描述,包括布局结构、颜色规范、字体规范、间距规范、动画效果等,可作为UI设计和前端开发的参考依据。 - ---- - -> 报告完成 -> -> 建议按照开发计划分阶段实施,优先完成核心功能 - - -#### 13.1.3 直播间观看界面(横屏全屏模式) - -``` -┌──────────────────────────────────────────────────────────────────────────────────────────┐ -│ │ -│ ┌────────────────────────────────────────────────────────────────────────────────────┐ │ -│ │ 直播视频流画面 (全屏) │ │ -│ │ │ │ -│ │ ┌──────────────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 顶部控制栏 (半透明渐变, 自动隐藏) │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ │ -│ │ │ │ ← │ 王者荣耀五排上分 │ ✕ │ │ │ │ -│ │ │ │返回│ 小明 · 👁 12.5万 │关闭│ │ │ │ -│ │ │ └────┘ └────┘ │ │ │ -│ │ └──────────────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ ┌──────────────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 弹幕显示区域 (左侧, 宽度40%) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────────────────────────────────┐ │ │ │ -│ │ │ │ 小明: 主播打得真好! │ │ │ │ -│ │ │ └────────────────────────────────────┘ │ │ │ -│ │ │ ┌────────────────────────────────────┐ │ │ │ -│ │ │ │ 小红: 666666 │ │ │ │ -│ │ │ └────────────────────────────────────┘ │ │ │ -│ │ │ ┌────────────────────────────────────┐ │ │ │ -│ │ │ │ 🎁 小李 送出 爱心x10 │ │ │ │ -│ │ │ └────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └──────────────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌──────────────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 底部控制栏 (半透明, 自动隐藏) │ │ │ -│ │ │ ┌──────────────────────────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────────┐ │ │ │ -│ │ │ │ 说点什么... │ │ 💬 │ │ 🎁 │ │ 🔊 │ │ ⛶ │ │ ↗ │ │ + 关注 │ │ │ │ -│ │ │ │ (弹幕输入) │ │弹幕│ │礼物│ │音量│ │竖屏│ │分享│ │ │ │ │ │ -│ │ │ └──────────────────────────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────────┘ │ │ │ -│ │ └──────────────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └────────────────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└──────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -**横屏模式交互说明:** -- 点击屏幕中央:显示/隐藏控制栏(3秒后自动隐藏) -- 双击屏幕:暂停/播放 -- 左右滑动:调节进度(仅回放模式) -- 上下滑动左侧:调节亮度 -- 上下滑动右侧:调节音量 -- 弹幕区域可拖拽调整位置 - -#### 13.1.4 礼物面板界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ (直播间画面, 半透明遮罩) │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 礼物面板 (底部弹窗, 高度55%, 圆角顶部16dp) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 顶部信息栏 │ │ │ -│ │ │ ┌────────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 🎁 礼物 💰 余额: 1280 │ │ │ │ -│ │ │ │ ┌──────────┐ │ │ │ │ -│ │ │ │ │ 充值 > │ │ │ │ │ -│ │ │ │ └──────────┘ │ │ │ │ -│ │ │ └────────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 礼物分类Tab │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 热门 │ │ 浪漫 │ │ 豪华 │ │ 特效 │ │ │ │ -│ │ │ │ (选中) │ │ │ │ │ │ │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 礼物列表 (网格布局, 4列, 可滚动) │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ ❤️ │ │ 🌹 │ │ 💋 │ │ 🍭 │ │ │ │ -│ │ │ │ 爱心 │ │ 玫瑰 │ │ 么么 │ │ 棒棒糖│ │ │ │ -│ │ │ │ 1金币 │ │ 5金币 │ │ 10金币│ │ 20金币│ │ │ │ -│ │ │ │ (选中) │ │ │ │ │ │ │ │ │ │ -│ │ │ │边框红色│ │ │ │ │ │ │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 🎁 │ │ 🚗 │ │ 🚀 │ │ 🏆 │ │ │ │ -│ │ │ │ 礼盒 │ │ 跑车 │ │ 火箭 │ │ 奖杯 │ │ │ │ -│ │ │ │ 50金币│ │ 100金币│ │ 500金币│ │1000金币│ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 👑 │ │ 🏰 │ │ 🎆 │ │ 🌈 │ │ │ │ -│ │ │ │ 皇冠 │ │ 城堡 │ │ 烟花 │ │ 彩虹 │ │ │ │ -│ │ │ │2000金币│ │5000金币│ │9999金币│ │ 52000 │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ (每个礼物: 80x100dp, 圆角8dp, 背景#F8F8F8) │ │ │ -│ │ │ (选中: 边框2dp #FF6B6B, 背景#FFF5F5) │ │ │ -│ │ │ (礼物图标: 48dp, 居中显示) │ │ │ -│ │ │ (礼物名称: 12sp, #333333) │ │ │ -│ │ │ (礼物价格: 11sp, #FF6B6B) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 数量选择和发送 │ │ │ -│ │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌─────────┐ │ │ │ -│ │ │ │ 1 │ │ 10 │ │ 66 │ │ 99 │ │520 │ │ 赠送 │ │ │ │ -│ │ │ │选中│ │ │ │ │ │ │ │ │ │ ❤️ x1 │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ (1金币) │ │ │ │ -│ │ │ └────┘ └────┘ └────┘ └────┘ └────┘ │ #FF6B6B │ │ │ │ -│ │ │ └─────────┘ │ │ │ -│ │ │ (数量选择: 圆角16dp, 选中背景#FF6B6B白色文字) │ │ │ -│ │ │ (赠送按钮: 渐变背景, 圆角24dp, 宽度120dp) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**礼物连送效果:** -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ 连送礼物时, 在屏幕左侧显示连击效果: │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 连击显示区 (左侧, 距顶部30%) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────┐ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │头像│ 小明 送出 │ │ │ -│ │ │ │32dp│ │ │ │ -│ │ │ └────┘ ❤️ 爱心 │ │ │ -│ │ │ │ │ │ -│ │ │ x 10 │ │ │ -│ │ │ (连击数字, 放大动画) │ │ │ -│ │ │ (金色渐变, 字号48sp) │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (连击卡片: 半透明黑背景, 圆角12dp) │ │ -│ │ (连击数字有缩放弹跳动画) │ │ -│ │ (3秒无操作后淡出消失) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 13.1.5 开播准备界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────┐ ┌────────┐ │ │ -│ │ │ ← │ 开始直播 │ 开播 │ │ │ -│ │ │返回│ │ #FF6B6B│ │ │ -│ │ └────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 摄像头预览区域 (高度: 50%屏幕) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ 摄像头实时预览画面 │ │ │ -│ │ │ (前置/后置摄像头) │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ │ -│ │ │ │ 🔄 │ │ ✨ │ │ │ │ -│ │ │ │翻转│ │美颜│ │ │ │ -│ │ │ │摄像│ │滤镜│ │ │ │ -│ │ │ └ - - -#### 13.1.5 开播准备界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────┐ ┌────────┐ │ │ -│ │ │ ← │ 开始直播 │ 开播 │ │ │ -│ │ │返回│ │ #FF6B6B│ │ │ -│ │ └────┘ └────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 摄像头预览区域 (高度: 280dp, 圆角: 16dp) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ 摄像头实时预览画面 │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ │ -│ │ │ │ 🔄 │ │ ✨ │ │ │ │ -│ │ │ │翻转│ │美颜│ │ │ │ -│ │ │ │摄像│ │滤镜│ │ │ │ -│ │ │ └────┘ └────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 直播设置表单 │ │ -│ │ │ │ -│ │ 直播封面 * │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌──────────┐ │ │ │ -│ │ │ │ │ 点击上传封面图片 │ │ │ -│ │ │ │ 📷 + │ 建议尺寸: 750x1000 │ │ │ -│ │ │ │ │ 支持JPG、PNG格式 │ │ │ -│ │ │ │ 120x160 │ │ │ │ -│ │ │ │ 圆角8dp │ │ │ │ -│ │ │ └──────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 直播标题 * │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 请输入直播标题,吸引更多观众 │ │ │ -│ │ │ (最多30字) 0/30 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 直播分类 * │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 请选择分类 ▼ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 直播标签 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ #王者 │ │ #五排 │ │ #上分 │ │ + 添加│ │ │ │ -│ │ │ │ 荣耀 │ │ │ │ │ │ 标签 │ │ │ │ -│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ -│ │ │ (标签: 圆角16dp, 背景#F5F5F5, 可删除) │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 直播公告 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 输入直播间公告,让观众了解直播内容 │ │ │ -│ │ │ │ │ │ -│ │ │ 0/200 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ 直播设置 │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 🔒 仅粉丝可看 ○ 关闭 │ │ │ -│ │ ├────────────────────────────────────────────────────┤ │ │ -│ │ │ 📍 显示位置 ● 开启 │ │ │ -│ │ ├────────────────────────────────────────────────────┤ │ │ -│ │ │ 💬 开启弹幕 ● 开启 │ │ │ -│ │ ├────────────────────────────────────────────────────┤ │ │ -│ │ │ 🎁 开启礼物 ● 开启 │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 底部开播按钮 (固定底部) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ 🎬 开始直播 │ │ │ -│ │ │ (渐变背景, 圆角24dp) │ │ │ -│ │ │ (宽度: 100%-32dp, 高度: 48dp) │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**分类选择弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 选择直播分类 (底部弹窗) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ──────────── 选择分类 ──────────── │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 分类网格 (3列) │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 🎮 │ │ 🎤 │ │ 🎵 │ │ │ │ -│ │ │ │ 游戏 │ │ 才艺 │ │ 音乐 │ │ │ │ -│ │ │ │ (选中) │ │ │ │ │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 🏕️ │ │ 💬 │ │ 📚 │ │ │ │ -│ │ │ │ 户外 │ │ 聊天 │ │ 学习 │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 🍳 │ │ 💪 │ │ 🎨 │ │ │ │ -│ │ │ │ 美食 │ │ 健身 │ │ 绘画 │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -#### 13.1.6 主播开播中界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 (透明) │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 摄像头画面 (全屏) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 顶部状态栏 (半透明渐变背景) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 直播信息卡片 │ │ │ │ -│ │ │ │ ┌────┐ ┌────────┐ │ │ │ │ -│ │ │ │ │头像│ 我的直播间 │ 🔴 LIVE│ │ │ │ │ -│ │ │ │ │48dp│ 👁 1,280 在线 │ 02:35:18│ │ │ │ │ -│ │ │ │ └────┘ │(直播时长)│ │ │ │ │ -│ │ │ │ └────────┘ │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 实时数据 │ │ │ │ -│ │ │ │ 💰 收益: 2,580 │ 👥 新增粉丝: 128 │ │ │ │ -│ │ │ │ (半透明背景, 圆角8dp) │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 右侧工具栏 (垂直排列) │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ 🔄 │ │ │ │ -│ │ │ │翻转│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ ✨ │ │ │ │ -│ │ │ │美颜│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ 🎵 │ │ │ │ -│ │ │ │音乐│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ 📢 │ │ │ │ -│ │ │ │公告│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ │ ┌────┐ │ │ │ -│ │ │ │ ⚙️ │ │ │ │ -│ │ │ │设置│ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 弹幕显示区域 (左侧) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────────────────────────────────┐ │ │ │ -│ │ │ │ 🎉 欢迎 小明 进入直播间 │ │ │ │ -│ │ │ └────────────────────────────────────┘ │ │ │ -│ │ │ ┌────────────────────────────────────┐ │ │ │ -│ │ │ │ 小红: 主播好漂亮! │ │ │ │ -│ │ │ └────────────────────────────────────┘ │ │ │ -│ │ │ ┌────────────────────────────────────┐ │ │ │ -│ │ │ │ 🎁 小李 送出 玫瑰x10 │ │ │ │ -│ │ │ └────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 底部控制栏 (高度: 80dp, 半透明黑背景) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 弹幕输入框 │ │ │ -│ │ │ ┌────────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 和观众互动一下吧... │ │ │ │ -│ │ │ └────────────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 功能按钮 │ │ │ -│ │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌──────────────────┐ │ │ │ -│ │ │ │ 💬 │ │ 🎁 │ │ 👥 │ │ 📊 │ │ 结束直播 │ │ │ │ -│ │ │ │弹幕│ │礼物│ │观众│ │数据│ │ (红色按钮) │ │ │ │ -│ │ │ │开关│ │记录│ │列表│ │统计│ │ │ │ │ │ -│ │ │ └────┘ └────┘ └────┘ └────┘ └──────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -**美颜滤镜面板:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 美颜滤镜面板 (底部弹窗, 高度40%) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ Tab切换 │ │ │ -│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ -│ │ │ │ 美颜 │ │ 滤镜 │ │ 贴纸 │ │ │ │ -│ │ │ │ (选中) │ │ │ │ │ │ │ │ -│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 美颜选项 │ │ │ -│ │ │ │ │ │ -│ │ │ 磨皮 │ │ │ -│ │ │ ○────────────────────●──────────────────○ │ │ │ -│ │ │ 0 70 100 │ │ │ -│ │ │ │ │ │ -│ │ │ 美白 │ │ │ -│ │ │ ○──────────────●────────────────────────○ │ │ │ -│ │ │ 0 50 100 │ │ │ -│ │ │ │ │ │ -│ │ │ 瘦脸 │ │ │ -│ │ │ ○────────●──────────────────────────────○ │ │ │ -│ │ │ 0 30 100 │ │ │ -│ │ │ │ │ │ -│ │ │ 大眼 │ │ │ -│ │ │ ○──────────────────●────────────────────○ │ │ │ -│ │ │ 0 60 100 │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 重置 │ │ 确定 │ │ │ │ -│ │ │ └────────┘ └────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 13.1.7 直播结束统计界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 直播结束页面 (背景: 渐变色) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 顶部信息 │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────┐ │ │ │ -│ │ │ │ 头像 │ │ │ │ -│ │ │ │ 80dp │ │ │ │ -│ │ │ │ 圆形 │ │ │ │ -│ │ │ └────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 本场直播已结束 │ │ │ -│ │ │ (标题: 20sp, 白色, 加粗) │ │ │ -│ │ │ │ │ │ -│ │ │ 直播时长: 02:35:18 │ │ │ -│ │ │ (副标题: 14sp, 白色80%) │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 数据统计卡片 (白色背景, 圆角16dp, 阴影) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 核心数据 (4列) │ │ │ │ -│ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ │ -│ │ │ │ │ 12,580 │ │ 2,580 │ │ 128 │ │ 3,560 │ │ │ │ │ -│ │ │ │ │ 观看人数│ │ 礼物收益│ │ 新增粉丝│ │ 弹幕数 │ │ │ │ │ -│ │ │ │ │ (蓝色) │ │ (金色) │ │ (红色) │ │ (绿色) │ │ │ │ │ -│ │ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ───────────────────────────────────────────────── │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 详细数据 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 最高在线人数 1,280 │ │ │ │ -│ │ │ │ 平均观看时长 8分32秒 │ │ │ │ -│ │ │ │ 点赞数 5,680 │ │ │ │ -│ │ │ │ 分享次数 256 │ │ │ │ -│ │ │ │ 新增关注 128 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ ───────────────────────────────────────────────── │ │ │ -│ │ │ │ │ │ -│ │ │ ┌──────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 礼物榜单 TOP3 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 🥇 小明 送出 1,280 金币 │ │ │ │ -│ │ │ │ 🥈 小红 送出 680 金币 │ │ │ │ -│ │ │ │ 🥉 小李 送出 320 金币 │ │ │ │ -│ │ │ │ │ │ │ │ -│ │ │ │ 查看完整榜单 > │ │ │ │ -│ │ │ └──────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 底部按钮 │ │ │ -│ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ -│ │ │ │ 分享战绩 │ │ 返回首页 │ │ │ │ -│ │ │ │ (白色边框) │ │ (白色背景) │ │ │ │ -│ │ │ └──────────────────┘ └──────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -#### 13.1.8 充值界面 - -``` -┌────────────────────────────────────────────────────────────────┐ -│ 状态栏 │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 顶部导航栏 │ │ -│ │ ┌────┐ │ │ -│ │ │ ← │ 充值中心 │ │ -│ │ │返回│ │ │ -│ │ └────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 余额显示卡片 (渐变背景, 圆角16dp) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ 💰 我的金币 │ │ │ -│ │ │ │ │ │ -│ │ │ 1,280 │ │ │ -│ │ │ (余额: 36sp, 白色, 加粗) │ │ │ -│ │ │ │ │ │ -│ │ │ ┌────────────────────┐ │ │ │ -│ │ │ │ 查看明细 > │ │ │ │ -│ │ │ └────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 充值选项 (网格布局, 3列) │ │ -│ │ │ │ -│ │ 选择充值金额: │ │ -│ │ │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ 60 │ │ 300 │ │ 680 │ │ │ -│ │ │ 金币 │ │ 金币 │ │ 金币 │ │ │ -│ │ │ ¥6.00 │ │ ¥30.00 │ │ ¥68.00 │ │ │ -│ │ │ (选中) │ │ │ │ 🔥 热门 │ │ │ -│ │ │ 边框红色 │ │ │ │ │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ │ │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ 1280 │ │ 3280 │ │ 6480 │ │ │ -│ │ │ 金币 │ │ 金币 │ │ 金币 │ │ │ -│ │ │ ¥128.00 │ │ ¥328.00 │ │ ¥648.00 │ │ │ -│ │ │ 送 100 │ │ 送 300 │ │ 送 680 │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ │ │ │ -│ │ (每个选项: 圆角12dp, 背景#F8F8F8) │ │ -│ │ (选中: 边框2dp #FF6B6B, 背景#FFF5F5) │ │ -│ │ (热门标签: 右上角, 红色背景) │ │ -│ │ (赠送标签: 底部, 金色文字) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 支付方式 │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌────┐ ○ │ │ │ -│ │ │ │微信│ 微信支付 │ │ │ -│ │ │ │支付│ 推荐使用 ● │ │ │ -│ │ │ └────┘ │ │ │ -│ │ ├────────────────────────────────────────────────────┤ │ │ -│ │ │ ┌────┐ ○ │ │ │ -│ │ │ │支付│ 支付宝 │ │ │ -│ │ │ │ 宝 │ │ │ │ -│ │ │ └────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 充值说明 │ │ -│ │ • 充值金币仅限平台内使用 │ │ -│ │ • 充值后不支持退款 │ │ -│ │ • 如有问题请联系客服 │ │ -│ │ (说明文字: 12sp, #999999) │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -├────────────────────────────────────────────────────────────────┤ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 底部支付按钮 (固定底部) │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ │ │ │ -│ │ │ 立即充值 ¥6.00 │ │ │ -│ │ │ (渐变背景, 圆角24dp) │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└────────────────────────────────────────────────────────────────┘ -``` - -### 13.2 管理端直播界面 - -#### 13.2.1 直播间管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 直播管理 - 直播间列表 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 📺 直播间管理 │ │ │ -│ │ │ 管理平台所有直播间,支持实时监控和管理操作 │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 数据统计卡片 │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ 正在直播 │ │ 今日开播 │ │ 总直播间 │ │ 今日收益 │ │ │ -│ │ │ 128 │ │ 356 │ │ 12,580 │ │ ¥25,680 │ │ │ -│ │ │ 🔴 实时 │ │ │ │ │ │ │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 状态Tab + 搜索筛选 │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ -│ │ │全部(12580)│ │直播中(128)│ │已结束 │ │已封禁 │ │ │ -│ │ │ (选中) │ │ 🔴 │ │ │ │ │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ -│ │ │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │ │ -│ │ │ 分类 ▼ │ │ 时间范围 │ │ 主播等级 │ │ 搜索房间/主播 │ │ │ -│ │ │ 全部 │ │ 选择日期 │ │ 全部 ▼ │ │ 🔍 │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 直播间卡片列表 (卡片式布局, 4列) │ │ -│ │ │ │ -│ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────┐ │ │ -│ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────┐ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ │ 封面预览 │ │ │ │ 封面预览 │ │ │ │ 封面预览 │ │ │ │ 封面 │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 预览 │ │ │ │ -│ │ │ │ 🔴 直播中 │ │ │ │ 🔴 直播中 │ │ │ │ ⚫ 已结束 │ │ │ │ │ │ │ │ -│ │ │ │ 👁 12,580 │ │ │ │ 👁 8,560 │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────┘ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ 王者五排上分 │ │ 深夜唱歌陪伴 │ │ 户外探险 │ │ 美食制作 │ │ │ -│ │ │ ┌────┐ 小明 │ │ ┌────┐ 小红 │ │ ┌────┐ 小李 │ │ ┌────┐ │ │ │ -│ │ │ │头像│ 游戏 │ │ │头像│ 才艺 │ │ │头像│ 户外 │ │ │头像│ │ │ │ -│ │ │ └────┘ │ │ └────┘ │ │ └────┘ │ │ └────┘ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │ │ ┌────┐ │ │ │ -│ │ │ │进入│ │关闭│ │ │ │进入│ │关闭│ │ │ │查看│ │删除│ │ │ │查看│ │ │ │ -│ │ │ └────┘ └────┘ │ │ └────┘ └────┘ │ │ └────┘ └────┘ │ │ └────┘ │ │ │ -│ │ └────────────────┘ └────────────────┘ └────────────────┘ └────────────┘ │ │ -│ │ │ │ -│ │ (直播中: 封面左上角显示红色直播标签和观看人数) │ │ -│ │ (已结束: 封面显示灰色遮罩) │ │ -│ │ (操作按钮: 进入-蓝色, 关闭-红色, 查看-灰色) │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 分页组件 │ │ -│ │ 共 12,580 条记录 < 1 2 3 ... 629 > 每页 20 条 ▼ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - - -#### 13.2.2 直播监控大屏界面 - -``` -┌──────────────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 直播监控大屏 │ -├──────────────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌────────────────────────────────────────────────────────────────────────────────────┐ │ -│ │ 顶部状态栏 (深色背景) │ │ -│ │ ┌────────────────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 📺 直播监控中心 2024-12-29 15:30:45 ┌──────────────┐ │ │ │ -│ │ │ (实时时间) │ 🔴 监控中 │ │ │ │ -│ │ │ └──────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────────────────┘ │ │ -│ └────────────────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌────────────────────────────────────────────────────────────────────────────────────┐ │ -│ │ 实时数据面板 (顶部横向排列) │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐│ │ -│ │ │ 正在直播 │ │ 总观看人数 │ │ 实时弹幕 │ │ 今日礼物 │ │ 今日收益 ││ │ -│ │ │ 128 │ │ 156,890 │ │ 2,580/分 │ │ 12,580 │ │ ¥125,680 ││ │ -│ │ │ 🔴 +5 │ │ ↑ 12.5% │ │ ↑ 8.2% │ │ ↑ 15.3% │ │ ↑ 18.6% ││ │ -│ │ │ (实时更新) │ │ (对比昨日) │ │ (对比昨日) │ │ (对比昨日) │ │ (对比昨日)││ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ └────────────┘│ │ -│ └────────────────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────┐ ┌──────────────────────────────────────────┐ │ -│ │ 热门直播间监控 (左侧, 宽度60%) │ │ 数据图表区 (右侧, 宽度40%) │ │ -│ │ │ │ │ │ -│ │ ┌──────────────────────────────────┐ │ │ ┌──────────────────────────────────────┐ │ │ -│ │ │ 直播间视频网格 (2x3) │ │ │ │ 实时观看趋势 (折线图) │ │ │ -│ │ │ ┌────────────┐ ┌────────────┐ │ │ │ │ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ 📈 │ │ │ -│ │ │ │ 直播画面1 │ │ 直播画面2 │ │ │ │ │ / \ /\ │ │ │ -│ │ │ │ 小明 │ │ 小红 │ │ │ │ │ / \ / \ │ │ │ -│ │ │ │ 👁 12,580 │ │ 👁 8,560 │ │ │ │ │ / \ / \ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ / \/ \___ │ │ │ -│ │ │ └────────────┘ └────────────┘ │ │ │ │ │ │ │ -│ │ │ ┌────────────┐ ┌────────────┐ │ │ │ │ 14:00 14:30 15:00 15:30 │ │ │ -│ │ │ │ │ │ │ │ │ │ └──────────────────────────────────────┘ │ │ -│ │ │ │ 直播画面3 │ │ 直播画面4 │ │ │ │ │ │ -│ │ │ │ 小李 │ │ 小王 │ │ │ │ ┌──────────────────────────────────────┐ │ │ -│ │ │ │ 👁 6,230 │ │ 👁 5,120 │ │ │ │ │ 分类占比 (饼图) │ │ │ -│ │ │ │ │ │ │ │ │ │ │ │ │ │ -│ │ │ └────────────┘ └────────────┘ │ │ │ │ 游戏 35% │ │ │ -│ │ │ ┌────────────┐ ┌────────────┐ │ │ │ │ ████ │ │ │ -│ │ │ │ │ │ │ │ │ │ │ 才艺 ████ 28% │ │ │ -│ │ │ │ 直播画面5 │ │ 直播画面6 │ │ │ │ │ 音乐 ███ 20% │ │ │ -│ │ │ │ 小张 │ │ 小陈 │ │ │ │ │ 其他 ██ 17% │ │ │ -│ │ │ │ 👁 4,890 │ │ 👁 4,560 │ │ │ │ │ │ │ │ -│ │ │ │ │ │ │ │ │ │ └──────────────────────────────────────┘ │ │ -│ │ │ └────────────┘ └────────────┘ │ │ │ │ │ -│ │ │ │ │ │ ┌──────────────────────────────────────┐ │ │ -│ │ │ (点击可放大查看, 双击进入详情) │ │ │ │ 礼物排行榜 │ │ │ -│ │ │ (实时显示观看人数) │ │ │ │ │ │ │ -│ │ └──────────────────────────────────┘ │ │ │ 🥇 火箭 2,580 个 ¥25,800 │ │ │ -│ │ │ │ │ 🥈 跑车 1,280 个 ¥12,800 │ │ │ -│ │ ┌──────────────────────────────────┐ │ │ │ 🥉 玫瑰 8,560 个 ¥8,560 │ │ │ -│ │ │ 实时弹幕监控 │ │ │ │ 4 爱心 12,580 个 ¥1,258 │ │ │ -│ │ │ ┌────────────────────────────┐ │ │ │ │ 5 棒棒糖 6,230 个 ¥1,246 │ │ │ -│ │ │ │ 小明: 主播打得好! │ │ │ │ │ │ │ │ -│ │ │ │ 小红: 666666 │ │ │ │ └──────────────────────────────────────┘ │ │ -│ │ │ │ 小李: 支持主播 │ │ │ │ │ │ -│ │ │ │ ⚠️ 小王: [敏感词已过滤] │ │ │ └──────────────────────────────────────────┘ │ -│ │ │ │ 小张: 新人求关注 │ │ │ │ -│ │ │ │ (实时滚动, 敏感词标红) │ │ │ │ -│ │ │ └────────────────────────────┘ │ │ │ -│ │ └──────────────────────────────────┘ │ │ -│ └──────────────────────────────────────┘ │ -│ │ -│ ┌────────────────────────────────────────────────────────────────────────────────────┐ │ -│ │ 底部告警区域 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ ⚠️ 告警信息 (3) │ │ │ -│ │ │ • 15:28:30 直播间[小明]检测到敏感词,已自动过滤 [查看] [处理]│ │ │ -│ │ │ • 15:25:12 直播间[小红]观看人数异常增长,疑似刷量 [查看] [处理]│ │ │ -│ │ │ • 15:20:45 直播间[小李]收到多次举报,请及时处理 [查看] [处理]│ │ │ -│ │ └────────────────────────────────────────────────────────────────────────────────┘ │ │ -│ └────────────────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└──────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -#### 13.2.3 礼物管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 直播管理 - 礼物配置 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 🎁 礼物管理 ┌──────────┐ │ │ │ -│ │ │ 配置直播间礼物,包括价格、特效、分成比例 │ + 新增礼物│ │ │ │ -│ │ │ └──────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 礼物分类Tab │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ -│ │ │全部 (48) │ │热门 (12) │ │浪漫 (10) │ │豪华 (8) │ │特效 (18) │ │ │ -│ │ │ (选中) │ │ │ │ │ │ │ │ │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 礼物列表 (表格形式) │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ ☐ │图标│礼物名称│价格(金币)│分类 │特效类型│主播分成│状态│排序│操作│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ ❤️ │ 爱心 │ 1 │热门 │ 无 │ 70% │启用│ 1 │编辑│ │ │ -│ │ │ │ │ │ │ │ │ │(绿)│ │删除│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ 🌹 │ 玫瑰 │ 5 │浪漫 │ 飘屏 │ 70% │启用│ 2 │编辑│ │ │ -│ │ │ │ │ │ │ │ │ │(绿)│ │删除│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ 🚀 │ 火箭 │ 500 │豪华 │ 全屏 │ 60% │启用│ 3 │编辑│ │ │ -│ │ │ │ │ │ │ │ 动画 │ │(绿)│ │删除│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ 🏰 │ 城堡 │ 5000 │豪华 │ 全屏 │ 50% │启用│ 4 │编辑│ │ │ -│ │ │ │ │ │ │ │ 特效 │ │(绿)│ │删除│ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │ ☐ │ 🎆 │ 烟花 │ 9999 │特效 │ 全屏 │ 50% │禁用│ 5 │编辑│ │ │ -│ │ │ │ │ │ │ │ 烟花 │ │(灰)│ │启用│ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (表格支持拖拽排序) │ │ -│ │ (特效类型: 无/飘屏/全屏动画/全屏特效) │ │ -│ │ (主播分成: 根据礼物价格档位设置不同比例) │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 分页组件 │ │ -│ │ 共 48 条记录 < 1 2 3 > 每页 20 条 ▼ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -**新增/编辑礼物弹窗:** - -``` -┌────────────────────────────────────────────────────────────────┐ -│ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 新增礼物 (Dialog, 宽度600px) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 基本信息 │ │ │ -│ │ │ │ │ │ -│ │ │ 礼物名称 * │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 请输入礼物名称 │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 礼物图标 * │ │ │ -│ │ │ ┌──────────┐ │ │ │ -│ │ │ │ │ 点击上传礼物图标 │ │ │ -│ │ │ │ 📷 + │ 建议尺寸: 200x200 │ │ │ -│ │ │ │ │ 支持PNG格式(透明背景) │ │ │ -│ │ │ └──────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 礼物价格 * 礼物分类 * │ │ │ -│ │ │ ┌────────────────────┐ ┌────────────┐ │ │ │ -│ │ │ │ 100 金币│ │ 热门 ▼ │ │ │ │ -│ │ │ └────────────────────┘ └────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 特效配置 │ │ │ -│ │ │ │ │ │ -│ │ │ 特效类型 * │ │ │ -│ │ │ ○ 无特效 ○ 飘屏 ● 全屏动画 ○ 全屏特效 │ │ │ -│ │ │ │ │ │ -│ │ │ 特效文件 │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 点击上传特效文件 (支持SVGA/Lottie) │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 特效时长 │ │ │ -│ │ │ ┌────────────────────────────────────────────┐ │ │ │ -│ │ │ │ 3 秒 │ │ │ │ -│ │ │ └────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 分成配置 │ │ │ -│ │ │ │ │ │ -│ │ │ 主播分成比例 │ │ │ -│ │ │ ○────────────────────●──────────────────○ │ │ │ -│ │ │ 0% 70% 100% │ │ │ -│ │ │ │ │ │ -│ │ │ 平台收益: 30% │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ 其他设置 │ │ │ -│ │ │ │ │ │ -│ │ │ 排序 状态 │ │ │ -│ │ │ ┌────────────────┐ ○ 启用 ● 禁用 │ │ │ -│ │ │ │ 0 ▲ ▼│ │ │ │ -│ │ │ └────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────┐ │ │ -│ │ │ ┌────────┐ ┌────────┐ │ │ │ -│ │ │ │ 取消 │ │ 确定 │ │ │ │ -│ │ │ └────────┘ └────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────┘ -``` - - -#### 13.2.4 主播管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 直播管理 - 主播管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 页面标题栏 │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 👤 主播管理 │ │ │ -│ │ │ 管理平台主播,包括认证审核、等级管理、收益查看 │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 数据统计卡片 │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ 总主播数 │ │ 认证主播 │ │ 待审核 │ │ 今日新增 │ │ │ -│ │ │ 5,680 │ │ 3,280 │ │ 56 │ │ 28 │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 搜索筛选栏 │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐ │ │ -│ │ │ 认证状态 │ │ 主播等级 │ │ 直播分类 │ │ 注册时间 │ │ 搜索主播 │ │ │ -│ │ │ 全部 ▼ │ │ 全部 ▼ │ │ 全部 ▼ │ │ 选择日期 │ │ 🔍 │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 主播列表 (表格形式) │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │☐│头像│主播昵称│ID │等级│分类│粉丝数 │总收益 │认证状态│操作 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│┌──┐│小明 │100001│Lv.5│游戏│125,680│¥58,900│✅ 已认证│查看 │ │ │ -│ │ │ ││头││ │ │ │ │ │ │ │编辑 │ │ │ -│ │ │ │└──┘│ │ │ │ │ │ │ │封禁 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│┌──┐│小红 │100002│Lv.4│才艺│89,560 │¥32,500│✅ 已认证│查看 │ │ │ -│ │ │ ││头││ │ │ │ │ │ │ │编辑 │ │ │ -│ │ │ │└──┘│ │ │ │ │ │ │ │封禁 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│┌──┐│小李 │100003│Lv.2│音乐│12,580 │¥5,680 │⏳ 待审核│查看 │ │ │ -│ │ │ ││头││ │ │ │ │ │ │ │审核 │ │ │ -│ │ │ │└──┘│ │ │ │ │ │ │ │ │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│┌──┐│小王 │100004│Lv.1│聊天│5,680 │¥1,280 │❌ 未认证│查看 │ │ │ -│ │ │ ││头││ │ │ │ │ │ │ │编辑 │ │ │ -│ │ │ │└──┘│ │ │ │ │ │ │ │ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ │ (认证状态: 已认证-绿色, 待审核-橙色, 未认证-灰色, 已封禁-红色) │ │ -│ │ (等级: Lv.1-Lv.10, 根据直播时长和收益计算) │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -#### 13.2.5 弹幕管理界面 - -``` -┌────────────────────────────────────────────────────────────────────────────────┐ -│ 管理端 - 直播管理 - 弹幕管理 │ -├────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ Tab切换 │ │ -│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ -│ │ │ 💬 弹幕记录 │ │ 🚫 敏感词管理 │ │ ⚙️ 弹幕设置 │ │ │ -│ │ │ (选中) │ │ │ │ │ │ │ -│ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 弹幕记录列表 │ │ -│ │ │ │ -│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │ │ -│ │ │ 直播间 │ │ 时间范围 │ │ 状态 │ │ 搜索弹幕内容 │ │ │ -│ │ │ 全部 ▼ │ │ 选择日期 │ │ 全部 ▼ │ │ 🔍 │ │ │ -│ │ └──────────┘ └──────────┘ └──────────┘ └────────────────────┘ │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │☐│时间 │直播间 │用户 │弹幕内容 │状态 │操作 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│15:30:25 │小明直播间│小红 │主播打得真好! │正常 │删除 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│15:30:18 │小明直播间│小李 │666666 │正常 │删除 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│15:29:55 │小红直播间│小王 │[已过滤]*** │已过滤│恢复 │ │ │ -│ │ │ │ │ │ │(原文: xxx) │(红色)│删除 │ │ │ -│ │ ├────────────────────────────────────────────────────────────────────┤ │ │ -│ │ │☐│15:29:30 │小红直播间│小张 │支持主播! │正常 │删除 │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────────────────────────────┐ │ -│ │ 敏感词管理 (切换Tab后显示) │ │ -│ │ │ │ -│ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ -│ │ │ 敏感词列表 ┌──────────┐ │ │ │ -│ │ │ │ + 添加 │ │ │ │ -│ │ │ ┌────────────────────────────────────────────────┐ └──────────┘ │ │ │ -│ │ │ │ 敏感词 │ 替换为 │ 类型 │ 操作 │ │ │ │ -│ │ │ ├────────────────────────────────────────────────┤ │ │ │ -│ │ │ │ xxx │ *** │ 违规词 │ 编辑 | 删除 │ │ │ │ -│ │ │ │ yyy │ *** │ 广告词 │ 编辑 | 删除 │ │ │ │ -│ │ │ │ zzz │ [已屏蔽] │ 政治敏感 │ 编辑 | 删除 │ │ │ │ -│ │ │ └────────────────────────────────────────────────┘ │ │ │ -│ │ │ │ │ │ -│ │ │ 批量导入: ┌────────────────────────────────────────┐ │ │ │ -│ │ │ │ 点击上传敏感词文件 (支持txt, 每行一个) │ │ │ │ -│ │ │ └────────────────────────────────────────┘ │ │ │ -│ │ └────────────────────────────────────────────────────────────────────┘ │ │ -│ │ │ │ -│ └──────────────────────────────────────────────────────────────────────────┘ │ -│ │ -└────────────────────────────────────────────────────────────────────────────────┘ -``` - -### 13.3 直播模块交互流程 - -#### 13.3.1 观众观看直播流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 观众观看直播交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 点击直播间卡片 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 2. 获取房间详情 │ │ -│ │ │ 获取播放地址 │ │ -│ │ │ 检查用户权限 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 3. 返回房间信息+播放地址 │ │ │ -│ │ │ │ │ -│ │ 4. 初始化播放器 │ │ │ -│ │ 连接视频流 │ │ │ -│ │ 显示直播画面 │ │ │ -│ │ │ │ │ -│ │ 5. 建立WebSocket连接 │ │ │ -│ │ ═══════════════════════════│ │ │ -│ │ │ 6. 加入房间 │ │ -│ │ │ 更新在线人数 │ │ -│ │ │ 推送进入消息 │ │ -│ │ ◀═══════════════════════════│ │ │ -│ │ 7. 收到欢迎消息 │ │ │ -│ │ 显示在弹幕区 │ │ │ -│ │ │ │ │ -│ │ 8. 发送弹幕 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 9. 敏感词过滤 │ │ -│ │ │ 广播给房间用户 │ │ -│ │ ◀═══════════════════════════│ │ │ -│ │ 10. 收到弹幕推送 │ │ │ -│ │ 显示弹幕动画 │ │ │ -│ │ │ │ │ -│ │ 11. 发送礼物 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 12. 校验余额 │ │ -│ │ │ 扣除金币 │ │ -│ │ │ 增加主播收益 │ │ -│ │ │ 记录流水 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 13. 返回发送成功 │ │ │ -│ │ │ │ │ -│ │ │ 14. 广播礼物特效 │ │ -│ │ ◀═══════════════════════════│ (WebSocket) │ │ -│ │ 15. 播放礼物动画 │ │ │ -│ │ │ │ │ -│ │ 16. 退出直播间 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 17. 离开房间 │ │ -│ │ │ 更新在线人数 │ │ -│ │ │ 断开WebSocket │ │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - -#### 13.3.2 主播开播流程 - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ 主播开播交互流程 │ -├─────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 移动端 后端 管理端 │ -│ │ │ │ │ -│ │ 1. 点击开播按钮 │ │ │ -│ │ 进入开播准备页 │ │ │ -│ │ │ │ │ -│ │ 2. 请求摄像头权限 │ │ │ -│ │ 开启摄像头预览 │ │ │ -│ │ │ │ │ -│ │ 3. 上传直播封面 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 4. 保存封面到OSS │ │ -│ │ ◀───────────────────────── │ 返回封面URL │ │ -│ │ 5. 显示封面预览 │ │ │ -│ │ │ │ │ -│ │ 6. 填写直播信息 │ │ │ -│ │ 标题/分类/标签 │ │ │ -│ │ │ │ │ -│ │ 7. 点击开始直播 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 8. 创建直播间 │ │ -│ │ │ 生成推流地址 │ │ -│ │ │ 初始化房间状态 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 9. 返回推流地址 │ │ │ -│ │ │ │ │ -│ │ 10. 初始化推流SDK │ │ │ -│ │ 开始推流 │ │ │ -│ │ 进入直播中状态 │ │ │ -│ │ │ │ │ -│ │ 11. 建立WebSocket连接 │ │ │ -│ │ ═══════════════════════════│ │ │ -│ │ │ 12. 主播上线 │ │ -│ │ │ 更新房间状态 │ │ -│ │ │ │ │ -│ │ │ 13. 推送开播通知 ─────────▶ │ │ -│ │ │ 给关注的粉丝 │ 14.可查│ -│ │ │ │ 看 │ -│ │ │ │ 直播 │ -│ │ 15. 收到弹幕/礼物 │ │ │ -│ │ ◀═══════════════════════════│ │ │ -│ │ 16. 显示弹幕/礼物动画 │ │ │ -│ │ │ │ │ -│ │ 17. 点击结束直播 │ │ │ -│ │ ─────────────────────────▶ │ │ │ -│ │ │ 18. 停止推流 │ │ -│ │ │ 关闭房间 │ │ -│ │ │ 统计直播数据 │ │ -│ │ ◀───────────────────────── │ │ │ -│ │ 19. 显示直播统计页面 │ │ │ -│ │ │ │ │ -│ │ │ 20. 记录直播日志 ─────────▶ │ │ -│ │ │ │ 21.可查│ -│ │ │ │ 看 │ -│ │ │ │ 记录 │ -│ │ -└─────────────────────────────────────────────────────────────────────────┘ -``` - - -### 12.3 界面设计规范汇总 diff --git a/后台主播统计数据修复指南.md b/后台主播统计数据修复指南.md deleted file mode 100644 index 7e05b79e..00000000 --- a/后台主播统计数据修复指南.md +++ /dev/null @@ -1,172 +0,0 @@ -# 后台主播统计数据修复指南 - -## 问题描述 -后台管理页面的主播列表中,粉丝数、直播间数、被点赞数等统计数据显示为0,但APP端能正确显示这些数据。 - -## 问题原因 -1. 后端代码已经修改,添加了获取统计数据的SQL查询 -2. 前端页面也已经修改,将"被关注数"改为"被点赞数" -3. 但是后端服务可能没有重新编译部署,导致修改没有生效 - -## 修复步骤 - -### 步骤1:验证数据库中的数据 -运行诊断SQL脚本,确认数据库中确实有数据: - -```bash -mysql -h 1.15.149.240 -u root -p zhibo < diagnose_streamer_stats_detail.sql -``` - -这个脚本会显示: -- 所有主播的基本信息 -- 每个主播的粉丝数详情 -- 每个主播的直播间数量 -- 每个主播的总点赞数 -- 完整的统计汇总 - -### 步骤2:重新编译和部署后端服务 - -#### 方法1:使用自动部署脚本(推荐) -```bash -deploy-backend-streamer-fix.bat -``` - -这个脚本会自动: -1. 编译后端项目 -2. 停止后端服务 -3. 上传新的jar包 -4. 启动后端服务 - -#### 方法2:手动部署 -```bash -# 1. 编译后端 -cd Zhibo/zhibo-h -mvn clean package -DskipTests - -# 2. 停止服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose stop crmeb-admin" - -# 3. 上传jar包 -scp crmeb-admin/target/crmeb-admin.jar root@1.15.149.240:/root/zhibo/ - -# 4. 启动服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose up -d crmeb-admin" -``` - -### 步骤3:验证修复结果 -1. 等待30秒让服务完全启动 -2. 刷新后台管理页面(Ctrl+F5 强制刷新) -3. 查看主播列表,确认统计数据正确显示 - -## 代码修改说明 - -### 后端修改(StreamerAdminController.java) -在主播列表查询的SQL中添加了总点赞数的统计: - -```java -sql.append("(SELECT COALESCE(SUM(r.like_count), 0) FROM eb_live_room r WHERE r.uid = u.uid) as totalLikeCount, "); -``` - -这个查询会: -1. 查找主播的所有直播间 -2. 对所有直播间的like_count字段求和 -3. 如果没有直播间或like_count为NULL,返回0 - -### 前端修改(streamer/list/index.vue) -将"被关注数"列改为"被点赞数"列: - -```vue - - - -``` - -## 数据对齐说明 - -### APP端数据来源 -APP端调用的是 `/api/front/streamer/stats` 接口,使用以下SQL: - -```sql --- 粉丝数 -SELECT COUNT(*) FROM eb_follow_record -WHERE followed_id = ? -AND follow_status IN ('1', '关注') -AND is_deleted = 0 - --- 点赞数 -SELECT COALESCE(SUM(like_count), 0) FROM eb_live_room -WHERE uid = ? -``` - -### 后台管理端数据来源 -后台管理端调用的是 `/api/admin/streamer/list` 接口,使用相同的SQL逻辑: - -```sql --- 粉丝数 -(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 COALESCE(SUM(r.like_count), 0) FROM eb_live_room r - WHERE r.uid = u.uid) as totalLikeCount -``` - -两端使用完全相同的SQL逻辑,确保数据一致性。 - -## 显示字段说明 - -后台管理页面显示的字段: - -| 字段名 | 说明 | 数据来源 | -|--------|------|----------| -| 主播信息 | 头像、昵称、ID | eb_user表 | -| 主播等级 | 1-初级, 2-中级, 3-高级, 4-金牌 | eb_user.streamer_level | -| 粉丝数 | 有多少人关注了这个主播 | eb_follow_record表统计 | -| 直播间数 | 主播创建的直播间总数 | eb_live_room表统计 | -| 被点赞数 | 主播所有直播间的点赞数总和 | eb_live_room.like_count求和 | -| 本月直播 | 本月创建的直播间数量 | eb_live_room表按月统计 | -| 认证时间 | 成为主播的时间 | eb_user.streamer_certified_time | -| 状态 | 正常/封禁 | eb_streamer_ban表判断 | - -## 常见问题 - -### Q1: 部署后数据还是显示0 -**A:** 检查以下几点: -1. 确认后端服务已经重启:`ssh root@1.15.149.240 "docker ps | grep crmeb-admin"` -2. 查看后端日志:`ssh root@1.15.149.240 "docker logs crmeb-admin"` -3. 清除浏览器缓存,强制刷新页面(Ctrl+Shift+Delete) -4. 运行诊断SQL确认数据库中有数据 - -### Q2: 编译失败 -**A:** 检查以下几点: -1. 确认Maven已安装:`mvn -version` -2. 确认Java版本正确:`java -version`(需要Java 8或以上) -3. 清理Maven缓存:`mvn clean` - -### Q3: 上传jar包失败 -**A:** 检查以下几点: -1. 确认SSH连接正常:`ssh root@1.15.149.240` -2. 确认jar包已生成:检查 `Zhibo/zhibo-h/crmeb-admin/target/crmeb-admin.jar` 是否存在 -3. 手动上传:使用FTP工具上传jar包到服务器 - -## 验证清单 - -部署完成后,请验证以下内容: - -- [ ] 后台管理页面能正常访问 -- [ ] 主播列表能正常加载 -- [ ] 粉丝数显示正确(与APP端一致) -- [ ] 直播间数显示正确 -- [ ] 被点赞数显示正确(与APP端一致) -- [ ] 本月直播次数显示正确 -- [ ] 其他功能正常(搜索、分页、封禁等) - -## 相关文件 - -- 后端控制器:`Zhibo/zhibo-h/crmeb-admin/src/main/java/com/zbkj/admin/controller/StreamerAdminController.java` -- 前端页面:`Zhibo/admin/src/views/streamer/list/index.vue` -- 前端API:`Zhibo/admin/src/api/streamer.js` -- 诊断SQL:`diagnose_streamer_stats_detail.sql` -- 部署脚本:`deploy-backend-streamer-fix.bat` diff --git a/在线状态和离线消息模块对接总结.md b/在线状态和离线消息模块对接总结.md deleted file mode 100644 index 9a694618..00000000 --- a/在线状态和离线消息模块对接总结.md +++ /dev/null @@ -1,202 +0,0 @@ -# 在线状态和离线消息模块对接总结 - -## 📋 任务完成情况 - -✅ **任务状态**: 已完成 - -根据模块文档(14-在线状态模块.md 和 15-离线消息模块.md)的要求,已完成所有接口的对接工作,确保后端接口的参数和返回格式完全符合前端需求。 - ---- - -## 🎯 主要工作内容 - -### 1. 接口返回格式调整 - -#### 在线状态模块(5个接口) -- ✅ 查询用户在线状态:修改字段名 `online` → `isOnline`,`lastActiveTime` → `lastOnlineTime`,添加 `status` 字段 -- ✅ 批量查询用户在线状态:重构返回格式为Map结构,Key为用户ID字符串 -- ✅ 获取房间在线人数:修改字段名 `count` → `onlineCount` -- ✅ 获取房间在线用户列表:添加用户详细信息(昵称、头像、加入时间) -- ✅ 获取连接统计信息:添加 `totalOnlineUsers`、`totalConnections`、`totalRooms`、`activeRooms` 字段 - -#### 离线消息模块(3个接口) -- ✅ 获取离线消息数量:添加 `privateCount`、`systemCount`、`lastOfflineTime` 字段 -- ✅ 获取离线消息列表:修改默认limit为100,添加 `hasMore` 字段 -- ✅ 清除离线消息:修改返回消息文本 - -### 2. 代码优化 - -- ✅ 添加 `UserService` 依赖注入,用于查询用户详细信息 -- ✅ 优化空值处理,所有可能为null的字段都提供默认值 -- ✅ 添加异常捕获,避免无效数据导致系统异常 -- ✅ 保持代码层次分明:Controller → Service → Redis - -### 3. 文档完善 - -- ✅ 创建数据库更新SQL文件(包含可选的历史记录表) -- ✅ 创建对接完成报告 -- ✅ 创建验证清单(79项验证点) -- ✅ 创建快速参考文档 - ---- - -## 📊 接口对比 - -| 模块 | 接口数量 | 修改项 | 状态 | -|------|---------|--------|------| -| 在线状态 | 5 | 15处字段调整 | ✅ 完成 | -| 离线消息 | 3 | 8处字段调整 | ✅ 完成 | -| **总计** | **8** | **23处** | **✅ 完成** | - ---- - -## 🔧 技术实现 - -### 存储方案 -- **在线状态**: Redis String,TTL 5分钟 -- **最后活跃时间**: Redis String,TTL 5分钟 -- **房间在线用户**: Redis Set,TTL 1小时 -- **离线消息**: Redis List,TTL 7天,最大100条 - -### 代码质量 -- ✅ 无编译错误 -- ✅ 无语法错误 -- ✅ 符合代码规范 -- ✅ 层次分明 -- ✅ 注释完整 - ---- - -## 📁 修改的文件 - -### 后端代码 -1. `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/OnlineStatusController.java` - - 修改了所有接口的返回格式 - - 添加了UserService依赖 - -### 文档文件 -1. `Zhibo/zhibo-h/数据库更新-在线状态和离线消息模块.sql` - 数据库更新说明 -2. `在线状态和离线消息模块对接完成报告.md` - 详细的对接报告 -3. `在线状态和离线消息模块验证清单.md` - 79项验证清单 -4. `在线状态和离线消息模块-快速参考.md` - 快速参考手册 -5. `在线状态和离线消息模块对接总结.md` - 本文档 - ---- - -## ✅ 验证结果 - -### 代码验证 -- ✅ 编译通过,无错误 -- ✅ 所有接口返回格式符合文档要求 -- ✅ 字段名称与文档一致 -- ✅ 数据类型正确 - -### 功能验证 -- ✅ 在线状态查询功能正常 -- ✅ 批量查询功能正常 -- ✅ 房间在线统计功能正常 -- ✅ 离线消息管理功能正常 - ---- - -## 🎯 符合要求检查 - -### ✅ 接口对接要求 -- [x] 后端接口参数正确接收前端传入的参数 -- [x] 后端接口返回格式符合前端需求 -- [x] 所有字段名称与文档一致 -- [x] 所有数据类型正确 - -### ✅ 实体类要求 -- [x] 本模块主要使用Redis,不涉及JPA实体类 -- [x] 提供了可选的数据库表结构(用于历史记录) -- [x] 可选表使用 `is_deleted` 字段实现逻辑删除 -- [x] 可选表不使用外键约束 - -### ✅ 代码规范要求 -- [x] SQL语句不写在代码中(使用Redis操作) -- [x] 代码层次分明(Controller → Service → Redis) -- [x] 使用逻辑删除(可选表) -- [x] 不添加外键(可选表) - ---- - -## 📈 性能特点 - -1. **高性能**: 使用Redis存储,响应速度快 -2. **自动清理**: 通过TTL自动清理过期数据 -3. **内存优化**: 离线消息限制最大100条 -4. **并发友好**: Redis支持高并发访问 - ---- - -## 🔍 注意事项 - -### 需要后续完善的功能 -1. **房间用户加入时间**: 当前返回当前时间戳,建议在Redis中存储实际加入时间 -2. **消息分类统计**: 离线消息数量接口中的 `privateCount` 和 `systemCount` 当前简化处理 -3. **房间统计**: `totalRooms` 和 `activeRooms` 字段当前返回0,需要实现统计功能 - -### 性能优化建议 -1. 批量查询用户在线状态时,如果用户数量很大,建议优化为批量Redis查询 -2. 房间在线用户列表查询时,建议添加缓存 -3. 定期清理Redis中的过期Key - ---- - -## 🧪 测试建议 - -### 单元测试 -- 测试所有接口的返回格式 -- 测试空值处理 -- 测试异常情况 - -### 集成测试 -- 测试在线状态流程 -- 测试离线消息流程 -- 测试WebSocket集成 - -### 性能测试 -- 并发查询测试 -- 压力测试 -- 内存使用测试 - ---- - -## 📚 相关文档 - -1. **模块文档** - - [14-在线状态模块.md](模块文档/14-在线状态模块.md) - - [15-离线消息模块.md](模块文档/15-离线消息模块.md) - -2. **对接文档** - - [对接完成报告](在线状态和离线消息模块对接完成报告.md) - - [验证清单](在线状态和离线消息模块验证清单.md) - - [快速参考](在线状态和离线消息模块-快速参考.md) - -3. **数据库文档** - - [数据库更新SQL](Zhibo/zhibo-h/数据库更新-在线状态和离线消息模块.sql) - ---- - -## 🎉 总结 - -在线状态和离线消息模块的接口对接工作已全部完成,所有接口的参数和返回格式都已调整为符合前端文档要求。代码质量良好,层次分明,使用Redis作为主要存储方案,性能优异。 - -**主要成果**: -- ✅ 8个接口全部对接完成 -- ✅ 23处字段调整全部完成 -- ✅ 代码编译通过,无错误 -- ✅ 文档完善,便于维护 - -**下一步建议**: -1. 进行完整的接口测试 -2. 进行性能测试和优化 -3. 完善房间统计功能 -4. 优化消息分类统计 - ---- - -**对接完成时间**: 2024-12-30 -**对接人员**: AI开发助手 -**审核状态**: 待审核 diff --git a/如何获取RTMP地址.md b/如何获取RTMP地址.md deleted file mode 100644 index 5181f752..00000000 --- a/如何获取RTMP地址.md +++ /dev/null @@ -1,336 +0,0 @@ -# 如何获取 RTMP 推流地址 - -## 方法 1:通过 Android 应用获取(最简单)✅ - -### 步骤 1:启动后端服务器 -```bash -cd live-streaming -node server/index.js -``` -**重要**:保持这个窗口打开! - -### 步骤 2:在 Android 应用中创建直播间 - -1. 打开 Android 应用(在模拟器中) -2. 点击右上角的 **"开始直播"** 按钮 - - ![开始直播按钮位置](位置:屏幕右上角) - -3. 填写直播间信息: - ``` - 直播间标题:我的直播间 - 主播名称:小明 - ``` - -4. 点击 **"创建"** 按钮 - -### 步骤 3:获取 RTMP 地址 - -创建成功后会弹出对话框,显示: - -``` -推流地址: -rtmp://10.0.2.2:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - -电脑本机 OBS 可用: -rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 -``` - -### 步骤 4:复制地址 - -- 点击 **"复制地址"** 按钮 -- 地址已复制到剪贴板 -- 可以直接粘贴到 OBS 中使用 - -### ⚠️ 重要提示 - -**在 OBS 中使用时**: -- ✅ 使用:`rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2` -- ❌ 不要用:`rtmp://10.0.2.2:1935/live/...`(这是给 Android 模拟器用的) - -**地址说明**: -- `rtmp://` - 协议 -- `localhost` - 本机地址 -- `1935` - RTMP 端口 -- `/live/` - 应用名称 -- `868c49cc-1021-4664-95a3-ed71e789adb2` - 你的 streamKey(每个直播间不同) - ---- - -## 方法 2:查看已创建的直播间 - -如果你已经创建过直播间,想再次查看 RTMP 地址: - -### 在 Android 应用中查看 - -1. 打开应用,在首页看到直播间列表 -2. 点击任意直播间进入详情页 -3. 向下滚动,找到 **"推流信息"** 区域 -4. 可以看到: - ``` - 推流地址 - rtmp://10.0.2.2:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - - 电脑本机 OBS 可用(等价地址) - rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - - 推流密钥 - 868c49cc-1021-4664-95a3-ed71e789adb2 - ``` -5. 点击 **"复制地址"** 按钮 - ---- - -## 方法 3:通过 API 获取(技术方式) - -如果你想通过代码或命令行获取: - -### 查看所有直播间 -```bash -curl http://localhost:3001/api/rooms -``` - -返回示例: -```json -{ - "success": true, - "data": [ - { - "id": "868c49cc-1021-4664-95a3-ed71e789adb2", - "title": "我的直播间", - "streamerName": "小明", - "streamKey": "868c49cc-1021-4664-95a3-ed71e789adb2", - "isLive": false, - "streamUrls": { - "rtmp": "rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2", - "flv": "http://localhost:8080/live/868c49cc-1021-4664-95a3-ed71e789adb2.flv", - "hls": "http://localhost:8080/live/868c49cc-1021-4664-95a3-ed71e789adb2.m3u8" - } - } - ] -} -``` - -### 查看特定直播间 -```bash -curl http://localhost:3001/api/rooms/868c49cc-1021-4664-95a3-ed71e789adb2 -``` - ---- - -## 方法 4:查看持久化文件 - -直播间数据保存在文件中,可以直接查看: - -### 文件位置 -``` -live-streaming/data/rooms.json -``` - -### 打开文件 -用记事本或 VS Code 打开,内容示例: -```json -[ - { - "id": "868c49cc-1021-4664-95a3-ed71e789adb2", - "title": "我的直播间", - "streamerName": "小明", - "streamKey": "868c49cc-1021-4664-95a3-ed71e789adb2", - "isLive": false, - "viewerCount": 0, - "createdAt": "2025-12-16T09:20:00.000Z", - "startedAt": null - } -] -``` - -### 构建 RTMP 地址 -根据 `streamKey` 构建: -``` -rtmp://localhost:1935/live/{streamKey} -``` - -例如: -``` -rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 -``` - ---- - -## 在 OBS 中使用 RTMP 地址 - -### 方式 A:完整地址(推荐) - -1. 打开 OBS Studio -2. 点击 **"设置"** → **"推流"** -3. **服务**:选择 "自定义..." -4. **服务器**:粘贴完整地址 - ``` - rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 - ``` -5. **串流密钥**:留空 -6. 点击 **"确定"** - -### 方式 B:分开填写 - -1. 打开 OBS Studio -2. 点击 **"设置"** → **"推流"** -3. **服务**:选择 "自定义..." -4. **服务器**: - ``` - rtmp://localhost:1935/live - ``` -5. **串流密钥**: - ``` - 868c49cc-1021-4664-95a3-ed71e789adb2 - ``` -6. 点击 **"确定"** - -**两种方式效果相同**,选择你喜欢的即可。 - ---- - -## 快速参考 - -### RTMP 地址格式 -``` -rtmp://[主机]:[端口]/[应用]/[streamKey] -``` - -### 示例 -``` -rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2 -│ │ │ │ │ -│ │ │ │ └─ streamKey(每个直播间唯一) -│ │ │ └────── 应用名称(固定为 live) -│ │ └──────────── RTMP 端口(固定为 1935) -│ └────────────────────── 主机地址(OBS 用 localhost) -└───────────────────────────── 协议(固定为 rtmp) -``` - -### 地址对照表 - -| 使用场景 | 地址 | -|---------|------| -| OBS 推流 | `rtmp://localhost:1935/live/{streamKey}` | -| Android 模拟器 | `rtmp://10.0.2.2:1935/live/{streamKey}` | -| 局域网其他设备 | `rtmp://192.168.x.x:1935/live/{streamKey}` | - ---- - -## 常见问题 - -### ❓ 为什么有两个不同的地址? - -**答**: -- `rtmp://localhost:1935/...` - 给电脑上的 OBS 用 -- `rtmp://10.0.2.2:1935/...` - 给 Android 模拟器用 - -在 Android 模拟器中,`10.0.2.2` 代表宿主机(你的电脑)的 `localhost`。 - -### ❓ streamKey 是什么? - -**答**:streamKey 是每个直播间的唯一标识符,就像房间号。每创建一个直播间,系统会自动生成一个新的 streamKey。 - -### ❓ 可以自定义 streamKey 吗? - -**答**:当前版本不支持自定义,系统会自动生成 UUID 作为 streamKey。如果需要自定义,需要修改后端代码。 - -### ❓ 忘记了 RTMP 地址怎么办? - -**答**: -1. 在 Android 应用中点击直播间查看 -2. 或者查看 `live-streaming/data/rooms.json` 文件 -3. 或者通过 API 查询:`curl http://localhost:3001/api/rooms` - -### ❓ 可以同时创建多个直播间吗? - -**答**:可以!每个直播间有独立的 streamKey,可以同时推流到不同的直播间。 - -### ❓ RTMP 地址会变吗? - -**答**:不会!只要不删除直播间,RTMP 地址(streamKey)就不会改变。即使重启服务器,地址也会保持不变(因为已经持久化保存)。 - ---- - -## 图文演示 - -### 📱 Android 应用界面 - -``` -┌─────────────────────────────┐ -│ 直播系统 [开始直播] │ ← 点击这里 -├─────────────────────────────┤ -│ │ -│ ┌─────────────────────┐ │ -│ │ 我的直播间 │ │ -│ │ 主播: 小明 │ │ -│ │ [直播中] │ │ ← 点击进入查看地址 -│ └─────────────────────┘ │ -│ │ -└─────────────────────────────┘ -``` - -### 📋 创建直播间对话框 - -``` -┌─────────────────────────────┐ -│ 创建直播间 │ -├─────────────────────────────┤ -│ │ -│ 直播间标题 │ -│ ┌─────────────────────┐ │ -│ │ 我的直播间 │ │ -│ └─────────────────────┘ │ -│ │ -│ 主播名称 │ -│ ┌─────────────────────┐ │ -│ │ 小明 │ │ -│ └─────────────────────┘ │ -│ │ -│ [取消] [创建] │ ← 点击创建 -└─────────────────────────────┘ -``` - -### 📺 推流信息对话框 - -``` -┌─────────────────────────────┐ -│ 已创建直播间 │ -├─────────────────────────────┤ -│ │ -│ 推流地址: │ -│ rtmp://10.0.2.2:1935/... │ -│ │ -│ 电脑本机 OBS 可用: │ -│ rtmp://localhost:1935/... │ ← 这个地址用于 OBS -│ │ -│ ⚠️ 注意: │ -│ 1. Android 应用只能观看 │ -│ 2. 需要用 OBS 在电脑上推流 │ -│ 3. OBS 设置:服务器填上面 │ -│ 4. 推流后在应用中观看 │ -│ │ -│ [复制地址] [知道了] │ ← 点击复制 -└─────────────────────────────┘ -``` - ---- - -## 总结 - -### 最简单的方法 🎯 - -1. **打开 Android 应用** -2. **点击"开始直播"** -3. **填写信息并创建** -4. **点击"复制地址"** -5. **粘贴到 OBS 中**(记得把 `10.0.2.2` 改成 `localhost`) - -就这么简单!🎉 - ---- - -**需要帮助?** -- 查看 `使用教程.md` 获取完整教程 -- 查看 `android-app/问题修复总结.md` 解决常见问题 diff --git a/字段补齐完成总结.md b/字段补齐完成总结.md deleted file mode 100644 index 2e0a5d77..00000000 --- a/字段补齐完成总结.md +++ /dev/null @@ -1,457 +0,0 @@ -# 直播间管理模块字段补齐完成总结 - -## 📋 概述 - -已成功为前端和后端补齐了直播间管理模块的所有缺失字段,并使用JPA注解添加了数据库字段定义。 - ---- - -## ✅ 已完成的修改 - -### 1. 后端实体类 (LiveRoom.java) - -**文件路径**: `Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/live/LiveRoom.java` - -**新增字段**: -```java -@ApiModelProperty(value = "直播间描述") -@TableField("description") -@Column(name = "description", columnDefinition = "TEXT COMMENT '直播间描述'") -private String description; - -@ApiModelProperty(value = "封面图URL") -@TableField("cover_image") -@Column(name = "cover_image", columnDefinition = "VARCHAR(500) COMMENT '封面图URL'") -private String coverImage; - -@ApiModelProperty(value = "分享数") -@TableField("share_count") -@Column(name = "share_count", columnDefinition = "INT DEFAULT 0 COMMENT '分享数'") -private Integer shareCount; - -@ApiModelProperty(value = "直播间公告") -@TableField("notice") -@Column(name = "notice", columnDefinition = "VARCHAR(500) COMMENT '直播间公告'") -private String notice; - -@ApiModelProperty(value = "标签,逗号分隔") -@TableField("tags") -@Column(name = "tags", columnDefinition = "VARCHAR(500) COMMENT '标签,逗号分隔'") -private String tags; - -@ApiModelProperty(value = "直播类型") -@TableField("type") -@Column(name = "type", columnDefinition = "VARCHAR(50) DEFAULT 'live' COMMENT '直播类型'") -private String type; -``` - ---- - -### 2. 后端响应类 (LiveRoomResponse.java) - -**文件路径**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/response/live/LiveRoomResponse.java` - -**新增字段**: -```java -@ApiModelProperty(value = "主播ID") -private Integer streamerId; - -@ApiModelProperty(value = "主播头像") -private String streamerAvatar; - -@ApiModelProperty(value = "主播等级") -private Integer streamerLevel; - -@ApiModelProperty(value = "封面图URL") -private String coverImage; - -@ApiModelProperty(value = "直播间描述") -private String description; - -@ApiModelProperty(value = "点赞数") -private Integer likeCount; - -@ApiModelProperty(value = "分享数") -private Integer shareCount; - -@ApiModelProperty(value = "分类ID") -private Integer categoryId; - -@ApiModelProperty(value = "分类名称") -private String categoryName; - -@ApiModelProperty(value = "标签列表") -private java.util.List tags; - -@ApiModelProperty(value = "是否已关注") -private Boolean isFollowing; - -@ApiModelProperty(value = "创建时间") -private String createTime; - -@ApiModelProperty(value = "开始时间") -private String startTime; - -@ApiModelProperty(value = "直播间公告") -private String notice; - -@ApiModelProperty(value = "直播类型") -private String type; -``` - ---- - -### 3. 后端请求类 (CreateLiveRoomRequest.java) - -**文件路径**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/request/live/CreateLiveRoomRequest.java` - -**新增字段**: -```java -@ApiModelProperty(value = "直播类型") -private String type; - -@ApiModelProperty(value = "分类ID") -private Integer categoryId; - -@ApiModelProperty(value = "直播间描述") -private String description; - -@ApiModelProperty(value = "封面图URL") -private String coverImage; - -@ApiModelProperty(value = "标签,逗号分隔") -private String tags; - -@ApiModelProperty(value = "直播间公告") -private String notice; -``` - ---- - -### 4. 后端Service接口和实现 - -**文件路径**: -- `Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/service/LiveRoomService.java` -- `Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/service/impl/LiveRoomServiceImpl.java` - -**新增方法**: -```java -/** - * 创建直播间(完整参数) - */ -LiveRoom createRoom(Integer uid, String title, String streamerName, String type, - Integer categoryId, String description, String coverImage, - String tags, String notice); -``` - -**实现逻辑**: -- 支持创建带完整参数的直播间 -- 自动初始化所有计数字段为0 -- 保持向后兼容,原有的简单createRoom方法仍然可用 - ---- - -### 5. 后端Controller更新 - -**文件路径**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java` - -#### 5.1 新增依赖注入 -```java -@Autowired -private com.zbkj.service.service.UserService userService; - -@Autowired -private com.zbkj.service.service.CategoryService categoryService; - -@Autowired -private com.zbkj.service.service.FollowRecordService followRecordService; -``` - -#### 5.2 更新toResponse方法 -- 从User表获取主播头像和等级 -- 从Category表获取分类名称 -- 检查当前用户是否已关注主播 -- 解析标签字符串为数组 -- 格式化时间字段 -- 设置所有新增字段 - -#### 5.3 新增接口 - -**开始直播**: -```java -@ApiOperation(value = "开始直播") -@PostMapping("/room/{id}/start") -public CommonResult> startLive(@PathVariable Integer id) -``` - -**结束直播**: -```java -@ApiOperation(value = "结束直播") -@PostMapping("/room/{id}/stop") -public CommonResult> stopLive(@PathVariable Integer id) -``` - ---- - -### 6. 在线人数接口返回格式修复 - -**文件路径**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomOnlineController.java` - -**修改前**: -```java -public CommonResult getRoomOnlineCount(@PathVariable String roomId) -``` - -**修改后**: -```java -public CommonResult> getRoomOnlineCount(@PathVariable String roomId) -// 返回: { "count": 1234, "roomId": "房间ID" } -``` - ---- - -### 7. 前端模型类 (Room.java) - -**文件路径**: `android-app/app/src/main/java/com/example/livestreaming/net/Room.java` - -**新增字段**: -```java -@SerializedName("streamerId") -private Integer streamerId; - -@SerializedName("streamerAvatar") -private String streamerAvatar; - -@SerializedName("streamerLevel") -private Integer streamerLevel; - -@SerializedName("coverImage") -private String coverImage; - -@SerializedName("description") -private String description; - -@SerializedName("likeCount") -private Integer likeCount; - -@SerializedName("shareCount") -private Integer shareCount; - -@SerializedName("categoryId") -private Integer categoryId; - -@SerializedName("categoryName") -private String categoryName; - -@SerializedName("tags") -private java.util.List tags; - -@SerializedName("isFollowing") -private Boolean isFollowing; - -@SerializedName("createTime") -private String createTime; - -@SerializedName("startTime") -private String startTime; - -@SerializedName("notice") -private String notice; -``` - -**新增Getter/Setter方法**: 为所有新字段添加了完整的getter和setter方法 - ---- - -## 🗄️ 数据库迁移 - -**文件路径**: `Zhibo/zhibo-h/数据库迁移-直播间新字段.sql` - -**需要执行的SQL**: -```sql --- 添加直播间描述 -ALTER TABLE `eb_live_room` ADD COLUMN `description` TEXT COMMENT '直播间描述' AFTER `streamer_name`; - --- 添加封面图URL -ALTER TABLE `eb_live_room` ADD COLUMN `cover_image` VARCHAR(500) DEFAULT NULL COMMENT '封面图URL' AFTER `description`; - --- 添加分享数 -ALTER TABLE `eb_live_room` ADD COLUMN `share_count` INT DEFAULT 0 COMMENT '分享数' AFTER `like_count`; - --- 添加直播间公告 -ALTER TABLE `eb_live_room` ADD COLUMN `notice` VARCHAR(500) DEFAULT NULL COMMENT '直播间公告' AFTER `share_count`; - --- 添加标签(逗号分隔) -ALTER TABLE `eb_live_room` ADD COLUMN `tags` VARCHAR(500) DEFAULT NULL COMMENT '标签,逗号分隔' AFTER `notice`; - --- 添加直播类型 -ALTER TABLE `eb_live_room` ADD COLUMN `type` VARCHAR(50) DEFAULT 'live' COMMENT '直播类型' AFTER `tags`; - --- 更新现有数据的默认值 -UPDATE `eb_live_room` SET `view_count` = 0 WHERE `view_count` IS NULL; -UPDATE `eb_live_room` SET `like_count` = 0 WHERE `like_count` IS NULL; -UPDATE `eb_live_room` SET `comment_count` = 0 WHERE `comment_count` IS NULL; -UPDATE `eb_live_room` SET `share_count` = 0 WHERE `share_count` IS NULL; -UPDATE `eb_live_room` SET `online_count` = 0 WHERE `online_count` IS NULL; -UPDATE `eb_live_room` SET `type` = 'live' WHERE `type` IS NULL; -``` - ---- - -## 📊 字段对照表 - -| 文档字段 | 后端实体 | 后端响应 | 前端模型 | 状态 | -|---------|---------|---------|---------|------| -| id | ✅ id | ✅ id | ✅ id | ✅ | -| title | ✅ title | ✅ title | ✅ title | ✅ | -| streamerName | ✅ streamerName | ✅ streamerName | ✅ streamerName | ✅ | -| streamerId | ✅ uid | ✅ streamerId | ✅ streamerId | ✅ 新增 | -| streamerAvatar | - | ✅ streamerAvatar | ✅ streamerAvatar | ✅ 新增 | -| streamerLevel | - | ✅ streamerLevel | ✅ streamerLevel | ✅ 新增 | -| coverImage | ✅ coverImage | ✅ coverImage | ✅ coverImage | ✅ 新增 | -| description | ✅ description | ✅ description | ✅ description | ✅ 新增 | -| isLive | ✅ isLive | ✅ isLive | ✅ isLive | ✅ | -| viewerCount | ✅ onlineCount | ✅ viewerCount | ✅ viewerCount | ✅ | -| likeCount | ✅ likeCount | ✅ likeCount | ✅ likeCount | ✅ 新增 | -| shareCount | ✅ shareCount | ✅ shareCount | ✅ shareCount | ✅ 新增 | -| categoryId | ✅ categoryId | ✅ categoryId | ✅ categoryId | ✅ | -| categoryName | - | ✅ categoryName | ✅ categoryName | ✅ 新增 | -| tags | ✅ tags | ✅ tags | ✅ tags | ✅ 新增 | -| streamUrls | - | ✅ streamUrls | ✅ streamUrls | ✅ | -| isFollowing | - | ✅ isFollowing | ✅ isFollowing | ✅ 新增 | -| createTime | ✅ createTime | ✅ createTime | ✅ createTime | ✅ | -| startTime | ✅ startedAt | ✅ startTime | ✅ startTime | ✅ | -| notice | ✅ notice | ✅ notice | ✅ notice | ✅ 新增 | -| type | ✅ type | ✅ type | ✅ type | ✅ 新增 | - ---- - -## 🔧 部署步骤 - -### 1. 数据库迁移 -```bash -# 连接到MySQL数据库 -mysql -u your_username -p your_database - -# 执行迁移SQL -source Zhibo/zhibo-h/数据库迁移-直播间新字段.sql -``` - -### 2. 后端部署 -```bash -cd Zhibo/zhibo-h -mvn clean package -# 重启后端服务 -``` - -### 3. 前端部署 -```bash -cd android-app -# 使用Android Studio重新构建项目 -./gradlew clean build -``` - ---- - -## ✅ 接口完整度对比 - -### 修改前 -- ❌ 缺少主播信息字段 -- ❌ 缺少分类信息字段 -- ❌ 缺少统计信息字段 -- ❌ 缺少关注状态字段 -- ❌ 缺少开始/结束直播接口 -- ❌ 在线人数返回格式不匹配 - -### 修改后 -- ✅ 完整的主播信息(ID、头像、等级) -- ✅ 完整的分类信息(ID、名称) -- ✅ 完整的统计信息(点赞数、分享数) -- ✅ 关注状态检查 -- ✅ 开始直播接口 `POST /api/front/live/room/{id}/start` -- ✅ 结束直播接口 `POST /api/front/live/room/{id}/stop` -- ✅ 在线人数返回格式符合文档 - ---- - -## 🎯 功能增强 - -### 1. 智能数据填充 -- 自动从User表获取主播信息 -- 自动从Category表获取分类名称 -- 自动检查当前用户的关注状态 - -### 2. 数据完整性 -- 所有计数字段自动初始化为0 -- 标签字符串自动解析为数组 -- 时间字段格式化为ISO 8601标准 - -### 3. 向后兼容 -- 保留原有的简单createRoom方法 -- 新增完整参数的createRoom重载方法 -- 未登录用户也能正常获取直播间列表 - ---- - -## 📝 注意事项 - -### 1. 数据库字段 -- 确保执行SQL迁移脚本前备份数据库 -- 如果某些字段已存在,请注释掉对应的ALTER TABLE语句 -- 建议在测试环境先验证 - -### 2. 性能考虑 -- toResponse方法会查询User和Category表,建议添加缓存 -- 关注状态检查会查询FollowRecord表,考虑批量查询优化 -- 大量直播间列表时,考虑分页和延迟加载 - -### 3. 前端适配 -- 前端需要重新编译才能识别新字段 -- 建议更新UI以显示新增的字段信息 -- 测试所有使用Room对象的页面 - ---- - -## 🚀 后续优化建议 - -### 1. 缓存优化 -```java -// 添加Redis缓存主播信息 -@Cacheable(value = "streamer", key = "#uid") -public User getStreamerInfo(Integer uid) { - return userService.getById(uid); -} -``` - -### 2. 批量查询优化 -```java -// 批量获取关注状态 -public Map batchCheckFollowing(Integer followerId, List followedIds) { - // 一次查询获取所有关注状态 -} -``` - -### 3. 字段验证 -```java -// 在CreateLiveRoomRequest中添加验证注解 -@Size(max = 500, message = "描述不能超过500字") -private String description; - -@Pattern(regexp = "^[a-zA-Z0-9,]+$", message = "标签格式不正确") -private String tags; -``` - ---- - -## ✅ 总结 - -所有缺失字段已成功补齐: -- ✅ 后端实体类添加了7个新字段(使用JPA注解) -- ✅ 后端响应类添加了14个新字段 -- ✅ 后端请求类添加了6个新字段 -- ✅ 前端模型类添加了14个新字段 -- ✅ 新增开始/结束直播接口 -- ✅ 修复在线人数返回格式 -- ✅ 提供完整的数据库迁移SQL - -现在前后端接口完全对齐,符合文档规范! diff --git a/完整修复直播间主播关联.sql b/完整修复直播间主播关联.sql deleted file mode 100644 index ec7bafea..00000000 --- a/完整修复直播间主播关联.sql +++ /dev/null @@ -1,235 +0,0 @@ -USE zhibo; - --- ========================================== --- 修复直播间主播关联 - 完整方案 --- ========================================== - --- 步骤1: 查看当前情况 -SELECT '========== 当前数据情况 ==========' as info; - --- 查看有多少主播 -SELECT - '认证主播数量' as item, - COUNT(*) as count -FROM eb_user -WHERE is_streamer = 1; - --- 查看直播间情况 -SELECT - '总直播间数' as item, - COUNT(*) as count -FROM eb_live_room -UNION ALL -SELECT - 'uid为空或0的直播间' as item, - COUNT(*) as count -FROM eb_live_room -WHERE uid IS NULL OR uid = 0 -UNION ALL -SELECT - 'uid无效的直播间(用户不存在)' as item, - COUNT(*) as count -FROM eb_live_room -WHERE uid IS NOT NULL AND uid > 0 AND uid NOT IN (SELECT uid FROM eb_user); - --- 步骤2: 选择一个默认主播 --- 优先选择有最多关注记录的主播 -SELECT '========== 选择默认主播 ==========' as info; - -SELECT - u.uid, - u.nickname, - u.phone, - u.is_streamer, - COUNT(fr.id) as follower_count -FROM eb_user u -LEFT JOIN eb_follow_record fr ON fr.followed_id = u.uid AND fr.follow_status = '关注' -WHERE u.is_streamer = 1 -GROUP BY u.uid, u.nickname, u.phone, u.is_streamer -ORDER BY follower_count DESC, u.uid ASC -LIMIT 5; - --- 使用第一个主播作为默认主播(uid=318 根据之前的数据) -SET @default_streamer_id = ( - SELECT u.uid - FROM eb_user u - WHERE u.is_streamer = 1 - ORDER BY u.uid ASC - LIMIT 1 -); - -SELECT CONCAT('默认主播ID: ', @default_streamer_id) as info; - --- 获取默认主播的昵称 -SET @default_streamer_name = ( - SELECT nickname - FROM eb_user - WHERE uid = @default_streamer_id -); - -SELECT CONCAT('默认主播昵称: ', @default_streamer_name) as info; - --- 步骤3: 修复所有无效的直播间 -SELECT '========== 开始修复直播间数据 ==========' as info; - --- 3.1 修复 uid 为空或0的直播间 -UPDATE eb_live_room -SET uid = @default_streamer_id, - streamer_name = @default_streamer_name -WHERE uid IS NULL OR uid = 0; - -SELECT CONCAT('已修复 uid 为空或0的直播间: ', ROW_COUNT(), ' 条') as result; - --- 3.2 修复 uid 指向不存在用户的直播间 -UPDATE eb_live_room -SET uid = @default_streamer_id, - streamer_name = @default_streamer_name -WHERE uid IS NOT NULL - AND uid > 0 - AND uid NOT IN (SELECT uid FROM eb_user); - -SELECT CONCAT('已修复 uid 无效的直播间: ', ROW_COUNT(), ' 条') as result; - --- 步骤4: 验证修复结果 -SELECT '========== 修复结果验证 ==========' as info; - -SELECT - '总直播间数' as item, - COUNT(*) as count -FROM eb_live_room -UNION ALL -SELECT - 'uid有效的直播间' as item, - COUNT(*) as count -FROM eb_live_room -WHERE uid IN (SELECT uid FROM eb_user) -UNION ALL -SELECT - 'uid无效的直播间' as item, - COUNT(*) as count -FROM eb_live_room -WHERE uid NOT IN (SELECT uid FROM eb_user); - --- 步骤5: 查看修复后的直播间样例 -SELECT '========== 修复后的直播间样例 ==========' as info; - -SELECT - r.id, - r.uid, - u.nickname as actual_streamer_name, - r.streamer_name as room_streamer_name, - r.title, - r.is_live, - r.create_time -FROM eb_live_room r -LEFT JOIN eb_user u ON r.uid = u.uid -ORDER BY r.id DESC -LIMIT 10; - --- 步骤6: 添加外键约束(可选,确保数据一致性) --- 注意:添加外键前必须确保所有数据都有效 -SELECT '========== 添加外键约束 ==========' as info; - --- 检查是否已存在外键 -SELECT - CONSTRAINT_NAME, - CONSTRAINT_TYPE -FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS -WHERE TABLE_SCHEMA = 'zhibo' - AND TABLE_NAME = 'eb_live_room' - AND CONSTRAINT_TYPE = 'FOREIGN KEY'; - --- 如果没有外键,添加外键约束 --- ALTER TABLE eb_live_room --- ADD CONSTRAINT fk_live_room_user --- FOREIGN KEY (uid) REFERENCES eb_user(uid) --- ON DELETE CASCADE --- ON UPDATE CASCADE; - -SELECT '提示: 外键约束已注释,如需启用请手动执行' as info; - --- 步骤7: 创建触发器,确保新建直播间时uid必须有效(可选) -SELECT '========== 创建验证触发器 ==========' as info; - -DELIMITER $$ - -DROP TRIGGER IF EXISTS before_live_room_insert$$ -CREATE TRIGGER before_live_room_insert -BEFORE INSERT ON eb_live_room -FOR EACH ROW -BEGIN - DECLARE user_exists INT; - - -- 检查uid是否为空 - IF NEW.uid IS NULL OR NEW.uid = 0 THEN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = '直播间必须指定有效的主播ID'; - END IF; - - -- 检查用户是否存在 - SELECT COUNT(*) INTO user_exists - FROM eb_user - WHERE uid = NEW.uid; - - IF user_exists = 0 THEN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = '指定的主播用户不存在'; - END IF; - - -- 检查用户是否是认证主播 - SELECT COUNT(*) INTO user_exists - FROM eb_user - WHERE uid = NEW.uid AND is_streamer = 1; - - IF user_exists = 0 THEN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = '只有认证主播才能创建直播间'; - END IF; -END$$ - -DROP TRIGGER IF EXISTS before_live_room_update$$ -CREATE TRIGGER before_live_room_update -BEFORE UPDATE ON eb_live_room -FOR EACH ROW -BEGIN - DECLARE user_exists INT; - - -- 如果uid被修改,进行验证 - IF NEW.uid != OLD.uid THEN - -- 检查uid是否为空 - IF NEW.uid IS NULL OR NEW.uid = 0 THEN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = '直播间必须指定有效的主播ID'; - END IF; - - -- 检查用户是否存在 - SELECT COUNT(*) INTO user_exists - FROM eb_user - WHERE uid = NEW.uid; - - IF user_exists = 0 THEN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = '指定的主播用户不存在'; - END IF; - END IF; -END$$ - -DELIMITER ; - -SELECT '触发器创建完成' as info; - --- 步骤8: 最终统计 -SELECT '========== 最终统计 ==========' as info; - -SELECT - u.uid, - u.nickname, - COUNT(r.id) as room_count, - SUM(CASE WHEN r.is_live = 1 THEN 1 ELSE 0 END) as live_room_count -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 room_count DESC; - -SELECT '========== 修复完成 ==========' as info; diff --git a/完整诊断.sql b/完整诊断.sql deleted file mode 100644 index f66c0625..00000000 --- a/完整诊断.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE zhibo; - --- 1. 检查表是否存在 -SELECT 'eb_follow_record表存在' as status; - --- 2. 查看表结构中的所有字段 -SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT -FROM INFORMATION_SCHEMA.COLUMNS -WHERE TABLE_SCHEMA = 'zhibo' - AND TABLE_NAME = 'eb_follow_record' -ORDER BY ORDINAL_POSITION; - --- 3. 查看总记录数 -SELECT COUNT(*) as total_records FROM eb_follow_record; - --- 4. 查看最新的记录 -SELECT * FROM eb_follow_record ORDER BY id DESC LIMIT 3; - --- 5. 检查唯一键约束 -SELECT CONSTRAINT_NAME, COLUMN_NAME -FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE -WHERE TABLE_SCHEMA = 'zhibo' - AND TABLE_NAME = 'eb_follow_record' - AND CONSTRAINT_NAME LIKE '%unique%' OR CONSTRAINT_NAME LIKE '%uk%'; - --- 6. 查看当前登录的用户(假设是120) -SELECT uid, nickname, phone FROM eb_user WHERE uid = 120; - --- 7. 查看可关注的主播 -SELECT uid, nickname, phone, is_streamer -FROM eb_user -WHERE is_streamer = 1 -LIMIT 5; diff --git a/工作日志-接口对接.md b/工作日志-接口对接.md deleted file mode 100644 index ec85bae6..00000000 --- a/工作日志-接口对接.md +++ /dev/null @@ -1,113 +0,0 @@ -# 工作日志 - 前后端接口对接 - -> 日期: 2024年12月26日 - ---- - -## 一、完成的工作 - -### 1. Android端接口扩展 - -将 `ApiService.java` 从原来的 6 个接口扩展到 42 个接口,覆盖以下模块: - -- 用户认证(4个) -- 用户信息(2个) -- 直播间(6个) -- 直播弹幕(2个) -- 礼物打赏(5个) -- 私聊会话(8个) -- 好友管理(6个) -- 文件上传(1个) -- 在线状态(5个) -- 离线消息(3个) - -### 2. 新增数据模型类(17个) - -| 文件名 | 说明 | -|--------|------| -| UserInfoResponse.java | 用户信息响应 | -| UserEditRequest.java | 修改用户资料请求 | -| GiftResponse.java | 礼物信息 | -| UserBalanceResponse.java | 用户余额 | -| SendGiftRequest.java | 赠送礼物请求 | -| SendGiftResponse.java | 赠送礼物响应 | -| RechargeOptionResponse.java | 充值选项 | -| CreateRechargeRequest.java | 创建充值订单请求 | -| CreateRechargeResponse.java | 创建充值订单响应 | -| ConversationResponse.java | 会话信息 | -| PrivateMessageResponse.java | 私信消息 | -| SendMessageRequest.java | 发送消息请求 | -| FriendResponse.java | 好友信息 | -| FriendRequestResponse.java | 好友请求 | -| SearchUserResponse.java | 搜索用户结果 | -| PageResponse.java | 分页响应 | -| FileUploadResponse.java | 文件上传响应 | - -### 3. 字段匹配修复 - -检查并修复了 Android 端数据模型与后端返回字段的匹配问题: - -| 文件 | 修改内容 | -|------|----------| -| ConversationResponse | 字段改为 id, title, lastMessage, timeText, unreadCount, muted, avatarUrl, otherUserId | -| PrivateMessageResponse | 字段改为 messageId, userId, username, avatarUrl, message, timestamp, status, isSystemMessage | -| SendMessageRequest | 字段改为 message, messageType | -| CreateRechargeRequest | 字段改为 optionId, coinAmount, price | -| UserInfoResponse | 匹配后端 UserCenterResponse | -| UserEditRequest | 简化为 nickname, avatar | - -### 4. Git配置修改 - -修改 `.gitignore`,注释掉 `**/*.jks` 和 `**/*.keystore`,允许签名文件上传到公司仓库。 - -### 5. 文档编写 - -- `zhibo/android-app/接口文档.md` - 完整的接口说明文档 -- `zhibo/接口对接状态.md` - 三端接口对接状态表格 - ---- - -## 二、接口对接状态 - -| 端 | 已打通 | 未打通 | 完成度 | -|----|--------|--------|--------| -| Android ↔ 后端 | 42 | 0 | 100% | -| Vue Admin ↔ 后端 | 20+ | 0 | 100% | - ---- - -## 三、待完成事项 - -1. 支付SDK集成(微信/支付宝) - ---- - -## 四、修改的文件清单 - -``` -zhibo/ -├── .gitignore # 修改:注释jks规则 -├── 接口对接状态.md # 新增 -├── 工作日志-接口对接.md # 新增 -└── android-app/ - ├── 接口文档.md # 新增 - └── app/src/main/java/.../net/ - ├── ApiService.java # 修改:扩展接口 - ├── ConversationResponse.java # 修改:字段匹配 - ├── PrivateMessageResponse.java # 修改:字段匹配 - ├── SendMessageRequest.java # 修改:字段匹配 - ├── CreateRechargeRequest.java # 修改:字段匹配 - ├── UserInfoResponse.java # 修改:字段匹配 - ├── UserEditRequest.java # 修改:字段匹配 - ├── GiftResponse.java # 新增 - ├── UserBalanceResponse.java # 新增 - ├── SendGiftRequest.java # 新增 - ├── SendGiftResponse.java # 新增 - ├── RechargeOptionResponse.java # 新增 - ├── CreateRechargeResponse.java # 新增 - ├── FriendResponse.java # 新增 - ├── FriendRequestResponse.java # 新增 - ├── SearchUserResponse.java # 新增 - ├── PageResponse.java # 新增 - └── FileUploadResponse.java # 新增 -``` diff --git a/快速诊断关注问题.md b/快速诊断关注问题.md deleted file mode 100644 index fd7e861e..00000000 --- a/快速诊断关注问题.md +++ /dev/null @@ -1,201 +0,0 @@ -# 快速诊断关注页面问题 - -## 问题描述 -关注页面看不到已关注的主播,即使主播存在并且有直播间。 - -## 诊断步骤 - -### 步骤1:检查数据库数据 - -执行以下SQL查看当前数据状态: - -```bash -mysql -u root -p zhibo < diagnose_current_follow_issue.sql -``` - -重点检查: -1. 关注记录是否存在 -2. follow_status 字段的值(应该是 '1') -3. 主播的 is_streamer 字段是否为 1 -4. 直播间是否存在 - -### 步骤2:检查Android端日志 - -在Android Studio的Logcat中搜索以下关键词: -- `fetchFollowedStreamersRooms` -- `获取到关注列表` -- `筛选后的直播间数量` - -查看日志输出: -``` -获取到关注列表,数量: X -所有直播间数量: Y -筛选后的直播间数量: Z -``` - -### 步骤3:检查API返回数据 - -#### 检查关注列表API -```bash -curl -X GET "http://your-server/api/front/follow/following?page=1&pageSize=10" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -期望返回格式: -```json -{ - "code": 200, - "message": "success", - "data": { - "list": [ - { - "uid": 41, - "nickname": "夏至已至", - "avatar": "...", - ... - } - ], - "total": 1 - } -} -``` - -**关键检查点**:返回的用户对象中是否包含 `uid` 字段 - -#### 检查直播间列表API -```bash -curl -X GET "http://your-server/api/front/live/public/rooms" \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -期望返回格式: -```json -{ - "code": 200, - "message": "success", - "data": [ - { - "id": 8, - "uid": 41, - "title": "火影忍者", - "isLive": 1, - ... - } - ] -} -``` - -**关键检查点**:直播间对象中是否包含 `uid` 字段 - -## 可能的问题原因 - -### 原因1:关注列表API返回的字段名不对 - -Android端代码期望: -```java -Object uidObj = user.get("uid"); -``` - -如果后端返回的是 `followed_id` 而不是 `uid`,就会匹配失败。 - -**解决方案**:修改后端FollowRecordServiceImpl,确保返回的Map中包含 `uid` 字段。 - -### 原因2:数据库中的关注状态值不对 - -如果 `follow_status` 不是 '1',查询会失败。 - -**解决方案**:执行修复脚本 -```bash -mysql -u root -p zhibo < final_fix_follow_issue.sql -``` - -### 原因3:主播的is_streamer字段不对 - -如果用户的 `is_streamer` 不是 1,即使有直播间也不会被识别为主播。 - -**解决方案**: -```sql -UPDATE eb_user SET is_streamer = 1 WHERE uid = 41; -``` - -### 原因4:直播间的uid字段为空 - -如果直播间记录中的 `uid` 字段为空,无法匹配到主播。 - -**解决方案**: -```sql -UPDATE eb_live_room SET uid = 41 WHERE id = 8 AND uid IS NULL; -``` - -## 快速修复方案 - -### 方案A:修复后端返回数据(推荐) - -修改 `FollowRecordServiceImpl.java` 中的 `getFollowingList` 方法,确保返回的Map包含正确的字段: - -```java -// 在构建返回Map时,确保包含uid字段 -map.put("uid", followRecord.getFollowedId()); // 添加这一行 -map.put("nickname", followRecord.getFollowedNickname()); -map.put("avatar", user.getAvatar()); -// ... 其他字段 -``` - -### 方案B:修复Android端代码 - -如果后端返回的是 `followed_id`,修改Android端代码: - -```java -// 修改 MainActivity.java 中的代码 -Object uidObj = user.get("uid"); // 原代码 -// 改为 -Object uidObj = user.get("followed_id"); // 或者后端实际返回的字段名 -``` - -### 方案C:修复数据库数据 - -```sql --- 1. 修复关注状态 -UPDATE eb_follow_record SET follow_status = '1' WHERE follow_status = '关注'; - --- 2. 确保主播标识正确 -UPDATE eb_user SET is_streamer = 1 WHERE uid IN ( - SELECT DISTINCT uid FROM eb_live_room -); - --- 3. 修复直播间的主播关联 -UPDATE eb_live_room lr -INNER JOIN eb_user u ON lr.uid = u.uid -SET u.is_streamer = 1 -WHERE lr.uid IS NOT NULL; -``` - -## 立即执行 - -1. **先诊断**: - ```bash - mysql -u root -p zhibo < diagnose_current_follow_issue.sql - ``` - -2. **查看Android日志**: - - 打开Android Studio - - 运行应用 - - 登录用户43 - - 点击"关注"标签 - - 查看Logcat输出 - -3. **根据诊断结果选择修复方案** - -## 预期结果 - -修复后,Android端日志应该显示: -``` -获取到关注列表,数量: 1 -关注的用户ID: 41, 昵称: 夏至已至 -所有直播间数量: X -直播间: 火影忍者, uid=41, isLive=true, 是否匹配=true -匹配成功!添加直播间: 火影忍者 -筛选后的直播间数量: 1 -``` - -关注页面应该显示用户41的直播间"火影忍者"。 diff --git a/快速部署-用户活动记录.md b/快速部署-用户活动记录.md deleted file mode 100644 index 07e08e1c..00000000 --- a/快速部署-用户活动记录.md +++ /dev/null @@ -1,84 +0,0 @@ -# 快速部署 - 用户活动记录功能 - -## 已完成的工作 - -✅ 前端页面修改完成 -✅ 后端接口开发完成 -✅ 后端代码编译成功 -✅ 数据库表结构设计完成 - -## 部署步骤 - -### 1. 创建数据库表(必须) - -```bash -mysql -u root -p zhibo < user_activity_tables.sql -``` - -这将创建以下表: -- `eb_live_room_like` - 直播间点赞记录 -- `eb_work_like` - 作品点赞记录 -- `eb_wish_like` - 心愿点赞记录 -- `eb_view_history` - 查看历史记录 - -### 2. 部署后端(已编译) - -编译后的文件位置: -``` -Zhibo/zhibo-h/crmeb-admin/target/Crmeb-admin.jar -``` - -如果在服务器上,重启服务: -```bash -cd /root/zhibo/Zhibo/zhibo-h/crmeb-admin -./restart.sh -``` - -### 3. 前端(无需重新编译) - -前端代码已修改,刷新浏览器即可看到新功能。 - -## 使用方法 - -1. 登录管理后台 -2. 进入"用户管理" -> "用户列表" -3. 点击任意用户的"详情"按钮 -4. 在弹出的抽屉中,可以看到新增的三个标签页: - - **关注记录** - 显示用户关注了哪些人 - - **点赞记录** - 显示用户点赞的内容 - - **查看历史** - 显示用户的浏览记录 - -## 测试数据(可选) - -如果需要测试,可以插入一些测试数据: - -```sql --- 插入点赞记录 -INSERT INTO eb_live_room_like (user_id, room_id, create_time) -VALUES (43, '8', NOW()); - --- 插入查看历史 -INSERT INTO eb_view_history (user_id, target_type, target_id, target_title, view_duration, create_time) -VALUES (43, 'room', '8', '火影忍者', 1200, NOW()); -``` - -## 注意事项 - -1. **数据收集**:这些表需要在应用中主动记录数据 - - 用户点赞时,插入对应的点赞表 - - 用户查看内容时,插入查看历史表 - -2. **性能**:所有表都已添加索引,查询性能良好 - -3. **权限**:只有管理员可以查看用户活动记录 - -## 相关文件 - -- 前端:`Zhibo/admin/src/views/user/list/userDetails.vue` -- 后端:`Zhibo/zhibo-h/crmeb-admin/src/main/java/com/zbkj/admin/controller/UserActivityController.java` -- 数据库:`user_activity_tables.sql` -- 详细文档:`用户活动记录功能说明.md` - -## 完成! - -部署完成后,管理员就可以在用户详情页面查看用户的关注记录、点赞记录和查看历史了。 diff --git a/快速部署指南.md b/快速部署指南.md deleted file mode 100644 index 7fc70154..00000000 --- a/快速部署指南.md +++ /dev/null @@ -1,228 +0,0 @@ -# 快速部署指南 - -## 🚀 立即开始 - -### 第一步:数据库迁移(必须) - -```bash -# 1. 连接到MySQL数据库 -mysql -u root -p - -# 2. 选择数据库 -use your_database_name; - -# 3. 执行迁移SQL -source Zhibo/zhibo-h/数据库迁移-直播间新字段.sql - -# 4. 验证字段是否添加成功 -DESC eb_live_room; -``` - -**预期结果**:应该看到以下新字段 -- `description` (TEXT) -- `cover_image` (VARCHAR(500)) -- `share_count` (INT) -- `notice` (VARCHAR(500)) -- `tags` (VARCHAR(500)) -- `type` (VARCHAR(50)) - ---- - -### 第二步:后端编译和部署 - -```bash -# 1. 进入后端目录 -cd Zhibo/zhibo-h - -# 2. 清理并编译 -mvn clean package -DskipTests - -# 3. 重启后端服务 -# 如果使用systemd -sudo systemctl restart your-backend-service - -# 或者直接运行jar -java -jar crmeb-admin/target/crmeb-admin.jar -``` - ---- - -### 第三步:前端编译和部署 - -```bash -# 1. 进入Android项目目录 -cd android-app - -# 2. 清理构建缓存 -./gradlew clean - -# 3. 构建APK -./gradlew assembleDebug - -# 4. 安装到设备 -adb install -r app/build/outputs/apk/debug/app-debug.apk -``` - ---- - -## ✅ 验证清单 - -### 后端验证 - -1. **检查新接口是否可用** -```bash -# 测试开始直播接口 -curl -X POST http://localhost:8080/api/front/live/room/1/start \ - -H "Authorization: Bearer YOUR_TOKEN" - -# 测试结束直播接口 -curl -X POST http://localhost:8080/api/front/live/room/1/stop \ - -H "Authorization: Bearer YOUR_TOKEN" - -# 测试在线人数接口 -curl http://localhost:8080/api/live/online/count/1 -``` - -2. **检查响应格式** -```bash -# 获取直播间详情,验证新字段 -curl http://localhost:8080/api/front/live/public/rooms/1 -``` - -**预期响应应包含**: -```json -{ - "code": 200, - "data": { - "id": "1", - "title": "直播间标题", - "streamerId": 123, - "streamerAvatar": "http://...", - "streamerLevel": 5, - "coverImage": "http://...", - "description": "直播间描述", - "likeCount": 100, - "shareCount": 50, - "categoryId": 1, - "categoryName": "游戏", - "tags": ["英雄联盟", "竞技"], - "isFollowing": false, - "createTime": "2024-12-30T10:00:00", - "startTime": "2024-12-30T10:30:00", - "notice": "直播间公告", - "type": "live" - } -} -``` - -### 前端验证 - -1. **打开直播间列表页面** - - 检查是否显示封面图 - - 检查是否显示主播头像 - - 检查是否显示分类标签 - -2. **打开直播间详情页面** - - 检查是否显示完整的直播间信息 - - 检查是否显示关注按钮状态 - - 检查是否显示点赞数和分享数 - -3. **测试创建直播间** - - 填写完整信息(标题、描述、分类、标签等) - - 提交后检查是否创建成功 - - 验证新创建的直播间是否包含所有字段 - ---- - -## 🔍 常见问题 - -### Q1: 数据库迁移失败,提示字段已存在 -**解决方案**: -```sql --- 检查哪些字段已存在 -DESC eb_live_room; - --- 只执行缺失字段的ALTER TABLE语句 --- 注释掉已存在字段的语句 -``` - -### Q2: 后端编译失败 -**可能原因**: -- Maven依赖未下载完成 -- JDK版本不匹配 - -**解决方案**: -```bash -# 强制更新依赖 -mvn clean install -U - -# 检查JDK版本 -java -version -``` - -### Q3: 前端获取不到新字段 -**可能原因**: -- 前端未重新编译 -- 后端未重启 -- 缓存问题 - -**解决方案**: -```bash -# 清理前端缓存 -./gradlew clean - -# 重新构建 -./gradlew build - -# 卸载旧版本APK -adb uninstall com.example.livestreaming - -# 安装新版本 -adb install app/build/outputs/apk/debug/app-debug.apk -``` - -### Q4: toResponse方法报错,找不到UserService -**解决方案**: -确保在LiveRoomController中添加了依赖注入: -```java -@Autowired -private com.zbkj.service.service.UserService userService; - -@Autowired -private com.zbkj.service.service.CategoryService categoryService; - -@Autowired -private com.zbkj.service.service.FollowRecordService followRecordService; -``` - ---- - -## 📊 修改文件清单 - -### 后端文件(7个) -1. ✅ `Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/live/LiveRoom.java` -2. ✅ `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/response/live/LiveRoomResponse.java` -3. ✅ `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/request/live/CreateLiveRoomRequest.java` -4. ✅ `Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/service/LiveRoomService.java` -5. ✅ `Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/service/impl/LiveRoomServiceImpl.java` -6. ✅ `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java` -7. ✅ `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomOnlineController.java` - -### 前端文件(1个) -1. ✅ `android-app/app/src/main/java/com/example/livestreaming/net/Room.java` - -### 数据库文件(1个) -1. ✅ `Zhibo/zhibo-h/数据库迁移-直播间新字段.sql` - ---- - -## 🎉 完成! - -所有字段已补齐,接口已对齐,现在可以: -- ✅ 创建带完整信息的直播间 -- ✅ 获取包含所有字段的直播间详情 -- ✅ 手动控制直播的开始和结束 -- ✅ 获取正确格式的在线人数 -- ✅ 显示主播信息、分类、标签等 - -如有问题,请查看 `字段补齐完成总结.md` 获取详细信息。 diff --git a/接口对接分析报告.md b/接口对接分析报告.md deleted file mode 100644 index a95ed13b..00000000 --- a/接口对接分析报告.md +++ /dev/null @@ -1,428 +0,0 @@ -# 直播间管理模块接口对接分析报告 - -## 📋 分析概述 - -本报告对比了 `模块文档/02-直播间管理模块.md` 中定义的接口规范与后端实际实现,以及前端Android应用的调用情况。 - ---- - -## ✅ 已正确实现的接口 - -### 1. 获取直播间列表 -- **文档路径**: `GET /api/front/live/public/rooms` -- **后端实现**: ✅ `LiveRoomController.publicRooms()` -- **前端调用**: ✅ `ApiService.getRooms()` -- **状态**: **完全匹配** - -**后端返回字段**: -```java -- id (String) -- title (String) -- streamerName (String) -- streamKey (String) -- isLive (Boolean) -- viewerCount (Integer) -- streamUrls (StreamUrlsResponse) - - rtmp - - flv - - hls -``` - -**⚠️ 缺失字段对比文档**: -- ❌ `streamerId` (主播ID) -- ❌ `streamerAvatar` (主播头像) -- ❌ `coverImage` (封面图) -- ❌ `likeCount` (点赞数) -- ❌ `categoryId` (分类ID) -- ❌ `categoryName` (分类名称) -- ❌ `tags` (标签数组) -- ❌ `createTime` (创建时间) -- ❌ `startTime` (开始时间) - ---- - -### 2. 获取直播间详情 -- **文档路径**: `GET /api/front/live/public/rooms/{id}` -- **后端实现**: ✅ `LiveRoomController.publicRoom()` -- **前端调用**: ✅ `ApiService.getRoom()` -- **状态**: **部分匹配** - -**⚠️ 缺失字段对比文档**: -- ❌ `description` (直播间描述) -- ❌ `streamerId` (主播ID) -- ❌ `streamerAvatar` (主播头像) -- ❌ `streamerLevel` (主播等级) -- ❌ `coverImage` (封面图) -- ❌ `likeCount` (点赞数) -- ❌ `shareCount` (分享数) -- ❌ `categoryId` (分类ID) -- ❌ `categoryName` (分类名称) -- ❌ `tags` (标签数组) -- ❌ `isFollowing` (是否已关注) -- ❌ `createTime` (创建时间) -- ❌ `startTime` (开始时间) -- ❌ `notice` (直播间公告) - ---- - -### 3. 创建直播间 -- **文档路径**: `POST /api/front/live/rooms` -- **后端实现**: ✅ `LiveRoomController.create()` -- **前端调用**: ✅ `ApiService.createRoom()` -- **状态**: **部分匹配** - -**后端接收参数**: -```java -- title (String) ✅ -- streamerName (String) ✅ -``` - -**⚠️ 文档要求但后端未接收的参数**: -- ❌ `type` (直播类型) -- ❌ `categoryId` (分类ID) -- ❌ `description` (描述) -- ❌ `coverImage` (封面URL) - ---- - -### 4. 开始直播 -- **文档路径**: `POST /api/front/live/room/{id}/start` -- **后端实现**: ❌ **未实现** -- **前端调用**: ✅ `ApiService.startLiveRoom()` -- **状态**: **缺失接口** - -**问题**: -- 后端没有提供 `/room/{id}/start` 端点 -- 后端只有 `setLiveStatus(streamKey, boolean)` 方法,通过SRS回调自动触发 -- 前端期望手动控制开始直播,但后端未提供此接口 - ---- - -### 5. 结束直播 -- **文档路径**: `POST /api/front/live/room/{id}/stop` -- **后端实现**: ❌ **未实现** -- **前端调用**: ✅ `ApiService.stopLiveRoom()` -- **状态**: **缺失接口** - -**问题**: -- 后端没有提供 `/room/{id}/stop` 端点 -- 后端只有 `setLiveStatus(streamKey, boolean)` 方法,通过SRS回调自动触发 -- 前端期望手动控制结束直播,但后端未提供此接口 - ---- - -### 6. 关注主播 -- **文档路径**: `POST /api/front/live/follow` -- **后端实现**: ✅ `LiveRoomController.followStreamer()` -- **前端调用**: ✅ `ApiService.followStreamer()` -- **状态**: **完全匹配** - -**后端接收参数**: -```java -- streamerId (Integer) ✅ -- action (String: "follow" | "unfollow") ✅ -``` - -**后端返回**: -```java -- success (Boolean) -- message (String) -- isFollowing (Boolean) -``` - ---- - -### 7. 获取在线人数 -- **文档路径**: `GET /api/live/online/count/{roomId}` -- **后端实现**: ✅ `LiveRoomOnlineController.getRoomOnlineCount()` -- **前端调用**: ❌ 前端未直接调用此接口 -- **状态**: **后端已实现,前端未使用** - -**后端返回**: -```java -CommonResult // 直接返回人数 -``` - -**⚠️ 文档期望返回格式**: -```json -{ - "code": 200, - "msg": "success", - "data": { - "count": 1234, - "roomId": "房间ID" - } -} -``` - -**问题**: 返回格式不匹配,后端直接返回Integer,文档期望返回包含count和roomId的对象 - ---- - -### 8. 获取观众列表 -- **文档路径**: `GET /api/front/live/rooms/{roomId}/viewers` -- **后端实现**: ✅ `LiveRoomController.getViewers()` -- **前端调用**: ✅ `ApiService.getRoomViewers()` -- **状态**: **部分匹配** - -**后端返回字段**: -```java -- userId (String) -- nickname (String) -- avatar (String) -- level (Integer) -- isVip (Boolean) -- enterTime (Date) -- isOnline (Boolean) -- clientId (String) -``` - -**⚠️ 文档期望但后端未返回的字段**: -- ❌ `vipLevel` (VIP等级,后端返回的是isVip布尔值) -- ❌ `isFollowing` (是否关注) -- ❌ `joinTime` (文档使用joinTime,后端使用enterTime) - -**⚠️ 分页参数不匹配**: -- 文档期望: `page`, `pageSize` -- 后端接收: `limit` (只有limit参数,没有page) -- 前端调用: `page`, `pageSize` - ---- - -### 9. 赠送礼物 -- **文档路径**: `POST /api/front/live/rooms/{roomId}/gift` -- **后端实现**: ✅ `LiveRoomController.sendGift()` -- **前端调用**: ✅ `ApiService.sendRoomGift()` -- **状态**: **完全匹配** - -**后端接收参数**: -```java -- roomId (路径参数) ✅ -- giftId (请求体) ✅ -- count (请求体) ✅ -- receiverId (请求体) - 额外参数 -``` - -**后端返回**: -```java -- success (Boolean) -- newBalance (Integer) -- giftName (String) -- totalPrice (Integer) -- message (String) -``` - ---- - -### 10. 手动广播在线人数 -- **文档路径**: `POST /api/live/online/broadcast/{roomId}` -- **后端实现**: ✅ `LiveRoomOnlineController.broadcastRoomCount()` -- **前端调用**: ✅ `ApiService.broadcastOnlineCount()` -- **状态**: **完全匹配** - ---- - -## ❌ 主要问题汇总 - -### 🔴 严重问题 - -#### 1. 缺失关键接口 -- **开始直播接口**: `POST /api/front/live/room/{id}/start` - 未实现 -- **结束直播接口**: `POST /api/front/live/room/{id}/stop` - 未实现 - -**影响**: 前端无法手动控制直播的开始和结束,只能依赖SRS推流回调自动触发 - -**建议**: 在 `LiveRoomController` 中添加以下方法: - -```java -@ApiOperation(value = "开始直播") -@PostMapping("/room/{id}/start") -public CommonResult> startLive(@PathVariable Integer id) { - Integer uid = frontTokenComponent.getUserId(); - if (uid == null) return CommonResult.failed("未登录"); - - LiveRoom room = liveRoomService.getById(id); - if (room == null) return CommonResult.failed("房间不存在"); - if (!uid.equals(room.getUid())) return CommonResult.failed("无权限"); - - boolean success = liveRoomService.setLiveStatus(room.getStreamKey(), true); - - Map result = new HashMap<>(); - result.put("success", success); - result.put("message", success ? "直播已开始" : "开始直播失败"); - return CommonResult.success(result); -} - -@ApiOperation(value = "结束直播") -@PostMapping("/room/{id}/stop") -public CommonResult> stopLive(@PathVariable Integer id) { - Integer uid = frontTokenComponent.getUserId(); - if (uid == null) return CommonResult.failed("未登录"); - - LiveRoom room = liveRoomService.getById(id); - if (room == null) return CommonResult.failed("房间不存在"); - if (!uid.equals(room.getUid())) return CommonResult.failed("无权限"); - - boolean success = liveRoomService.setLiveStatus(room.getStreamKey(), false); - - Map result = new HashMap<>(); - result.put("success", success); - result.put("message", success ? "直播已结束" : "结束直播失败"); - return CommonResult.success(result); -} -``` - ---- - -### 🟡 中等问题 - -#### 2. 响应字段缺失 - -**LiveRoomResponse 缺失的重要字段**: -```java -// 需要在 LiveRoomResponse 类中添加: -private Integer streamerId; // 主播ID -private String streamerAvatar; // 主播头像 -private String coverImage; // 封面图 -private String description; // 描述 -private Integer likeCount; // 点赞数 -private Integer shareCount; // 分享数 -private Integer categoryId; // 分类ID -private String categoryName; // 分类名称 -private List tags; // 标签 -private Boolean isFollowing; // 是否已关注 -private Date createTime; // 创建时间 -private Date startTime; // 开始时间 -private String notice; // 公告 -private Integer streamerLevel; // 主播等级 -``` - -**影响**: 前端无法显示完整的直播间信息,用户体验受影响 - ---- - -#### 3. 创建直播间参数不完整 - -**CreateLiveRoomRequest 缺失的参数**: -```java -// 需要在 CreateLiveRoomRequest 类中添加: -private String type; // 直播类型 -private Integer categoryId; // 分类ID -private String description; // 描述 -private String coverImage; // 封面图URL -``` - -**影响**: 无法创建带分类、描述、封面的直播间 - ---- - -#### 4. 在线人数接口返回格式不匹配 - -**当前返回**: `CommonResult` -**文档期望**: -```json -{ - "code": 200, - "msg": "success", - "data": { - "count": 1234, - "roomId": "房间ID" - } -} -``` - -**建议修改**: -```java -@GetMapping("/count/{roomId}") -public CommonResult> getRoomOnlineCount(@PathVariable String roomId) { - try { - int count = liveRoomOnlineService.getRoomOnlineCount(roomId); - Map result = new HashMap<>(); - result.put("count", count); - result.put("roomId", roomId); - return CommonResult.success(result); - } catch (Exception e) { - log.error("Error getting room online count for roomId: {}", roomId, e); - return CommonResult.failed("获取在线人数失败"); - } -} -``` - ---- - -#### 5. 观众列表分页参数不一致 - -**文档期望**: `page`, `pageSize` -**后端实现**: 只有 `limit` 参数 -**前端调用**: `page`, `pageSize` - -**建议修改**: -```java -@GetMapping("/rooms/{roomId}/viewers") -public CommonResult> getViewers( - @PathVariable Integer roomId, - @RequestParam(defaultValue = "1") Integer page, - @RequestParam(defaultValue = "20") Integer pageSize) { - // 实现分页逻辑 - // 返回包含 data, total, page, pageSize 的结果 -} -``` - ---- - -### 🟢 轻微问题 - -#### 6. 字段命名不一致 -- 文档使用 `joinTime`,后端使用 `enterTime` -- 文档使用 `vipLevel`,后端使用 `isVip` - -**建议**: 统一字段命名,或在响应对象中做映射 - ---- - -## 📊 接口实现完整度统计 - -| 接口 | 文档定义 | 后端实现 | 前端调用 | 状态 | -|------|---------|---------|---------|------| -| 1. 获取直播间列表 | ✅ | ✅ | ✅ | 🟡 字段不完整 | -| 2. 获取直播间详情 | ✅ | ✅ | ✅ | 🟡 字段不完整 | -| 3. 创建直播间 | ✅ | ✅ | ✅ | 🟡 参数不完整 | -| 4. 开始直播 | ✅ | ❌ | ✅ | 🔴 接口缺失 | -| 5. 结束直播 | ✅ | ❌ | ✅ | 🔴 接口缺失 | -| 6. 关注主播 | ✅ | ✅ | ✅ | ✅ 完全匹配 | -| 7. 获取在线人数 | ✅ | ✅ | ❌ | 🟡 格式不匹配 | -| 8. 获取观众列表 | ✅ | ✅ | ✅ | 🟡 参数不一致 | -| 9. 赠送礼物 | ✅ | ✅ | ✅ | ✅ 完全匹配 | -| 10. 手动广播在线人数 | ✅ | ✅ | ✅ | ✅ 完全匹配 | - -**完整度**: 6/10 完全匹配,2/10 缺失,2/10 部分匹配 - ---- - -## 🔧 修复建议优先级 - -### P0 - 紧急 (必须修复) -1. ✅ 添加开始直播接口 `POST /api/front/live/room/{id}/start` -2. ✅ 添加结束直播接口 `POST /api/front/live/room/{id}/stop` - -### P1 - 重要 (建议修复) -3. ✅ 扩展 `LiveRoomResponse` 添加缺失字段 -4. ✅ 扩展 `CreateLiveRoomRequest` 添加缺失参数 -5. ✅ 修复在线人数接口返回格式 -6. ✅ 修复观众列表分页参数 - -### P2 - 一般 (可选修复) -7. ✅ 统一字段命名规范 -8. ✅ 完善API文档注释 - ---- - -## 📝 总结 - -后端基本实现了核心功能,但存在以下主要问题: - -1. **缺少手动控制直播的接口** - 这是最严重的问题,影响前端功能 -2. **响应数据不完整** - 缺少主播信息、分类、标签等重要字段 -3. **参数格式不统一** - 分页参数、返回格式与文档不一致 - -建议按照优先级逐步修复这些问题,确保前后端接口完全对齐。 diff --git a/推流问题完整诊断.md b/推流问题完整诊断.md deleted file mode 100644 index d406944b..00000000 --- a/推流问题完整诊断.md +++ /dev/null @@ -1,438 +0,0 @@ -# 推流问题完整诊断与解决 - -## 🔍 当前状态 - -- ✅ 后端服务器运行正常(端口 3001) -- ✅ SRS 服务器运行正常(端口 1935) -- ✅ 直播间已创建(streamKey: 7f4acb94-f91c-4ec0-84eb-fbb1855f8f18) -- ❌ **SRS 没有收到推流**(streams 数组为空) -- ❌ **Android 应用显示"未开播"** - -## 🎯 问题原因 - -**OBS 的推流没有成功到达 SRS 服务器!** - -可能的原因: -1. OBS 推流地址配置错误 -2. OBS 推流失败但没有提示 -3. OBS 没有真正开始推流 -4. 防火墙阻止了连接 - ---- - -## 🔧 完整诊断步骤 - -### 步骤 1:检查 OBS 推流状态 - -#### 1.1 查看 OBS 界面 -在 OBS 右下角查看: - -**如果推流成功**: -``` -直播中 | 00:01:23 | 2500 kb/s | 0 丢帧 -``` - -**如果推流失败**: -``` -未推流 -``` -或显示红色错误提示 - -#### 1.2 查看 OBS 日志 -1. 点击 OBS 菜单栏:**帮助** → **日志文件** → **查看当前日志** -2. 搜索 "error" 或 "failed" -3. 查看是否有连接错误 - -### 步骤 2:验证 OBS 推流设置 - -#### 2.1 打开推流设置 -1. 点击 **"设置"** → **"推流"** -2. 检查配置 - -#### 2.2 正确的配置应该是 - -**方式 A:完整地址** -``` -服务: 自定义... -服务器: rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 -串流密钥: (留空) -``` - -**方式 B:分开填写** -``` -服务: 自定义... -服务器: rtmp://localhost:1935/live -串流密钥: 7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 -``` - -#### 2.3 常见错误 - -❌ **错误 1**:使用了 `10.0.2.2` -``` -服务器: rtmp://10.0.2.2:1935/live/... ← 错误! -``` - -❌ **错误 2**:streamKey 不完整 -``` -串流密钥: 7f4acb94-f91c-4ec0 ← 不完整! -``` - -❌ **错误 3**:多了空格或换行 -``` -服务器: rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 - ↑ 多了空格 -``` - -### 步骤 3:重新配置 OBS - -#### 3.1 停止当前推流 -1. 如果 OBS 显示"直播中",点击 **"停止推流"** -2. 等待完全停止 - -#### 3.2 清空并重新配置 -1. 点击 **"设置"** → **"推流"** -2. **服务器** 框中,删除所有内容 -3. 重新输入(不要复制粘贴,手动输入): - ``` - rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 - ``` -4. **串流密钥**:确保为空 -5. 点击 **"应用"** -6. 点击 **"确定"** - -#### 3.3 测试连接(可选) -有些 OBS 版本有"测试连接"按钮,如果有就点击测试。 - -### 步骤 4:开始推流并验证 - -#### 4.1 确保有视频源 -1. 在 OBS 的"来源"区域,确保至少有一个视频源 -2. 如果没有,添加一个: - - 点击 + 号 - - 选择"视频捕获设备"(摄像头)或"显示器捕获"(屏幕) - -#### 4.2 开始推流 -1. 点击 **"开始推流"** 按钮 -2. 观察状态栏变化 - -#### 4.3 立即验证(推流后 5 秒内) - -**方法 1:浏览器检查 SRS** -打开浏览器访问: -``` -http://localhost:1985/api/v1/streams/ -``` - -**成功时应该看到**: -```json -{ - "code": 0, - "streams": [ - { - "id": "vid-xxxxx", - "name": "7f4acb94-f91c-4ec0-84eb-fbb1855f8f18", - "app": "live", - "publish": { - "active": true, - "cid": "xxxxx" - } - } - ] -} -``` - -**失败时会看到**: -```json -{ - "code": 0, - "streams": [] -} -``` - -**方法 2:检查后端 API** -打开浏览器访问: -``` -http://localhost:3001/api/rooms/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 -``` - -查看 `isLive` 字段: -```json -{ - "isLive": true ← 应该是 true -} -``` - -**方法 3:Android 应用** -1. 在 Android 模拟器中下拉刷新 -2. 查看直播间状态是否变成"直播中" - ---- - -## 🐛 如果还是失败 - -### 诊断 A:检查防火墙 - -Windows 防火墙可能阻止了 OBS 连接到 SRS。 - -#### 解决方法: -以管理员身份运行 PowerShell,执行: -```powershell -netsh advfirewall firewall add rule name="RTMP Server" dir=in action=allow protocol=TCP localport=1935 -netsh advfirewall firewall add rule name="RTMP Server Out" dir=out action=allow protocol=TCP localport=1935 -``` - -### 诊断 B:检查 SRS 日志 - -#### 查看 Docker 日志: -```bash -docker logs srs-server --tail 50 -``` - -查找是否有连接尝试或错误信息。 - -### 诊断 C:使用简化的测试地址 - -#### 测试 1:使用最简单的配置 -在 OBS 中: -``` -服务器: rtmp://localhost:1935/live -串流密钥: test123 -``` - -然后开始推流,访问: -``` -http://localhost:1985/api/v1/streams/ -``` - -如果能看到 `"name": "test123"`,说明 OBS 和 SRS 连接正常,问题在于 streamKey。 - -### 诊断 D:检查 OBS 版本 - -#### 确认 OBS 版本 -1. 点击 **帮助** → **关于** -2. 确认版本号(推荐 28.0 或更高) - -#### 如果版本太旧 -下载最新版本:https://obsproject.com/download - -### 诊断 E:重启所有服务 - -#### 完全重启流程: -```bash -# 1. 停止 OBS 推流 -# 2. 关闭 OBS - -# 3. 重启 SRS Docker -docker restart srs-server - -# 4. 重启后端服务器 -# 在命令行按 Ctrl+C 停止,然后重新运行: -cd live-streaming -node server/index.js - -# 5. 等待 5 秒 - -# 6. 重新打开 OBS - -# 7. 重新配置推流地址 - -# 8. 开始推流 -``` - ---- - -## 📋 完整的正确操作流程(从头开始) - -### 1. 确保所有服务运行 - -#### 检查 Docker -```bash -docker ps -``` -应该看到 `srs-server` 在运行。 - -#### 启动后端 -```bash -cd live-streaming -node server/index.js -``` - -### 2. 在 Android 应用中创建直播间 - -1. 打开应用 -2. 点击"开始直播" -3. 填写: - - 标题:测试直播 - - 主播:小明 -4. 点击"创建" -5. **记下完整的 streamKey**(例如:7f4acb94-f91c-4ec0-84eb-fbb1855f8f18) - -### 3. 配置 OBS(重要!) - -1. 打开 OBS Studio -2. 点击 **"设置"** -3. 左侧选择 **"推流"** -4. **服务**:下拉选择 **"自定义..."** -5. **服务器**:输入(注意不要有空格) - ``` - rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 - ``` -6. **串流密钥**:留空(不要填任何东西) -7. 点击 **"应用"** -8. 点击 **"确定"** - -### 4. 添加视频源(如果还没有) - -1. 在"来源"区域点击 **+** 号 -2. 选择 **"显示器捕获"** -3. 命名:屏幕 -4. 点击 **"确定"** -5. 选择你的显示器 -6. 点击 **"确定"** - -### 5. 开始推流 - -1. 点击 **"开始推流"** -2. 观察右下角状态栏 - -**成功标志**: -``` -直播中 | 00:00:05 | 2500 kb/s | 0 丢帧 -``` - -**失败标志**: -- 提示"连接失败" -- 状态栏显示红色 -- 没有比特率数据 - -### 6. 验证推流(推流后立即检查) - -#### 方法 1:浏览器 -访问:http://localhost:1985/api/v1/streams/ - -应该看到你的 streamKey。 - -#### 方法 2:Android 应用 -1. 下拉刷新列表 -2. 应该显示"直播中"(红色) -3. 点击进入观看 - ---- - -## 🎥 OBS 推流设置截图说明 - -### 正确的设置界面 - -``` -┌──────────────────────────────────────────┐ -│ 设置 │ -├──────────────────────────────────────────┤ -│ 推流 │ -│ │ -│ 服务: [自定义... ▼] │ -│ │ -│ 服务器: │ -│ ┌────────────────────────────────────┐ │ -│ │rtmp://localhost:1935/live/7f4acb94-│ │ -│ │f91c-4ec0-84eb-fbb1855f8f18 │ │ -│ └────────────────────────────────────┘ │ -│ │ -│ 串流密钥: │ -│ ┌────────────────────────────────────┐ │ -│ │ │ │ ← 留空! -│ └────────────────────────────────────┘ │ -│ │ -│ □ 使用身份验证 │ -│ │ -│ [取消] [确定] │ -└──────────────────────────────────────────┘ -``` - ---- - -## 📞 调试命令速查 - -### 检查 SRS 推流状态 -```bash -curl http://localhost:1985/api/v1/streams/ -``` - -### 检查直播间状态 -```bash -curl http://localhost:3001/api/rooms/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18 -``` - -### 检查 Docker 状态 -```bash -docker ps -docker logs srs-server --tail 20 -``` - -### 检查端口 -```bash -netstat -ano | findstr :1935 -netstat -ano | findstr :3001 -``` - -### 重启 SRS -```bash -docker restart srs-server -``` - ---- - -## ⚠️ 关键注意事项 - -### ✅ 必须做对的事情 - -1. **地址必须用 localhost** - - ✅ `rtmp://localhost:1935/...` - - ❌ `rtmp://10.0.2.2:1935/...` - -2. **streamKey 必须完整** - - ✅ `7f4acb94-f91c-4ec0-84eb-fbb1855f8f18` - - ❌ `7f4acb94-f91c-4ec0` - -3. **串流密钥框必须为空** - - 因为 streamKey 已经包含在服务器地址中了 - -4. **推流后立即验证** - - 不要等太久,推流后 5 秒内就应该能在 SRS 中看到 - -### ❌ 常见错误 - -1. 复制地址时带了空格或换行 -2. 使用了 `10.0.2.2` 而不是 `localhost` -3. streamKey 不完整或错误 -4. 在"串流密钥"框中又填了一遍 streamKey -5. 防火墙阻止了连接 - ---- - -## 💡 快速测试方法 - -如果你想快速测试 OBS 和 SRS 是否能正常连接: - -### 简化测试 -1. OBS 设置: - ``` - 服务器: rtmp://localhost:1935/live - 串流密钥: test - ``` - -2. 开始推流 - -3. 访问:http://localhost:1985/api/v1/streams/ - -4. 如果能看到 `"name": "test"`,说明连接正常 - -5. 然后再改回正确的 streamKey - ---- - -**现在按照上面的步骤重新配置 OBS,特别注意地址格式!** 🚀 - -如果还是不行,请告诉我: -1. OBS 状态栏显示什么? -2. 访问 http://localhost:1985/api/v1/streams/ 看到什么? -3. OBS 日志中有什么错误? diff --git a/服务管理指南.md b/服务管理指南.md deleted file mode 100644 index 7365c870..00000000 --- a/服务管理指南.md +++ /dev/null @@ -1,228 +0,0 @@ -# 直播系统服务管理指南 - -## 📍 服务器信息 -- **IP地址**: 1.15.149.240 -- **SSH登录**: `ssh root@1.15.149.240` - ---- - -## 🗂️ 服务清单 - -| 服务 | 端口 | 部署位置 | 说明 | -|------|------|----------|------| -| Admin API | 30003 | /opt/zhibo/admin-api | 管理后台API | -| Front API | 8083 | /opt/zhibo/front-api | APP端API | -| Admin Web | 30002 | /opt/zhibo/admin-web | 管理后台网页 | -| SRS 直播 | 25002/25003 | Docker | RTMP推流/HTTP拉流 | -| TURN 服务 | 3478 | Docker | WebRTC中继 | - ---- - -## 🔧 一、Java 后端服务管理 - -### 登录服务器 -```bash -ssh root@1.15.149.240 -``` - -### 查看服务状态 -```bash -# 查看所有Java进程 -ps aux | grep -E "Crmeb-admin|Crmeb-front" - -# 查看端口占用 -netstat -tlnp | grep -E "30003|8083" -``` - -### 停止服务 -```bash -# 停止 Admin API -pkill -f "Crmeb-admin.jar" - -# 停止 Front API -pkill -f "Crmeb-front.jar" - -# 或者一键停止 -/opt/zhibo/scripts/stop-all.sh -``` - -### 启动服务 -```bash -# 一键启动所有服务 -/opt/zhibo/scripts/start-all.sh - -# 或者单独启动 -/opt/zhibo/scripts/start-admin-api.sh -/opt/zhibo/scripts/start-front-api.sh -``` - -### 查看日志 -```bash -# Admin API 日志 -tail -100f /opt/zhibo/logs/admin-api.log - -# Front API 日志 -tail -100f /opt/zhibo/logs/front-api.log -``` - ---- - -## 🎬 二、SRS 直播服务管理 - -### 查看 SRS 状态 -```bash -# 查看 Docker 容器状态 -docker ps | grep srs - -# 查看 SRS 日志 -docker logs srs-server --tail 100 -``` - -### 停止 SRS -```bash -# 方法1: 使用 docker-compose(如果有) -cd /opt/live-streaming # 或者 SRS 部署目录 -docker-compose down - -# 方法2: 直接停止容器 -docker stop srs-server -docker rm srs-server -``` - -### 启动 SRS -```bash -# 方法1: 使用 docker-compose -cd /opt/live-streaming -docker-compose up -d - -# 方法2: 直接运行 -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 \ - ossrs/srs:5 -``` - -### 重启 SRS(应用新配置) -```bash -docker restart srs-server -``` - ---- - -## 🔄 三、完整重新部署流程 - -### 步骤 1: 停止所有服务 -```bash -ssh root@1.15.149.240 - -# 停止 Java 服务 -pkill -f "Crmeb-admin.jar" -pkill -f "Crmeb-front.jar" - -# 停止 SRS -docker stop srs-server 2>/dev/null -docker rm srs-server 2>/dev/null -``` - -### 步骤 2: 上传新文件(在本地执行) -```bash -# 上传 Java JAR 包 -scp Zhibo/zhibo-h/crmeb-admin/target/Crmeb-admin.jar root@1.15.149.240:/opt/zhibo/admin-api/ -scp Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar root@1.15.149.240:/opt/zhibo/front-api/ - -# 上传 SRS 配置 -scp live-streaming/docker/srs/srs.conf root@1.15.149.240:/opt/live-streaming/docker/srs/ -``` - -### 步骤 3: 启动所有服务 -```bash -ssh root@1.15.149.240 - -# 启动 Java 服务 -/opt/zhibo/scripts/start-all.sh - -# 启动 SRS -cd /opt/live-streaming -docker-compose up -d -``` - -### 步骤 4: 验证服务 -```bash -# 检查端口 -netstat -tlnp | grep -E "30003|8083|25002|25003" - -# 测试 API -curl http://localhost:8083/api/front/index -curl http://localhost:30003/api/admin/version - -# 测试 SRS -curl http://localhost:1985/api/v1/versions -``` - ---- - -## 🚨 四、常见问题排查 - -### 服务启动失败 -```bash -# 查看详细日志 -cat /opt/zhibo/logs/admin-api.log -cat /opt/zhibo/logs/front-api.log - -# 检查 Java 版本 -java -version - -# 检查 Redis 是否运行 -redis-cli ping -``` - -### 端口被占用 -```bash -# 查看端口占用 -lsof -i :8083 -lsof -i :30003 - -# 杀掉占用进程 -kill -9 -``` - -### SRS 无法推流 -```bash -# 检查防火墙 -firewall-cmd --list-ports -# 开放端口 -firewall-cmd --add-port=25002/tcp --permanent -firewall-cmd --add-port=25003/tcp --permanent -firewall-cmd --reload -``` - ---- - -## 📱 五、Android APP 配置 - -APP 连接的服务器地址配置在 `android-app/local.properties`: - -```properties -api.base_url_emulator=http://1.15.149.240:8083/ -api.base_url_device=http://1.15.149.240:8083/ -live.server_host=1.15.149.240 -live.server_port=8083 -``` - -修改后需要重新编译 APK。 - ---- - -## 📋 六、快速命令参考 - -| 操作 | 命令 | -|------|------| -| 登录服务器 | `ssh root@1.15.149.240` | -| 查看所有服务 | `ps aux \| grep -E "Crmeb\|srs"` | -| 停止所有 Java | `pkill -f "Crmeb"` | -| 启动所有 Java | `/opt/zhibo/scripts/start-all.sh` | -| 查看 SRS 日志 | `docker logs srs-server --tail 50` | -| 重启 SRS | `docker restart srs-server` | -| 查看端口 | `netstat -tlnp \| grep -E "8083\|30003\|25002\|25003"` | diff --git a/模拟器优化指南.md b/模拟器优化指南.md deleted file mode 100644 index 189275d8..00000000 --- a/模拟器优化指南.md +++ /dev/null @@ -1,89 +0,0 @@ -# 模拟器环境优化指南 - -## 🚀 已完成的优化 - -### 1. 应用层优化 -- ✅ 异步加载资源,避免主线程阻塞 -- ✅ 减少网络请求频率(15秒轮询) -- ✅ 优化启动流程,立即显示内容 -- ✅ 添加ANR防护机制 - -### 2. 网络层优化 -- ✅ 模拟器专用超时配置(3秒连接,8秒读取) -- ✅ 启用连接重试机制 -- ✅ 优化HTTP客户端配置 - -### 3. 流媒体服务器优化 -- ✅ 使用模拟器专用SRS配置 -- ✅ HLS分片时长降至1秒(极低延迟) -- ✅ 减少缓冲区大小 -- ✅ 关闭GOP缓存 - -## 📱 模拟器设置建议 - -### Android Studio模拟器优化 -1. **硬件配置** - - RAM: 至少4GB - - VM heap: 512MB - - Graphics: Hardware - GLES 2.0 - -2. **高级设置** - - 启用 "Use Host GPU" - - 启用 "Snapshot" 快速启动 - - 关闭不必要的传感器 - -### 推流设置(OBS) -``` -服务器: rtmp://localhost:1935/live -密钥: 从应用获取的streamKey -``` - -**OBS优化设置:** -- 关键帧间隔: 1秒 -- 码率: 1000-2000 kbps(模拟器环境建议较低) -- 分辨率: 720p或更低 -- 编码器: x264(软编码,兼容性更好) - -## ⚡ 延迟优化效果 - -| 配置项 | 优化前 | 优化后 | -|--------|--------|--------| -| HLS分片 | 10秒 | 1秒 | -| 缓冲时长 | 30秒 | 3秒 | -| 预期延迟 | 15-20秒 | 3-8秒 | - -## 🔧 故障排除 - -### 如果仍然出现ANR -1. 重启模拟器 -2. 清除应用数据 -3. 检查电脑性能(CPU/内存使用率) - -### 如果延迟仍然很高 -1. 确认使用HTTP-FLV播放(延迟更低) -2. 检查网络连接 -3. 尝试降低推流码率 - -### 切换回生产配置 -如需在真机上测试,修改docker-compose.yml: -```yaml -volumes: - - ./docker/srs/srs.conf:/usr/local/srs/conf/srs.conf -``` - -## 📊 性能监控 - -可以通过以下方式监控性能: -- SRS统计页面: http://localhost:8080/console/ -- Android Studio Profiler -- 应用内的网络请求日志 - -## 💡 最佳实践 - -1. **开发阶段**: 使用模拟器配置,快速测试 -2. **测试阶段**: 切换到真机,验证实际性能 -3. **生产环境**: 使用标准配置,确保稳定性 - ---- - -*注意:模拟器环境的延迟主要来自虚拟化开销,真机环境下延迟会显著降低。* \ No newline at end of file diff --git a/测试关注插入.sql b/测试关注插入.sql deleted file mode 100644 index ced0423e..00000000 --- a/测试关注插入.sql +++ /dev/null @@ -1,25 +0,0 @@ -USE zhibo; - --- 测试手动插入一条关注记录 -INSERT INTO eb_follow_record ( - follower_id, - follower_nickname, - follower_phone, - followed_id, - followed_nickname, - followed_phone, - follow_status, - is_deleted -) VALUES ( - 120, -- 关注者ID(你的测试用户) - '测试用户', - '18888888888', - 44, -- 被关注者ID(主播) - '主播', - '15637617378', - '关注', -- 明确设置为'关注' - 0 -); - --- 查看刚插入的记录 -SELECT * FROM eb_follow_record WHERE follower_id = 120 AND followed_id = 44 ORDER BY create_time DESC LIMIT 1; diff --git a/添加礼物打赏菜单配置说明.md b/添加礼物打赏菜单配置说明.md deleted file mode 100644 index 8077aca4..00000000 --- a/添加礼物打赏菜单配置说明.md +++ /dev/null @@ -1,214 +0,0 @@ -# 添加礼物打赏菜单配置说明 - -## 步骤1:在数据库中添加菜单 - -执行以下SQL,在后台管理系统中添加"礼物打赏"菜单: - -```sql --- 添加礼物管理菜单 -INSERT INTO eb_system_menu (pid, name, path, component, is_show, sort, icon, create_time, update_time) -VALUES (0, '礼物管理', '/gift', 'Layout', 1, 100, 'el-icon-present', NOW(), NOW()); - --- 获取刚插入的父菜单ID(假设为最新的ID) -SET @parent_id = LAST_INSERT_ID(); - --- 添加礼物打赏子菜单 -INSERT INTO eb_system_menu (pid, name, path, component, is_show, sort, icon, create_time, update_time) -VALUES (@parent_id, '礼物打赏', 'records', 'gift/records/index', 1, 1, 'el-icon-present', NOW(), NOW()); - --- 添加礼物配置子菜单(可选) -INSERT INTO eb_system_menu (pid, name, path, component, is_show, sort, icon, create_time, update_time) -VALUES (@parent_id, '礼物配置', 'config', 'gift/config/index', 1, 2, 'el-icon-setting', NOW(), NOW()); - --- 添加充值套餐子菜单(可选) -INSERT INTO eb_system_menu (pid, name, path, component, is_show, sort, icon, create_time, update_time) -VALUES (@parent_id, '充值套餐', 'packages', 'gift/packages/index', 1, 3, 'el-icon-coin', NOW(), NOW()); - --- 查看添加的菜单 -SELECT * FROM eb_system_menu WHERE name LIKE '%礼物%' OR name LIKE '%充值%'; -``` - -## 步骤2:如果没有菜单表,手动配置路由 - -如果你的系统不是从数据库读取菜单,需要手动在前端路由文件中添加。 - -找到 `Zhibo/admin/src/router/index.js` 文件,添加以下路由配置: - -```javascript -{ - path: '/gift', - component: Layout, - redirect: '/gift/records', - name: 'Gift', - meta: { - title: '礼物管理', - icon: 'el-icon-present' - }, - children: [ - { - path: 'records', - name: 'GiftRecords', - component: () => import('@/views/gift/records/index'), - meta: { - title: '礼物打赏', - icon: 'el-icon-present' - } - } - ] -} -``` - -## 步骤3:验证菜单是否添加成功 - -1. 重新登录后台管理系统 -2. 在左侧菜单栏应该能看到"礼物管理"菜单 -3. 点击"礼物打赏"子菜单 -4. 应该能看到礼物打赏记录页面 - -## 礼物打赏记录页面功能 - -页面会显示以下信息: - -### 统计卡片 -- **总礼物数**:所有时间的礼物总数量 -- **总价值**:所有礼物的总价值(虚拟币) -- **今日礼物数**:今天收到的礼物数量 -- **今日价值**:今天礼物的总价值 - -### 搜索功能 -- 关键词搜索:送礼者昵称、接收者昵称、礼物名称 -- 日期筛选:按开始日期和结束日期筛选 - -### 礼物记录表格 -显示字段: -- ID -- 礼物信息(图标、名称、单价×数量) -- 总价值 -- 送礼者(头像、昵称、手机号) -- 接收者/主播(头像、昵称、手机号) -- 直播间名称 -- 赠送时间 - -### 统计功能 -- 可以统计哪个用户送了多少礼物 -- 可以统计哪个主播收到了多少礼物 -- 可以按日期范围查看礼物记录 - -## 如果菜单还是没有显示 - -### 方法1:检查菜单表 -```sql --- 查看菜单表名 -SHOW TABLES LIKE '%menu%'; - --- 查看菜单表结构 -DESC eb_system_menu; - --- 查看现有菜单 -SELECT * FROM eb_system_menu ORDER BY sort; -``` - -### 方法2:检查权限 -确保当前登录的管理员账号有权限访问新添加的菜单。 - -### 方法3:清除缓存 -1. 清除浏览器缓存 -2. 重新登录后台管理系统 -3. 按 Ctrl+F5 强制刷新页面 - -### 方法4:直接访问URL -即使菜单没有显示,也可以直接在浏览器地址栏输入: -``` -http://localhost:8080/#/gift/records -``` - -## 礼物配置说明 - -礼物数据已经在数据库中初始化了,包括: -- 玫瑰(1虚拟币) -- 巧克力(5虚拟币) -- 棒棒糖(10虚拟币) -- 冰淇淋(20虚拟币) -- 蛋糕(50虚拟币) -- 香水(100虚拟币) -- 口红(200虚拟币) -- 钻戒(520虚拟币) -- 跑车(1314虚拟币) -- 城堡(5200虚拟币) - -可以通过以下SQL查看: -```sql -SELECT * FROM eb_gift_config ORDER BY sort_order; -``` - -## 测试流程 - -### 1. 准备测试数据 -```sql --- 查看礼物配置 -SELECT * FROM eb_gift_config; - --- 查看充值套餐 -SELECT * FROM eb_recharge_package; - --- 查看用户余额 -SELECT uid, nickname, virtual_balance FROM eb_user WHERE uid IN (41, 42, 43); -``` - -### 2. 通过APP端送礼物 -1. 用户A登录APP -2. 充值虚拟货币 -3. 进入主播B的直播间 -4. 点击礼物按钮 -5. 选择礼物并发送 - -### 3. 在后台查看记录 -1. 登录后台管理系统 -2. 进入"礼物管理" -> "礼物打赏" -3. 查看刚才的送礼记录 -4. 可以搜索用户A或主播B -5. 查看统计数据是否正确 - -## 常见问题 - -### Q1: 菜单添加后看不到? -**A:** -1. 检查数据库中菜单是否添加成功 -2. 检查`is_show`字段是否为1 -3. 清除浏览器缓存并重新登录 -4. 检查当前用户是否有权限 - -### Q2: 点击菜单报404错误? -**A:** -1. 检查前端页面文件是否存在:`Zhibo/admin/src/views/gift/records/index.vue` -2. 检查路由配置是否正确 -3. 重新编译前端:`npm run build:prod` - -### Q3: 页面显示"暂无数据"? -**A:** -1. 检查后端服务是否启动 -2. 检查API接口是否正常:`/api/admin/gift/records` -3. 查看浏览器控制台是否有错误 -4. 检查数据库中是否有礼物记录 - -### Q4: 统计数据不准确? -**A:** -1. 检查数据库中的数据是否正确 -2. 检查后端SQL查询是否正确 -3. 清除缓存重新加载 - -## 相关文件 - -- 后端Controller:`GiftAdminController.java` -- 前端API:`Zhibo/admin/src/api/gift.js` -- 前端页面:`Zhibo/admin/src/views/gift/records/index.vue` -- 数据库脚本:`virtual_currency_and_gift_system.sql` - -## 下一步扩展 - -可以继续添加以下功能: -1. 礼物配置管理页面(添加、编辑、删除礼物) -2. 充值套餐管理页面(配置充值金额和赠送比例) -3. 充值记录查看页面 -4. 礼物统计图表(趋势图、排行榜) -5. 数据导出功能(导出Excel) diff --git a/点赞功能完整实现完成.md b/点赞功能完整实现完成.md deleted file mode 100644 index aa12a18b..00000000 --- a/点赞功能完整实现完成.md +++ /dev/null @@ -1,255 +0,0 @@ -# 点赞功能完整实现完成 ✅ - -## 🎉 所有功能已完成! - -### ✅ 后端实现(已完成) - -1. **数据库** - - ✅ 创建点赞表 `eb_live_room_like` - - ✅ 添加直播间点赞数字段 `like_count` - - ✅ SQL脚本:`live_room_like_tables.sql` - -2. **后端代码** - - ✅ LiveRoomLike实体类 - - ✅ LiveRoomLikeDao和XML映射 - - ✅ LiveRoomLikeService服务层 - - ✅ LiveRoomLikeController控制器 - - ✅ 5个完整的API接口 - - ✅ 后端代码已成功编译 - -### ✅ Android端实现(已完成) - -#### 1. API接口定义 -- ✅ `ApiService.java` - 添加了5个点赞相关的API方法 - -#### 2. 首页直播间卡片 -- ✅ `item_room_waterfall.xml` - 使用粉色爱心图标显示点赞数 -- ✅ `WaterfallRoomsAdapter.java` - 绑定真实点赞数据 - -#### 3. 直播间详情页 -- ✅ `activity_room_detail.xml` - 添加点赞按钮和点赞数显示 -- ✅ `RoomDetailActivity.java` - 实现点赞功能、动画和API调用 - -#### 4. 主播中心 -- ✅ `activity_streamer_center.xml` - 已有获赞数显示 -- ✅ `StreamerCenterActivity.java` - 添加 `loadTotalLikes()` 方法加载获赞数 - -#### 5. 个人中心布局 -- ✅ `profile_quick_actions_new.xml` - 新建两行布局 - - 第一行:我的关注、我的点赞、观看历史 - - 第二行:公园勋章、我的挚友 - -#### 6. 我的点赞页面 -- ✅ `LikedRoomsActivity.java` - 显示用户点赞过的直播间 -- ✅ `activity_liked_rooms.xml` - 页面布局 -- ✅ 支持下拉刷新和加载更多 -- ✅ 空状态提示 - -## 📋 功能清单 - -### 核心功能 -- [x] 用户可以在直播间无限次点赞 -- [x] 点赞按钮有缩放动画效果 -- [x] 点赞后实时更新点赞数 -- [x] 首页卡片显示点赞数(粉色爱心) -- [x] 需要登录才能点赞 -- [x] 点赞成功有Toast提示 - -### 页面功能 -- [x] 直播间详情页 - 点赞按钮 -- [x] 首页 - 显示点赞数 -- [x] 主播中心 - 显示获赞总数 -- [x] 个人中心 - 新布局(两行按钮) -- [x] 我的点赞页面 - 显示点赞过的直播间 - -### 数据统计 -- [x] 直播间总点赞数 -- [x] 用户对直播间的点赞次数 -- [x] 主播的总获赞数 -- [x] 用户点赞过的直播间列表 - -## 🚀 部署步骤 - -### 1. 部署后端 - -```bash -# 1. 执行数据库脚本 -mysql -u root -p zhibo < live_room_like_tables.sql - -# 2. 部署后端代码 -cd /root/zhibo/Zhibo/zhibo-h/crmeb-front -cp target/Crmeb-front.jar ./ -./restart.sh -``` - -### 2. 编译Android应用 - -```bash -cd android-app -./gradlew assembleDebug -``` - -或在Android Studio中直接编译运行。 - -## 📝 使用说明 - -### 用户端 - -1. **在直播间点赞** - - 进入任意直播间 - - 点击聊天框旁边的爱心按钮 - - 看到缩放动画和点赞数增加 - - 可以无限次点赞 - -2. **查看我的点赞** - - 进入个人中心 - - 点击"我的点赞"按钮 - - 查看点赞过的所有直播间 - - 支持下拉刷新 - -3. **首页浏览** - - 首页卡片右下角显示点赞数 - - 粉色爱心图标 + 数字 - -### 主播端 - -1. **查看获赞数** - - 进入主播中心 - - 在数据统计卡片中查看"获赞"数量 - - 显示所有直播间的总获赞数 - -## 🎨 UI设计 - -### 点赞按钮 -- 图标:爱心(ic_like_24.xml) -- 颜色:白色(未点赞)/ 粉色(已点赞) -- 动画:缩放效果(1.0 → 1.3 → 1.0) -- 位置:聊天输入框右侧 - -### 点赞数显示 -- 首页卡片:粉色爱心 + 数字 -- 直播间:数字显示在点赞按钮旁边 -- 主播中心:大号数字 + "获赞"标签 - -### 我的点赞页面 -- 列表展示点赞过的直播间 -- 显示直播间封面、标题、主播名 -- 显示直播状态和点赞数 -- 空状态:爱心图标 + 提示文字 - -## 🔧 技术细节 - -### API接口 - -```java -// 点赞直播间 -POST /api/front/live/like/room/{roomId} -Body: { "count": 1 } - -// 获取直播间点赞数 -GET /api/front/live/like/room/{roomId}/count - -// 获取我的点赞次数 -GET /api/front/live/like/room/{roomId}/my-count - -// 获取我点赞过的直播间列表 -GET /api/front/live/like/my-liked-rooms?page=1&pageSize=20 - -// 获取主播总获赞数 -GET /api/front/live/like/streamer/{streamerId}/total -``` - -### 数据库表结构 - -```sql -CREATE TABLE eb_live_room_like ( - id INT PRIMARY KEY AUTO_INCREMENT, - room_id INT NOT NULL, - user_id INT NOT NULL, - user_nickname VARCHAR(50), - like_count INT DEFAULT 1, - last_like_time TIMESTAMP, - create_time TIMESTAMP, - update_time TIMESTAMP, - UNIQUE INDEX idx_user_room (user_id, room_id) -); - -ALTER TABLE eb_live_room -ADD COLUMN like_count INT DEFAULT 0; -``` - -### 防刷机制 -- 后端限流:100次/分钟 -- 使用RateLimit注解保护接口 -- 记录每个用户的点赞次数 - -## 📊 测试清单 - -- [x] 首页卡片显示点赞数 -- [x] 直播间详情页有点赞按钮 -- [x] 点击点赞按钮有动画 -- [x] 点赞成功后数字更新 -- [x] 未登录时提示登录 -- [x] 主播中心显示获赞数 -- [x] 个人中心布局调整为两行 -- [x] "我的点赞"页面正常显示 -- [x] 下拉刷新和加载更多正常 - -## 🎯 后续优化建议 - -### 功能优化 -1. 添加点赞排行榜 -2. 点赞动画更丰富(飘心效果) -3. 点赞提醒通知主播 -4. 点赞数达到里程碑时的特效 - -### 性能优化 -1. 点赞数缓存(减少API调用) -2. 批量获取点赞数 -3. WebSocket实时推送点赞数更新 - -### UI优化 -1. 点赞按钮长按连续点赞 -2. 点赞数格式化(1.2k, 1.5M) -3. 点赞历史时间线 -4. 点赞成就系统 - -## 🐛 常见问题 - -### Q1: 点赞数不更新? -**A**: 检查后端API是否正常返回,查看Logcat日志。 - -### Q2: 点赞按钮点击无反应? -**A**: 检查是否已登录,查看网络连接。 - -### Q3: 首页卡片不显示点赞数? -**A**: 确保Room对象中的likeCount字段不为null。 - -### Q4: 主播中心获赞数为0? -**A**: 检查主播是否有直播间,直播间是否有点赞记录。 - -## 📚 相关文档 - -- `点赞功能实现计划.md` - 实现计划 -- `点赞功能完整实现指南.md` - 详细指南 -- `Android端点赞功能实现总结.md` - Android端总结 -- `live_room_like_tables.sql` - 数据库脚本 - -## 🎉 总结 - -点赞功能已完整实现,包括: -- ✅ 完整的后端API(5个接口) -- ✅ 数据库表和字段 -- ✅ Android端所有页面和功能 -- ✅ 动画效果和交互体验 -- ✅ 数据统计和展示 - -所有代码已经过优化和测试,可以直接编译运行! - -现在用户可以: -1. 在直播间点赞 -2. 查看点赞过的直播间 -3. 主播可以看到获赞总数 -4. 首页卡片显示点赞数 - -功能完整,体验流畅!🎊 diff --git a/点赞功能完整实现指南.md b/点赞功能完整实现指南.md deleted file mode 100644 index 360eeeb3..00000000 --- a/点赞功能完整实现指南.md +++ /dev/null @@ -1,415 +0,0 @@ -# 点赞功能完整实现指南 - -## ✅ 已完成的后端部分 - -### 1. 数据库 -- ✅ 创建点赞表SQL脚本:`live_room_like_tables.sql` -- ✅ 添加直播间点赞数字段 - -### 2. 后端代码 -- ✅ LiveRoomLike实体类 -- ✅ LiveRoomLikeDao接口和XML映射 -- ✅ LiveRoomLikeService接口和实现 -- ✅ LiveRoomLikeController控制器 -- ✅ 后端代码编译成功 - -### 3. 后端API接口 - -#### 点赞接口 -``` -POST /api/front/live/like/room/{roomId} -Body: { "count": 1 } // 可选,默认1 -``` - -#### 获取直播间点赞数 -``` -GET /api/front/live/like/room/{roomId}/count -``` - -#### 获取我的点赞次数 -``` -GET /api/front/live/like/room/{roomId}/my-count -``` - -#### 获取我点赞过的直播间列表 -``` -GET /api/front/live/like/my-liked-rooms?page=1&pageSize=20 -``` - -#### 获取主播总获赞数 -``` -GET /api/front/live/like/streamer/{streamerId}/total -``` - -## 🔄 需要完成的Android端部分 - -由于Android端修改较多,我已经准备好了所有后端代码。现在需要你完成以下Android端的修改: - -### 1. 修改直播间详情页(添加点赞按钮) - -**文件**: `android-app/app/src/main/res/layout/activity_room_detail.xml` - -在聊天输入框的LinearLayout中添加点赞按钮: - -```xml - - - - - - - - - - - - -``` - -**文件**: `android-app/app/src/main/java/com/example/livestreaming/RoomDetailActivity.java` - -添加点赞功能代码(在onCreate方法中): - -```java -// 点赞按钮 -ImageButton likeButton = findViewById(R.id.likeButton); -TextView likeCountText = findViewById(R.id.likeCountText); - -// 加载点赞数 -loadLikeCount(); - -// 点赞按钮点击事件 -likeButton.setOnClickListener(v -> { - if (!AuthHelper.isLoggedIn(this)) { - Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show(); - return; - } - - // 点赞动画 - likeButton.animate() - .scaleX(1.3f) - .scaleY(1.3f) - .setDuration(100) - .withEndAction(() -> { - likeButton.animate() - .scaleX(1.0f) - .scaleY(1.0f) - .setDuration(100) - .start(); - }) - .start(); - - // 调用点赞API - likeRoom(); -}); - -// 添加这两个方法: - -private void loadLikeCount() { - ApiClient.getService(this) - .getRoomLikeCount(roomId) - .enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - Map data = response.body().getData(); - if (data != null && data.containsKey("likeCount")) { - int likeCount = ((Number) data.get("likeCount")).intValue(); - TextView likeCountText = findViewById(R.id.likeCountText); - likeCountText.setText(String.valueOf(likeCount)); - } - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - // 忽略错误 - } - }); -} - -private void likeRoom() { - Map request = new HashMap<>(); - request.put("count", 1); - - ApiClient.getService(this) - .likeRoom(roomId, request) - .enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - Map data = response.body().getData(); - if (data != null && data.containsKey("likeCount")) { - int likeCount = ((Number) data.get("likeCount")).intValue(); - TextView likeCountText = findViewById(R.id.likeCountText); - likeCountText.setText(String.valueOf(likeCount)); - - // 显示点赞成功提示 - Toast.makeText(RoomDetailActivity.this, "点赞成功 ❤️", Toast.LENGTH_SHORT).show(); - } - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - Toast.makeText(RoomDetailActivity.this, "点赞失败", Toast.LENGTH_SHORT).show(); - } - }); -} -``` - -### 2. 修改首页直播间卡片(显示点赞数) - -**文件**: `android-app/app/src/main/res/layout/item_room_waterfall.xml` - -找到右下角的星星图标,替换为点赞数显示: - -```xml - - - - - - - - - - -``` - -**文件**: `android-app/app/src/main/java/com/example/livestreaming/WaterfallRoomsAdapter.java` - -在bind方法中添加点赞数绑定: - -```java -TextView likeCountText = itemView.findViewById(R.id.likeCountText); -if (likeCountText != null && room.getLikeCount() != null) { - likeCountText.setText(String.valueOf(room.getLikeCount())); -} -``` - -### 3. 修改个人中心布局 - -**文件**: `android-app/app/src/main/res/layout/activity_profile.xml` - -调整布局,将按钮分为两行: - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -### 4. 创建"我的点赞"页面 - -这个页面类似于观看历史页面,显示用户点赞过的直播间列表。 - -### 5. 修改主播中心(显示获赞数) - -**文件**: `android-app/app/src/main/res/layout/activity_streamer_center.xml` - -添加获赞数显示: - -```xml - -``` - -**文件**: `android-app/app/src/main/java/com/example/livestreaming/StreamerCenterActivity.java` - -加载获赞数: - -```java -private void loadStreamerStats() { - Integer streamerId = AuthHelper.getUserId(this); - if (streamerId == null) return; - - ApiClient.getService(this) - .getStreamerTotalLikes(streamerId) - .enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, - Response>> response) { - if (response.isSuccessful() && response.body() != null && response.body().isOk()) { - Map data = response.body().getData(); - if (data != null && data.containsKey("totalLikes")) { - long totalLikes = ((Number) data.get("totalLikes")).longValue(); - TextView totalLikesText = findViewById(R.id.totalLikesText); - totalLikesText.setText("获赞: " + totalLikes); - } - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - // 忽略错误 - } - }); -} -``` - -## 📋 部署步骤 - -### 1. 部署后端 - -```bash -# 1. 执行数据库脚本 -mysql -u root -p zhibo < live_room_like_tables.sql - -# 2. 部署后端代码(jar文件已编译好) -cd /root/zhibo/Zhibo/zhibo-h/crmeb-front -cp target/Crmeb-front.jar ./ -./restart.sh -``` - -### 2. 修改Android端 - -按照上面的说明修改Android端代码,然后重新编译安装。 - -## 🎯 测试清单 - -- [ ] 直播间详情页能点赞 -- [ ] 点赞后数字实时更新 -- [ ] 点赞有动画效果 -- [ ] 首页卡片显示点赞数 -- [ ] 个人中心布局正确(两行) -- [ ] "我的点赞"页面能打开 -- [ ] "我的点赞"显示点赞过的直播间 -- [ ] 主播中心显示获赞总数 - -## 📝 注意事项 - -1. 点赞功能需要登录 -2. 点赞是无限次的,每次点击+1 -3. 点赞有防刷限制(100次/分钟) -4. 所有图标资源已创建(ic_like_24.xml, ic_like_filled_24.xml) -5. 后端API已全部实现并编译成功 - -由于Android端修改较多且涉及UI调整,建议你按照上面的指南逐步完成。如果遇到问题,可以随时询问! diff --git a/点赞功能实现计划.md b/点赞功能实现计划.md deleted file mode 100644 index 4f08e89c..00000000 --- a/点赞功能实现计划.md +++ /dev/null @@ -1,110 +0,0 @@ -# 点赞功能实现计划 - -## 需求分析 - -### 1. 直播间点赞按钮 -- 位置:送礼物按钮旁边 -- 功能:用户可以无限次点赞 -- 效果:点击后显示动画,点赞数实时增加 - -### 2. 个人中心布局调整 -- 第一行:我的关注、我的点赞、观看历史(样式一致) -- 第二行:公园勋章、我的挚友 -- 我的点赞:显示用户点赞过的直播间列表 - -### 3. 主播中心显示获赞数 -- 显示该主播所有直播间的总获赞数 - -### 4. 首页直播间卡片 -- 右下角显示点赞数(替换星星图标) - -## 技术实现 - -### 数据库设计 - -#### 1. 直播间点赞表 (eb_live_room_like) -```sql -CREATE TABLE eb_live_room_like ( - id INT PRIMARY KEY AUTO_INCREMENT, - room_id INT NOT NULL COMMENT '直播间ID', - user_id INT NOT NULL COMMENT '用户ID', - like_count INT DEFAULT 1 COMMENT '点赞次数', - create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - INDEX idx_room_id (room_id), - INDEX idx_user_id (user_id), - INDEX idx_user_room (user_id, room_id) -) COMMENT='直播间点赞记录表'; -``` - -#### 2. 直播间表添加点赞数字段 -```sql -ALTER TABLE eb_live_room ADD COLUMN like_count INT DEFAULT 0 COMMENT '总点赞数'; -``` - -### 后端API设计 - -#### 1. 点赞接口 -- POST `/api/front/live/room/{roomId}/like` - 点赞直播间 -- GET `/api/front/live/room/{roomId}/like/count` - 获取点赞数 -- GET `/api/front/user/liked-rooms` - 获取用户点赞过的直播间列表 - -#### 2. 主播统计接口 -- GET `/api/front/streamer/stats` - 获取主播统计(包含获赞数) - -### Android端实现 - -#### 1. RoomDetailActivity(直播间详情) -- 添加点赞按钮UI -- 实现点赞动画效果 -- 实时更新点赞数 - -#### 2. ProfileActivity(个人中心) -- 调整布局:第一行3个按钮,第二行2个按钮 -- 添加"我的点赞"按钮 - -#### 3. LikedRoomsActivity(我的点赞页面) -- 显示用户点赞过的直播间列表 -- 支持下拉刷新 - -#### 4. StreamerCenterActivity(主播中心) -- 显示获赞总数 - -#### 5. MainActivity(首页) -- 修改直播间卡片,显示点赞数而不是星星 - -## 实现步骤 - -1. ✅ 创建数据库表和字段 -2. ✅ 实现后端点赞API -3. ✅ 实现Android端点赞按钮和动画 -4. ✅ 调整个人中心布局 -5. ✅ 创建"我的点赞"页面 -6. ✅ 更新主播中心显示获赞数 -7. ✅ 修改首页直播间卡片显示点赞数 - -## 文件清单 - -### 数据库 -- `live_room_like_tables.sql` - 点赞表创建脚本 - -### 后端 -- `LiveRoomLikeController.java` - 点赞控制器 -- `LiveRoomLikeService.java` - 点赞服务接口 -- `LiveRoomLikeServiceImpl.java` - 点赞服务实现 -- `LiveRoomLike.java` - 点赞实体类 -- `LiveRoomLikeDao.java` - 点赞DAO -- `LiveRoomLikeDao.xml` - MyBatis映射文件 - -### Android端 -- `LikedRoomsActivity.java` - 我的点赞页面 -- `activity_liked_rooms.xml` - 我的点赞布局 -- `ic_like_24.xml` - 点赞图标 -- `ic_like_filled_24.xml` - 已点赞图标 -- 修改 `RoomDetailActivity.java` - 添加点赞按钮 -- 修改 `activity_room_detail.xml` - 添加点赞按钮布局 -- 修改 `ProfileActivity.java` - 调整布局 -- 修改 `activity_profile.xml` - 调整布局 -- 修改 `StreamerCenterActivity.java` - 显示获赞数 -- 修改 `MainActivity.java` - 更新卡片显示 -- 修改 `item_room_waterfall.xml` - 显示点赞数 diff --git a/点赞功能实现进度.md b/点赞功能实现进度.md deleted file mode 100644 index 34e993eb..00000000 --- a/点赞功能实现进度.md +++ /dev/null @@ -1,85 +0,0 @@ -# 点赞功能实现进度 - -## ✅ 已完成 - -### 1. 数据库层 -- ✅ 创建点赞表SQL脚本 (`live_room_like_tables.sql`) -- ✅ 添加直播间点赞数字段 - -### 2. 后端实现 -- ✅ 创建LiveRoomLike实体类 -- ✅ 创建LiveRoomLikeDao接口 -- ✅ 创建LiveRoomLikeDao.xml映射文件 -- ✅ 创建LiveRoomLikeService接口 -- ✅ 创建LiveRoomLikeServiceImpl实现类 -- ✅ 创建LiveRoomLikeController控制器 - -### 3. Android资源 -- ✅ 创建点赞图标 (ic_like_24.xml) -- ✅ 创建已点赞图标 (ic_like_filled_24.xml) - -## 🔄 进行中 - -### 4. Android端UI修改 -需要修改以下文件: - -#### 4.1 直播间详情页 (RoomDetailActivity) -- [ ] 修改 `activity_room_detail.xml` - 添加点赞和送礼物按钮 -- [ ] 修改 `RoomDetailActivity.java` - 实现点赞功能和动画 - -#### 4.2 个人中心 (ProfileActivity) -- [ ] 修改 `activity_profile.xml` - 调整布局 - - 第一行:我的关注、我的点赞、观看历史 - - 第二行:公园勋章、我的挚友 -- [ ] 修改 `ProfileActivity.java` - 添加点赞按钮点击事件 - -#### 4.3 我的点赞页面 (新建) -- [ ] 创建 `LikedRoomsActivity.java` -- [ ] 创建 `activity_liked_rooms.xml` -- [ ] 创建 `LikedRoomsAdapter.java` - -#### 4.4 主播中心 (StreamerCenterActivity) -- [ ] 修改 `activity_streamer_center.xml` - 添加获赞数显示 -- [ ] 修改 `StreamerCenterActivity.java` - 加载获赞数 - -#### 4.5 首页直播间卡片 (MainActivity) -- [ ] 修改 `item_room_waterfall.xml` - 显示点赞数替换星星 -- [ ] 修改 `WaterfallRoomsAdapter.java` - 绑定点赞数数据 - -## 📋 待办事项 - -1. 执行数据库脚本创建表 -2. 编译后端代码 -3. 部署后端服务 -4. 完成Android端所有UI修改 -5. 编译Android应用 -6. 测试点赞功能 - -## 🎯 下一步 - -由于修改较多,建议按以下顺序进行: - -1. **先完成后端部署** - - 执行数据库脚本 - - 编译后端代码 - - 部署到服务器 - -2. **然后完成Android端** - - 修改直播间详情页(添加点赞按钮) - - 修改首页卡片(显示点赞数) - - 修改个人中心布局 - - 创建我的点赞页面 - - 修改主播中心 - -3. **最后测试** - - 测试点赞功能 - - 测试我的点赞列表 - - 测试主播获赞统计 - -## 📝 注意事项 - -1. 点赞是无限次的,每次点击增加1次 -2. 点赞需要登录 -3. 点赞有防刷限制(100次/分钟) -4. 首页卡片右下角显示点赞数,不是星星 -5. 个人中心布局调整为两行 diff --git a/点赞功能显示问题排查.md b/点赞功能显示问题排查.md deleted file mode 100644 index 7582d3be..00000000 --- a/点赞功能显示问题排查.md +++ /dev/null @@ -1,225 +0,0 @@ -# 点赞功能显示问题排查 - -## 问题描述 -根据截图,发现以下问题: -1. ❌ 首页右下角显示星星图标,不是点赞数 -2. ❌ 直播间右上角没有点赞按钮 -3. ❌ 个人中心没有"我的点赞"按钮 - -## 原因分析 -这些问题说明**应用没有使用最新编译的代码**,可能是: -1. APK没有重新编译 -2. 使用了缓存的旧版本 -3. 代码修改后没有同步到设备 - -## 解决方案 - -### 步骤1:清理并重新编译 - -```bash -cd android-app - -# 清理旧的编译文件 -./gradlew clean - -# 重新编译Debug版本 -./gradlew assembleDebug - -# 或者编译Release版本 -./gradlew assembleRelease -``` - -### 步骤2:卸载旧版本应用 - -在手机上: -1. 长按应用图标 -2. 选择"卸载"或"删除应用" -3. 确认卸载 - -或使用ADB命令: -```bash -adb uninstall com.example.livestreaming -``` - -### 步骤3:安装新版本 - -```bash -# 安装Debug版本 -adb install app/build/outputs/apk/debug/app-debug.apk - -# 或安装Release版本 -adb install app/build/outputs/apk/release/app-release.apk -``` - -### 步骤4:验证修改 - -安装后检查: - -#### ✅ 首页卡片 -- 右下角应该显示:粉色爱心图标 + 点赞数字 -- 不应该是星星图标 - -#### ✅ 直播间详情页 -- 聊天输入框右侧应该有:点赞按钮(爱心图标)+ 点赞数 -- 点击点赞按钮应该有缩放动画 - -#### ✅ 个人中心 -- 应该有"我的点赞"按钮 -- 位置在"观看历史"旁边 - -## 在Android Studio中操作 - -如果使用Android Studio: - -1. **清理项目** - - 菜单:Build → Clean Project - -2. **重新构建** - - 菜单:Build → Rebuild Project - -3. **卸载旧版本** - - 在设备上手动卸载 - - 或在Android Studio中:Run → Edit Configurations → 勾选"Always install with package manager" - -4. **运行应用** - - 点击绿色运行按钮 - - 或按 Shift + F10 - -## 验证清单 - -安装新版本后,请验证以下功能: - -### 首页 -- [ ] 直播间卡片右下角显示粉色爱心 + 点赞数 -- [ ] 点赞数显示正确(不是星星) - -### 直播间详情页 -- [ ] 聊天输入框右侧有点赞按钮 -- [ ] 点赞按钮旁边显示点赞数 -- [ ] 点击点赞按钮有动画效果 -- [ ] 点赞后数字增加 -- [ ] 未登录时提示登录 - -### 个人中心 -- [ ] 有"我的点赞"按钮 -- [ ] 点击"我的点赞"能打开列表页面 -- [ ] 列表显示点赞过的直播间 - -### 主播中心 -- [ ] 数据统计中显示"获赞"数量 -- [ ] 获赞数正确显示 - -## 如果问题仍然存在 - -### 检查1:确认代码已保存 -确保所有修改的文件都已保存(Ctrl+S 或 Cmd+S) - -### 检查2:查看编译日志 -```bash -./gradlew assembleDebug --info -``` -查看是否有编译错误或警告 - -### 检查3:检查布局文件 -确认以下文件包含正确的代码: - -**item_room_waterfall.xml** - 应该有: -```xml - - - -``` - -**activity_room_detail.xml** - 应该有: -```xml - - - -``` - -### 检查4:查看Logcat日志 -运行应用时查看Logcat,搜索关键词: -- "like" -- "点赞" -- "RoomDetailActivity" -- "WaterfallRoomsAdapter" - -## 常见错误 - -### 错误1:Gradle同步失败 -**解决**: -```bash -./gradlew --refresh-dependencies -``` - -### 错误2:资源文件未找到 -**解决**: -- 确认 `ic_like_24.xml` 和 `ic_like_filled_24.xml` 存在 -- 路径:`app/src/main/res/drawable/` - -### 错误3:编译缓存问题 -**解决**: -```bash -./gradlew clean -rm -rf .gradle -rm -rf app/build -./gradlew assembleDebug -``` - -## 快速修复命令 - -一键清理、编译、安装: - -```bash -cd android-app -./gradlew clean -./gradlew assembleDebug -adb uninstall com.example.livestreaming -adb install app/build/outputs/apk/debug/app-debug.apk -adb shell am start -n com.example.livestreaming/.MainActivity -``` - -## 预期效果 - -修复后的应用应该: - -### 首页 -![首页效果] -- 卡片右下角:❤️ 123(粉色爱心 + 数字) - -### 直播间 -![直播间效果] -- 输入框右侧:❤️ 按钮 + 数字 -- 点击后有动画 - -### 个人中心 -![个人中心效果] -- 第一行:我的关注 | 我的点赞 | 观看历史 -- 第二行:公园勋章 | 我的挚友 - -## 总结 - -最可能的原因是**应用没有重新编译安装**。 - -请按照以下步骤操作: -1. ✅ 清理项目 -2. ✅ 重新编译 -3. ✅ 卸载旧版本 -4. ✅ 安装新版本 -5. ✅ 验证功能 - -如果按照以上步骤操作后问题仍然存在,请提供: -1. Logcat日志 -2. 编译输出 -3. 具体的错误信息 - -这样我可以进一步帮你排查问题。 diff --git a/点赞功能最终修复.md b/点赞功能最终修复.md deleted file mode 100644 index 6c13f191..00000000 --- a/点赞功能最终修复.md +++ /dev/null @@ -1,172 +0,0 @@ -# 点赞功能最终修复 ✅ - -## 发现的问题 - -根据截图分析,发现了以下代码问题: - -### 问题1:item_room.xml 使用星星图标 -**文件**: `android-app/app/src/main/res/layout/item_room.xml` - -**问题**: -```xml - - -``` - -**修复**: -```xml - - -``` - -### 问题2:RoomAdapter 显示观看人数而不是点赞数 -**文件**: `android-app/app/src/main/java/com/example/livestreaming/RoomAdapter.java` - -**问题**: -```java -// 错误:显示观看人数 -tvLikeCount.setText(String.valueOf(room.getViewerCount())); -``` - -**修复**: -```java -// 正确:显示点赞数 -Integer likeCount = room.getLikeCount(); -tvLikeCount.setText(String.valueOf(likeCount != null ? likeCount : 0)); -tvLikeCount.setVisibility(View.VISIBLE); -``` - -## 已修复的文件 - -1. ✅ `item_room.xml` - 修改图标为爱心,移除visibility="gone" -2. ✅ `RoomAdapter.java` - 修改为显示点赞数而不是观看人数 - -## 重新编译步骤 - -现在需要重新编译应用: - -### 方法1:使用Gradle命令 - -```bash -cd android-app - -# 清理旧文件 -./gradlew clean - -# 重新编译 -./gradlew assembleDebug - -# 卸载旧版本 -adb uninstall com.example.livestreaming - -# 安装新版本 -adb install app/build/outputs/apk/debug/app-debug.apk -``` - -### 方法2:使用Android Studio - -1. **清理项目** - - Build → Clean Project - -2. **重新构建** - - Build → Rebuild Project - -3. **卸载旧应用** - - 在手机上手动卸载应用 - -4. **运行应用** - - 点击绿色运行按钮 ▶️ - -## 修复后的效果 - -### 首页直播间卡片 -- ✅ 右下角显示:❤️ + 点赞数(粉色爱心) -- ✅ 不再显示星星图标 -- ✅ 点赞数始终可见 - -### 直播间详情页 -- ✅ 聊天输入框右侧有点赞按钮 -- ✅ 点赞按钮旁边显示点赞数 -- ✅ 点击有缩放动画 -- ✅ 点赞后数字实时更新 - -### 个人中心 -- ✅ 有"我的点赞"按钮 -- ✅ 可以查看点赞过的直播间 - -### 主播中心 -- ✅ 显示总获赞数 - -## 验证清单 - -重新安装后,请验证: - -- [ ] 首页卡片右下角是爱心图标(不是星星) -- [ ] 首页卡片显示点赞数(不是观看人数) -- [ ] 直播间有点赞按钮 -- [ ] 点赞功能正常工作 -- [ ] 个人中心有"我的点赞"按钮 - -## 关于"关注"功能 - -如果"关注"功能也有问题,请确保: - -1. **后端已部署** - ```bash - mysql -u root -p zhibo < final_fix_follow_issue.sql - cd /root/zhibo/Zhibo/zhibo-h/crmeb-front - ./restart.sh - ``` - -2. **数据库有关注记录** - ```sql - SELECT * FROM eb_follow_record WHERE follower_id = 43; - ``` - -3. **关注列表API返回uid字段** - - 后端已修复,返回 `userId` 和 `uid` 两个字段 - -## 总结 - -这次修复了两个关键问题: - -1. **布局文件** - 将星星图标改为爱心图标 -2. **适配器代码** - 将观看人数改为点赞数 - -这些修改确保了: -- ✅ 首页正确显示点赞数 -- ✅ 使用正确的图标 -- ✅ 数据绑定正确 - -现在重新编译安装后,点赞功能应该完全正常了!🎉 - -## 如果问题仍然存在 - -1. **检查是否真的安装了新版本** - ```bash - adb shell pm list packages | grep livestreaming - adb shell dumpsys package com.example.livestreaming | grep versionCode - ``` - -2. **查看Logcat日志** - ```bash - adb logcat | grep -i "like\|room\|adapter" - ``` - -3. **确认文件已保存** - - 检查 `item_room.xml` 是否包含 `ic_like_filled_24` - - 检查 `RoomAdapter.java` 是否使用 `getLikeCount()` - -4. **清理缓存** - ```bash - ./gradlew clean - rm -rf .gradle - rm -rf app/build - ./gradlew assembleDebug - ``` diff --git a/环境配置指南.md b/环境配置指南.md deleted file mode 100644 index 31500047..00000000 --- a/环境配置指南.md +++ /dev/null @@ -1,177 +0,0 @@ -# 环境配置指南 - -本项目采用分离配置架构: -- **普通业务功能**(用户、消息、商城等)→ 可切换本地/远程 -- **直播/通话服务** → 始终连接远程服务器 - ---- - -## 一、APP 配置 - -### 配置文件位置 -`android-app/local.properties` - -### 配置说明 - -```properties -# ============ 主API地址(普通业务功能)============ -# 本地开发时使用本地地址 -api.base_url_emulator=http://10.0.2.2:8081/ -api.base_url_device=http://192.168.1.164:8081/ - -# ============ 直播/通话服务地址(始终远程)============ -live.server_host=1.15.149.240 -live.server_port=8083 -turn.server_host=1.15.149.240 -turn.server_port=3478 -``` - -### 切换环境 - -#### 本地开发(默认) -```properties -api.base_url_emulator=http://10.0.2.2:8081/ -api.base_url_device=http://192.168.1.164:8081/ -``` - -#### 全部连接远程 -```properties -api.base_url_emulator=http://1.15.149.240:8083/ -api.base_url_device=http://1.15.149.240:8083/ -``` - -### 修改后需要重新编译 -```bash -cd android-app -.\gradlew assembleRelease -``` - ---- - -## 二、前端管理端配置 - -### 配置文件位置 -- 开发环境:`Zhibo/admin/.env.development` -- 生产环境:`Zhibo/admin/.env.production` - -### 开发环境(本地) -```env -ENV = 'development' -VUE_APP_BASE_API = 'http://127.0.0.1:30001' -``` - -### 生产环境(远程) -```env -ENV = 'production' -VUE_APP_BASE_API = '' -``` -> 生产环境使用空字符串,由Nginx代理到后端 - ---- - -## 三、后端配置 - -### 配置文件位置 -`Zhibo/zhibo-h/crmeb-front/src/main/resources/application.yml` - -### 关键配置 - -```yaml -server: - port: 8081 # 本地开发端口 - -spring: - datasource: - url: jdbc:mysql://1.15.149.240:3306/zhibo # 数据库地址 - redis: - host: 127.0.0.1 # Redis地址 -``` - -### 服务器启动脚本 -```bash -#!/bin/bash -JAR_PATH="/www/wwwroot/1.15.149.240_30002/Jar" - -# Front API (带SRS配置) -nohup java -Xms512m -Xmx1024m -jar ${JAR_PATH}/Crmeb-front.jar \ - --server.port=8083 \ - --spring.redis.host=127.0.0.1 \ - --LIVE_PUBLIC_SRS_HOST=1.15.149.240 \ - --LIVE_PUBLIC_SRS_RTMP_PORT=25002 \ - --LIVE_PUBLIC_SRS_HTTP_PORT=25003 \ - > ${JAR_PATH}/logs/front.log 2>&1 & -``` - ---- - -## 四、服务架构图 - -``` -┌─────────────────────────────────────────────────────────────┐ -│ 远程服务器 1.15.149.240 │ -├─────────────────────────────────────────────────────────────┤ -│ Front API (8083) │ -│ ├── WebSocket: /ws/call (通话信令) ←── APP直连 │ -│ ├── WebSocket: /ws/live/* (直播弹幕) ←── APP直连 │ -│ └── REST API: /api/front/* (可选) │ -│ │ -│ SRS流媒体服务器 │ -│ ├── RTMP: 25002 │ -│ └── HTTP-FLV: 25003 │ -│ │ -│ TURN服务器: 3478 │ -└─────────────────────────────────────────────────────────────┘ - ▲ - 直播/通话服务 │ - ─────────────────────┼───────────────────── - 普通业务功能 │ - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ 本地开发环境 │ -├─────────────────────────────────────────────────────────────┤ -│ Front API (8081) │ -│ └── REST API: /api/front/* ←── APP连接 │ -│ │ -│ Admin API (30001) │ -│ └── REST API: /api/admin/* ←── 管理前端连接 │ -└─────────────────────────────────────────────────────────────┘ -``` - ---- - -## 五、快速切换命令 - -### APP切换到全远程 -编辑 `android-app/local.properties`: -```properties -api.base_url_device=http://1.15.149.240:8083/ -``` - -### APP切换到本地开发 -编辑 `android-app/local.properties`: -```properties -api.base_url_device=http://192.168.1.164:8081/ -``` - -### 前端切换 -```bash -# 开发模式(连本地) -npm run dev - -# 生产构建(连远程) -npm run build:prod -``` - ---- - -## 六、端口清单 - -| 服务 | 本地端口 | 远程端口 | 说明 | -|------|----------|----------|------| -| Front API | 8081 | 8083 | APP主API | -| Admin API | 30001 | 30003 | 管理后台API | -| SRS RTMP | - | 25002 | 直播推流 | -| SRS HTTP | - | 25003 | 直播播放 | -| TURN | - | 3478 | 视频通话中继 | -| MySQL | - | 3306 | 数据库 | -| Redis | 6379 | 6379 | 缓存 | diff --git a/环境配置汇总.md b/环境配置汇总.md deleted file mode 100644 index b8d502a9..00000000 --- a/环境配置汇总.md +++ /dev/null @@ -1,141 +0,0 @@ -# 环境配置汇总 - -## 一、Android APP 配置 - -### 1. 主配置文件:`android-app/local.properties` - -```properties -# ============ API 服务器地址配置 ============ -# 主API地址 - 模拟器使用 -api.base_url_emulator=http://1.15.149.240:8083/ -# 主API地址 - 真机使用 -api.base_url_device=http://1.15.149.240:8083/ - -# ============ 直播/通话服务地址配置 ============ -# 直播/通话 WebSocket 服务地址 -live.server_host=1.15.149.240 -live.server_port=8083 -# TURN 服务器地址(视频通话中继) -turn.server_host=1.15.149.240 -turn.server_port=3478 -``` - -**说明**: -- `api.base_url_emulator` - 模拟器运行时使用的API地址 -- `api.base_url_device` - 真机运行时使用的API地址 -- `live.server_host/port` - 直播和通话WebSocket服务地址 -- `turn.server_host/port` - WebRTC TURN中继服务器地址 - -### 2. 相关代码文件(无需修改,自动读取local.properties) - -| 文件 | 作用 | -|------|------| -| `app/build.gradle.kts` | 读取local.properties生成BuildConfig | -| `ApiConfig.java` | 提供统一的API地址获取方法 | -| `ApiClient.java` | 网络请求客户端,自动选择模拟器/真机地址 | -| `WebRTCConfig.java` | WebRTC/TURN服务器配置 | - ---- - -## 二、前端 Admin 配置 - -### 1. 开发环境:`Zhibo/admin/.env.development` - -```properties -ENV = 'development' -# 本地开发时连接本地后端 -VUE_APP_BASE_API = 'http://127.0.0.1:30001' -``` - -### 2. 生产环境:`Zhibo/admin/.env.production` - -```properties -ENV = 'production' -# 生产环境使用相对路径,由Nginx代理 -VUE_APP_BASE_API = '' -``` - -### 3. 预发布环境:`Zhibo/admin/.env.staging` - -```properties -ENV = 'production' -VUE_APP_BASE_API = 'http://192.168.31.35:2500' -``` - -**说明**: -- 开发环境:`npm run dev` 使用 `.env.development` -- 生产打包:`npm run build:prod` 使用 `.env.production` -- 预发布打包:`npm run build:stage` 使用 `.env.staging` - ---- - -## 三、环境切换指南 - -### 切换到生产环境(服务器 1.15.149.240) - -**Android APP**: -```properties -# android-app/local.properties -api.base_url_emulator=http://1.15.149.240:8083/ -api.base_url_device=http://1.15.149.240:8083/ -live.server_host=1.15.149.240 -live.server_port=8083 -turn.server_host=1.15.149.240 -turn.server_port=3478 -``` - -**前端 Admin**: -```properties -# Zhibo/admin/.env.production -VUE_APP_BASE_API = '' -``` -然后执行 `npm run build:prod` - ---- - -### 切换到本地开发环境 - -**Android APP**: -```properties -# android-app/local.properties -api.base_url_emulator=http://10.0.2.2:8081/ -api.base_url_device=http://192.168.x.x:8081/ -live.server_host=1.15.149.240 -live.server_port=8083 -turn.server_host=1.15.149.240 -turn.server_port=3478 -``` -> 注意:直播/通话服务建议始终使用远程服务器 - -**前端 Admin**: -```properties -# Zhibo/admin/.env.development -VUE_APP_BASE_API = 'http://127.0.0.1:30001' -``` -然后执行 `npm run dev` - ---- - -## 四、服务端口说明 - -| 服务 | 端口 | 说明 | -|------|------|------| -| Admin API | 30003 | 管理后台API | -| Front API | 8083 | 前端/APP API | -| Admin 前端 | 30002 | 管理后台网页 | -| TURN 服务 | 3478 | WebRTC中继 | -| SRS RTMP | 25002 | 直播推流 | -| SRS HTTP | 25003 | 直播拉流 | - ---- - -## 五、修改后需要的操作 - -### Android APP -1. 修改 `local.properties` -2. 重新编译:`./gradlew assembleRelease` - -### 前端 Admin -1. 修改对应的 `.env.*` 文件 -2. 重新打包:`npm run build:prod` -3. 上传 `dist` 目录到服务器 diff --git a/现在立即部署后端.md b/现在立即部署后端.md deleted file mode 100644 index e69de29b..00000000 diff --git a/用户活动记录功能说明.md b/用户活动记录功能说明.md deleted file mode 100644 index 9c6cf093..00000000 --- a/用户活动记录功能说明.md +++ /dev/null @@ -1,298 +0,0 @@ -# 用户活动记录功能说明 - -## 功能概述 - -在管理后台的用户详情页面添加了三个新的标签页,用于查看用户的活动记录: -1. **关注记录** - 查看用户关注了哪些人 -2. **点赞记录** - 查看用户点赞了哪些内容(直播间、作品、心愿等) -3. **查看历史** - 查看用户的浏览历史记录 - -## 实现内容 - -### 1. 前端修改 - -**文件**: `Zhibo/admin/src/views/user/list/userDetails.vue` - -**新增标签页**: -- 标签页 7:关注记录 -- 标签页 8:点赞记录 -- 标签页 9:查看历史 - -**功能特性**: -- 支持分页显示 -- 数据实时加载 -- 状态标签显示(关注状态、内容类型等) -- 时间排序(最新的在前) - -### 2. 后端接口 - -**文件**: `Zhibo/zhibo-h/crmeb-admin/src/main/java/com/zbkj/admin/controller/UserActivityController.java` - -**新增接口**: - -#### 2.1 获取关注记录 -``` -GET /api/admin/user/follow/records -参数: - - userId: 用户ID - - page: 页码(默认1) - - limit: 每页数量(默认10) -``` - -返回数据: -```json -{ - "code": 200, - "data": { - "list": [ - { - "followedId": 41, - "followedNickname": "夏至已至", - "followStatus": "1", - "createTime": "2026-01-03 14:19:16" - } - ], - "total": 1, - "page": 1, - "limit": 10 - } -} -``` - -#### 2.2 获取点赞记录 -``` -GET /api/admin/user/like/records -参数: - - userId: 用户ID - - page: 页码(默认1) - - limit: 每页数量(默认10) -``` - -返回数据: -```json -{ - "code": 200, - "data": { - "list": [ - { - "targetType": "room", - "targetId": "8", - "targetTitle": "火影忍者", - "createTime": "2026-01-03 14:30:00" - } - ], - "total": 1, - "page": 1, - "limit": 10 - } -} -``` - -#### 2.3 获取查看历史 -``` -GET /api/admin/user/view/history -参数: - - userId: 用户ID - - page: 页码(默认1) - - limit: 每页数量(默认10) -``` - -返回数据: -```json -{ - "code": 200, - "data": { - "list": [ - { - "targetType": "room", - "targetId": "8", - "targetTitle": "火影忍者", - "viewDuration": 1200, - "createTime": "2026-01-03 14:25:00" - } - ], - "total": 1, - "page": 1, - "limit": 10 - } -} -``` - -### 3. 数据库表 - -**文件**: `user_activity_tables.sql` - -**新增表**: - -#### 3.1 直播间点赞记录表 (eb_live_room_like) -```sql -CREATE TABLE `eb_live_room_like` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `user_id` int(11) NOT NULL COMMENT '用户ID', - `room_id` varchar(50) NOT NULL COMMENT '直播间ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_user_room` (`user_id`, `room_id`) -); -``` - -#### 3.2 作品点赞记录表 (eb_work_like) -```sql -CREATE TABLE `eb_work_like` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `user_id` int(11) NOT NULL COMMENT '用户ID', - `work_id` bigint(20) NOT NULL COMMENT '作品ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_user_work` (`user_id`, `work_id`) -); -``` - -#### 3.3 心愿点赞记录表 (eb_wish_like) -```sql -CREATE TABLE `eb_wish_like` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `user_id` int(11) NOT NULL COMMENT '用户ID', - `wish_id` bigint(20) NOT NULL COMMENT '心愿ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `uk_user_wish` (`user_id`, `wish_id`) -); -``` - -#### 3.4 查看历史记录表 (eb_view_history) -```sql -CREATE TABLE `eb_view_history` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `user_id` int(11) NOT NULL COMMENT '用户ID', - `target_type` varchar(20) NOT NULL COMMENT '目标类型', - `target_id` varchar(50) NOT NULL COMMENT '目标ID', - `target_title` varchar(255) DEFAULT NULL COMMENT '目标标题', - `view_duration` int(11) DEFAULT 0 COMMENT '观看时长(秒)', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - KEY `idx_user_id` (`user_id`) -); -``` - -## 部署步骤 - -### 1. 创建数据库表 -```bash -mysql -u root -p zhibo < user_activity_tables.sql -``` - -### 2. 编译后端代码 -```bash -cd Zhibo/zhibo-h -mvn clean package -DskipTests -pl crmeb-admin -am -``` - -### 3. 重启后端服务 -```bash -cd /root/zhibo/Zhibo/zhibo-h/crmeb-admin -./restart.sh -``` - -### 4. 前端无需重新编译 -前端代码修改后,刷新浏览器即可看到新功能。 - -## 使用说明 - -### 1. 查看用户活动记录 - -1. 登录管理后台 -2. 进入"用户管理" -> "用户列表" -3. 点击某个用户的"详情"按钮 -4. 在弹出的抽屉中,可以看到新增的三个标签页: - - 关注记录 - - 点赞记录 - - 查看历史 - -### 2. 数据说明 - -**关注记录**: -- 显示用户关注了哪些人 -- 包含关注状态(已关注/已取消) -- 按关注时间倒序排列 - -**点赞记录**: -- 显示用户点赞的所有内容 -- 包含类型标签(直播间/作品/心愿) -- 按点赞时间倒序排列 - -**查看历史**: -- 显示用户的浏览记录 -- 包含观看时长 -- 按查看时间倒序排列 - -### 3. 数据收集 - -这些数据需要在应用中主动记录: - -**点赞记录**: -- 用户点赞直播间时,插入 `eb_live_room_like` 表 -- 用户点赞作品时,插入 `eb_work_like` 表 -- 用户点赞心愿时,插入 `eb_wish_like` 表 - -**查看历史**: -- 用户进入直播间时,记录到 `eb_view_history` 表 -- 用户查看作品时,记录到 `eb_view_history` 表 -- 用户访问他人主页时,记录到 `eb_view_history` 表 - -## 测试数据 - -可以使用以下 SQL 插入测试数据: - -```sql --- 插入点赞记录 -INSERT INTO eb_live_room_like (user_id, room_id, create_time) -VALUES (43, '8', '2026-01-03 14:30:00'); - --- 插入查看历史 -INSERT INTO eb_view_history (user_id, target_type, target_id, target_title, view_duration, create_time) -VALUES (43, 'room', '8', '火影忍者', 1200, '2026-01-03 14:25:00'); -``` - -## 注意事项 - -1. **性能优化**: - - 所有表都添加了索引,确保查询性能 - - 使用分页查询,避免一次加载过多数据 - -2. **数据一致性**: - - 点赞表使用唯一索引,防止重复点赞 - - 查看历史可以重复记录,用于统计观看次数 - -3. **扩展性**: - - 可以轻松添加更多类型的点赞记录 - - 查看历史支持多种目标类型 - -4. **隐私保护**: - - 只有管理员可以查看用户的活动记录 - - 前端用户无法查看其他用户的私密数据 - -## 后续优化建议 - -1. **数据统计**: - - 添加用户活跃度统计 - - 生成用户行为分析报告 - -2. **数据导出**: - - 支持导出用户活动记录为 Excel - - 用于数据分析和备份 - -3. **实时更新**: - - 使用 WebSocket 实时推送新的活动记录 - - 提升管理员的监控体验 - -4. **数据清理**: - - 定期清理过期的查看历史记录 - - 避免数据库膨胀 - -## 相关文件 - -- 前端页面: `Zhibo/admin/src/views/user/list/userDetails.vue` -- 后端控制器: `Zhibo/zhibo-h/crmeb-admin/src/main/java/com/zbkj/admin/controller/UserActivityController.java` -- 数据库脚本: `user_activity_tables.sql` -- 说明文档: `用户活动记录功能说明.md` diff --git a/直播IM系统开发指南.md b/直播IM系统开发指南.md deleted file mode 100644 index 9a665bd1..00000000 --- a/直播IM系统开发指南.md +++ /dev/null @@ -1,1600 +0,0 @@ -# 直播IM系统开发指南 - -> **版本**: v3.0 | **更新时间**: 2024年12月25日 | **维护状态**: 🟢 活跃开发中 - -## 📋 目录 - -- [项目概述](#项目概述) -- [系统架构](#系统架构) -- [核心模块](#核心模块) -- [开发任务清单](#开发任务清单) -- [技术实现要点](#技术实现要点) -- [部署配置](#部署配置) -- [测试要点](#测试要点) -- [常见问题](#常见问题) -- [开发进度](#开发进度) - ---- - -## 📖 项目概述 - -### 目标 - -搭建一个支持 **1-5万在线用户** 的直播+社交IM系统(单机部署) - -### 技术栈 - -- **后端框架**: Spring Boot -- **实时通信**: WebSocket (Netty) -- **数据库**: MySQL 8.0 -- **缓存**: Redis 6.0 -- **反向代理**: Nginx -- **开发语言**: Java 8+ - -### 核心场景 - -- ✅ 直播间实时弹幕(支持千人直播间) -- ✅ 用户一对一私聊 -- ✅ 好友关系管理 -- ✅ 礼物打赏(直播间+私聊) -- ✅ 多媒体消息(图片、语音、视频) -- ⚠️ 社交互动通知(部分完成) - -### 性能目标(单机) - -| 指标 | 目标值 | -|------|--------| -| WebSocket连接数 | 5万+ | -| 消息吞吐量 | 5000条/秒 | -| 接口响应时间 (P99) | <100ms | -| 直播间弹幕延迟 | <200ms | -| 系统可用性 | 99%+ | - ---- - -## 🏗️ 系统架构 - -### 整体架构图 - -``` -客户端 (Android/iOS/Web) - ↓ -Nginx (负载均衡 + WebSocket代理) - ↓ -Spring Boot应用 - ├── WebSocket服务 (Netty) - ├── HTTP API服务 - ├── 消息路由服务 - └── 业务逻辑服务 - ↓ -数据层 - ├── MySQL (持久化存储) - ├── Redis (缓存 + 在线状态 + 离线消息) - └── 文件存储 (本地/OSS) -``` - ---- - -## 🧩 核心模块 - -### 模块1:用户认证模块 ✅ - -**功能清单** -- ✅ 用户注册/登录 -- ✅ JWT Token生成与验证 -- ✅ Token刷新机制 -- ✅ 用户信息管理 - -**核心类** -- `LoginController` - 认证接口 -- `JwtUtil` - JWT工具类 -- `AuthService` - 认证业务逻辑 -- `UserService` - 用户管理 - ---- - -### 模块2:WebSocket连接管理模块 ✅ - -**功能清单** -- ✅ WebSocket连接建立 -- ✅ 用户在线状态管理 -- ✅ 心跳检测(30秒间隔) -- ✅ 断线重连处理 -- ✅ 连接映射维护(userId → WebSocket Session) - -**核心类** -- `WebSocketConfig` - WebSocket配置 -- `LiveChatHandler` - 直播间消息处理器 -- `PrivateChatHandler` - 私聊消息处理器 -- `HeartbeatScheduler` - 心跳检测定时任务 -- `OnlineStatusService` - 在线状态服务 - -**关键流程** - -| 事件 | 处理逻辑 | -|------|----------| -| 用户连接 | 保存连接 → 更新Redis在线状态 → 拉取离线消息 | -| 用户断开 | 移除连接 → 更新Redis状态 → 清理直播间在线列表 | -| 心跳超时 | 自动断开连接(90秒超时) | - ---- - -### 模块3:消息路由模块 ✅ - -**功能清单** -- ✅ 单聊消息路由(点对点) -- ✅ 群聊消息广播(直播间) -- ✅ 消息分发逻辑 -- ✅ 离线消息处理 - -**核心类** -- `MessageRouter` - 消息路由器(内置在Handler中) -- `MessageDispatcher` - 消息分发器(内置在Handler中) -- `LiveChatHandler` - 广播服务 -- `OfflineMessageService` - 离线消息服务 - -**路由策略** - -``` -单聊消息: - 查询接收者在线状态 - ├── 在线 → 通过WebSocket直接推送 - └── 离线 → 存入Redis离线消息队列 - -直播间消息: - 获取房间所有在线用户(Redis Set) - └── 批量异步推送(线程池处理) -``` - ---- - -### 模块4:消息存储模块 ✅ - -**功能清单** -- ✅ 消息持久化(MySQL) -- ✅ 消息缓存(Redis,7天TTL) -- ✅ 历史消息查询 -- ✅ 离线消息队列 -- ✅ 消息已读状态 - -**核心类** -- `LiveChatService` - 消息业务逻辑 -- `LiveChatDao` - 消息数据访问 -- `OfflineMessageService` - 消息缓存服务 -- `ConversationService` - 会话管理 - -**存储策略** - -| 存储层 | 用途 | 策略 | -|--------|------|------| -| MySQL | 持久化存储 | 所有消息先存MySQL | -| Redis | 热点缓存 | 7天TTL,加速查询 | -| Redis List | 离线消息 | 最多100条,7天过期 | -| 分页查询 | 历史消息 | 按时间倒序,20条/页 | - ---- - -### 模块5:好友关系模块 ✅ -**功能:** -- 添加好友(发送申请)✅ -- 处理好友申请(同意/拒绝)✅ -- 删除好友 ✅ -- 好友列表查询 ✅ -- 用户搜索 ✅ -- 好友在线状态 ✅ - -**已实现的类:** -- `FriendController` - 好友接口 ✅ - - 搜索用户 (GET /api/front/users/search) - - 发送好友请求 (POST /api/front/friends/request) - - 获取好友请求列表 (GET /api/front/friends/requests) - - 处理好友请求 (POST /api/front/friends/requests/{requestId}/handle) - - 获取好友列表 (GET /api/front/friends) - - 删除好友 (DELETE /api/front/friends/{friendId}) - -**业务流程:** -- 发送申请 → 保存申请记录 → 推送通知给对方 ✅ -- 同意申请 → 双向添加好友关系 → 推送通知 → 创建会话 ✅ -- 删除好友 → 删除好友关系 → 保留历史消息 ✅ - -**数据库表:** -- `eb_friend` - 好友关系表 ✅ -- `eb_friend_request` - 好友申请表 ✅ - ---- - -### 模块6:直播间管理模块 ✓ -**功能:** -- 进入直播间 ✓ -- 离开直播间 ✓ -- 直播间在线用户列表 ✓ -- 直播间弹幕发送 ✓ -- 直播间人数统计 ✓ - -**需要实现的类:** -- `LiveRoomController` - 直播间接口 ✓ -- `LiveRoomService` - 直播间业务逻辑 ✓ -- `RoomMemberService` - 房间成员管理 ✓ (内置在Handler中) -- `BarrageService` - 弹幕服务 ✓ (LiveChatService) - -**关键功能:** -- 进入房间:加入Redis Set、广播进入消息、返回房间信息 ✓ -- 发送弹幕:频率限制(1秒1条)⚠️、敏感词过滤 ⚠️、广播给所有人 ✓ -- 离开房间:从Redis Set移除、广播离开消息 ✓ - ---- - -### 模块7:礼物打赏模块 ✓ -**功能:** -- 礼物列表管理 ✓ -- 直播间送礼 ✓ -- 私聊送礼 ✓ -- 礼物记录查询 ✓ -- 余额扣除与收益增加 ✓ - -**需要实现的类:** -- `GiftController` - 礼物接口 ✓ -- `GiftService` - 礼物业务逻辑 ✓ -- `GiftRecordService` - 礼物记录服务 ✓ -- `RechargeOptionService` - 充值选项服务 ✓ -- `UserService` - 用户余额管理 ✓ (已有) -- `UserBillService` - 用户账单服务 ✓ (已有) - -**业务流程:** -- 验证余额 → 扣除金币 → 增加收益 → 保存记录 → 生成账单 → 返回结果 ✓ - -**数据库表:** -- `eb_gift` - 礼物表 ✓ -- `eb_gift_reward_record` - 礼物打赏记录表 ✓ -- `eb_gift_detail` - 送礼物明细表 ✓ -- `eb_gift_quantity` - 礼物数量列表(充值选项)✓ - -**API接口:** -- `GET /api/front/gift/list` - 获取礼物列表 ✓ -- `GET /api/front/gift/balance` - 获取用户余额 ✓ -- `POST /api/front/gift/send` - 赠送礼物 ✓ -- `GET /api/front/gift/recharge/options` - 获取充值选项 ✓ -- `POST /api/front/gift/recharge/create` - 创建充值订单 ✓ - -**文档:** -- 详细开发文档:`Zhibo/zhibo-h/礼物打赏模块开发说明.md` ✓ -- 快速开始指南:`Zhibo/zhibo-h/礼物打赏模块快速开始.md` ✓ -- 部署清单:`Zhibo/礼物打赏模块部署清单.md` ✓ - ---- - -### 模块8:多媒体消息模块 ✓ -**功能:** -- 图片上传与发送 ✓ -- 语音上传与发送 ✓ -- 视频上传与发送 ✓ -- 文件存储(本地/OSS)✓ -- 缩略图生成 ✓ - -**需要实现的类:** -- `UploadController` - 文件上传接口 ✓ (UserUploadController) -- `FileStorageService` - 文件存储服务 ✓ -- `ImageService` - 图片处理(压缩、缩略图)✓ -- `MediaMessageService` - 多媒体消息服务 ✓ - -**处理流程:** -- 客户端先上传文件 → 返回URL → 发送消息时带上URL和元信息 ✓ - ---- - -### 模块9:消息已读回执模块 ✓ -**功能:** -- 标记消息已读 ✓ -- 未读消息统计 ✓ -- 已读状态推送 ✓ -- 会话未读数更新 ✓ - -**需要实现的类:** -- `ReadReceiptService` - 已读回执服务 ✓ (内置在ConversationService中) -- `UnreadCountService` - 未读数统计 ✓ (内置在ConversationService中) - -**实现逻辑:** -- 用户查看消息 → 批量更新已读状态 → 推送已读回执给发送方 → 更新会话未读数 ✓ - ---- - -### 模块10:好友私聊消息模块 ✅ (已实现) -**功能:** -- 好友之间发送文本消息 ✅ -- 好友之间发送图片消息 ✅ -- 好友之间发送语音消息 ✅ -- 好友之间发送视频消息 ✅ -- 消息已读状态 ✅ -- 正在输入提示 ✅ -- 离线消息推送 ✅ - -**已实现的类:** -- `PrivateChatHandler` - 私聊WebSocket处理器 ✅ -- `ConversationService` - 会话服务 ✅ -- `ConversationController` - 会话接口 ✅ -- `OfflineMessageService` - 离线消息服务 ✅ - -**核心功能:** -- 通过WebSocket实现实时消息推送 ✅ -- 支持多设备同时在线 ✅ -- 自动保存离线消息 ✅ -- 消息已读回执 ✅ -- 正在输入状态同步 ✅ - -**WebSocket路径:** `/ws/chat/{conversationId}?userId={userId}` - -**消息类型:** -- `chat` - 聊天消息 -- `read` - 已读通知 -- `typing` - 正在输入 -- `new_message` - 新消息通知 - ---- - -### 模块11:群组聊天模块 ❌ (未实现) -**功能:** -- 撤回自己发送的消息(2分钟内)❌ -- 推送撤回通知 ❌ -- 更新消息状态 ❌ - -**需要实现的类:** -- `MessageRecallService` - 消息撤回服务 ❌ - -**撤回逻辑:** -- 验证权限和时间 → 更新消息状态 → 推送撤回通知 → 更新会话最后消息 ❌ - -**优先级:** 低 - 非核心功能 - ---- - -**功能:** -- 创建群组 ❌ -- 邀请成员加入群组 ❌ -- 群组消息发送 ❌ -- 群组消息广播 ❌ -- 群组成员管理 ❌ -- 群主/管理员权限 ❌ -- 群公告 ❌ -- @提醒功能 ❌ - -**需要实现的类:** -- `GroupChatHandler` - 群聊WebSocket处理器 ❌ -- `GroupService` - 群组服务 ❌ -- `GroupController` - 群组接口 ❌ -- `GroupMemberService` - 群成员服务 ❌ - -**数据库表:** -- `eb_group` - 群组表 ❌ -- `eb_group_member` - 群成员表 ❌ -- `eb_group_message` - 群消息表 ❌ - -**优先级:** 中 - 增强社交互动 -**预计工作量:** 4-5天 - ---- - -### 模块12:消息撤回模块 ❌ (未实现) -**功能:** -- 系统通知管理 ✅ (后台已实现) -- 点赞通知 ❌ -- 评论通知 ❌ -- 关注通知 ❌ -- @提醒通知 ❌ -- 系统公告 ⚠️ (基础功能已实现) - -**已实现的类:** -- `SystemNotificationController` - 系统通知接口 ✅ (后台管理) -- `SystemNotificationService` - 通知业务逻辑 ✅ -- `SystemNotification` - 通知实体 ✅ - -**待实现:** -- 前端通知推送接口 ❌ -- 实时推送服务 (WebSocket/FCM) ❌ -- 社交互动通知 (点赞、评论、关注) ❌ - -**优先级:** 中 - 增强用户体验 - ---- - -**功能:** -- 撤回自己发送的消息(2分钟内)❌ -- 推送撤回通知 ❌ -- 更新消息状态 ❌ - -**需要实现的类:** -- `MessageRecallService` - 消息撤回服务 ❌ - -**撤回逻辑:** -- 验证权限和时间 → 更新消息状态 → 推送撤回通知 → 更新会话最后消息 ❌ - -**优先级:** 低 - 非核心功能 -**预计工作量:** 1-2天 - ---- - -### 模块13:消息转发模块 ❌ (未实现) -**功能:** -- 转发消息给好友 ❌ -- 转发消息到群组 ❌ -- 批量转发 ❌ -- 转发历史记录 ❌ - -**需要实现的类:** -- `MessageForwardService` - 消息转发服务 ❌ - -**优先级:** 低 - 辅助功能 -**预计工作量:** 1-2天 - ---- - -### 模块14:语音/视频通话模块 ❌ (未实现) -**功能:** -- 一对一语音通话 ❌ -- 一对一视频通话 ❌ -- 通话邀请/接听/拒绝 ❌ -- 通话记录 ❌ -- 通话质量监控 ❌ - -**需要实现的类:** -- `CallService` - 通话服务 ❌ -- `CallController` - 通话接口 ❌ -- `CallSignalingHandler` - 信令WebSocket处理器 ❌ - -**技术方案:** -- 使用WebRTC实现音视频通话 -- 使用WebSocket传输信令 -- 可选:集成第三方服务(声网、腾讯云) - -**优先级:** 低 - 高级功能 -**预计工作量:** 5-7天 - ---- - -### 模块15:消息搜索模块 ❌ (未实现) -**功能:** -- 搜索聊天记录 ❌ -- 按时间范围搜索 ❌ -- 按消息类型搜索 ❌ -- 搜索结果高亮 ❌ - -**需要实现的类:** -- `MessageSearchService` - 消息搜索服务 ❌ - -**技术方案:** -- 使用MySQL全文索引 -- 或使用Elasticsearch - -**优先级:** 中 - 提升用户体验 -**预计工作量:** 2-3天 - ---- - -### 模块16:消息引用/回复模块 ❌ (未实现) -**功能:** -- 引用消息回复 ❌ -- 显示被引用的消息 ❌ -- 点击引用跳转到原消息 ❌ - -**需要实现的类:** -- 扩展现有的消息模型 ❌ - -**优先级:** 低 - 辅助功能 -**预计工作量:** 1-2天 - ---- - -### 模块17:消息表情回应模块 ❌ (未实现) -**功能:** -- 对消息添加表情回应 ❌ -- 查看谁回应了表情 ❌ -- 取消表情回应 ❌ - -**需要实现的类:** -- `MessageReactionService` - 消息回应服务 ❌ - -**数据库表:** -- `eb_message_reaction` - 消息回应表 ❌ - -**优先级:** 低 - 增强互动 -**预计工作量:** 1-2天 - ---- - -### 模块18:敏感词过滤模块 ❌ (未实现) -**功能:** -- 敏感词库管理 ❌ -- DFA算法过滤 ❌ -- 消息内容检测 ❌ - -**需要实现的类:** -- `SensitiveWordFilter` - 敏感词过滤器 ❌ -- `SensitiveWordService` - 敏感词管理 ❌ - -**过滤策略:** -- 使用DFA算法构建敏感词树 ❌ -- 消息发送前过滤 ❌ -- 替换为***或直接拒绝 ❌ - -**优先级:** 高 - 内容安全必需 -**建议:** 可先使用第三方内容审核API (如阿里云、腾讯云) - ---- - -### 模块19:限流防刷模块 ⚠️ (需完善) -**功能:** -- 消息发送频率限制 ❌ (未实现) -- 接口调用限流 ❌ (未实现) -- IP黑名单 ⚠️ (基础功能存在) -- 用户封禁 ⚠️ (基础功能存在) - -**需要实现的类:** -- `RateLimiterService` - 限流服务 ❌ -- `RateLimitInterceptor` - 限流拦截器 ❌ -- `RateLimitAspect` - 限流切面 ❌ - -**限流策略:** -- 使用Redis + 令牌桶算法 ❌ -- 弹幕:1秒1条 ❌ -- 私聊:1秒3条 ❌ -- 图片:1分钟10张 ❌ - -**优先级:** 高 - 防止恶意刷屏和攻击 -**建议:** 使用Redisson的RRateLimiter或Guava的RateLimiter - ---- - -## 三、开发任务清单(7天计划) - -### Day 1:基础架构 ✓ -- [x] 创建Spring Boot项目 ✓ -- [x] 配置MySQL、Redis连接 ✓ -- [x] 集成MyBatis-Plus ✓ -- [x] 实现JWT认证 ✓ -- [x] 实现用户注册/登录接口 ✓ - -### Day 2:WebSocket核心 ✓ -- [x] 配置WebSocket ✓ -- [x] 实现连接管理器 ✓ -- [x] 实现心跳检测 ⚠️ (需完善) -- [x] 实现在线状态管理 ✓ -- [x] 测试连接建立和断开 ✓ - -### Day 3:消息收发 ✅ -- [x] 实现单聊消息发送 ✅ -- [x] 实现消息路由逻辑 ✅ -- [x] 实现消息存储 ✅ -- [x] 实现离线消息 ✅ -- [x] 实现历史消息查询 ✅ - -### Day 4:直播间功能 ✓ -- [x] 实现进入/离开直播间 ✓ -- [x] 实现弹幕发送 ✓ -- [x] 实现弹幕广播 ✓ -- [x] 实现在线人数统计 ✓ -- [ ] 实现敏感词过滤 ❌ - -### Day 5:社交功能 ✅ -- [x] 实现好友申请/处理 ✅ -- [x] 实现好友列表 ✅ -- [x] 实现用户搜索 ✅ -- [x] 实现礼物打赏(直播间+私聊)✅ -- [x] 实现消息已读回执 ✅ -- [ ] 实现消息撤回 ❌ (非必需) - -### Day 6:多媒体消息 ✓ -- [x] 实现图片上传 ✓ -- [x] 实现语音上传 ✓ -- [x] 实现视频上传 ✓ -- [x] 实现多媒体消息发送 ✓ -- [ ] 实现通知推送 ❌ - -### Day 7:测试优化 ⚠️ -- [ ] 功能测试 ⚠️ (进行中) -- [ ] 压力测试 ❌ (未开始) -- [ ] 性能优化 ⚠️ (需完善) -- [ ] 部署上线 ⚠️ (需完善) -- [ ] 限流防刷 ❌ (待实现) -- [ ] 敏感词过滤 ❌ (待实现) - ---- - -## 四、关键技术实现要点 - -### 1. WebSocket消息格式(统一JSON) - -**客户端发送:** -```json -{ - "action": "sendMessage|sendBarrage|enterRoom|leaveRoom|heartbeat", - "data": { - // 具体数据 - } -} -``` - -**服务端推送:** -```json -{ - "type": "message|barrage|gift|notification|system", - "data": { - // 具体数据 - } -} -``` - -### 2. Redis数据结构设计(单机版) - -``` -在线用户:Hash -Key: online:users -Field: userId -Value: {sessionId, connectTime, lastHeartbeat} -TTL: 5分钟(心跳更新) - -直播间在线:Set -Key: room:online:{roomId} -Member: userId -TTL: 1小时 - -用户连接映射:String -Key: user:conn:{userId} -Value: sessionId -TTL: 5分钟 - -离线消息队列:List(限制长度)✅ -Key: offline:msg:{userId} -Value: [完整消息JSON1, 完整消息JSON2, ...] -LTRIM: 保留最新100条 -TTL: 7天 - -消息缓存:String (TTL=7天) -Key: msg:{msgId} -Value: JSON消息体 -TTL: 7天 - -会话未读数:Hash -Key: conversation:unread:{userId} -Field: conversationId -Value: unreadCount - -限流令牌桶:String -Key: ratelimit:{type}:{userId} -Value: tokens -TTL: 1秒 - -用户在线状态:String -Key: user:online:{userId} -Value: 1/0 -TTL: 5分钟 - -直播间人数统计:String -Key: room:viewers:{roomId} -Value: count -TTL: 1小时 - -热点数据缓存:String -Key: cache:{type}:{id} -Value: JSON数据 -TTL: 根据类型设置(用户信息1小时,直播间列表5分钟) -``` - -### 3. 消息路由核心逻辑(单机版) - -```java -// 单聊路由 -if (目标用户在线) { - 通过WebSocket直接推送 -} else { - 存入离线消息队列(Redis List) - 发送推送通知(可选) -} - -// 直播间广播 -获取房间所有在线用户(Redis Set) -for (每个用户) { - 异步推送消息(线程池处理) -} - -// 消息持久化(异步批量) -消息先放入内存队列(LinkedBlockingQueue) -定时任务(1秒一次)批量写入MySQL(200条/批) -写入失败重试3次,最终失败记录日志 -``` - -### 4. 性能优化关键点(单台服务器) - -**连接优化:** -- 使用Netty替代Spring WebSocket(性能提升3-5倍) -- 单机支持5-10万连接(8核16G配置) -- 系统参数优化(文件描述符、TCP参数) - -**消息优化:** -- 弹幕限流:1秒1条(Redis令牌桶) -- 批量入库:200条/批次(异步批量写入) -- 启用WebSocket压缩(减少50%流量) - -**存储优化:** -- 消息缓存7天(Redis) -- 历史消息分页查询(MySQL索引优化) -- 离线消息限制100条(Redis List) -- 热点数据缓存(本地缓存Caffeine + Redis) - -**广播优化:** -- 异步推送(线程池处理) -- 失败重试1次(避免阻塞) -- 单次超时100ms -- 大直播间分组推送(每组500人) - -**数据库优化:** -- 连接池优化(HikariCP) -- 索引优化(覆盖索引、联合索引) -- 慢查询优化 -- 定期清理历史数据 - -**缓存优化:** -- 二级缓存(Caffeine + Redis) -- 热点数据预加载 -- 缓存穿透防护(布隆过滤器) -- 合理设置过期时间 - -**网络优化:** -- CDN加速(图片、视频) -- 长连接复用 -- 心跳包优化(30秒一次) -- 消息压缩(Gzip) - ---- - -## 七、WebSocket消息类型 - -### 客户端发送 - -**直播间弹幕 (LiveChatHandler):** -- `heartbeat` - 心跳 -- `sendBarrage` - 发送弹幕 -- `enterRoom` - 进入直播间 -- `leaveRoom` - 离开直播间 -- `sendGift` - 送礼物 - -**私聊消息 (PrivateChatHandler):** -- `chat` - 发送聊天消息 - - `messageType`: text/image/voice/video -- `read` - 标记已读 -- `typing` - 正在输入 - -**待实现:** -- `recallMessage` - 撤回消息 ❌ -- `forwardMessage` - 转发消息 ❌ -- `replyMessage` - 引用回复 ❌ - -### 服务端推送 - -**直播间消息:** -- `barrage` - 弹幕消息 -- `gift` - 礼物消息 -- `enterRoom` - 进入房间通知 -- `leaveRoom` - 离开房间通知 -- `system` - 系统消息 - -**私聊消息:** -- `chat` - 聊天消息 -- `new_message` - 新消息通知 -- `read` - 已读回执 -- `typing` - 正在输入通知 -- `connected` - 连接成功 -- `error` - 错误消息 - -**待实现:** -- `recall` - 撤回通知 ❌ -- `forward` - 转发通知 ❌ -- `call_invite` - 通话邀请 ❌ -- `call_accept` - 通话接听 ❌ -- `call_reject` - 通话拒绝 ❌ - ---- - -## 八、部署配置(单台服务器优化版) - -### 服务器配置建议 - -**推荐配置(支持5-10万用户):** -- CPU:8核或16核 -- 内存:16G或32G -- 硬盘:SSD 500G -- 带宽:20M或更高 -- 系统:CentOS 7.9 / Ubuntu 20.04 -- 软件:JDK 11+、MySQL 8.0、Redis 6.0、Nginx - -**最低配置(支持3-5万用户):** -- CPU:4核 -- 内存:8G -- 硬盘:SSD 200G -- 带宽:10M -- 系统:CentOS 7.9 / Ubuntu 20.04 - -**成本估算:** 约500-1500元/月(云服务器) - -### 应用配置(生产环境) - -```yaml -server: - port: 8080 - tomcat: - threads: - max: 300 - min-spare: 50 - max-connections: 10000 - accept-count: 500 - -spring: - # MySQL配置 - datasource: - url: jdbc:mysql://localhost:3306/im_system?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8 - username: root - password: your_password - hikari: - maximum-pool-size: 50 - minimum-idle: 10 - connection-timeout: 30000 - idle-timeout: 600000 - max-lifetime: 1800000 - - # Redis配置 - redis: - host: localhost - port: 6379 - password: your_redis_password - database: 0 - lettuce: - pool: - max-active: 100 - max-idle: 20 - min-idle: 5 - max-wait: 3000 - timeout: 3000 - -jwt: - secret: your-secret-key-change-in-production-min-32-chars - expiration: 604800000 # 7天 - -# WebSocket配置(使用Netty) -netty: - websocket: - port: 9090 - boss-threads: 1 - worker-threads: 8 - max-frame-size: 65536 - heartbeat-interval: 30000 # 30秒 - heartbeat-timeout: 90000 # 90秒 - max-connections: 100000 # 最大连接数 - -# 消息配置 -message: - batch-size: 200 # 批量入库大小 - batch-timeout: 1000 # 批量超时时间(ms) - -# 限流配置 -rate-limit: - barrage: - rate: 1 # 弹幕:1条/秒 - capacity: 5 # 令牌桶容量 - private-message: - rate: 3 # 私聊:3条/秒 - capacity: 10 - image-upload: - rate: 10 # 图片:10张/分钟 - capacity: 20 - -# 文件上传配置 -upload: - path: /data/upload - max-size: 10485760 # 10MB - image-max-size: 5242880 # 5MB - video-max-size: 104857600 # 100MB - -# 缓存配置 -cache: - caffeine: - user-info: - max-size: 10000 - expire-after-write: 3600 # 1小时 - room-info: - max-size: 5000 - expire-after-write: 300 # 5分钟 -``` - -### 系统优化配置 - -**1. Linux系统参数优化(/etc/sysctl.conf)** -```bash -# 增加文件描述符限制 -fs.file-max = 1000000 - -# TCP优化 -net.ipv4.tcp_max_syn_backlog = 8192 -net.core.somaxconn = 8192 -net.core.netdev_max_backlog = 8192 -net.ipv4.tcp_tw_reuse = 1 -net.ipv4.tcp_fin_timeout = 30 - -# 应用后执行 -sysctl -p -``` - -**2. 用户限制优化(/etc/security/limits.conf)** -```bash -* soft nofile 100000 -* hard nofile 100000 -* soft nproc 100000 -* hard nproc 100000 -``` - -**3. MySQL优化(my.cnf)** -```ini -[mysqld] -# 连接数 -max_connections = 500 - -# 缓冲池大小(建议设置为内存的50-70%) -innodb_buffer_pool_size = 8G - -# 日志文件大小 -innodb_log_file_size = 512M - -# 查询缓存 -query_cache_size = 128M -query_cache_type = 1 - -# 慢查询日志 -slow_query_log = 1 -long_query_time = 2 -``` - -**4. Redis优化(redis.conf)** -```ini -# 最大内存(建议设置为物理内存的50%) -maxmemory 8gb - -# 淘汰策略 -maxmemory-policy allkeys-lru - -# 持久化(根据需求选择) -save 900 1 -save 300 10 -save 60 10000 - -# AOF持久化(可选) -appendonly yes -appendfsync everysec -``` - -### Nginx配置(WebSocket代理) - -```nginx -upstream websocket_backend { - server 127.0.0.1:9090; -} - -upstream http_backend { - server 127.0.0.1:8080; -} - -server { - listen 80; - server_name yourdomain.com; - - # WebSocket代理 - location /ws/ { - proxy_pass http://websocket_backend; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_connect_timeout 60s; - proxy_send_timeout 300s; - proxy_read_timeout 300s; - } - - # HTTP API代理 - location /api/ { - proxy_pass http://http_backend; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_connect_timeout 10s; - proxy_send_timeout 30s; - proxy_read_timeout 30s; - } - - # 静态文件 - location /upload/ { - alias /data/upload/; - expires 30d; - } -} -``` - ---- - -## 九、测试要点(单台服务器) - -### 功能测试 -- [ ] 用户登录注册 -- [ ] WebSocket连接建立 -- [ ] 单聊消息收发 -- [ ] 直播间弹幕 -- [ ] 好友申请处理 -- [ ] 礼物打赏 -- [ ] 图片/语音消息 -- [ ] 消息已读 -- [ ] 消息撤回 -- [ ] 离线消息 - -### 性能测试(使用JMeter/Gatling) - -**1. 连接压测** -- [ ] 连接数:5000(目标达成) -- [ ] 连接数:10000(目标达成) -- [ ] 连接数:50000(挑战目标) -- [ ] 连接建立速度:500连接/秒 -- [ ] 连接稳定性:24小时不断线 - -**2. 消息吞吐量测试** -- [ ] 吞吐量:1000条/秒 -- [ ] 吞吐量:3000条/秒 -- [ ] 吞吐量:5000条/秒(目标) -- [ ] 弹幕广播延迟:P99 < 200ms -- [ ] 私聊消息延迟:P99 < 100ms - -**3. 接口性能测试** -- [ ] 登录接口:QPS 500+,响应时间 < 50ms -- [ ] 消息列表:QPS 1000+,响应时间 < 100ms -- [ ] 好友列表:QPS 800+,响应时间 < 80ms -- [ ] 直播间列表:QPS 1500+,响应时间 < 100ms - -**4. 数据库压测** -- [ ] MySQL读QPS:2000+ -- [ ] MySQL写QPS:1000+ -- [ ] Redis读QPS:10000+ -- [ ] Redis写QPS:5000+ - -**5. 稳定性测试** -- [ ] 24小时压测 -- [ ] 内存泄漏检测 -- [ ] CPU使用率 < 70% -- [ ] 内存使用率 < 80% - -### 压测工具推荐 -- **JMeter**: HTTP接口压测 -- **Gatling**: WebSocket压测 -- **wrk**: 轻量级HTTP压测 - ---- - -## 十、常见问题处理(单台服务器) - -### 1. 消息丢失怎么办? -- 实现消息ACK确认机制(客户端确认收到) -- 离线消息队列保底(Redis List) -- 客户端重发机制(3次重试) -- 数据库最终一致性(异步入库) - -### 2. 直播间消息风暴? -- 消息限流(1秒1条,Redis令牌桶) -- 超过阈值丢弃(保护服务器) -- 降级策略(高峰期只推送重要消息) -- 大直播间分组推送(每组500人) - -### 3. 单机性能瓶颈? -- 优化代码(减少不必要的计算) -- 使用Netty替代Spring WebSocket -- 启用本地缓存(Caffeine) -- 数据库连接池优化 -- Redis连接池优化 -- 考虑升级服务器配置 - -### 4. 如何保证消息顺序? -- 单聊:按时间戳排序(客户端排序) -- 直播间:不保证严格顺序(可接受) -- 重要消息:使用消息ID递增(数据库自增ID) - -### 5. WebSocket连接频繁断开? -- 增加心跳间隔(30秒) -- 客户端自动重连(指数退避) -- Nginx超时时间调整(300秒) -- 检查网络质量(弱网优化) - -### 6. Redis内存不足? -- 设置过期时间(消息7天过期) -- 淘汰策略(LRU) -- 定期清理冷数据 -- 考虑增加内存 - -### 7. MySQL慢查询? -- 添加索引(覆盖索引、联合索引) -- 优化SQL语句 -- 分页查询(避免全表扫描) -- 缓存热点数据(Redis) - -### 8. 如何监控系统健康? -- 日志监控(查看错误日志) -- 性能监控(CPU、内存、网络) -- 连接数监控(WebSocket连接数) -- 慢查询监控(MySQL慢查询日志) - -### 9. 成本优化建议 -- 使用云服务器按量付费 -- CDN加速(减少带宽成本) -- 数据压缩(减少存储成本) -- 冷数据归档(对象存储) - ---- - ---- - -## 十一、扩展性设计(未来扩展到更大规模) - -如果未来需要支持10万+甚至50万用户,可以考虑以下升级方案: - -### 1. 集群部署 -- 多台WebSocket服务器(3-5台) -- Nginx负载均衡(IP Hash策略) -- 使用RabbitMQ实现跨服务器消息转发 - -### 2. 数据库优化 -- MySQL读写分离(1主2从) -- 分库分表(按用户ID取模) -- 使用分布式数据库(TiDB) - -### 3. 缓存优化 -- Redis Cluster(3主3从) -- 本地缓存+Redis二级缓存 -- 缓存预热 - -### 4. 监控告警 -- Prometheus + Grafana -- ELK日志分析 -- 实时告警系统 - ---- - -**文档版本:** v3.0 -**适用对象:** Java后端开发者 -**开发周期:** 2周(含测试优化) -**用户规模:** 5-10万(单台服务器) - - ---- - -## 📊 开发进度总结 - -### 已完成模块 ✅ - -1. **用户认证模块** ✅ - - 登录、注册、验证码功能完整 - - JWT Token生成与验证 - - Token刷新机制 - -2. **用户资料模块** ✅ - - 用户信息管理、头像上传 - - 个人资料修改 - - 手机号换绑 - -3. **直播间模块** ✅ - - 直播间列表、详情、创建、删除 - - SRS推流回调集成 - - 直播间在线人数统计 - -4. **消息聊天模块** ✅ - - 私信会话列表、消息发送接收 - - WebSocket实时通信 - - 会话搜索功能 - - 消息已读状态 - -5. **直播间弹幕模块** ✅ - - 弹幕发送、接收、广播 - - WebSocket实时推送 - - 进入/离开房间通知 - -6. **多媒体消息模块** ✅ - - 图片、语音、视频上传 - - 文件存储服务 (本地/OSS/COS/七牛云) - - 图片压缩和缩略图 - -7. **礼物打赏模块** ✅ - - 礼物列表管理 - - 礼物赠送功能(完整事务处理) - - 用户余额管理 - - 充值选项配置 - - 账单记录生成 - - 支持直播间和私聊场景 - -8. **在线状态模块** ✅ - - 用户在线状态管理 - - 心跳检测机制 (30秒间隔) - - 超时自动断开 (90秒) - -9. **离线消息模块** ✅ - - 离线消息存储 (Redis + MySQL) - - 消息推送机制 - - 离线消息拉取 - -10. **好友关系模块** ✅ - - 用户搜索功能 - - 好友申请/处理 - - 好友列表查询 - - 删除好友 - - 好友在线状态 - -11. **好友私聊消息模块** ✅ - - 好友之间实时消息 - - 多媒体消息支持 - - 消息已读状态 - - 正在输入提示 - - 离线消息推送 - - 用户搜索功能 - - 好友申请/处理 - - 好友列表查询 - - 删除好友 - - 好友在线状态 - -### 待完成的IM通信模块 ❌ - -1. **群组聊天模块** ❌ (未实现) - - 创建群组、邀请成员 ❌ - - 群组消息发送与广播 ❌ - - 群组成员管理 ❌ - - 群主/管理员权限 ❌ - - **优先级:** 中 - - **预计工作量:** 4-5天 - -2. **消息撤回模块** ❌ (未实现) - - 撤回消息(2分钟内)❌ - - 推送撤回通知 ❌ - - **优先级:** 低 - - **预计工作量:** 1-2天 - -3. **消息转发模块** ❌ (未实现) - - 转发消息给好友/群组 ❌ - - 批量转发 ❌ - - **优先级:** 低 - - **预计工作量:** 1-2天 - -4. **语音/视频通话模块** ❌ (未实现) - - 一对一语音/视频通话 ❌ - - 通话邀请/接听/拒绝 ❌ - - 通话记录 ❌ - - **优先级:** 低 - - **预计工作量:** 5-7天 - - **技术方案:** WebRTC或第三方SDK - -5. **消息搜索模块** ❌ (未实现) - - 搜索聊天记录 ❌ - - 按时间/类型搜索 ❌ - - **优先级:** 中 - - **预计工作量:** 2-3天 - -6. **消息引用/回复模块** ❌ (未实现) - - 引用消息回复 ❌ - - 跳转到原消息 ❌ - - **优先级:** 低 - - **预计工作量:** 1-2天 - -7. **消息表情回应模块** ❌ (未实现) - - 对消息添加表情回应 ❌ - - 查看回应列表 ❌ - - **优先级:** 低 - - **预计工作量:** 1-2天 - -### 待完成的业务功能模块 ❌ - -8. **作品管理模块** ❌ (未实现) - - 作品发布、编辑、删除 ❌ - - 作品列表查询 ❌ - - 作品点赞、收藏 ❌ - - **优先级:** 中 - - **预计工作量:** 3-4天 - -9. **评论功能模块** ❌ (未实现) - - 评论发布、回复 ❌ - - 评论列表查询 ❌ - - 评论点赞 ❌ - - **优先级:** 中 - - **预计工作量:** 2-3天 - - **注意:** 商品评论已实现,但作品评论未实现 - -10. **社交功能模块** ⚠️ (部分实现) - - 关注/取消关注 ❌ - - 粉丝列表 ❌ - - 关注列表 ❌ - - 好友管理 ✅ (已完成) - - **优先级:** 高 - - **预计工作量:** 2-3天 - -11. **搜索功能模块** ⚠️ (部分实现) - - 用户搜索 ✅ (已完成) - - 直播间搜索 ❌ - - 作品搜索 ❌ - - 搜索历史 ❌ - - 热门搜索 ❌ - - **优先级:** 中 - - **预计工作量:** 2-3天 - -12. **分类管理模块** ⚠️ (基础功能存在) - - 分类列表 ⚠️ (商品分类已实现) - - 直播间分类 ❌ - - 作品分类 ❌ - - 分类筛选 ❌ - - **优先级:** 低 - - **预计工作量:** 1-2天 - -13. **通知推送模块** ⚠️ (部分实现) - - 系统通知 ⚠️ (后台管理已实现) - - 前端通知接口 ❌ - - 实时推送 (WebSocket) ❌ - - FCM集成 ❌ - - 推送历史 ❌ - - **优先级:** 中 - - **预计工作量:** 3-4天 - -14. **支付集成模块** ⚠️ (部分实现) - - 微信支付 ✅ (已实现) - - 支付宝支付 ❌ - - 充值功能 ✅ (已实现) - - 支付回调处理 ✅ (已实现) - - 礼物充值 ✅ (已实现) - - **优先级:** 高 (礼物打赏需要) - - **预计工作量:** 2-3天 (仅支付宝) - -15. **限流防刷模块** ❌ (未实现) - - 消息发送频率限制 ❌ - - 接口调用限流 ❌ - - 防刷机制 ❌ - - **优先级:** 高 - - **预计工作量:** 2-3天 - -16. **敏感词过滤模块** ❌ (未实现) - - 敏感词库管理 ❌ - - 内容过滤 ❌ - - **优先级:** 高 - - **预计工作量:** 2-3天 - -### 完成度统计 - -- **已完成模块**: 11个 -- **部分完成模块**: 4个 -- **未完成IM通信模块**: 7个 -- **未完成业务功能模块**: 9个 -- **总体完成度**: 约 55% - -**IM核心功能完成度**: 约 75% -- 一对一私聊 ✅ -- 直播间弹幕 ✅ -- 离线消息 ✅ -- 群组聊天 ❌ -- 语音/视频通话 ❌ - -**业务功能完成度**: 约 60% - -### 核心功能完成度 - -- **直播核心功能**: 95% ✅ - - 直播间管理 ✅ - - 弹幕系统 ✅ - - 礼物打赏 ✅ - - 推流集成 ✅ - - 在线人数统计 ✅ - - **缺失**: 限流防刷 ❌ - -- **社交功能**: 70% ⚠️ - - 私信聊天 ✅ - - 在线状态 ✅ - - 好友管理 ✅ - - 用户搜索 ✅ - - 关注功能 ❌ - - 评论功能 ❌ - -- **用户系统**: 90% ✅ - - 认证登录 ✅ - - 资料管理 ✅ - - 余额管理 ✅ - - 账单记录 ✅ - - 充值功能 ✅ - - **缺失**: 支付宝支付 ❌ - -- **内容管理**: 35% ⚠️ - - 多媒体上传 ✅ - - 作品管理 ❌ - - 分类管理 ⚠️ (商品分类已实现) - - 搜索功能 ⚠️ (用户搜索已实现) - -- **安全防护**: 20% ❌ - - 限流防刷 ❌ - - 敏感词过滤 ❌ - - IP黑名单 ⚠️ - - 用户封禁 ⚠️ - -### 最新更新 - -**2024年12月25日 - 系统功能完成度分析** - -**已完成的核心功能:** -- ✅ 用户认证与资料管理 (90%) -- ✅ 直播间管理与弹幕系统 (95%) -- ✅ 私信聊天与会话管理 (100%) -- ✅ 好友关系管理 (100%) -- ✅ 礼物打赏系统 (100%) -- ✅ 多媒体消息 (100%) -- ✅ 在线状态与心跳检测 (100%) -- ✅ 离线消息处理 (100%) -- ✅ WebSocket实时通信 (100%) - -**待完成的重要功能:** -- ❌ 限流防刷机制 (0%) - **高优先级** -- ❌ 敏感词过滤 (0%) - **高优先级** -- ❌ 关注/粉丝功能 (0%) - **高优先级** -- ❌ 作品管理 (0%) - **中优先级** -- ❌ 评论功能 (0%) - **中优先级** -- ❌ 搜索功能 (30%) - **中优先级** -- ❌ 通知推送 (20%) - **中优先级** - -**技术债务:** -- 需要添加限流防刷机制保护系统 -- 需要实现敏感词过滤保证内容安全 -- 需要完善错误处理和日志记录 -- 需要进行性能测试和优化 - -### 下一步开发计划 - -**第一阶段:IM核心功能完善 (2-3周) - 高优先级** - -1. **群组聊天模块** ❌ - - 创建群组、邀请成员 - - 群组消息发送与广播 - - 群组成员管理 - - 群主/管理员权限 - - **预计工作量**: 4-5天 - -2. **消息搜索模块** ❌ - - 搜索聊天记录 - - 按时间/类型搜索 - - **预计工作量**: 2-3天 - -3. **消息撤回模块** ❌ - - 撤回消息(2分钟内) - - 推送撤回通知 - - **预计工作量**: 1-2天 - -**第二阶段:安全与稳定性 (1-2周) - 高优先级** - -4. **限流防刷机制** ⚠️ - - 实现消息发送频率限制 - - 实现接口调用限流 - - 防止恶意刷屏和攻击 - - **预计工作量**: 2-3天 - -5. **敏感词过滤** ⚠️ - - 实现敏感词库管理 - - 实现内容过滤机制 - - 保证内容安全 - - **预计工作量**: 2-3天 - -6. **性能测试与优化** ⚠️ - - 压力测试 - - 性能瓶颈分析 - - 数据库优化 - - **预计工作量**: 3-5天 - -**第三阶段:社交功能完善 (1-2周) - 高优先级** - -7. **关注/粉丝功能** ❌ - - 关注/取消关注 - - 粉丝列表 - - 关注列表 - - **预计工作量**: 2-3天 - -8. **支付宝支付集成** ❌ - - 支付宝SDK集成 - - 支付回调处理 - - **预计工作量**: 2-3天 - -**第四阶段:内容管理 (2-3周) - 中优先级** - -9. **作品管理模块** ❌ - - 作品发布、编辑、删除 - - 作品列表查询 - - 作品点赞、收藏 - - **预计工作量**: 3-4天 - -10. **评论功能模块** ❌ - - 评论发布、回复 - - 评论列表查询 - - 评论点赞 - - **预计工作量**: 2-3天 - -11. **搜索功能完善** ⚠️ - - 直播间搜索 - - 作品搜索 - - 搜索历史 - - 热门搜索 - - **预计工作量**: 2-3天 - -**第五阶段:辅助功能 (2-3周) - 低优先级** - -12. **通知推送完善** ⚠️ - - 前端通知接口 - - 实时推送 (WebSocket) - - FCM集成 - - **预计工作量**: 3-4天 - -13. **分类管理** ⚠️ - - 直播间分类 - - 作品分类 - - 分类筛选 - - **预计工作量**: 1-2天 - -14. **消息转发模块** ❌ - - 转发消息给好友/群组 - - **预计工作量:** 1-2天 - -15. **消息引用/回复模块** ❌ - - 引用消息回复 - - **预计工作量:** 1-2天 - -16. **消息表情回应模块** ❌ - - 对消息添加表情回应 - - **预计工作量:** 1-2天 - -17. **语音/视频通话模块** ❌ (可选) - - 一对一语音/视频通话 - - **预计工作量:** 5-7天 - - **技术方案:** WebRTC或第三方SDK - -**总预计开发时间**: 8-12周 - ---- - -## 📊 项目状态总结 - -### 可以投入使用的IM功能 ✅ -- 用户注册登录 -- 直播间管理与观看 -- 实时弹幕聊天 -- **好友一对一私聊** (文本/图片/语音/视频) -- 好友管理 -- 礼物打赏 -- 多媒体消息 -- 在线状态 -- 消息已读状态 -- 正在输入提示 -- 离线消息推送 - -### 需要补充的IM功能 ⚠️ -- **群组聊天** - 多人聊天场景 -- **消息搜索** - 查找历史消息 -- **消息撤回** - 撤回错误消息 -- **限流防刷** - 防止恶意攻击 -- **敏感词过滤** - 内容安全 - -### 可选的高级IM功能 (低优先级) -- 消息转发 -- 消息引用/回复 -- 消息表情回应 -- 语音/视频通话 - -### 建议开发顺序 -1. **优先完善IM核心功能**(群组聊天、消息搜索、消息撤回) -2. **然后完善安全防护**(限流、敏感词) -3. **再进行性能测试和优化** -4. **接着开发社交功能**(关注、评论) -5. **最后完善辅助功能**(搜索、通知、高级IM功能) - ---- - -**最后更新时间**: 2024年12月25日 -**当前版本**: v1.0 -**维护状态**: 🟢 活跃开发中 -**核心功能完成度**: 85% -**整体完成度**: 65% diff --git a/直播IM系统技术方案.md b/直播IM系统技术方案.md deleted file mode 100644 index 82967aae..00000000 --- a/直播IM系统技术方案.md +++ /dev/null @@ -1,1515 +0,0 @@ -# 直播IM系统技术方案 - -## 一、项目概述 - -### 1.1 项目目标 -搭建一个面向直播场景的即时通讯系统,支持1-10万用户规模,一周内完成MVP版本交付。 - -### 1.2 核心场景 - -**直播场景** -- 直播间实时弹幕 -- 主播与观众互动消息 -- 直播间礼物打赏 -- 进入/离开直播间通知 - -**社交交友场景** -- 用户一对一私聊 -- 好友申请与通知 -- 私聊礼物赠送 -- 语音消息发送 -- 图片/视频分享 -- 表情包发送 -- 消息已读/未读状态 - -**互动场景** -- 作品评论通知 -- 点赞通知 -- 关注/粉丝通知 -- @提醒通知 -- 系统公告推送 - -### 1.3 技术选型原则 -- 快速开发,优先使用成熟方案 -- 架构简单,便于维护和扩展 -- 成本可控,适合初期规模 - ---- - -## 二、系统架构设计 - -### 2.1 整体架构 - -``` -客户端层(Android App) - ↓ -API网关层(Nginx) - ↓ -业务服务层 - ├── IM服务(WebSocket/长连接) - ├── REST API服务(HTTP) - └── 消息推送服务 - ↓ -数据存储层 - ├── MySQL(用户数据、消息记录) - ├── Redis(在线状态、消息缓存) - └── MongoDB(可选,消息归档) -``` - -### 2.2 核心模块 - -#### 2.2.1 连接管理模块 -- WebSocket长连接维护 -- 心跳检测(30秒间隔) -- 断线重连机制 -- 在线状态管理 - -#### 2.2.2 消息路由模块 -- 单聊消息路由 -- 群聊(直播间)消息广播 -- 消息优先级队列 -- 消息去重 - -#### 2.2.3 消息存储模块 -- 离线消息存储 -- 历史消息查询 -- 消息已读状态 -- 消息漫游(7天) - -#### 2.2.4 业务功能模块 -- 弹幕发送与接收 -- 礼物打赏消息(直播间+私聊) -- 好友关系管理 -- 消息已读回执 -- 语音消息处理 -- 图片/视频消息 -- 系统通知 -- 敏感词过滤 -- 消息撤回 - ---- - -## 三、技术实现方案 - -### 3.1 通信协议选择 - -#### 方案一:WebSocket(推荐) -**优点:** -- 双向实时通信 -- 浏览器原生支持 -- 开发简单,调试方便 -- 适合直播弹幕场景 - -**实现:** -``` -协议:ws:// 或 wss://(生产环境必须用wss) -框架:Spring Boot + Spring WebSocket -心跳:客户端30秒发送ping,服务端响应pong -``` - -#### 方案二:MQTT(备选) -**优点:** -- 轻量级协议 -- 支持QoS消息质量保证 -- 适合物联网和移动场景 - -**缺点:** -- 需要额外的Broker(如Mosquitto、EMQ) -- 学习成本稍高 - -**建议:** 一周交付选WebSocket,后期可扩展MQTT - -### 3.2 消息格式设计 - -#### 3.2.1 通用消息结构(JSON) -```json -{ - "msgId": "uuid", - "msgType": "text|image|gift|system|barrage", - "fromUserId": "发送者ID", - "toUserId": "接收者ID(私聊)", - "roomId": "直播间ID(弹幕)", - "content": "消息内容", - "timestamp": 1640000000000, - "extra": { - "nickname": "用户昵称", - "avatar": "头像URL", - "giftId": "礼物ID(打赏消息)", - "giftCount": 1 - } -} -``` - -#### 3.2.2 消息类型定义 -| 类型 | 说明 | 场景 | -|------|------|------| -| text | 文本消息 | 私聊、弹幕 | -| image | 图片消息 | 私聊 | -| video | 视频消息 | 私聊 | -| voice | 语音消息 | 私聊 | -| emoji | 表情包消息 | 私聊 | -| gift | 礼物打赏 | 直播间、私聊 | -| barrage | 弹幕 | 直播间 | -| system | 系统通知 | 全局 | -| friend_request | 好友申请 | 社交 | -| friend_accept | 好友通过 | 社交 | -| like | 点赞通知 | 社交 | -| comment | 评论通知 | 社交 | -| follow | 关注通知 | 社交 | -| at_mention | @提醒 | 社交 | -| enter_room | 进入直播间 | 直播间 | -| leave_room | 离开直播间 | 直播间 | -| recall | 消息撤回 | 私聊 | - -### 3.3 数据库设计 - -#### 3.3.1 MySQL表结构 - -**用户表(user)** -```sql -CREATE TABLE `user` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `username` VARCHAR(50) UNIQUE NOT NULL, - `nickname` VARCHAR(50), - `avatar` VARCHAR(255), - `status` TINYINT DEFAULT 1 COMMENT '1-正常 0-禁用', - `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - INDEX idx_username (username) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -**会话表(conversation)** -```sql -CREATE TABLE `conversation` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `user_id` BIGINT NOT NULL, - `target_id` BIGINT NOT NULL COMMENT '对方用户ID或直播间ID', - `type` TINYINT NOT NULL COMMENT '1-单聊 2-直播间', - `last_msg_id` BIGINT, - `last_msg_time` DATETIME, - `unread_count` INT DEFAULT 0, - `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - INDEX idx_user_id (user_id), - UNIQUE KEY uk_user_target (user_id, target_id, type) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -**消息表(message)** -```sql -CREATE TABLE `message` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `msg_id` VARCHAR(64) UNIQUE NOT NULL, - `msg_type` VARCHAR(20) NOT NULL, - `from_user_id` BIGINT NOT NULL, - `to_user_id` BIGINT COMMENT '私聊接收者', - `room_id` BIGINT COMMENT '直播间ID', - `content` TEXT, - `extra` JSON COMMENT '扩展字段(图片URL、语音时长、礼物信息等)', - `status` TINYINT DEFAULT 1 COMMENT '1-正常 2-撤回 3-删除', - `is_read` TINYINT DEFAULT 0 COMMENT '0-未读 1-已读', - `read_at` DATETIME COMMENT '已读时间', - `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - INDEX idx_from_user (from_user_id, created_at), - INDEX idx_to_user (to_user_id, created_at), - INDEX idx_room (room_id, created_at), - INDEX idx_msg_id (msg_id), - INDEX idx_unread (to_user_id, is_read) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -**好友关系表(friend)** -```sql -CREATE TABLE `friend` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `user_id` BIGINT NOT NULL, - `friend_id` BIGINT NOT NULL, - `remark` VARCHAR(50) COMMENT '好友备注', - `status` TINYINT DEFAULT 1 COMMENT '1-正常 2-拉黑', - `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY uk_user_friend (user_id, friend_id), - INDEX idx_user_id (user_id), - INDEX idx_friend_id (friend_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -**好友申请表(friend_request)** -```sql -CREATE TABLE `friend_request` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `from_user_id` BIGINT NOT NULL, - `to_user_id` BIGINT NOT NULL, - `message` VARCHAR(200) COMMENT '申请留言', - `status` TINYINT DEFAULT 0 COMMENT '0-待处理 1-已同意 2-已拒绝', - `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - INDEX idx_to_user (to_user_id, status), - INDEX idx_from_user (from_user_id), - UNIQUE KEY uk_from_to (from_user_id, to_user_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -**礼物记录表(gift_record)** -```sql -CREATE TABLE `gift_record` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `from_user_id` BIGINT NOT NULL COMMENT '送礼者', - `to_user_id` BIGINT NOT NULL COMMENT '收礼者', - `gift_id` INT NOT NULL, - `gift_name` VARCHAR(50), - `gift_price` INT NOT NULL COMMENT '礼物价格(金币)', - `count` INT DEFAULT 1 COMMENT '数量', - `total_price` INT NOT NULL COMMENT '总价', - `room_id` BIGINT COMMENT '直播间ID(直播间送礼)', - `scene` VARCHAR(20) NOT NULL COMMENT 'live-直播间 chat-私聊', - `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - INDEX idx_from_user (from_user_id, created_at), - INDEX idx_to_user (to_user_id, created_at), - INDEX idx_room (room_id, created_at) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -**直播间表(live_room)** -```sql -CREATE TABLE `live_room` ( - `id` BIGINT PRIMARY KEY AUTO_INCREMENT, - `room_id` VARCHAR(50) UNIQUE NOT NULL, - `anchor_id` BIGINT NOT NULL COMMENT '主播ID', - `title` VARCHAR(100), - `cover` VARCHAR(255), - `status` TINYINT DEFAULT 1 COMMENT '1-直播中 0-已结束', - `online_count` INT DEFAULT 0, - `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - INDEX idx_anchor (anchor_id), - INDEX idx_status (status) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -``` - -#### 3.3.2 Redis数据结构 - -**在线用户(Hash)** -``` -Key: online:users -Field: userId -Value: {serverId, connectTime, lastHeartbeat} -``` - -**直播间在线列表(Set)** -``` -Key: room:online:{roomId} -Member: userId -``` - -**用户连接映射(String)** -``` -Key: user:connection:{userId} -Value: {serverId, sessionId} -``` - -**离线消息队列(List)** -``` -Key: offline:msg:{userId} -Value: [msgId1, msgId2, ...] -``` - -**消息缓存(String,TTL=7天)** -``` -Key: msg:cache:{msgId} -Value: JSON消息体 -``` - ---- - -## 四、核心功能实现 - -### 4.1 连接建立流程 - -``` -1. 客户端发起WebSocket连接 - ws://domain/ws?token=xxx - -2. 服务端验证token - - 解析JWT token - - 验证用户身份 - - 检查用户状态 - -3. 连接成功 - - 保存连接到内存Map - - 更新Redis在线状态 - - 返回连接成功消息 - -4. 拉取离线消息 - - 从Redis获取离线消息ID列表 - - 批量查询消息详情 - - 推送给客户端 - -5. 启动心跳 - - 客户端每30秒发送ping - - 服务端响应pong - - 超过90秒无心跳则断开连接 -``` - -### 4.2 单聊消息流程 - -``` -1. 客户端发送消息 - { - "action": "sendMessage", - "toUserId": "123", - "msgType": "text", - "content": "你好" - } - -2. 服务端处理 - - 生成msgId(UUID) - - 敏感词过滤 - - 保存到MySQL - - 缓存到Redis(7天) - -3. 消息路由 - - 查询接收者在线状态 - - 如果在线:通过WebSocket推送 - - 如果离线:存入离线消息队列 - -4. 客户端接收 - - 收到消息后发送ACK确认 - - 更新会话列表 - - 显示消息内容 - -5. 已读回执(可选) - - 用户查看消息后发送已读状态 - - 更新消息已读标记 - - 通知发送方 -``` - -### 4.3 直播间弹幕流程 - -``` -1. 用户进入直播间 - - 发送enterRoom消息 - - 加入Redis直播间在线集合 - - 广播进入消息(可选) - -2. 发送弹幕 - { - "action": "sendBarrage", - "roomId": "room_001", - "content": "主播666" - } - -3. 服务端处理 - - 频率限制(1秒1条) - - 敏感词过滤 - - 保存到MySQL(可异步) - - 不缓存到Redis(弹幕量大) - -4. 消息广播 - - 获取直播间所有在线用户 - - 遍历推送消息 - - 失败的用户从在线列表移除 - -5. 离开直播间 - - 发送leaveRoom消息 - - 从Redis在线集合移除 -``` - -### 4.4 礼物打赏流程 - -**场景一:直播间送礼** -``` -1. 客户端发送礼物 - { - "action": "sendGift", - "roomId": "room_001", - "anchorId": "456", - "giftId": "gift_001", - "count": 1 - } - -2. 服务端处理 - - 验证用户余额 - - 扣除金币 - - 增加主播收益 - - 保存打赏记录 - -3. 消息广播 - - 构造礼物消息 - - 广播到直播间所有用户 - - 触发礼物动画 - -4. 通知主播 - - 发送私信通知 - - 更新收益统计 -``` - -**场景二:私聊送礼(社交场景)** -``` -1. 客户端发送礼物 - { - "action": "sendPrivateGift", - "toUserId": "789", - "giftId": "gift_002", - "count": 1, - "message": "送你一朵玫瑰" - } - -2. 服务端处理 - - 验证用户余额 - - 扣除金币 - - 增加对方收益 - - 保存礼物记录 - - 构造礼物消息 - -3. 消息推送 - - 推送给接收者 - - 显示礼物卡片 - - 触发礼物动画 - - 更新会话列表 - -4. 收益通知 - - 发送收益通知 - - 更新用户余额 -``` - -### 4.5 好友关系管理 - -**添加好友流程** -``` -1. 发送好友申请 - { - "action": "sendFriendRequest", - "toUserId": "123", - "message": "你好,可以加个好友吗?" - } - -2. 服务端处理 - - 检查是否已是好友 - - 检查是否已发送过申请 - - 保存好友申请记录 - - 构造申请通知消息 - -3. 推送通知 - - 推送给目标用户 - - 显示好友申请红点 - - 更新申请列表 - -4. 处理申请 - { - "action": "handleFriendRequest", - "requestId": "456", - "accept": true - } - -5. 同意后处理 - - 更新申请状态 - - 双向添加好友关系 - - 发送同意通知 - - 创建会话 -``` - -**删除好友流程** -``` -1. 客户端请求删除 - { - "action": "deleteFriend", - "friendId": "123" - } - -2. 服务端处理 - - 删除好友关系 - - 保留历史消息(可选) - - 发送删除通知(可选) -``` - -### 4.6 多媒体消息处理 - -**图片消息流程** -``` -1. 上传图片 - POST /api/upload/image - - 客户端先上传图片到服务器 - - 返回图片URL和缩略图URL - -2. 发送图片消息 - { - "action": "sendMessage", - "toUserId": "123", - "msgType": "image", - "content": "imageUrl", - "extra": { - "thumbnail": "thumbnailUrl", - "width": 1080, - "height": 1920, - "size": 102400 - } - } - -3. 服务端处理 - - 验证图片URL合法性 - - 保存消息记录 - - 推送给接收者 - -4. 客户端显示 - - 先显示缩略图 - - 点击查看大图 - - 支持图片保存 -``` - -**语音消息流程** -``` -1. 录制语音 - - 客户端录制语音(最长60秒) - - 转换为MP3/AAC格式 - - 上传到服务器 - -2. 发送语音消息 - { - "action": "sendMessage", - "toUserId": "123", - "msgType": "voice", - "content": "voiceUrl", - "extra": { - "duration": 15, - "size": 51200 - } - } - -3. 服务端处理 - - 验证语音文件 - - 保存消息记录 - - 推送给接收者 - -4. 客户端播放 - - 显示语音时长 - - 点击播放 - - 显示播放进度 - - 标记已读 -``` - -**视频消息流程** -``` -1. 上传视频 - POST /api/upload/video - - 限制视频大小(如50MB) - - 限制视频时长(如30秒) - - 生成视频封面 - -2. 发送视频消息 - { - "action": "sendMessage", - "toUserId": "123", - "msgType": "video", - "content": "videoUrl", - "extra": { - "cover": "coverUrl", - "duration": 20, - "width": 720, - "height": 1280, - "size": 5242880 - } - } - -3. 客户端显示 - - 显示视频封面 - - 显示时长标识 - - 点击播放 -``` - -### 4.7 消息已读回执 - -**已读状态更新** -``` -1. 用户查看消息 - { - "action": "markAsRead", - "conversationId": "123", - "lastMsgId": "msg_456" - } - -2. 服务端处理 - - 更新消息已读状态 - - 更新会话未读数 - - 记录已读时间 - -3. 推送已读回执 - - 通知发送方消息已读 - - 显示"已读"标识 - - 更新发送方会话列表 -``` - -**未读消息统计** -``` -1. 获取未读数 - GET /api/message/unreadCount - Response: { - "totalUnread": 15, - "conversations": [ - {"conversationId": 1, "unread": 5}, - {"conversationId": 2, "unread": 10} - ] - } - -2. 实时更新 - - 收到新消息时更新未读数 - - 标记已读时减少未读数 - - 推送未读数变化 -``` - -### 4.8 消息撤回功能 - -**撤回流程** -``` -1. 客户端请求撤回 - { - "action": "recallMessage", - "msgId": "msg_123" - } - -2. 服务端验证 - - 检查消息是否存在 - - 检查是否是发送者本人 - - 检查是否在2分钟内 - - 更新消息状态为已撤回 - -3. 推送撤回通知 - - 通知接收者消息已撤回 - - 显示"对方撤回了一条消息" - - 更新会话最后一条消息 - -4. 客户端处理 - - 移除或替换消息内容 - - 显示撤回提示 -``` - -### 4.9 社交互动通知 - -**点赞通知** -``` -1. 用户点赞作品/评论 - POST /api/like - { - "targetType": "work|comment", - "targetId": 123 - } - -2. 服务端处理 - - 保存点赞记录 - - 构造通知消息 - - 推送给作品作者 - -3. 通知消息格式 - { - "type": "like", - "data": { - "userId": 456, - "username": "张三", - "avatar": "xxx", - "targetType": "work", - "targetId": 123, - "targetTitle": "作品标题", - "timestamp": 1640000000000 - } - } -``` - -**评论通知** -``` -1. 用户发表评论 - POST /api/comment - { - "workId": 123, - "content": "很棒的作品!" - } - -2. 服务端处理 - - 保存评论记录 - - 构造通知消息 - - 推送给作品作者 - -3. @提醒处理 - - 解析评论中的@用户 - - 发送@提醒通知 - - 推送给被@的用户 -``` - -**关注通知** -``` -1. 用户关注他人 - POST /api/follow - { - "targetUserId": 123 - } - -2. 服务端处理 - - 保存关注关系 - - 构造通知消息 - - 推送给被关注者 - -3. 通知消息 - { - "type": "follow", - "data": { - "userId": 456, - "username": "张三", - "avatar": "xxx", - "timestamp": 1640000000000 - } - } -``` - -### 4.5 系统通知流程 - -``` -1. 后台触发通知 - - 关注通知 - - 点赞通知 - - 评论通知 - - 系统公告 - - 审核通知 - -2. 服务端处理 - - 构造系统消息 - - 保存到MySQL - - 推送给目标用户 - -3. 客户端接收 - - 显示通知红点 - - 弹出提示(可选) - - 更新通知列表 -``` - ---- - -## 五、性能优化方案 - -### 5.1 连接优化 - -**单机连接数优化** -- 使用Netty或Spring WebFlux(异步非阻塞) -- 单机支持10万+连接 -- 调整系统参数:ulimit -n 100000 - -**连接保活** -- 客户端心跳:30秒 -- 服务端超时:90秒 -- 减少无效连接占用 - -### 5.2 消息优化 - -**弹幕限流** -- 用户级别:1秒1条 -- 直播间级别:每秒1000条(超过则丢弃) -- 使用Redis令牌桶算法 - -**消息批量处理** -- 弹幕批量入库(100条/批次) -- 离线消息批量拉取(50条/次) -- 减少数据库IO - -**消息压缩** -- 启用WebSocket压缩(permessage-deflate) -- 减少30-50%流量 - -### 5.3 存储优化 - -**MySQL优化** -- 消息表按月分表 -- 历史消息归档到MongoDB -- 只保留3个月热数据 - -**Redis优化** -- 消息缓存设置TTL(7天) -- 使用Redis Cluster(后期扩展) -- 离线消息队列限制长度(最多100条) - -### 5.4 广播优化 - -**直播间消息广播** -- 异步推送,不阻塞主线程 -- 失败重试1次,超时则放弃 -- 单次广播超时时间:100ms - -**分组广播(后期优化)** -- 将直播间用户分组(每组1000人) -- 多线程并行推送 -- 提升广播效率 - ---- - -## 六、技术栈选型 - -### 6.1 后端技术栈 - -**核心框架** -- Spring Boot 2.7+ -- Spring WebSocket -- Spring Data JPA / MyBatis-Plus - -**中间件** -- MySQL 8.0(主数据库) -- Redis 6.0+(缓存、在线状态) -- Nginx(反向代理、负载均衡) - -**工具库** -- JWT(用户认证) -- Jackson(JSON序列化) -- Hutool(工具类) -- Lombok(简化代码) - -### 6.2 前端技术栈(Android) - -**网络库** -- OkHttp(HTTP请求) -- OkHttp WebSocket(长连接) - -**UI框架** -- Material Design Components -- RecyclerView(消息列表) -- ViewPager2(直播间) - -**工具库** -- Gson(JSON解析) -- Glide(图片加载) -- EventBus(事件总线) - -### 6.3 开发工具 - -- IntelliJ IDEA(后端开发) -- Android Studio(Android开发) -- Postman(API测试) -- Redis Desktop Manager(Redis管理) -- Navicat(数据库管理) - ---- - -## 七、部署方案 - -### 7.1 服务器配置(初期) - -**单机部署方案** -``` -服务器:阿里云ECS -配置:4核8G 5M带宽 -系统:CentOS 7.9 - -服务部署: -- Nginx(80/443端口) -- Spring Boot IM服务(8080端口) -- MySQL(3306端口) -- Redis(6379端口) -``` - -**预估支持规模** -- 同时在线:5000人 -- 单直播间:500人 -- 消息吞吐:5000条/秒 - -### 7.2 扩展方案(后期) - -**水平扩展** -``` -负载均衡(Nginx) - ↓ -IM服务集群(3台) - ↓ -Redis集群(主从) - ↓ -MySQL主从(读写分离) -``` - -**支持规模** -- 同时在线:5万人 -- 单直播间:5000人 -- 消息吞吐:5万条/秒 - ---- - -## 八、开发计划(7天) - -### Day 1-2:基础架构搭建 -- [x] 搭建Spring Boot项目 -- [x] 集成WebSocket -- [x] 配置MySQL、Redis -- [x] 实现用户认证(JWT) -- [x] 实现连接管理模块 - -### Day 3-4:核心功能开发 -- [x] 实现单聊消息收发 -- [x] 实现直播间弹幕 -- [x] 实现离线消息 -- [x] 实现消息存储 -- [x] 实现敏感词过滤 - -### Day 5:业务功能开发 -- [x] 实现礼物打赏消息 -- [x] 实现系统通知 -- [x] 实现消息已读 -- [x] 实现历史消息查询 - -### Day 6:Android客户端对接 -- [x] 实现WebSocket连接 -- [x] 实现消息收发UI -- [x] 实现弹幕显示 -- [x] 实现礼物动画 - -### Day 7:测试与优化 -- [x] 功能测试 -- [x] 压力测试(JMeter) -- [x] 性能优化 -- [x] 部署上线 - ---- - -## 九、接口设计 - -### 9.1 WebSocket接口 - -**连接地址** -``` -ws://domain/ws?token=xxx -``` - -**客户端发送消息格式** -```json -{ - "action": "sendMessage|sendBarrage|enterRoom|leaveRoom|heartbeat", - "data": { - // 具体数据 - } -} -``` - -**服务端推送消息格式** -```json -{ - "type": "message|barrage|gift|system|notification", - "data": { - // 具体数据 - } -} -``` - -### 9.2 HTTP接口 - -**用户认证** -``` -POST /api/auth/login -Body: { - "username": "user123", - "password": "xxx" -} -Response: { - "code": 200, - "data": { - "token": "jwt_token", - "userId": 123, - "username": "user123", - "nickname": "张三", - "avatar": "xxx" - } -} -``` - -**好友相关接口** - -**获取好友列表** -``` -GET /api/friend/list -Response: { - "code": 200, - "data": [ - { - "friendId": 123, - "username": "user123", - "nickname": "张三", - "avatar": "xxx", - "remark": "备注名", - "online": true, - "lastOnlineTime": "2024-12-25 10:00:00" - } - ] -} -``` - -**发送好友申请** -``` -POST /api/friend/request -Body: { - "toUserId": 123, - "message": "你好,可以加个好友吗?" -} -Response: { - "code": 200, - "message": "申请已发送" -} -``` - -**获取好友申请列表** -``` -GET /api/friend/requests?status=0 -Response: { - "code": 200, - "data": [ - { - "requestId": 1, - "fromUserId": 456, - "username": "user456", - "nickname": "李四", - "avatar": "xxx", - "message": "你好", - "status": 0, - "createdAt": "2024-12-25 10:00:00" - } - ] -} -``` - -**处理好友申请** -``` -POST /api/friend/handle -Body: { - "requestId": 1, - "accept": true -} -Response: { - "code": 200, - "message": "已同意好友申请" -} -``` - -**删除好友** -``` -DELETE /api/friend/{friendId} -Response: { - "code": 200, - "message": "已删除好友" -} -``` - -**会话相关接口** - -**获取会话列表** -``` -GET /api/conversation/list -Response: { - "code": 200, - "data": [ - { - "conversationId": 1, - "type": 1, - "targetId": 123, - "targetName": "张三", - "targetAvatar": "xxx", - "lastMessage": "你好", - "lastMessageType": "text", - "lastTime": "2024-12-25 10:00:00", - "unreadCount": 3, - "online": true - } - ] -} -``` - -**删除会话** -``` -DELETE /api/conversation/{conversationId} -Response: { - "code": 200, - "message": "会话已删除" -} -``` - -**消息相关接口** - -**获取历史消息** -``` -GET /api/message/history?targetId=123&pageSize=20&lastMsgId=xxx -Response: { - "code": 200, - "data": { - "messages": [ - { - "msgId": "msg_001", - "msgType": "text", - "fromUserId": 456, - "toUserId": 123, - "content": "你好", - "extra": {}, - "status": 1, - "isRead": 1, - "createdAt": "2024-12-25 10:00:00" - } - ], - "hasMore": true - } -} -``` - -**上传图片** -``` -POST /api/upload/image -Content-Type: multipart/form-data -Body: file=xxx -Response: { - "code": 200, - "data": { - "url": "https://xxx.com/image.jpg", - "thumbnail": "https://xxx.com/image_thumb.jpg", - "width": 1080, - "height": 1920, - "size": 102400 - } -} -``` - -**上传语音** -``` -POST /api/upload/voice -Content-Type: multipart/form-data -Body: file=xxx -Response: { - "code": 200, - "data": { - "url": "https://xxx.com/voice.mp3", - "duration": 15, - "size": 51200 - } -} -``` - -**上传视频** -``` -POST /api/upload/video -Content-Type: multipart/form-data -Body: file=xxx -Response: { - "code": 200, - "data": { - "url": "https://xxx.com/video.mp4", - "cover": "https://xxx.com/cover.jpg", - "duration": 20, - "width": 720, - "height": 1280, - "size": 5242880 - } -} -``` - -**发送图片消息** -``` -POST /api/message/sendImage -Body: { - "toUserId": 123, - "imageUrl": "xxx", - "thumbnail": "xxx", - "width": 1080, - "height": 1920 -} -Response: { - "code": 200, - "data": { - "msgId": "msg_001" - } -} -``` - -**标记消息已读** -``` -POST /api/message/markRead -Body: { - "conversationId": 1, - "lastMsgId": "msg_456" -} -Response: { - "code": 200, - "message": "已标记为已读" -} -``` - -**撤回消息** -``` -POST /api/message/recall -Body: { - "msgId": "msg_123" -} -Response: { - "code": 200, - "message": "消息已撤回" -} -``` - -**获取未读消息数** -``` -GET /api/message/unreadCount -Response: { - "code": 200, - "data": { - "totalUnread": 15, - "conversations": [ - {"conversationId": 1, "unread": 5}, - {"conversationId": 2, "unread": 10} - ] - } -} -``` - -**礼物相关接口** - -**获取礼物列表** -``` -GET /api/gift/list -Response: { - "code": 200, - "data": [ - { - "giftId": 1, - "name": "玫瑰", - "icon": "xxx", - "price": 10, - "animation": "rose_animation" - } - ] -} -``` - -**私聊送礼** -``` -POST /api/gift/sendPrivate -Body: { - "toUserId": 123, - "giftId": 1, - "count": 1, - "message": "送你一朵玫瑰" -} -Response: { - "code": 200, - "data": { - "recordId": 1, - "balance": 990 - } -} -``` - -**直播间送礼** -``` -POST /api/gift/sendLive -Body: { - "roomId": "room_001", - "anchorId": 456, - "giftId": 1, - "count": 1 -} -Response: { - "code": 200, - "data": { - "recordId": 1, - "balance": 990 - } -} -``` - -**获取礼物记录** -``` -GET /api/gift/records?type=send&pageSize=20&page=1 -Response: { - "code": 200, - "data": { - "records": [ - { - "recordId": 1, - "fromUserId": 123, - "toUserId": 456, - "giftName": "玫瑰", - "count": 1, - "totalPrice": 10, - "scene": "chat", - "createdAt": "2024-12-25 10:00:00" - } - ], - "total": 100 - } -} -``` - -**通知相关接口** - -**获取通知列表** -``` -GET /api/notification/list?type=all&pageSize=20&page=1 -Response: { - "code": 200, - "data": [ - { - "notificationId": 1, - "type": "like", - "fromUserId": 456, - "fromUsername": "张三", - "fromAvatar": "xxx", - "content": "赞了你的作品", - "targetType": "work", - "targetId": 123, - "isRead": 0, - "createdAt": "2024-12-25 10:00:00" - } - ] -} -``` - -**标记通知已读** -``` -POST /api/notification/markRead -Body: { - "notificationIds": [1, 2, 3] -} -Response: { - "code": 200, - "message": "已标记为已读" -} -``` - -**获取未读通知数** -``` -GET /api/notification/unreadCount -Response: { - "code": 200, - "data": { - "like": 5, - "comment": 3, - "follow": 2, - "system": 1, - "total": 11 - } -} -``` - ---- - -## 十、安全方案 - -### 10.1 认证鉴权 -- 使用JWT token认证 -- Token有效期:7天 -- 刷新Token机制 - -### 10.2 消息安全 -- 敏感词过滤(本地词库) -- 消息内容长度限制(500字符) -- 图片内容审核(接入第三方) - -### 10.3 防刷机制 -- 消息发送频率限制 -- IP黑名单 -- 用户封禁机制 - -### 10.4 数据安全 -- WebSocket使用wss加密 -- 数据库密码加密存储 -- 敏感信息脱敏 - ---- - -## 十一、监控与运维 - -### 11.1 监控指标 -- 在线用户数 -- 消息发送量(QPS) -- 接口响应时间 -- 服务器CPU/内存/网络 - -### 11.2 日志管理 -- 使用SLF4J + Logback -- 日志分级:ERROR、WARN、INFO -- 日志文件按天切割 -- 保留30天日志 - -### 11.3 告警机制 -- 服务宕机告警 -- 接口异常告警 -- 资源使用告警 - ---- - -## 十二、成本预估 - -### 12.1 服务器成本 -- 阿里云ECS 4核8G:约300元/月 -- 带宽5M:约50元/月 -- 总计:约350元/月 - -### 12.2 开发成本 -- 后端开发:3人天 -- Android开发:2人天 -- 测试:1人天 -- 总计:6人天 - -### 12.3 第三方服务(可选) -- 图片审核:按量计费 -- 短信通知:按量计费 -- CDN加速:按流量计费 - ---- - -## 十三、风险与应对 - -### 13.1 技术风险 -**风险:** 单机性能瓶颈 -**应对:** 提前设计水平扩展方案,预留扩展接口 - -**风险:** 消息丢失 -**应对:** 实现消息ACK机制,离线消息队列 - -**风险:** 直播间消息风暴 -**应对:** 消息限流、降级策略 - -### 13.2 业务风险 -**风险:** 用户量超预期 -**应对:** 快速扩容方案,提前准备服务器 - -**风险:** 恶意刷屏 -**应对:** 频率限制、封禁机制 - ---- - -## 十四、后续优化方向 - -### 14.1 功能优化 -- 消息撤回 -- 消息转发 -- @提醒功能 -- 表情包支持 -- 语音/视频通话 - -### 14.2 性能优化 -- 引入消息队列(RabbitMQ/Kafka) -- 数据库分库分表 -- 引入ElasticSearch(消息搜索) -- CDN加速(图片、语音) - -### 14.3 架构优化 -- 微服务拆分 -- 服务注册与发现(Nacos) -- 分布式链路追踪(SkyWalking) -- 容器化部署(Docker + K8s) - ---- - -## 附录 - -### A. 参考资料 -- WebSocket协议:RFC 6455 -- MQTT协议:MQTT 3.1.1 -- 即时通讯技术选型:https://www.zhihu.com/question/xxx - -### B. 开源方案参考 -- Netty-SocketIO(Java WebSocket框架) -- t-io(国产高性能IM框架) -- OpenIM(开源IM解决方案) - -### C. 敏感词库 -- 使用DFA算法实现高效过滤 -- 词库来源:GitHub开源项目 - ---- - -**文档版本:** v1.0 -**编写日期:** 2024-12-25 -**适用范围:** 1-10万用户规模的直播IM系统 diff --git a/直播间分类功能修复说明.md b/直播间分类功能修复说明.md deleted file mode 100644 index 15b9e347..00000000 --- a/直播间分类功能修复说明.md +++ /dev/null @@ -1,101 +0,0 @@ -# 直播间分类功能修复说明 - -## 问题描述 -1. App首页的分类标签(推荐、直播、视频、音乐、游戏)是硬编码的,没有从后台数据库动态获取 -2. 频道管理对话框中的"我的频道"和"推荐频道"也是硬编码的 - -## 数据库分类数据 -```sql -SELECT * FROM eb_live_room_category ORDER BY sort; --- 结果: --- id=1, name=娱乐, icon=el-icon-video-camera, sort=1 --- id=2, name=游戏, icon=el-icon-coordinate, sort=2 --- id=3, name=音乐, icon=el-icon-headset, sort=3 --- id=4, name=户外, icon=el-icon-location, sort=4 --- id=5, name=聊天, icon=el-icon-chat-dot-round, sort=5 -``` - -## 修改内容 - -### 1. 后端 CategoryController -**文件**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/CategoryController.java` - -**修改**: -- 注入 `LiveRoomCategoryService` -- 修改 `/api/front/category/live` 接口,从 `eb_live_room_category` 表获取分类 -- 添加兼容旧接口 `/api/front/category/live-room` - -### 2. 后端 LiveRoomController -**文件**: `Zhibo/zhibo-h/crmeb-front/src/main/java/com/zbkj/front/controller/LiveRoomController.java` - -**修改**: -- 注入 `LiveRoomCategoryService` -- 修改 `toResponse` 方法,从 `eb_live_room_category` 表获取分类名称设置到 `categoryName` 字段 - -### 3. Android MainActivity -**文件**: `android-app/app/src/main/java/com/example/livestreaming/MainActivity.java` - -**修改**: -- 添加 `allBackendCategories` 成员变量缓存后端分类数据 -- `updateCategoryTabs` 方法:缓存后端分类数据 -- `loadMyChannels` 方法:使用后端分类作为默认频道(推荐 + 前4个后端分类) -- `loadRecommendChannels` 方法:从后端分类中过滤出未添加的频道 -- `applyCategoryFilterSync` 方法:优先使用 `categoryName` 筛选 - -### 4. Android CategoryFilterManager -**文件**: `android-app/app/src/main/java/com/example/livestreaming/CategoryFilterManager.java` - -**修改**: -- `filterRoomsSync` 方法:优先使用 `categoryName` 筛选 - -## 工作流程 - -1. **App启动时**: - - `MainActivity.loadCategoriesFromBackend()` 调用 `/api/front/category/live` 接口 - - 后端从 `eb_live_room_category` 表获取启用的分类列表 - - App缓存分类数据到 `allBackendCategories` - - App动态创建分类标签(推荐 + 后端返回的分类) - -2. **打开频道管理对话框时**: - - "我的频道":从 SharedPreferences 加载用户已选择的频道,如果没有则使用默认值(推荐 + 前4个后端分类) - - "推荐频道":从 `allBackendCategories` 中过滤出未添加到"我的频道"的分类 - -3. **获取直播间列表时**: - - 调用 `/api/front/live/public/rooms` 接口 - - 后端返回直播间数据,包含 `categoryId` 和 `categoryName` - - `categoryName` 从 `eb_live_room_category` 表获取 - -4. **分类筛选时**: - - 用户点击分类标签 - - App根据 `categoryName` 筛选直播间 - - 如果直播间没有设置分类(`categoryName` 为空),则只在"推荐"标签下显示 - -## 部署步骤 - -1. **编译后端**: - ```bash - cd Zhibo/zhibo-h - mvn clean package -DskipTests -pl crmeb-front -am - ``` - -2. **部署后端**: - - 上传 `crmeb-front.jar` 到服务器 - - 重启后端服务 - -3. **编译Android**: - ```bash - cd android-app - gradlew assembleDebug - ``` - -4. **安装测试**: - - 安装新的APK - - 检查分类标签是否显示为:推荐、娱乐、游戏、音乐、户外、聊天 - - 点击展开箭头,检查频道管理对话框是否显示后端分类 - -## 注意事项 - -- 如果直播间没有设置 `category_id`,该直播间只会在"推荐"标签下显示 -- 创建直播间时需要选择分类,分类ID会保存到 `eb_live_room.category_id` 字段 -- 后台管理可以在"直播管理 > 直播分类"中管理分类 -- 新添加的分类会自动出现在"推荐频道"列表中 diff --git a/礼物系统后台管理部署说明.md b/礼物系统后台管理部署说明.md deleted file mode 100644 index 1459ab78..00000000 --- a/礼物系统后台管理部署说明.md +++ /dev/null @@ -1,299 +0,0 @@ -# 礼物系统后台管理部署说明 - -## 已完成的工作 - -### 1. 后端API ✅ -- **GiftAdminController.java** - 礼物管理后台控制器 - - 礼物打赏记录列表(支持搜索和日期筛选) - - 礼物统计数据(总数、总价值、今日数据) - - 礼物配置管理(增删改查) - - 充值套餐管理 - - 充值记录查询 - -### 2. 前端页面 ✅ -- **gift.js** - 礼物管理API接口 -- **gift/records/index.vue** - 礼物打赏记录页面 - - 统计卡片(总礼物数、总价值、今日数据) - - 搜索功能(关键词、日期范围) - - 礼物记录表格(礼物信息、送礼者、接收者、直播间、时间) - - 分页功能 - -## 部署步骤 - -### 步骤1:执行数据库脚本(如果还没执行) -```bash -mysql -h 1.15.149.240 -u root -p zhibo < virtual_currency_and_gift_system.sql -``` - -### 步骤2:编译后端 -```bash -cd Zhibo/zhibo-h -mvn clean package -DskipTests -``` - -### 步骤3:部署后端服务 -```bash -# 停止服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose stop crmeb-admin" - -# 上传jar包 -scp crmeb-admin/target/Crmeb-admin.jar root@1.15.149.240:/root/zhibo/ - -# 启动服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose up -d crmeb-admin" -``` - -### 步骤4:编译前端 -```bash -cd Zhibo/admin -npm run build:prod -``` - -### 步骤5:部署前端 -```bash -# 上传到服务器 -scp -r dist/* root@1.15.149.240:/root/zhibo/admin/ -``` - -### 步骤6:配置路由 - -在 `Zhibo/admin/src/router/index.js` 中添加礼物管理路由: - -```javascript -{ - path: '/gift', - component: Layout, - redirect: '/gift/records', - name: 'Gift', - meta: { title: '礼物管理', icon: 'el-icon-present' }, - children: [ - { - path: 'records', - name: 'GiftRecords', - component: () => import('@/views/gift/records/index'), - meta: { title: '礼物打赏', icon: 'el-icon-present' } - } - ] -} -``` - -## 页面功能说明 - -### 礼物打赏记录页面 - -#### 统计卡片 -- **总礼物数**:所有时间的礼物总数量 -- **总价值**:所有礼物的总价值(虚拟币) -- **今日礼物数**:今天收到的礼物数量 -- **今日价值**:今天礼物的总价值 - -#### 搜索功能 -- **关键词搜索**:可搜索送礼者昵称、接收者昵称、礼物名称 -- **日期筛选**:可按开始日期和结束日期筛选记录 - -#### 礼物记录表格 -显示字段: -- ID -- 礼物信息(图标、名称、单价、数量) -- 总价值 -- 送礼者(头像、昵称、手机号) -- 接收者/主播(头像、昵称、手机号) -- 直播间名称 -- 赠送时间 - -#### 特殊处理 -- 匿名送礼显示为"匿名用户" -- 没有直播间的显示"-" -- 支持分页查看 - -## API接口说明 - -### 1. 获取礼物打赏记录 -``` -GET /api/admin/gift/records -参数: -- keyword: 关键词(可选) -- startDate: 开始日期(可选) -- endDate: 结束日期(可选) -- page: 页码(默认1) -- limit: 每页数量(默认20) -``` - -### 2. 获取礼物统计 -``` -GET /api/admin/gift/statistics -返回: -- totalCount: 总礼物数 -- totalValue: 总价值 -- todayCount: 今日礼物数 -- todayValue: 今日价值 -``` - -### 3. 获取礼物配置列表 -``` -GET /api/admin/gift/config/list -``` - -### 4. 添加礼物配置 -``` -POST /api/admin/gift/config/add -请求体: -{ - "name": "礼物名称", - "icon": "图标URL", - "price": 价格, - "animation": "动画效果", - "sortOrder": 排序 -} -``` - -### 5. 更新礼物配置 -``` -POST /api/admin/gift/config/update -``` - -### 6. 删除礼物配置 -``` -POST /api/admin/gift/config/delete/{id} -``` - -### 7. 获取充值套餐列表 -``` -GET /api/admin/gift/recharge/packages -``` - -### 8. 更新充值套餐 -``` -POST /api/admin/gift/recharge/package/update -``` - -### 9. 获取充值记录 -``` -GET /api/admin/gift/recharge/records -``` - -## 测试流程 - -### 1. 测试礼物打赏记录查看 -1. 登录后台管理系统 -2. 进入"礼物管理" -> "礼物打赏" -3. 查看统计卡片数据是否正确 -4. 查看礼物记录列表是否显示 -5. 测试搜索功能 -6. 测试日期筛选功能 -7. 测试分页功能 - -### 2. 测试数据准备 -如果没有测试数据,可以通过APP端送礼物来生成: -1. 在APP中充值虚拟货币 -2. 进入直播间 -3. 送礼物给主播 -4. 返回后台查看记录 - -### 3. 验证数据准确性 -```sql --- 查询礼物记录 -SELECT * FROM eb_gift_record ORDER BY create_time DESC LIMIT 10; - --- 查询统计数据 -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. 礼物配置管理页面 -创建独立页面管理礼物配置: -- 添加新礼物 -- 编辑礼物信息 -- 上传礼物图标 -- 设置礼物价格 -- 启用/禁用礼物 - -### 2. 充值套餐管理页面 -创建独立页面管理充值套餐: -- 添加新套餐 -- 编辑套餐信息 -- 设置赠送比例 -- 设置热门推荐 -- 启用/禁用套餐 - -### 3. 充值记录查看页面 -创建独立页面查看充值记录: -- 用户充值记录 -- 充值金额统计 -- 支付方式统计 -- 充值趋势图表 - -### 4. 数据导出功能 -- 导出礼物记录为Excel -- 导出充值记录为Excel -- 生成统计报表 - -### 5. 图表统计 -- 礼物趋势图(按日期) -- 热门礼物排行榜 -- 送礼用户排行榜 -- 收礼主播排行榜 - -## 注意事项 - -1. **权限控制** - - 确保只有管理员可以访问礼物管理页面 - - 敏感操作需要二次确认 - -2. **数据安全** - - 礼物记录不可删除,只能查看 - - 充值记录不可修改 - - 所有操作记录日志 - -3. **性能优化** - - 大量数据时使用分页 - - 统计数据可以缓存 - - 定期归档历史数据 - -4. **用户体验** - - 加载状态提示 - - 错误信息友好提示 - - 操作成功反馈 - -## 常见问题 - -### Q1: 后台看不到礼物记录? -**A:** 检查以下几点: -1. 数据库表是否创建成功 -2. 后端服务是否重启 -3. 前端是否重新编译 -4. 是否有测试数据 - -### Q2: 统计数据不准确? -**A:** -1. 检查SQL查询是否正确 -2. 检查数据库数据是否完整 -3. 清除浏览器缓存重新加载 - -### Q3: 搜索功能不工作? -**A:** -1. 检查后端API是否正确处理参数 -2. 检查前端是否正确传递参数 -3. 查看浏览器控制台错误信息 - -## 文件清单 - -### 后端文件 -- `Zhibo/zhibo-h/crmeb-admin/src/main/java/com/zbkj/admin/controller/GiftAdminController.java` - -### 前端文件 -- `Zhibo/admin/src/api/gift.js` -- `Zhibo/admin/src/views/gift/records/index.vue` - -### 数据库文件 -- `virtual_currency_and_gift_system.sql` - -## 联系方式 - -如有问题,请查看相关文档或联系开发团队。 diff --git a/礼物系统完整开发文档.md b/礼物系统完整开发文档.md deleted file mode 100644 index c4080eed..00000000 --- a/礼物系统完整开发文档.md +++ /dev/null @@ -1,301 +0,0 @@ -# 礼物系统完整开发文档 - -## 📋 目录 - -1. [系统概述](#系统概述) -2. [数据库设计](#数据库设计) -3. [后端API接口](#后端api接口) -4. [前端页面](#前端页面) -5. [APP端集成](#app端集成) -6. [部署指南](#部署指南) -7. [测试验证](#测试验证) - ---- - -## 系统概述 - -### 功能简介 - -礼物系统是直播平台的核心功能之一,支持用户在直播间送礼物给主播,包含以下核心功能: - -- **礼物管理**:后台管理员可以添加、编辑、删除、启用/禁用礼物 -- **打赏记录**:记录所有用户的礼物打赏行为 -- **统计分析**:礼物数量、启用/禁用状态、总价值统计 -- **APP集成**:移动端获取礼物列表并发送礼物 - -### 技术栈 - -- **后端**:Java + Spring Boot + MyBatis + MySQL -- **前端管理**:Vue.js + Element UI -- **移动端**:Android (Java) -- **数据库**:MySQL 5.7+ - -### 核心数据表 - -- `eb_gift` - 礼物主数据表(20个礼物) -- `eb_gift_record` - 礼物打赏记录表 - ---- - -## 数据库设计 - -### 1. eb_gift 表(礼物主数据表) - -```sql -CREATE TABLE `eb_gift` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '礼物ID', - `name` varchar(50) NOT NULL COMMENT '礼物名称', - `image` varchar(255) DEFAULT NULL COMMENT '礼物图片URL', - `diamond_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钻石价格', - `intimacy` int(11) NOT NULL DEFAULT '0' COMMENT '亲密度', - `is_heartbeat` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否心动礼物 0-否 1-是', - `level` int(11) NOT NULL DEFAULT '1' COMMENT '礼物等级', - `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', - `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 0-禁用 1-启用', - `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除 0-否 1-是', - `buy_type` varchar(20) DEFAULT 'diamond' COMMENT '购买类型', - `belong` varchar(20) DEFAULT 'common' COMMENT '归属', - `remark` varchar(255) 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 '更新时间', - PRIMARY KEY (`id`), - KEY `idx_status` (`status`), - KEY `idx_sort` (`sort`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='礼物表'; -``` - -**字段说明:** - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | int | 礼物唯一标识 | -| name | varchar(50) | 礼物名称,如"玫瑰花"、"钻戒" | -| image | varchar(255) | 礼物图片URL | -| diamond_price | decimal(10,2) | 钻石价格 | -| intimacy | int | 赠送礼物增加的亲密度 | -| is_heartbeat | tinyint | 是否为心动礼物(特殊标记) | -| level | int | 礼物等级 | -| sort | int | 显示排序 | -| status | tinyint | 启用状态(0-禁用,1-启用) | -| is_deleted | tinyint | 软删除标记 | -| buy_type | varchar(20) | 购买类型(diamond-钻石) | -| belong | varchar(20) | 归属(common-通用,live-直播专属) | -| remark | varchar(255) | 备注信息 | - -### 2. eb_gift_record 表(打赏记录表) - -```sql -CREATE TABLE `eb_gift_record` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录ID', - `sender_id` int(11) NOT NULL COMMENT '送礼用户ID', - `sender_nickname` varchar(50) DEFAULT NULL COMMENT '送礼用户昵称', - `receiver_id` int(11) NOT NULL COMMENT '收礼用户ID', - `receiver_nickname` varchar(50) DEFAULT NULL COMMENT '收礼用户昵称', - `gift_id` int(11) NOT NULL COMMENT '礼物ID', - `gift_count` int(11) NOT NULL DEFAULT '1' COMMENT '礼物数量', - `total_price` decimal(10,2) NOT NULL COMMENT '总价格', - `room_id` int(11) DEFAULT NULL COMMENT '直播间ID', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_sender` (`sender_id`), - KEY `idx_receiver` (`receiver_id`), - KEY `idx_gift` (`gift_id`), - KEY `idx_room` (`room_id`), - KEY `idx_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='礼物打赏记录表'; -``` - -**字段说明:** - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | int | 记录唯一标识 | -| sender_id | int | 送礼用户ID | -| sender_nickname | varchar(50) | 送礼用户昵称 | -| receiver_id | int | 收礼用户ID(主播) | -| receiver_nickname | varchar(50) | 收礼用户昵称 | -| gift_id | int | 礼物ID(关联eb_gift表) | -| gift_count | int | 礼物数量 | -| total_price | decimal(10,2) | 总价格(单价×数量) | -| room_id | int | 直播间ID | -| create_time | timestamp | 打赏时间 | - -### 3. 初始化数据 - -系统预置了20个礼物: - -1. 玫瑰花 - 10钻石 -2. 爱心 - 20钻石 -3. 火箭 - 100钻石 -4. 皇冠 - 500钻石 -5. 跑车 - 1000钻石 -6. 城堡 - 5000钻石 -7. 棒棒糖 - 5钻石 -8. 啤酒 - 15钻石 -9. 蛋糕 - 50钻石 -10. 钻戒 - 2000钻石 -11-20. 其他礼物... - ---- - -## 后端API接口 - -### 基础路径 - -``` -http://your-server.com/api/admin/gift -``` - -### 1. 礼物列表(管理端) - -**接口地址:** `GET /list` - -**请求参数:** - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| page | int | 否 | 页码,默认1 | -| limit | int | 否 | 每页数量,默认10 | -| name | string | 否 | 礼物名称(模糊搜索) | -| status | int | 否 | 状态(0-禁用,1-启用) | - -**响应示例:** - -```json -{ - "code": 200, - "message": null, - "data": { - "page": 1, - "limit": 10, - "totalPage": 2, - "total": 20, - "list": [ - { - "id": 1, - "name": "玫瑰花", - "image": "https://example.com/gifts/rose.png", - "diamondPrice": "10.00", - "intimacy": 10, - "status": true, - "isHeartbeat": false, - "buyType": "diamond", - "belong": "common", - "remark": "浪漫玫瑰", - "level": 1, - "sort": 0, - "createTime": "2025-12-30 20:25:16", - "updateTime": "2025-12-30 20:25:16" - } - ] - } -} -``` - -### 2. 添加礼物 - -**接口地址:** `POST /add` - -**请求体:** - -```json -{ - "name": "新礼物", - "image": "https://example.com/gift.png", - "diamondPrice": 100, - "intimacy": 100, - "isHeartbeat": false, - "level": 1, - "sort": 0, - "status": true, - "buyType": "diamond", - "belong": "common", - "remark": "备注信息" -} -``` - -**响应示例:** - -```json -{ - "code": 200, - "message": "添加成功", - "data": null -} -``` - -### 3. 编辑礼物 - -**接口地址:** `POST /update` - -**请求体:** - -```json -{ - "id": 1, - "name": "更新后的名称", - "image": "https://example.com/new-gift.png", - "diamondPrice": 150, - "intimacy": 150, - "isHeartbeat": true, - "level": 2, - "sort": 1, - "status": true, - "buyType": "diamond", - "belong": "live", - "remark": "更新后的备注" -} -``` - -### 4. 删除礼物 - -**接口地址:** `POST /delete/{id}` - -**路径参数:** -- `id`: 礼物ID - -**响应示例:** - -```json -{ - "code": 200, - "message": "删除成功", - "data": null -} -``` - -### 5. 修改礼物状态 - -**接口地址:** `POST /status/{id}` - -**路径参数:** -- `id`: 礼物ID - -**请求参数:** -- `status`: 状态(0-禁用,1-启用) - -**响应示例:** - -```json -{ - "code": 200, - "message": "状态修改成功", - "data": null -} -``` - -### 6. 打赏记录列表 - -**接口地址:** `GET /records` - -**请求参数:** - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| page | int | 否 | 页码,默认1 | -| limit | int | 否 | 每页数量,默认20 | -| senderName | string | 否 | 送礼用户昵称(模糊搜索) | -| receiverName | string | 否 | 收礼用户昵称(模糊搜索) | -| giftName | string | 否 | 礼物名称(模糊搜索) | - -**响应示例:** diff --git a/礼物系统完整部署指南.md b/礼物系统完整部署指南.md deleted file mode 100644 index 296f05ab..00000000 --- a/礼物系统完整部署指南.md +++ /dev/null @@ -1,145 +0,0 @@ -# 礼物系统完整部署指南 - -## 一、系统功能 - -### 1. 礼物列表(礼物配置) -- 显示所有可用礼物(玫瑰、巧克力、跑车等) -- 可以添加、编辑、删除礼物 -- 设置礼物价格、图标、排序 -- 启用/禁用礼物 - -### 2. 打赏记录 -- 显示所有用户的打赏记录 -- 谁送了什么礼物给哪个主播 -- 在哪个直播间送的 -- 礼物数量和总价值 -- 支持按关键词、日期筛选 -- 显示统计数据(总礼物数、总价值、今日数据) - -### 3. 充值套餐 -- 显示所有充值套餐配置 -- 可以编辑套餐金额、赠送比例 -- 设置热门推荐 - -## 二、部署步骤 - -### 步骤1:部署后端 - -```bash -# 运行部署脚本 -deploy-gift-records-fix.bat -``` - -或手动执行: -```bash -cd Zhibo/zhibo-h -mvn clean package -DskipTests -Pdev - -# 上传到服务器 -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 && ./stop.sh && ./start.sh" -``` - -### 步骤2:部署前端 - -```bash -cd Zhibo/admin -npm run build:prod - -# 上传到服务器 -scp -r dist/* root@1.15.149.240:/www/wwwroot/admin/ -``` - -### 步骤3:验证数据 - -运行SQL检查数据: -```sql --- 检查礼物配置 -SELECT * FROM eb_gift_config ORDER BY sort_order; - --- 检查礼物记录 -SELECT COUNT(*) FROM eb_gift_record; - --- 检查充值套餐 -SELECT * FROM eb_recharge_package ORDER BY sort_order; -``` - -## 三、菜单结构 - -``` -礼物打赏 -├── 礼物列表 - 管理礼物配置(玫瑰、巧克力等) -├── 打赏记录 - 查看所有打赏记录和统计 -└── 充值套餐 - 管理充值套餐配置 -``` - -## 四、API接口 - -### 礼物配置 -- GET `/api/admin/gift/config/list` - 获取礼物列表 -- POST `/api/admin/gift/config/add` - 添加礼物 -- POST `/api/admin/gift/config/update` - 更新礼物 -- POST `/api/admin/gift/config/delete/{id}` - 删除礼物 - -### 打赏记录 -- GET `/api/admin/gift/records` - 获取打赏记录列表 -- GET `/api/admin/gift/statistics` - 获取统计数据 - -### 充值套餐 -- GET `/api/admin/gift/recharge/packages` - 获取充值套餐 -- POST `/api/admin/gift/recharge/package/update` - 更新套餐 - -## 五、数据库表 - -### eb_gift_config - 礼物配置表 -存储礼物的基本信息(名称、图标、价格等) - -### eb_gift_record - 礼物记录表 -存储所有打赏记录,包括: -- sender_id, sender_name - 送礼者 -- receiver_id, receiver_name - 接收者(主播) -- room_id - 直播间 -- gift_id, gift_name - 礼物信息 -- quantity - 数量 -- total_price - 总价 - -### eb_recharge_package - 充值套餐表 -存储充值套餐配置 - -### eb_user.virtual_balance - 用户虚拟货币余额 -存储在用户表的 virtual_balance 字段 - -## 六、测试数据 - -数据库中已有测试数据: -- 10个礼物配置(玫瑰、巧克力、棒棒糖等) -- 12条打赏记录 -- 6个充值套餐 -- 测试用户43、44有10000虚拟币余额 - -## 七、常见问题 - -### 1. 页面显示"暂无数据" -- 检查后端是否正常启动 -- 检查API接口是否返回数据 -- 查看浏览器控制台是否有错误 - -### 2. 数据不显示 -- 确认数据库中有数据 -- 检查后端SQL查询是否正确 -- 查看后端日志 - -### 3. 字段不匹配错误 -- 已修复:quantity 字段 -- 已修复:sender_nickname, receiver_nickname 使用 COALESCE -- 已修复:is_live 替代 status - -## 八、后续优化 - -1. 添加礼物图片上传功能 -2. 添加礼物动画效果预览 -3. 添加打赏记录导出功能 -4. 添加收礼/送礼排行榜 -5. 添加礼物收益统计图表 diff --git a/立即修复余额显示.md b/立即修复余额显示.md deleted file mode 100644 index a3f21daf..00000000 --- a/立即修复余额显示.md +++ /dev/null @@ -1,149 +0,0 @@ -# 立即修复余额显示为0的问题 - -## 问题 -APP钱包页面显示余额为0,但后台管理系统中用户有余额。 - -## 最可能的原因 -数据库中用户的 `now_money` 字段值为0。 - -## 立即执行的修复步骤 - -### 1. 连接数据库并执行SQL -```bash -# 连接到数据库 -mysql -h 1.15.149.240 -u root -p zhibo -``` - -执行以下SQL: -```sql --- 查看用户43的余额 -SELECT uid, account, nickname, now_money FROM eb_user WHERE uid = 43; - --- 如果余额为0,给用户添加测试余额 -UPDATE eb_user SET now_money = 1000.00 WHERE uid = 43; - --- 验证 -SELECT uid, account, nickname, now_money FROM eb_user WHERE uid = 43; -``` - -### 2. 重新部署后端(确保使用最新代码) -```bash -# 运行部署脚本 -deploy-balance-system.bat -``` - -### 3. 重新编译APP -在Android Studio中: -1. Build -> Clean Project -2. Build -> Rebuild Project -3. Run 'app' - -### 4. 测试验证 -1. 打开APP -2. 登录账号 13800000043 / 123456 -3. 进入"我的"页面 -4. 点击"钱包" -5. 应该看到余额显示为 1000.00 - -## 如果还是显示0 - -### 检查APP日志 -```bash -adb logcat -c -adb logcat -s WalletActivity:D -``` - -然后在APP中打开钱包页面,查看日志输出。 - -### 可能的日志输出和对应问题 - -**情况1: 看到 "Response code: 401"** -- 问题:用户未登录或token过期 -- 解决:重新登录APP - -**情况2: 看到 "Response code: 404"** -- 问题:API路径错误 -- 解决:检查后端是否部署成功 - -**情况3: 看到 "Response code: 500"** -- 问题:服务器错误 -- 解决:查看后端日志 -```bash -ssh root@1.15.149.240 "tail -100 /www/server/project/zhibo-h/logs/crmeb-front.log" -``` - -**情况4: 看到 "Balance: 0.0"** -- 问题:数据库中余额确实为0 -- 解决:执行上面的SQL更新余额 - -**情况5: 看到 "Data is null or no balance key"** -- 问题:API返回的数据格式不对 -- 解决:检查后端代码是否正确部署 - -## 使用curl直接测试API - -```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"}' \ - | jq . - -# 复制返回的token - -# 2. 测试余额API -curl -H "Authorization: Bearer YOUR_TOKEN_HERE" \ - http://1.15.149.240:8080/api/front/virtual-currency/balance \ - | jq . -``` - -预期返回: -```json -{ - "success": true, - "code": 200, - "message": "操作成功", - "data": { - "balance": 1000.00, - "userId": 43 - } -} -``` - -## 完整的测试流程 - -### 1. 数据库测试 -```sql --- 执行 fix_balance_display.sql 中的所有SQL -``` - -### 2. 后端测试 -```bash -# 查看后端日志,确认API被调用 -ssh root@1.15.149.240 "tail -f /www/server/project/zhibo-h/logs/crmeb-front.log | grep balance" -``` - -### 3. APP测试 -- 打开钱包页面 -- 查看logcat日志 -- 确认余额显示 - -### 4. 充值测试 -- 点击充值按钮 -- 选择充值套餐 -- 模拟支付 -- 返回查看余额是否增加 - -## 注意事项 - -1. **确保后端已部署最新代码**:修改了 `VirtualCurrencyController.java`,必须重新编译部署 -2. **确保APP已重新编译**:修改了 `WalletActivity.java`,必须重新编译安装 -3. **确保数据库有余额**:`eb_user.now_money` 字段不能为0 -4. **确保用户已登录**:token必须有效 - -## 快速验证命令 - -```bash -# 一键检查所有测试用户的余额 -mysql -h 1.15.149.240 -u root -p -e "USE zhibo; SELECT uid, account, nickname, now_money FROM eb_user WHERE uid IN (43,44,45,46);" -``` diff --git a/立即修复后台统计数据.md b/立即修复后台统计数据.md deleted file mode 100644 index 6c4a819e..00000000 --- a/立即修复后台统计数据.md +++ /dev/null @@ -1,148 +0,0 @@ -# 立即修复后台统计数据显示问题 - -## 当前状态 -- ✅ 后端代码已修改(添加totalLikeCount统计) -- ✅ 前端代码已修改(显示被点赞数) -- ❌ 后端服务未重新部署(导致修改未生效) - -## 快速修复步骤 - -### 第1步:验证数据库有数据(可选) -```bash -# 连接到数据库 -mysql -h 1.15.149.240 -u root -p zhibo - -# 运行以下查询 -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; -``` - -如果看到数据不是0,说明数据库中有数据,只是后端服务没有更新。 - -### 第2步:重新编译后端(在本地执行) -```bash -cd Zhibo\zhibo-h -mvn clean package -DskipTests -``` - -等待编译完成,确认生成了新的jar包: -- 文件位置:`Zhibo\zhibo-h\crmeb-admin\target\crmeb-admin.jar` - -### 第3步:部署到服务器 - -#### 方法A:使用自动脚本(推荐) -直接运行: -```bash -deploy-backend-streamer-fix.bat -``` - -#### 方法B:手动部署 -```bash -# 1. 停止服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose stop crmeb-admin" - -# 2. 备份旧jar包(可选) -ssh root@1.15.149.240 "cp /root/zhibo/crmeb-admin.jar /root/zhibo/crmeb-admin.jar.backup" - -# 3. 上传新jar包 -scp Zhibo\zhibo-h\crmeb-admin\target\crmeb-admin.jar root@1.15.149.240:/root/zhibo/ - -# 4. 启动服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose up -d crmeb-admin" - -# 5. 查看日志确认启动成功 -ssh root@1.15.149.240 "docker logs -f crmeb-admin" -``` - -看到类似 "Started CrmebAdminApplication" 的日志说明启动成功,按Ctrl+C退出日志查看。 - -### 第4步:验证修复 -1. 等待30秒让服务完全启动 -2. 打开浏览器,访问后台管理页面 -3. 按 `Ctrl+Shift+Delete` 清除缓存 -4. 按 `Ctrl+F5` 强制刷新页面 -5. 进入"主播管理"页面 -6. 查看主播列表,确认以下数据正确显示: - - 粉丝数(应该与APP端一致) - - 直播间数 - - 被点赞数(应该与APP端一致) - - 本月直播次数 - -## 预期结果 - -修复后,后台管理页面应该显示: - -| 主播信息 | 主播等级 | 粉丝数 | 直播间数 | 被点赞数 | 本月直播 | 认证时间 | 状态 | -|---------|---------|--------|---------|---------|---------|---------|------| -| 主播A | 初级 | 5 | 2 | 150 | 1次 | 2025-01-01 | 正常 | -| 主播B | 中级 | 10 | 3 | 300 | 2次 | 2025-01-02 | 正常 | - -**注意:** -- "被点赞数"列显示的是主播所有直播间的点赞数总和 -- 数据应该与APP端的"主播中心"页面显示的数据一致 - -## 如果还是显示0 - -### 检查1:确认服务已重启 -```bash -ssh root@1.15.149.240 "docker ps | grep crmeb-admin" -``` -应该看到容器正在运行,且启动时间是最近的。 - -### 检查2:查看服务日志 -```bash -ssh root@1.15.149.240 "docker logs crmeb-admin | tail -100" -``` -查看是否有错误信息。 - -### 检查3:测试API直接返回 -```bash -# 需要先登录获取token,然后: -curl -X GET "http://1.15.149.240:8080/api/admin/streamer/list?page=1&limit=10" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -H "Content-Type: application/json" -``` - -查看返回的JSON中是否包含 `totalLikeCount` 字段。 - -### 检查4:确认前端已更新 -打开浏览器开发者工具(F12),查看Network标签: -1. 刷新页面 -2. 找到 `/api/admin/streamer/list` 请求 -3. 查看Response,确认返回的数据中包含 `totalLikeCount` 字段 - -如果Response中有数据但页面不显示,说明是前端缓存问题,需要: -1. 清除浏览器缓存 -2. 重新构建前端(如果前端也有修改) - -## 前端重新构建(如果需要) - -如果前端代码也有修改,需要重新构建前端: - -```bash -cd Zhibo\admin -npm run build:prod - -# 上传到服务器 -scp -r dist/* root@1.15.149.240:/root/zhibo/admin/ -``` - -## 联系支持 - -如果按照以上步骤操作后问题仍未解决,请提供以下信息: -1. 数据库查询结果(第1步) -2. 后端服务日志 -3. 浏览器Network标签中的API响应 -4. 浏览器Console中的错误信息 - -## 相关文件 -- 详细修复指南:`后台主播统计数据修复指南.md` -- 诊断SQL脚本:`diagnose_streamer_stats_detail.sql` -- 部署脚本:`deploy-backend-streamer-fix.bat` -- API测试脚本:`test_streamer_api.bat` diff --git a/立即执行.md b/立即执行.md deleted file mode 100644 index e69de29b..00000000 diff --git a/管理端优化设计报告.md b/管理端优化设计报告.md deleted file mode 100644 index 4e0e408a..00000000 --- a/管理端优化设计报告.md +++ /dev/null @@ -1,506 +0,0 @@ -# 管理端优化设计报告 - -> 生成时间:2025-12-29 -> 基于移动端功能分析管理端现状,提出优化方案 - ---- - -## 一、现状分析 - -### 1.1 管理端现有模块 - -| 模块分类 | 已有功能 | 完成度 | -|----------|----------|--------| -| 用户管理 | 用户列表、用户等级、用户标签、用户分组、私聊管理 | ✅ 90% | -| 房间管理 | 房间类型、房间背景、房间列表、直播房间 | ✅ 85% | -| 礼物管理 | 礼物列表、坐骑管理 | ✅ 80% | -| 财务管理 | 充值管理、提现管理、账单明细 | ✅ 85% | -| 内容管理 | 动态管理、评论管理、文章管理 | ✅ 80% | -| 系统设置 | 系统配置、敏感词、黑名单 | ✅ 90% | -| 会话管理 | 会话列表、消息查看 | ✅ 70% | - -### 1.2 移动端核心功能模块 - -| 功能模块 | 移动端实现 | 管理端支持 | 差距 | -|----------|------------|------------|------| -| 用户认证 | ✅ 登录/注册/验证码 | ✅ 用户管理 | 无 | -| 直播间 | ✅ 观看/创建/弹幕 | ✅ 房间管理 | 无 | -| 礼物打赏 | ✅ 送礼/充值 | ✅ 礼物管理 | 无 | -| 私聊会话 | ✅ 完整私聊功能 | ⚠️ 基础管理 | 缺少消息审核 | -| 好友管理 | ✅ 添加/删除/请求 | ❌ 无 | **需新增** | -| 语音/视频通话 | ✅ 完整通话功能 | ❌ 无 | **需新增** | -| 在线状态 | ✅ 实时在线检测 | ❌ 无 | **需新增** | -| 作品发布 | ✅ 发布/查看作品 | ❌ 无 | **需新增** | -| 粉丝/关注 | ✅ 关注/粉丝列表 | ⚠️ 基础管理 | 需完善 | -| 通知推送 | ✅ 本地通知 | ❌ 无 | **需新增** | - ---- - -## 二、缺失功能详细分析 - -### 2.1 好友关系管理 ❌ 缺失 - -**移动端功能:** -- 搜索用户添加好友 -- 发送/接收好友请求 -- 好友列表管理 -- 删除好友 - -**管理端需求:** -- 查看所有好友关系 -- 查看好友请求记录 -- 强制解除好友关系 -- 好友关系统计 - -### 2.2 通话记录管理 ❌ 缺失 - -**移动端功能:** -- 语音通话 -- 视频通话 -- 通话记录 -- 未接来电 - -**管理端需求:** -- 通话记录列表 -- 通话时长统计 -- 通话类型分析 -- 异常通话监控 - -### 2.3 在线状态监控 ❌ 缺失 - -**移动端功能:** -- 用户在线状态 -- 房间在线人数 -- WebSocket连接 - -**管理端需求:** -- 实时在线用户数 -- 在线用户列表 -- WebSocket连接监控 -- 在线时长统计 - -### 2.4 作品内容管理 ❌ 缺失 - -**移动端功能:** -- 发布作品(图片/视频) -- 作品详情 -- 点赞/评论 - -**管理端需求:** -- 作品审核 -- 作品列表管理 -- 违规作品处理 -- 作品数据统计 - -### 2.5 消息推送管理 ❌ 缺失 - -**移动端功能:** -- 系统通知 -- 消息提醒 -- 推送设置 - -**管理端需求:** -- 推送消息管理 -- 推送模板配置 -- 推送记录查询 -- 推送效果统计 - ---- - -## 三、优化设计方案 - -### 3.1 新增模块设计 - -#### 3.1.1 好友关系管理模块 - -**路由配置:** `/friend` - -``` -好友管理 -├── 好友关系列表 (/friend/list) -│ ├── 用户1信息(头像、昵称、ID) -│ ├── 用户2信息(头像、昵称、ID) -│ ├── 建立时间 -│ ├── 操作:解除好友 -│ └── 搜索:用户ID/昵称 -│ -├── 好友请求记录 (/friend/requests) -│ ├── 发起人信息 -│ ├── 接收人信息 -│ ├── 请求消息 -│ ├── 状态(待处理/已接受/已拒绝) -│ ├── 请求时间 -│ └── 处理时间 -│ -└── 好友统计 (/friend/statistics) - ├── 总好友对数 - ├── 今日新增好友 - ├── 待处理请求数 - └── 好友关系趋势图 -``` - -**后端API设计:** -``` -GET /api/admin/friend/list - 好友关系列表 -GET /api/admin/friend/requests - 好友请求列表 -DELETE /api/admin/friend/{id} - 解除好友关系 -GET /api/admin/friend/statistics - 好友统计数据 -``` - -#### 3.1.2 通话记录管理模块 - -**路由配置:** `/call` - -``` -通话管理 -├── 通话记录列表 (/call/list) -│ ├── 通话ID -│ ├── 主叫用户(头像、昵称) -│ ├── 被叫用户(头像、昵称) -│ ├── 通话类型(语音/视频) -│ ├── 通话状态(已接通/未接/已拒绝/已取消) -│ ├── 通话时长 -│ ├── 发起时间 -│ ├── 结束时间 -│ └── 搜索:用户ID/通话ID -│ -└── 通话统计 (/call/statistics) - ├── 总通话次数 - ├── 今日通话次数 - ├── 平均通话时长 - ├── 语音/视频占比 - ├── 接通率 - └── 通话趋势图 -``` - -**后端API设计:** -``` -GET /api/admin/call/list - 通话记录列表 -GET /api/admin/call/detail/{id} - 通话详情 -DELETE /api/admin/call/{id} - 删除通话记录 -GET /api/admin/call/statistics - 通话统计数据 -``` - -#### 3.1.3 在线状态监控模块 - -**路由配置:** `/monitor` - -``` -实时监控 -├── 在线概览 (/monitor/overview) -│ ├── 当前在线用户数(实时) -│ ├── 当前活跃房间数 -│ ├── WebSocket连接数 -│ ├── 今日峰值在线 -│ └── 在线趋势图(实时刷新) -│ -├── 在线用户列表 (/monitor/users) -│ ├── 用户信息 -│ ├── 在线时长 -│ ├── 当前位置(房间/私聊) -│ ├── 最后活跃时间 -│ └── 操作:强制下线 -│ -└── 房间在线 (/monitor/rooms) - ├── 房间信息 - ├── 在线人数 - ├── 主播状态 - └── 实时弹幕数 -``` - -**后端API设计:** -``` -GET /api/admin/monitor/overview - 在线概览数据 -GET /api/admin/monitor/users - 在线用户列表 -GET /api/admin/monitor/rooms - 房间在线情况 -POST /api/admin/monitor/kick/{userId} - 强制下线 -GET /api/admin/monitor/websocket - WebSocket状态 -``` - -#### 3.1.4 作品内容管理模块 - -**路由配置:** `/work` - -``` -作品管理 -├── 作品列表 (/work/list) -│ ├── 作品ID -│ ├── 发布者信息 -│ ├── 作品类型(图片/视频) -│ ├── 作品内容预览 -│ ├── 点赞数/评论数 -│ ├── 审核状态 -│ ├── 发布时间 -│ └── 操作:审核/删除/查看详情 -│ -├── 待审核作品 (/work/pending) -│ ├── 作品预览 -│ ├── 发布者信息 -│ └── 操作:通过/拒绝 -│ -└── 作品统计 (/work/statistics) - ├── 总作品数 - ├── 今日发布数 - ├── 待审核数 - └── 作品类型分布 -``` - -**后端API设计:** -``` -GET /api/admin/work/list - 作品列表 -GET /api/admin/work/pending - 待审核作品 -GET /api/admin/work/detail/{id} - 作品详情 -POST /api/admin/work/audit/{id} - 审核作品 -DELETE /api/admin/work/{id} - 删除作品 -GET /api/admin/work/statistics - 作品统计 -``` - -#### 3.1.5 消息推送管理模块 - -**路由配置:** `/push` - -``` -推送管理 -├── 推送消息 (/push/send) -│ ├── 推送类型(全员/指定用户/用户组) -│ ├── 消息标题 -│ ├── 消息内容 -│ ├── 跳转链接 -│ └── 定时发送 -│ -├── 推送记录 (/push/history) -│ ├── 推送ID -│ ├── 推送内容 -│ ├── 推送范围 -│ ├── 发送时间 -│ ├── 送达数/阅读数 -│ └── 状态 -│ -└── 推送模板 (/push/templates) - ├── 模板名称 - ├── 模板内容 - └── 操作:编辑/删除 -``` - -**后端API设计:** -``` -POST /api/admin/push/send - 发送推送 -GET /api/admin/push/history - 推送记录 -GET /api/admin/push/templates - 推送模板列表 -POST /api/admin/push/templates - 创建模板 -PUT /api/admin/push/templates/{id} - 更新模板 -DELETE /api/admin/push/templates/{id} - 删除模板 -``` - ---- - -### 3.2 现有模块优化 - -#### 3.2.1 私聊管理优化 - -**当前问题:** -- 只能查看会话列表 -- 缺少消息内容审核 -- 缺少敏感词过滤记录 - -**优化方案:** -``` -私聊管理(优化后) -├── 会话列表(现有) -├── 消息审核(新增) -│ ├── 疑似违规消息列表 -│ ├── 敏感词触发记录 -│ └── 操作:删除消息/警告用户 -│ -└── 私聊统计(增强) - ├── 消息量趋势 - ├── 活跃用户排行 - └── 敏感词触发统计 -``` - -#### 3.2.2 直播房间管理优化 - -**当前问题:** -- 缺少实时监控 -- 弹幕管理功能弱 - -**优化方案:** -``` -直播房间管理(优化后) -├── 房间列表(现有) -├── 实时监控(新增) -│ ├── 正在直播房间 -│ ├── 实时观看人数 -│ └── 实时弹幕流 -│ -├── 弹幕管理(增强) -│ ├── 弹幕记录查询 -│ ├── 违规弹幕过滤 -│ └── 弹幕关键词屏蔽 -│ -└── 直播统计(新增) - ├── 直播时长统计 - ├── 观看人次统计 - └── 礼物收入统计 -``` - ---- - -## 四、技术实现建议 - -### 4.1 后端新增Controller - -| Controller | 路径 | 功能 | -|------------|------|------| -| FriendAdminController | /api/admin/friend | 好友关系管理 | -| CallAdminController | /api/admin/call | 通话记录管理 | -| MonitorController | /api/admin/monitor | 在线状态监控 | -| WorkAdminController | /api/admin/work | 作品内容管理 | -| PushController | /api/admin/push | 消息推送管理 | - -### 4.2 前端新增路由模块 - -| 模块文件 | 路径 | 说明 | -|----------|------|------| -| friend.js | /src/router/modules/ | 好友管理路由 | -| call.js | /src/router/modules/ | 通话管理路由 | -| monitor.js | /src/router/modules/ | 实时监控路由 | -| work.js | /src/router/modules/ | 作品管理路由 | -| push.js | /src/router/modules/ | 推送管理路由 | - -### 4.3 前端新增API文件 - -| API文件 | 路径 | 说明 | -|---------|------|------| -| friend.js | /src/api/ | 好友管理API | -| call.js | /src/api/ | 通话管理API | -| monitor.js | /src/api/ | 监控API | -| work.js | /src/api/ | 作品管理API | -| push.js | /src/api/ | 推送管理API | - -### 4.4 数据库表设计 - -**已有表(需确认):** -- `eb_friend` - 好友关系表 -- `eb_friend_request` - 好友请求表 -- `eb_call_record` - 通话记录表 -- `eb_conversation` - 会话表 -- `eb_private_message` - 私信消息表 - -**需新增表:** -```sql --- 作品表 -CREATE TABLE eb_work ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - user_id INT NOT NULL COMMENT '发布者ID', - type VARCHAR(20) COMMENT '类型: image/video', - content TEXT COMMENT '作品描述', - media_urls TEXT COMMENT '媒体文件URL(JSON)', - like_count INT DEFAULT 0 COMMENT '点赞数', - comment_count INT DEFAULT 0 COMMENT '评论数', - status TINYINT DEFAULT 0 COMMENT '状态: 0待审核 1已通过 2已拒绝', - create_time DATETIME, - update_time DATETIME, - INDEX idx_user_id (user_id), - INDEX idx_status (status) -); - --- 推送记录表 -CREATE TABLE eb_push_record ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - title VARCHAR(100) COMMENT '推送标题', - content TEXT COMMENT '推送内容', - target_type VARCHAR(20) COMMENT '目标类型: all/user/group', - target_ids TEXT COMMENT '目标ID列表(JSON)', - send_count INT DEFAULT 0 COMMENT '发送数', - read_count INT DEFAULT 0 COMMENT '阅读数', - status TINYINT DEFAULT 0 COMMENT '状态: 0待发送 1已发送', - send_time DATETIME COMMENT '发送时间', - create_time DATETIME -); - --- 推送模板表 -CREATE TABLE eb_push_template ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - name VARCHAR(50) COMMENT '模板名称', - title VARCHAR(100) COMMENT '标题模板', - content TEXT COMMENT '内容模板', - create_time DATETIME, - update_time DATETIME -); -``` - ---- - -## 五、优先级排序 - -### 5.1 高优先级 🔴 (建议立即实现) - -| 功能 | 原因 | 工作量 | -|------|------|--------| -| 通话记录管理 | 移动端已完整实现,管理端无法查看 | 2天 | -| 好友关系管理 | 移动端已完整实现,管理端无法管理 | 2天 | -| 在线状态监控 | 运营必需,了解平台活跃度 | 3天 | - -### 5.2 中优先级 🟡 (建议近期实现) - -| 功能 | 原因 | 工作量 | -|------|------|--------| -| 作品内容管理 | 内容审核需求 | 3天 | -| 私聊管理优化 | 消息审核需求 | 2天 | -| 直播监控优化 | 运营监控需求 | 2天 | - -### 5.3 低优先级 🟢 (可后续实现) - -| 功能 | 原因 | 工作量 | -|------|------|--------| -| 消息推送管理 | 需集成推送服务 | 5天 | -| 数据统计增强 | 锦上添花 | 3天 | - ---- - -## 六、实施计划 - -### 第一阶段(1周) -- [ ] 实现通话记录管理模块 -- [ ] 实现好友关系管理模块 -- [ ] 后端API开发 + 前端页面 - -### 第二阶段(1周) -- [ ] 实现在线状态监控模块 -- [ ] 优化私聊管理功能 -- [ ] WebSocket监控集成 - -### 第三阶段(1周) -- [ ] 实现作品内容管理模块 -- [ ] 优化直播房间管理 -- [ ] 数据统计功能增强 - -### 第四阶段(2周) -- [ ] 实现消息推送管理 -- [ ] 集成推送服务(极光/个推) -- [ ] 整体测试和优化 - ---- - -## 七、总结 - -### 管理端与移动端功能对比 - -| 维度 | 移动端 | 管理端现状 | 优化后 | -|------|--------|------------|--------| -| 核心功能覆盖 | 100% | 70% | 95% | -| 数据管理能力 | - | 75% | 90% | -| 实时监控能力 | - | 30% | 85% | -| 内容审核能力 | - | 50% | 85% | - -### 预期效果 - -1. **运营效率提升**:新增监控模块,实时掌握平台状态 -2. **内容安全保障**:完善审核功能,及时处理违规内容 -3. **数据分析能力**:增强统计功能,支持运营决策 -4. **功能完整性**:管理端覆盖移动端所有核心功能 - ---- - -*报告生成完毕* diff --git a/管理端功能清单报告.md b/管理端功能清单报告.md deleted file mode 100644 index 99f41883..00000000 --- a/管理端功能清单报告.md +++ /dev/null @@ -1,766 +0,0 @@ -# 直播平台管理端功能清单报告 - -> 生成时间:2024年12月29日 -> 项目路径:Zhibo/admin (前端) | Zhibo/zhibo-h (后端) - ---- - -## 一、系统概述 - -管理端采用 Vue.js + Element UI 前端框架,Spring Boot 后端框架,实现了直播平台的全面管理功能。 - -### 技术栈 -- 前端:Vue 2.x + Element UI + Vue Router + Vuex -- 后端:Spring Boot + MyBatis Plus + MySQL + Redis -- API 基础路径:`/api/admin/` - ---- - -## 二、功能模块总览 - -| 序号 | 模块名称 | 路由前缀 | 功能数量 | 状态 | -|------|----------|----------|----------|------| -| 1 | 数据监控 | /monitor | 4 | ✅ 完整 | -| 2 | 用户管理 | /userManage | 11 | ✅ 完整 | -| 3 | 直播管理 | /liveManage | 7 | ✅ 完整 | -| 4 | 社交互动 | /socialManage | 13 | ✅ 完整 | -| 5 | 礼物打赏 | /giftManage | 3 | ✅ 完整 | -| 6 | 虚拟道具 | /virtualProps | 2 | ✅ 完整 | -| 7 | 营销活动 | /activityManage | 5 | ✅ 完整 | -| 8 | 任务系统 | /taskManage | 5 | ✅ 完整 | -| 9 | 财务管理 | /financeManage | 12 | ✅ 完整 | -| 10 | 订单商城 | /shopManage | 6 | ✅ 完整 | -| 11 | 内容管理 | /contentManage | 4 | ✅ 完整 | -| 12 | 用户反馈 | /feedbackManage | 3 | ✅ 完整 | -| 13 | 代理管理 | /agentManage | 3 | ✅ 完整 | -| 14 | 系统设置 | /systemSetting | 18 | ✅ 完整 | - ---- - -## 三、详细功能清单 - -### 1. 数据监控 (/monitor) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 监控概览 | /monitor/overview | monitor/overview/index.vue | monitor.js | MonitorController.java | -| 在线用户 | /monitor/users | monitor/users/index.vue | monitor.js | MonitorController.java | -| 活跃房间 | /monitor/rooms | monitor/rooms/index.vue | monitor.js | MonitorController.java | -| 系统状态 | /monitor/system | monitor/system/index.vue | monitor.js | MonitorController.java | - -**API接口:** -- `GET /admin/monitor/overview` - 在线概览 -- `GET /admin/monitor/users` - 在线用户列表 -- `GET /admin/monitor/rooms` - 活跃房间列表 -- `POST /admin/monitor/kick/{userId}` - 强制用户下线 -- `POST /admin/monitor/room/close/{roomId}` - 关闭直播间 -- `GET /admin/monitor/trends` - 数据趋势 -- `GET /admin/monitor/system` - 系统状态 - ---- - -### 2. 用户管理 (/userManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 用户列表 | /userManage/list | user/list/index.vue | user.js | UserController.java | -| 私聊管理 | /userManage/chat | user/chat/index.vue | chat.js | ChatManagementController.java | -| 用户等级 | /userManage/grade | user/grade/index.vue | user.js | UserLevelController.java | -| 用户标签 | /userManage/label | user/group/index.vue | user.js | UserGroupController.java | -| 会员包管理 | /userManage/member/package | member/package/index.vue | memberPackage.js | MemberPackageController.java | -| 贵族等级 | /userManage/noble/list | noble/list.vue | nobleLevel.js | NobleLevelController.java | -| 魅力值等级 | /userManage/charm/level | charm/level/index.vue | charmLevel.js | CharmLevelController.java | -| 车辆认证 | /userManage/auth/car | auth/car/index.vue | carAuth.js | CarAuthController.java | -| 房间拉黑 | /userManage/blacklist/room | blacklist/room.vue | blacklist.js | BlacklistController.java | -| 用户拉黑 | /userManage/blacklist/user | blacklist/user.vue | blacklist.js | BlacklistController.java | - -**API接口:** -- `GET /admin/user/list` - 用户列表 -- `GET /admin/user/info/{id}` - 用户详情 -- `POST /admin/user/update` - 更新用户 -- `POST /admin/user/operate/founds` - 积分余额操作 -- `GET /admin/user/level/list` - 等级列表 -- `GET /admin/user/group/list` - 分组列表 -- `GET /admin/user/tag/list` - 标签列表 - ---- - -### 3. 直播管理 (/liveManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 房间列表 | /liveManage/room/list | room/list/index.vue | room.js | RoomController.java | -| 房间类型 | /liveManage/room/type | room/type/index.vue | room.js | RoomTypeController.java | -| 房间背景 | /liveManage/room/background | room/background/index.vue | room.js | RoomBackgroundController.java | -| 家族列表 | /liveManage/family/list | family/list/index.vue | familyList.js | FamilyListController.java | -| 家族级别 | /liveManage/family/level | family/level/index.vue | familyLevel.js | FamilyLevelController.java | -| 家族成员 | /liveManage/family/member | family/member/index.vue | familyMember.js | FamilyMemberController.java | -| 粉丝团管理 | /liveManage/fanGroup/list | fanGroup/list/index.vue | fanGroup.js | FanGroupController.java | - -**API接口:** -- `GET /admin/room/live/list` - 直播房间列表 -- `POST /admin/room/live/create` - 创建直播房间 -- `POST /admin/room/live/toggle-status/{id}` - 切换直播状态 -- `GET /admin/room/live/chat/{roomId}` - 获取弹幕记录 -- `GET /admin/room/type/list` - 房间类型列表 -- `GET /admin/room/background/list` - 房间背景列表 -- `GET /admin/family/list` - 家族列表 -- `GET /admin/family/level/list` - 家族级别列表 - ---- - -### 4. 社交互动 (/socialManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 好友关系 | /socialManage/friend/list | friend/list/index.vue | friend.js | FriendAdminController.java | -| 好友请求 | /socialManage/friend/requests | friend/requests/index.vue | friend.js | FriendAdminController.java | -| 好友统计 | /socialManage/friend/statistics | friend/statistics/index.vue | friend.js | FriendAdminController.java | -| 关注记录 | /socialManage/follow/record | follow/record/index.vue | followRecord.js | FollowRecordController.java | -| 通话记录 | /socialManage/call/list | call/list/index.vue | call.js | CallAdminController.java | -| 通话统计 | /socialManage/call/statistics | call/statistics/index.vue | call.js | CallAdminController.java | -| 会话管理 | /socialManage/session/list | session/list/index.vue | session.js | SessionController.java | -| 聊天常用语 | /socialManage/chatPhrase/list | chatphrase/list/index.vue | chatPhrase.js | ChatPhraseController.java | -| 动态评论 | /socialManage/comment/dynamic | comment/dynamic/index.vue | comment.js | CommentController.java | -| 评论回复 | /socialManage/comment/reply | comment/reply/index.vue | comment.js | CommentController.java | -| 动态列表 | /socialManage/dynamic/list | dynamic/list/index.vue | userDynamic.js | UserDynamicController.java | -| 互动列表 | /socialManage/interact/index | interact/index.vue | - | - | - -**API接口:** -- `GET /admin/friend/list` - 好友关系列表 -- `GET /admin/friend/requests` - 好友请求列表 -- `DELETE /admin/friend/{id}` - 解除好友关系 -- `GET /admin/friend/statistics` - 好友统计 -- `GET /admin/call/list` - 通话记录列表 -- `GET /admin/call/statistics` - 通话统计 -- `GET /admin/follow/record/list` - 关注记录列表 -- `GET /admin/dynamic/list` - 动态列表 - ---- - -### 5. 礼物打赏 (/giftManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 礼物列表 | /giftManage/list | gift/index.vue | gift.js | GiftAdminController.java | -| 礼物数量 | /giftManage/num | giftnum/index.vue | - | - | -| 打赏记录 | /giftManage/reward/record | giftreward/record/index.vue | giftRewardRecord.js | GiftRewardRecordController.java | - -**API接口:** -- `GET /admin/gift/list` - 礼物列表 -- `POST /admin/gift/add` - 添加礼物 -- `POST /admin/gift/update/{id}` - 更新礼物 -- `POST /admin/gift/status/{id}` - 更新状态 -- `POST /admin/gift/heartbeat/{id}` - 更新心动状态 -- `DELETE /admin/gift/{id}` - 删除礼物 -- `GET /admin/gift/statistics` - 礼物统计 -- `GET /admin/gift/rewardRecord/list` - 打赏记录列表 - ---- - -### 6. 虚拟道具 (/virtualProps) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 坐骑管理 | /virtualProps/mount/list | mount/list/index.vue | mount.js | MountController.java | -| 头饰管理 | /virtualProps/headwear/list | headwear/list/index.vue | headwear.js | HeadwearController.java | - ---- - -### 7. 营销活动 (/activityManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 平台活动 | /activityManage/platform/list | activity/platform/index.vue | platformActivity.js | PlatformActivityController.java | -| 抽奖管理 | /activityManage/lottery/list | lottery/list/index.vue | lotteryPrize.js | LotteryPrizeController.java | -| 营销管理 | /activityManage/marketing/coupon | marketing/coupon/list.vue | marketing.js | StoreCouponController.java | -| 邀请管理 | /activityManage/invite/list | invite/list/index.vue | invite.js | InviteController.java | -| 夫妻相 | /activityManage/couple/list | couple/list/index.vue | - | - | - ---- - -### 8. 任务系统 (/taskManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 签到配置 | /taskManage/sign/config | user/sign/index.vue | sign.js | UserSignAdminController.java | -| 签到记录 | /taskManage/sign/list | user/sign/list.vue | sign.js | UserSignAdminController.java | -| 新手任务 | /taskManage/novice/list | noviceTask/list/index.vue | noviceTask.js | NoviceTaskController.java | -| 任务记录 | /taskManage/novice/userTask | noviceTask/userTask/index.vue | noviceTask.js | NoviceTaskController.java | -| 签到记录 | /taskManage/novice/signin | noviceTask/signin/index.vue | noviceTask.js | NoviceTaskController.java | - ---- - -### 9. 财务管理 (/financeManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 提现审核 | /financeManage/withdraw/index | withdraw/index.vue | withdraw.js | WithdrawController.java | -| 提现金额配置 | /financeManage/withdraw/amount | withdraw/amount/index.vue | withdrawAmount.js | WithdrawAmountController.java | -| 充值记录 | /financeManage/charge/record | financial/record/charge/index.vue | financial.js | UserRechargeController.java | -| 资金监控 | /financeManage/monitor | financial/record/monitor/index.vue | financial.js | FundsMonitorController.java | -| 兑换记录 | /financeManage/exchange/record | exchange/record/index.vue | exchangeRecord.js | ExchangeRecordController.java | -| 金币明细 | /financeManage/detail/coin | financial/coinDetail/index.vue | coinDetail.js | CoinDetailController.java | -| 钻石明细 | /financeManage/detail/diamond | financial/diamondDetail/index.vue | diamondDetail.js | DiamondDetailController.java | -| 魅力值明细 | /financeManage/detail/charm | financial/charmDetail/index.vue | charmDetail.js | CharmDetailController.java | -| 金币钻石配置 | /financeManage/config/goldDiamond | goldDiamondConfig/list/index.vue | goldDiamondConfig.js | GoldDiamondConfigController.java | -| 聊天付费配置 | /financeManage/config/chatPay | chatPayConfig/list/index.vue | chatPayConfig.js | ChatPayConfigController.java | -| 订单列表 | /financeManage/order/list | financial/order/index.vue | financialOrder.js | OrderController.java | -| 充值订单 | /financeManage/order/recharge | financial/rechargeOrder/index.vue | rechargeOrder.js | RechargeOrderController.java | - -**API接口:** -- `GET /admin/withdraw/list` - 提现列表 -- `POST /admin/withdraw/audit/{id}` - 审核提现 -- `GET /admin/recharge/list` - 充值记录 -- `GET /admin/coin-detail/list` - 金币明细 -- `GET /admin/diamond-detail/list` - 钻石明细 -- `GET /admin/exchange/record/list` - 兑换记录 - ---- - -### 10. 订单商城 (/shopManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 商品管理 | /shopManage/product/list | store/index.vue | store.js | StoreProductController.java | -| 订单管理 | /shopManage/order/list | order/index.vue | order.js | StoreOrderController.java | -| 分销管理 | /shopManage/distribution/index | distribution/index.vue | distribution.js | RetailShopController.java | - ---- - -### 11. 内容管理 (/contentManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 文章管理 | /contentManage/article/list | content/article/list.vue | article.js | ArticleController.java | -| 文章分类 | /contentManage/article/category | content/articleclass/list.vue | article.js | CategoryController.java | -| 轮播图管理 | /contentManage/banner/list | banner/index.vue | banner.js | BannerController.java | -| 系统消息 | /contentManage/message/list | systemMessage/list/index.vue | systemMessage.js | SystemMessageController.java | -| 客服联系方式 | /contentManage/help/customerService | help/customerServiceGroup/index.vue | customerServiceGroup.js | CustomerServiceGroupController.java | - ---- - -### 12. 用户反馈 (/feedbackManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 举报列表 | /feedbackManage/report/list | reportFeedback/reportList/index.vue | reportList.js | ReportListController.java | -| 反馈列表 | /feedbackManage/feedback/list | help/feedback/index.vue | feedback.js | FeedbackController.java | -| 申诉管理 | /feedbackManage/appeal/list | appeal/index.vue | appeal.js | - | - ---- - -### 13. 代理管理 (/agentManage) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 代理列表 | /agentManage/list | agent/list/index.vue | agent.js | AgentController.java | -| 代理消息 | /agentManage/message | agent/message/index.vue | agentMessage.js | AgentMessageController.java | -| 代理提现 | /agentManage/withdraw | agent/withdraw/index.vue | agentWithdraw.js | AgentWithdrawController.java | - ---- - -### 14. 系统设置 (/systemSetting) - -| 功能 | 路由 | 视图文件 | API文件 | 后端控制器 | -|------|------|----------|---------|------------| -| 系统设置 | /systemSetting/basic | systemSetting/setting/index.vue | systemConfig.js | SystemConfigController.java | -| 消息通知 | /systemSetting/notification | systemSetting/notification/index.vue | systemSetting.js | SystemNotificationController.java | -| 角色管理 | /systemSetting/role/identity | systemSetting/administratorAuthority/identityManager/index.vue | role.js | SystemRoleController.java | -| 管理员列表 | /systemSetting/role/admin | systemSetting/administratorAuthority/adminList/index.vue | systemadmin.js | SystemAdminController.java | -| 权限规则 | /systemSetting/role/permission | systemSetting/administratorAuthority/permissionRules/index.vue | role.js | SystemMenuController.java | -| 一键换色 | /systemSetting/design/theme | design/theme/index.vue | devise.js | - | -| 页面设计 | /systemSetting/design/page | design/viewDesign/index.vue | pagediy.js | PageDiyController.java | -| 首页装修 | /systemSetting/design/home | design/devise/index.vue | devise.js | PageLayoutController.java | -| 版本管理 | /systemSetting/version/list | clientVersion/list/index.vue | systemVersion.js | SystemVersionController.java | -| 敏感词管理 | /systemSetting/sensitiveWord/list | sensitiveWord/list/index.vue | sensitiveWord.js | SensitiveWordController.java | -| 验证码管理 | /systemSetting/verifycode/list | verifycode/index.vue | - | - | -| 参数配置 | /systemSetting/config/params | config/params/index.vue | configApi.js | SystemConfigController.java | -| 配置分类 | /systemSetting/dev/category | maintain/devconfig/configCategroy.vue | configTabApi.js | SystemGroupController.java | -| 组合数据 | /systemSetting/dev/combinedData | maintain/devconfig/combinedData.vue | systemGroupData.js | SystemGroupDataController.java | -| 素材管理 | /systemSetting/picture | maintain/picture/index.vue | system.js | SystemAttachmentController.java | -| 缓存清除 | /systemSetting/clearCache | maintain/clearCache/index.vue | system.js | - | -| 定时任务 | /systemSetting/schedule/list | maintain/schedule/list/index.vue | schedule.js | ScheduleJobController.java | -| 任务日志 | /systemSetting/schedule/log | maintain/schedule/logList/index.vue | schedule.js | ScheduleJobController.java | - ---- - -## 四、主页仪表盘 - -### 实时数据监控(20项指标) - -| 指标 | 说明 | API字段 | -|------|------|---------| -| 会员总注册数 | 平台总用户数 | totalUsers | -| 今日注册会员 | 当日新增用户 | todayUsers | -| 充值总金额 | 历史充值总额 | totalRecharge | -| 今日充值金额 | 当日充值金额 | todayRecharge | -| 提现总金额 | 历史提现总额 | totalWithdraw | -| 今日提现金额 | 当日提现金额 | todayWithdraw | -| 钻石总余额 | 用户钻石总量 | totalDiamond | -| 金币总余额 | 用户金币总量 | totalCoin | -| 今日礼物订单 | 当日礼物订单数 | todayGiftOrders | -| 礼物订单总额 | 历史礼物总金额 | totalGiftAmount | -| 今日礼物金额 | 当日礼物金额 | todayGiftAmount | -| 正在直播 | 当前直播房间数 | liveRooms | -| 当前观众数 | 在线观看人数 | totalViewers | -| 今日签到用户 | 当日签到人数 | todaySignUsers | -| 今日任务赠送 | 当日任务奖励 | todayTaskReward | -| 历史余额赠送 | 系统赠送总额 | totalGiftBalance | -| 动态总数 | 用户动态数量 | totalDynamics | -| 评论总数 | 评论数量 | totalComments | -| 待处理反馈 | 未处理反馈数 | totalFeedbacks | -| 待处理举报 | 未处理举报数 | totalReports | -| 当前在线用户 | 5分钟内活跃用户 | onlineUsers | - -### 原有图表组件 - -- 销售额/用户访问量/订单量/新增用户(baseInfo) -- 快捷入口/经营数据(gridMenu) -- 用户概览/用户渠道饼图(userOverview) -- 订单统计(30天/周/月/年)(visitChart) -- 用户统计折线图(userChart) - ---- - -## 五、API文件清单(99个) - -| 序号 | 文件名 | 功能描述 | -|------|--------|----------| -| 1 | agent.js | 代理管理 | -| 2 | agentMessage.js | 代理消息 | -| 3 | agentWithdraw.js | 代理提现 | -| 4 | appeal.js | 申诉管理 | -| 5 | article.js | 文章管理 | -| 6 | authInformation.js | 认证信息 | -| 7 | banner.js | 轮播图管理 | -| 8 | blacklist.js | 黑名单管理 | -| 9 | call.js | 通话管理 | -| 10 | carAuth.js | 车辆认证 | -| 11 | categoryApi.js | 分类管理 | -| 12 | certification.js | 实名认证 | -| 13 | charmDetail.js | 魅力值明细 | -| 14 | charmLevel.js | 魅力值等级 | -| 15 | chat.js | 聊天管理 | -| 16 | chatPayConfig.js | 聊天付费配置 | -| 17 | chatPhrase.js | 聊天常用语 | -| 18 | coinDetail.js | 金币明细 | -| 19 | comment.js | 评论管理 | -| 20 | configApi.js | 配置接口 | -| 21 | configTabApi.js | 配置分类 | -| 22 | customerService.js | 客服管理 | -| 23 | customerServiceGroup.js | 客服分组 | -| 24 | dashboard.js | 仪表盘数据 | -| 25 | devise.js | 页面设计 | -| 26 | diamondDetail.js | 钻石明细 | -| 27 | diamondRechargeAmount.js | 钻石充值金额 | -| 28 | distribution.js | 分销管理 | -| 29 | dynamic.js | 动态管理 | -| 30 | exchangeDetail.js | 兑换明细 | -| 31 | exchangeRecord.js | 兑换记录 | -| 32 | familyLevel.js | 家族级别 | -| 33 | familyList.js | 家族列表 | -| 34 | familyMember.js | 家族成员 | -| 35 | fanGroup.js | 粉丝团管理 | -| 36 | fans.js | 粉丝管理 | -| 37 | feedback.js | 反馈管理 | -| 38 | financial.js | 财务管理 | -| 39 | financialOrder.js | 财务订单 | -| 40 | followRecord.js | 关注记录 | -| 41 | friend.js | 好友管理 | -| 42 | gift.js | 礼物管理 | -| 43 | giftDetail.js | 礼物明细 | -| 44 | giftRewardRecord.js | 打赏记录 | -| 45 | goldDiamondConfig.js | 金币钻石配置 | -| 46 | headwear.js | 头饰管理 | -| 47 | invite.js | 邀请管理 | -| 48 | liveRecharge.js | 直播充值 | -| 49 | logistics.js | 物流管理 | -| 50 | lotteryPrize.js | 抽奖奖品 | -| 51 | lotteryProbability.js | 抽奖概率 | -| 52 | marketing.js | 营销管理 | -| 53 | matchText.js | 匹配文本 | -| 54 | memberPackage.js | 会员包管理 | -| 55 | monitor.js | 监控管理 | -| 56 | mount.js | 坐骑管理 | -| 57 | mountList.js | 坐骑列表 | -| 58 | mountOrder.js | 坐骑订单 | -| 59 | mountPurchaseRecord.js | 坐骑购买记录 | -| 60 | nobleLevel.js | 贵族等级 | -| 61 | noviceTask.js | 新手任务 | -| 62 | order.js | 订单管理 | -| 63 | orderManage.js | 订单管理扩展 | -| 64 | pagediy.js | 页面DIY | -| 65 | platformActivity.js | 平台活动 | -| 66 | purchaseDetail.js | 购买明细 | -| 67 | receiveGiftDetail.js | 收礼明细 | -| 68 | rechargeOrder.js | 充值订单 | -| 69 | report.js | 举报管理 | -| 70 | reportList.js | 举报列表 | -| 71 | req.js | 请求封装 | -| 72 | role.js | 角色管理 | -| 73 | roleApi.js | 角色接口 | -| 74 | room.js | 房间管理 | -| 75 | schedule.js | 定时任务 | -| 76 | sensitiveWord.js | 敏感词管理 | -| 77 | session.js | 会话管理 | -| 78 | sign.js | 签到管理 | -| 79 | sms.js | 短信管理 | -| 80 | socialDynamic.js | 社交动态 | -| 81 | statistic.js | 统计数据 | -| 82 | store.js | 商品管理 | -| 83 | storePoint.js | 积分商城 | -| 84 | system.js | 系统管理 | -| 85 | systemadmin.js | 管理员管理 | -| 86 | systemConfig.js | 系统配置 | -| 87 | systemFormConfig.js | 表单配置 | -| 88 | systemGroup.js | 系统分组 | -| 89 | systemGroupData.js | 组合数据 | -| 90 | systemMessage.js | 系统消息 | -| 91 | systemSetting.js | 系统设置 | -| 92 | systemVersion.js | 版本管理 | -| 93 | user.js | 用户管理 | -| 94 | userDynamic.js | 用户动态 | -| 95 | withdraw.js | 提现管理 | -| 96 | withdrawAmount.js | 提现金额配置 | -| 97 | withdrawApproved.js | 已审核提现 | -| 98 | withdrawPending.js | 待审核提现 | -| 99 | wxApi.js | 微信接口 | - ---- - -## 六、后端控制器清单(128个) - -| 序号 | 控制器名称 | 功能描述 | -|------|------------|----------| -| 1 | ActivityStyleController.java | 活动样式管理 | -| 2 | AdminLoginController.java | 管理员登录 | -| 3 | AgentController.java | 代理管理 | -| 4 | AgentMessageController.java | 代理消息 | -| 5 | AgentWithdrawController.java | 代理提现 | -| 6 | ArticleController.java | 文章管理 | -| 7 | BannerController.java | 轮播图管理 | -| 8 | BlacklistController.java | 黑名单管理 | -| 9 | CallAdminController.java | 通话管理 | -| 10 | CallbackController.java | 回调处理 | -| 11 | CarAuthController.java | 车辆认证 | -| 12 | CategoryController.java | 分类管理 | -| 13 | CharmDetailController.java | 魅力值明细 | -| 14 | CharmLevelController.java | 魅力值等级 | -| 15 | ChatManagementController.java | 聊天管理 | -| 16 | ChatPayConfigController.java | 聊天付费配置 | -| 17 | ChatPhraseController.java | 聊天常用语 | -| 18 | CoinDetailController.java | 金币明细 | -| 19 | CommentController.java | 评论管理 | -| 20 | CopyrightController.java | 版权管理 | -| 21 | CustomerServiceGroupController.java | 客服分组 | -| 22 | DashboardController.java | 仪表盘数据 | -| 23 | DiamondDetailController.java | 钻石明细 | -| 24 | DiamondRechargeAmountController.java | 钻石充值金额 | -| 25 | DynamicController.java | 动态管理 | -| 26 | ExcelController.java | Excel导出 | -| 27 | ExchangeDetailController.java | 兑换明细 | -| 28 | ExchangeRecordController.java | 兑换记录 | -| 29 | ExpressController.java | 快递管理 | -| 30 | FamilyLevelController.java | 家族级别 | -| 31 | FamilyListController.java | 家族列表 | -| 32 | FamilyMemberController.java | 家族成员 | -| 33 | FanGroupController.java | 粉丝团管理 | -| 34 | FeedbackController.java | 反馈管理 | -| 35 | FollowRecordController.java | 关注记录 | -| 36 | FriendAdminController.java | 好友管理 | -| 37 | FundsMonitorController.java | 资金监控 | -| 38 | GiftAdminController.java | 礼物管理 | -| 39 | GiftDetailController.java | 礼物明细 | -| 40 | GiftRewardRecordController.java | 打赏记录 | -| 41 | GoldDiamondConfigController.java | 金币钻石配置 | -| 42 | HeadwearController.java | 头饰管理 | -| 43 | HomeController.java | 首页数据 | -| 44 | InviteController.java | 邀请管理 | -| 45 | LiveRechargeController.java | 直播充值 | -| 46 | LotteryPrizeController.java | 抽奖奖品 | -| 47 | LotteryProbabilityController.java | 抽奖概率 | -| 48 | MatchTextController.java | 匹配文本 | -| 49 | MemberPackageController.java | 会员包管理 | -| 50 | MenuInitController.java | 菜单初始化 | -| 51 | MonitorController.java | 监控管理 | -| 52 | MountController.java | 坐骑管理 | -| 53 | MountListController.java | 坐骑列表 | -| 54 | MountOrderController.java | 坐骑订单 | -| 55 | MountPurchaseRecordController.java | 坐骑购买记录 | -| 56 | NobleLevelController.java | 贵族等级 | -| 57 | NoviceTaskController.java | 新手任务 | -| 58 | OnePassController.java | 一键通行 | -| 59 | OrderController.java | 订单管理 | -| 60 | OrderManageController.java | 订单管理扩展 | -| 61 | PageDiyController.java | 页面DIY | -| 62 | PageLayoutController.java | 页面布局 | -| 63 | PlatformActivityController.java | 平台活动 | -| 64 | PurchaseDetailController.java | 购买明细 | -| 65 | ReceiveGiftDetailController.java | 收礼明细 | -| 66 | RechargeOrderController.java | 充值订单 | -| 67 | ReportController.java | 举报管理 | -| 68 | ReportListController.java | 举报列表 | -| 69 | RetailShopController.java | 分销管理 | -| 70 | RoomBackgroundController.java | 房间背景 | -| 71 | RoomController.java | 房间管理 | -| 72 | RoomTypeController.java | 房间类型 | -| 73 | ScheduleJobController.java | 定时任务 | -| 74 | SensitiveWordController.java | 敏感词管理 | -| 75 | SessionController.java | 会话管理 | -| 76 | ShippingTemplatesController.java | 运费模板 | -| 77 | ShippingTemplatesFreeController.java | 包邮模板 | -| 78 | ShippingTemplatesRegionController.java | 区域运费 | -| 79 | SmsRecordController.java | 短信记录 | -| 80 | StoreBargainController.java | 砍价活动 | -| 81 | StoreCombinationController.java | 拼团活动 | -| 82 | StoreCouponController.java | 优惠券管理 | -| 83 | StoreCouponUserController.java | 用户优惠券 | -| 84 | StoreOrderController.java | 商城订单 | -| 85 | StoreOrderStatusController.java | 订单状态 | -| 86 | StoreProductController.java | 商品管理 | -| 87 | StoreProductReplyController.java | 商品评价 | -| 88 | StoreProductRuleController.java | 商品规则 | -| 89 | StoreSeckillController.java | 秒杀活动 | -| 90 | StoreSeckillMangerController.java | 秒杀管理 | -| 91 | SystemAdminController.java | 管理员管理 | -| 92 | SystemAttachmentController.java | 素材管理 | -| 93 | SystemCityController.java | 城市管理 | -| 94 | SystemConfigController.java | 系统配置 | -| 95 | SystemFormTempController.java | 表单模板 | -| 96 | SystemGroupController.java | 系统分组 | -| 97 | SystemGroupDataController.java | 组合数据 | -| 98 | SystemMenuController.java | 菜单管理 | -| 99 | SystemMessageController.java | 系统消息 | -| 100 | SystemNotificationController.java | 消息通知 | -| 101 | SystemRoleController.java | 角色管理 | -| 102 | SystemStoreController.java | 门店管理 | -| 103 | SystemStoreStaffController.java | 门店员工 | -| 104 | SystemUserLevelController.java | 用户等级 | -| 105 | SystemVersionController.java | 版本管理 | -| 106 | SystemWriteOffOrderController.java | 核销订单 | -| 107 | TemplateMessageController.java | 模板消息 | -| 108 | UploadController.java | 文件上传 | -| 109 | UserController.java | 用户管理 | -| 110 | UserDynamicController.java | 用户动态 | -| 111 | UserExtractController.java | 用户提现 | -| 112 | UserGroupController.java | 用户分组 | -| 113 | UserIntegralController.java | 用户积分 | -| 114 | UserLevelController.java | 用户等级 | -| 115 | UserRechargeController.java | 用户充值 | -| 116 | UserSignAdminController.java | 签到管理 | -| 117 | UserStatisticsController.java | 用户统计 | -| 118 | UserTagController.java | 用户标签 | -| 119 | WeChatAdminController.java | 微信管理 | -| 120 | WechatCallbackController.java | 微信回调 | -| 121 | WeChatController.java | 微信接口 | -| 122 | WechatMediaController.java | 微信素材 | -| 123 | WechatReplyController.java | 微信回复 | -| 124 | WithdrawAmountController.java | 提现金额配置 | -| 125 | WithdrawApprovedController.java | 已审核提现 | -| 126 | WithdrawController.java | 提现管理 | -| 127 | WithdrawPendingController.java | 待审核提现 | -| 128 | YlyPrintController.java | 易联云打印 | - ---- - -## 七、视图文件夹清单(73个) - -| 序号 | 文件夹名 | 功能描述 | -|------|----------|----------| -| 1 | activity | 活动管理 | -| 2 | agent | 代理管理 | -| 3 | appeal | 申诉管理 | -| 4 | appSetting | 应用设置 | -| 5 | auth | 认证管理 | -| 6 | banner | 轮播图管理 | -| 7 | blacklist | 黑名单管理 | -| 8 | call | 通话管理 | -| 9 | certification | 实名认证 | -| 10 | charm | 魅力值管理 | -| 11 | chatpay | 聊天付费 | -| 12 | chatPayConfig | 聊天付费配置 | -| 13 | chatphrase | 聊天常用语 | -| 14 | clientVersion | 客户端版本 | -| 15 | coinexchange | 金币兑换 | -| 16 | comment | 评论管理 | -| 17 | config | 配置管理 | -| 18 | content | 内容管理 | -| 19 | couple | 夫妻相活动 | -| 20 | dashboard | 仪表盘 | -| 21 | design | 页面设计 | -| 22 | detail | 明细管理 | -| 23 | distribution | 分销管理 | -| 24 | dynamic | 动态管理 | -| 25 | error-log | 错误日志 | -| 26 | error-page | 错误页面 | -| 27 | exchange | 兑换管理 | -| 28 | family | 家族管理 | -| 29 | fanGroup | 粉丝团管理 | -| 30 | fans | 粉丝管理 | -| 31 | financial | 财务管理 | -| 32 | follow | 关注管理 | -| 33 | friend | 好友管理 | -| 34 | gift | 礼物管理 | -| 35 | giftnum | 礼物数量 | -| 36 | giftreward | 礼物打赏 | -| 37 | goldDiamondConfig | 金币钻石配置 | -| 38 | headwear | 头饰管理 | -| 39 | help | 帮助中心 | -| 40 | interact | 互动管理 | -| 41 | invite | 邀请管理 | -| 42 | level | 等级管理 | -| 43 | login | 登录页面 | -| 44 | lottery | 抽奖管理 | -| 45 | maintain | 系统维护 | -| 46 | marketing | 营销管理 | -| 47 | member | 会员管理 | -| 48 | mobile | 移动端管理 | -| 49 | monitor | 监控管理 | -| 50 | mount | 坐骑管理 | -| 51 | mountpurchase | 坐骑购买 | -| 52 | newtask | 新任务 | -| 53 | noble | 贵族管理 | -| 54 | noviceTask | 新手任务 | -| 55 | order | 订单管理 | -| 56 | orderManage | 订单管理扩展 | -| 57 | redirect | 重定向 | -| 58 | report | 举报管理 | -| 59 | reportFeedback | 举报反馈 | -| 60 | room | 房间管理 | -| 61 | sensitive | 敏感词 | -| 62 | sensitiveWord | 敏感词管理 | -| 63 | session | 会话管理 | -| 64 | sms | 短信管理 | -| 65 | store | 商品管理 | -| 66 | sysconfig | 系统配置 | -| 67 | systemMessage | 系统消息 | -| 68 | systemSetting | 系统设置 | -| 69 | task | 任务管理 | -| 70 | user | 用户管理 | -| 71 | verifycode | 验证码管理 | -| 72 | version | 版本管理 | -| 73 | withdraw | 提现管理 | - ---- - -## 八、路由模块清单 - -### 主路由模块(14个整合模块) - -| 序号 | 模块文件 | 路由前缀 | 功能描述 | -|------|----------|----------|----------| -| 1 | monitorManage.js | /monitor | 数据监控 | -| 2 | userManage.js | /userManage | 用户管理 | -| 3 | liveManage.js | /liveManage | 直播管理 | -| 4 | socialManage.js | /socialManage | 社交互动 | -| 5 | giftManage.js | /giftManage | 礼物打赏 | -| 6 | virtualProps.js | /virtualProps | 虚拟道具 | -| 7 | activityManage.js | /activityManage | 营销活动 | -| 8 | taskManage.js | /taskManage | 任务系统 | -| 9 | financeManage.js | /financeManage | 财务管理 | -| 10 | shopManage.js | /shopManage | 订单商城 | -| 11 | contentManage.js | /contentManage | 内容管理 | -| 12 | feedbackManage.js | /feedbackManage | 用户反馈 | -| 13 | agentManage.js | /agentManage | 代理管理 | -| 14 | systemSetting.js | /systemSetting | 系统设置 | - ---- - -## 九、数据库菜单配置 - -菜单数据存储在 `eb_system_menu` 表中,通过 Redis 缓存(key: `menuList`)加速访问。 - -### 菜单层级结构 - -``` -一级菜单(pid=0) -├── 二级菜单(pid=一级菜单id) -│ ├── 三级菜单/功能按钮 -│ └── ... -└── ... -``` - -### 菜单更新流程 - -1. 修改数据库 `eb_system_menu` 表 -2. 清除 Redis 缓存:`DEL menuList` -3. 刷新浏览器缓存 -4. 重新登录管理端 - ---- - -## 十、统计汇总 - -| 项目 | 数量 | -|------|------| -| 功能模块 | 14 | -| API文件 | 99 | -| 后端控制器 | 128 | -| 视图文件夹 | 73 | -| 路由模块 | 14 | -| 仪表盘指标 | 20+ | - ---- - -## 十一、技术架构图 - -``` -┌─────────────────────────────────────────────────────────────┐ -│ 管理端前端 (Vue.js) │ -├─────────────────────────────────────────────────────────────┤ -│ Views (73个) │ Router (14模块) │ API (99个) │ Vuex │ -└────────────────────────────┬────────────────────────────────┘ - │ HTTP/HTTPS - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ 后端服务 (Spring Boot) │ -├─────────────────────────────────────────────────────────────┤ -│ Controllers (128个) │ Services │ DAOs │ Models │ -└────────────────────────────┬────────────────────────────────┘ - │ - ┌──────────────┼──────────────┐ - ▼ ▼ ▼ - ┌────────┐ ┌────────┐ ┌────────┐ - │ MySQL │ │ Redis │ │ OSS │ - │ 数据库 │ │ 缓存 │ │ 存储 │ - └────────┘ └────────┘ └────────┘ -``` - ---- - -## 十二、常用API接口汇总 - -### 用户相关 -- `GET /admin/user/list` - 用户列表 -- `GET /admin/user/info/{id}` - 用户详情 -- `POST /admin/user/update` - 更新用户 -- `POST /admin/user/operate/founds` - 积分余额操作 - -### 直播相关 -- `GET /admin/room/live/list` - 直播房间列表 -- `POST /admin/room/live/create` - 创建直播房间 -- `POST /admin/room/live/toggle-status/{id}` - 切换直播状态 - -### 财务相关 -- `GET /admin/withdraw/list` - 提现列表 -- `POST /admin/withdraw/audit/{id}` - 审核提现 -- `GET /admin/recharge/list` - 充值记录 - -### 礼物相关 -- `GET /admin/gift/list` - 礼物列表 -- `POST /admin/gift/add` - 添加礼物 -- `POST /admin/gift/update/{id}` - 更新礼物 -- `DELETE /admin/gift/{id}` - 删除礼物 - -### 监控相关 -- `GET /admin/monitor/overview` - 在线概览 -- `GET /admin/monitor/users` - 在线用户列表 -- `GET /admin/monitor/rooms` - 活跃房间列表 -- `GET /admin/dashboard/stats` - 仪表盘统计 - ---- - -> 报告生成完毕 -> -> 如有问题请联系开发团队 diff --git a/粉丝团功能开发说明.md b/粉丝团功能开发说明.md deleted file mode 100644 index d023d733..00000000 --- a/粉丝团功能开发说明.md +++ /dev/null @@ -1,146 +0,0 @@ -# 粉丝团功能开发说明 - -## 功能概述 - -粉丝团是主播与粉丝之间建立更紧密联系的功能,粉丝可以加入主播的粉丝团,获得专属徽章,通过送礼物等方式增加亲密度和等级。 - -## 数据库表结构 - -### eb_fan_group(粉丝团表) -| 字段 | 类型 | 说明 | -|------|------|------| -| id | int | 主键ID | -| anchor_id | int | 主播ID | -| anchor_name | varchar | 主播昵称 | -| name | varchar | 粉丝团名称 | -| badge | varchar | 粉丝徽章 | -| badge_color | varchar | 徽章颜色 | -| member_count | int | 成员数量 | -| status | tinyint | 状态(1正常 0解散) | -| create_time | datetime | 创建时间 | - -### eb_fan_group_member(粉丝团成员表) -| 字段 | 类型 | 说明 | -|------|------|------| -| id | int | 主键ID | -| group_id | int | 粉丝团ID | -| uid | int | 用户ID | -| nickname | varchar | 用户昵称 | -| level | int | 粉丝等级(1-10) | -| intimacy | int | 亲密度 | -| status | tinyint | 状态(1正常 0退出) | -| join_time | datetime | 加入时间 | - -## 后端API - -### APP端接口 (FanGroupController) -路径前缀: `/api/front/fan-group` - -| 接口 | 方法 | 说明 | -|------|------|------| -| /my | GET | 获取我的粉丝团(主播) | -| /streamer/{streamerId} | GET | 获取主播的粉丝团 | -| /create | POST | 创建粉丝团 | -| /update | POST | 更新粉丝团信息 | -| /join/{groupId} | POST | 加入粉丝团 | -| /leave/{groupId} | POST | 退出粉丝团 | -| /joined | GET | 获取我加入的粉丝团列表 | -| /{groupId}/members | GET | 获取粉丝团成员列表 | -| /{groupId}/check-joined | GET | 检查是否已加入 | -| /{groupId}/add-intimacy | POST | 增加亲密度 | - -### 后台管理接口 (FanGroupController - admin) -路径前缀: `/api/admin/fan/group` - -| 接口 | 方法 | 说明 | -|------|------|------| -| /list | GET | 粉丝团列表 | -| /delete/{id} | POST | 删除粉丝团 | -| /batch-delete | POST | 批量删除 | -| /member/list | GET | 成员列表 | -| /member/delete/{id} | POST | 移除成员 | - -## Android端实现 - -### 新增文件 -1. `MyFanGroupActivity.java` - 我的粉丝团页面(主播视角) -2. `activity_my_fan_group.xml` - 布局文件 -3. `dialog_create_fan_group.xml` - 创建/编辑粉丝团对话框 -4. `item_fan_group_member.xml` - 成员列表项布局 -5. `bg_badge.xml` - 徽章背景 -6. `bg_level_tag.xml` - 等级标签背景 - -### 入口位置 -- 主播中心页面 (StreamerCenterActivity) 添加"我的粉丝团"入口 - -### ApiService新增接口 -```java -// 粉丝团接口 -@GET("api/front/fan-group/my") -Call>> getMyFanGroup(); - -@GET("api/front/fan-group/streamer/{streamerId}") -Call>> getStreamerFanGroup(@Path("streamerId") int streamerId); - -@POST("api/front/fan-group/create") -Call>> createFanGroup(@Body Map request); - -@POST("api/front/fan-group/update") -Call> updateFanGroup(@Body Map request); - -@POST("api/front/fan-group/join/{groupId}") -Call> joinFanGroup(@Path("groupId") int groupId); - -@POST("api/front/fan-group/leave/{groupId}") -Call> leaveFanGroup(@Path("groupId") int groupId); - -@GET("api/front/fan-group/joined") -Call>>> getJoinedFanGroups(...); - -@GET("api/front/fan-group/{groupId}/members") -Call>>> getFanGroupMembers(...); - -@GET("api/front/fan-group/{groupId}/check-joined") -Call>> checkFanGroupJoined(@Path("groupId") int groupId); -``` - -## 后台管理前端 - -### 已有文件 -- `Zhibo/admin/src/views/fanGroup/list/index.vue` - 粉丝团列表页面 -- `Zhibo/admin/src/api/fanGroup.js` - API接口定义 -- `Zhibo/admin/src/router/modules/fanGroup.js` - 路由配置 - -### 菜单配置 -执行以下SQL显示粉丝团菜单: -```sql -UPDATE eb_system_menu SET is_show = 1 WHERE id = 663; -``` - -## 等级规则 - -粉丝等级根据亲密度自动升级: -- Lv.1: 0-999 亲密度 -- Lv.2: 1000-1999 亲密度 -- Lv.3: 2000-2999 亲密度 -- ... -- Lv.10: 9000+ 亲密度 - -亲密度获取方式: -- 送礼物(礼物价值 = 亲密度增加值) -- 每日签到(+10亲密度) -- 观看直播(每分钟+1亲密度) - -## 部署步骤 - -1. 执行SQL修复菜单显示 -2. 重新编译后端项目 -3. 重新编译Android项目 -4. 重启后端服务 - -## 后续优化 - -1. 粉丝团聊天功能(基于群组系统扩展) -2. 粉丝团专属礼物 -3. 粉丝团排行榜 -4. 粉丝团活动 diff --git a/粉丝团聊天功能实现说明.md b/粉丝团聊天功能实现说明.md deleted file mode 100644 index 28e67d8e..00000000 --- a/粉丝团聊天功能实现说明.md +++ /dev/null @@ -1,35 +0,0 @@ -# 粉丝团聊天功能实现说明 - -## 功能概述 - -粉丝团聊天功能将粉丝团与群组系统关联,实现粉丝团成员之间的聊天交流。 - -## 实现状态 - -### ✅ 已完成 - -1. **数据库改造** - - `eb_fan_group` 表添加 `group_id` 字段关联群组 - - 使用 `eb_group.ext_field1='fan_group'` 标记粉丝团群组 - -2. **后端API (FanGroupController)** - - 创建粉丝团时自动创建关联群组 - - 加入粉丝团时同步加入群组 - - 获取所有粉丝团(创建的+加入的) - -3. **Android端群聊列表** - - 同时加载普通群组和粉丝团 - - 粉丝团带"粉丝团"标签显示 - - 粉丝团排在普通群组前面 - -4. **Android端直播间横幅** - - 关注主播后自动检查粉丝团 - - 未加入时显示横幅(5秒自动消失) - - 支持直接加入粉丝团 - -## 部署步骤 - -1. **数据库已升级** ✅ -2. **重新编译后端** - 包含FanGroupController更新 -3. **重新编译Android APP** - 包含所有UI和逻辑更新 -4. **测试功能** - 创建粉丝团、加入、聊天、横幅显示 diff --git a/编译错误修复.md b/编译错误修复.md deleted file mode 100644 index 8790d8fd..00000000 --- a/编译错误修复.md +++ /dev/null @@ -1,42 +0,0 @@ -# 编译错误修复 - -## 问题 -``` -错误: 找不到符号 -Integer streamerId = AuthHelper.getUserId(this); -符号: 方法 getUserId(StreamerCenterActivity) -位置: 类 AuthHelper -``` - -## 原因 -`AuthHelper` 类没有 `getUserId()` 方法。应该使用 `AuthStore.getUserId()` 方法,且该方法返回的是 `String` 类型,不是 `Integer`。 - -## 解决方案 -已修复 `StreamerCenterActivity.java` 中的 `loadTotalLikes()` 方法: - -```java -// 修复前(错误) -Integer streamerId = AuthHelper.getUserId(this); - -// 修复后(正确) -String streamerIdStr = AuthStore.getUserId(this); -if (streamerIdStr == null) return; - -try { - int streamerId = Integer.parseInt(streamerIdStr); - // ... 使用streamerId -} catch (NumberFormatException e) { - // 用户ID格式错误,忽略 -} -``` - -## 状态 -✅ 已修复,现在可以正常编译了。 - -## 编译命令 -```bash -cd android-app -./gradlew assembleDebug -``` - -或在Android Studio中直接点击"Build" -> "Make Project"。 diff --git a/缘池与许愿树功能开发报告.md b/缘池与许愿树功能开发报告.md deleted file mode 100644 index fd6be123..00000000 --- a/缘池与许愿树功能开发报告.md +++ /dev/null @@ -1,602 +0,0 @@ -# 缘池与许愿树功能开发详细报告 - -## 目录 -1. [项目概述](#一项目概述) -2. [缘池移动端功能开发](#二缘池移动端功能开发) -3. [许愿树功能修复](#三许愿树功能修复) -4. [管理端修复](#四管理端修复) -5. [代码修改详情](#五代码修改详情) -6. [新增文件清单](#六新增文件清单) -7. [API对接说明](#七api对接说明) - ---- - -## 一、项目概述 - -本次开发主要完成了以下工作: -1. 缘池(FishPond)移动端功能完善,包括动态板块加载、图标映射、收起/展开功能 -2. 许愿树管理端路径修复 -3. 管理端API配置和登录页面修复 -4. 远程代码合并与冲突解决 - ---- - -## 二、缘池移动端功能开发 - -### 2.1 FishPondActivity - 缘池主页 - -#### 功能描述 -缘池主页面,展示附近用户轨道、快捷入口、功能板块网格。 - -#### 主要修改 - -**新增成员变量:** -```java -private boolean isCategoryExpanded = true; // 板块是否展开 - -// 手动查找的视图引用(用于收起/展开功能) -private View categoryContainer; -private View toggleCategoryBtn; -private TextView toggleCategoryText; -private ImageView toggleCategoryIcon; -``` - -**新增方法 - setupCategoryToggle():** -```java -/** - * 设置板块隐藏/展开功能 - */ -private void setupCategoryToggle() { - // 使用getResources().getIdentifier动态获取ID - int containerId = getResources().getIdentifier("categoryContainer", "id", getPackageName()); - int btnId = getResources().getIdentifier("toggleCategoryBtn", "id", getPackageName()); - int textId = getResources().getIdentifier("toggleCategoryText", "id", getPackageName()); - int iconId = getResources().getIdentifier("toggleCategoryIcon", "id", getPackageName()); - - categoryContainer = findViewById(containerId); - toggleCategoryBtn = findViewById(btnId); - toggleCategoryText = findViewById(textId); - toggleCategoryIcon = findViewById(iconId); - - if (toggleCategoryBtn != null) { - toggleCategoryBtn.setOnClickListener(v -> { - v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); - toggleCategoryVisibility(); - }); - } -} -``` - -**新增方法 - toggleCategoryVisibility():** -```java -/** - * 切换板块显示/隐藏 - */ -private void toggleCategoryVisibility() { - if (categoryContainer == null) return; - - isCategoryExpanded = !isCategoryExpanded; - - if (isCategoryExpanded) { - // 展开动画 - categoryContainer.setVisibility(View.VISIBLE); - categoryContainer.setAlpha(0f); - categoryContainer.animate() - .alpha(1f) - .setDuration(200) - .start(); - if (toggleCategoryText != null) { - toggleCategoryText.setText("收起"); - } - if (toggleCategoryIcon != null) { - toggleCategoryIcon.animate() - .rotation(0f) - .setDuration(200) - .start(); - } - } else { - // 收起动画 - categoryContainer.animate() - .alpha(0f) - .setDuration(200) - .withEndAction(() -> categoryContainer.setVisibility(View.GONE)) - .start(); - if (toggleCategoryText != null) { - toggleCategoryText.setText("展开"); - } - if (toggleCategoryIcon != null) { - toggleCategoryIcon.animate() - .rotation(180f) - .setDuration(200) - .start(); - } - } -} -``` - -**onCreate方法修改:** -```java -// 新增调用 -setupCategoryToggle(); // 设置板块隐藏/展开功能 -``` - ---- - -### 2.2 CategoryAdapter - 板块适配器 - -#### 功能描述 -动态加载从后端获取的板块列表,将管理端Element UI图标映射到Android drawable资源。 - -#### 完整图标映射表 - -```java -// ========== Element UI 图标 (管理端使用) ========== -// 用户/社交类 - 粉色用户图标 -ICON_MAP.put("el-icon-user", R.drawable.ic_user_24); -ICON_MAP.put("el-icon-user-solid", R.drawable.ic_user_24); -ICON_MAP.put("el-icon-s-custom", R.drawable.ic_user_24); - -// 星星/收藏类 - 黄色星星 -ICON_MAP.put("el-icon-star-on", R.drawable.ic_star_24); -ICON_MAP.put("el-icon-star-off", R.drawable.ic_star_24); -ICON_MAP.put("el-icon-collection", R.drawable.ic_star_24); - -// 手机/移动设备类 - 橙色手机 -ICON_MAP.put("el-icon-mobile", R.drawable.ic_smartphone_24); -ICON_MAP.put("el-icon-mobile-phone", R.drawable.ic_smartphone_24); -ICON_MAP.put("el-icon-phone", R.drawable.ic_smartphone_24); - -// 耳机/KTV类 - 青色耳机 -ICON_MAP.put("el-icon-headset", R.drawable.ic_headset_24); -ICON_MAP.put("el-icon-service", R.drawable.ic_headset_24); - -// 麦克风/语音类 - 蓝色麦克风 -ICON_MAP.put("el-icon-microphone", R.drawable.ic_voice_24); -ICON_MAP.put("el-icon-mic", R.drawable.ic_voice_24); - -// 播放/视频类 - 橙红色播放 -ICON_MAP.put("el-icon-video-play", R.drawable.ic_play_circle_24); -ICON_MAP.put("el-icon-caret-right", R.drawable.ic_play_circle_24); -ICON_MAP.put("el-icon-video-camera", R.drawable.ic_play_circle_24); - -// 瞄准/射击类 - 橙色瞄准镜 -ICON_MAP.put("el-icon-aim", R.drawable.ic_target_24); -ICON_MAP.put("el-icon-position", R.drawable.ic_target_24); -ICON_MAP.put("el-icon-place", R.drawable.ic_target_24); -ICON_MAP.put("el-icon-location", R.drawable.ic_target_24); - -// 九宫格/桌游类 - 青绿色网格 -ICON_MAP.put("el-icon-grid", R.drawable.ic_grid3x3_24); -ICON_MAP.put("el-icon-menu", R.drawable.ic_grid3x3_24); -ICON_MAP.put("el-icon-s-grid", R.drawable.ic_grid3x3_24); -ICON_MAP.put("el-icon-s-operation", R.drawable.ic_grid3x3_24); - -// 游戏手柄类 -ICON_MAP.put("el-icon-coordinate", R.drawable.ic_game_24); -ICON_MAP.put("el-icon-trophy", R.drawable.ic_game_24); - -// 编辑/绘画类 -ICON_MAP.put("el-icon-edit", R.drawable.ic_palette_24); -ICON_MAP.put("el-icon-edit-outline", R.drawable.ic_palette_24); -ICON_MAP.put("el-icon-brush", R.drawable.ic_palette_24); - -// 爱心类 -ICON_MAP.put("el-icon-chat-dot-round", R.drawable.ic_heart_24); -ICON_MAP.put("el-icon-chat-line-round", R.drawable.ic_heart_24); - -// ========== Lucide 图标名称 ========== -ICON_MAP.put("Microphone", R.drawable.ic_voice_24); -ICON_MAP.put("Star", R.drawable.ic_star_24); -ICON_MAP.put("User", R.drawable.ic_user_24); -ICON_MAP.put("Users", R.drawable.ic_user_24); -ICON_MAP.put("Heart", R.drawable.ic_heart_24); -ICON_MAP.put("Gamepad2", R.drawable.ic_game_24); -ICON_MAP.put("Gamepad", R.drawable.ic_game_24); -ICON_MAP.put("Smartphone", R.drawable.ic_smartphone_24); -ICON_MAP.put("Music", R.drawable.ic_headset_24); -ICON_MAP.put("Music2", R.drawable.ic_headset_24); -ICON_MAP.put("Headphones", R.drawable.ic_headset_24); -ICON_MAP.put("Pencil", R.drawable.ic_palette_24); -ICON_MAP.put("Palette", R.drawable.ic_palette_24); -ICON_MAP.put("Target", R.drawable.ic_target_24); -ICON_MAP.put("Crosshair", R.drawable.ic_target_24); -ICON_MAP.put("Dices", R.drawable.ic_grid3x3_24); -ICON_MAP.put("Grid3x3", R.drawable.ic_grid3x3_24); -ICON_MAP.put("Grid", R.drawable.ic_grid3x3_24); -ICON_MAP.put("CirclePlay", R.drawable.ic_play_circle_24); -ICON_MAP.put("Play", R.drawable.ic_play_circle_24); -``` - -#### 智能图标匹配方法 - -```java -private int getIconResource(String iconName) { - if (iconName == null || iconName.isEmpty()) { - android.util.Log.d("CategoryAdapter", "图标名称为空,使用默认图标"); - return ICON_MAP.get("default"); - } - - // 先尝试精确匹配 - Integer res = ICON_MAP.get(iconName); - if (res != null) { - return res; - } - - // 尝试去除空格后匹配 - String trimmed = iconName.trim(); - res = ICON_MAP.get(trimmed); - if (res != null) { - return res; - } - - // 尝试小写匹配(遍历所有key) - String lowerName = trimmed.toLowerCase(); - for (Map.Entry entry : ICON_MAP.entrySet()) { - if (entry.getKey().toLowerCase().equals(lowerName)) { - return entry.getValue(); - } - } - - // 尝试部分匹配(图标名称包含关键词) - if (lowerName.contains("star") || lowerName.contains("collection")) { - return R.drawable.ic_star_24; - } - if (lowerName.contains("user") || lowerName.contains("custom")) { - return R.drawable.ic_user_24; - } - if (lowerName.contains("heart") || lowerName.contains("chat")) { - return R.drawable.ic_heart_24; - } - if (lowerName.contains("mobile") || lowerName.contains("phone") || lowerName.contains("smartphone")) { - return R.drawable.ic_smartphone_24; - } - if (lowerName.contains("headset") || lowerName.contains("headphone") || lowerName.contains("service")) { - return R.drawable.ic_headset_24; - } - if (lowerName.contains("video") || lowerName.contains("play") || lowerName.contains("caret")) { - return R.drawable.ic_play_circle_24; - } - if (lowerName.contains("game") || lowerName.contains("trophy") || lowerName.contains("coordinate")) { - return R.drawable.ic_game_24; - } - if (lowerName.contains("mic") || lowerName.contains("voice")) { - return R.drawable.ic_voice_24; - } - if (lowerName.contains("edit") || lowerName.contains("pencil") || lowerName.contains("brush") || lowerName.contains("palette")) { - return R.drawable.ic_palette_24; - } - if (lowerName.contains("aim") || lowerName.contains("target") || lowerName.contains("crosshair") || lowerName.contains("position") || lowerName.contains("location")) { - return R.drawable.ic_target_24; - } - if (lowerName.contains("grid") || lowerName.contains("dice") || lowerName.contains("menu")) { - return R.drawable.ic_grid3x3_24; - } - - return ICON_MAP.get("default"); -} -``` - ---- - -### 2.3 activity_fish_pond.xml - 布局修改 - -#### 新增板块容器和收起按钮 - -```xml - - - - - - - - - - - - - - - -``` - -#### 修复布局结构 -- 添加缺失的 `orbitContainer` 开始标签 -- 修复 `LinearLayout` 和 `NestedScrollView` 闭合标签 - ---- - -## 三、许愿树功能修复 - -### 3.1 路由文件修复 - -**文件:** `Zhibo/admin/src/router/modules/wishtreeManage.js` - -**修改内容:** 将所有视图路径从大写 `wishTree` 改为小写 `wishtree` - -```javascript -// 修改前 -component: () => import('@/views/wishTree/festival/index') - -// 修改后 -component: () => import('@/views/wishtree/festival/index') -``` - -**涉及的路由:** -- `/wishtree/festival` - 节日管理 -- `/wishtree/wish` - 心愿管理 -- `/wishtree/background` - 背景素材 -- `/wishtree/statistics` - 数据统计 -- `/wishtree/tree` - 许愿树列表 -- `/wishtree/tree/detail/:id` - 许愿树详情 -- `/wishtree/node` - 节点管理 -- `/wishtree/message` - 留言管理 - -### 3.2 API文件重命名 - -**操作:** 将 `Zhibo/admin/src/api/wishTree.js` 重命名为 `wishtree.js` - -**原因:** 视图文件中引用的是 `@/api/wishtree`(小写),但实际文件名是 `wishTree.js`(大写T) - ---- - -## 四、管理端修复 - -### 4.1 API地址配置 - -**文件:** `Zhibo/admin/.env.development` - -```bash -# 修改前 -VUE_APP_BASE_API = 'http://192.168.1.244:30001' - -# 修改后 -VUE_APP_BASE_API = 'http://192.168.1.244:8081' -``` - -### 4.2 登录页面修复 - -**文件:** `Zhibo/admin/src/views/login/index.vue` - -**修改内容:** 添加空值检查,防止后端返回空数据时报错 - -```javascript -// 修改前 -getInfo() { - getLoginPicApi().then((res) => { - this.swiperList = res.banner; - this.loginLogo = res.loginLogo; - this.backgroundImages = res.backgroundImage; - localStorage.setItem('singleAdminSiteName', res.siteName); - }); -}, - -// 修改后 -getInfo() { - getLoginPicApi().then((res) => { - if (res) { - this.swiperList = res.banner || []; - this.loginLogo = res.loginLogo || ''; - this.backgroundImages = res.backgroundImage || ''; - localStorage.setItem('singleAdminSiteName', res.siteName || ''); - } - }).catch(() => { - // 忽略获取登录图片的错误 - }); -}, -``` - ---- - -## 五、代码修改详情 - -### 5.1 修改文件列表 - -| 文件路径 | 修改类型 | 说明 | -|---------|---------|------| -| `android-app/.../FishPondActivity.java` | 修改 | 添加板块收起/展开功能 | -| `android-app/.../CategoryAdapter.java` | 修改 | 完善图标映射和智能匹配 | -| `android-app/.../activity_fish_pond.xml` | 修改 | 添加收起按钮布局 | -| `Zhibo/admin/.../wishtreeManage.js` | 修改 | 修复路由路径 | -| `Zhibo/admin/.../login/index.vue` | 修改 | 添加空值检查 | -| `Zhibo/admin/.env.development` | 修改 | 修复API端口 | -| `Zhibo/admin/src/api/wishtree.js` | 重命名 | 从wishTree.js重命名 | - ---- - -## 六、新增文件清单 - -### 6.1 图标资源文件 - -#### ic_user_24.xml - 用户图标(粉色) -```xml - - - - -``` - -#### ic_smartphone_24.xml - 手机图标(橙色) -```xml - - - - -``` - -#### ic_headset_24.xml - 耳机图标(青色) -```xml - - - - -``` - -#### ic_play_circle_24.xml - 播放图标(橙红色) -```xml - - - - -``` - -#### ic_target_24.xml - 瞄准图标(橙色) -```xml - - - - -``` - -#### ic_grid3x3_24.xml - 九宫格图标(青绿色) -```xml - - - - -``` - ---- - -## 七、API对接说明 - -### 7.1 缘池相关API - -| API | 方法 | 说明 | -|-----|------|------| -| `/api/front/community/categories` | GET | 获取板块列表 | -| `/api/front/community/messages` | GET | 获取消息列表(支持categoryId筛选) | -| `/api/front/community/messages` | POST | 发布消息 | -| `/api/front/community/nearby-users` | GET | 获取附近用户 | - -### 7.2 数据结构 - -#### Category(板块) -```json -{ - "id": 1, - "name": "在线处对象", - "icon": "el-icon-user", - "type": "card", - "jumpPage": "OnlineDatingActivity", - "sort": 90, - "status": 1 -} -``` - -#### Message(消息) -```json -{ - "id": 1, - "uid": 100, - "nickname": "用户昵称", - "avatar": "头像URL", - "categoryId": 1, - "categoryName": "在线处对象", - "content": "消息内容", - "images": "图片URL1,图片URL2", - "status": 1, - "createTime": "2026-01-02 12:00:00" -} -``` - ---- - -## 八、功能验证清单 - -### 8.1 缘池功能 -- [x] 板块从后端动态加载 -- [x] 图标根据管理端设置显示 -- [x] 板块收起/展开动画 -- [x] 点击板块跳转对应页面 -- [x] 附近用户轨道展示 - -### 8.2 许愿树功能 -- [x] 管理端路由正常访问 -- [x] API接口正常调用 - -### 8.3 管理端 -- [x] 登录页面正常显示 -- [x] API连接正常(8081端口) - ---- - -*报告生成时间:2026年1月2日* -*开发环境:Windows / Android Studio / Vue.js* diff --git a/缘池与许愿树管理端功能总结.md b/缘池与许愿树管理端功能总结.md deleted file mode 100644 index 40170d30..00000000 --- a/缘池与许愿树管理端功能总结.md +++ /dev/null @@ -1,320 +0,0 @@ -# 缘池与许愿树管理端功能总结 - -> 更新日期:2025-12-30 - ---- - -## 一、文件结构 - -### 1.1 前端文件 - -``` -Zhibo/admin/src/ -├── api/ -│ ├── fatePool.js # 缘池API -│ └── wishTree.js # 许愿树API -├── router/modules/ -│ ├── fatePool.js # 缘池路由 -│ └── wishTree.js # 许愿树路由 -└── views/ - ├── fatePool/ # 缘池页面 - │ ├── topic/ - │ │ ├── index.vue # 话题管理 - │ │ └── post.vue # 话题发布详情 - │ └── topicUser/ - │ └── index.vue # 用户发布列表 - └── wishTree/ # 许愿树页面 - ├── tree/ - │ ├── index.vue # 许愿树列表 - │ └── detail.vue # 许愿树留言详情 - ├── node/ - │ └── index.vue # 节点管理 - └── message/ - └── index.vue # 用户留言列表 -``` - -### 1.2 后端文件 - -``` -Zhibo/zhibo-h/crmeb-admin/src/main/java/com/zbkj/admin/controller/ -├── FatePoolTopicController.java # 缘池话题管理 -├── FatePoolPostController.java # 缘池用户发布管理 -├── WishTreeController.java # 许愿树管理 -├── WishTreeNodeController.java # 许愿树节点管理 -└── WishTreeMessageController.java # 许愿树留言管理 -``` - -### 1.3 数据库表 - -``` -eb_fate_pool_topic # 缘池话题表 -eb_fate_pool_topic_post # 缘池用户发布表 -eb_wish_tree # 许愿树表 -eb_wish_tree_node # 许愿树节点表 -eb_wish_tree_message # 许愿树留言表 -``` - ---- - -## 二、缘池功能 - -### 2.1 话题管理 - -**页面路径:** `/fatePool/topic` -**页面文件:** `views/fatePool/topic/index.vue` - -| 功能 | 说明 | -|-----|------| -| 话题列表 | 分页展示话题,显示封面、标题、描述、发布数 | -| 搜索 | 按标题模糊搜索、按状态筛选 | -| 新增话题 | 填写标题、描述、封面图URL、排序、状态 | -| 编辑话题 | 修改话题信息 | -| 删除话题 | 删除话题及其下所有发布信息 | -| 状态切换 | 启用/禁用话题 | -| 查看发布 | 跳转到该话题的用户发布列表 | - -**接口列表:** - -| 接口 | 方法 | 路径 | 说明 | -|-----|------|------|------| -| 话题列表 | GET | `/api/admin/fate/pool/topic/list` | 分页查询 | -| 话题详情 | GET | `/api/admin/fate/pool/topic/info/{id}` | 获取单个 | -| 新增话题 | POST | `/api/admin/fate/pool/topic/save` | 创建 | -| 更新话题 | POST | `/api/admin/fate/pool/topic/update` | 修改 | -| 删除话题 | POST | `/api/admin/fate/pool/topic/delete/{id}` | 删除 | -| 修改状态 | POST | `/api/admin/fate/pool/topic/status/{id}` | 切换状态 | - ---- - -### 2.2 用户发布管理 - -**页面路径:** `/fatePool/topicUser` -**页面文件:** `views/fatePool/topicUser/index.vue` - -| 功能 | 说明 | -|-----|------| -| 发布列表 | 分页展示用户发布信息 | -| 搜索 | 按话题筛选、按昵称搜索、按状态筛选 | -| 查看详情 | 弹窗展示完整内容和图片 | -| 删除发布 | 删除用户发布信息 | -| 状态切换 | 显示/隐藏发布信息 | - -**接口列表:** - -| 接口 | 方法 | 路径 | 说明 | -|-----|------|------|------| -| 发布列表 | GET | `/api/admin/fate/pool/post/list` | 分页查询 | -| 发布详情 | GET | `/api/admin/fate/pool/post/info/{id}` | 获取单个 | -| 删除发布 | POST | `/api/admin/fate/pool/post/delete/{id}` | 删除 | -| 修改状态 | POST | `/api/admin/fate/pool/post/status/{id}` | 切换状态 | - ---- - -## 三、许愿树功能 - -### 3.1 许愿树管理 - -**页面路径:** `/wishTree/tree` -**页面文件:** `views/wishTree/tree/index.vue` - -| 功能 | 说明 | -|-----|------| -| 许愿树列表 | 分页展示许愿树,显示封面、名称、节点数、留言数 | -| 搜索 | 按名称模糊搜索 | -| 新增许愿树 | 填写名称、描述、封面图、背景图、排序,可同时添加节点 | -| 编辑许愿树 | 修改许愿树信息和节点 | -| 删除许愿树 | 删除许愿树及其所有节点和留言 | -| 启用/停用 | 设置许愿树启用状态 | -| 查看留言 | 跳转到该许愿树的留言列表 | - -**接口列表:** - -| 接口 | 方法 | 路径 | 说明 | -|-----|------|------|------| -| 许愿树列表 | GET | `/api/admin/wish/tree/list` | 分页查询 | -| 许愿树详情 | GET | `/api/admin/wish/tree/info/{id}` | 获取详情(含节点) | -| 新增许愿树 | POST | `/api/admin/wish/tree/save` | 创建(含节点) | -| 更新许愿树 | POST | `/api/admin/wish/tree/update` | 修改(含节点) | -| 删除许愿树 | POST | `/api/admin/wish/tree/delete/{id}` | 删除 | -| 启用/停用 | POST | `/api/admin/wish/tree/activate/{id}` | 切换启用状态 | - ---- - -### 3.2 节点管理 - -**页面路径:** `/wishTree/node` -**页面文件:** `views/wishTree/node/index.vue` - -| 功能 | 说明 | -|-----|------| -| 节点列表 | 分页展示所有节点,显示所属许愿树、标题、开启时间、留言数 | -| 搜索 | 按许愿树筛选、按标题搜索、按状态筛选 | -| 新增节点 | 选择许愿树、填写标题、描述、图标、开启时间、排序 | -| 编辑节点 | 修改节点信息 | -| 删除节点 | 删除节点及其所有留言 | -| 状态切换 | 启用/禁用节点 | - -**接口列表:** - -| 接口 | 方法 | 路径 | 说明 | -|-----|------|------|------| -| 节点列表 | GET | `/api/admin/wish/tree/node/list` | 分页查询 | -| 节点详情 | GET | `/api/admin/wish/tree/node/info/{id}` | 获取单个 | -| 新增节点 | POST | `/api/admin/wish/tree/node/save` | 创建 | -| 更新节点 | POST | `/api/admin/wish/tree/node/update` | 修改 | -| 删除节点 | POST | `/api/admin/wish/tree/node/delete/{id}` | 删除 | -| 修改状态 | POST | `/api/admin/wish/tree/node/status/{id}` | 切换状态 | - ---- - -### 3.3 用户留言管理 - -**页面路径:** `/wishTree/message` -**页面文件:** `views/wishTree/message/index.vue` - -| 功能 | 说明 | -|-----|------| -| 留言列表 | 分页展示用户留言,显示节点、用户信息、内容、匿名状态 | -| 搜索 | 按许愿树/节点筛选、按昵称搜索、按状态筛选 | -| 查看详情 | 弹窗展示完整内容和图片 | -| 删除留言 | 删除用户留言 | -| 状态切换 | 显示/隐藏留言 | - -**接口列表:** - -| 接口 | 方法 | 路径 | 说明 | -|-----|------|------|------| -| 留言列表 | GET | `/api/admin/wish/tree/message/list` | 分页查询 | -| 留言详情 | GET | `/api/admin/wish/tree/message/info/{id}` | 获取单个 | -| 删除留言 | POST | `/api/admin/wish/tree/message/delete/{id}` | 删除 | -| 修改状态 | POST | `/api/admin/wish/tree/message/status/{id}` | 切换状态 | - ---- - -## 四、接口参数说明 - -### 4.1 通用分页参数 - -| 参数 | 类型 | 必填 | 说明 | -|-----|------|------|------| -| page | Integer | 否 | 页码,默认1 | -| limit | Integer | 否 | 每页数量,默认10 | - -### 4.2 缘池话题接口 - -**列表查询参数:** -```json -{ - "page": 1, - "limit": 10, - "title": "关键词", - "status": 1 -} -``` - -**新增/更新参数:** -```json -{ - "id": 1, - "title": "话题标题", - "description": "话题描述", - "cover_image": "https://xxx.com/cover.jpg", - "sort": 100, - "status": 1 -} -``` - -### 4.3 许愿树接口 - -**新增/更新参数(含节点):** -```json -{ - "id": 1, - "name": "许愿树名称", - "description": "描述", - "cover_image": "https://xxx.com/cover.jpg", - "background_image": "https://xxx.com/bg.jpg", - "sort": 100, - "nodes": [ - { - "title": "节点标题", - "description": "节点描述", - "icon": "https://xxx.com/icon.png", - "open_time": "2026-01-01 00:00:00", - "sort": 0 - } - ] -} -``` - -### 4.4 节点接口 - -**列表查询参数:** -```json -{ - "page": 1, - "limit": 10, - "tree_id": 1, - "title": "关键词", - "status": 1 -} -``` - -**新增/更新参数:** -```json -{ - "id": 1, - "tree_id": 1, - "title": "节点标题", - "description": "节点描述", - "icon": "https://xxx.com/icon.png", - "open_time": "2026-01-01 00:00:00", - "sort": 0, - "status": 1 -} -``` - -### 4.5 留言接口 - -**列表查询参数:** -```json -{ - "page": 1, - "limit": 10, - "tree_id": 1, - "node_id": 1, - "nickname": "昵称", - "status": 1 -} -``` - ---- - -## 五、菜单入口 - -管理后台左侧菜单: - -``` -├── 缘池 -│ ├── 话题管理 /fatePool/topic -│ └── 用户发布 /fatePool/topicUser -└── 许愿树 - ├── 许愿树列表 /wishTree/tree - ├── 留言节点 /wishTree/node - └── 用户留言 /wishTree/message -``` - ---- - -## 六、注意事项 - -1. **响应格式**:后端返回 `{code: 200, message: null, data: ...}`,前端 axios 拦截器会直接返回 `data` 部分 - -2. **图片字段**:`images` 字段存储为 JSON 字符串,前端需要解析 - -3. **开启时间**:节点的 `open_time` 为空表示立即开启 - -4. **级联删除**: - - 删除话题会同时删除该话题下所有发布信息 - - 删除许愿树会同时删除所有节点和留言 - - 删除节点会同时删除该节点下所有留言 diff --git a/虚拟货币余额系统说明.md b/虚拟货币余额系统说明.md deleted file mode 100644 index 06e061fb..00000000 --- a/虚拟货币余额系统说明.md +++ /dev/null @@ -1,147 +0,0 @@ -# 虚拟货币余额系统说明 - -## 数据库表结构 - -### 1. eb_user表(用户余额) -- `virtual_balance` - DECIMAL(10,2) - 用户虚拟货币余额 - -### 2. eb_recharge_package(充值套餐表) -- 存储充值套餐配置 -- 包含充值金额、获得虚拟币、赠送虚拟币等信息 - -### 3. eb_virtual_currency_recharge(充值记录表) -- 记录用户的充值订单 -- 包含订单号、金额、支付状态等 - -### 4. eb_virtual_currency_transaction(交易记录表) -- 记录所有虚拟货币的收支明细 -- 包含充值、消费、退款等类型 - -## 后端API接口 - -### 基础路径 -``` -/api/front/virtual-currency -``` - -### 接口列表 - -1. **获取用户余额** - - GET `/balance` - - 返回:`{ balance: number, userId: number }` - -2. **获取充值套餐列表** - - GET `/recharge/packages` - - 返回:套餐列表(金额、虚拟币数量、赠送等) - -3. **创建充值订单** - - POST `/recharge/create` - - 参数:`{ packageId: number, paymentMethod: string }` - - 返回:订单信息(订单号、金额等) - -4. **模拟支付成功**(测试用) - - POST `/recharge/mock-pay` - - 参数:`{ orderNo: string }` - - 功能:直接完成支付,增加用户余额 - -5. **获取充值记录** - - GET `/recharge/records?page=1&limit=20` - - 返回:充值记录列表 - -6. **获取消费记录** - - GET `/transactions?page=1&limit=20` - - 返回:交易记录列表 - -## APP端实现 - -### 页面结构 - -1. **ProfileActivity(个人中心)** - - 显示"我的钱包"按钮 - - 显示当前余额 - -2. **WalletActivity(钱包页面)** - - 显示虎牙币余额 - - 提供充值入口 - - 提供收支明细入口 - -3. **BalanceActivity(余额详情)** - - 显示详细余额 - - 充值记录和消费记录Tab - -4. **RechargeActivity(充值页面)** - - 显示充值套餐列表 - - 选择支付方式(支付宝/微信) - - 确认充值 - -5. **TransactionHistoryActivity(收支明细)** - - 显示所有交易记录 - -### 数据流程 - -1. **查看余额** - ``` - 用户打开钱包 → 调用 /balance 接口 → 显示余额 - ``` - -2. **充值流程** - ``` - 选择套餐 → 选择支付方式 → 创建订单 → 模拟支付 → 余额增加 - ``` - -3. **余额更新** - ``` - 充值成功 → 更新 eb_user.virtual_balance → 记录到 eb_virtual_currency_transaction - ``` - -## 使用说明 - -### 测试充值功能 - -1. 登录APP -2. 进入"我的"页面 -3. 点击"我的钱包" -4. 点击"充值"按钮 -5. 选择充值套餐 -6. 选择支付方式(支付宝/微信) -7. 点击"确认充值" -8. 系统自动模拟支付成功 -9. 余额立即更新 - -### 查看余额 - -- 个人中心:显示简要余额 -- 钱包页面:显示详细余额和虎牙币图标 -- 余额详情:显示充值记录和消费记录 - -## 后续扩展 - -### 支付集成(待实现) - -目前使用模拟支付,后续可以集成: - -1. **支付宝支付** - - 集成支付宝SDK - - 在createRechargeOrder后跳转到支付宝 - - 支付成功后回调更新余额 - -2. **微信支付** - - 集成微信支付SDK - - 在createRechargeOrder后跳转到微信 - - 支付成功后回调更新余额 - -### 消费功能 - -余额可用于: -- 送礼物给主播 -- 购买虚拟道具 -- 开通会员服务 -- 其他增值服务 - -## 注意事项 - -1. 所有金额使用DECIMAL(10,2)存储,避免精度问题 -2. 每次余额变动都记录到交易表 -3. 充值订单有状态管理(待支付、已支付、已取消) -4. 支付接口需要做好安全验证 -5. 余额不足时要有提示 diff --git a/虚拟货币和礼物系统开发文档.md b/虚拟货币和礼物系统开发文档.md deleted file mode 100644 index 0582f807..00000000 --- a/虚拟货币和礼物系统开发文档.md +++ /dev/null @@ -1,508 +0,0 @@ -# 虚拟货币和礼物系统开发文档 - -## 功能概述 - -本系统实现了完整的虚拟货币充值和礼物赠送功能,包括: - -1. **用户余额管理** - - 查看当前虚拟货币余额 - - 充值虚拟货币 - - 查看充值记录 - - 查看消费记录 - -2. **礼物系统** - - 查看礼物列表 - - 购买礼物送给主播 - - 查看送出的礼物记录 - - 查看收到的礼物记录(主播) - - 直播间礼物统计 - -3. **后台管理** - - 主播查看收到的礼物 - - 礼物收入统计 - - 充值套餐管理 - - 礼物配置管理 - -## 数据库设计 - -### 1. 用户余额字段 -```sql -ALTER TABLE eb_user ADD COLUMN virtual_balance DECIMAL(10,2) DEFAULT 0.00; -``` - -### 2. 充值记录表 (eb_virtual_currency_recharge) -- id: 充值记录ID -- user_id: 用户ID -- order_no: 订单号 -- amount: 充值金额(人民币) -- virtual_amount: 获得的虚拟货币 -- payment_method: 支付方式 -- payment_status: 支付状态 -- create_time: 创建时间 -- pay_time: 支付时间 - -### 3. 交易记录表 (eb_virtual_currency_transaction) -- id: 交易ID -- user_id: 用户ID -- transaction_type: 交易类型(recharge/gift/refund) -- amount: 交易金额 -- balance_after: 交易后余额 -- related_id: 关联ID -- description: 交易描述 -- create_time: 创建时间 - -### 4. 礼物配置表 (eb_gift_config) -- id: 礼物ID -- name: 礼物名称 -- icon: 礼物图标 -- price: 礼物价格 -- animation: 动画效果 -- sort_order: 排序 -- is_enabled: 是否启用 - -### 5. 礼物记录表 (eb_gift_record) -- id: 记录ID -- sender_id: 送礼者ID -- receiver_id: 接收者ID -- room_id: 直播间ID -- gift_id: 礼物ID -- gift_name: 礼物名称 -- gift_price: 礼物价格 -- quantity: 数量 -- total_price: 总价格 -- is_anonymous: 是否匿名 -- create_time: 创建时间 - -### 6. 充值套餐表 (eb_recharge_package) -- id: 套餐ID -- amount: 充值金额 -- virtual_amount: 获得虚拟货币 -- bonus_amount: 赠送虚拟货币 -- title: 套餐标题 -- description: 套餐描述 -- is_hot: 是否热门 -- sort_order: 排序 - -## API接口 - -### 虚拟货币相关接口 - -#### 1. 获取用户余额 -``` -GET /api/front/virtual-currency/balance -``` - -响应: -```json -{ - "code": 200, - "message": "success", - "data": { - "balance": 100.00, - "userId": 43 - } -} -``` - -#### 2. 获取充值套餐列表 -``` -GET /api/front/virtual-currency/recharge/packages -``` - -响应: -```json -{ - "code": 200, - "data": [ - { - "id": 1, - "amount": 6.00, - "virtual_amount": 60.00, - "bonus_amount": 0.00, - "title": "6元", - "description": "获得60虚拟币", - "is_hot": 0 - } - ] -} -``` - -#### 3. 创建充值订单 -``` -POST /api/front/virtual-currency/recharge/create -``` - -请求体: -```json -{ - "packageId": 1, - "paymentMethod": "alipay" -} -``` - -响应: -```json -{ - "code": 200, - "message": "订单创建成功", - "data": { - "orderNo": "RC20260103165030123456", - "amount": 6.00, - "virtualAmount": 60.00, - "paymentMethod": "alipay" - } -} -``` - -#### 4. 模拟支付成功(测试用) -``` -POST /api/front/virtual-currency/recharge/mock-pay -``` - -请求体: -```json -{ - "orderNo": "RC20260103165030123456" -} -``` - -#### 5. 获取充值记录 -``` -GET /api/front/virtual-currency/recharge/records?page=1&limit=20 -``` - -#### 6. 获取消费记录 -``` -GET /api/front/virtual-currency/transactions?page=1&limit=20 -``` - -### 礼物系统接口 - -#### 1. 获取礼物列表 -``` -GET /api/front/gift/list -``` - -响应: -```json -{ - "code": 200, - "data": [ - { - "id": 1, - "name": "玫瑰", - "icon": "https://example.com/gifts/rose.png", - "price": 1.00, - "animation": null - } - ] -} -``` - -#### 2. 送礼物 -``` -POST /api/front/gift/send -``` - -请求体: -```json -{ - "giftId": 1, - "receiverId": 43, - "roomId": 8, - "quantity": 1, - "isAnonymous": false -} -``` - -响应: -```json -{ - "code": 200, - "message": "送礼成功", - "data": { - "giftRecordId": 1, - "giftName": "玫瑰", - "quantity": 1, - "totalPrice": 1.00, - "newBalance": 99.00 - } -} -``` - -#### 3. 获取送出的礼物记录 -``` -GET /api/front/gift/sent?page=1&limit=20 -``` - -#### 4. 获取收到的礼物记录 -``` -GET /api/front/gift/received?page=1&limit=20 -``` - -#### 5. 获取直播间礼物统计 -``` -GET /api/front/gift/room/{roomId}/stats -``` - -响应: -```json -{ - "code": 200, - "data": { - "totalCount": 100, - "totalValue": 1000.00, - "giftRank": [ - { - "gift_name": "玫瑰", - "gift_icon": "...", - "total_quantity": 50, - "total_value": 50.00 - } - ], - "userRank": [ - { - "sender_id": 42, - "nickname": "用户A", - "avatar": "...", - "total_value": 500.00 - } - ] - } -} -``` - -## Android端实现 - -### 1. 在个人中心添加"我的余额"入口 - -在 `ProfileActivity.java` 中添加: - -```java -findViewById(R.id.layout_balance).setOnClickListener(v -> { - Intent intent = new Intent(this, BalanceActivity.class); - startActivity(intent); -}); -``` - -### 2. 余额页面 (BalanceActivity) - -功能: -- 显示当前余额 -- 充值按钮 -- 充值记录和消费记录Tab切换 - -### 3. 充值页面 (RechargeActivity) - -功能: -- 显示充值套餐列表(网格布局) -- 选择支付方式(支付宝/微信) -- 确认充值按钮 - -### 4. 礼物面板 (GiftPanelDialog) - -在直播间页面添加礼物按钮,点击弹出礼物面板: - -功能: -- 显示礼物列表 -- 选择礼物和数量 -- 显示当前余额 -- 发送礼物 - -### 5. 主播收礼记录页面 - -在主播中心添加"收到的礼物"入口,显示: -- 礼物列表 -- 送礼用户信息 -- 礼物价值统计 - -## 部署步骤 - -### 1. 执行数据库脚本 -```bash -mysql -h 1.15.149.240 -u root -p zhibo < virtual_currency_and_gift_system.sql -``` - -### 2. 编译后端代码 -```bash -cd Zhibo/zhibo-h -mvn clean package -DskipTests -``` - -### 3. 部署后端服务 -```bash -# 停止服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose stop crmeb-front" - -# 上传jar包 -scp crmeb-front/target/Crmeb-front.jar root@1.15.149.240:/root/zhibo/ - -# 启动服务 -ssh root@1.15.149.240 "cd /root/zhibo && docker-compose up -d crmeb-front" -``` - -### 4. 编译Android应用 -在Android Studio中编译并安装到设备 - -## 测试流程 - -### 1. 测试充值功能 -1. 打开APP,进入个人中心 -2. 点击"我的余额" -3. 点击"立即充值" -4. 选择充值套餐(如6元) -5. 选择支付方式 -6. 点击"确认充值" -7. 系统自动模拟支付成功 -8. 返回余额页面,查看余额是否增加 - -### 2. 测试送礼功能 -1. 进入直播间 -2. 点击礼物按钮 -3. 选择礼物(如玫瑰) -4. 选择数量 -5. 点击"发送" -6. 查看余额是否扣除 -7. 主播端查看是否收到礼物 - -### 3. 测试记录查询 -1. 在余额页面查看充值记录 -2. 查看消费记录 -3. 在主播中心查看收到的礼物 - -## 后续优化 - -### 1. 支付集成 -- 集成支付宝SDK -- 集成微信支付SDK -- 实现真实的支付流程 - -### 2. 礼物动画 -- 添加礼物发送动画 -- 添加礼物接收特效 -- 实现礼物连击效果 - -### 3. 提现功能 -- 主播可以将收到的礼物提现 -- 设置提现规则和手续费 -- 实现提现审核流程 - -### 4. 礼物排行榜 -- 实时更新礼物排行榜 -- 显示贡献榜 -- 添加榜单奖励 - -### 5. VIP会员 -- 充值达到一定金额自动升级VIP -- VIP享受充值优惠 -- VIP专属礼物 - -## 注意事项 - -1. **安全性** - - 所有金额相关操作必须使用事务 - - 充值和消费必须记录详细日志 - - 防止并发导致的余额异常 - -2. **性能优化** - - 礼物列表使用缓存 - - 统计数据定时更新 - - 大量礼物记录分页加载 - -3. **用户体验** - - 充值失败要有明确提示 - - 余额不足要提示充值 - - 礼物发送要有即时反馈 - -4. **合规性** - - 虚拟货币不能直接提现为人民币 - - 需要符合相关法律法规 - - 保留完整的交易记录 - -## 文件清单 - -### 数据库 -- `virtual_currency_and_gift_system.sql` - 数据库表结构和初始数据 - -### 后端Java文件 -- `VirtualCurrencyController.java` - 虚拟货币控制器 -- `GiftSystemController.java` - 礼物系统控制器 - -### Android文件 -- `BalanceActivity.java` - 余额页面 -- `activity_balance.xml` - 余额页面布局 -- `RechargeActivity.java` - 充值页面 -- `activity_recharge.xml` - 充值页面布局 -- `GiftPanelDialog.java` - 礼物面板对话框 -- `RechargePackageAdapter.java` - 充值套餐适配器 -- `GiftAdapter.java` - 礼物列表适配器 -- `BalancePagerAdapter.java` - 余额页面ViewPager适配器 - -### API接口定义 -需要在 `ApiService.java` 中添加以下接口: - -```java -// 虚拟货币相关 -@GET("api/front/virtual-currency/balance") -Call>> getVirtualBalance(); - -@GET("api/front/virtual-currency/recharge/packages") -Call>>> getRechargePackages(); - -@POST("api/front/virtual-currency/recharge/create") -Call>> createRechargeOrder(@Body Map request); - -@POST("api/front/virtual-currency/recharge/mock-pay") -Call> mockPaySuccess(@Body Map request); - -@GET("api/front/virtual-currency/recharge/records") -Call>>> getRechargeRecords( - @Query("page") int page, - @Query("limit") int limit -); - -@GET("api/front/virtual-currency/transactions") -Call>>> getTransactions( - @Query("page") int page, - @Query("limit") int limit -); - -// 礼物系统相关 -@GET("api/front/gift/list") -Call>>> getGiftList(); - -@POST("api/front/gift/send") -Call>> sendGift(@Body Map request); - -@GET("api/front/gift/sent") -Call>>> getSentGifts( - @Query("page") int page, - @Query("limit") int limit -); - -@GET("api/front/gift/received") -Call>>> getReceivedGifts( - @Query("page") int page, - @Query("limit") int limit -); - -@GET("api/front/gift/room/{roomId}/stats") -Call>> getRoomGiftStats(@Path("roomId") int roomId); -``` - -## 开发进度 - -- [x] 数据库设计 -- [x] 后端API接口 -- [x] Android余额页面 -- [x] Android充值页面 -- [ ] Android礼物面板 -- [ ] Android礼物记录页面 -- [ ] 后台管理页面 -- [ ] 支付集成 -- [ ] 礼物动画效果 -- [ ] 完整测试 - -## 联系方式 - -如有问题,请查看相关文档或联系开发团队。 diff --git a/调试关注功能指南.md b/调试关注功能指南.md deleted file mode 100644 index 44c5fa98..00000000 --- a/调试关注功能指南.md +++ /dev/null @@ -1,261 +0,0 @@ -# 关注功能调试指南 - -## 第一步:检查数据库 - -### 1.1 连接数据库 -```bash -mysql -h 1.15.149.240 -u root -p -use crmeb; -``` - -### 1.2 执行诊断脚本 -```sql -source diagnose_follow_issue.sql; -``` - -### 1.3 检查关键点 -- [ ] `eb_follow_record` 表是否存在? -- [ ] 表结构是否正确? -- [ ] 是否有测试数据? - -如果表不存在,执行: -```sql -source migrate_follow_data.sql; -``` - -## 第二步:查看Android日志 - -### 2.1 连接设备并查看日志 -```bash -adb logcat | grep -i "RoomDetail\|follow" -``` - -### 2.2 关键日志 -查找以下日志: -- `关注主播: streamerId=xxx, roomId=xxx` - 确认发送的用户ID -- `关注响应: code=xxx, message=xxx` - 查看服务器响应 -- `房间信息加载成功: streamerId=xxx, isFollowing=xxx` - 确认房间信息 - -## 第三步:检查后端日志 - -### 3.1 查看后端日志 -```bash -ssh root@1.15.149.240 -cd /root/zhibo/Zhibo/zhibo-h -tail -f crmeb-admin/logs/info.log | grep -i follow -``` - -### 3.2 查看错误日志 -```bash -tail -f crmeb-admin/logs/error.log -``` - -## 第四步:手动测试API - -### 4.1 获取token -```bash -# 登录获取token -curl -X POST http://1.15.149.240:30001/api/front/login \ - -H "Content-Type: application/json" \ - -d '{ - "phone": "你的手机号", - "password": "你的密码" - }' -``` - -### 4.2 测试关注接口 -```bash -# 替换 YOUR_TOKEN 和 STREAMER_ID -curl -X POST http://1.15.149.240:30001/api/front/follow/follow \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_TOKEN" \ - -d '{ - "userId": STREAMER_ID - }' -``` - -### 4.3 测试获取房间信息 -```bash -curl -X GET http://1.15.149.240:30001/api/front/live/public/rooms/ROOM_ID \ - -H "Authorization: Bearer YOUR_TOKEN" -``` - -## 第五步:常见问题排查 - -### 问题1:表不存在 -**症状**: 后端日志显示 `Table 'crmeb.eb_follow_record' doesn't exist` - -**解决**: -```sql -source migrate_follow_data.sql; -``` - -### 问题2:streamerId为null -**症状**: Android日志显示 `streamerId is null` - -**原因**: 房间信息中没有streamerId字段 - -**检查**: -```sql -SELECT id, uid, title, streamer_name FROM eb_live_room LIMIT 5; -``` - -**解决**: 确保LiveRoomController的toResponse方法设置了streamerId: -```java -resp.setStreamerId(room.getUid()); -``` - -### 问题3:接口404 -**症状**: Android日志显示 `response code=404` - -**原因**: API路径不正确 - -**检查**: -- Android: `ApiService.followUser` 使用 `/api/front/follow/follow` -- 后端: `FollowController` 的 `@PostMapping("/follow")` - -### 问题4:401未授权 -**症状**: 返回401错误 - -**原因**: Token过期或无效 - -**解决**: 重新登录获取新token - -### 问题5:关注成功但状态不保存 -**症状**: 点击关注提示成功,但退出重进还是未关注 - -**检查数据库**: -```sql --- 查看是否有记录 -SELECT * FROM eb_follow_record -WHERE follower_id = YOUR_USER_ID - AND followed_id = STREAMER_ID -ORDER BY create_time DESC; - --- 检查状态 -SELECT - follower_id, - followed_id, - follow_status, - is_deleted, - create_time -FROM eb_follow_record -WHERE follower_id = YOUR_USER_ID -ORDER BY create_time DESC -LIMIT 10; -``` - -## 第六步:完整测试流程 - -### 6.1 准备测试数据 -```sql --- 查看可用的用户和主播 -SELECT uid, nickname, phone, is_streamer -FROM eb_user -WHERE is_streamer = 1 -LIMIT 5; - --- 查看可用的直播间 -SELECT id, uid, title, streamer_name -FROM eb_live_room -LIMIT 5; -``` - -### 6.2 记录测试信息 -- 测试用户ID: ________ -- 主播用户ID: ________ -- 直播间ID: ________ - -### 6.3 执行测试 -1. 登录应用(使用测试用户) -2. 进入直播间(记录的直播间ID) -3. 查看Android日志,记录: - - roomId: ________ - - streamerId: ________ -4. 点击关注按钮 -5. 查看提示信息: ________ -6. 查看Android日志中的响应 -7. 查看数据库记录: -```sql -SELECT * FROM eb_follow_record -WHERE follower_id = 测试用户ID - AND followed_id = 主播用户ID; -``` - -### 6.4 验证结果 -- [ ] 数据库中有记录 -- [ ] follow_status = 1 -- [ ] is_deleted = 0 -- [ ] 退出重进后按钮显示"已关注" - -## 第七步:如果还是不行 - -### 收集以下信息: - -1. **数据库检查结果** -```sql --- 执行并提供结果 -SELECT * FROM information_schema.tables -WHERE table_schema = 'crmeb' - AND table_name IN ('eb_follow_record', 'eb_user_follow'); -``` - -2. **Android日志** -``` -提供 adb logcat 中关于 RoomDetail 和 follow 的日志 -``` - -3. **后端日志** -``` -提供 /root/zhibo/Zhibo/zhibo-h/crmeb-admin/logs/info.log 中的相关日志 -``` - -4. **API测试结果** -``` -提供 curl 测试的完整响应 -``` - -5. **数据库记录** -```sql --- 执行并提供结果 -SELECT * FROM eb_follow_record -WHERE create_time > DATE_SUB(NOW(), INTERVAL 1 HOUR) -ORDER BY create_time DESC; -``` - -## 快速检查清单 - -- [ ] 数据库中 `eb_follow_record` 表已创建 -- [ ] 后端服务已重启 -- [ ] Android应用已重新编译 -- [ ] 用户已登录 -- [ ] 进入的是有效的直播间 -- [ ] 直播间的主播用户存在 -- [ ] Android日志中能看到 streamerId -- [ ] 网络连接正常 -- [ ] API接口路径正确 -- [ ] Token有效 - -## 紧急修复方案 - -如果以上都不行,可以尝试简化方案: - -### 方案A:使用 eb_user_follow 表 - -修改 `FollowRecord` 类的表名: -```java -@TableName("eb_user_follow") // 改为使用现有表 -``` - -并修改字段映射: -```java -@TableField("user_id") -private Integer followerId; - -@TableField("follow_user_id") -private Integer followedId; -``` - -### 方案B:直接使用JDBC - -在 `FollowRecordServiceImpl` 中使用 JdbcTemplate 直接操作数据库,绕过MyBatis。 diff --git a/部署指南-1.15.149.240.md b/部署指南-1.15.149.240.md deleted file mode 100644 index 45fb26bd..00000000 --- a/部署指南-1.15.149.240.md +++ /dev/null @@ -1,278 +0,0 @@ -# 直播系统部署指南 - -## 服务器信息 -- **IP地址**: 1.15.149.240 -- **部署目录**: /opt/zhibo - -## 需要部署的服务 - -| 服务 | 端口 | 说明 | -|------|------|------| -| Admin API | 30001 | 管理后台API | -| Front API | 8081 | 前端/APP API | -| Admin Web | 80 | 管理后台界面 | - ---- - -## 第一步:上传文件到服务器 - -### 方法1:使用SCP命令(推荐) - -打开PowerShell或CMD,在项目根目录执行: - -```powershell -# 1. 创建服务器目录 -ssh root@1.15.149.240 "mkdir -p /opt/zhibo/{admin-api,front-api,admin-web,logs,scripts}" - -# 2. 上传Admin API JAR包 -scp Zhibo/zhibo-h/crmeb-admin/target/Crmeb-admin.jar root@1.15.149.240:/opt/zhibo/admin-api/ - -# 3. 上传Front API JAR包 -scp Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar root@1.15.149.240:/opt/zhibo/front-api/ - -# 4. 上传前端文件 -scp -r Zhibo/admin/dist/* root@1.15.149.240:/opt/zhibo/admin-web/ -``` - -### 方法2:使用SFTP工具 - -使用FileZilla、WinSCP等工具连接服务器,手动上传: -- `Zhibo/zhibo-h/crmeb-admin/target/Crmeb-admin.jar` → `/opt/zhibo/admin-api/` -- `Zhibo/zhibo-h/crmeb-front/target/Crmeb-front.jar` → `/opt/zhibo/front-api/` -- `Zhibo/admin/dist/` 目录下所有文件 → `/opt/zhibo/admin-web/` - ---- - -## 第二步:SSH登录服务器配置 - -```bash -ssh root@1.15.149.240 -``` - -### 2.1 创建启动脚本 - -```bash -# 创建Admin API启动脚本 -cat > /opt/zhibo/scripts/start-admin-api.sh << 'EOF' -#!/bin/bash -APP_NAME="Crmeb-admin" -JAR_FILE="/opt/zhibo/admin-api/${APP_NAME}.jar" -LOG_FILE="/opt/zhibo/logs/admin-api.log" - -# 停止旧进程 -pid=$(pgrep -f "${APP_NAME}.jar") -[ -n "$pid" ] && kill -9 $pid && echo "停止旧进程: $pid" && sleep 2 - -# 启动 -nohup java -Xms512m -Xmx1024m -jar $JAR_FILE \ - --spring.redis.host=127.0.0.1 \ - > $LOG_FILE 2>&1 & -echo "Admin API 启动成功,端口: 30001" -EOF - -# 创建Front API启动脚本 -cat > /opt/zhibo/scripts/start-front-api.sh << 'EOF' -#!/bin/bash -APP_NAME="Crmeb-front" -JAR_FILE="/opt/zhibo/front-api/${APP_NAME}.jar" -LOG_FILE="/opt/zhibo/logs/front-api.log" - -# 停止旧进程 -pid=$(pgrep -f "${APP_NAME}.jar") -[ -n "$pid" ] && kill -9 $pid && echo "停止旧进程: $pid" && sleep 2 - -# 启动 -nohup java -Xms512m -Xmx1024m -jar $JAR_FILE \ - --spring.redis.host=127.0.0.1 \ - > $LOG_FILE 2>&1 & -echo "Front API 启动成功,端口: 8081" -EOF - -# 创建一键启动脚本 -cat > /opt/zhibo/scripts/start-all.sh << 'EOF' -#!/bin/bash -echo "启动所有服务..." -/opt/zhibo/scripts/start-admin-api.sh -sleep 5 -/opt/zhibo/scripts/start-front-api.sh -echo "完成!" -EOF - -# 创建停止脚本 -cat > /opt/zhibo/scripts/stop-all.sh << 'EOF' -#!/bin/bash -pkill -f "Crmeb-admin.jar" && echo "Admin API 已停止" -pkill -f "Crmeb-front.jar" && echo "Front API 已停止" -EOF - -# 赋予执行权限 -chmod +x /opt/zhibo/scripts/*.sh -``` - -### 2.2 配置Nginx - -```bash -# 创建Nginx配置 -cat > /etc/nginx/conf.d/zhibo.conf << 'EOF' -# 管理后台 -server { - listen 80; - server_name _; - - 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; - } - - 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; - } -} - -# Front API (供APP调用) -server { - listen 8080; - server_name _; - - 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 -``` - ---- - -## 第三步:启动服务 - -```bash -# 启动所有服务 -/opt/zhibo/scripts/start-all.sh - -# 查看日志 -tail -f /opt/zhibo/logs/admin-api.log -tail -f /opt/zhibo/logs/front-api.log - -# 检查端口 -netstat -tlnp | grep -E "30001|8081" -``` - ---- - -## 第四步:验证部署 - -### 检查服务状态 -```bash -# 检查进程 -ps aux | grep -E "Crmeb-admin|Crmeb-front" - -# 检查端口 -ss -tlnp | grep -E "30001|8081|80|8080" -``` - -### 测试接口 -```bash -# 测试Admin API -curl http://localhost:30001/api/public/version - -# 测试Front API -curl http://localhost:8081/api/front/index -``` - ---- - -## 访问地址 - -| 服务 | 地址 | -|------|------| -| 管理后台 | http://1.15.149.240 | -| Admin API | http://1.15.149.240:30001 | -| Front API | http://1.15.149.240:8081 | -| Front API (Nginx) | http://1.15.149.240:8080 | - ---- - -## 常用命令 - -```bash -# 启动所有服务 -/opt/zhibo/scripts/start-all.sh - -# 停止所有服务 -/opt/zhibo/scripts/stop-all.sh - -# 单独启动Admin API -/opt/zhibo/scripts/start-admin-api.sh - -# 单独启动Front API -/opt/zhibo/scripts/start-front-api.sh - -# 查看日志 -tail -100f /opt/zhibo/logs/admin-api.log -tail -100f /opt/zhibo/logs/front-api.log -``` - ---- - -## APP配置 - -部署完成后,需要修改Android APP的API地址: - -文件:`android-app/app/src/main/java/com/example/livestreaming/net/ApiConfig.java` - -```java -public static final String BASE_URL = "http://1.15.149.240:8081/"; -``` - -然后重新编译APK。 - ---- - -## 故障排查 - -### 服务启动失败 -```bash -# 查看详细日志 -cat /opt/zhibo/logs/admin-api.log -cat /opt/zhibo/logs/front-api.log - -# 检查Java版本 -java -version # 需要JDK 1.8 - -# 检查Redis是否运行 -redis-cli ping -``` - -### 端口被占用 -```bash -# 查看端口占用 -lsof -i :30001 -lsof -i :8081 - -# 杀掉占用进程 -kill -9 -``` diff --git a/钱包功能实现说明.md b/钱包功能实现说明.md deleted file mode 100644 index 0aa17f74..00000000 --- a/钱包功能实现说明.md +++ /dev/null @@ -1,101 +0,0 @@ -# 钱包功能实现说明 - -## 功能概述 - -在APP个人中心添加了"我的钱包"功能,包含以下模块: - -1. **我的钱包入口** - 在个人中心显示钱包余额,点击进入钱包页面 -2. **钱包页面** - 显示虎牙币余额,提供充值和收支明细入口 -3. **充值功能** - 跳转到充值页面(已有RechargeActivity) -4. **收支明细** - 显示用户的充值、消费记录 - -## 已完成的工作 - -### 1. UI界面 - -- ✅ 个人中心添加"我的钱包"按钮(占一整行) -- ✅ 钱包主页面(显示余额、充值按钮) -- ✅ 收支明细页面(列表展示) - -### 2. 代码文件 - -**新增Activity:** -- `WalletActivity.java` - 钱包主页面 -- `TransactionHistoryActivity.java` - 收支明细页面 - -**新增Adapter:** -- `TransactionAdapter.java` - 收支明细列表适配器 - -**新增布局文件:** -- `activity_wallet.xml` - 钱包主页面布局 -- `activity_transaction_history.xml` - 收支明细页面布局 -- `item_transaction.xml` - 收支明细列表项布局 - -**新增drawable资源:** -- `ic_wallet_24.xml` - 钱包图标 -- `ic_list_24.xml` - 列表图标 -- `bg_gradient_orange.xml` - 橙色渐变背景 -- `bg_white_button.xml` - 白色按钮背景 -- `bg_icon_circle_orange.xml` - 橙色圆形图标背景 -- `bg_icon_circle_blue.xml` - 蓝色圆形图标背景 - -### 3. 修改的文件 - -- `activity_profile.xml` - 添加钱包按钮 -- `ProfileActivity.java` - 添加钱包按钮点击事件 -- `AndroidManifest.xml` - 注册新的Activity - -## 待实现的功能 - -### 后端接口对接 - -1. **获取用户余额** - - 接口:`GET /api/user/balance` - - 返回:`{ balance: number }` - - 在WalletActivity的`loadBalance()`方法中实现 - -2. **获取收支明细** - - 接口:`GET /api/user/transactions` - - 参数:`page`, `limit` - - 返回:交易记录列表 - - 在TransactionHistoryActivity的`loadTransactions()`方法中实现 - -3. **充值功能** - - 已有RechargeActivity,需要对接支付接口 - -## 使用说明 - -1. 打开APP,进入"我的"页面 -2. 点击"我的钱包"按钮 -3. 在钱包页面可以: - - 查看当前余额 - - 点击"充值"按钮进行充值 - - 点击"收支明细"查看交易记录 - -## 数据结构 - -### Transaction(交易记录) - -```java -public class Transaction { - public String type; // 类型:充值、消费、收入 - public String description; // 描述 - public double amount; // 金额 - public String time; // 时间 - public boolean isIncome; // 是否为收入 -} -``` - -## 注意事项 - -1. 所有钱包相关功能都需要登录才能访问 -2. 余额显示使用虎牙币作为单位 -3. 收支明细按时间倒序排列 -4. 收入显示绿色,支出显示红色 - -## 下一步工作 - -1. 实现后端API接口 -2. 对接支付功能 -3. 添加余额变动通知 -4. 实现交易记录筛选功能