清理:优化后端和介绍的文档

This commit is contained in:
xiao12feng8 2026-01-04 17:17:02 +08:00
parent 23ce0923c5
commit 6d811689a6
26 changed files with 0 additions and 7689 deletions

View File

@ -1,17 +0,0 @@
package com.example.livestreaming.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class CreateRoomRequest {
@NotBlank(message = "标题不能为空")
private String title;
@NotBlank(message = "主播名称不能为空")
private String streamerName;
@NotBlank(message = "直播类型不能为空")
private String type;
}

View File

@ -1,49 +0,0 @@
package com.example.livestreaming.dto;
import com.example.livestreaming.entity.Room;
import lombok.Data;
@Data
public class RoomResponse {
private String id;
private String title;
private String streamerName;
private String type;
private String streamKey;
private boolean isLive;
private int viewerCount;
private String createdAt;
private String startedAt;
private StreamUrls streamUrls;
@Data
public static class StreamUrls {
private String rtmp;
private String flv;
private String hls;
}
public static RoomResponse fromEntity(Room room, String rtmpHost, int rtmpPort, String httpHost, int httpPort) {
RoomResponse response = new RoomResponse();
response.setId(room.getId());
response.setTitle(room.getTitle());
response.setStreamerName(room.getStreamerName());
response.setType(room.getType());
response.setStreamKey(room.getStreamKey());
response.setLive(room.isLive());
response.setViewerCount(room.getViewerCount());
response.setCreatedAt(room.getCreatedAt() != null ? room.getCreatedAt().toString() : null);
response.setStartedAt(room.getStartedAt() != null ? room.getStartedAt().toString() : null);
// 构建流地址
StreamUrls urls = new StreamUrls();
String streamKey = room.getStreamKey();
urls.setRtmp(String.format("rtmp://%s:%d/live/%s", rtmpHost, rtmpPort, streamKey));
urls.setFlv(String.format("http://%s:%d/live/%s.flv", httpHost, httpPort, streamKey));
urls.setHls(String.format("http://%s:%d/live/%s/index.m3u8", httpHost, httpPort, streamKey));
response.setStreamUrls(urls);
return response;
}
}

View File

@ -1,90 +0,0 @@
package com.example.livestreaming.service;
import com.example.livestreaming.dto.CreateRoomRequest;
import com.example.livestreaming.dto.RoomResponse;
import com.example.livestreaming.entity.Room;
import com.example.livestreaming.repository.RoomRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class RoomService {
private final RoomRepository roomRepository;
@Value("${livestream.rtmp.host:localhost}")
private String rtmpHost;
@Value("${livestream.rtmp.port:1935}")
private int rtmpPort;
@Value("${livestream.http.host:localhost}")
private String httpHost;
@Value("${livestream.http.port:8080}")
private int httpPort;
/**
* 获取所有直播间
*/
public List<RoomResponse> getAllRooms() {
return roomRepository.findAll().stream()
.map(room -> RoomResponse.fromEntity(room, rtmpHost, rtmpPort, httpHost, httpPort))
.collect(Collectors.toList());
}
/**
* 根据ID获取直播间
*/
public Optional<RoomResponse> getRoomById(String id) {
return roomRepository.findById(id)
.map(room -> RoomResponse.fromEntity(room, rtmpHost, rtmpPort, httpHost, httpPort));
}
/**
* 创建直播间
*/
@Transactional
public RoomResponse createRoom(CreateRoomRequest request) {
Room room = new Room();
room.setTitle(request.getTitle());
room.setStreamerName(request.getStreamerName());
room.setType(request.getType());
Room saved = roomRepository.save(room);
return RoomResponse.fromEntity(saved, rtmpHost, rtmpPort, httpHost, httpPort);
}
/**
* 更新直播状态供SRS回调使用
*/
@Transactional
public Optional<Room> setLiveStatus(String streamKey, boolean isLive) {
return roomRepository.findByStreamKey(streamKey)
.map(room -> {
room.setLive(isLive);
room.setStartedAt(isLive ? LocalDateTime.now() : null);
return roomRepository.save(room);
});
}
/**
* 删除直播间
*/
@Transactional
public boolean deleteRoom(String id) {
if (roomRepository.existsById(id)) {
roomRepository.deleteById(id);
return true;
}
return false;
}
}

View File

@ -1,194 +0,0 @@
# 用户系统模块接口文档
## 模块概述
用户系统模块提供用户注册、登录、资料管理等基础功能。
---
## 接口列表
### 1. 账号密码登录
**接口路径**: `POST /api/front/login`
**请求参数**:
```json
{
"account": "手机号",
"password": "密码"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"token": "JWT令牌",
"uid": 用户ID,
"nikeName": "昵称",
"phone": "手机号"
}
}
```
---
### 2. APP用户注册
**接口路径**: `POST /api/front/register`
**请求参数**:
```json
{
"phone": "手机号",
"password": "密码",
"verificationCode": "验证码(可选)",
"nickname": "昵称(可选)"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"token": "JWT令牌",
"uid": 用户ID,
"nikeName": "昵称",
"phone": "手机号"
}
}
```
---
### 3. 发送短信验证码
**接口路径**: `POST /api/front/sendCode`
**请求参数**:
```
phone=手机号 (FormUrlEncoded格式)
```
**返回参数**:
```json
{
"code": 200,
"msg": "发送成功"
}
```
---
### 4. 获取用户信息
**接口路径**: `GET /api/front/user`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**: 无
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"uid": 用户ID,
"nickname": "昵称",
"avatar": "头像URL",
"phone": "手机号",
"balance": 余额,
"integral": 积分,
"experience": 经验值,
"level": 等级
}
}
```
---
### 5. 更新用户资料
**接口路径**: `POST /api/front/user/edit`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"nickname": "昵称",
"avatar": "头像URL"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success"
}
```
---
### 6. 上传头像
**接口路径**: `POST /api/front/user/upload/image`
**请求头**:
```
Authorization: Bearer {token}
Content-Type: multipart/form-data
```
**请求参数**:
```
file: 图片文件
model: "user"
pid: 7
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"url": "图片URL",
"name": "文件名",
"size": 文件大小
}
}
```
---
### 7. 退出登录
**接口路径**: `GET /api/front/logout`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**: 无
**返回参数**:
```json
{
"code": 200,
"msg": "success"
}
```

View File

@ -1,336 +0,0 @@
# 直播间管理模块接口文档
## 模块概述
直播间管理模块提供直播间的创建、查询、控制等功能。
---
## 接口列表
### 1. 获取直播间列表
**接口路径**: `GET /api/front/live/public/rooms`
**请求参数**: 无
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "房间ID",
"title": "直播间标题",
"streamerName": "主播名称",
"streamerId": 主播ID,
"streamerAvatar": "主播头像URL",
"coverImage": "封面图URL",
"isLive": true,
"viewerCount": 1234,
"likeCount": 5678,
"categoryId": 1,
"categoryName": "游戏",
"tags": ["英雄联盟", "竞技"],
"streamUrls": {
"rtmp": "rtmp://192.168.1.164:1935/live/房间ID",
"flv": "http://192.168.1.164:8080/live/房间ID.flv",
"hls": "http://192.168.1.164:8080/live/房间ID.m3u8"
},
"createTime": "2024-12-30T10:00:00",
"startTime": "2024-12-30T10:30:00"
}
]
}
```
---
### 2. 获取直播间详情
**接口路径**: `GET /api/front/live/public/rooms/{id}`
**请求参数**:
```
id: 房间ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"id": "房间ID",
"title": "直播间标题",
"description": "直播间描述",
"streamerName": "主播名称",
"streamerId": 主播ID,
"streamerAvatar": "主播头像URL",
"streamerLevel": 10,
"coverImage": "封面图URL",
"streamKey": "推流密钥",
"isLive": true,
"viewerCount": 1234,
"likeCount": 5678,
"shareCount": 123,
"categoryId": 1,
"categoryName": "游戏",
"tags": ["英雄联盟", "竞技"],
"streamUrls": {
"rtmp": "rtmp://192.168.1.164:1935/live/房间ID",
"flv": "http://192.168.1.164:8080/live/房间ID.flv",
"hls": "http://192.168.1.164:8080/live/房间ID.m3u8"
},
"isFollowing": false,
"createTime": "2024-12-30T10:00:00",
"startTime": "2024-12-30T10:30:00",
"notice": "直播间公告"
}
}
```
---
### 3. 创建直播间
**接口路径**: `POST /api/front/live/rooms`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"title": "直播间标题",
"streamerName": "主播名称",
"type": "live",
"categoryId": 1,
"description": "描述",
"coverImage": "封面URL"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"id": "房间ID",
"title": "直播间标题",
"streamKey": "推流密钥",
"streamUrls": {
"rtmp": "rtmp://192.168.1.164:1935/live/房间ID",
"flv": "http://192.168.1.164:8080/live/房间ID.flv",
"hls": "http://192.168.1.164:8080/live/房间ID.m3u8"
}
}
}
```
---
### 4. 开始直播
**接口路径**: `POST /api/front/live/room/{id}/start`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
id: 房间ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"success": true,
"message": "直播已开始"
}
}
```
---
### 5. 结束直播
**接口路径**: `POST /api/front/live/room/{id}/stop`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
id: 房间ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"success": true,
"message": "直播已结束"
}
}
```
---
### 6. 关注主播
**接口路径**: `POST /api/front/live/follow`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"streamerId": 主播ID,
"action": "follow"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"success": true,
"isFollowing": true
}
}
```
---
### 7. 获取在线人数
**接口路径**: `GET /api/live/online/count/{roomId}`
**请求参数**:
```
roomId: 房间ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"count": 1234,
"roomId": "房间ID"
}
}
```
---
### 8. 获取观众列表
**接口路径**: `GET /api/front/live/rooms/{roomId}/viewers`
**请求参数**:
```
roomId: 房间ID (路径参数)
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"userId": 用户ID,
"nickname": "用户昵称",
"avatar": "用户头像URL",
"level": 10,
"vipLevel": 2,
"isFollowing": false,
"joinTime": "2024-12-30T10:30:00"
}
],
"total": 1234,
"page": 1,
"pageSize": 20
}
```
---
### 9. 赠送礼物
**接口路径**: `POST /api/front/live/rooms/{roomId}/gift`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"roomId": 房间ID,
"giftId": 礼物ID,
"count": 数量
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"success": true,
"newBalance": 9500,
"giftName": "玫瑰",
"totalPrice": 500,
"message": "赠送成功"
}
}
```
---
### 10. 手动广播在线人数
**接口路径**: `POST /api/live/online/broadcast/{roomId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
roomId: 房间ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success"
}
```

View File

@ -1,74 +0,0 @@
# 直播间弹幕模块接口文档
## 模块概述
直播间弹幕模块提供弹幕消息的发送和历史记录查询功能。
---
## 接口列表
### 1. 获取历史弹幕
**接口路径**: `GET /api/front/live/public/rooms/{roomId}/messages`
**请求参数**:
```
roomId: 房间ID (路径参数)
limit: 获取最近N条消息 (可选默认50)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "消息ID",
"userId": 用户ID,
"nickname": "用户昵称",
"avatar": "用户头像URL",
"content": "弹幕内容",
"type": "text",
"createTime": "2024-12-30T10:30:00"
}
]
}
```
---
### 2. 发送弹幕消息
**接口路径**: `POST /api/front/live/public/rooms/{roomId}/messages`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"roomId": "房间ID",
"content": "弹幕内容",
"type": "text"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"id": "消息ID",
"userId": 用户ID,
"nickname": "用户昵称",
"avatar": "用户头像URL",
"content": "弹幕内容",
"type": "text",
"createTime": "2024-12-30T10:30:00"
}
}
```

View File

@ -1,118 +0,0 @@
# WebSocket通信模块接口文档
## 模块概述
WebSocket通信模块提供实时弹幕和在线人数的推送功能。
---
## WebSocket连接
### 1. 实时弹幕WebSocket
**连接地址**: `ws://host:port/ws/live/chat/{roomId}`
**连接参数**:
```
roomId: 房间ID (路径参数)
```
**发送消息格式**:
```json
{
"type": "chat",
"content": "弹幕内容",
"nickname": "用户昵称",
"userId": 用户ID
}
```
**接收消息格式**:
弹幕消息:
```json
{
"type": "chat",
"nickname": "用户昵称",
"content": "弹幕内容"
}
```
连接确认:
```json
{
"type": "connected",
"content": "连接成功"
}
```
心跳响应:
```json
{
"type": "pong"
}
```
**心跳消息**:
```json
{
"type": "ping"
}
```
**说明**:
- 心跳间隔: 30秒
- 自动重连: 最多5次
- 重连延迟: 5秒 × 重连次数
---
### 2. 在线人数WebSocket
**连接地址**: `ws://host:port/ws/live/{roomId}?clientId={clientId}`
**连接参数**:
```
roomId: 房间ID (路径参数)
clientId: 客户端ID (查询参数用户ID或guest_时间戳)
```
**接收消息格式**:
在线人数更新:
```json
{
"type": "online_count",
"count": 1234,
"roomId": "房间ID",
"timestamp": 1704000000000
}
```
连接确认:
```json
{
"type": "connected",
"message": "连接成功",
"clientId": "用户ID或guest_时间戳"
}
```
心跳响应:
```json
{
"type": "pong"
}
```
**心跳消息**:
```json
{
"type": "ping"
}
```
**说明**:
- 心跳间隔: 30秒
- 自动重连: 最多5次
- 重连延迟: 5秒 × 重连次数
- 用户进入/离开时自动推送在线人数更新

