feat(proxy): 添加动态代理支持

- 在代理获取逻辑中集成动态代理 API 调用
- 新增动态代理配置界面和 API 接口
- 扩展设置模型以支持动态代理参数
- 更新前端设置页面和 JavaScript 逻辑
This commit is contained in:
cnlimiter
2026-03-16 02:06:21 +08:00
parent 9dbb6e4e26
commit 97a8c01b9f
5 changed files with 242 additions and 5 deletions

View File

@@ -38,6 +38,9 @@ const elements = {
closeProxyModal: document.getElementById('close-proxy-modal'),
cancelProxyBtn: document.getElementById('cancel-proxy-btn'),
proxyModalTitle: document.getElementById('proxy-modal-title'),
// 动态代理设置
dynamicProxyForm: document.getElementById('dynamic-proxy-form'),
testDynamicProxyBtn: document.getElementById('test-dynamic-proxy-btn'),
// CPA 设置
cpaForm: document.getElementById('cpa-form'),
testCpaBtn: document.getElementById('test-cpa-btn'),
@@ -202,6 +205,14 @@ function initEventListeners() {
elements.proxyItemForm.addEventListener('submit', handleSaveProxyItem);
}
// 动态代理设置
if (elements.dynamicProxyForm) {
elements.dynamicProxyForm.addEventListener('submit', handleSaveDynamicProxy);
}
if (elements.testDynamicProxyBtn) {
elements.testDynamicProxyBtn.addEventListener('click', handleTestDynamicProxy);
}
// CPA 设置
if (elements.cpaForm) {
elements.cpaForm.addEventListener('submit', handleSaveCpa);
@@ -234,6 +245,12 @@ async function loadSettings() {
document.getElementById('proxy-port').value = data.proxy?.port || 7890;
document.getElementById('proxy-username').value = data.proxy?.username || '';
// 动态代理设置
document.getElementById('dynamic-proxy-enabled').checked = data.proxy?.dynamic_enabled || false;
document.getElementById('dynamic-proxy-api-url').value = data.proxy?.dynamic_api_url || '';
document.getElementById('dynamic-proxy-api-key-header').value = data.proxy?.dynamic_api_key_header || 'X-API-Key';
document.getElementById('dynamic-proxy-result-field').value = data.proxy?.dynamic_result_field || '';
// 注册配置
document.getElementById('max-retries').value = data.registration?.max_retries || 3;
document.getElementById('timeout').value = data.registration?.timeout || 120;
@@ -1000,3 +1017,52 @@ async function handleTestCpa() {
elements.testCpaBtn.textContent = '🔌 测试连接';
}
}
// ============== 动态代理设置 ==============
async function handleSaveDynamicProxy(e) {
e.preventDefault();
const data = {
enabled: document.getElementById('dynamic-proxy-enabled').checked,
api_url: document.getElementById('dynamic-proxy-api-url').value.trim(),
api_key: document.getElementById('dynamic-proxy-api-key').value || null,
api_key_header: document.getElementById('dynamic-proxy-api-key-header').value.trim() || 'X-API-Key',
result_field: document.getElementById('dynamic-proxy-result-field').value.trim()
};
try {
await api.post('/settings/proxy/dynamic', data);
toast.success('动态代理设置已保存');
document.getElementById('dynamic-proxy-api-key').value = '';
} catch (error) {
toast.error('保存失败: ' + error.message);
}
}
async function handleTestDynamicProxy() {
const apiUrl = document.getElementById('dynamic-proxy-api-url').value.trim();
if (!apiUrl) {
toast.warning('请先填写动态代理 API 地址');
return;
}
const btn = elements.testDynamicProxyBtn;
btn.disabled = true;
btn.textContent = '测试中...';
try {
const result = await api.post('/settings/proxy/dynamic/test', {
api_url: apiUrl,
api_key: document.getElementById('dynamic-proxy-api-key').value || null,
api_key_header: document.getElementById('dynamic-proxy-api-key-header').value.trim() || 'X-API-Key',
result_field: document.getElementById('dynamic-proxy-result-field').value.trim()
});
if (result.success) {
toast.success(result.message);
} else {
toast.error(result.message);
}
} catch (error) {
toast.error('测试失败: ' + error.message);
} finally {
btn.disabled = false;
btn.textContent = '🔌 测试动态代理';
}
}