优化任务列表性能和本地登录代理
This commit is contained in:
@@ -4,7 +4,8 @@ import asyncio
|
||||
import threading
|
||||
from datetime import datetime
|
||||
from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session, defer
|
||||
|
||||
from ..database import get_db, SessionLocal
|
||||
from ..models import User, Account, LoginTask, ProxyConfig as ProxyConfigModel
|
||||
@@ -16,6 +17,23 @@ from ..services.login_service import LoginBatchRunner, batch_registry
|
||||
router = APIRouter(prefix="/api/login", tags=["登录任务"])
|
||||
|
||||
|
||||
def _login_task_summary(query):
|
||||
"""按状态汇总登录任务,避免概览页拉完整任务列表。"""
|
||||
rows = (
|
||||
query.order_by(None)
|
||||
.with_entities(LoginTask.status, func.count(LoginTask.id))
|
||||
.group_by(LoginTask.status)
|
||||
.all()
|
||||
)
|
||||
status_counts = {status or "": count for status, count in rows}
|
||||
return {
|
||||
"total": sum(status_counts.values()),
|
||||
"success": status_counts.get("success", 0),
|
||||
"failed": sum(status_counts.get(status, 0) for status in ("failed", "error")),
|
||||
"status_counts": status_counts,
|
||||
}
|
||||
|
||||
|
||||
@router.post("/batch")
|
||||
async def create_batch(
|
||||
req: LoginBatchRequest,
|
||||
@@ -84,7 +102,7 @@ def list_tasks(
|
||||
current: User = Depends(get_current_user),
|
||||
):
|
||||
"""查看登录任务列表。"""
|
||||
query = db.query(LoginTask).join(Account, LoginTask.account_id == Account.id)
|
||||
query = db.query(LoginTask).options(defer(LoginTask.cookie)).join(Account, LoginTask.account_id == Account.id)
|
||||
|
||||
# 客服只能看自己账号的任务
|
||||
if not user_has_permission(current, "login:view_all"):
|
||||
@@ -106,12 +124,24 @@ def list_tasks(
|
||||
result.append(LoginTaskOut(
|
||||
id=t.id, batch_id=t.batch_id, account_id=t.account_id,
|
||||
account_username=accounts_map.get(t.account_id, ""),
|
||||
status=t.status, cookie=t.cookie or "", message=t.message or "",
|
||||
status=t.status, cookie="", message=t.message or "",
|
||||
created_by=t.created_by, created_at=t.created_at, finished_at=t.finished_at,
|
||||
))
|
||||
return result
|
||||
|
||||
|
||||
@router.get("/tasks/summary")
|
||||
def tasks_summary(
|
||||
db: Session = Depends(get_db),
|
||||
current: User = Depends(get_current_user),
|
||||
):
|
||||
"""登录任务统计。"""
|
||||
query = db.query(LoginTask).join(Account, LoginTask.account_id == Account.id)
|
||||
if not user_has_permission(current, "login:view_all"):
|
||||
query = query.filter(Account.assigned_to == current.id)
|
||||
return _login_task_summary(query)
|
||||
|
||||
|
||||
@router.delete("/tasks/{task_id}")
|
||||
def delete_task(
|
||||
task_id: int,
|
||||
|
||||
Reference in New Issue
Block a user