const scope=[
["站点",site.name||"未命名站点",site.domain],
["Asset 资产",`${site.assets.filter(a=>a.type).length} 类 / ${site.assets.reduce((n,a)=>n+Number(a.count||0),0)} 个设备`,`3 层资产结构(未开发)`],
- ["MU 页面",`${site.mu.length} 个标准页面`,`直接复用并配置菜单(未开发)`],
+ ["SC 页面",`${site.mu.length} 个标准页面`,`直接复用并配置菜单(未开发)`],
["Cube 页面",`${site.cubes.length} 个扩展页面`,`生成 ${site.cubes.length} 个独立 JSON`],
];
const start=async()=>{
}catch(e:any){ notify("生成失败: "+e.message); }
finally{ setRunning(false); }
};
- return <div className="generate-layout"><div><Panel title="生成范围确认"><div className="confirm-grid">{scope.map(x=><div key={x[0]}><span>{x[0]}</span><b>{x[1]}</b><small>{x[2]}</small><button>{"返回修改"}</button></div>)}</div></Panel><Panel title="页面生成提示词(生成前可核对)"><div className="prompt-list"><div className="prompt-row"><span><b>站点级提示词(通用上下文)</b><small>每个页面都会携带的站点背景与 Cube 规则,可先核对</small></span><button className="text-button" onClick={viewSitePrompt}>查看提示词 →</button></div>{site.cubes.length?site.cubes.map(c=><div key={c.id} className="prompt-row"><span><b>{c.name}</b>{c.content&&<small>{c.content}</small>}</span><button className="text-button" onClick={()=>viewPrompt(c.id, c.name, c.content)}>查看提示词 →</button></div>):<div className="empty-state">尚未添加 Cube 扩展页面(在「功能与菜单」中添加后,这里会列出每个页面的提示词)</div>}</div></Panel><Panel title="生成选项"><div className="option-list">{[
- {label:"生成 Asset Excel", disabled:true, note:"未开发"},
- {label:"生成菜单配置", disabled:false},
- {label:"生成 Cube JSON", disabled:false},
- {label:"创建合理的模拟数据", disabled:false},
- {label:"生成页面预览", disabled:false},
- {label:"执行 Cube JSON 校验", disabled:false},
- ].map(x=><label key={x.label} className={x.disabled?"disabled":""}><input type="checkbox" defaultChecked={!x.disabled} disabled={x.disabled}/><span>{x.label}{x.note&&<small>{x.note}</small>}</span></label>)}</div></Panel></div>
- <div className="gen-right"><Panel title="生成任务" className="task-panel"><div className="overall"><div><b>{progress===100?"生成完成":running?"正在生成站点方案":"准备就绪"}</b><span>{progress}%</span></div><div className="meter"><i style={{width:progress+"%"}}/></div><p>{progress===100?"全部交付物已生成并通过校验。":running?"Wordbuddy Hy3 正在调用 Cube Skill 创建页面与模拟数据。":"Wordbuddy Hy3 已就绪,预计需要约 2 分钟。"}</p></div><div className="task-list">{tasks.map((x,i)=><div key={i}><i className={x.status==="done"?"done":x.status==="running"?"spin":x.status==="failed"?"bad":""}>{x.status==="done"?"✓":x.status==="running"?"↻":x.status==="failed"?"!":"·"}</i><span><b>{x.name}</b>{x.message&&<small>{x.message}</small>}</span><Status>{x.status==="done"?"成功":x.status==="running"?"生成中":x.status==="failed"?"失败":"等待"}</Status></div>)}</div><Button disabled={running} onClick={start}>{progress===100?"重新生成":running?"正在生成…":"开始生成"}</Button>{zipUrl&&<Button secondary onClick={()=>window.open(zipUrl,"_blank")}>⇩ 下载 ZIP</Button>}</Panel><Panel title="AI 生成工作流" className="console-panel"><div className="gen-console" ref={consoleRef}><pre>{log || "(等待生成开始…)"}</pre></div></Panel></div></div>;
+ return <div className="generate-layout"><Panel title="生成范围确认"><div className="confirm-grid">{scope.map(x=><div key={x[0]}><span>{x[0]}</span><b>{x[1]}</b><small>{x[2]}</small><div style={{display:"flex",gap:"6px"}}><button>{"返回修改"}</button><button className="text-button"><DownloadOutlined/> 下载</button></div></div>)}</div>
+<div style={{marginTop:"16px",textAlign:"right"}}><Button><DownloadOutlined/> 下载全部</Button></div></Panel></div>;
}
// 缩略图:拉取 cube 生成的 dashboard JSON,用公开渲染器按 1920×1080 渲染后缩放显示