diff --git a/client/src/layout/container/index.jsx b/client/src/layout/container/index.jsx
index b9e27fc..26ca6bb 100644
--- a/client/src/layout/container/index.jsx
+++ b/client/src/layout/container/index.jsx
@@ -11,7 +11,7 @@ export default (props) => {
useEffect(() => {
if (!sessionStorage.getItem("user")) {
- window.location.replace("/signin");
+ window.location.replace("/wuyuanbiaoba");
}
}, []);
diff --git a/client/src/sections/wuyuanbiaoba/components/CameraView.jsx b/client/src/sections/wuyuanbiaoba/components/CameraView.jsx
index fdf8434..d85589a 100644
--- a/client/src/sections/wuyuanbiaoba/components/CameraView.jsx
+++ b/client/src/sections/wuyuanbiaoba/components/CameraView.jsx
@@ -286,8 +286,7 @@ const CameraView = ({
const templateParams = selectedTemplate
? {
// 从模板中获取参数
- name:
- selectedTemplate.name || `target${rectangles.length + 1}`,
+ name: `target${rectangles.length + 1}` || selectedTemplate.name,
radius: selectedTemplate.physicalRadius || 40.0,
isReferencePoint: selectedTemplate.isBaseline || false,
gradientThreshold:
diff --git a/client/src/sections/wuyuanbiaoba/components/RealtimeCharts.jsx b/client/src/sections/wuyuanbiaoba/components/RealtimeCharts.jsx
index 10520bf..9215667 100644
--- a/client/src/sections/wuyuanbiaoba/components/RealtimeCharts.jsx
+++ b/client/src/sections/wuyuanbiaoba/components/RealtimeCharts.jsx
@@ -1,5 +1,5 @@
-import React, { useMemo, useEffect, useRef } from "react";
-import { Typography, Badge } from "antd";
+import React, { useMemo, useEffect, useRef, useState, useCallback } from "react";
+import { Typography, Badge, Button, Space } from "antd";
import {
Chart as ChartJS,
CategoryScale,
@@ -29,9 +29,11 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
const xChartRef = useRef(null);
const yChartRef = useRef(null);
+ // 添加标靶显示状态控制
+ const [visibleTargets, setVisibleTargets] = useState({});
+
// 添加数据验证
if (!Array.isArray(tableData)) {
- // console.warn('tableData is not an array:', tableData);
return
数据格式错误
;
}
@@ -104,7 +106,7 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
return { labels, deviceIds, timeGroups, sortedTimes };
} catch (error) {
- console.error("数据采样出错:", error);
+ console.error(`${new Date().toLocaleString()} - 数据采样出错:`, error);
return {
labels: [],
deviceIds: [],
@@ -114,6 +116,72 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
}
};
+ // 初始化可见目标状态
+ const { deviceIds } = sampleData(tableData);
+ useEffect(() => {
+ if (deviceIds.length > 0) {
+ const initialVisible = {};
+ deviceIds.forEach(deviceId => {
+ initialVisible[deviceId] = true; // 默认所有标靶都显示
+ });
+ setVisibleTargets(prev => ({ ...initialVisible, ...prev }));
+ }
+ }, [deviceIds.join(',')]);
+
+ // 切换标靶显示状态的函数
+ const toggleTargetVisibility = useCallback((deviceId) => {
+ setVisibleTargets(prev => ({
+ ...prev,
+ [deviceId]: !prev[deviceId]
+ }));
+
+ // 同时控制两个图表的显示状态
+ const xChart = xChartRef.current;
+ const yChart = yChartRef.current;
+
+ if (xChart && yChart) {
+ const xDatasetIndex = xChart.data.datasets.findIndex(dataset => dataset.label === deviceId);
+ const yDatasetIndex = yChart.data.datasets.findIndex(dataset => dataset.label === deviceId);
+
+ if (xDatasetIndex !== -1 && yDatasetIndex !== -1) {
+ const isVisible = xChart.isDatasetVisible(xDatasetIndex);
+
+ // 切换显示状态
+ xChart.setDatasetVisibility(xDatasetIndex, !isVisible);
+ yChart.setDatasetVisibility(yDatasetIndex, !isVisible);
+
+ // 更新图表
+ xChart.update();
+ yChart.update();
+ }
+ }
+ }, []);
+
+ // 全部显示/隐藏的函数
+ const toggleAllTargets = useCallback((visible) => {
+ const newVisibleTargets = {};
+ deviceIds.forEach(deviceId => {
+ newVisibleTargets[deviceId] = visible;
+ });
+ setVisibleTargets(newVisibleTargets);
+
+ // 同时控制两个图表
+ const xChart = xChartRef.current;
+ const yChart = yChartRef.current;
+
+ if (xChart && yChart) {
+ xChart.data.datasets.forEach((_, index) => {
+ xChart.setDatasetVisibility(index, visible);
+ });
+ yChart.data.datasets.forEach((_, index) => {
+ yChart.setDatasetVisibility(index, visible);
+ });
+
+ xChart.update();
+ yChart.update();
+ }
+ }, [deviceIds]);
+
// 准备X轴图表数据
const xChartData = useMemo(() => {
try {
@@ -145,15 +213,16 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
pointHoverRadius: 5,
tension: 0,
connectNulls: false,
+ hidden: !visibleTargets[deviceId], // 根据状态控制显示
};
});
return { labels, datasets };
} catch (error) {
- console.error("准备X轴图表数据出错:", error);
+ console.error(`${new Date().toLocaleString()} - 准备X轴图表数据出错:`, error);
return { labels: [], datasets: [] };
}
- }, [tableData]);
+ }, [tableData, visibleTargets]);
// 准备Y轴图表数据
const yChartData = useMemo(() => {
@@ -186,15 +255,16 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
pointHoverRadius: 5,
tension: 0,
connectNulls: false,
+ hidden: !visibleTargets[deviceId], // 根据状态控制显示
};
});
return { labels, datasets };
} catch (error) {
- console.error("准备Y轴图表数据出错:", error);
+ console.error(`${new Date().toLocaleString()} - 准备Y轴图表数据出错:`, error);
return { labels: [], datasets: [] };
}
- }, [tableData]);
+ }, [tableData, visibleTargets]);
// Chart.js配置选项
const chartOptions = {
@@ -206,14 +276,7 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
},
plugins: {
legend: {
- position: "bottom",
- labels: {
- usePointStyle: true,
- padding: 20,
- font: {
- size: 12,
- },
- },
+ display: false, // 隐藏默认图例,使用自定义控制器
},
tooltip: {
filter: function (tooltipItem) {
@@ -312,13 +375,6 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
},
};
- // 添加调试信息
- // useEffect(() => {
- // console.log('RealtimeCharts - tableData:', tableData);
- // console.log('RealtimeCharts - xChartData:', xChartData);
- // console.log('RealtimeCharts - yChartData:', yChartData);
- // }, [tableData, xChartData, yChartData]);
-
// 如果没有数据,显示空状态
if (!tableData || tableData.length === 0) {
return (
@@ -378,6 +434,41 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => {
/>
+ {/* 统一的图例控制器 */}
+
+
显示控制
+
+
+
+ {deviceIds.map(deviceId => (
+
+ ))}
+
+
+
{
if (err) {
- console.error('WebSocket发送数据错误:', err);
+ console.error(`[${new Date().toLocaleString()}] WebSocket发送数据错误:`, err);
} else {
// console.log('完整消息已转发到WebSocket客户端');
}
@@ -101,7 +101,7 @@ function setupTcpProxy(conf) {
// 直接发送完整数据
tcpClient.write(messageStr + '\n\n', (err) => {
if (err) {
- console.error('TCP发送数据错误:', err);
+ console.error(`[${new Date().toLocaleString()}] TCP发送数据错误:`, err);
} else {
// console.log('数据已发送到TCP服务器');
}
@@ -113,7 +113,7 @@ function setupTcpProxy(conf) {
// TCP连接错误处理
tcpClient.on('error', (err) => {
- console.error('TCP连接错误:', err);
+ console.error(`[${new Date().toLocaleString()}] TCP连接错误:`, err);
tcpDataBuffer = ''; // 清理缓冲区
if (ws.readyState === WebSocket.OPEN) {
ws.close(1011, 'TCP连接错误');
@@ -140,7 +140,7 @@ function setupTcpProxy(conf) {
// WebSocket错误处理
ws.on('error', (err) => {
- console.error('WebSocket错误:', err);
+ console.error(`[${new Date().toLocaleString()}] WebSocket错误:`, err);
if (tcpClient.writable) {
tcpClient.destroy();
}
@@ -155,7 +155,7 @@ function setupTcpProxy(conf) {
});
wss.on('error', (err) => {
- console.error('WebSocket服务器错误:', err);
+ console.error(`[${new Date().toLocaleString()}] WebSocket服务器错误:`, err);
});
return wss;