From: root Date: Fri, 21 Aug 2026 01:00:52 +0000 (+0800) Subject: fix: 设计方案导出修复(PDF 真实文字/页脚页码/目录;Word 页脚页码/静态目录/截图300px) X-Git-Url: http://acesimba.cloud/gitweb/?a=commitdiff_plain;h=f0baf35e87aaaf13bcb7d0d878698e9ad2c9e5f1;p=StationBuilder.git fix: 设计方案导出修复(PDF 真实文字/页脚页码/目录;Word 页脚页码/静态目录/截图300px) - PDF 改 window.print 原生打印,真实文字无乱码;打印时注入静态目录(h2/h3/h4),@page 页脚页码 - Word footer 补 id + 规范 PAGE/NUMPAGES 域标记,每页底部页码;目录改可见静态目录 - 截图限宽 300px 等比例(修复 .figure 类选择器未命中
元素导致 PDF 图片溢出) - 图后插
使图注换行;设计文档 v0.26 + 顶部说明同步 --- diff --git a/public/design-doc.html b/public/design-doc.html index d9bf7f6..fad881d 100644 --- a/public/design-doc.html +++ b/public/design-doc.html @@ -4,8 +4,8 @@ - 本文档是 StationBuilder 的产品/交互设计文档,单一 HTML 源,位于 public/design-doc.html, 运行时通过顶栏「设计方案」链接(/design-doc.html)打开。 - 每次功能改动后,请同步更新对应章节;新增/遗留的未实现能力用 尚未实现 标注。 - - 顶部三个按钮分别导出:PDF(html2pdf.js 生成,带「第 X 页 / 共 Y 页」页脚页码,截图限 240px 宽)、 - Word(.doc:微软雅黑、纯黑文字、黑色表格边框、1.5 倍行距、页脚页码域、默认 TOC 目录域、截图 240px 宽)、 + - 顶部三个按钮分别导出:PDF(调用浏览器打印另存为 PDF——真实文字、微软雅黑、纯黑、1.5 倍行距;打印对话框勾选「页眉和页脚」即得页码;截图限 300px 宽)、 + Word(.doc:微软雅黑、纯黑文字、黑色表格边框、1.5 倍行距、页脚页码域(第 X / 共 Y 页)、默认可见静态目录、截图 300px 宽)、 Markdown(由本页 DOM 实时转换,不含图片)。 --> @@ -67,13 +67,22 @@ table{ border-collapse:collapse; border:1px solid #000 !important; } th, td{ border:1px solid #000 !important; } th{ background:#f2f2f2 !important; } - .figure{ page-break-inside:avoid; break-inside:avoid; } - .figure img{ max-width:240px !important; width:auto !important; height:auto !important; } + figure{ page-break-inside:avoid; break-inside:avoid; } + figure img{ max-width:300px !important; width:auto !important; height:auto !important; display:block !important; } table{ page-break-inside:avoid; break-inside:avoid; } tr{ page-break-inside:avoid; break-inside:avoid; } h2,h3,h4{ page-break-after:avoid; break-after:avoid; } img{ -webkit-print-color-adjust:exact; print-color-adjust:exact; } + .doc-toc{ margin:0 0 16px; page-break-after:avoid; break-after:avoid; } + .doc-toc h2{ border-bottom:2px solid #000; } + .doc-toc ul{ list-style:none; padding-left:0; margin:8px 0; } + .doc-toc li{ margin:4px 0; } + .doc-toc li.sub{ padding-left:22px; font-size:12.5px; } + .doc-toc li.sub2{ padding-left:40px; font-size:12px; } } + /* 打印 PDF 页码:A4 页脚居中「第 X 页 / 共 Y 页」;Chrome 另存为 PDF 时若未显示,请在打印对话框勾选「页眉和页脚」 */ + @page{ size:A4; margin:16mm 14mm 16mm 14mm; + @bottom-center{ content:"第 " counter(page) " 页 / 共 " counter(pages) " 页"; font-size:9pt; color:#000; font-family:"Microsoft YaHei",SimSun,sans-serif; } } /* 页面截图(参考 MachineCube 手册撰写方式:小节标题 + 说明 + 下图 + 配图 + 图注)*/ body{ counter-reset: fig; } .figure{ margin:14px 0; border:1px solid var(--line); background:#fbfcfd; } @@ -86,19 +95,6 @@ .changelog th{ background:#f6f7f8; color:#4b4f53; text-align:left; font-size:11px; font-weight:bold; border-bottom:1px solid var(--line); padding:8px 10px; } .changelog td{ border-bottom:1px solid #e3e5e7; padding:9px 10px; font-size:11px; vertical-align:top; } .changelog td:first-child{ white-space:nowrap; font-weight:bold; color:#008ed2; } - /* 导出 PDF 时作用于克隆容器,不影响屏幕 UI */ - .export-pdf{ background:#fff; padding:20px 22px; width:780px; box-sizing:border-box; } - .export-pdf, .export-pdf *{ font-family:"Microsoft YaHei","微软雅黑",SimSun,sans-serif !important; color:#000 !important; line-height:1.5 !important; } - .export-pdf table{ border-collapse:collapse; border:1px solid #000; width:100%; margin:10px 0; } - .export-pdf th, .export-pdf td{ border:1px solid #000; padding:6px 9px; text-align:left; vertical-align:top; } - .export-pdf th{ font-weight:bold; background:#f2f2f2; } - .export-pdf .figure{ border:1px solid #000; background:#fff; } - .export-pdf .figure img{ max-width:240px; width:auto; height:auto; } - .export-pdf .doc-toc{ margin:0 0 18px; page-break-after:avoid; } - .export-pdf .doc-toc h2{ border-bottom:2px solid #000; } - .export-pdf .doc-toc ul{ list-style:none; padding-left:0; margin:8px 0; } - .export-pdf .doc-toc li{ margin:4px 0; } - .export-pdf .doc-toc li.sub{ padding-left:22px; font-size:12.5px; } @@ -753,6 +749,7 @@

10.1 版本变更记录(Changelog)

+ @@ -780,15 +777,13 @@ - -
版本日期修改人说明
v0.262026-08-21wang.yu导出修复(设计方案 Word / PDF):① PDF 由 html2pdf(jsPDF+html2canvas,中文乱码且长文档卡死)改为调用浏览器原生打印(window.print),输出真实文字、微软雅黑、纯黑、1.5 倍行距,无乱码;打印时临时注入静态目录(buildStaticToc,含 h2/h3/h4)于文首,打印后移除、不污染屏幕 UI;屏幕 UI 截图尺寸不变(仍 360px)。② Word 页脚页码修复:footer 元素补 id 并改用规范 Word 域标记(PAGE / NUMPAGES 字段,含 field-begin/separator/end),由「仅首页顶部显示 1」修正为每页底部「第 X 页 / 共 Y 页」。③ Word 目录由 TOC 域(打开时常为空)改为默认插入可见的静态目录(buildStaticToc,含 h2/h3/h4 三级)。④ 截图限宽 300px(等比例):Word 设 width=300 属性 + 行内样式;PDF 原 @media print 用 `.figure img` 类选择器未命中正文 `
` 元素导致约束不生效、图片按原始像素溢出页面(即此前「240 显示不下」的真相),改为 `figure img` 元素选择器 + max-width:300px 后正常限宽并完整显示;图后插入回车(<br>)使图注文字换行到下一行。⑤ 补充 @page 打印页码(A4 页脚居中「第 X 页 / 共 Y 页」;Chrome 另存为 PDF 若未显示,在打印对话框勾选「页眉和页脚」兜底)。
v0.242026-08-20wang.yuAI 并发调用统一限流:新增全局信号量 AI_CONCURRENCY = 2,包裹 runCodebuddy(db-sidecar.mjs),使站点生成(含批内并行)、各项补全(complete / complete-assets / complete-cubes)、领域方案补全(dt-complete 系列)等全部 AI 功能任意时刻最多 2 个 codebuddy 子进程并发,避免无脑全并行抢占资源导致超时。站点「生成全部」批内并行数 GEN_CONCURRENCY 由硬编码 3 改为复用 AI_CONCURRENCY,对应日志文案同步为「最多 2 个并行调用」。AI 聊天侧(ai-sidecar.mjs /api/chat)本身以 running 布尔量串行(同一时刻仅 1 个),已满足 ≤2。
v0.252026-08-20wang.yu领域方案「已完成态」步进导航增强:判定「已完成」= 方案存在至少一个已生成(非空 json_text)的 Cube 页面(DomainWizard 内 pageGenerated)。完成后:① 步进器每个「已配置」的 Step 前置圆圈显示绿色对号(复用 .steps button.done 绿色样式,configured 由各步数据驱动——基本属性 name+description、领域知识 docs、资产设置 有 device_template_id、功能与菜单 有页面或已选 MU、运维流程 flows、生成保存 已生成页面、专家确认 status=available);② 取消「仅可点已访问步骤」限制,任意 Step 直接点击即可跳转对应页(不再需连点「下一步」);③ 未完成(草稿)方案保持原逐步引导行为(仅已访问步骤可点、后续步骤加 .locked 不可点)。DomainSteps 新增 completed / configured 入参,globals.css 增补 .steps button.locked 光标态。Playwright 验证:已完成方案绿对号渲染正确、点击直达生效、0 控制台报错;草稿方案锁定与不可跳转保持。
v0.232026-08-20wang.yu领域知识上传格式扩展:KnowledgeStep 上传 accept 由纯文本类放开至 Word / Excel / PDF / 图片及常见文本(.pdf,.doc,.docx,.xls,.xlsx,image/* 等);提示文案补充「Word、Excel、PDF 会提取正文注入,图片仅作参考登记」,列表文件类徽标「文档」改为「文件」以兼容图片。后端 extractDocText(filePath,mime,filename) 替换原 isTextMime/readKnowledgeFile:文本类(txt/md/json/csv/html/xml/yaml/yml 等)直接读取;PDF(pdf-parse)、Word(仅 .docx,mammoth)、Excel(.xls/.xlsx,SheetJS 转 CSV)提取正文并 16k 截断后注入提示词;图片及老 .doc 等无法纯 JS 提取的格式返回空串,buildKnowledgePrompt 中仍登记为参考来源((参考来源:文件名))。新增依赖 pdf-parse / mammoth / xlsx(纯 JS,无原生编译)。