Files
boss_dp/server/api/accounts.py
Your Name 0ac1e9549c 哈哈
2026-02-14 16:49:44 +08:00

81 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""
BOSS 账号 API需要登录
- POST /api/accounts -> 添加账号(绑定环境名称到电脑)
- GET /api/accounts -> 查询所有账号(含电脑名称、在线、任务状态)
- GET /api/accounts/{id} -> 查询单个账号详情
- DELETE /api/accounts/{id} -> 删除账号
检测登录等操作统一通过 POST /api/tasks 提交task_type 传 check_login 即可。
"""
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from server.models import BossAccount
from server.serializers import BossAccountSerializer, AccountBindSerializer
from server.core.worker_manager import worker_manager
# ────────────────────────── 内部工具 ──────────────────────────
def _enrich(account: BossAccount) -> dict:
"""为账号实例补充电脑名称和电脑在线状态。"""
data = BossAccountSerializer(account).data
w = worker_manager.get_worker(account.worker_id)
data["worker_name"] = w.worker_name if w else ""
data["worker_online"] = w.online if w else False
return data
# ────────────────────────── 接口 ──────────────────────────
@api_view(["GET", "POST"])
def account_list(request):
"""
GET -> 查询账号列表(可选 ?worker_id= 过滤)
POST -> 添加账号(绑定环境名称到电脑)
"""
if request.method == "GET":
worker_id = request.query_params.get("worker_id")
qs = BossAccount.objects.all().order_by("-updated_at")
if worker_id:
qs = qs.filter(worker_id=worker_id)
return Response([_enrich(a) for a in qs])
# POST: 添加账号
ser = AccountBindSerializer(data=request.data)
ser.is_valid(raise_exception=True)
wid = ser.validated_data["worker_id"]
bname = ser.validated_data["browser_name"]
account, _ = BossAccount.objects.get_or_create(
worker_id=wid,
browser_name=bname,
defaults={
"browser_id": f"name:{bname}",
"boss_username": "",
"is_logged_in": False,
},
)
return Response(_enrich(account), status=status.HTTP_201_CREATED)
@api_view(["GET", "DELETE"])
def account_detail(request, account_id):
"""
GET -> 查询单个账号详情
DELETE -> 删除账号
"""
try:
account = BossAccount.objects.get(pk=account_id)
except BossAccount.DoesNotExist:
return Response({"detail": "账号不存在"}, status=status.HTTP_404_NOT_FOUND)
if request.method == "GET":
return Response(_enrich(account))
# DELETE
account.delete()
return Response({"message": "账号已删除"})