View File

@ -1,308 +0,0 @@
# 好友管理模块接口文档
## 模块概述
好友管理模块提供好友搜索、添加、删除、拉黑等功能。
---
## 接口列表
### 1. 搜索用户
**接口路径**: `GET /api/front/users/search`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
keyword: 搜索关键词 (昵称或手机号)
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 用户ID,
"nickname": "昵称",
"phone": "手机号",
"avatarUrl": "头像URL",
"friendStatus": 0
}
],
"total": 总数,
"page": 当前页,
"limit": 每页数量
}
}
```
**friendStatus说明**:
- 0: 未添加
- 1: 已是好友
- 2: 已申请
---
### 2. 发送好友申请
**接口路径**: `POST /api/front/friends/request`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"targetUserId": 目标用户ID,
"message": "申请消息(可选)"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 3. 获取好友申请列表
**接口路径**: `GET /api/front/friends/requests`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 请求ID,
"from_user_id": 发送者ID,
"nickname": "发送者昵称",
"avatarUrl": "头像URL",
"message": "申请消息",
"create_time": "创建时间"
}
],
"total": 总数
}
}
```
---
### 4. 处理好友请求
**接口路径**: `POST /api/front/friends/requests/{requestId}/handle`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"accept": true
}
```
**accept说明**:
- true: 接受
- false: 拒绝
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**说明**: 接受后自动创建双向好友关系和私聊会话
---
### 5. 获取好友列表
**接口路径**: `GET /api/front/friends`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 好友ID,
"name": "昵称",
"avatarUrl": "头像URL",
"phone": "手机号",
"isOnline": 1,
"lastOnlineTime": "最后在线时间"
}
],
"total": 总数
}
}
```
**isOnline说明**:
- 1: 在线
- 0: 离线
---
### 6. 删除好友
**接口路径**: `DELETE /api/front/friends/{friendId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
friendId: 好友ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**说明**: 删除双向好友关系
---
### 7. 拉黑好友
**接口路径**: `POST /api/front/friends/block/{friendId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
friendId: 好友ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**说明**: 拉黑后自动删除好友关系,被拉黑用户无法再发送好友申请
---
### 8. 取消拉黑
**接口路径**: `POST /api/front/friends/unblock/{friendId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
friendId: 好友ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 9. 获取黑名单列表
**接口路径**: `GET /api/front/friends/blocked`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 用户ID,
"name": "昵称",
"avatarUrl": "头像URL",
"phone": "手机号",
"blockedTime": "拉黑时间"
}
],
"total": 总数
}
}
```

View File

@ -1,238 +0,0 @@
# 关注功能模块接口文档
## 模块概述
关注功能模块提供用户关注、取消关注、关注列表、粉丝列表等功能。
---
## 接口列表
### 1. 关注用户
**接口路径**: `POST /api/front/follow/follow`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"userId": 目标用户ID
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"success": true,
"message": "关注成功",
"isFollowing": true
}
}
```
---
### 2. 取消关注
**接口路径**: `POST /api/front/follow/unfollow`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"userId": 目标用户ID
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"success": true,
"message": "取消关注成功",
"isFollowing": false
}
}
```
---
### 3. 检查关注状态
**接口路径**: `GET /api/front/follow/status/{userId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
userId: 用户ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"isFollowing": true,
"userId": 用户ID
}
}
```
---
### 4. 批量检查关注状态
**接口路径**: `POST /api/front/follow/status/batch`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"userIds": [用户ID1, 用户ID2, 用户ID3]
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"statusMap": {
"用户ID1": true,
"用户ID2": false,
"用户ID3": true
}
}
}
```
---
### 5. 获取关注列表
**接口路径**: `GET /api/front/follow/following`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"userId": 用户ID,
"nickname": "昵称",
"avatar": "头像URL",
"isOnline": true,
"followTime": "关注时间"
}
],
"total": 总数,
"page": 当前页,
"pageSize": 每页数量
}
}
```
---
### 6. 获取粉丝列表
**接口路径**: `GET /api/front/follow/followers`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"userId": 用户ID,
"nickname": "昵称",
"avatar": "头像URL",
"isOnline": true,
"isMutualFollow": false,
"followTime": "关注时间"
}
],
"total": 总数,
"page": 当前页,
"pageSize": 每页数量
}
}
```
**isMutualFollow说明**: 是否互相关注
---
### 7. 获取关注统计
**接口路径**: `GET /api/front/follow/stats`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
userId: 用户ID (可选,不传则查询当前用户)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"followingCount": 关注数,
"followersCount": 粉丝数
}
}
```

View File

