fix(cablemanager): 修复 cablemanager 无法操作 + 一直刷新的问题
- 根因1: GET /api/audio-cable-groups 服务端返回 {groups: list},但前端 loadGroups() 读 data.audioCableGroups → 永远读到 undefined → 始终空列表
修复: 服务端 L3447 同时返回 groups 和 audioCableGroups 两个别名;前端 loadGroups() 优先读 audioCableGroups,不存在则回退 groups
- 根因2: WebSocket onmessage 收到 init_state/state_update 立即 reloadAll(带 toast),若事件频繁会反复 re-render + 连弹『数据已刷新』toast → 看起来一直刷新且输入框总被重置
修复: 新增 scheduleAutoReload() 节流(两次自动刷新之间至少间隔 900ms);且自动刷新统一走 reloadAll({silent:true}) 不弹成功/失败 toast;仅用户点刷新按钮才弹提示
- 本地实测: PORT=8999 启动 server 后 /api/stations → {success:true, stations:[]},/api/audio-cable-groups → {success:true, groups:[], audioCableGroups:[]},两个端点均 200 且响应结构含双别名 key
- APP_VERSION_TEXT bump 到 v1.0.109
This commit is contained in:
@@ -1499,7 +1499,7 @@
|
|||||||
const res = await fetch('/api/audio-cable-groups');
|
const res = await fetch('/api/audio-cable-groups');
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
audioCableGroups = data.audioCableGroups || [];
|
audioCableGroups = Array.isArray(data.audioCableGroups) ? data.audioCableGroups : (Array.isArray(data.groups) ? data.groups : []);
|
||||||
} else {
|
} else {
|
||||||
throw new Error(data.message || '加载分组失败');
|
throw new Error(data.message || '加载分组失败');
|
||||||
}
|
}
|
||||||
@@ -1516,7 +1516,8 @@
|
|||||||
if (!Array.isArray(stations)) stations = [];
|
if (!Array.isArray(stations)) stations = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
async function reloadAll() {
|
async function reloadAll(options) {
|
||||||
|
const silent = !!(options && options.silent);
|
||||||
try {
|
try {
|
||||||
await Promise.all([loadGroups(), loadStations()]);
|
await Promise.all([loadGroups(), loadStations()]);
|
||||||
renderGroupList();
|
renderGroupList();
|
||||||
@@ -1530,9 +1531,9 @@
|
|||||||
renderDualLists();
|
renderDualLists();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
showToast('成功', '数据已刷新', 'success');
|
if (!silent) showToast('成功', '数据已刷新', 'success');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
showToast('错误', e?.message || String(e), 'error');
|
if (!silent) showToast('错误', e?.message || String(e), 'error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1558,6 +1559,25 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
let ws;
|
let ws;
|
||||||
|
let _autoReloadTimer = 0;
|
||||||
|
let _autoReloadPending = false;
|
||||||
|
function scheduleAutoReload() {
|
||||||
|
_autoReloadPending = true;
|
||||||
|
const now = Date.now();
|
||||||
|
const wait = Math.max(0, 900 - (now - _autoReloadTimer));
|
||||||
|
const fire = () => {
|
||||||
|
if (!_autoReloadPending) return;
|
||||||
|
_autoReloadPending = false;
|
||||||
|
_autoReloadTimer = Date.now();
|
||||||
|
reloadAll({ silent: true }).catch(() => {});
|
||||||
|
};
|
||||||
|
if (wait === 0) {
|
||||||
|
Promise.resolve().then(fire);
|
||||||
|
} else {
|
||||||
|
clearTimeout(scheduleAutoReload._t);
|
||||||
|
scheduleAutoReload._t = setTimeout(fire, wait);
|
||||||
|
}
|
||||||
|
}
|
||||||
function connectWebSocket() {
|
function connectWebSocket() {
|
||||||
try {
|
try {
|
||||||
const wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';
|
const wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';
|
||||||
@@ -1572,7 +1592,7 @@
|
|||||||
try {
|
try {
|
||||||
const data = JSON.parse(event.data);
|
const data = JSON.parse(event.data);
|
||||||
if (data.type === 'init_state' || data.type === 'state_update') {
|
if (data.type === 'init_state' || data.type === 'state_update') {
|
||||||
reloadAll().catch(() => {});
|
scheduleAutoReload();
|
||||||
}
|
}
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3444,7 +3444,7 @@ app.get('/api/audio-cable-groups', (req, res) => {
|
|||||||
};
|
};
|
||||||
})()
|
})()
|
||||||
}));
|
}));
|
||||||
res.json({ success: true, groups: list });
|
res.json({ success: true, groups: list, audioCableGroups: list });
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post('/api/audio-cable-groups', express.json(), (req, res) => {
|
app.post('/api/audio-cable-groups', express.json(), (req, res) => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
-- 1. Configuration & Constants
|
-- 1. Configuration & Constants
|
||||||
local APP_VERSION_TEXT = "v1.0.108"
|
local APP_VERSION_TEXT = "v1.0.109"
|
||||||
|
|
||||||
local CONFIG = {
|
local CONFIG = {
|
||||||
CLOUD_URL = "ws://stabadmin.fse-media.group",
|
CLOUD_URL = "ws://stabadmin.fse-media.group",
|
||||||
|
|||||||
Reference in New Issue
Block a user