Files
yml2213 df8c63b829 feat(huya): 外部 CK 协作台账(S1–S6)+ 图片上传能力
协作台账:新表 huya_external_orders 替代 Excel 多人协同表(设计见
docs/设计-虎牙外部CK协作台账.md),一条 CK 一行,所有人共享、改动留痕。

- 前端 pages/HuyaCollabPage.tsx + 菜单「虎牙 → 外部单协作」/huya/collab:
  内联编辑(带乐观锁 version)、图片缩略图、详情抽屉(字段表单 + 两个图片槽位 +
  操作时间线)、粘贴导入弹窗(带 TSV 预览)、批量/单条验证 CK、页头统计条、筛选
- 两套状态机:业务 pending→bound→recharged→scripted→done(旁路 void)、
  凭据 unverified/valid/invalid/disabled;唯一写入口在 services/huya_collab_service.py,
  字段级审计 + 整数 version 乐观锁(不用 updated_at:DATETIME 只到秒)
- CK 只读探针 check_user_bind_game_account(真机判据:响应非 None 且 status == 200),
  成功即覆盖写绑定快照 bind_game_account/bind_game_role/bind_game_channel(迁移 0056),
  失败只改凭据状态、不动业务状态;人工只能停用/恢复(POST /{id}/ck/status)
- 贴/换/重建 CK、TSV 批量导入(SAVEPOINT 单行隔离,部分失败不整体失败)、
  权限 huya:collab:view/edit/manage(删除只给运营)
- 孤儿图清理脚本 scripts/cleanup_orphan_file_assets.py(默认 --dry-run)

图片上传(协作台账截图用):OSS/本地双后端 + 缩略图变体 + /api/files 代理回读,
权限 file:upload / file:view。

验证:pytest 880 passed / 6 skipped;ruff format 全绿、ruff check 仅剩既有告警;
前端 tsc -b / eslint / vite build 通过;接口端到端冒烟 29 项全绿(TestClient,探针用假客户端);
探针真机冒烟 3 例(有效 CK=True、别人 uid=False、裸 cookie=False)。
2026-10-16 19:38:59 +08:00

59 lines
1.6 KiB
TOML

[project]
name = "live-hub-py"
version = "0.4.0"
description = "直播账号运营 Web 后台"
readme = "README.md"
requires-python = ">=3.12,<3.13"
dependencies = [
"requests[socks]>=2.31.0",
"pycryptodome>=3.19.0",
"numpy>=1.24.0",
"opencv-python-headless>=4.8.0",
"Pillow>=10.0.0",
"loguru>=0.7.0",
"fastapi>=0.110.0",
"uvicorn[standard]>=0.27.0",
"sqlalchemy>=2.0.0",
"python-jose[cryptography]>=3.3.0",
"bcrypt>=4.0.0",
"pydantic>=2.0.0",
"python-multipart>=0.0.9",
"alembic>=1.18.4",
"websockets>=16.0",
"onnxruntime>=1.18.0",
"scipy>=1.13.0",
"pyexecjs>=1.5.1",
"pymysql>=1.1,<2",
# P0 订单读取适配层:连 order_site 的 PostgreSQL 只读库(规划 §6.5)。
# 全项目只有 external_order_source.py 一处跨库;URL 用 postgresql+psycopg://
"psycopg[binary]>=3.2,<4",
"curl-cffi>=0.13",
"segno>=1.6",
# 在线协作的图片上传:走 S3 兼容接口写阿里云 OSS(内网 endpoint)。
# 只在 STORAGE_MODE=oss 时才导入,本地开发/测试用本地目录后端,不装也能跑。
"boto3>=1.34",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["core", "utils", "web"]
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.ruff.lint.per-file-ignores]
# FastAPI evaluates dependency metadata in route parameter defaults by design.
"web/backend/**/*.py" = ["B008"]
# 虎牙路由共享层集中 re-export 依赖。
"web/backend/routers/huya/_common.py" = ["F401"]
[dependency-groups]
dev = [
"pyright>=1.1.411",
"pytest>=9.1.1",
"ruff>=0.12.0",
]