document.addEventListener('DOMContentLoaded', () => { const outputDiv = document.getElementById('output'); const startButton = document.getElementById('startButton'); const stopButton = document.getElementById('stopButton'); const addRuleButton = document.getElementById('addRuleButton'); const localPortInput = document.getElementById('localPort'); const remoteIPInput = document.getElementById('remoteIP'); const remotePortInput = document.getElementById('remotePort'); async function fetchForwardingRules() { try { const response = await fetch('/get_rules'); if (!response.ok) { throw new Error('获取规则失败:' + response.statusText); } const rules = await response.json(); const tbody = document.querySelector('#forwardingTable tbody'); tbody.innerHTML = ''; rules.forEach((rule, index) => { const [, localPort] = rule.Listen.split(':'); const lastColonIndex = rule.Remote.lastIndexOf(':'); const remoteIP = rule.Remote.substring(0, lastColonIndex); const remotePort = rule.Remote.substring(lastColonIndex + 1); const row = document.createElement('tr'); row.innerHTML = ` ${index + 1} ${localPort} ${remoteIP} ${remotePort} `; tbody.appendChild(row); }); // 为删除按钮添加事件监听 const deleteButtons = document.querySelectorAll('.delete-btn'); deleteButtons.forEach(button => { button.addEventListener('click', function() { const listenAddress = this.getAttribute('data-listen'); deleteRule(listenAddress); }); }); } catch (error) { console.error('请求失败:', error); outputDiv.textContent = '获取转发规则失败'; } } async function deleteRule(listenAddress) { try { const response = await fetch(`/delete_rule?listen=${encodeURIComponent(listenAddress)}`, { method: 'DELETE' }); if (!response.ok) { throw new Error('删除规则失败:' + response.statusText); } fetchForwardingRules(); // 重新获取规则列表 } catch (error) { console.error('删除规则失败:', error); outputDiv.textContent = '删除规则失败'; } } async function addRule() { const localPort = localPortInput.value; const remoteIP = remoteIPInput.value; const remotePort = remotePortInput.value; if (!localPort || !remoteIP || !remotePort) { outputDiv.textContent = '请填写所有字段'; return; } try { const response = await fetch('/add_rule', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ localPort, remoteIP, remotePort }) }); if (!response.ok) { throw new Error('添加规则失败:' + response.statusText); } fetchForwardingRules(); // 重新获取规则列表 } catch (error) { console.error('添加规则失败:', error); outputDiv.textContent = '添加规则失败'; } } startButton.addEventListener('click', async () => { try { const response = await fetch('/start_service', { method: 'POST' }); if (!response.ok) { throw new Error('启动服务失败:' + response.statusText); } const result = await response.json(); outputDiv.textContent = result.output; } catch (error) { console.error('启动服务失败:', error); outputDiv.textContent = '启动服务失败'; } }); stopButton.addEventListener('click', async () => { try { const response = await fetch('/stop_service', { method: 'POST' }); if (!response.ok) { throw new Error('停止服务失败:' + response.statusText); } const result = await response.json(); outputDiv.textContent = result.output; } catch (error) { console.error('停止服务失败:', error); outputDiv.textContent = '停止服务失败'; } }); addRuleButton.addEventListener('click', addRule); // 初始化时获取规则列表 fetchForwardingRules(); });