全面清理冗余与过度分层
后端优化: - 合并 api/routes/stats.py 到 api/routes/proxies.py,统计接口变更为 /api/proxies/stats - 内联 services/settings_service.py:settings.py 和 scheduler.py 直接使用 SettingsRepository - 简化 repositories/proxy_repo.py:提取 _row_to_proxy 辅助函数,消除重复构造代码 - 更新 api/lifespan.py 和 api/deps.py,移除对 settings_service 的依赖 - 从 requirements.txt 移除 websockets 依赖(已废弃的 WebSocket 功能残留) 前端适配: - 更新 frontend/src/api/index.js:stats 接口路径同步为 /api/proxies/stats - 清理 api/index.js 中未使用的 createRequestConfig 和多余 JSDoc 注释 脚本优化: - 移除 script/stop.bat 末尾的 pause,避免自动化调用时挂起
This commit is contained in:
@@ -43,11 +43,8 @@ api.interceptors.response.use(
|
||||
}
|
||||
)
|
||||
|
||||
/**
|
||||
* 清理请求参数,移除 null/undefined/空字符串
|
||||
* @param {object} params
|
||||
* @returns {object}
|
||||
*/
|
||||
// ==================== API 模块 ====================
|
||||
|
||||
function cleanParams(params) {
|
||||
const cleaned = {}
|
||||
Object.keys(params).forEach((key) => {
|
||||
@@ -59,52 +56,20 @@ function cleanParams(params) {
|
||||
return cleaned
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成请求配置,支持 AbortSignal
|
||||
* @param {AbortSignal} [signal]
|
||||
* @returns {object}
|
||||
*/
|
||||
function createRequestConfig(signal) {
|
||||
return signal ? { signal } : {}
|
||||
}
|
||||
|
||||
// ==================== API 模块 ====================
|
||||
|
||||
export const statsAPI = {
|
||||
/** @returns {Promise<import('./types').ApiResponse<import('./types').StatsData>>} */
|
||||
getStats: () => api.get('/api/stats')
|
||||
getStats: () => api.get('/api/proxies/stats')
|
||||
}
|
||||
|
||||
export const proxiesAPI = {
|
||||
/**
|
||||
* @param {object} params
|
||||
* @param {AbortSignal} [signal]
|
||||
* @returns {Promise<import('./types').ApiResponse<import('./types').ProxyListData>>}
|
||||
*/
|
||||
getProxies: (params, signal) =>
|
||||
api.post('/api/proxies', cleanParams(params), createRequestConfig(signal)),
|
||||
api.post('/api/proxies', cleanParams(params), signal ? { signal } : {}),
|
||||
|
||||
/**
|
||||
* @param {string} ip
|
||||
* @param {number|string} port
|
||||
* @returns {Promise<import('./types').ApiResponse<any>>}
|
||||
*/
|
||||
deleteProxy: (ip, port) => api.delete(`/api/proxies/${ip}/${port}`),
|
||||
|
||||
/**
|
||||
* @param {Array<[string, number|string]>} proxies
|
||||
* @returns {Promise<import('./types').ApiResponse<{deleted_count: number}>>}
|
||||
*/
|
||||
batchDeleteProxies: (proxies) => api.post('/api/proxies/batch-delete', { proxies }),
|
||||
|
||||
/** @returns {Promise<import('./types').ApiResponse<{deleted_count: number}>>} */
|
||||
cleanInvalidProxies: () => api.delete('/api/proxies/clean-invalid'),
|
||||
|
||||
/**
|
||||
* @param {string} format
|
||||
* @param {string|null} protocol
|
||||
* @returns {Promise<Blob>}
|
||||
*/
|
||||
exportProxies: (format, protocol) => api.get(`/api/proxies/export/${format}`, {
|
||||
params: protocol ? { protocol } : {},
|
||||
responseType: 'blob'
|
||||
@@ -112,48 +77,21 @@ export const proxiesAPI = {
|
||||
}
|
||||
|
||||
export const pluginsAPI = {
|
||||
/** @returns {Promise<import('./types').ApiResponse<{plugins: import('./types').Plugin[] }>>} */
|
||||
getPlugins: () => api.get('/api/plugins'),
|
||||
|
||||
/**
|
||||
* @param {string|number} pluginId
|
||||
* @param {boolean} enabled
|
||||
* @returns {Promise<import('./types').ApiResponse<any>>}
|
||||
*/
|
||||
togglePlugin: (pluginId, enabled) => api.put(`/api/plugins/${pluginId}/toggle`, { enabled }),
|
||||
|
||||
/**
|
||||
* @param {string|number} pluginId
|
||||
* @returns {Promise<import('./types').ApiResponse<any>>}
|
||||
*/
|
||||
crawlPlugin: (pluginId) => api.post(`/api/plugins/${pluginId}/crawl`),
|
||||
|
||||
/** @returns {Promise<import('./types').ApiResponse<any>>} */
|
||||
crawlAll: () => api.post('/api/plugins/crawl-all')
|
||||
}
|
||||
|
||||
export const schedulerAPI = {
|
||||
/** @returns {Promise<import('./types').ApiResponse<{running: boolean}>>} */
|
||||
start: () => api.post('/api/scheduler/start'),
|
||||
|
||||
/** @returns {Promise<import('./types').ApiResponse<{running: boolean}>>} */
|
||||
stop: () => api.post('/api/scheduler/stop'),
|
||||
|
||||
/** @returns {Promise<import('./types').ApiResponse<{started: boolean}>>} */
|
||||
validateNow: () => api.post('/api/scheduler/validate-now'),
|
||||
|
||||
/** @returns {Promise<import('./types').ApiResponse<{running: boolean, interval_minutes: number}>>} */
|
||||
getStatus: () => api.get('/api/scheduler/status')
|
||||
}
|
||||
|
||||
export const settingsAPI = {
|
||||
/** @returns {Promise<import('./types').ApiResponse<import('./types').SettingsData>>} */
|
||||
getSettings: () => api.get('/api/settings'),
|
||||
|
||||
/**
|
||||
* @param {object} data
|
||||
* @returns {Promise<import('./types').ApiResponse<any>>}
|
||||
*/
|
||||
saveSettings: (data) => api.post('/api/settings', data)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user