@ -1,475 +0,0 @@
# 作品管理模块接口文档
## 模块概述
作品管理模块提供作品的发布、编辑、删除、点赞、收藏等功能。
---
## 接口列表
### 1. 发布作品
**接口路径**: `POST /api/front/works/publish`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"title": "作品标题",
"description": "作品描述",
"type": "IMAGE",
"coverUrl": "封面URL",
"videoUrl": "视频URL(视频作品)",
"imageUrls": ["图片URL1", "图片URL2"]
}
```
**type说明**:
- IMAGE: 图片作品
- VIDEO: 视频作品
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": 作品ID
}
```
---
### 2. 获取作品详情
**接口路径**: `GET /api/front/works/detail/{worksId}`
**请求头**:
```
Authorization: Bearer {token} (可选)
```
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"id": 作品ID,
"title": "作品标题",
"description": "作品描述",
"type": "IMAGE",
"coverUrl": "封面URL",
"videoUrl": "视频URL",
"imageUrls": ["图片URL1", "图片URL2"],
"authorId": 作者ID,
"authorName": "作者昵称",
"authorAvatar": "作者头像",
"likeCount": 点赞数,
"collectCount": 收藏数,
"commentCount": 评论数,
"shareCount": 分享数,
"isLiked": false,
"isCollected": false,
"createTime": "创建时间"
}
}
```
---
### 3. 编辑作品
**接口路径**: `POST /api/front/works/update`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"id": 作品ID,
"title": "作品标题",
"description": "作品描述"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**说明**: 仅作者可编辑
---
### 4. 删除作品
**接口路径**: `POST /api/front/works/delete/{worksId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**说明**: 仅作者可删除,逻辑删除
---
### 5. 搜索作品
**接口路径**: `POST /api/front/works/search`
**请求参数**:
```json
{
"keyword": "搜索关键词",
"type": "IMAGE",
"page": 1,
"pageSize": 20
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 作品ID,
"title": "作品标题",
"coverUrl": "封面URL",
"type": "IMAGE",
"likeCount": 点赞数,
"authorName": "作者昵称"
}
],
"total": 总数,
"page": 当前页,
"pageSize": 每页数量
}
}
```
---
### 6. 获取用户作品列表
**接口路径**: `GET /api/front/works/user/{userId}`
**请求参数**:
```
userId: 用户ID (路径参数)
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 作品ID,
"title": "作品标题",
"coverUrl": "封面URL",
"type": "IMAGE",
"likeCount": 点赞数
}
],
"total": 总数
}
}
```
---
### 7. 点赞作品
**接口路径**: `POST /api/front/works/like/{worksId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 8. 取消点赞
**接口路径**: `POST /api/front/works/unlike/{worksId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 9. 收藏作品
**接口路径**: `POST /api/front/works/collect/{worksId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 10. 取消收藏
**接口路径**: `POST /api/front/works/uncollect/{worksId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 11. 我的点赞列表
**接口路径**: `GET /api/front/works/my/liked`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 作品ID,
"title": "作品标题",
"coverUrl": "封面URL",
"type": "IMAGE",
"likeCount": 点赞数
}
],
"total": 总数
}
}
```
---
### 12. 我的收藏列表
**接口路径**: `GET /api/front/works/my/collected`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
page: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 作品ID,
"title": "作品标题",
"coverUrl": "封面URL",
"type": "IMAGE",
"collectCount": 收藏数
}
],
"total": 总数
}
}
```
---
### 13. 分享作品
**接口路径**: `POST /api/front/works/share/{worksId}`
**请求参数**:
```
worksId: 作品ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**说明**: 增加分享次数统计
---
### 14. 视频上传
**接口路径**: `POST /api/front/upload/work/video`
**请求头**:
```
Authorization: Bearer {token}
Content-Type: multipart/form-data
```
**请求参数**:
```
multipart: 视频文件
model: "works"
pid: 0
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"url": "视频URL",
"name": "文件名",
"size": 文件大小
}
}
```
---
### 15. 图片上传
**接口路径**: `POST /api/front/upload/image`
**请求头**:
```
Authorization: Bearer {token}
Content-Type: multipart/form-data
```
**请求参数**:
```
multipart: 图片文件
model: "works"
pid: 0
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"url": "图片URL",
"name": "文件名",
"size": 文件大小
}
}
```

View File

@ -1,297 +0,0 @@
# 搜索功能模块接口文档
## 模块概述
搜索功能模块提供用户、直播间、作品的搜索,以及热门搜索、搜索历史等功能。
---
## 接口列表
### 1. 搜索用户
**接口路径**: `GET /api/front/search/users`
**请求参数**:
```
keyword: 搜索关键词
pageNum: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"userId": 用户ID,
"nickname": "昵称",
"avatar": "头像URL",
"phone": "手机号",
"isFollowing": false
}
],
"total": 总数,
"pageNum": 当前页,
"pageSize": 每页数量
}
}
```
---
### 2. 搜索直播间
**接口路径**: `GET /api/front/search/live-rooms`
**请求参数**:
```
keyword: 搜索关键词
categoryId: 分类ID (可选)
isLive: 是否直播中 (可选)
pageNum: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": "房间ID",
"title": "直播间标题",
"streamerName": "主播名称",
"coverImage": "封面图",
"isLive": true,
"viewerCount": 1234,
"categoryName": "分类名称"
}
],
"total": 总数,
"pageNum": 当前页,
"pageSize": 每页数量
}
}
```
---
### 3. 搜索作品
**接口路径**: `GET /api/front/search/works`
**请求参数**:
```
keyword: 搜索关键词
categoryId: 分类ID (可选)
pageNum: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 作品ID,
"title": "作品标题",
"coverUrl": "封面URL",
"type": "IMAGE",
"authorName": "作者昵称",
"likeCount": 点赞数,
"isLiked": false,
"isCollected": false
}
],
"total": 总数,
"pageNum": 当前页,
"pageSize": 每页数量
}
}
```
---
### 4. 综合搜索
**接口路径**: `GET /api/front/search/all`
**请求参数**:
```
keyword: 搜索关键词
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"users": [
{
"userId": 用户ID,
"nickname": "昵称",
"avatar": "头像URL"
}
],
"liveRooms": [
{
"id": "房间ID",
"title": "直播间标题",
"streamerName": "主播名称"
}
],
"works": [
{
"id": 作品ID,
"title": "作品标题",
"coverUrl": "封面URL"
}
]
}
}
```
**说明**: 返回各类型的前几条结果
---
### 5. 获取热门搜索
**接口路径**: `GET /api/front/search/hot`
**请求参数**:
```
searchType: 搜索类型 (0-全部 1-用户 2-直播间 3-作品)
limit: 返回数量 (默认10)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"keyword": "关键词",
"searchCount": 搜索次数
}
]
}
```
---
### 6. 获取搜索历史
**接口路径**: `GET /api/front/search/history`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
searchType: 搜索类型 (可选)
limit: 返回数量 (默认20)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 历史ID,
"keyword": "关键词",
"searchType": 搜索类型,
"createTime": "创建时间"
}
]
}
```
---
### 7. 清除搜索历史
**接口路径**: `DELETE /api/front/search/history`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
searchType: 搜索类型 (可选,不传则清除全部)
```
**返回参数**:
```json
{
"code": 200,
"msg": "搜索历史已清除"
}
```
---
### 8. 删除单条搜索历史
**接口路径**: `DELETE /api/front/search/history/{historyId}`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
historyId: 历史ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "删除成功"
}
```
---
### 9. 获取搜索建议
**接口路径**: `GET /api/front/search/suggestions`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
keyword: 关键词前缀
searchType: 搜索类型 (可选)
limit: 返回数量 (默认10)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": ["建议1", "建议2", "建议3"]
}
```

View File

@ -1,146 +0,0 @@
# 支付集成模块接口文档
## 模块概述
支付集成模块提供金币充值、订单创建、支付处理等功能。
---
## 接口列表
### 1. 获取充值选项列表
**接口路径**: `GET /api/front/gift/recharge/options`
**请求参数**: 无
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "选项ID",
"coinAmount": 金币数量,
"price": 价格,
"discountLabel": "优惠标签"
}
]
}
```
---
### 2. 创建充值订单
**接口路径**: `POST /api/front/gift/recharge/create`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"optionId": "选项ID",
"coinAmount": 金币数量,
"price": 价格
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"orderId": "订单ID",
"paymentUrl": "支付URL"
}
}
```
---
### 3. 订单支付
**接口路径**: `POST /api/front/pay/payment`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"orderNo": "订单号",
"payType": "支付类型",
"payChannel": "支付渠道",
"from": "android"
}
```
**payType说明**:
- alipay: 支付宝支付
- weixin: 微信支付
- yue: 余额支付
**payChannel说明**:
- appAliPay: 支付宝APP支付
- weixinAppAndroid: 微信APP支付(Android)
- yue: 余额支付
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"status": true,
"payType": "支付类型",
"orderNo": "订单号",
"jsConfig": {
"appId": "应用ID",
"partnerId": "商户ID",
"prepayId": "预支付ID",
"package": "扩展字段",
"nonceStr": "随机字符串",
"timeStamp": "时间戳",
"sign": "签名"
}
}
}
```
**说明**: jsConfig用于调用支付SDK
---
### 4. 查询支付宝支付结果
**接口路径**: `GET /api/front/pay/alipay/queryPayResult`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
orderNo: 订单号
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
**data说明**:
- true: 支付成功
- false: 支付失败或未支付

View File

@ -1,194 +0,0 @@
# 分类管理模块接口文档
## 模块概述
分类管理模块提供直播间分类、作品分类的查询和统计功能。
---
## 接口列表
### 1. 获取直播间分类列表
**接口路径**: `GET /api/front/category/live-room`
**请求参数**: 无
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 分类ID,
"name": "分类名称",
"pid": 父分类ID,
"sort": 排序,
"extra": "扩展字段"
}
]
}
```
---
### 2. 获取作品分类列表
**接口路径**: `GET /api/front/category/work`
**请求参数**: 无
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 分类ID,
"name": "分类名称",
"pid": 父分类ID,
"sort": 排序,
"extra": "扩展字段"
}
]
}
```
---
### 3. 获取指定类型的分类列表
**接口路径**: `GET /api/front/category/list`
**请求参数**:
```
type: 分类类型 (1=商品, 3=文章, 8=直播间, 9=作品)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 分类ID,
"name": "分类名称",
"pid": 父分类ID,
"sort": 排序,
"extra": "扩展字段"
}
]
}
```
---
### 4. 获取分类详情
**接口路径**: `GET /api/front/category/{id}`
**请求参数**:
```
id: 分类ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": {
"id": 分类ID,
"name": "分类名称",
"pid": 父分类ID,
"sort": 排序,
"extra": "扩展字段"
}
}
```
---
### 5. 获取分类统计信息
**接口路径**: `GET /api/front/category/statistics`
**请求参数**:
```
type: 分类类型 (8=直播间, 9=作品)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"categoryId": 分类ID,
"categoryName": "分类名称",
"count": 数量
}
]
}
```
---
### 6. 获取热门分类
**接口路径**: `GET /api/front/category/hot`
**请求参数**:
```
type: 分类类型 (8=直播间, 9=作品)
limit: 返回数量限制 (默认10)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 分类ID,
"name": "分类名称",
"pid": 父分类ID,
"sort": 排序,
"extra": "扩展字段"
}
]
}
```
---
### 7. 获取子分类列表
**接口路径**: `GET /api/front/category/{parentId}/children`
**请求参数**:
```
parentId: 父分类ID (路径参数)
recursive: 是否递归获取所有子分类 (默认false)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 分类ID,
"name": "分类名称",
"pid": 父分类ID,
"sort": 排序,
"extra": "扩展字段"
}
]
}
```

View File

@ -1,137 +0,0 @@
# 消息表情回应模块接口文档
## 模块概述
消息表情回应模块提供对私聊消息添加表情符号作为快速回应的功能。
---
## 接口列表
### 1. 添加表情回应
**接口路径**: `POST /api/front/messages/reactions/add`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"messageId": "消息ID",
"emoji": "表情符号"
}
```
**emoji说明**: 支持的表情符号如 👍 ❤️ 😂 😮 😢 😠 🔥 👏 🤔 🎉 ⭐ ✅
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 2. 移除表情回应
**接口路径**: `DELETE /api/front/messages/reactions/remove`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```json
{
"messageId": "消息ID",
"emoji": "表情符号"
}
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 3. 获取消息的所有表情回应
**接口路径**: `GET /api/front/messages/{messageId}/reactions`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
messageId: 消息ID (路径参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"emoji": "👍",
"count": 5,
"reactedByMe": true
},
{
"emoji": "❤️",
"count": 3,
"reactedByMe": false
}
]
}
```
**字段说明**:
- emoji: 表情符号
- count: 回应数量
- reactedByMe: 当前用户是否已回应
---
### 4. 获取特定表情的用户列表
**接口路径**: `GET /api/front/messages/{messageId}/reactions/users`
**请求头**:
```
Authorization: Bearer {token}
```
**请求参数**:
```
messageId: 消息ID (路径参数)
emoji: 表情符号 (查询参数)
```
**返回参数**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"userId": 用户ID,
"username": "用户名",
"avatarUrl": "头像URL"
}
]
}
```

View File

@ -1,282 +0,0 @@
# 私聊会话模块
## 模块概述
私聊会话模块负责处理用户之间的一对一聊天功能,包括会话管理、消息发送、消息历史等。
## 相关文件
- `MessagesActivity.java` - 会话列表界面
- `ConversationActivity.java` - 聊天界面
- `ConversationsAdapter.java` - 会话列表适配器
- `ConversationMessagesAdapter.java` - 消息列表适配器
- `ConversationResponse.java` - 会话响应模型
- `PrivateMessageResponse.java` - 私聊消息响应模型
---
## 接口列表
### 1. 获取会话列表
**接口地址**: `GET /api/front/conversations`
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "long", // 会话ID
"otherUserId": "integer", // 对方用户ID
"otherUserNickname": "string", // 对方昵称
"otherUserAvatar": "string", // 对方头像URL
"lastMessage": "string", // 最后一条消息内容
"lastMessageTime": "long", // 最后消息时间戳
"unreadCount": "integer", // 未读消息数
"isOnline": "boolean" // 对方是否在线
}
]
}
```
---
### 2. 搜索会话
**接口地址**: `GET /api/front/conversations/search`
**请求参数**:
```
keyword: string // 搜索关键词(昵称)
```
**返回数据**: 同获取会话列表
---
### 3. 获取或创建会话
**接口地址**: `POST /api/front/conversations/with/{otherUserId}`
**路径参数**:
```
otherUserId: integer // 对方用户ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"conversationId": "long", // 会话ID
"created": "boolean" // 是否新创建
}
}
```
---
### 4. 标记会话已读
**接口地址**: `POST /api/front/conversations/{id}/read`
**路径参数**:
```
id: long // 会话ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": true
}
```
---
### 5. 删除会话
**接口地址**: `DELETE /api/front/conversations/{id}`
**路径参数**:
```
id: long // 会话ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "删除成功",
"data": true
}
```
---
### 6. 获取会话消息列表
**接口地址**: `GET /api/front/conversations/{id}/messages`
**路径参数**:
```
id: long // 会话ID
```
**请求参数**:
```
page: integer // 页码默认1
pageSize: integer // 每页数量默认20
```
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "long", // 消息ID
"conversationId": "long", // 会话ID
"senderId": "integer", // 发送者ID
"senderNickname": "string",// 发送者昵称
"senderAvatar": "string", // 发送者头像
"content": "string", // 消息内容
"messageType": "string", // 消息类型: text/image/voice
"mediaUrl": "string", // 媒体文件URL图片/语音)
"duration": "integer", // 语音时长(秒)
"isRead": "boolean", // 是否已读
"createTime": "long" // 发送时间戳
}
]
}
```
---
### 7. 发送私聊消息
**接口地址**: `POST /api/front/conversations/{id}/messages`
**路径参数**:
```
id: long // 会话ID
```
**请求参数** (SendMessageRequest):
```json
{
"content": "string", // 消息内容
"messageType": "string", // 消息类型: text/image/voice
"mediaUrl": "string", // 媒体文件URL可选
"duration": "integer" // 语音时长(可选)
}
```
**返回数据** (PrivateMessageResponse):
```json
{
"code": 200,
"msg": "发送成功",
"data": {
"id": "long", // 消息ID
"conversationId": "long", // 会话ID
"senderId": "integer", // 发送者ID
"senderNickname": "string",// 发送者昵称
"senderAvatar": "string", // 发送者头像
"content": "string", // 消息内容
"messageType": "string", // 消息类型
"mediaUrl": "string", // 媒体文件URL
"duration": "integer", // 语音时长
"isRead": "boolean", // 是否已读
"createTime": "long" // 发送时间戳
}
}
```
---
### 8. 删除消息
**接口地址**: `DELETE /api/front/conversations/messages/{id}`
**路径参数**:
```
id: long // 消息ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "删除成功",
"data": true
}
```
---
## 功能说明
### 会话管理
- 会话列表按最后消息时间倒序排列
- 显示未读消息数量
- 支持搜索会话(按对方昵称)
- 支持删除会话
### 消息发送
- 支持文本消息
- 支持图片消息需先上传图片获取URL
- 支持语音消息需先上传语音获取URL
- 消息实时推送通过WebSocket
### 消息状态
- 已读/未读状态
- 消息发送时间
- 消息类型标识
---
## 消息类型说明
| 类型 | 值 | 说明 |
|------|-----|------|
| 文本消息 | text | 普通文字消息 |
| 图片消息 | image | 图片消息需要mediaUrl |
| 语音消息 | voice | 语音消息需要mediaUrl和duration |
---
## 使用流程
### 发送文本消息
1. 进入会话界面
2. 输入文本内容
3. 调用发送消息接口
4. 消息通过WebSocket实时推送给对方
### 发送图片消息
1. 选择图片
2. 调用文件上传接口获取URL
3. 调用发送消息接口messageType为imagemediaUrl为上传返回的URL
4. 消息通过WebSocket实时推送给对方
### 发送语音消息
1. 录制语音
2. 调用文件上传接口获取URL
3. 调用发送消息接口messageType为voicemediaUrl为上传返回的URLduration为语音时长
4. 消息通过WebSocket实时推送给对方
---
## 注意事项
1. 所有接口都需要登录认证
2. 图片和语音消息需要先上传文件获取URL
3. 消息列表支持分页加载
4. 建议配合WebSocket实现实时消息推送
5. 删除会话不会删除消息记录,只是隐藏会话

View File

@ -1,239 +0,0 @@
# 文件上传模块
## 模块概述
文件上传模块负责处理图片、视频等媒体文件的上传功能,为用户头像、作品发布、消息图片等功能提供支持。
## 相关文件
- `FileUploadResponse.java` - 文件上传响应模型
- `PublishWorkActivity.java` - 作品发布界面(使用文件上传)
- `EditProfileActivity.java` - 编辑资料界面(使用头像上传)
---
## 接口列表
### 1. 上传图片
**接口地址**: `POST /api/front/user/upload/image`
**请求方式**: `multipart/form-data`
**请求参数**:
```
file: File // 图片文件(必填)
model: string // 模块标识(必填)
pid: integer // 关联ID必填
```
**model参数说明**:
- `avatar` - 用户头像
- `work` - 作品图片
- `message` - 聊天图片
- `cover` - 封面图片
**返回数据** (FileUploadResponse):
```json
{
"code": 200,
"msg": "上传成功",
"data": {
"url": "string", // 文件访问URL
"fileName": "string", // 文件名
"fileSize": "long", // 文件大小(字节)
"fileType": "string", // 文件类型
"uploadTime": "long" // 上传时间戳
}
}
```
---
### 2. 上传视频
**接口地址**: `POST /api/front/upload/work/video`
**请求方式**: `multipart/form-data`
**请求参数**:
```
file: File // 视频文件(必填)
model: string // 模块标识(必填)
pid: integer // 关联ID必填
```
**model参数说明**:
- `work` - 作品视频
- `message` - 聊天视频
**返回数据** (FileUploadResponse):
```json
{
"code": 200,
"msg": "上传成功",
"data": {
"url": "string", // 文件访问URL
"fileName": "string", // 文件名
"fileSize": "long", // 文件大小(字节)
"fileType": "string", // 文件类型
"duration": "integer", // 视频时长(秒)
"width": "integer", // 视频宽度
"height": "integer", // 视频高度
"uploadTime": "long" // 上传时间戳
}
}
```
---
## 功能说明
### 支持的文件类型
**图片格式**:
- JPG/JPEG
- PNG
- GIF
- WEBP
**视频格式**:
- MP4
- AVI
- MOV
- FLV
### 文件大小限制
- 图片:最大 10MB
- 视频:最大 100MB
### 上传流程
1. 选择文件
2. 构建 multipart/form-data 请求
3. 调用上传接口
4. 获取返回的文件URL
5. 使用URL进行后续操作如发布作品、更新头像等
---
## 使用示例
### Android代码示例
#### 上传图片
```java
// 创建文件部分
File imageFile = new File(imagePath);
RequestBody fileBody = RequestBody.create(
MediaType.parse("image/*"),
imageFile
);
MultipartBody.Part filePart = MultipartBody.Part.createFormData(
"file",
imageFile.getName(),
fileBody
);
// 创建其他参数
RequestBody model = RequestBody.create(
MediaType.parse("text/plain"),
"avatar"
);
RequestBody pid = RequestBody.create(
MediaType.parse("text/plain"),
String.valueOf(userId)
);
// 调用接口
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<FileUploadResponse>> call =
apiService.uploadImage(filePart, model, pid);
call.enqueue(new Callback<ApiResponse<FileUploadResponse>>() {
@Override
public void onResponse(Call<ApiResponse<FileUploadResponse>> call,
Response<ApiResponse<FileUploadResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<FileUploadResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
String imageUrl = apiResponse.getData().getUrl();
// 使用图片URL
}
}
}
@Override
public void onFailure(Call<ApiResponse<FileUploadResponse>> call, Throwable t) {
// 处理错误
}
});
```
#### 上传视频
```java
// 创建文件部分
File videoFile = new File(videoPath);
RequestBody fileBody = RequestBody.create(
MediaType.parse("video/*"),
videoFile
);
MultipartBody.Part filePart = MultipartBody.Part.createFormData(
"file",
videoFile.getName(),
fileBody
);
// 创建其他参数
RequestBody model = RequestBody.create(
MediaType.parse("text/plain"),
"work"
);
RequestBody pid = RequestBody.create(
MediaType.parse("text/plain"),
String.valueOf(userId)
);
// 调用接口
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<FileUploadResponse>> call =
apiService.uploadVideo(filePart, model, pid);
call.enqueue(new Callback<ApiResponse<FileUploadResponse>>() {
@Override
public void onResponse(Call<ApiResponse<FileUploadResponse>> call,
Response<ApiResponse<FileUploadResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<FileUploadResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
String videoUrl = apiResponse.getData().getUrl();
int duration = apiResponse.getData().getDuration();
// 使用视频URL和时长
}
}
}
@Override
public void onFailure(Call<ApiResponse<FileUploadResponse>> call, Throwable t) {
// 处理错误
}
});
```
---
## 错误处理
| 错误码 | 说明 |
|--------|------|
| 400 | 参数错误或文件格式不支持 |
| 401 | 未登录 |
| 413 | 文件过大 |
| 415 | 不支持的文件类型 |
| 500 | 服务器错误 |
---
## 注意事项
1. 所有上传接口都需要登录认证
2. 上传前建议先压缩图片以提高上传速度
3. 视频上传时间较长,建议显示进度条
4. 上传失败时可以重试
5. model和pid参数用于后端文件管理和关联
6. 返回的URL是完整的访问地址可直接使用
7. 建议在上传前检查文件大小和格式

View File

@ -1,286 +0,0 @@
# 在线状态模块
## 模块概述
在线状态模块负责管理和查询用户的在线状态,包括单个用户在线状态、批量查询、房间在线人数统计等功能。
## 相关文件
- `RoomDetailActivity.java` - 直播间详情(显示在线人数)
- `ConversationsAdapter.java` - 会话列表(显示好友在线状态)
- `FriendsAdapter.java` - 好友列表(显示在线状态)
---
## 接口列表
### 1. 查询用户在线状态
**接口地址**: `GET /api/front/online/status/{userId}`
**路径参数**:
```
userId: integer // 用户ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"userId": "integer", // 用户ID
"isOnline": "boolean", // 是否在线
"lastOnlineTime": "long", // 最后在线时间戳
"status": "string" // 状态: online/offline/busy
}
}
```
---
### 2. 批量查询用户在线状态
**接口地址**: `POST /api/front/online/status/batch`
**请求参数**:
```json
[1, 2, 3, 4, 5] // 用户ID数组
```
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"1": {
"userId": 1,
"isOnline": true,
"lastOnlineTime": 1703001234567,
"status": "online"
},
"2": {
"userId": 2,
"isOnline": false,
"lastOnlineTime": 1703000000000,
"status": "offline"
}
}
}
```
---
### 3. 获取房间在线人数
**接口地址**: `GET /api/front/online/room/{roomId}/count`
**路径参数**:
```
roomId: string // 房间ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"roomId": "string", // 房间ID
"onlineCount": "integer" // 在线人数
}
}
```
---
### 4. 获取房间在线用户列表
**接口地址**: `GET /api/front/online/room/{roomId}/users`
**路径参数**:
```
roomId: string // 房间ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"roomId": "string",
"onlineCount": "integer",
"users": [
{
"userId": "integer",
"nickname": "string",
"avatar": "string",
"joinTime": "long" // 进入房间时间
}
]
}
}
```
---
### 5. 获取连接统计信息
**接口地址**: `GET /api/front/online/stats`
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"totalOnlineUsers": "integer", // 总在线用户数
"totalConnections": "integer", // 总连接数
"totalRooms": "integer", // 总房间数
"activeRooms": "integer", // 活跃房间数
"serverTime": "long" // 服务器时间戳
}
}
```
---
## 功能说明
### 在线状态类型
| 状态 | 值 | 说明 |
|------|-----|------|
| 在线 | online | 用户当前在线 |
| 离线 | offline | 用户已离线 |
| 忙碌 | busy | 用户在线但忙碌 |
### 状态更新机制
- 用户登录时自动设置为在线
- 用户退出登录时设置为离线
- WebSocket连接断开时设置为离线
- 心跳检测维持在线状态
### 房间在线统计
- 实时统计房间内的在线用户数
- 通过WebSocket实时推送在线人数变化
- 支持查询房间内的在线用户列表
---
## 使用场景
### 1. 好友列表显示在线状态
```java
// 获取好友列表后,批量查询在线状态
List<Integer> friendIds = new ArrayList<>();
for (Friend friend : friends) {
friendIds.add(friend.getUserId());
}
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<Map<String, Object>>> call =
apiService.checkUsersOnline(friendIds);
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
@Override
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
Response<ApiResponse<Map<String, Object>>> response) {
if (response.isSuccessful() && response.body() != null) {
Map<String, Object> statusMap = response.body().getData();
// 更新好友列表的在线状态
}
}
@Override
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
// 处理错误
}
});
```
### 2. 直播间显示在线人数
```java
// 进入直播间后获取在线人数
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<Map<String, Object>>> call =
apiService.getRoomOnlineCount(roomId);
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
@Override
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
Response<ApiResponse<Map<String, Object>>> response) {
if (response.isSuccessful() && response.body() != null) {
Map<String, Object> data = response.body().getData();
int onlineCount = (int) data.get("onlineCount");
// 更新UI显示在线人数
}
}
@Override
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
// 处理错误
}
});
// 同时通过WebSocket监听在线人数变化
// 参考 WebSocket通信模块文档
```
### 3. 会话列表显示对方在线状态
```java
// 获取会话列表后,查询对方在线状态
for (Conversation conversation : conversations) {
int otherUserId = conversation.getOtherUserId();
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<Map<String, Object>>> call =
apiService.checkUserOnline(otherUserId);
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
@Override
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
Response<ApiResponse<Map<String, Object>>> response) {
if (response.isSuccessful() && response.body() != null) {
Map<String, Object> data = response.body().getData();
boolean isOnline = (boolean) data.get("isOnline");
// 更新会话列表的在线状态
}
}
@Override
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
// 处理错误
}
});
}
```
---
## WebSocket实时推送
在线状态变化可以通过WebSocket实时推送详见 [WebSocket通信模块](./04-WebSocket通信模块.md)。
**推送消息格式**:
```json
{
"type": "online_status",
"userId": 123,
"isOnline": true,
"status": "online"
}
```
---
## 注意事项
1. 批量查询建议一次不超过100个用户ID
2. 在线状态有缓存,可能存在几秒延迟
3. 建议配合WebSocket实现实时状态更新
4. 房间在线人数通过WebSocket实时推送更准确
5. 离线时间超过5分钟的用户会显示最后在线时间
6. 频繁查询在线状态可能影响性能,建议合理控制查询频率

View File

@ -1,296 +0,0 @@
# 离线消息模块
## 模块概述
离线消息模块负责管理用户离线期间收到的消息,包括消息存储、查询、清除等功能,确保用户上线后能够接收到离线期间的消息。
## 相关文件
- `MessagesActivity.java` - 消息列表(显示离线消息提示)
- `ConversationActivity.java` - 聊天界面(加载离线消息)
- `UnreadMessageManager.java` - 未读消息管理器
---
## 接口列表
### 1. 获取离线消息数量
**接口地址**: `GET /api/front/online/offline/count/{userId}`
**路径参数**:
```
userId: integer // 用户ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"userId": "integer", // 用户ID
"totalCount": "integer", // 总离线消息数
"privateCount": "integer", // 私聊消息数
"systemCount": "integer", // 系统消息数
"lastOfflineTime": "long" // 最后离线时间
}
}
```
---
### 2. 获取离线消息列表
**接口地址**: `GET /api/front/online/offline/messages/{userId}`
**路径参数**:
```
userId: integer // 用户ID
```
**请求参数**:
```
limit: integer // 获取数量限制默认100
```
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"userId": "integer",
"messages": [
{
"id": "long", // 消息ID
"messageType": "string", // 消息类型: private/system/notification
"senderId": "integer", // 发送者ID
"senderNickname": "string", // 发送者昵称
"senderAvatar": "string", // 发送者头像
"content": "string", // 消息内容
"conversationId": "long", // 会话ID私聊消息
"createTime": "long", // 消息时间戳
"extra": {} // 额外信息
}
],
"totalCount": "integer",
"hasMore": "boolean" // 是否还有更多消息
}
}
```
---
### 3. 清除离线消息
**接口地址**: `DELETE /api/front/online/offline/messages/{userId}`
**路径参数**:
```
userId: integer // 用户ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "清除成功",
"data": "success"
}
```
---
## 功能说明
### 离线消息类型
| 类型 | 值 | 说明 |
|------|-----|------|
| 私聊消息 | private | 用户之间的私聊消息 |
| 系统消息 | system | 系统通知消息 |
| 通知消息 | notification | 应用内通知 |
### 离线消息机制
1. 用户离线时,服务器会保存发送给该用户的消息
2. 用户上线后,自动推送离线消息
3. 离线消息保存时间7天
4. 超过7天的离线消息会被自动清除
### 消息推送流程
1. 用户登录/连接WebSocket
2. 服务器检测到用户上线
3. 查询该用户的离线消息
4. 通过WebSocket推送离线消息
5. 推送完成后标记消息已送达
---
## 使用场景
### 1. 用户登录后获取离线消息数量
```java
// 登录成功后查询离线消息数量
int userId = AuthStore.getUserId(context);
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<Map<String, Object>>> call =
apiService.getOfflineMessageCount(userId);
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
@Override
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
Response<ApiResponse<Map<String, Object>>> response) {
if (response.isSuccessful() && response.body() != null) {
Map<String, Object> data = response.body().getData();
int totalCount = (int) data.get("totalCount");
if (totalCount > 0) {
// 显示离线消息提示
showOfflineMessageNotification(totalCount);
}
}
}
@Override
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
// 处理错误
}
});
```
### 2. 获取并显示离线消息
```java
// 获取离线消息列表
int userId = AuthStore.getUserId(context);
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<Map<String, Object>>> call =
apiService.getOfflineMessages(userId, 100);
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
@Override
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
Response<ApiResponse<Map<String, Object>>> response) {
if (response.isSuccessful() && response.body() != null) {
Map<String, Object> data = response.body().getData();
List<Map<String, Object>> messages =
(List<Map<String, Object>>) data.get("messages");
// 处理离线消息
for (Map<String, Object> message : messages) {
String messageType = (String) message.get("messageType");
if ("private".equals(messageType)) {
// 处理私聊消息
handlePrivateMessage(message);
} else if ("system".equals(messageType)) {
// 处理系统消息
handleSystemMessage(message);
}
}
// 处理完成后清除离线消息
clearOfflineMessages(userId);
}
}
@Override
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
// 处理错误
}
});
```
### 3. 清除离线消息
```java
// 用户查看完离线消息后清除
int userId = AuthStore.getUserId(context);
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<String>> call =
apiService.clearOfflineMessages(userId);
call.enqueue(new Callback<ApiResponse<String>>() {
@Override
public void onResponse(Call<ApiResponse<String>> call,
Response<ApiResponse<String>> response) {
if (response.isSuccessful() && response.body() != null) {
Log.d("OfflineMessage", "离线消息已清除");
}
}
@Override
public void onFailure(Call<ApiResponse<String>> call, Throwable t) {
// 处理错误
}
});
```
---
## WebSocket自动推送
用户上线后服务器会自动通过WebSocket推送离线消息无需手动调用接口。
**推送消息格式**:
```json
{
"type": "offline_message",
"messages": [
{
"id": 123,
"messageType": "private",
"senderId": 456,
"senderNickname": "张三",
"content": "你好",
"createTime": 1703001234567
}
],
"totalCount": 5
}
```
---
## 最佳实践
### 1. 登录后处理流程
```
用户登录
连接WebSocket
查询离线消息数量
显示离线消息提示(如果有)
用户点击查看
获取离线消息列表
显示消息内容
清除离线消息
```
### 2. 消息处理建议
- 私聊消息:更新对应会话的未读数
- 系统消息:显示在通知中心
- 通知消息:显示应用内通知
### 3. 性能优化
- 分批获取离线消息每次100条
- 优先显示最新的消息
- 后台异步处理历史消息
---
## 注意事项
1. 离线消息保存时间为7天
2. 获取离线消息后建议及时清除,避免重复推送
3. 离线消息数量过多时建议分批获取
4. WebSocket连接成功后会自动推送离线消息
5. 清除操作不可恢复,请谨慎使用
6. 建议在用户查看完消息后再清除
7. 系统会自动清理已读的离线消息

