--- title: DeviceTransfer date: 2025-04-07 categories: [工作, 项目] tags: [项目] --- ```Plain 请为我生成一个基于 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 作为辅助技术。以下是具体要求: 1. **项目结构**: - 包名:`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`:发送消息到 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 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 使用非加密协议)。 4. **其他说明**: - 提供基本的错误处理和日志记录(使用 SLF4J)。 - 代码注释清晰,说明每个类的作用。 - **大文件分片和断点续传**: - 客户端上传分片,服务端记录进度到 Redis(`file:{fileId}:chunks` 存储已上传分片索引)。 - 续传时,客户端查询已上传分片(GET `/upload/status/{fileId}`),跳过已完成部分。 - 暂停/取消:DELETE `/upload/cancel/{fileId}` 删除分片并更新状态为 canceled。 - **下载支持**: - 服务端响应 `Range` 头,返回指定范围的分片。 - 客户端可暂停下载,续传时通过 `Range` 请求剩余部分。 请根据以上要求生成完整的项目代码,确保结构清晰、可运行,并支持未来扩展(如引入 Netty 或替换 RabbitMQ 为 Kafka)。 ```Java 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中 推送机制 - 推送成功,修改数据库内容 - 推送失败,重试