fix(web): 审核回归 — 5 项修复 (渠道写入丢失/斗鱼WS生命周期/归属校验/恢复订阅/画像key稳定)
B1 routers/huya.py: 批量 Web 登录 login_channel/status 回填在 helper 内部 commit 之后赋值且未再提交 → 丢失; 补 db.commit() 并统一 status=active B2 routers/login.py + services/login_service.py: 斗鱼登录 WS 断线即 pop 批次, 刷新后无法重连订阅 → 对齐虎牙模式 (BatchRegistry.mark_finished, 仅结束后清理) B3 routers/login.py: WS 增加批次归属校验 (非 view_all 仅可订阅自建批次) S1 LoginTasksPage: effectiveBatchId 从任务列表推导活跃批次, 刷新后停止按钮/ 日志订阅自动恢复 S4 services/huya_service.py: username 仅在为空时回填, 防止 udb_passport 覆盖 登录名导致一号一设备绑定 key 漂移 验证: 77 后端单测 OK; tsc + vite build OK
This commit is contained in:
@@ -185,6 +185,10 @@ def stop_batch(
|
||||
):
|
||||
batch = batch_registry.get(batch_id)
|
||||
if batch:
|
||||
if batch.get("finished"):
|
||||
# 已结束但 WS 尚未清理(或从未有 WS 订阅):回收注册表条目。
|
||||
batch_registry.pop(batch_id)
|
||||
raise HTTPException(status_code=404, detail="批次已结束")
|
||||
batch["runner"].stop()
|
||||
return {"message": "已发送停止信号", "success": True}
|
||||
raise HTTPException(status_code=404, detail="批次不存在或已结束")
|
||||
@@ -199,6 +203,21 @@ async def ws_login_logs(websocket: WebSocket, batch_id: str):
|
||||
await websocket.close(code=1008, reason="未授权")
|
||||
return
|
||||
|
||||
# 归属校验:非 view_all 只能订阅自己创建的批次(与虎牙批次一致)。
|
||||
if not user_has_permission(user, "login:view_all"):
|
||||
check_db = SessionLocal()
|
||||
try:
|
||||
owned = (
|
||||
check_db.query(LoginTask.id)
|
||||
.filter(LoginTask.batch_id == batch_id, LoginTask.created_by == user.id)
|
||||
.first()
|
||||
)
|
||||
finally:
|
||||
check_db.close()
|
||||
if not owned:
|
||||
await websocket.close(code=1008, reason="无权访问该任务批次")
|
||||
return
|
||||
|
||||
await websocket.accept()
|
||||
|
||||
# 从已注册的批次中获取 log_queue(由 create_batch 创建)
|
||||
@@ -224,4 +243,7 @@ async def ws_login_logs(websocket: WebSocket, batch_id: str):
|
||||
except WebSocketDisconnect:
|
||||
pass
|
||||
finally:
|
||||
batch_registry.pop(batch_id)
|
||||
# 只在批次真正结束后清理注册表,客户端断线/刷新页面后重连仍可继续订阅。
|
||||
latest = batch_registry.get(batch_id)
|
||||
if latest and latest.get("finished"):
|
||||
batch_registry.pop(batch_id)
|
||||
|
||||
Reference in New Issue
Block a user