View File

@ -1,170 +0,0 @@
# 观看历史模块
## 模块概述
观看历史模块负责记录用户观看直播间的历史记录,用于推荐算法、用户行为分析等功能。
## 相关文件
- `RoomDetailActivity.java` - 直播间详情(记录观看历史)
- `WatchHistoryActivity.java` - 观看历史列表界面
---
## 接口列表
### 1. 记录观看历史
**接口地址**: `POST /api/front/watch/history`
**请求参数**:
```json
{
"roomId": "string", // 直播间ID必填
"watchTime": "long" // 观看时间戳(必填)
}
```
**返回数据**:
```json
{
"code": 200,
"msg": "记录成功",
"data": {
"historyId": "long", // 历史记录ID
"roomId": "string", // 直播间ID
"userId": "integer", // 用户ID
"watchTime": "long", // 观看时间
"duration": "integer" // 观看时长(秒)
}
}
```
---
## 功能说明
### 记录时机
- 用户进入直播间时自动记录
- 记录用户进入时间
- 用户退出时更新观看时长
### 数据用途
- 个性化推荐:根据观看历史推荐相似直播间
- 用户画像:分析用户兴趣偏好
- 数据统计:统计直播间热度和观看数据
- 历史记录:用户可查看自己的观看历史
### 隐私保护
- 仅记录已登录用户的观看历史
- 用户可以清除自己的观看历史
- 观看历史仅用户本人可见
---
## 使用场景
### 1. 进入直播间时记录
```java
// 在 RoomDetailActivity 的 onCreate 中调用
private void recordWatchHistory() {
if (!AuthHelper.isLoggedIn(this)) {
return; // 未登录用户不记录
}
if (TextUtils.isEmpty(roomId)) {
return;
}
ApiService apiService = ApiClient.getService(getApplicationContext());
Map<String, Object> body = new HashMap<>();
body.put("roomId", roomId);
body.put("watchTime", System.currentTimeMillis());
Call<ApiResponse<Map<String, Object>>> call =
apiService.recordWatchHistory(body);
call.enqueue(new Callback<ApiResponse<Map<String, Object>>>() {
@Override
public void onResponse(Call<ApiResponse<Map<String, Object>>> call,
Response<ApiResponse<Map<String, Object>>> response) {
if (response.isSuccessful() && response.body() != null) {
Log.d("RoomDetail", "观看历史记录成功");
}
}
@Override
public void onFailure(Call<ApiResponse<Map<String, Object>>> call, Throwable t) {
Log.e("RoomDetail", "观看历史记录失败: " + t.getMessage());
}
});
}
```
### 2. 退出直播间时更新时长
```java
// 在 onDestroy 或 onStop 中调用
private void updateWatchDuration() {
if (historyId == null) {
return;
}
long duration = (System.currentTimeMillis() - enterTime) / 1000; // 秒
// 调用更新接口(如果后端提供)
// 或者在记录时就包含时长计算
}
```
---
## 扩展功能(建议)
虽然当前接口只有记录功能,但建议后端提供以下扩展接口:
### 获取观看历史列表
```
GET /api/front/watch/history
参数: page, pageSize
返回: 用户的观看历史列表
```
### 清除观看历史
```
DELETE /api/front/watch/history/{historyId}
DELETE /api/front/watch/history/clear
```
### 获取推荐直播间
```
GET /api/front/watch/recommendations
基于观看历史推荐相似直播间
```
---
## 数据统计
观看历史数据可用于以下统计:
### 用户维度
- 观看总时长
- 观看直播间数量
- 最常观看的分类
- 观看时间分布
### 直播间维度
- 总观看人数
- 平均观看时长
- 回访率
- 观看高峰时段
---
## 注意事项
1. 仅记录已登录用户的观看历史
2. 未登录用户不会记录观看历史
3. 记录失败不影响用户正常观看
4. 建议异步记录,不阻塞主流程
5. 观看时长计算应考虑用户切换后台的情况
6. 同一用户多次进入同一直播间会产生多条记录
7. 建议定期清理过期的历史记录如保留最近3个月

