定义:资产 = 平台产出的成品。原料(商品/模特)归各自的库、半成品(角色/三视图/场景/分镜)归项目, 资产库只装成品 —— 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>
26 lines
1.5 KiB
JavaScript
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));
|