chore(web): 移除过时的socket调试与服务器状态监控代码
移除了登录页与后台管理页的服务器状态展示UI、public-status.js脚本引用,删除了index.js中的socket运行时日志上报逻辑与连接状态追踪代码,同时删除了用于排查socket polling 400问题的调试文档。
This commit is contained in:
@@ -1,26 +0,0 @@
|
|||||||
# [OPEN] debug-socket-polling-400
|
|
||||||
|
|
||||||
## 问题描述
|
|
||||||
- 生产环境后台页持续出现 Socket.IO polling 400。
|
|
||||||
- 浏览器控制台可见大量:
|
|
||||||
- `GET /socket.io/?EIO=4&transport=polling&sid=... 400`
|
|
||||||
- `POST /socket.io/?EIO=4&transport=polling&sid=... 400`
|
|
||||||
- 同时存在无关但可观察现象:
|
|
||||||
- `vue.global.js` 开发版提示
|
|
||||||
- `/favicon.ico` 404
|
|
||||||
|
|
||||||
## 已知现象
|
|
||||||
- 首次 `polling` 握手能拿到 `sid`,后续带 `sid` 的轮询请求失败。
|
|
||||||
- 失败后客户端持续重连,表现为“连接一下又断开”。
|
|
||||||
|
|
||||||
## 初始假设
|
|
||||||
- 假设 1:反向代理或负载均衡未做会话保持,导致同一个 `sid` 的后续请求落到不同后端实例。
|
|
||||||
- 假设 2:CDN/边缘代理对 `/socket.io/` 的长轮询处理不稳定,导致 `sid` 生命周期被中断。
|
|
||||||
- 假设 3:客户端当前传输策略触发了不兼容的重连路径,反复创建新 `sid` 又迅速失效。
|
|
||||||
- 假设 4:服务端 Engine.IO 对同一会话的请求顺序或超时异常敏感,导致后续 `GET/POST` 被判无效。
|
|
||||||
- 假设 5:`vue.global.js` 开发版提示和 `favicon.ico` 404 只是噪音,不是 Socket.IO 400 的主因。
|
|
||||||
|
|
||||||
## 当前计划
|
|
||||||
- 先继续收集线上现成证据,不改业务逻辑。
|
|
||||||
- 对比首次握手与后续 `sid` 请求是否稳定落到同一服务链路。
|
|
||||||
- 若证据仍指向服务端/代理层,再决定是否做最小客户端降级或服务端兼容修复。
|
|
||||||
+1
-20
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="zh-CN">
|
<html lang="zh-CN">
|
||||||
<!-- 充满未知和不稳定的票务系统! -->
|
<!-- 充满未知和不稳定的票务系统! -->
|
||||||
|
|
||||||
@@ -22,11 +22,6 @@
|
|||||||
<i class="fas fa-train"></i>
|
<i class="fas fa-train"></i>
|
||||||
<span>FSE 铁路运输后台系统</span>
|
<span>FSE 铁路运输后台系统</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="jr-top-status is-checking" data-server-status-root>
|
|
||||||
<span class="jr-top-status-label">服务器状态</span>
|
|
||||||
<span class="jr-top-status-dot"></span>
|
|
||||||
<span class="jr-top-status-value" data-server-status-value>检测中</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@@ -88,15 +83,6 @@
|
|||||||
<span class="nav-icon"><i class="fas fa-list"></i></span> 日志
|
<span class="nav-icon"><i class="fas fa-list"></i></span> 日志
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--连接状态显示-->
|
|
||||||
<div class="jr-admin-sidebar-status">
|
|
||||||
<div class="jr-admin-sidebar-status-label">Server: {{ connected ? 'Online' : 'Offline' }}</div>
|
|
||||||
<div class="flex" style="align-items: center; gap: 6px; margin-bottom: 15px;">
|
|
||||||
<i class="fas fa-circle"
|
|
||||||
:style="{ color: connected ? '#10b981' : '#ef4444', fontSize: '0.6rem' }"></i>
|
|
||||||
<span>Status: {{ connected ? 'Connected' : 'Disconnected' }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div v-if="sidebarOpen" class="sidebar-overlay" @click="sidebarOpen = false"></div>
|
<div v-if="sidebarOpen" class="sidebar-overlay" @click="sidebarOpen = false"></div>
|
||||||
|
|
||||||
@@ -120,10 +106,6 @@
|
|||||||
<span class="jr-admin-sync-label">最近同步</span>
|
<span class="jr-admin-sync-label">最近同步</span>
|
||||||
<strong>{{ lastSyncText }}</strong>
|
<strong>{{ lastSyncText }}</strong>
|
||||||
</div>
|
</div>
|
||||||
<span class="jr-admin-header-pill" :class="connected ? 'is-online' : 'is-offline'">
|
|
||||||
<i class="fas fa-circle"></i>
|
|
||||||
{{ connected ? '服务器在线' : '服务器离线' }}
|
|
||||||
</span>
|
|
||||||
<button class="btn primary" @click="refreshData" :disabled="isViewBusy">
|
<button class="btn primary" @click="refreshData" :disabled="isViewBusy">
|
||||||
<i class="fas" :class="isViewBusy ? 'fa-spinner fa-spin' : 'fa-rotate-right'"></i>
|
<i class="fas" :class="isViewBusy ? 'fa-spinner fa-spin' : 'fa-rotate-right'"></i>
|
||||||
{{ isViewBusy ? '同步中' : '刷新视图' }}
|
{{ isViewBusy ? '同步中' : '刷新视图' }}
|
||||||
@@ -932,7 +914,6 @@
|
|||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
<script src="/custom-dialog.js?v=12"></script>
|
<script src="/custom-dialog.js?v=12"></script>
|
||||||
<script src="/public-status.js?v=13"></script>
|
|
||||||
<script src="index.js?v=6"></script>
|
<script src="index.js?v=6"></script>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
|||||||
+1
-66
@@ -34,42 +34,9 @@ createApp({
|
|||||||
return map[currentView.value] || '票价图';
|
return map[currentView.value] || '票价图';
|
||||||
});
|
});
|
||||||
|
|
||||||
const connected = ref(false);
|
|
||||||
// Prefer polling first so admin remains connected even when the proxy
|
// Prefer polling first so admin remains connected even when the proxy
|
||||||
// does not support WebSocket upgrades reliably.
|
// does not support WebSocket upgrades reliably.
|
||||||
const socket = io({ transports: ['polling', 'websocket'] });
|
const socket = io({ transports: ['polling', 'websocket'] });
|
||||||
// #region debug-point socket-runtime-admin
|
|
||||||
const reportSocketRuntime = (type, detail = {}) => {
|
|
||||||
try {
|
|
||||||
const payload = JSON.stringify({
|
|
||||||
category: 'admin',
|
|
||||||
source: 'socket-runtime',
|
|
||||||
level: type.includes('error') ? 'error' : 'info',
|
|
||||||
type,
|
|
||||||
detail: {
|
|
||||||
page: location.pathname,
|
|
||||||
href: location.href,
|
|
||||||
online: navigator.onLine,
|
|
||||||
socket_id: socket.id || '',
|
|
||||||
connected: !!socket.connected,
|
|
||||||
transport: socket.io?.engine?.transport?.name || '',
|
|
||||||
...detail
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (navigator.sendBeacon) {
|
|
||||||
const blob = new Blob([payload], { type: 'application/json' });
|
|
||||||
navigator.sendBeacon('/api/log', blob);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fetch('/api/log', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: payload,
|
|
||||||
keepalive: true
|
|
||||||
}).catch(() => {});
|
|
||||||
} catch (_) {}
|
|
||||||
};
|
|
||||||
// #endregion
|
|
||||||
|
|
||||||
// Data State
|
// Data State
|
||||||
const stations = ref([]);
|
const stations = ref([]);
|
||||||
@@ -1386,38 +1353,6 @@ createApp({
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Socket Listeners
|
// Socket Listeners
|
||||||
// #region debug-point socket-runtime-admin
|
|
||||||
socket.on('connect', () => {
|
|
||||||
connected.value = true;
|
|
||||||
reportSocketRuntime('socket_connect');
|
|
||||||
});
|
|
||||||
socket.on('disconnect', (reason) => {
|
|
||||||
connected.value = false;
|
|
||||||
reportSocketRuntime('socket_disconnect', { reason: reason || '' });
|
|
||||||
});
|
|
||||||
socket.on('connect_error', (error) => {
|
|
||||||
reportSocketRuntime('socket_connect_error', {
|
|
||||||
message: error?.message || '',
|
|
||||||
description: error?.description || '',
|
|
||||||
context: error?.context || null
|
|
||||||
});
|
|
||||||
});
|
|
||||||
if (socket.io) {
|
|
||||||
socket.io.on('reconnect_attempt', (attempt) => {
|
|
||||||
reportSocketRuntime('socket_reconnect_attempt', { attempt: Number(attempt) || 0 });
|
|
||||||
});
|
|
||||||
socket.io.on('reconnect_error', (error) => {
|
|
||||||
reportSocketRuntime('socket_reconnect_error', {
|
|
||||||
message: error?.message || '',
|
|
||||||
description: error?.description || ''
|
|
||||||
});
|
|
||||||
});
|
|
||||||
socket.io.on('reconnect_failed', () => {
|
|
||||||
reportSocketRuntime('socket_reconnect_failed');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// #endregion
|
|
||||||
|
|
||||||
socket.on('stations:updated', (data) => {
|
socket.on('stations:updated', (data) => {
|
||||||
stations.value = data;
|
stations.value = data;
|
||||||
// Refresh map when stations change
|
// Refresh map when stations change
|
||||||
@@ -1618,7 +1553,7 @@ createApp({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
currentView, viewTitle, connected, sidebarOpen,
|
currentView, viewTitle, sidebarOpen,
|
||||||
loadingState, isViewBusy, lastSyncText, currentViewSummary,
|
loadingState, isViewBusy, lastSyncText, currentViewSummary,
|
||||||
stations, lines, fares, stats, config, recentLogs, ticketList,
|
stations, lines, fares, stats, config, recentLogs, ticketList,
|
||||||
logs, logCategory, logTypeFilter, logQuery, logMax, logLoading, fetchLogs,
|
logs, logCategory, logTypeFilter, logQuery, logMax, logLoading, fetchLogs,
|
||||||
|
|||||||
@@ -15,11 +15,6 @@
|
|||||||
<a href="/" class="jr-top-link">
|
<a href="/" class="jr-top-link">
|
||||||
<span>FSE铁路票务系统控制台</span>
|
<span>FSE铁路票务系统控制台</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="jr-top-status is-checking" data-server-status-root>
|
|
||||||
<span class="jr-top-status-label">服务器状态</span>
|
|
||||||
<span class="jr-top-status-dot"></span>
|
|
||||||
<span class="jr-top-status-value" data-server-status-value>检测中</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@@ -70,9 +65,7 @@
|
|||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
<script src="/custom-dialog.js?v=12"></script>
|
<script src="/custom-dialog.js?v=12"></script>
|
||||||
<script src="/public-status.js?v=13"></script>
|
|
||||||
<script src="login.js?v=2"></script>
|
<script src="login.js?v=2"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user