/** * HTTP代理管理模块 */ const httpProxyManager = { currentConfig: {}, // 初始化代理管理 init: async function() { try { console.log('初始化HTTP代理管理...'); await this.loadProxyStatus(); this.bindEvents(); return Promise.resolve(); } catch (error) { console.error('初始化HTTP代理管理失败:', error); } }, // 加载代理状态 loadProxyStatus: async function() { try { const response = await fetch('/api/httpProxy/proxy/status'); if (!response.ok) { throw new Error('获取代理状态失败'); } const status = await response.json(); this.updateStatusDisplay(status); // 加载配置 const configResponse = await fetch('/api/httpProxy/proxy/config'); if (configResponse.ok) { const configData = await configResponse.json(); this.currentConfig = configData.config || {}; this.updateConfigForm(); } } catch (error) { console.error('加载代理状态失败:', error); this.updateStatusDisplay({ isRunning: false, error: error.message }); } }, // 更新状态显示 updateStatusDisplay: function(status) { const statusElement = document.getElementById('proxyStatus'); const statusBadge = document.getElementById('proxyStatusBadge'); const portInfo = document.getElementById('proxyPortInfo'); if (statusElement) { if (status.isRunning) { statusElement.textContent = '运行中'; statusElement.className = 'status-running'; if (statusBadge) { statusBadge.textContent = '运行中'; statusBadge.className = 'badge badge-success'; } } else { statusElement.textContent = '已停止'; statusElement.className = 'status-stopped'; if (statusBadge) { statusBadge.textContent = '已停止'; statusBadge.className = 'badge badge-secondary'; } } } if (portInfo && status.config) { portInfo.textContent = `${status.config.host}:${status.config.port}`; } }, // 更新配置表单 updateConfigForm: function() { if (!this.currentConfig) return; const elements = { 'proxy-port': this.currentConfig.port || 8080, 'proxy-host': this.currentConfig.host || '0.0.0.0', 'proxy-enable-https': this.currentConfig.enableHttps || false, 'proxy-enable-auth': this.currentConfig.enableAuth || false, 'proxy-username': this.currentConfig.username || '', 'proxy-password': this.currentConfig.password || '', 'proxy-log-requests': this.currentConfig.logRequests !== false }; for (const [id, value] of Object.entries(elements)) { const element = document.getElementById(id); if (element) { if (element.type === 'checkbox') { element.checked = Boolean(value); } else { element.value = value; } } } // 更新允许和阻止的主机列表 this.updateHostLists(); }, // 更新主机列表显示 updateHostLists: function() { const allowedList = document.getElementById('allowedHostsList'); const blockedList = document.getElementById('blockedHostsList'); if (allowedList && this.currentConfig.allowedHosts) { allowedList.innerHTML = this.currentConfig.allowedHosts .map(host => `${host} `) .join(''); } if (blockedList && this.currentConfig.blockedHosts) { blockedList.innerHTML = this.currentConfig.blockedHosts .map(host => `${host} `) .join(''); } }, // 绑定事件 bindEvents: function() { // 启动代理按钮 const startBtn = document.getElementById('startProxyBtn'); if (startBtn) { startBtn.addEventListener('click', () => this.startProxy()); } // 停止代理按钮 const stopBtn = document.getElementById('stopProxyBtn'); if (stopBtn) { stopBtn.addEventListener('click', () => this.stopProxy()); } // 保存配置按钮 const saveBtn = document.getElementById('saveProxyConfigBtn'); if (saveBtn) { saveBtn.addEventListener('click', () => this.saveConfig()); } // 测试代理按钮 const testBtn = document.getElementById('testProxyBtn'); if (testBtn) { testBtn.addEventListener('click', () => this.testProxy()); } // 添加允许主机 const addAllowedBtn = document.getElementById('addAllowedHostBtn'); if (addAllowedBtn) { addAllowedBtn.addEventListener('click', () => this.addAllowedHost()); } // 添加阻止主机 const addBlockedBtn = document.getElementById('addBlockedHostBtn'); if (addBlockedBtn) { addBlockedBtn.addEventListener('click', () => this.addBlockedHost()); } }, // 启动代理 startProxy: async function() { try { const config = this.getConfigFromForm(); const response = await fetch('/api/httpProxy/proxy/start', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config) }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || '启动失败'); } const result = await response.json(); core.showAlert('代理服务启动成功', 'success'); this.updateStatusDisplay(result.status); } catch (error) { console.error('启动代理失败:', error); core.showAlert('启动代理失败: ' + error.message, 'error'); } }, // 停止代理 stopProxy: async function() { try { const response = await fetch('/api/httpProxy/proxy/stop', { method: 'POST' }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || '停止失败'); } const result = await response.json(); core.showAlert('代理服务已停止', 'success'); this.updateStatusDisplay(result.status); } catch (error) { console.error('停止代理失败:', error); core.showAlert('停止代理失败: ' + error.message, 'error'); } }, // 保存配置 saveConfig: async function() { try { const config = this.getConfigFromForm(); const response = await fetch('/api/httpProxy/proxy/config', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config) }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || '保存配置失败'); } const result = await response.json(); this.currentConfig = config; core.showAlert('代理配置已保存', 'success'); this.updateStatusDisplay(result.status); } catch (error) { console.error('保存配置失败:', error); core.showAlert('保存配置失败: ' + error.message, 'error'); } }, // 测试代理 testProxy: async function() { try { const testUrl = document.getElementById('proxyTestUrl')?.value || 'http://httpbin.org/ip'; const response = await fetch('/api/httpProxy/proxy/test', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ testUrl }) }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || '测试失败'); } const result = await response.json(); core.showAlert(`代理测试成功 (${result.responseTime})`, 'success'); } catch (error) { console.error('代理测试失败:', error); core.showAlert('代理测试失败: ' + error.message, 'error'); } }, // 从表单获取配置 getConfigFromForm: function() { return { port: parseInt(document.getElementById('proxy-port')?.value) || 8080, host: document.getElementById('proxy-host')?.value || '0.0.0.0', enableHttps: document.getElementById('proxy-enable-https')?.checked || false, enableAuth: document.getElementById('proxy-enable-auth')?.checked || false, username: document.getElementById('proxy-username')?.value || '', password: document.getElementById('proxy-password')?.value || '', logRequests: document.getElementById('proxy-log-requests')?.checked !== false, allowedHosts: this.currentConfig.allowedHosts || [], blockedHosts: this.currentConfig.blockedHosts || [] }; }, // 添加允许的主机 addAllowedHost: function() { const input = document.getElementById('newAllowedHost'); const host = input?.value?.trim(); if (host && !this.currentConfig.allowedHosts?.includes(host)) { if (!this.currentConfig.allowedHosts) { this.currentConfig.allowedHosts = []; } this.currentConfig.allowedHosts.push(host); this.updateHostLists(); input.value = ''; } }, // 移除允许的主机 removeAllowedHost: function(host) { if (this.currentConfig.allowedHosts) { this.currentConfig.allowedHosts = this.currentConfig.allowedHosts.filter(h => h !== host); this.updateHostLists(); } }, // 添加阻止的主机 addBlockedHost: function() { const input = document.getElementById('newBlockedHost'); const host = input?.value?.trim(); if (host && !this.currentConfig.blockedHosts?.includes(host)) { if (!this.currentConfig.blockedHosts) { this.currentConfig.blockedHosts = []; } this.currentConfig.blockedHosts.push(host); this.updateHostLists(); input.value = ''; } }, // 移除阻止的主机 removeBlockedHost: function(host) { if (this.currentConfig.blockedHosts) { this.currentConfig.blockedHosts = this.currentConfig.blockedHosts.filter(h => h !== host); this.updateHostLists(); } } }; // 全局公开模块 window.httpProxyManager = httpProxyManager;