if(!feedback.trim()){ notify("请填写修改意见"); return; }
setRefining(true);
setRefineLog("");
+ // 看门狗:极端情况下(如模型进程异常挂起)流一直不结束,超时后强制复位并关闭窗口,避免按钮卡在「重新生成中…」
+ const watchdog = setTimeout(() => {
+ setRefining(false);
+ setModal("");
+ setFeedbackCube(null);
+ notify("重新生成超过预期时长(>10 分钟),已自动结束并关闭窗口,可重新打开再试");
+ }, 600000);
try{
const res = await fetch(`/api/db/sites/${site.id}/cubes/${cube.id}/refine`, {
method:"POST",
}
}
notify(`已根据修改意见重新生成「${cube.name}」`);
- const refreshed:SiteDetail = await fetchDb(`/sites/${site.id}`);
- setSite(refreshed);
- setSiteId(site.id);
+ // 流结束后立即复位 UI 并关闭窗口,避免等待站点刷新接口期间按钮持续显示「重新生成中…」
+ setRefining(false);
setModal("");
setFeedbackCube(null);
+ try{
+ const refreshed:SiteDetail = await fetchDb(`/sites/${site.id}`);
+ setSite(refreshed);
+ setSiteId(site.id);
+ }catch{}
}catch(e:any){ notify("重新生成失败:"+(e?.message||e)); }
- finally{ setRefining(false); }
+ finally{ clearTimeout(watchdog); setRefining(false); }
};
useEffect(()=>{ if(aiEndRef.current) aiEndRef.current.scrollIntoView({block:"end"}); }, [aiMessages, aiOpen]);
<h2>8. 模态框(Modal)</h2>
<table>
<tr><th>类型</th><th>功能</th><th>交互效果</th></tr>
- <tr><td>æ\8f\90å\87ºä¿®æ\94¹æ\84\8fè§\81ï¼\88feedbackï¼\89</td><td>对å\8d\95页æ\8f\90å\8f\8dé¦\88å¹¶é\87\8dæ\96°ç\94\9fæ\88\90</td><td>å¼¹çª\97é¡¶é\83¨å\8d³ã\80\8cä¿®æ\94¹æ\84\8fè§\81ã\80\8dè¾\93å\85¥æ¡\86ï¼\88è\87ªå\8a¨è\81\9aç\84¦ï¼\89ï¼\8cä¸\8bæ\96¹å±\95示影å\93\8dè\8c\83å\9b´ï¼\88ä»\85å½\93å\89\8d页 / 模æ\8b\9fæ\95°æ\8d® / ä¸\8då\8f\97å½±å\93\8d项ï¼\89ï¼\9bæ\8f\90交å\90\8eå¼¹çª\97å\86\85å\87ºç\8e°é»\91åº\95ç\99½å\97ç\9a\84 <b>AI ç\94\9fæ\88\90å·¥ä½\9cæµ\81</b> ç»\88端ï¼\8cå®\9eæ\97¶æ»\9aå\8a¨ AI/Skill ç\94\9fæ\88\90è¿\9b度ï¼\8cå®\8cæ\88\90å\90\8eè\87ªå\8a¨å\88·æ\96°å¹¶å\85³é\97</td></tr>
+ <tr><td>æ\8f\90å\87ºä¿®æ\94¹æ\84\8fè§\81ï¼\88feedbackï¼\89</td><td>对å\8d\95页æ\8f\90å\8f\8dé¦\88å¹¶é\87\8dæ\96°ç\94\9fæ\88\90</td><td>å¼¹çª\97é¡¶é\83¨å\8d³ã\80\8cä¿®æ\94¹æ\84\8fè§\81ã\80\8dè¾\93å\85¥æ¡\86ï¼\88è\87ªå\8a¨è\81\9aç\84¦ï¼\89ï¼\8cä¸\8bæ\96¹å±\95示影å\93\8dè\8c\83å\9b´ï¼\88ä»\85å½\93å\89\8d页 / 模æ\8b\9fæ\95°æ\8d® / ä¸\8då\8f\97å½±å\93\8d项ï¼\89ï¼\9bæ\8f\90交å\90\8eå¼¹çª\97å\86\85å\87ºç\8e°é»\91åº\95ç\99½å\97ç\9a\84 <b>AI ç\94\9fæ\88\90å·¥ä½\9cæµ\81</b> ç»\88端ï¼\8cå®\9eæ\97¶æ»\9aå\8a¨ AI/Skill ç\94\9fæ\88\90è¿\9b度ï¼\9bæµ\81ç»\93æ\9d\9få\90\8eç«\8bå\8d³å¤\8dä½\8dã\80\8cé\87\8dæ\96°ç\94\9fæ\88\90ä¸â\80¦ã\80\8dæ\8c\89é\92®å¹¶è\87ªå\8a¨å\88·æ\96°ç«\99ç\82¹ã\80\81å\85³é\97å¼¹çª\97ï¼\8c并设æ\9c\89 >10 å\88\86é\92\9fè¶\85æ\97¶ç\9c\8bé\97¨ç\8b\97å\85\9cåº\95ï¼\8cé\81¿å\85\8dç\95\8cé\9d¢å\8d¡å\9c¨ã\80\8cç\94\9fæ\88\90ä¸ã\80\8d</td></tr>
<tr><td>下载站点交付物(download)</td><td>选择下载项</td><td>列表含 Cube JSON / 菜单配置 / 报告;Asset Excel 占位 <span class="todo">尚未实现</span></td></tr>
<tr><td>版本历史(history)</td><td>查看版本</td><td>仅展示 V1 当前版本 <span class="todo">真实版本管理尚未实现</span></td></tr>
<tr><td>生成提示词(prompt)</td><td>查看/复制组合提示词</td><td>展示发送给模型的完整提示词,可复制到剪贴板</td></tr>