// 初始化配置管理面板 function initConfigPanel() { // 加载当前配置 loadConfig(); // 初始化事件监听器 initConfigEventListeners(); } // 初始化事件监听器 function initConfigEventListeners() { // 保存配置按钮 document.getElementById('save-config').addEventListener('click', saveConfig); // 屏蔽方法变更 document.getElementById('block-method').addEventListener('change', updateCustomBlockIpVisibility); } // 加载当前配置 function loadConfig() { apiRequest('/config') .then(config => { renderConfig(config); }) .catch(error => { console.error('获取配置失败:', error); window.showNotification('获取配置失败', 'error'); }); } // 渲染配置表单 function renderConfig(config) { if (!config) return; // 设置屏蔽方法 const blockMethodSelect = document.getElementById('block-method'); if (config.shield && config.shield.blockMethod) { blockMethodSelect.value = config.shield.blockMethod; } // 设置自定义屏蔽IP const customBlockIpInput = document.getElementById('custom-block-ip'); if (config.shield && config.shield.customBlockIP) { customBlockIpInput.value = config.shield.customBlockIP; } // 设置远程规则更新间隔 const updateIntervalInput = document.getElementById('update-interval'); if (config.shield && config.shield.updateInterval) { updateIntervalInput.value = config.shield.updateInterval; } // 更新自定义屏蔽IP的可见性 updateCustomBlockIpVisibility(); } // 更新自定义屏蔽IP输入框的可见性 function updateCustomBlockIpVisibility() { const blockMethod = document.getElementById('block-method').value; const customBlockIpContainer = document.getElementById('custom-block-ip').closest('.form-group'); if (blockMethod === 'customIP') { customBlockIpContainer.style.display = 'block'; } else { customBlockIpContainer.style.display = 'none'; } } // 保存配置 function saveConfig() { // 收集表单数据 const configData = { shield: { blockMethod: document.getElementById('block-method').value, updateInterval: parseInt(document.getElementById('update-interval').value) } }; // 如果选择了自定义IP,添加到配置中 if (configData.shield.blockMethod === 'customIP') { const customBlockIp = document.getElementById('custom-block-ip').value.trim(); // 验证自定义IP格式 if (!isValidIp(customBlockIp)) { window.showNotification('请输入有效的自定义屏蔽IP', 'warning'); return; } configData.shield.customBlockIP = customBlockIp; } // 验证更新间隔 if (isNaN(configData.shield.updateInterval) || configData.shield.updateInterval < 60) { window.showNotification('更新间隔必须大于等于60秒', 'warning'); return; } // 保存配置 apiRequest('/config', 'PUT', configData) .then(response => { if (response.success) { window.showNotification('配置保存成功', 'success'); // 询问是否需要重启服务以应用配置 confirmAction( '配置已保存。某些更改可能需要重启服务才能生效。是否现在重启服务?', () => restartService() ); } else { window.showNotification(`保存失败: ${response.message || '未知错误'}`, 'error'); } }) .catch(error => { console.error('保存配置失败:', error); window.showNotification('保存配置失败', 'error'); }); } // 重启服务 function restartService() { apiRequest('/service/restart', 'POST') .then(response => { if (response.success) { window.showNotification('服务正在重启,请稍后刷新页面', 'success'); // 等待几秒后重新加载页面 setTimeout(() => { location.reload(); }, 3000); } else { window.showNotification(`重启失败: ${response.message || '未知错误'}`, 'error'); } }) .catch(error => { console.error('重启服务失败:', error); // 重启服务可能会导致连接中断,这是正常的 window.showNotification('服务重启中,请手动刷新页面确认状态', 'info'); }); } // 验证IP地址格式 function isValidIp(ip) { // 支持IPv4和IPv6简单验证 const ipv4Regex = /^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$/; const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}$/; return ipv4Regex.test(ip) || ipv6Regex.test(ip); }