Update public/index.html
Browse files- public/index.html +30 -4
public/index.html
CHANGED
@@ -797,6 +797,7 @@
|
|
797 |
document.getElementById('loginButton').style.display = 'none';
|
798 |
document.getElementById('logoutButton').style.display = 'block';
|
799 |
updateActionButtons(true);
|
|
|
800 |
} else {
|
801 |
console.log('登录失败:', data.message);
|
802 |
loginError.textContent = data.message || '登录失败';
|
@@ -831,6 +832,7 @@
|
|
831 |
document.getElementById('loginButton').style.display = 'block';
|
832 |
document.getElementById('logoutButton').style.display = 'none';
|
833 |
updateActionButtons(false);
|
|
|
834 |
})
|
835 |
.catch(error => {
|
836 |
hideLoading();
|
@@ -840,6 +842,7 @@
|
|
840 |
document.getElementById('loginButton').style.display = 'block';
|
841 |
document.getElementById('logoutButton').style.display = 'none';
|
842 |
updateActionButtons(false);
|
|
|
843 |
});
|
844 |
} else {
|
845 |
console.log('本地无 token,直接设置为未登录');
|
@@ -847,6 +850,7 @@
|
|
847 |
document.getElementById('loginButton').style.display = 'block';
|
848 |
document.getElementById('logoutButton').style.display = 'none';
|
849 |
updateActionButtons(false);
|
|
|
850 |
}
|
851 |
}
|
852 |
|
@@ -878,7 +882,7 @@
|
|
878 |
console.log('页面加载完成,开始检查登录状态');
|
879 |
await checkLoginStatus();
|
880 |
console.log('登录状态检查完成,初始化数据');
|
881 |
-
initialize();
|
882 |
};
|
883 |
|
884 |
// 二次确认弹窗逻辑
|
@@ -911,7 +915,13 @@
|
|
911 |
async function getUsernames() {
|
912 |
try {
|
913 |
showLoading();
|
914 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
915 |
const config = await response.json();
|
916 |
hideLoading();
|
917 |
const usernamesList = config.usernames ? config.usernames.split(',').map(name => name.trim()).filter(name => name) : [];
|
@@ -937,13 +947,26 @@
|
|
937 |
async function fetchInstances() {
|
938 |
try {
|
939 |
showLoading();
|
940 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
941 |
const instances = await response.json();
|
|
|
942 |
hideLoading();
|
|
|
|
|
|
|
943 |
return instances;
|
944 |
} catch (error) {
|
945 |
hideLoading();
|
946 |
console.error("获取实例列表失败:", error);
|
|
|
947 |
return [];
|
948 |
}
|
949 |
}
|
@@ -962,7 +985,10 @@
|
|
962 |
|
963 |
this.subscribedInstances = new Set(subscribedInstances);
|
964 |
const instancesParam = Array.from(this.subscribedInstances).join(',');
|
965 |
-
const
|
|
|
|
|
|
|
966 |
this.eventSource = new EventSource(url);
|
967 |
|
968 |
this.eventSource.addEventListener("metric", (event) => {
|
|
|
797 |
document.getElementById('loginButton').style.display = 'none';
|
798 |
document.getElementById('logoutButton').style.display = 'block';
|
799 |
updateActionButtons(true);
|
800 |
+
refreshData(); // 登录成功后刷新数据以显示所有实例包括 private
|
801 |
} else {
|
802 |
console.log('登录失败:', data.message);
|
803 |
loginError.textContent = data.message || '登录失败';
|
|
|
832 |
document.getElementById('loginButton').style.display = 'block';
|
833 |
document.getElementById('logoutButton').style.display = 'none';
|
834 |
updateActionButtons(false);
|
835 |
+
refreshData(); // 登出后刷新数据以隐藏 private 实例
|
836 |
})
|
837 |
.catch(error => {
|
838 |
hideLoading();
|
|
|
842 |
document.getElementById('loginButton').style.display = 'block';
|
843 |
document.getElementById('logoutButton').style.display = 'none';
|
844 |
updateActionButtons(false);
|
845 |
+
refreshData(); // 登出后刷新数据以隐藏 private 实例
|
846 |
});
|
847 |
} else {
|
848 |
console.log('本地无 token,直接设置为未登录');
|
|
|
850 |
document.getElementById('loginButton').style.display = 'block';
|
851 |
document.getElementById('logoutButton').style.display = 'none';
|
852 |
updateActionButtons(false);
|
853 |
+
refreshData(); // 登出后刷新数据以隐藏 private 实例
|
854 |
}
|
855 |
}
|
856 |
|
|
|
882 |
console.log('页面加载完成,开始检查登录状态');
|
883 |
await checkLoginStatus();
|
884 |
console.log('登录状态检查完成,初始化数据');
|
885 |
+
await initialize();
|
886 |
};
|
887 |
|
888 |
// 二次确认弹窗逻辑
|
|
|
915 |
async function getUsernames() {
|
916 |
try {
|
917 |
showLoading();
|
918 |
+
const token = localStorage.getItem('authToken');
|
919 |
+
const headers = {};
|
920 |
+
if (token) {
|
921 |
+
headers['Authorization'] = `Bearer ${token}`;
|
922 |
+
console.log('getUsernames 请求中附加 Token:', token.slice(0, 8) + '...');
|
923 |
+
}
|
924 |
+
const response = await fetch('/api/config', { headers });
|
925 |
const config = await response.json();
|
926 |
hideLoading();
|
927 |
const usernamesList = config.usernames ? config.usernames.split(',').map(name => name.trim()).filter(name => name) : [];
|
|
|
947 |
async function fetchInstances() {
|
948 |
try {
|
949 |
showLoading();
|
950 |
+
const token = localStorage.getItem('authToken');
|
951 |
+
const headers = {};
|
952 |
+
if (token) {
|
953 |
+
headers['Authorization'] = `Bearer ${token}`;
|
954 |
+
console.log('fetchInstances 请求中附加 Token:', token.slice(0, 8) + '...');
|
955 |
+
} else {
|
956 |
+
console.log('无可用 Token,未附加 Authorization 头');
|
957 |
+
}
|
958 |
+
const response = await fetch('/api/proxy/spaces', { headers });
|
959 |
const instances = await response.json();
|
960 |
+
console.log('从后端获取的实例列表:', instances);
|
961 |
hideLoading();
|
962 |
+
if (instances.length === 0) {
|
963 |
+
alert('未获取到实例数据,可能是网络问题或数据暂不可用。');
|
964 |
+
}
|
965 |
return instances;
|
966 |
} catch (error) {
|
967 |
hideLoading();
|
968 |
console.error("获取实例列表失败:", error);
|
969 |
+
alert('获取实例列表失败,请稍后重试。');
|
970 |
return [];
|
971 |
}
|
972 |
}
|
|
|
985 |
|
986 |
this.subscribedInstances = new Set(subscribedInstances);
|
987 |
const instancesParam = Array.from(this.subscribedInstances).join(',');
|
988 |
+
const token = localStorage.getItem('authToken');
|
989 |
+
// 由于 EventSource 不支持直接设置 Authorization 头,这里通过查询参数传递 token
|
990 |
+
const url = `/api/proxy/live-metrics-stream?instances=${encodeURIComponent(instancesParam)}&token=${encodeURIComponent(token || '')}`;
|
991 |
+
console.log('SSE 连接 URL:', url.split('&token=')[0] + (token ? '&token=... (隐藏)' : '&token=空'));
|
992 |
this.eventSource = new EventSource(url);
|
993 |
|
994 |
this.eventSource.addEventListener("metric", (event) => {
|