fix: 调整最新数据的显示

This commit is contained in:
fengyarnom 2025-05-30 19:02:58 +08:00
parent af3a23f300
commit 186d0efd37
2 changed files with 89 additions and 36 deletions

View File

@ -13,9 +13,10 @@ import (
// 客户端信息结构
type ClientInfo struct {
IP string // IP地址
Port string // 端口
LastSeen time.Time // 最后活跃时间
IP string // IP地址
Port string // 端口
LastSeen time.Time // 最后活跃时间
IsConnected bool // 是否当前连接
}
// 客户端列表(使用互斥锁保护的映射)
@ -257,9 +258,10 @@ func addClient(addr string) {
}
clients[addr] = &ClientInfo{
IP: host,
Port: port,
LastSeen: time.Now(),
IP: host,
Port: port,
LastSeen: time.Now(),
IsConnected: true,
}
Logger.Printf("添加新客户端: %s", addr)
@ -281,8 +283,9 @@ func removeClient(addr string) {
defer clientsMutex.Unlock()
if client, exists := clients[addr]; exists {
client.LastSeen = time.Now()
Logger.Printf("客户端标记为断开连接: %s", addr)
// 标记为断开连接不更新LastSeen时间
client.IsConnected = false
Logger.Printf("客户端断开连接: %s", addr)
}
}
@ -297,18 +300,21 @@ func getAllClients() []map[string]interface{} {
for addr, client := range clients {
lastSeenDuration := now.Sub(client.LastSeen)
// 清理24小时前的记录
if lastSeenDuration > 24*time.Hour {
delete(clients, addr)
continue
}
// 修改连接状态判断2小时内为保持连接超过2小时为掉线
isOnline := lastSeenDuration < 2*time.Hour
// 连接状态判断当前连接且2小时内活跃为在线
isOnline := client.IsConnected && lastSeenDuration < 2*time.Hour
var connectionStatus string
if isOnline {
connectionStatus = "保持连接"
} else if client.IsConnected {
connectionStatus = "连接超时"
} else {
connectionStatus = "已掉线"
connectionStatus = "已断开"
}
result = append(result, map[string]interface{}{
@ -375,17 +381,21 @@ func triggerManualQuery() int {
command := "@1602301014A*0!\n"
for addr, client := range clients {
// 检查客户端是否在线(2小时内活跃,与连接状态判断保持一致
if time.Since(client.LastSeen) < 2*time.Hour {
// 检查客户端是否在线(连接状态且2小时内活跃
if client.IsConnected && time.Since(client.LastSeen) < 2*time.Hour {
if conn, exists := clientConns[addr]; exists {
if _, err := conn.Write([]byte(command)); err != nil {
Logger.Printf("手动发送查询指令到客户端 %s 失败: %v", addr, err)
// 连接可能已断开,从映射中移除
// 连接可能已断开,从映射中移除并标记为断开
delete(clientConns, addr)
client.IsConnected = false
} else {
TCPDataLogger.Printf("手动发送查询指令到客户端 %s: %s", addr, strings.TrimSpace(command))
sentCount++
}
} else {
// 没有连接记录,标记为断开
client.IsConnected = false
}
}
}

View File

@ -760,37 +760,59 @@
// 获取最新传感器数据
function fetchLatestData() {
console.log('正在获取最新传感器数据...');
console.log('=== 开始获取最新传感器数据 ===');
fetch('/api/latest')
.then(response => {
console.log('获取最新数据响应状态:', response.status);
console.log('API响应状态:', response.status, response.statusText);
if (!response.ok) {
throw new Error(`HTTP错误: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log('获取到的最新数据:', data);
if (data && data.length > 0) {
console.log('=== API返回的原始数据 ===');
console.log('数据类型:', typeof data);
console.log('数据内容:', data);
console.log('是否为数组:', Array.isArray(data));
console.log('数组长度:', data ? data.length : 'null');
if (data && Array.isArray(data) && data.length > 0) {
const latest = data[0];
console.log('=== 最新数据详情 ===');
console.log('latest对象:', latest);
console.log('sensor_id:', latest.sensor_id);
console.log('x:', latest.x);
console.log('y:', latest.y);
console.log('z:', latest.z);
console.log('temperature:', latest.temperature);
console.log('timestamp:', latest.timestamp);
updateLatestDataDisplay(latest);
console.log('最新数据显示更新完成');
console.log('=== 更新显示完成 ===');
} else {
console.log('数据库中没有数据');
console.log('=== 数据为空,显示空状态 ===');
updateLatestDataDisplayEmpty();
}
})
.catch(error => {
console.error('获取最新数据失败:', error);
console.error('=== 获取最新数据出错 ===');
console.error('错误详情:', error);
updateLatestDataDisplayError(error.message);
});
}
// 更新最新数据显示
function updateLatestDataDisplay(data) {
console.log('=== 开始更新最新数据显示 ===');
console.log('输入数据:', data);
try {
const date = new Date(data.timestamp);
console.log('解析时间戳:', data.timestamp);
console.log('原始时间:', date.toISOString());
date.setHours(date.getHours() - 8);
console.log('调整后时间:', date.toISOString());
const formattedDate =
date.getFullYear() + '/' +
@ -800,23 +822,44 @@
date.getMinutes().toString().padStart(2, '0') + ':' +
date.getSeconds().toString().padStart(2, '0');
document.getElementById('latest-time').textContent = `(${formattedDate})`;
document.getElementById('latest-sensor-id').textContent = data.sensor_id;
document.getElementById('latest-x').textContent = data.x.toFixed(3);
document.getElementById('latest-y').textContent = data.y.toFixed(3);
document.getElementById('latest-z').textContent = data.z.toFixed(3);
document.getElementById('latest-temperature').textContent = data.temperature.toFixed(1);
console.log('格式化时间:', formattedDate);
// 检查DOM元素是否存在
const timeElem = document.getElementById('latest-time');
const sensorIdElem = document.getElementById('latest-sensor-id');
const xElem = document.getElementById('latest-x');
const yElem = document.getElementById('latest-y');
const zElem = document.getElementById('latest-z');
const tempElem = document.getElementById('latest-temperature');
console.log('DOM元素检查:');
console.log('- latest-time:', timeElem ? '存在' : '不存在');
console.log('- latest-sensor-id:', sensorIdElem ? '存在' : '不存在');
console.log('- latest-x:', xElem ? '存在' : '不存在');
console.log('- latest-y:', yElem ? '存在' : '不存在');
console.log('- latest-z:', zElem ? '存在' : '不存在');
console.log('- latest-temperature:', tempElem ? '存在' : '不存在');
if (timeElem) timeElem.textContent = `(${formattedDate})`;
if (sensorIdElem) sensorIdElem.textContent = data.sensor_id;
if (xElem) xElem.textContent = data.x.toFixed(3);
if (yElem) yElem.textContent = data.y.toFixed(3);
if (zElem) zElem.textContent = data.z.toFixed(3);
if (tempElem) tempElem.textContent = data.temperature.toFixed(1);
console.log('=== 数据更新成功 ===');
console.log('更新的值:');
console.log('- 时间:', formattedDate);
console.log('- 传感器ID:', data.sensor_id);
console.log('- X:', data.x.toFixed(3));
console.log('- Y:', data.y.toFixed(3));
console.log('- Z:', data.z.toFixed(3));
console.log('- 温度:', data.temperature.toFixed(1));
console.log('最新数据显示更新成功:', {
sensor_id: data.sensor_id,
time: formattedDate,
x: data.x,
y: data.y,
z: data.z,
temperature: data.temperature
});
} catch (error) {
console.error('更新最新数据显示时发生错误:', error);
console.error('=== 更新最新数据显示时发生错误 ===');
console.error('错误详情:', error);
console.error('错误堆栈:', error.stack);
updateLatestDataDisplayError('数据格式错误');
}
}