From 89aac5cf207f10a1a995320136bc28b27ea7edaf Mon Sep 17 00:00:00 2001 From: "wang.yu" Date: Mon, 17 Aug 2026 17:14:50 +0800 Subject: [PATCH] =?utf8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=84=8F=E8=A7=81?= =?utf8?q?=E9=87=8D=E6=96=B0=E7=94=9F=E6=88=90=E6=97=B6=E5=B1=95=E7=A4=BA?= =?utf8?q?=E3=80=8CAI=20=E7=94=9F=E6=88=90=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?utf8?q?=E3=80=8D=E5=AE=9E=E6=97=B6=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - db-sidecar: handleRefineCube 改为 NDJSON 流式返回,refineCubeJson 透传 onEvent,发射 log 进度与 task 状态 - 前端 refineCube 改为读取流并累积 refineLog;反馈弹窗「修改意见」下方新增黑底白字只读终端,自动滚动 - 设计文档同步更新(5.7 修改意见 / 8 反馈模态) --- app/globals.css | 3 +++ app/page.tsx | 27 +++++++++++++++++++++++---- db-sidecar.mjs | 42 ++++++++++++++++++++++++++++++------------ public/design-doc.html | 4 ++-- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/app/globals.css b/app/globals.css index 58e3d0f..2ae63a3 100644 --- a/app/globals.css +++ b/app/globals.css @@ -173,4 +173,7 @@ .gen-console{height:300px;max-height:42vh;overflow-y:auto;background:#0f1722;color:#cfe3f0;font:12px/1.5 "SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;padding:10px 12px} .gen-console pre{margin:0;white-space:pre-wrap;word-break:break-word} .gen-console pre:empty:before{content:""} +.modal-console{margin-top:12px;border:1px solid #1c2a38;border-radius:4px;overflow:hidden} +.modal-console-head{background:#0f1722;color:#9fd0e6;font-size:12px;padding:6px 10px;border-bottom:1px solid #1c2a38} +.modal-console-body{background:#0f1722;color:#cfe3f0;font:12px/1.5 "SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;margin:0;padding:10px 12px;max-height:240px;overflow:auto;white-space:pre-wrap;word-break:break-word} diff --git a/app/page.tsx b/app/page.tsx index 41562ff..1ed8943 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -171,6 +171,7 @@ export default function Home(){ const [previewTab,setPreviewTab]=useState<"info"|"json"|"feedback">("info"); const [feedbackCube,setFeedbackCube]=useState(null); const [refining,setRefining]=useState(false); + const [refineLog,setRefineLog]=useState(""); const notify=(m:string)=>{setToast(m);window.setTimeout(()=>setToast(""),2200);}; @@ -198,18 +199,34 @@ export default function Home(){ const openFeedback=(cube:Cube)=>{ if(!cube.id){ notify("请先生成该页面再提出修改意见"); return; } setFeedbackCube(cube); + setRefineLog(""); setModal("feedback"); }; const refineCube=async(cube:Cube, feedback:string)=>{ if(!site?.id || !cube.id) return; if(!feedback.trim()){ notify("请填写修改意见"); return; } setRefining(true); + setRefineLog(""); try{ - await fetchDb(`/sites/${site.id}/cubes/${cube.id}/refine`, { + const res = await fetch(`/api/db/sites/${site.id}/cubes/${cube.id}/refine`, { method:"POST", headers:{"Content-Type":"application/json"}, body:JSON.stringify({feedback}), }); + if(!res.ok||!res.body) throw new Error("HTTP "+res.status); + const reader = res.body.getReader(); const dec = new TextDecoder(); let buf=""; + for(;;){ + const {done,value}=await reader.read(); if(done) break; + buf += dec.decode(value,{stream:true}); + const lines = buf.split("\n"); buf = lines.pop()||""; + for(const line of lines){ + if(!line.trim()) continue; + try{ + const ev = JSON.parse(line); + if(ev.log) setRefineLog(prev=>prev+ev.log); + }catch{} + } + } notify(`已根据修改意见重新生成「${cube.name}」`); const refreshed:SiteDetail = await fetchDb(`/sites/${site.id}`); setSite(refreshed); @@ -405,7 +422,7 @@ export default function Home(){ {page==="result"&&} {page==="preview"&&} {(["basic","assets","functions"] as PageKey[]).includes(page)&&
} - {toast&&
✓{toast}
}{modal&&setModal("")} notify={notify} promptData={promptData} feedbackCube={feedbackCube} refineCube={refineCube} refining={refining}/>} + {toast&&
✓{toast}
}{modal&&setModal("")} notify={notify} promptData={promptData} feedbackCube={feedbackCube} refineCube={refineCube} refining={refining} refineLog={refineLog}/>} {!aiOpen&&
{type==="feedback"&&<>
系统已识别本次修改范围(仅针对「{feedbackCube?.name}」页面)
  • 当前页面 JSON将依据修改意见重新生成
  • 页面模拟数据将同步更新
  • Asset Excel不受影响
  • 其他 Cube 页面不受影响