diff --git a/pom.xml b/pom.xml index 0ae4ba0..6c044a5 100644 --- a/pom.xml +++ b/pom.xml @@ -145,7 +145,6 @@ org.springframework.boot spring-boot-starter-websocket - 3.4.0 org.slf4j diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java index 60c332a..795ff42 100644 --- a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java +++ b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java @@ -26,16 +26,14 @@ public class WebSocketInterceptor implements HandshakeInterceptor { private ProductService productService; @Override - public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) { if (request instanceof ServletServerHttpRequest) { HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); - // 获取路径变量 + // 获取完整路径 String path = servletRequest.getRequestURI(); - String[] pathParts = path.split("/"); - String pathVariable = pathParts[pathParts.length - 1]; - // 根据路径变量设置不同的业务逻辑 Supplier - switch (pathVariable) { + // 根据路径设置不同的业务逻辑 Supplier + switch (path) { case "/api/rest/device/ws/device/status": attributes.put("dataSupplier", (Supplier) () -> String.valueOf(deviceService.status())); break; @@ -46,7 +44,7 @@ public class WebSocketInterceptor implements HandshakeInterceptor { attributes.put("dataSupplier", (Supplier) () -> String.valueOf(productService.status())); break; default: - attributes.put("dataSupplier", (Supplier) () -> "Unknown path: " + pathVariable); + attributes.put("dataSupplier", (Supplier) () -> "Unknown path: " + path); break; } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/attachment/controller/AttachmentController.java b/src/main/java/com/zsc/edu/gateway/modules/attachment/controller/AttachmentController.java index a991499..f951c76 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/attachment/controller/AttachmentController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/attachment/controller/AttachmentController.java @@ -1,6 +1,7 @@ package com.zsc.edu.gateway.modules.attachment.controller; import com.zsc.edu.gateway.exception.StorageException; +import com.zsc.edu.gateway.framework.storage.exception.StorageFileNotFoundException; import com.zsc.edu.gateway.modules.attachment.entity.Attachment; import com.zsc.edu.gateway.modules.attachment.service.AttachmentService; import com.zsc.edu.gateway.modules.operationLog.entity.OperationLogAnnotation; @@ -8,6 +9,7 @@ import lombok.AllArgsConstructor; import org.springframework.core.io.Resource; import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.parameters.P; import org.springframework.web.bind.annotation.*; @@ -73,6 +75,43 @@ public class AttachmentController { } return ResponseEntity.ok(wrapper.resource); } + + /** + * 预览附件 + * + * @param id 附件ID + * @return 附件文件内容(直接预览) + */ + @GetMapping("/preview/{id}") + public ResponseEntity preview( + @PathVariable("id") String id + ) { + try { + Attachment.Wrapper wrapper = service.loadAsWrapper(id); + String mimeType = wrapper.attachment.mimeType; + + // 如果是图片或 PDF,直接返回文件流 + if (mimeType.startsWith("image/") || mimeType.equals("application/pdf")) { + ContentDisposition contentDisposition = ContentDisposition.builder("inline") + .filename(wrapper.attachment.fileName, StandardCharsets.UTF_8) + .build(); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()) + .header(HttpHeaders.CONTENT_TYPE, mimeType) + .body(wrapper.resource); + } else { + // 如果是文本文件,直接返回文本内容 + String content = new String(wrapper.resource.getInputStream().readAllBytes(), StandardCharsets.UTF_8); + return ResponseEntity.ok(content); + } + } catch (StorageFileNotFoundException e) { + return ResponseEntity.notFound().build(); + } catch (IOException e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件读取失败"); + } + } + /** * 根据附件ID获取附件信息 * */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java index 173a276..3315907 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONException; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.zsc.edu.gateway.framework.message.sse.SseConfig; import com.zsc.edu.gateway.framework.mybatisplus.DataPermission; import com.zsc.edu.gateway.modules.iot.device.dto.BatchDeviceDto; import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto; @@ -38,8 +37,6 @@ public class DeviceController { DeviceService service; RecordDataService recordService; - @Resource - private SseConfig sseConfig; /** * 创建设备 diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/dto/DeviceDto.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/dto/DeviceDto.java index 9a7d190..19d2e91 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/dto/DeviceDto.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/dto/DeviceDto.java @@ -64,4 +64,5 @@ public class DeviceDto { */ public String previewId; + } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java index fafa3da..7c673bb 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java @@ -121,7 +121,7 @@ public class Device extends BaseEntity { * 设备预览图附件ID */ public String previewId; - +//TODO 设备运行状态 public enum Status implements IEnum, IState { UNACTIVATED(0, "未激活"), diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/query/DeviceQuery.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/query/DeviceQuery.java index 76d4892..7c3a25b 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/query/DeviceQuery.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/query/DeviceQuery.java @@ -43,10 +43,7 @@ public class DeviceQuery { * 设态是否在线 */ public Boolean isOnline; - /** - * 产品名称 - */ - public String productName; + public LambdaQueryWrapper wrapper() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/repo/DeviceRepository.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/repo/DeviceRepository.java index 4ce1a5a..46bc9e4 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/repo/DeviceRepository.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/repo/DeviceRepository.java @@ -32,4 +32,6 @@ public interface DeviceRepository extends BaseMapper { Device findByClientId(@Param("clientId") String clientId); List selectListByName(@Param("name") String name); + + IPage selectPageByConditions(Page page, @Param("query") DeviceQuery query); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java index 836c872..2f8e107 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java @@ -172,9 +172,10 @@ public class DeviceServiceImpl extends ServiceImpl imp /** * 查询设备列表 */ + //TODO 解决分页条件问题 @Override public IPage query(Page page, DeviceQuery query) { - return deviceRepo.selectPage(page, query.wrapper()); + return baseMapper.selectPageByConditions(page, query); } /** diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java index 3095526..094bafa 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java @@ -126,7 +126,6 @@ public class DeviceVo { */ public Attachment preview; - /** * 所属产品ID */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java b/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java index f32cbf7..47b1d67 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java @@ -1,14 +1,12 @@ package com.zsc.edu.gateway.modules.iot.product.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.zsc.edu.gateway.framework.message.sse.SseConfig; import com.zsc.edu.gateway.framework.mybatisplus.DataPermission; import com.zsc.edu.gateway.modules.iot.product.dto.ProductDto; import com.zsc.edu.gateway.modules.iot.product.entity.Product; import com.zsc.edu.gateway.modules.iot.product.query.ProductQuery; import com.zsc.edu.gateway.modules.iot.product.service.ProductService; import com.zsc.edu.gateway.modules.operationLog.entity.OperationLogAnnotation; -import jakarta.annotation.Resource; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -25,8 +23,6 @@ public class ProductController { private final ProductService service; - @Resource - SseConfig sseConfig; /** * 创建产品 diff --git a/src/main/resources/mappers/iot/DeviceMapper.xml b/src/main/resources/mappers/iot/DeviceMapper.xml index 8016eb9..6f4ad9c 100644 --- a/src/main/resources/mappers/iot/DeviceMapper.xml +++ b/src/main/resources/mappers/iot/DeviceMapper.xml @@ -82,10 +82,27 @@ where d.id = #{id} - + SELECT d.*, p.* FROM iot_device d - LEFT JOIN iot_product p ON d.product_id = p.id + LEFT JOIN iot_product p ON d.product_id = p.id + + + AND d.name LIKE concat('%', #{query.name}, '%') + + + AND d.client_id = #{query.clientId} + + + AND d.state = #{query.state} + + + AND d.online = #{query.isOnline} + + + AND d.product_id = #{query.productId} + + \ No newline at end of file