11 KiB
11 KiB
title, date, categories, tags
| title | date | categories | tags | |||
|---|---|---|---|---|---|---|
| DeviceTransfer | 2025-04-07 |
|
|
请为我生成一个基于 Spring Boot 的后端项目,项目名称为 "DeviceTransfer",实现设备间消息和文件传输功能,使用 Redis、RabbitMQ 和 MySQL 作为辅助技术。以下是具体要求:
1. **项目结构**:
- 包名:`com.example.devicetransfer`
- 结构:
- `Application.java`:Spring Boot 启动类
- `config/`:
- `WebSocketConfig.java`:配置 WebSocket,支持 STOMP 协议
- `RabbitMQConfig.java`:配置 RabbitMQ 交换机和队列
- `RedisConfig.java`:配置 Redis 客户端
- `MyBatisConfig.java`:配置 MyBatis 数据访问层
- `controller/`:
- `FileController.java`:处理 HTTP 文件上传、下载及传输控制
- `websocket/`:
- `NotificationController.java`:处理 WebSocket 实时通知
- `service/`:
- `DeviceService.java`:管理设备状态
- `FileService.java`:处理文件传输逻辑(包括分片、断点续传、暂停)
- `MessageService.java`:处理消息发送和通知
- `mq/`:
- `producer/FileMessageProducer.java`:发送消息到 RabbitMQ
- `consumer/FileMessageConsumer.java`:消费 RabbitMQ 消息
- `repository/`:
- `DeviceRepository.java`:使用 Redis 存储设备状态
- `mapper/FileMetadataMapper.java`:使用 MyBatis 操作 MySQL 文件元数据
- `model/`:
- `Device.java`:设备实体类
- `FileMetadata.java`:文件元数据类(映射到 MySQL)
- `util/`:
- `FileChunkUtil.java`:大文件分片和断点续传工具类
- `resources/`:
- `application.yml`:配置文件
- `mapper/FileMetadataMapper.xml`:MyBatis SQL 映射文件
2. **功能需求**:
- **文件传输**:
- HTTP POST `/upload`:支持大文件分片上传,保存到 `uploads/` 目录,返回文件 ID。
- 参数:`file`(分片内容)、`fileId`(文件唯一标识)、`chunkIndex`(分片索引)、`totalChunks`(总分片数)。
- 支持断点续传:记录已上传分片,客户端可续传未完成部分。
- 支持中途暂停/取消:HTTP DELETE `/upload/cancel/{fileId}` 取消上传并清理分片。
- HTTP GET `/download/{fileId}`:根据文件 ID 下载,支持分片下载和断点续传。
- 参数:`Range` 头支持范围请求(如 `Range: bytes=0-1048575`)。
- 支持暂停:客户端可随时中断请求。
- **实时通知**:
- WebSocket 端点 `/ws`,订阅 `/topic/messages`,发送消息到 `/app/send`。
- 在线设备通过 WebSocket 接收通知,离线设备消息存入 RabbitMQ。
- **设备管理**:
- 设备通过 WebSocket 注册(发送 userId 和 deviceId)。
- Redis 存储用户设备状态(键格式:`user:{userId}:devices`)。
- **离线支持**:
- 文件上传后,若目标设备离线,消息发送到 RabbitMQ 的 `file-queue`。
- 设备上线时,消费队列消息并通过 WebSocket 推送。
- **数据持久化**:
- 使用 MySQL 存储文件元数据,表名 `file_metadata`,字段:
- `id` (主键)、`file_id` (唯一标识)、`file_name`、`file_path`、`user_id`、`total_chunks`、`uploaded_chunks`、`status` (上传状态:uploading/completed/canceled)、`upload_time`。
- MyBatis 操作数据库,定义增删改查 SQL。
3. **技术要求**:
- 使用 Spring Boot 2.x 或 3.x。
- Redis 用于存储设备状态(键格式:`user:{userId}:devices`)和分片进度(键格式:`file:{fileId}:chunks`)。
- RabbitMQ 使用 Direct 交换机(`file-exchange`)、队列(`file-queue`)、路由键(`file.routing.key`)。
- MySQL 通过 MyBatis 持久化文件元数据。
- 文件存储在本地 `uploads/` 目录,分片文件命名格式:`{fileId}_{chunkIndex}`,完成后合并为 `{fileId}`。
- 不配置 TLS(HTTP 和 WebSocket 使用非加密协议)。
4. **依赖**:
- `spring-boot-starter-web`
- `spring-boot-starter-websocket`
- `spring-boot-starter-data-redis`
- `spring-boot-starter-amqp`
- `mybatis-spring-boot-starter`
- `mysql-connector-java`
5. **其他说明**:
- 提供基本的错误处理和日志记录(使用 SLF4J)。
- 代码注释清晰,说明每个类的作用。
- 生成完整的 Maven `pom.xml` 文件。
- **大文件分片和断点续传**:
- 客户端上传分片,服务端记录进度到 Redis(`file:{fileId}:chunks` 存储已上传分片索引)。
- 续传时,客户端查询已上传分片(GET `/upload/status/{fileId}`),跳过已完成部分。
- 暂停/取消:DELETE `/upload/cancel/{fileId}` 删除分片并更新状态为 canceled。
- **下载支持**:
- 服务端响应 `Range` 头,返回指定范围的分片。
- 客户端可暂停下载,续传时通过 `Range` 请求剩余部分。
请根据以上要求生成完整的项目代码,确保结构清晰、可运行,并支持未来扩展(如引入 Netty 或替换 RabbitMQ 为 Kafka)。
请为我生成一个基于 Spring Boot 的后端项目,项目名称为 "DeviceTransfer",实现设备间消息和文件传输功能,使用 Redis、RabbitMQ 和 MySQL 作为辅助技术。以下是具体要求:
- 项目结构:
- 包名:
com.qgs.devicetransfer - 结构:
Application.java:Spring Boot 启动类config/:WebSocketConfig.java:配置 WebSocket,支持 STOMP 协议RabbitMQConfig.java:配置 RabbitMQ 交换机和队列RedisConfig.java:配置 Redis 客户端
controller/:FileController.java:处理 HTTP 文件上传、下载及传输控制
websocket/:NotificationController.java:处理 WebSocket 实时通知
service/:DeviceService.java:管理设备状态FileService.java:处理文件传输逻辑(包括分片、断点续传、暂停)MessageService.java:处理消息发送和通知
mq/:producer/FileMessageProducer.java:发送消息到 RabbitMQconsumer/FileMessageConsumer.java:消费 RabbitMQ 消息
repository/:DeviceRepository.java:使用 Redis 存储设备状态mapper/FileMetadataMapper.java:使用 MyBatis 操作 MySQL 文件元数据
model/:Device.java:设备实体类FileMetadata.java:文件元数据类(映射到 MySQL)
util/:FileChunkUtil.java:大文件分片和断点续传工具类
resources/:application.yml:配置文件mapper/FileMetadataMapper.xml:MyBatis SQL 映射文件
- 包名:
- 功能需求:
- 文件传输:
- HTTP POST
/upload:支持大文件分片上传,保存到uploads/目录,返回文件 ID。- 参数:
file(分片内容)、fileId(文件唯一标识)、chunkIndex(分片索引)、totalChunks(总分片数)。 - 支持断点续传:记录已上传分片,客户端可续传未完成部分。
- 支持中途暂停/取消:HTTP DELETE
/upload/cancel/{fileId}取消上传并清理分片。
- 参数:
- HTTP GET
/download/{fileId}:根据文件 ID 下载,支持分片下载和断点续传。- 参数:
Range头支持范围请求(如Range: bytes=0-1048575)。 - 支持暂停:客户端可随时中断请求。
- 参数:
- HTTP POST
- 实时通知:
- WebSocket 端点
/ws,订阅/topic/messages,发送消息到/app/send。 - 在线设备通过 WebSocket 接收通知,离线设备消息存入 RabbitMQ。
- WebSocket 端点
- 设备管理:
- 设备通过 WebSocket 注册(发送 userId 和 deviceId)。
- Redis 存储用户设备状态(键格式:
user:{userId}:devices)。
- 离线支持:
- 文件上传后,若目标设备离线,消息发送到 RabbitMQ 的
file-queue。 - 设备上线时,消费队列消息并通过 WebSocket 推送。
- 文件上传后,若目标设备离线,消息发送到 RabbitMQ 的
- 数据持久化:
- 使用 MySQL 存储文件元数据,表名
file_metadata,字段:id(主键)、file_id(唯一标识)、file_name、file_path、user_id、total_chunks、uploaded_chunks、status(上传状态:uploading/completed/canceled)、upload_time。
- MyBatis 操作数据库,定义增删改查 SQL。
- 使用 MySQL 存储文件元数据,表名
- 文件传输:
- 技术要求:
- 使用 Spring Boot 3.4.4
- Redis 用于存储设备状态(键格式:
user:{userId}:devices)和分片进度(键格式:file:{fileId}:chunks)。 - RabbitMQ 使用 Direct 交换机(
file-exchange)、队列(file-queue)、路由键(file.routing.key)。 - MySQL 通过 MyBatis 持久化文件元数据。
- 文件存储在本地
uploads/目录,分片文件命名格式:{fileId}_{chunkIndex},完成后合并为{fileId}。 - 不配置 TLS(HTTP 和 WebSocket 使用非加密协议)。
- 其他说明:
- 提供基本的错误处理和日志记录(使用 SLF4J)。
- 代码注释清晰,说明每个类的作用。
- 大文件分片和断点续传:
- 客户端上传分片,服务端记录进度到 Redis(
file:{fileId}:chunks存储已上传分片索引)。 - 续传时,客户端查询已上传分片(GET
/upload/status/{fileId}),跳过已完成部分。 - 暂停/取消:DELETE
/upload/cancel/{fileId}删除分片并更新状态为 canceled。
- 客户端上传分片,服务端记录进度到 Redis(
- 下载支持:
- 服务端响应
Range头,返回指定范围的分片。 - 客户端可暂停下载,续传时通过
Range请求剩余部分。
- 服务端响应
请根据以上要求生成完整的项目代码,确保结构清晰、可运行,并支持未来扩展(如引入 Netty 或替换 RabbitMQ 为 Kafka)。
CREATE TABLE file_metadata (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
file_id VARCHAR(64) NOT NULL UNIQUE,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(255) NOT NULL,
user_id VARCHAR(64) NOT NULL,
total_chunks INT NOT NULL,
uploaded_chunks INT NOT NULL,
status VARCHAR(20) NOT NULL,
upload_time VARCHAR(30) NOT NULL,
INDEX idx_file_id (file_id),
INDEX idx_user_id (user_id)
);
登录
- http → 登录获得token
ws请求、连接都携带token
连接后、上线:
- 查看历史消息(可限制天数、已发送消息)、redis查询离线消息,进行返回;
推送消息:客户端接收离线消息并返回确认,服务器接收确认消息,更新sql状态、redis状态
发送消息:
- 接收消息,基础校验,防止恶意请求,写入消息队列,
- 消费队列处理信息,深度校验(防止越权、内容监控、广告)
- 写入MySQL;
- 判断是否在线,在线则进行消息推送
- 不在线保存到redis中
推送机制
- 推送成功,修改数据库内容
- 推送失败,重试