Files
yingqing/core/qa/visual-parity/_library-v2.mjs
T
seaislee1209 4571991deb feat(library): 资产库重做为「成品库」— 图片成品三类 + 视频成品按项目素材包
定义:资产 = 平台产出的成品。原料(商品/模特)归各自的库、半成品(角色/三视图/场景/分镜)归项目,
资产库只装成品 —— tab 从 9 个收成 5 个。

- 后端 /api/assets/video-packs/:视频成品按项目素材包(与「导出全部」同源,取 VideoSegment.adopted_version
  真实视频资产,给 TOS 直链 url 供 <video> 播放/取首帧);summary 改只数成品(tryon/kits/creations/others)
- 资产库 _tab_q 加 others(我的上传+未归类兜底);角色/场景/商品图/素材 tab 移除(各回各家)
- 前端 library:tab→模特上身图/平台套图/自由创作/视频成品/其他;视频成品=项目包卡(<video>首帧封面)
  → 点开弹窗看该项目所有片段(可播);图片成品/其他复用原网格
- 单测 VideoPacksTests:按项目分组 + 软删片段排除

验收:后端单测绿(基线 4 失败零新增);tsc+build 绿;无头 0 报错(5 tab + 视频包弹窗 3 段)
注:图片成品「按生成批次成组」待图片趴有真实数据时接线(当前 demo 已清空)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 20:54:42 +08:00

26 lines
1.5 KiB
JavaScript

import { chromium } from "playwright";
import fs from "node:fs"; import path from "node:path";
const BASE="http://localhost:5200"; const OUT=path.resolve("../../../_qa_shots/lib-v2"); fs.mkdirSync(OUT,{recursive:true});
const b=await chromium.launch({headless:true}); const r={consoleErrors:[]};
const p=await (await b.newContext({viewport:{width:1440,height:900}})).newPage();
p.on("console",m=>{if(m.type()==="error")r.consoleErrors.push(m.text())});
p.on("pageerror",e=>r.consoleErrors.push("PE:"+e.message));
await p.goto(BASE+"/login"); await p.waitForTimeout(400);
await p.fill("#auth-username","airshelf"); await p.fill("#auth-pwd","Restraint2026");
await p.click("button.btn-cta"); await p.waitForFunction(()=>!location.pathname.startsWith("/login"),{timeout:12000});
await p.goto(BASE+"/library"); await p.waitForTimeout(2800);
r.tabs=(await p.locator(".tab").allInnerTexts().catch(()=>[])).join(" | ");
await p.screenshot({path:path.join(OUT,"lib-default.png"),fullPage:true});
// 视频成品
await p.locator(".tab",{hasText:"视频成品"}).click(); await p.waitForTimeout(2500);
r.packCards=await p.locator(".pack-card").count();
await p.screenshot({path:path.join(OUT,"lib-videopacks.png"),fullPage:true});
// 点开包
if(r.packCards>0){
await p.locator(".pack-card").first().click(); await p.waitForTimeout(1800);
r.packModalOpen=await p.locator(".pack-modal").count();
r.clipCount=await p.locator(".pack-clip").count();
await p.screenshot({path:path.join(OUT,"lib-pack-modal.png"),fullPage:true});
}
await b.close(); console.log(JSON.stringify(r,null,2));