初始化:分布式浏览器控制后台

This commit is contained in:
Your Name
2026-02-12 16:27:43 +08:00
commit 2e9ae4c7d7
25 changed files with 1930 additions and 0 deletions

82
server/models.py Normal file
View File

@@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
"""
Pydantic 数据模型 —— 用于 REST API 请求 / 响应以及内部状态。
"""
from __future__ import annotations
import time
import uuid
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
from common.protocol import TaskStatus, TaskType
# ────────────────────────── Worker ──────────────────────────
class BrowserProfile(BaseModel):
"""比特浏览器窗口信息Worker 上报)。"""
id: str
name: str = ""
remark: str = ""
class WorkerInfo(BaseModel):
"""一台 Worker 的运行时信息(内存中保存)。"""
worker_id: str
worker_name: str = ""
browsers: List[BrowserProfile] = []
online: bool = True
last_heartbeat: float = Field(default_factory=time.time)
connected_at: float = Field(default_factory=time.time)
current_task_id: Optional[str] = None
class WorkerOut(BaseModel):
"""返回给前端的 Worker 信息。"""
worker_id: str
worker_name: str
browsers: List[BrowserProfile]
online: bool
current_task_id: Optional[str] = None
# ────────────────────────── Task ──────────────────────────
class TaskCreate(BaseModel):
"""前端提交任务的请求体。"""
task_type: TaskType
worker_id: Optional[str] = None # 手动指定机器
account_name: Optional[str] = None # 按比特浏览器窗口名自动路由
params: Dict[str, Any] = {} # 任务参数(如 job_title, max_greet 等)
class TaskInfo(BaseModel):
"""任务完整信息(内存 / 返回前端)。"""
task_id: str = Field(default_factory=lambda: uuid.uuid4().hex[:12])
task_type: TaskType
status: TaskStatus = TaskStatus.PENDING
worker_id: Optional[str] = None
account_name: Optional[str] = None
params: Dict[str, Any] = {}
progress: Optional[str] = None # 最新进度描述
result: Any = None # 最终结果
error: Optional[str] = None
created_at: float = Field(default_factory=time.time)
updated_at: float = Field(default_factory=time.time)
class TaskOut(BaseModel):
"""返回给前端的任务信息。"""
task_id: str
task_type: TaskType
status: TaskStatus
worker_id: Optional[str] = None
account_name: Optional[str] = None
params: Dict[str, Any] = {}
progress: Optional[str] = None
result: Any = None
error: Optional[str] = None
created_at: float
updated_at: float