View File

@ -1,394 +0,0 @@
# 礼物打赏模块
## 模块概述
礼物打赏模块负责处理直播间内的虚拟礼物赠送功能,包括礼物列表、用户余额、礼物赠送、充值等功能。
## 相关文件
- `RoomDetailActivity.java` - 直播间详情(礼物赠送)
- `Gift.java` - 礼物模型
- `GiftAdapter.java` - 礼物列表适配器
- `GiftResponse.java` - 礼物响应模型
- `SendGiftRequest.java` - 赠送礼物请求模型
- `SendGiftResponse.java` - 赠送礼物响应模型
- `UserBalanceResponse.java` - 用户余额响应模型
- `RechargeOption.java` - 充值选项模型
- `RechargeAdapter.java` - 充值选项适配器
---
## 接口列表
### 1. 获取礼物列表
**接口地址**: `GET /api/front/gift/list`
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "integer", // 礼物ID
"name": "string", // 礼物名称
"price": "integer", // 礼物价格(金币)
"icon": "string", // 礼物图标URL
"level": "integer", // 礼物等级1-5
"description": "string", // 礼物描述
"animation": "string", // 动画效果URL
"sort": "integer" // 排序
}
]
}
```
---
### 2. 获取用户余额
**接口地址**: `GET /api/front/gift/balance`
**请求参数**: 无
**返回数据** (UserBalanceResponse):
```json
{
"code": 200,
"msg": "success",
"data": {
"userId": "integer", // 用户ID
"coinBalance": "integer", // 金币余额
"totalRecharge": "integer",// 累计充值金币
"totalConsume": "integer", // 累计消费金币
"vipLevel": "integer" // VIP等级
}
}
```
---
### 3. 赠送礼物
**接口地址**: `POST /api/front/gift/send`
**请求参数** (SendGiftRequest):
```json
{
"giftId": "integer", // 礼物ID必填
"receiverId": "integer", // 接收者ID必填
"roomId": "string", // 直播间ID必填
"count": "integer", // 赠送数量(必填)
"message": "string" // 附加消息(可选)
}
```
**返回数据** (SendGiftResponse):
```json
{
"code": 200,
"msg": "赠送成功",
"data": {
"giftRecordId": "long", // 礼物记录ID
"giftId": "integer", // 礼物ID
"giftName": "string", // 礼物名称
"count": "integer", // 赠送数量
"totalPrice": "integer", // 总价格
"newBalance": "integer", // 赠送后的余额
"sendTime": "long" // 赠送时间戳
}
}
```
---
### 4. 获取充值选项
**接口地址**: `GET /api/front/gift/recharge/options`
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": "string", // 选项ID
"coinAmount": "integer", // 金币数量
"price": "number", // 价格(元)
"discountLabel": "string",// 优惠标签(可选)
"isHot": "boolean", // 是否热门
"sort": "integer" // 排序
}
]
}
```
---
### 5. 创建充值订单
**接口地址**: `POST /api/front/gift/recharge/create`
**请求参数** (CreateRechargeRequest):
```json
{
"optionId": "string", // 充值选项ID必填
"coinAmount": "integer", // 金币数量(必填)
"price": "number" // 价格(必填)
}
```
**返回数据** (CreateRechargeResponse):
```json
{
"code": 200,
"msg": "订单创建成功",
"data": {
"orderId": "string", // 订单ID
"orderNo": "string", // 订单号
"coinAmount": "integer", // 金币数量
"price": "number", // 价格
"paymentUrl": "string", // 支付URL
"createTime": "long" // 创建时间
}
}
```
---
## 功能说明
### 礼物等级
| 等级 | 价格范围 | 说明 |
|------|---------|------|
| 1 | 1-50金币 | 普通礼物 |
| 2 | 51-100金币 | 精美礼物 |
| 3 | 101-500金币 | 豪华礼物 |
| 4 | 501-1000金币 | 贵族礼物 |
| 5 | 1000+金币 | 至尊礼物 |
### 赠送流程
1. 用户点击礼物按钮
2. 显示礼物列表和当前余额
3. 选择礼物和数量
4. 检查余额是否足够
5. 调用赠送接口
6. 扣除金币,更新余额
7. 在直播间显示礼物动画
8. 通过WebSocket推送给其他观众
### 充值流程
1. 用户点击充值按钮
2. 显示充值选项列表
3. 选择充值金额
4. 创建充值订单
5. 选择支付方式(支付宝/微信)
6. 调用支付接口
7. 支付成功后更新余额
---
## 使用场景
### 1. 加载礼物列表
```java
private void loadGiftsFromBackend() {
ApiService apiService = ApiClient.getService(getApplicationContext());
Call<ApiResponse<List<GiftResponse>>> call = apiService.getGiftList();
call.enqueue(new Callback<ApiResponse<List<GiftResponse>>>() {
@Override
public void onResponse(Call<ApiResponse<List<GiftResponse>>> call,
Response<ApiResponse<List<GiftResponse>>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<List<GiftResponse>> apiResponse = response.body();
if (apiResponse.getCode() == 200 && apiResponse.getData() != null) {
availableGifts = new ArrayList<>();
for (GiftResponse giftResponse : apiResponse.getData()) {
Gift gift = new Gift(
String.valueOf(giftResponse.getId()),
giftResponse.getName(),
giftResponse.getPrice().intValue(),
R.drawable.ic_gift_rose,
giftResponse.getLevel() != null ? giftResponse.getLevel() : 1
);
availableGifts.add(gift);
}
}
}
}
@Override
public void onFailure(Call<ApiResponse<List<GiftResponse>>> call, Throwable t) {
Log.e("Gift", "加载礼物列表失败: " + t.getMessage());
}
});
}
```
### 2. 获取用户余额
```java
private void loadUserBalance(TextView coinBalanceView) {
ApiService apiService = ApiClient.getService(getApplicationContext());
Call<ApiResponse<UserBalanceResponse>> call = apiService.getUserBalance();
call.enqueue(new Callback<ApiResponse<UserBalanceResponse>>() {
@Override
public void onResponse(Call<ApiResponse<UserBalanceResponse>> call,
Response<ApiResponse<UserBalanceResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<UserBalanceResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200 && apiResponse.getData() != null) {
userCoinBalance = apiResponse.getData().getCoinBalance().intValue();
coinBalanceView.setText(String.valueOf(userCoinBalance));
}
}
}
@Override
public void onFailure(Call<ApiResponse<UserBalanceResponse>> call, Throwable t) {
Log.e("Gift", "获取余额失败: " + t.getMessage());
}
});
}
```
### 3. 赠送礼物
```java
private void sendGiftToBackend(Gift selectedGift, int count, int totalPrice) {
// 检查余额
if (userCoinBalance < totalPrice) {
Toast.makeText(this, "金币不足,请先充值", Toast.LENGTH_SHORT).show();
showRechargeDialog();
return;
}
ApiService apiService = ApiClient.getService(getApplicationContext());
SendGiftRequest request = new SendGiftRequest();
request.setGiftId(Integer.parseInt(selectedGift.getId()));
request.setReceiverId(room.getStreamerId());
request.setRoomId(roomId);
request.setCount(count);
Call<ApiResponse<SendGiftResponse>> call = apiService.sendGift(request);
call.enqueue(new Callback<ApiResponse<SendGiftResponse>>() {
@Override
public void onResponse(Call<ApiResponse<SendGiftResponse>> call,
Response<ApiResponse<SendGiftResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<SendGiftResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200 && apiResponse.getData() != null) {
SendGiftResponse giftResponse = apiResponse.getData();
// 更新余额
userCoinBalance = giftResponse.getNewBalance().intValue();
// 显示赠送消息
String giftMessage = String.format("送出了 %d 个 %s",
count, selectedGift.getName());
addChatMessage(new ChatMessage("我", giftMessage, true));
Toast.makeText(RoomDetailActivity.this,
"赠送成功!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<ApiResponse<SendGiftResponse>> call, Throwable t) {
Toast.makeText(RoomDetailActivity.this,
"网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
```
### 4. 创建充值订单
```java
private void createRechargeOrder(RechargeOption selectedOption) {
ApiService apiService = ApiClient.getService(getApplicationContext());
CreateRechargeRequest request = new CreateRechargeRequest();
request.setOptionId(selectedOption.getId());
request.setCoinAmount(selectedOption.getCoinAmount());
request.setPrice(selectedOption.getPrice());
Call<ApiResponse<CreateRechargeResponse>> call =
apiService.createRecharge(request);
call.enqueue(new Callback<ApiResponse<CreateRechargeResponse>>() {
@Override
public void onResponse(Call<ApiResponse<CreateRechargeResponse>> call,
Response<ApiResponse<CreateRechargeResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<CreateRechargeResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200 && apiResponse.getData() != null) {
CreateRechargeResponse rechargeResponse = apiResponse.getData();
String orderId = rechargeResponse.getOrderId();
// 显示支付选择对话框
showPaymentMethodDialog(orderId, selectedOption);
}
}
}
@Override
public void onFailure(Call<ApiResponse<CreateRechargeResponse>> call, Throwable t) {
Toast.makeText(RoomDetailActivity.this,
"网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
```
---
## WebSocket推送
礼物赠送后会通过WebSocket推送给直播间内的所有用户用于显示礼物动画。
**推送消息格式**:
```json
{
"type": "gift",
"giftId": 1,
"giftName": "玫瑰",
"count": 10,
"senderId": 123,
"senderNickname": "张三",
"receiverId": 456,
"receiverNickname": "主播",
"roomId": "room123"
}
```
---
## 默认礼物列表
如果接口加载失败,可以使用以下默认礼物:
| ID | 名称 | 价格 | 等级 |
|----|------|------|------|
| 1 | 玫瑰 | 10 | 1 |
| 2 | 爱心 | 20 | 1 |
| 3 | 蛋糕 | 50 | 2 |
| 4 | 星星 | 100 | 2 |
| 5 | 钻石 | 200 | 3 |
| 6 | 皇冠 | 500 | 4 |
| 7 | 跑车 | 1000 | 5 |
| 8 | 火箭 | 2000 | 5 |
---
## 注意事项
1. 所有接口都需要登录认证
2. 赠送礼物前必须检查余额是否足够
3. 礼物价格以金币为单位,不是人民币
4. 充值需要集成第三方支付SDK支付宝/微信)
5. 礼物动画效果需要前端实现
6. 建议缓存礼物列表,减少网络请求
7. 余额变化后及时更新UI显示
8. 赠送失败时不扣除金币

