refactor: 补全services层+消除core/models.py冗余+修复network.py缩进错误
高优先级问题1 - Router层业务逻辑泄漏: - 新建 services/proxy_service.py: 从routers/proxy.py提取ProxyService类, 封装代理/白名单测试逻辑、全局状态管理、所有core/ import - 新建 services/account_service.py: 从routers/accounts.py提取 split_account_line、cookie_account_ids_query、parse_and_build_accounts, 封装core.douyu.email_verifier的import - 重写routers/proxy.py为薄HTTP/WS层,移除所有core/直接依赖 - 精简routers/accounts.py,从account_service导入业务函数 - 将_active_batches全局状态移入login_service.py的BatchRegistry类 - routers/login.py改为使用batch_registry单例 高优先级问题2 - 两套models.py冗余: - 删除core/models.py(Account dataclass + ProxyConfig死代码) - 在core/douyu/login.py新增AccountLike Protocol替代Account dataclass - login_service.py中Account(...)构造改为SimpleNamespace(...) - 清理core/__init__.py导出 附带修复: - core/geetest/common/network.py的get_picture()函数缩进错误 (缺少if match:块和data赋值语句)
This commit is contained in:
@@ -11,14 +11,10 @@ from ..models import User, Account, LoginTask, ProxyConfig as ProxyConfigModel
|
||||
from ..schemas import LoginBatchRequest, LoginTaskOut
|
||||
from ..deps import get_current_user, require_permission, authenticate_websocket
|
||||
from ..permissions import user_has_permission, get_user_permissions
|
||||
from ..services.login_service import LoginBatchRunner
|
||||
from ..services.login_service import LoginBatchRunner, batch_registry
|
||||
|
||||
router = APIRouter(prefix="/api/login", tags=["登录任务"])
|
||||
|
||||
# 运行中的批次: batch_id -> {log_queue, loop, runner}
|
||||
_active_batches: dict[str, dict] = {}
|
||||
_active_batches_lock = threading.Lock()
|
||||
|
||||
|
||||
@router.post("/batch")
|
||||
async def create_batch(
|
||||
@@ -68,13 +64,8 @@ async def create_batch(
|
||||
|
||||
batch_id = runner.batch_id
|
||||
|
||||
# 先注册到全局,再启动线程,确保 WebSocket 连接时能找到
|
||||
with _active_batches_lock:
|
||||
_active_batches[batch_id] = {
|
||||
"log_queue": log_queue,
|
||||
"loop": loop,
|
||||
"runner": runner,
|
||||
}
|
||||
# 先注册到批次注册表,再启动线程,确保 WebSocket 连接时能找到
|
||||
batch_registry.register(batch_id, log_queue, loop, runner)
|
||||
|
||||
# 启动线程
|
||||
thread = threading.Thread(target=runner.run, daemon=True)
|
||||
@@ -155,8 +146,7 @@ def stop_batch(
|
||||
batch_id: str,
|
||||
current: User = Depends(require_permission("login:batch")),
|
||||
):
|
||||
with _active_batches_lock:
|
||||
batch = _active_batches.get(batch_id)
|
||||
batch = batch_registry.get(batch_id)
|
||||
if batch:
|
||||
batch["runner"].stop()
|
||||
return {"message": "已发送停止信号", "success": True}
|
||||
@@ -175,8 +165,7 @@ async def ws_login_logs(websocket: WebSocket, batch_id: str):
|
||||
await websocket.accept()
|
||||
|
||||
# 从已注册的批次中获取 log_queue(由 create_batch 创建)
|
||||
with _active_batches_lock:
|
||||
batch = _active_batches.get(batch_id)
|
||||
batch = batch_registry.get(batch_id)
|
||||
if not batch:
|
||||
await websocket.send_json({"level": "error", "message": "批次不存在或已结束"})
|
||||
await websocket.close()
|
||||
@@ -198,5 +187,4 @@ async def ws_login_logs(websocket: WebSocket, batch_id: str):
|
||||
except WebSocketDisconnect:
|
||||
pass
|
||||
finally:
|
||||
with _active_batches_lock:
|
||||
_active_batches.pop(batch_id, None)
|
||||
batch_registry.pop(batch_id)
|
||||
|
||||
Reference in New Issue
Block a user