From 27f25db266d25443f689e4f8b01d08da898881bf Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Wed, 7 Jan 2026 16:37:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8A=B6=E6=80=81=E8=AE=BE=E5=A4=87=EF=BC=8C?= =?UTF-8?q?=E5=8F=96rawData=E6=9C=80=E5=90=8E=E5=AD=97=E6=AE=B5=E5=80=BC?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E8=AE=BE=E7=BD=AE=E6=98=A0=E5=B0=84=EF=BC=8C?= =?UTF-8?q?=E5=B0=B1=E6=98=BE=E7=A4=BA=E5=8E=9F=E5=A7=8B=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/configurator/CrosXssFilter.java | 2 +- .../back/service/common/CommonOpt.java | 66 +++++++++++++++++-- .../impl/DeviceDataBaStatusServiceImpl.java | 2 +- 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/CrosXssFilter.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/CrosXssFilter.java index 1dd2247..a236b18 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/CrosXssFilter.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/CrosXssFilter.java @@ -79,7 +79,7 @@ public class CrosXssFilter implements Filter { String nonce = UUID.randomUUID().toString().replace("-", "").substring(0, 16); // 生成随机 nonce httpServletResponse.setHeader("Content-Security-Policy", "default-src 'self'; " + - "img-src 'self' data: https://*.amazonaws.com;"+ + "img-src 'self' data:; "+ "font-src 'self' https://i.alicdn.com data:; "+ //阿里系的ui组件 // "script-src 'self' 'nonce-" + nonce + "'; " + //nonce针对内联 JavaScript // "style-src 'self' 'nonce-" + nonce + "'; " + //nonce针对内联 CSS diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java index 438f654..2502776 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java @@ -43,6 +43,11 @@ public class CommonOpt { private static Logger logger = LoggerFactory.getLogger(CommonOpt.class); + public enum ExtractStrategy { + FIRST, + LAST + } + private static final String SUFFIX_85 = "_85"; private static final String SUFFIX_85_9003 = "_85_9003"; private static final String SUFFIX_111 = "_111"; @@ -181,6 +186,26 @@ public class CommonOpt { return ""; } + public String extractLastValue(ObjectMapper mapper, String rawData) { + if (StringUtils.isBlank(rawData)) { + return ""; + } + try { + JsonNode node = mapper.readTree(rawData); + Iterator> fields = node.fields(); + + JsonNode lastValue = null; + while (fields.hasNext()) { + lastValue = fields.next().getValue(); + } + + return lastValue != null ? lastValue.asText() : ""; + } catch (Exception e) { + logger.error("Failed to parse rawData JSON: " + rawData, e); + } + return ""; + } + public List extractAllValues(ObjectMapper mapper, String rawData) { List result = new ArrayList<>(); @@ -539,24 +564,53 @@ public class CommonOpt { return mapFirstValue(objectMapper, dataMapping111, realtime111); } - public String mapFirstValue(ObjectMapper mapper, - String dataMapping, - DeviceRawdataRealtime deviceRawdataRealtime) { + public String mapFirstValue(ObjectMapper mapper, String dataMapping, DeviceRawdataRealtime deviceRawdataRealtime) { + return mapValue(mapper, dataMapping, deviceRawdataRealtime, ExtractStrategy.FIRST); + } + + public String mapLastValue(ObjectMapper mapper, String dataMapping, DeviceRawdataRealtime deviceRawdataRealtime) { + return mapValue(mapper, dataMapping, deviceRawdataRealtime, ExtractStrategy.LAST); + } + + public String mapValue( + ObjectMapper mapper, + String dataMapping, + DeviceRawdataRealtime deviceRawdataRealtime, + ExtractStrategy strategy) { + if (StringUtils.isBlank(dataMapping) || deviceRawdataRealtime == null) { return null; } try { - String statusValue = extractFirstValue(mapper, deviceRawdataRealtime.getRawData()); + String statusValue; + + if (strategy == ExtractStrategy.FIRST) { + statusValue = extractFirstValue(mapper, deviceRawdataRealtime.getRawData()); + } else { + statusValue = extractLastValue(mapper, deviceRawdataRealtime.getRawData()); + } + JsonNode root = mapper.readTree(dataMapping); - return root.path("default").path(statusValue).asText(null); + JsonNode mappedNode = root.path("default").path(statusValue); + + // default 里有映射值 → 返回映射值 + if (!mappedNode.isMissingNode() && !mappedNode.isNull()) { + String mappedValue = mappedNode.asText(); + if (StringUtils.isNotBlank(mappedValue)) { + return mappedValue; + } + } + + // default 里取不到 → 返回原始值 + return statusValue; + } catch (Exception e) { logger.error("dataMapping parse error, mapping={}", dataMapping, e); return null; } } - public String buildRawFirstValue(String deviceId, Map deviceId85To111Map, Map realtime111Map, ObjectMapper mapper) { return Optional.ofNullable(deviceId85To111Map.get(deviceId)) diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java index bf44951..d71764c 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java @@ -116,7 +116,7 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService //处理111状态映射 // data.setStatus111(commonOpt.buildStatus111(deviceId, deviceId85To111Map, deviceInfo111Map, realtime111Map, objectMapper)); data.setStatus111(commonOpt.buildRawFirstValue(deviceId, deviceId85To111Map, realtime111Map, objectMapper)); - data.setRunningStatus(commonOpt.mapFirstValue(objectMapper, data.getDataMapping(), realtime85Map.get(deviceId))); + data.setRunningStatus(commonOpt.mapLastValue(objectMapper, data.getDataMapping(), realtime85Map.get(deviceId))); // 判断设备是否在 favorited_device 表中 data.setCollected(favoritedDeviceIds.contains(deviceId) ? 1 : 0);