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)。
This commit is contained in:
yml2213
2026-10-16 19:38:59 +08:00
parent 99e8643d83
commit df8c63b829
32 changed files with 7449 additions and 16 deletions
+22
View File
@@ -101,5 +101,27 @@ FISH_FIN_RECHARGE_DEBUG=false
# Roundcube 邮件验证码读取服务地址(可选;不填则使用默认服务)
# MAIL_ROUNDCUBE_URL=http://127.0.0.1:8000/
# ---- 文件存储:在线协作的图片上传 ----
# local = 存本地 ./data/file_storage(开发/测试默认,无需对象存储);
# oss = 阿里云 OSS 或任意 S3 兼容存储,生产用这个。
OSS_MODE=local
# ECS 与桶同地域时必须用内网 endpoint:免公网流量费、延迟低。
# 本机(非 ECS)调试要改成公网:https://oss-cn-hangzhou.aliyuncs.com
# OSS_ENDPOINT=https://oss-cn-hangzhou-internal.aliyuncs.com
# OSS_BUCKET=live-hub-assets
# OSS_ACCESS_KEY_ID=
# OSS_ACCESS_KEY_SECRET=
# 实测该 RAM 子账号的权限边界(2026-10-16,ossutil 2.1.2):桶内 ListObjects /
# PutObject / GetObject / DeleteObject 都通;ListBuckets、GetBucketStat、
# GetObjectAcl、跨桶访问一律 403。所以代码**不调** HeadBucket/GetBucketStat
# (见 file_storage.S3ObjectStorage.ensure_ready),RAM 策略也不用放开这些。
# region 默认从 endpoint 推导(oss-cn-hangzhou-internal → oss-cn-hangzhou),一般不用配。
# OSS_REGION=
# 上传大小上限(MB,默认 10)。前端会在上传前把长边压到 1600 以内。
# OSS_MAX_UPLOAD_SIZE_MB=10
# local 模式的对象根目录(默认 ./data/file_storage,已随 data/ 一起忽略)
# OSS_LOCAL_ROOT=
# OSS_PREFIX 是 P2 资料收集(collect)用的前缀,本功能由 scene 决定命名空间。
# Uvicorn reload(开发模式设为 true,生产环境保持 false)
UVICORN_RELOAD=false