View File

@ -1,526 +0,0 @@
# 通话功能模块
## 模块概述
通话功能模块负责处理用户之间的语音和视频通话功能,包括发起通话、接听/拒绝通话、通话记录等。
## 相关文件
- `CallActivity.java` - 通话界面
- `IncomingCallActivity.java` - 来电界面
- `CallHistoryActivity.java` - 通话记录界面
- `CallManager.java` - 通话管理器
- `CallSignalingClient.java` - 信令客户端
- `CallApiService.java` - 通话API接口
- `InitiateCallRequest.java` - 发起通话请求模型
- `InitiateCallResponse.java` - 发起通话响应模型
- `CallRecordResponse.java` - 通话记录响应模型
- `CallHistoryResponse.java` - 通话历史响应模型
---
## 接口列表
### 1. 发起通话
**接口地址**: `POST /api/front/call/initiate`
**请求参数** (InitiateCallRequest):
```json
{
"calleeId": "integer", // 被叫用户ID必填
"callType": "string" // 通话类型: voice/video必填
}
```
**返回数据** (InitiateCallResponse):
```json
{
"code": 200,
"msg": "success",
"data": {
"callId": "string", // 通话ID
"callType": "string", // 通话类型
"calleeId": "integer", // 被叫用户ID
"calleeName": "string", // 被叫用户昵称
"calleeAvatar": "string", // 被叫用户头像
"status": "string", // 通话状态: calling
"signalingUrl": "string" // 信令服务器URL
}
}
```
---
### 2. 接听通话
**接口地址**: `POST /api/front/call/accept/{callId}`
**路径参数**:
```
callId: string // 通话ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "接听成功",
"data": true
}
```
---
### 3. 拒绝通话
**接口地址**: `POST /api/front/call/reject/{callId}`
**路径参数**:
```
callId: string // 通话ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "已拒绝",
"data": true
}
```
---
### 4. 取消通话
**接口地址**: `POST /api/front/call/cancel/{callId}`
**路径参数**:
```
callId: string // 通话ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "已取消",
"data": true
}
```
---
### 5. 结束通话
**接口地址**: `POST /api/front/call/end/{callId}`
**路径参数**:
```
callId: string // 通话ID
```
**请求参数**:
```
endReason: string // 结束原因(可选)
```
**返回数据**:
```json
{
"code": 200,
"msg": "通话已结束",
"data": true
}
```
---
### 6. 获取通话记录
**接口地址**: `GET /api/front/call/history`
**请求参数**:
```
page: integer // 页码默认1
limit: integer // 每页数量默认20
```
**返回数据** (CallHistoryResponse):
```json
{
"code": 200,
"msg": "success",
"data": {
"records": [
{
"id": "long", // 记录ID
"callId": "string", // 通话ID
"callType": "string", // 通话类型: voice/video
"callDirection": "string", // 通话方向: outgoing/incoming
"otherUserId": "integer", // 对方用户ID
"otherUserName": "string", // 对方用户昵称
"otherUserAvatar": "string",// 对方用户头像
"status": "string", // 状态: completed/missed/rejected/cancelled
"duration": "integer", // 通话时长(秒)
"startTime": "long", // 开始时间戳
"endTime": "long" // 结束时间戳
}
],
"total": "integer",
"page": "integer",
"limit": "integer"
}
}
```
---
### 7. 删除通话记录
**接口地址**: `DELETE /api/front/call/record/{recordId}`
**路径参数**:
```
recordId: long // 记录ID
```
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "删除成功",
"data": true
}
```
---
### 8. 获取未接来电数量
**接口地址**: `GET /api/front/call/missed/count`
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": 5 // 未接来电数量
}
```
---
### 9. 获取通话状态
**接口地址**: `GET /api/front/call/status`
**请求参数**: 无
**返回数据**:
```json
{
"code": 200,
"msg": "success",
"data": {
"inCall": "boolean", // 是否正在通话中
"callId": "string", // 当前通话ID
"callType": "string", // 通话类型
"otherUserId": "integer", // 对方用户ID
"startTime": "long" // 通话开始时间
}
}
```
---
### 10. 获取通话详情
**接口地址**: `GET /api/front/call/detail/{callId}`
**路径参数**:
```
callId: string // 通话ID
```
**请求参数**: 无
**返回数据** (CallRecordResponse):
```json
{
"code": 200,
"msg": "success",
"data": {
"id": "long",
"callId": "string",
"callType": "string",
"callDirection": "string",
"callerId": "integer",
"callerName": "string",
"callerAvatar": "string",
"calleeId": "integer",
"calleeName": "string",
"calleeAvatar": "string",
"status": "string",
"duration": "integer",
"startTime": "long",
"endTime": "long",
"endReason": "string"
}
}
```
---
## 功能说明
### 通话类型
| 类型 | 值 | 说明 |
|------|-----|------|
| 语音通话 | voice | 仅语音通话 |
| 视频通话 | video | 视频+语音通话 |
### 通话状态
| 状态 | 值 | 说明 |
|------|-----|------|
| 呼叫中 | calling | 正在呼叫对方 |
| 振铃中 | ringing | 对方正在振铃 |
| 通话中 | connected | 通话已接通 |
| 已完成 | completed | 通话正常结束 |
| 未接听 | missed | 对方未接听 |
| 已拒绝 | rejected | 对方拒绝接听 |
| 已取消 | cancelled | 主叫方取消 |
| 已结束 | ended | 通话结束 |
### 通话方向
| 方向 | 值 | 说明 |
|------|-----|------|
| 呼出 | outgoing | 我发起的通话 |
| 呼入 | incoming | 对方发起的通话 |
---
## 通话流程
### 发起通话流程
```
1. 用户A点击通话按钮
2. 调用发起通话接口
3. 获取callId和信令服务器地址
4. 连接信令服务器
5. 等待对方响应
6. 对方接听 → 建立P2P连接 → 开始通话
对方拒绝/超时 → 结束流程
```
### 接听通话流程
```
1. 用户B收到来电通知WebSocket推送
2. 显示来电界面
3. 用户点击接听按钮
4. 调用接听通话接口
5. 连接信令服务器
6. 建立P2P连接
7. 开始通话
```
### 结束通话流程
```
1. 用户点击挂断按钮
2. 调用结束通话接口
3. 断开P2P连接
4. 断开信令连接
5. 保存通话记录
6. 返回上一页面
```
---
## WebSocket推送
通话相关的实时通知通过WebSocket推送
### 来电通知
```json
{
"type": "incoming_call",
"callId": "call123",
"callType": "video",
"callerId": 123,
"callerName": "张三",
"callerAvatar": "https://..."
}
```
### 通话状态变化
```json
{
"type": "call_status",
"callId": "call123",
"status": "connected",
"timestamp": 1703001234567
}
```
### 对方挂断
```json
{
"type": "call_ended",
"callId": "call123",
"endReason": "normal",
"duration": 120
}
```
---
## 使用示例
### 1. 发起语音通话
```java
private void initiateVoiceCall(int calleeId) {
CallApiService callApiService = // 获取CallApiService实例
InitiateCallRequest request = new InitiateCallRequest(calleeId, "voice");
Call<CallApiResponse<InitiateCallResponse>> call =
callApiService.initiateCall(request);
call.enqueue(new Callback<CallApiResponse<InitiateCallResponse>>() {
@Override
public void onResponse(Call<CallApiResponse<InitiateCallResponse>> call,
Response<CallApiResponse<InitiateCallResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
CallApiResponse<InitiateCallResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
InitiateCallResponse data = apiResponse.getData();
String callId = data.getCallId();
String signalingUrl = data.getSignalingUrl();
// 跳转到通话界面
Intent intent = new Intent(this, CallActivity.class);
intent.putExtra("callId", callId);
intent.putExtra("callType", "voice");
intent.putExtra("signalingUrl", signalingUrl);
startActivity(intent);
}
}
}
@Override
public void onFailure(Call<CallApiResponse<InitiateCallResponse>> call, Throwable t) {
Toast.makeText(this, "发起通话失败", Toast.LENGTH_SHORT).show();
}
});
}
```
### 2. 接听通话
```java
private void acceptCall(String callId) {
CallApiService callApiService = // 获取CallApiService实例
Call<CallApiResponse<Boolean>> call = callApiService.acceptCall(callId);
call.enqueue(new Callback<CallApiResponse<Boolean>>() {
@Override
public void onResponse(Call<CallApiResponse<Boolean>> call,
Response<CallApiResponse<Boolean>> response) {
if (response.isSuccessful() && response.body() != null) {
CallApiResponse<Boolean> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
// 跳转到通话界面
Intent intent = new Intent(this, CallActivity.class);
intent.putExtra("callId", callId);
startActivity(intent);
finish();
}
}
}
@Override
public void onFailure(Call<CallApiResponse<Boolean>> call, Throwable t) {
Toast.makeText(this, "接听失败", Toast.LENGTH_SHORT).show();
}
});
}
```
### 3. 获取通话记录
```java
private void loadCallHistory(int page) {
CallApiService callApiService = // 获取CallApiService实例
Call<CallApiResponse<CallHistoryResponse>> call =
callApiService.getCallHistory(page, 20);
call.enqueue(new Callback<CallApiResponse<CallHistoryResponse>>() {
@Override
public void onResponse(Call<CallApiResponse<CallHistoryResponse>> call,
Response<CallApiResponse<CallHistoryResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
CallApiResponse<CallHistoryResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
CallHistoryResponse data = apiResponse.getData();
List<CallRecordResponse> records = data.getRecords();
// 更新UI显示通话记录
updateCallHistoryList(records);
}
}
}
@Override
public void onFailure(Call<CallApiResponse<CallHistoryResponse>> call, Throwable t) {
Toast.makeText(this, "加载失败", Toast.LENGTH_SHORT).show();
}
});
}
```
---
## 技术实现
### WebRTC集成
通话功能基于WebRTC技术实现
- 使用信令服务器交换SDP和ICE候选
- 建立P2P连接进行音视频传输
- 支持NAT穿透
### 权限要求
- 语音通话:`RECORD_AUDIO`
- 视频通话:`RECORD_AUDIO` + `CAMERA`
- 网络访问:`INTERNET`
---
## 注意事项
1. 所有接口都需要登录认证
2. 通话前需要检查对方是否在线
3. 需要申请音频和摄像头权限
4. 通话过程中保持屏幕常亮
5. 通话时禁用锁屏
6. 建议使用耳机以获得更好的通话质量
7. 通话记录保存30天
8. 未接来电会显示红点提示
9. 通话过程中网络断开需要自动重连
10. 需要集成WebRTC库实现音视频通话

View File

