| | |
| | | </h2> |
| | | <p class="text-muted mb-0 mt-1">管理和监控 S7 PLC 仿真器实例</p> |
| | | </div> |
| | | <div class="d-flex align-items-center gap-3"> |
| | | <div id="refreshIndicator" class="text-muted small" style="display: none;"> |
| | | <i class="bi bi-arrow-clockwise spin-icon me-1"></i> |
| | | <span>更新中...</span> |
| | | </div> |
| | | <a asp-page="/Create" class="btn btn-primary"> |
| | | <i class="bi bi-plus-lg me-1"></i>创建实例 |
| | | </a> |
| | | </div> |
| | | </div> |
| | | |
| | | <div id="instancesContainer"> |
| | |
| | | let autoRefreshInterval = null; |
| | | |
| | | document.addEventListener('DOMContentLoaded', function () { |
| | | loadInstances(); |
| | | startAutoRefresh(loadInstances, 5000); |
| | | loadInstances(false); // 首次加载显示 loading |
| | | startAutoRefresh(() => loadInstances(true), 2000); // 自动刷新使用静默模式,每2秒刷新 |
| | | }); |
| | | |
| | | async function loadInstances() { |
| | | async function loadInstances(silent = false) { |
| | | const refreshIndicator = document.getElementById('refreshIndicator'); |
| | | if (silent && refreshIndicator) { |
| | | refreshIndicator.style.display = 'block'; |
| | | } |
| | | |
| | | try { |
| | | const instances = await apiCall(`${API_BASE_URL}/SimulatorInstances`); |
| | | const instances = await apiCall(`${API_BASE_URL}/SimulatorInstances`, { silent: silent }); |
| | | renderInstances(instances); |
| | | } catch (error) { |
| | | console.error('Failed to load instances:', error); |
| | | if (!silent) { |
| | | document.getElementById('loadingState').classList.add('d-none'); |
| | | document.getElementById('emptyState').classList.remove('d-none'); |
| | | } |
| | | } finally { |
| | | if (silent && refreshIndicator) { |
| | | refreshIndicator.style.display = 'none'; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | method: 'POST' |
| | | }); |
| | | showToast(`实例 "${id}" 启动命令已发送`, 'success'); |
| | | setTimeout(() => loadInstances(), 1000); |
| | | setTimeout(() => loadInstances(false), 1000); |
| | | } catch (error) { |
| | | console.error('Failed to start instance:', error); |
| | | } |
| | |
| | | method: 'POST' |
| | | }); |
| | | showToast(`实例 "${id}" 停止命令已发送`, 'success'); |
| | | setTimeout(() => loadInstances(), 1000); |
| | | setTimeout(() => loadInstances(false), 1000); |
| | | } catch (error) { |
| | | console.error('Failed to stop instance:', error); |
| | | } |
| | |
| | | method: 'DELETE' |
| | | }); |
| | | showToast(`实例 "${id}" 已删除`, 'success'); |
| | | loadInstances(); |
| | | loadInstances(false); |
| | | } catch (error) { |
| | | console.error('Failed to delete instance:', error); |
| | | } |