// 初始化远程黑名单面板 function initBlacklistsPanel() { // 加载远程黑名单列表 loadBlacklists(); // 初始化事件监听器 initBlacklistsEventListeners(); } // 初始化事件监听器 function initBlacklistsEventListeners() { // 添加黑名单按钮 document.getElementById('add-blacklist').addEventListener('click', addBlacklist); // 更新所有黑名单按钮 document.getElementById('update-all-blacklists').addEventListener('click', updateAllBlacklists); // 按Enter键添加黑名单 document.getElementById('blacklist-url').addEventListener('keypress', function(e) { if (e.key === 'Enter') { addBlacklist(); } }); } // 加载远程黑名单列表 function loadBlacklists() { const tbody = document.getElementById('blacklists-table').querySelector('tbody'); showLoading(tbody); apiRequest('/api/shield/blacklists') .then(data => { // 直接渲染返回的blacklists数组 renderBlacklists(data); }) .catch(error => { console.error('获取远程黑名单列表失败:', error); showError(tbody, '获取远程黑名单列表失败'); window.showNotification('获取远程黑名单列表失败', 'error'); }); } // 渲染远程黑名单表格 function renderBlacklists(blacklists) { const tbody = document.getElementById('blacklists-table').querySelector('tbody'); if (!tbody) return; if (!blacklists || blacklists.length === 0) { showEmpty(tbody, '暂无远程黑名单'); return; } tbody.innerHTML = ''; blacklists.forEach(list => { addBlacklistToTable(list); }); // 初始化表格排序 initTableSort('blacklists-table'); // 初始化操作按钮监听器 initBlacklistsActionListeners(); } // 添加黑名单到表格 function addBlacklistToTable(list) { const tbody = document.getElementById('blacklists-table').querySelector('tbody'); const row = document.createElement('tr'); const statusClass = list.status === 'success' ? 'status-success' : list.status === 'error' ? 'status-error' : 'status-pending'; const statusText = list.status === 'success' ? '正常' : list.status === 'error' ? '错误' : '等待中'; const lastUpdate = list.lastUpdate ? new Date(list.lastUpdate).toLocaleString() : '从未'; row.innerHTML = ` ${list.name} ${list.url} ${statusText} ${list.rulesCount || 0} ${lastUpdate} `; tbody.appendChild(row); } // 添加远程黑名单 function addBlacklist() { const nameInput = document.getElementById('blacklist-name'); const urlInput = document.getElementById('blacklist-url'); const name = nameInput.value.trim(); const url = urlInput.value.trim(); if (!name) { window.showNotification('请输入黑名单名称', 'warning'); nameInput.focus(); return; } if (!url) { window.showNotification('请输入黑名单URL', 'warning'); urlInput.focus(); return; } // 简单的URL格式验证 if (!isValidUrl(url)) { window.showNotification('请输入有效的URL', 'warning'); urlInput.focus(); return; } apiRequest('/api/shield/blacklists', 'POST', { name: name, url: url }) .then(data => { // 检查响应中是否有status字段 if (!data || typeof data === 'undefined') { window.showNotification('远程黑名单添加失败: 无效的响应', 'error'); return; } if (data.status === 'success') { window.showNotification('远程黑名单添加成功', 'success'); nameInput.value = ''; urlInput.value = ''; loadBlacklists(); } else { window.showNotification(`添加失败: ${data.message || '未知错误'}`, 'error'); } }) .catch(error => { console.error('添加远程黑名单失败:', error); window.showNotification('添加远程黑名单失败', 'error'); }); } // 更新远程黑名单 function updateBlacklist(id) { apiRequest(`/api/shield/blacklists/${id}/update`, 'POST') .then(data => { // 检查响应中是否有status字段 if (!data || typeof data === 'undefined') { window.showNotification('远程黑名单更新失败: 无效的响应', 'error'); return; } if (data.status === 'success') { window.showNotification('远程黑名单更新成功', 'success'); loadBlacklists(); } else { window.showNotification(`更新失败: ${data.message || '未知错误'}`, 'error'); } }) .catch(error => { console.error('更新远程黑名单失败:', error); window.showNotification('更新远程黑名单失败', 'error'); }); } // 更新所有远程黑名单 function updateAllBlacklists() { confirmAction( '确定要更新所有远程黑名单吗?这可能需要一些时间。', () => { apiRequest('/api/shield/blacklists', 'PUT') .then(data => { // 检查响应中是否有status字段 if (!data || typeof data === 'undefined') { window.showNotification('所有远程黑名单更新失败: 无效的响应', 'error'); return; } if (data.status === 'success') { window.showNotification('所有远程黑名单更新成功', 'success'); loadBlacklists(); } else { window.showNotification(`更新失败: ${data.message || '未知错误'}`, 'error'); } }) .catch(error => { console.error('更新所有远程黑名单失败:', error); window.showNotification('更新所有远程黑名单失败', 'error'); }); } ); } // 删除远程黑名单 function deleteBlacklist(id) { apiRequest(`/api/shield/blacklists/${id}`, 'DELETE') .then(data => { // 检查响应中是否有status字段 if (!data || typeof data === 'undefined') { window.showNotification('远程黑名单删除失败: 无效的响应', 'error'); return; } if (data.status === 'success') { window.showNotification('远程黑名单删除成功', 'success'); loadBlacklists(); } else { window.showNotification(`删除失败: ${data.message || '未知错误'}`, 'error'); } }) .catch(error => { console.error('删除远程黑名单失败:', error); window.showNotification('删除远程黑名单失败', 'error'); }); } // 为操作按钮添加事件监听器 function initBlacklistsActionListeners() { // 更新按钮 document.querySelectorAll('.update-blacklist').forEach(button => { button.addEventListener('click', function() { const id = this.getAttribute('data-id'); updateBlacklist(id); }); }); // 删除按钮 document.querySelectorAll('.delete-blacklist').forEach(button => { button.addEventListener('click', function() { const id = this.getAttribute('data-id'); confirmAction( '确定要删除这条远程黑名单吗?', () => deleteBlacklist(id) ); }); }); } // 验证URL格式 function isValidUrl(url) { try { new URL(url); return true; } catch (e) { return false; } }