@ -1,145 +0,0 @@
# 直播IM系统接口文档总览
## 文档说明
本文档集按照功能模块组织,每个模块文档包含:
- 模块概述
- 接口列表
- 每个接口的请求参数和返回参数
**注意**: 本文档仅包含接口定义,不包含代码实现。
---
## 模块列表
### 已完成模块 (18个)
| 序号 | 模块名称 | 接口数量 | 文档文件 | 状态 |
|------|---------|---------|---------|------|
| 1 | 用户系统模块 | 7 | [01-用户系统模块.md](./01-用户系统模块.md) | ✅ 已完成 |
| 2 | 直播间管理模块 | 10 | [02-直播间管理模块.md](./02-直播间管理模块.md) | ✅ 已完成 |
| 3 | 直播间弹幕模块 | 2 | [03-直播间弹幕模块.md](./03-直播间弹幕模块.md) | ✅ 已完成 |
| 4 | WebSocket通信模块 | 2 | [04-WebSocket通信模块.md](./04-WebSocket通信模块.md) | ✅ 已完成 |
| 5 | 好友管理模块 | 9 | [05-好友管理模块.md](./05-好友管理模块.md) | ✅ 已完成 |
| 6 | 关注功能模块 | 7 | [06-关注功能模块.md](./06-关注功能模块.md) | ✅ 已完成 |
| 7 | 作品管理模块 | 15 | [07-作品管理模块.md](./07-作品管理模块.md) | ✅ 已完成 |
| 8 | 搜索功能模块 | 9 | [08-搜索功能模块.md](./08-搜索功能模块.md) | ✅ 已完成 |
| 9 | 支付集成模块 | 4 | [09-支付集成模块.md](./09-支付集成模块.md) | ✅ 已完成 |
| 10 | 分类管理模块 | 7 | [10-分类管理模块.md](./10-分类管理模块.md) | ✅ 已完成 |
| 11 | 消息表情回应模块 | 4 | [11-消息表情回应模块.md](./11-消息表情回应模块.md) | ✅ 已完成 |
| 12 | 私聊会话模块 | 8 | [12-私聊会话模块.md](./12-私聊会话模块.md) | ✅ 已完成 |
| 13 | 文件上传模块 | 2 | [13-文件上传模块.md](./13-文件上传模块.md) | ✅ 已完成 |
| 14 | 在线状态模块 | 5 | [14-在线状态模块.md](./14-在线状态模块.md) | ✅ 已完成 |
| 15 | 离线消息模块 | 3 | [15-离线消息模块.md](./15-离线消息模块.md) | ✅ 已完成 |
| 16 | 观看历史模块 | 1 | [16-观看历史模块.md](./16-观看历史模块.md) | ✅ 已完成 |
| 17 | 礼物打赏模块 | 5 | [17-礼物打赏模块.md](./17-礼物打赏模块.md) | ✅ 已完成 |
| 18 | 通话功能模块 | 10 | [18-通话功能模块.md](./18-通话功能模块.md) | ✅ 已完成 |
**总计**: 109个接口
---
## 快速导航
### 基础功能
- [用户系统模块](./01-用户系统模块.md) - 登录、注册、用户信息管理
- [分类管理模块](./10-分类管理模块.md) - 直播间和作品分类
### 直播功能
- [直播间管理模块](./02-直播间管理模块.md) - 直播间创建、控制、查询
- [直播间弹幕模块](./03-直播间弹幕模块.md) - 弹幕发送和历史记录
- [WebSocket通信模块](./04-WebSocket通信模块.md) - 实时弹幕和在线人数
### 社交功能
- [好友管理模块](./05-好友管理模块.md) - 好友添加、删除、拉黑
- [关注功能模块](./06-关注功能模块.md) - 用户关注和粉丝管理
- [私聊会话模块](./12-私聊会话模块.md) - 一对一聊天、消息发送
- [消息表情回应模块](./11-消息表情回应模块.md) - 消息表情回应
- [通话功能模块](./18-通话功能模块.md) - 语音/视频通话
### 内容功能
- [作品管理模块](./07-作品管理模块.md) - 作品发布、编辑、点赞、收藏
- [搜索功能模块](./08-搜索功能模块.md) - 用户、直播间、作品搜索
- [文件上传模块](./13-文件上传模块.md) - 图片和视频上传
### 支付功能
- [支付集成模块](./09-支付集成模块.md) - 金币充值和支付
- [礼物打赏模块](./17-礼物打赏模块.md) - 礼物赠送和余额管理
### 状态管理
- [在线状态模块](./14-在线状态模块.md) - 用户在线状态查询
- [离线消息模块](./15-离线消息模块.md) - 离线消息管理
- [观看历史模块](./16-观看历史模块.md) - 观看历史记录
---
## 接口规范
### 通用请求头
需要登录的接口需要携带以下请求头:
```
Authorization: Bearer {token}
```
### 通用响应格式
所有接口返回统一的响应格式:
```json
{
"code": 200,
"msg": "success",
"data": {}
}
```
**code说明**:
- 200: 成功
- 401: 未登录
- 403: 无权限
- 404: 资源不存在
- 500: 服务器错误
### 分页参数
支持分页的接口使用以下参数:
```
page 或 pageNum: 页码 (默认1)
pageSize: 每页数量 (默认20)
```
分页响应格式:
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [],
"total": 总数,
"page": 当前页,
"pageSize": 每页数量
}
}
```
---
## 更新日志
### 2024-12-30
- 补充7个新模块文档
- 新增私聊会话、文件上传、在线状态、离线消息、观看历史、礼物打赏、通话功能模块
- 更新模块总数为18个接口总数为109个
- 完善快速导航分类
### 2024-12-30
- 创建模块化接口文档
- 整理11个功能模块共76个接口
- 删除旧的对接文档,统一使用模块文档
---
## 联系方式
如有问题请在项目Issue中提出。

File diff suppressed because it is too large Load Diff

View File

@ -1,915 +0,0 @@
# 缘池管理端设计文档
> 版本V1.0
> 更新日期2025-12-30
> 功能范围:板块管理 + 消息管理 + 自动审核
---
## 一、功能概述
缘池是直播平台的社交社区模块,用户可在不同板块发布消息进行交流。管理端提供板块配置、消息审核、自动审核规则设置等功能。
### 1.1 功能结构
```
缘池管理 (/community)
├── 板块管理 - 配置社区板块分类
├── 消息管理 - 查看/审核/管理用户消息
└── 审核配置 - 自动审核规则设置
```
### 1.2 自动审核机制
```
用户发布消息 → 敏感词检测 → 自动判定
┌──────────┼──────────┐
↓ ↓ ↓
无敏感词 轻度敏感 重度敏感
↓ ↓ ↓
自动通过 待人工审核 自动拒绝
```
---
## 二、前端设计
### 2.1 路由配置
文件:`Zhibo/admin/src/router/modules/communityManage.js`
```javascript
import Layout from '@/layout';
const communityManageRouter = {
path: '/community',
component: Layout,
redirect: '/community/category',
name: 'Community',
alwaysShow: true,
meta: {
title: '缘池管理',
icon: 'el-icon-s-opportunity',
},
children: [
{
path: 'category',
component: () => import('@/views/community/category/index'),
name: 'CommunityCategory',
meta: { title: '板块管理', icon: '' },
},
{
path: 'message',
component: () => import('@/views/community/message/index'),
name: 'CommunityMessage',
meta: { title: '消息管理', icon: '' },
},
{
path: 'audit-config',
component: () => import('@/views/community/auditConfig/index'),
name: 'CommunityAuditConfig',
meta: { title: '审核配置', icon: '' },
},
],
};
export default communityManageRouter;
```
### 2.2 API接口
文件:`Zhibo/admin/src/api/community.js`
```javascript
import request from '@/utils/request';
// ==================== 板块管理 ====================
// 获取板块列表
export function categoryList(params) {
return request({
url: '/admin/community/category/list',
method: 'get',
params,
});
}
// 保存板块(新增/编辑)
export function categorySave(data) {
return request({
url: '/admin/community/category/save',
method: 'post',
data,
});
}
// 删除板块
export function categoryDelete(id) {
return request({
url: `/admin/community/category/delete/${id}`,
method: 'delete',
});
}
// 更新板块状态
export function categoryStatus(data) {
return request({
url: '/admin/community/category/status',
method: 'post',
data,
});
}
// ==================== 消息管理 ====================
// 获取消息列表(分页)
export function messageList(data) {
return request({
url: '/admin/community/message/list',
method: 'post',
data,
});
}
// 审核消息
export function messageAudit(data) {
return request({
url: '/admin/community/message/audit',
method: 'post',
data,
});
}
// 删除消息
export function messageDelete(id) {
return request({
url: `/admin/community/message/delete/${id}`,
method: 'delete',
});
}
// ==================== 审核配置 ====================
// 获取审核配置
export function getAuditConfig() {
return request({
url: '/admin/community/audit/config',
method: 'get',
});
}
// 保存审核配置
export function saveAuditConfig(data) {
return request({
url: '/admin/community/audit/config/save',
method: 'post',
data,
});
}
```
### 2.3 页面设计
#### 2.3.1 板块管理页面
文件:`Zhibo/admin/src/views/community/category/index.vue`
```
┌─────────────────────────────────────────────────────────────┐
│ [+ 新增板块] │
├─────────────────────────────────────────────────────────────┤
│ 图标 │ 名称 │ 排序 │ 状态 │ 创建时间 │ 操作 │
├──────┼────────┼──────┼────────┼────────────┼───────────────┤
│ 🎮 │ 游戏 │ 100 │ ●启用 │ 2025-01-01 │ [编辑][删除] │
│ 🎵 │ 音乐 │ 90 │ ●启用 │ 2025-01-01 │ [编辑][删除] │
│ 💬 │ 交友 │ 80 │ ○禁用 │ 2025-01-01 │ [编辑][删除] │
└─────────────────────────────────────────────────────────────┘
```
**功能说明:**
- 新增板块:弹窗表单,填写名称、图标、排序
- 编辑板块:弹窗表单,修改板块信息
- 删除板块:确认弹窗后删除
- 状态切换:开关组件,启用/禁用板块
#### 2.3.2 消息管理页面
文件:`Zhibo/admin/src/views/community/message/index.vue`
```
┌─────────────────────────────────────────────────────────────────────┐
│ 板块[全部▼] 状态[全部▼] 审核方式[全部▼] 时间[起始-结束] [搜索] │
├─────────────────────────────────────────────────────────────────────┤
│ 用户 │ 板块 │ 内容 │ 图片 │ 状态 │ 审核方式│ 操作 │
├──────────┼──────┼──────────────┼──────┼────────┼─────────┼─────────┤
│ 👤张三 │ 游戏 │ 今天开黑吗.. │ 🖼x2 │ 已通过 │ 自动 │ [删除] │
│ 👤李四 │ 交友 │ 有人一起.. │ 🖼x1 │ 待审核 │ - │ [✓][✗] │
│ 👤王五 │ 音乐 │ 推荐一首.. │ - │ 已拒绝 │ 自动 │ [删除] │
└─────────────────────────────────────────────────────────────────────┘
```
**筛选条件:**
- 板块:下拉选择板块
- 状态:全部/待审核/已通过/已拒绝
- 审核方式:全部/自动/人工
- 时间范围:日期选择器
**操作说明:**
- 待审核消息:显示[通过][拒绝]按钮
- 已审核消息:显示[删除]按钮
- 点击内容可展开查看完整内容和图片
#### 2.3.3 审核配置页面
文件:`Zhibo/admin/src/views/community/auditConfig/index.vue`
```
┌─────────────────────────────────────────────────────────────┐
│ 自动审核配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 开启自动审核 [========●] │
│ 说明:开启后系统自动检测敏感词并审核 │
│ │
│ 无敏感词自动通过 [========●] │
│ 说明:消息不含敏感词时自动通过审核 │
│ │
│ 重度敏感词自动拒绝 [========●] │
│ 说明:消息含违禁词时自动拒绝 │
│ │
│ [保存配置] │
└─────────────────────────────────────────────────────────────┘
```
---
## 三、数据库设计
### 3.1 板块表 (eb_community_category)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 板块ID主键自增 |
| name | varchar(50) | 板块名称 |
| icon | varchar(255) | 板块图标URL |
| sort | int | 排序(越大越靠前) |
| status | tinyint | 状态 0禁用 1启用 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
### 3.2 消息表 (eb_community_message)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 消息ID主键自增 |
| uid | int | 用户ID |
| category_id | int | 板块ID |
| content | text | 消息内容 |
| images | varchar(1000) | 图片URL(逗号分隔) |
| status | tinyint | 状态 0待审核 1通过 2拒绝 |
| audit_type | tinyint | 审核方式 0自动 1人工 |
| audit_remark | varchar(255) | 审核备注 |
| is_delete | tinyint | 是否删除 0否 1是 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
### 3.3 审核配置表 (eb_community_audit_config)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 配置ID固定为1 |
| auto_audit | tinyint | 开启自动审核 0关闭 1开启 |
| auto_pass | tinyint | 无敏感词自动通过 0否 1是 |
| auto_reject | tinyint | 重度敏感词自动拒绝 0否 1是 |
| update_time | datetime | 更新时间 |
### 3.4 建表SQL
```sql
-- ============================================
-- 缘池管理数据库表
-- ============================================
-- 1. 板块表
CREATE TABLE `eb_community_category` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '板块ID',
`name` varchar(50) NOT NULL COMMENT '板块名称',
`icon` varchar(255) DEFAULT '' COMMENT '板块图标URL',
`sort` int DEFAULT 0 COMMENT '排序(越大越靠前)',
`status` tinyint 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='缘池板块表';
-- 2. 消息表
CREATE TABLE `eb_community_message` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '消息ID',
`uid` int NOT NULL COMMENT '用户ID',
`category_id` int NOT NULL COMMENT '板块ID',
`content` text COMMENT '消息内容',
`images` varchar(1000) DEFAULT '' COMMENT '图片URL(逗号分隔)',
`status` tinyint DEFAULT 1 COMMENT '状态 0待审核 1通过 2拒绝',
`audit_type` tinyint DEFAULT 0 COMMENT '审核方式 0自动 1人工',
`audit_remark` varchar(255) DEFAULT '' COMMENT '审核备注(敏感词等)',
`is_delete` tinyint DEFAULT 0 COMMENT '是否删除 0否 1是',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_uid` (`uid`),
KEY `idx_category` (`category_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缘池消息表';
-- 3. 审核配置表
CREATE TABLE `eb_community_audit_config` (
`id` int NOT NULL AUTO_INCREMENT,
`auto_audit` tinyint DEFAULT 1 COMMENT '开启自动审核 0关闭 1开启',
`auto_pass` tinyint DEFAULT 1 COMMENT '无敏感词自动通过 0否 1是',
`auto_reject` tinyint DEFAULT 1 COMMENT '重度敏感词自动拒绝 0否 1是',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缘池审核配置表';
-- 初始化审核配置
INSERT INTO `eb_community_audit_config` (`id`, `auto_audit`, `auto_pass`, `auto_reject`)
VALUES (1, 1, 1, 1);
-- 初始化默认板块
INSERT INTO `eb_community_category` (`name`, `icon`, `sort`, `status`) VALUES
('交友', 'el-icon-user', 100, 1),
('游戏', 'el-icon-video-play', 90, 1),
('音乐', 'el-icon-headset', 80, 1),
('运动', 'el-icon-football', 70, 1),
('美食', 'el-icon-food', 60, 1);
```
---
## 四、后端设计
### 4.1 实体类
#### CommunityCategory.java
文件:`crmeb-common/src/main/java/com/zbkj/common/model/community/CommunityCategory.java`
```java
package com.zbkj.common.model.community;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("eb_community_category")
public class CommunityCategory {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String icon;
private Integer sort;
private Integer status;
private Date createTime;
private Date updateTime;
}
```
#### CommunityMessage.java
文件:`crmeb-common/src/main/java/com/zbkj/common/model/community/CommunityMessage.java`
```java
package com.zbkj.common.model.community;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("eb_community_message")
public class CommunityMessage {
@TableId(type = IdType.AUTO)
private Long id;
private Integer uid;
private Integer categoryId;
private String content;
private String images;
private Integer status; // 0待审核 1通过 2拒绝
private Integer auditType; // 0自动 1人工
private String auditRemark;
private Integer isDelete;
private Date createTime;
private Date updateTime;
}
```
#### CommunityAuditConfig.java
文件:`crmeb-common/src/main/java/com/zbkj/common/model/community/CommunityAuditConfig.java`
```java
package com.zbkj.common.model.community;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("eb_community_audit_config")
public class CommunityAuditConfig {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer autoAudit; // 开启自动审核
private Integer autoPass; // 无敏感词自动通过
private Integer autoReject; // 重度敏感词自动拒绝
private Date updateTime;
}
```
### 4.2 Controller
文件:`crmeb-admin/src/main/java/com/zbkj/admin/controller/CommunityAdminController.java`
```java
package com.zbkj.admin.controller;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.community.*;
import com.zbkj.common.request.CommunityMessageRequest;
import com.zbkj.common.request.CommunityAuditRequest;
import com.zbkj.common.response.CommunityMessageVO;
import com.zbkj.common.result.CommonResult;
import com.zbkj.service.service.CommunityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/admin/community")
@Api(tags = "缘池管理")
public class CommunityAdminController {
@Autowired
private CommunityService communityService;
// ==================== 板块管理 ====================
@ApiOperation("板块列表")
@GetMapping("/category/list")
public CommonResult<List<CommunityCategory>> categoryList() {
return CommonResult.success(communityService.getCategoryList());
}
@ApiOperation("保存板块")
@PostMapping("/category/save")
public CommonResult<String> categorySave(@RequestBody CommunityCategory category) {
communityService.saveCategory(category);
return CommonResult.success("保存成功");
}
@ApiOperation("删除板块")
@DeleteMapping("/category/delete/{id}")
public CommonResult<String> categoryDelete(@PathVariable Integer id) {
communityService.deleteCategory(id);
return CommonResult.success("删除成功");
}
@ApiOperation("更新板块状态")
@PostMapping("/category/status")
public CommonResult<String> categoryStatus(@RequestBody CommunityCategory category) {
communityService.updateCategoryStatus(category.getId(), category.getStatus());
return CommonResult.success("更新成功");
}
// ==================== 消息管理 ====================
@ApiOperation("消息列表")
@PostMapping("/message/list")
public CommonResult<PageInfo<CommunityMessageVO>> messageList(
@RequestBody CommunityMessageRequest request) {
return CommonResult.success(communityService.getMessageList(request));
}
@ApiOperation("审核消息")
@PostMapping("/message/audit")
public CommonResult<String> messageAudit(@RequestBody CommunityAuditRequest request) {
communityService.auditMessage(request.getId(), request.getStatus(), request.getRemark());
return CommonResult.success("审核成功");
}
@ApiOperation("删除消息")
@DeleteMapping("/message/delete/{id}")
public CommonResult<String> messageDelete(@PathVariable Long id) {
communityService.deleteMessage(id);
return CommonResult.success("删除成功");
}
// ==================== 审核配置 ====================
@ApiOperation("获取审核配置")
@GetMapping("/audit/config")
public CommonResult<CommunityAuditConfig> getAuditConfig() {
return CommonResult.success(communityService.getAuditConfig());
}
@ApiOperation("保存审核配置")
@PostMapping("/audit/config/save")
public CommonResult<String> saveAuditConfig(@RequestBody CommunityAuditConfig config) {
communityService.saveAuditConfig(config);
return CommonResult.success("保存成功");
}
}
```
### 4.3 Service
文件:`crmeb-service/src/main/java/com/zbkj/service/service/CommunityService.java`
```java
package com.zbkj.service.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.community.*;
import com.zbkj.common.request.CommunityMessageRequest;
import com.zbkj.common.response.CommunityMessageVO;
import com.zbkj.service.dao.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CommunityService {
@Autowired
private CommunityCategoryDao categoryDao;
@Autowired
private CommunityMessageDao messageDao;
@Autowired
private CommunityAuditConfigDao auditConfigDao;
@Autowired
private SensitiveWordService sensitiveWordService;
// ==================== 板块管理 ====================
public List<CommunityCategory> getCategoryList() {
return categoryDao.selectList(new QueryWrapper<CommunityCategory>()
.orderByDesc("sort"));
}
public void saveCategory(CommunityCategory category) {
if (category.getId() != null) {
categoryDao.updateById(category);
} else {
categoryDao.insert(category);
}
}
public void deleteCategory(Integer id) {
categoryDao.deleteById(id);
}
public void updateCategoryStatus(Integer id, Integer status) {
CommunityCategory category = new CommunityCategory();
category.setId(id);
category.setStatus(status);
categoryDao.updateById(category);
}
// ==================== 消息管理 ====================
public PageInfo<CommunityMessageVO> getMessageList(CommunityMessageRequest request) {
PageHelper.startPage(request.getPage(), request.getLimit());
List<CommunityMessageVO> list = messageDao.selectMessageList(request);
return new PageInfo<>(list);
}
public void auditMessage(Long id, Integer status, String remark) {
CommunityMessage message = new CommunityMessage();
message.setId(id);
message.setStatus(status);
message.setAuditType(1); // 人工审核
message.setAuditRemark(remark != null ? remark : (status == 1 ? "人工审核通过" : "人工审核拒绝"));
messageDao.updateById(message);
}
public void deleteMessage(Long id) {
CommunityMessage message = new CommunityMessage();
message.setId(id);
message.setIsDelete(1);
messageDao.updateById(message);
}
// ==================== 自动审核(移动端发布时调用) ====================
public void autoAuditMessage(CommunityMessage message) {
CommunityAuditConfig config = getAuditConfig();
// 未开启自动审核,待人工审核
if (config.getAutoAudit() != 1) {
message.setStatus(0);
return;
}
// 敏感词检测
String content = message.getContent();
List<String> sensitiveWords = sensitiveWordService.findAll(content);
if (sensitiveWords.isEmpty()) {
// 无敏感词
if (config.getAutoPass() == 1) {
message.setStatus(1);
message.setAuditRemark("自动审核通过");
} else {
message.setStatus(0);
}
message.setAuditType(0);
} else if (sensitiveWordService.hasSevereWord(sensitiveWords)) {
// 重度敏感词
if (config.getAutoReject() == 1) {
message.setStatus(2);
message.setAuditRemark("含违禁词自动拒绝");
} else {
message.setStatus(0);
message.setAuditRemark("含敏感词:" + String.join(",", sensitiveWords));
}
message.setAuditType(0);
} else {
// 轻度敏感词,待人工审核
message.setStatus(0);
message.setAuditRemark("含敏感词:" + String.join(",", sensitiveWords));
message.setAuditType(0);
}
}
// ==================== 审核配置 ====================
public CommunityAuditConfig getAuditConfig() {
return auditConfigDao.selectById(1);
}
public void saveAuditConfig(CommunityAuditConfig config) {
config.setId(1);
auditConfigDao.updateById(config);
}
}
```
### 4.4 DAO层
#### CommunityCategoryDao.java
文件:`crmeb-service/src/main/java/com/zbkj/service/dao/CommunityCategoryDao.java`
```java
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.community.CommunityCategory;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CommunityCategoryDao extends BaseMapper<CommunityCategory> {
}
```
#### CommunityMessageDao.java
文件:`crmeb-service/src/main/java/com/zbkj/service/dao/CommunityMessageDao.java`
```java
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.community.CommunityMessage;
import com.zbkj.common.request.CommunityMessageRequest;
import com.zbkj.common.response.CommunityMessageVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface CommunityMessageDao extends BaseMapper<CommunityMessage> {
List<CommunityMessageVO> selectMessageList(@Param("req") CommunityMessageRequest request);
}
```
#### CommunityAuditConfigDao.java
文件:`crmeb-service/src/main/java/com/zbkj/service/dao/CommunityAuditConfigDao.java`
```java
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.community.CommunityAuditConfig;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CommunityAuditConfigDao extends BaseMapper<CommunityAuditConfig> {
}
```
### 4.5 Mapper XML
文件:`crmeb-service/src/main/resources/mapper/community/CommunityMessageMapper.xml`
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zbkj.service.dao.CommunityMessageDao">
<select id="selectMessageList" resultType="com.zbkj.common.response.CommunityMessageVO">
SELECT
m.id, m.uid, m.category_id, m.content, m.images,
m.status, m.audit_type, m.audit_remark, m.create_time,
u.nickname, u.avatar,
c.name as category_name
FROM eb_community_message m
LEFT JOIN eb_user u ON m.uid = u.uid
LEFT JOIN eb_community_category c ON m.category_id = c.id
WHERE m.is_delete = 0
<if test="req.categoryId != null">
AND m.category_id = #{req.categoryId}
</if>
<if test="req.status != null">
AND m.status = #{req.status}
</if>
<if test="req.auditType != null">
AND m.audit_type = #{req.auditType}
</if>
<if test="req.startTime != null and req.endTime != null">
AND m.create_time BETWEEN #{req.startTime} AND #{req.endTime}
</if>
ORDER BY m.create_time DESC
</select>
</mapper>
```
### 4.6 Request/Response类
#### CommunityMessageRequest.java
文件:`crmeb-common/src/main/java/com/zbkj/common/request/CommunityMessageRequest.java`
```java
package com.zbkj.common.request;
import lombok.Data;
@Data
public class CommunityMessageRequest {
private Integer page = 1;
private Integer limit = 20;
private Integer categoryId; // 板块ID
private Integer status; // 状态
private Integer auditType; // 审核方式
private String startTime; // 开始时间
private String endTime; // 结束时间
}
```
#### CommunityAuditRequest.java
文件:`crmeb-common/src/main/java/com/zbkj/common/request/CommunityAuditRequest.java`
```java
package com.zbkj.common.request;
import lombok.Data;
@Data
public class CommunityAuditRequest {
private Long id; // 消息ID
private Integer status; // 审核状态 1通过 2拒绝
private String remark; // 审核备注
}
```
#### CommunityMessageVO.java
文件:`crmeb-common/src/main/java/com/zbkj/common/response/CommunityMessageVO.java`
```java
package com.zbkj.common.response;
import lombok.Data;
import java.util.Date;
@Data
public class CommunityMessageVO {
private Long id;
private Integer uid;
private Integer categoryId;
private String content;
private String images;
private Integer status;
private Integer auditType;
private String auditRemark;
private Date createTime;
// 关联字段
private String nickname; // 用户昵称
private String avatar; // 用户头像
private String categoryName; // 板块名称
}
```
---
## 五、文件清单
### 5.1 前端文件
```
Zhibo/admin/src/
├── api/
│ └── community.js # API接口
├── router/modules/
│ └── communityManage.js # 路由配置
└── views/community/
├── category/
│ └── index.vue # 板块管理页面
├── message/
│ └── index.vue # 消息管理页面
└── auditConfig/
└── index.vue # 审核配置页面
```
### 5.2 后端文件
```
Zhibo/zhibo-h/
├── crmeb-admin/src/main/java/com/zbkj/admin/controller/
│ └── CommunityAdminController.java # 控制器
├── crmeb-service/src/main/java/com/zbkj/service/
│ ├── service/
│ │ └── CommunityService.java # 服务层
│ └── dao/
│ ├── CommunityCategoryDao.java # 板块DAO
│ ├── CommunityMessageDao.java # 消息DAO
│ └── CommunityAuditConfigDao.java # 配置DAO
├── crmeb-service/src/main/resources/mapper/community/
│ └── CommunityMessageMapper.xml # Mapper XML
└── crmeb-common/src/main/java/com/zbkj/common/
├── model/community/
│ ├── CommunityCategory.java # 板块实体
│ ├── CommunityMessage.java # 消息实体
│ └── CommunityAuditConfig.java # 配置实体
├── request/
│ ├── CommunityMessageRequest.java # 消息查询请求
│ └── CommunityAuditRequest.java # 审核请求
└── response/
└── CommunityMessageVO.java # 消息响应VO
```
### 5.3 数据库
```
eb_community_category # 板块表
eb_community_message # 消息表
eb_community_audit_config # 审核配置表
```
---
## 六、菜单配置SQL
```sql
-- 添加缘池管理菜单
INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`) VALUES
(0, '缘池管理', 'el-icon-s-opportunity', '', '/community', 'M', 140, 1);
SET @community_id = LAST_INSERT_ID();
INSERT INTO `eb_system_menu` (`pid`, `name`, `icon`, `perms`, `component`, `menu_type`, `sort`, `is_show`) VALUES
(@community_id, '板块管理', '', 'admin:community:category', '/community/category', 'C', 3, 1),
(@community_id, '消息管理', '', 'admin:community:message', '/community/message', 'C', 2, 1),
(@community_id, '审核配置', '', 'admin:community:audit', '/community/audit-config', 'C', 1, 1);
```
---
## 七、开发顺序
1. **数据库** - 执行建表SQL
2. **后端实体类** - 创建Model类
3. **后端DAO** - 创建DAO接口和Mapper
4. **后端Service** - 实现业务逻辑
5. **后端Controller** - 实现API接口
6. **前端API** - 创建接口文件
7. **前端路由** - 配置路由
8. **前端页面** - 实现三个管理页面
9. **菜单配置** - 执行菜单SQL