Skip to content

v1.12.0 · 单据编辑器 · exe 终于自带图标了

Latest

Choose a tag to compare

@YJLZSL YJLZSL released this 29 Sep 07:06
· 2 commits to main since this release

新增:单据编辑器(「单据」页)

把台账摆成送货单 / 订货单 / 收据再打印。左边挑模板,中间拖拽摆放,右边改属性。

为什么做它 —— 证据不是"想当然":

reference/31 §0.3 的结论是:"DeskBase 现在最该补的三处:行内公式列 >
打印/报表出口 > 单表导出",而三条用户场景(S1 仓管 / S3 店主 / S4 会计)
都点名同一个缺口:打不出单据。

reference/30 §0.3 说得更准:Access 留下的空位不是"更简单的表格",
而是"能给同事用的小应用"
—— 只有表、没有出口就接不住这个位置。

借鉴同类产品(送货单打印软件)的四条共性做法:

借鉴 本项目的做法
内置模板库 送货单 / 订货单 / 收据 / 空白 A4(不假装有"上百套行业模板")
可视化拖拽 文字 / 待填栏 / 表格 / 横线 / 方框;缩放用右下角热区,不另画把手
纸张规格可选 A4 纵横向 / 连页纸 241×140 / 小票 80mm、58mm
打印预览 生成打印 HTML → 浏览器 Ctrl+P(复用 v1.11.0 的通道)

明确没做:条码 / 二维码(要引库,与便携包 2.9 MB 的定位不符)。

几个刻意的选择:

  • 坐标一律毫米,Rust 与前端共用一套。打印这件事上像素是错的单位,它随 DPI 变。
  • 打印不自动弹对话框 —— 沿用 v1.11.0 立的规矩:选打印机、纸张、份数都是用户的决定。
  • 打开文件走既有的 app.openExport(它限制在 exports/ 目录内),
    不另开一条 file:// 通道 —— 那等于绕过既有的安全设计。
  • 内置模板改之前先复制一份 —— 改坏内置模板是说不清的麻烦。

修复:exe 终于自带图标了

v1.11.1 排查"快捷方式没图标"时挖到的根因是:deskbase.exe 里根本没有图标资源
(RT_ICON / RT_GROUP_ICON 都是空的)。窗口和任务栏上看到的图标,
是运行时 tao::window::Icon::from_rgba() 设的 —— 只进内存,不进 PE 资源段。
所以:

位置 之前 现在
窗口 / 任务栏(程序运行时) ✅ ✅
资源管理器里看这个 exe 文件 ❌ 白纸一张 ✅
快捷方式的"默认图标" ❌ 只能靠指外部文件 ✅ 可以直接指 exe
安装器 / 托盘 / 任何按文件读图标的地方 ❌ ✅

怎么做的:加了 app/build.rs,调 Windows SDK 自带的 rc.exe 把一个 .rc
编成资源链进去。零新增依赖 —— 常见做法是引 winres / embed-resource,
但便携包才 2.9 MB,能不加就不加。

找不到 rc.exe 时不报错,只是没图标 —— 图标是锦上添花,构建失败是硬伤;
CI 机器和别人 clone 下来编译,SDK 位置可能不一样,那种情况该照常出可用的 exe。

并且加了 scripts/check-icon.cjs 做断言。为什么必须有一个检查:这类问题
没有任何运行时症状 —— 程序照跑、窗口照有图标,只有去看那个 exe 文件才看得出来。
没有断言的话,下次谁把 build.rs 删了或改坏了,没人会发现。

连锁反应一则(写给下一棒):installer.rs 里那段"为什么快捷方式指向外部 .ico"
的推理,第 2 条前提已经不成立了 —— 现在可以简化成 SetIconLocation(exe, 0),
顺带绕开"Windows 图标缓存"那个短板。本轮没改:现有方案能工作,
而安装逻辑连着"不污染"红线(零注册表残留、卸载干净),为一次纯优化去动它不划算。
要改的话改那里,并且要重跑安装 / 卸载验收。

验证

门禁五道 + check-css-vars 全过 · 走查 8/8(新增"单据"页,截图 22 张)·
check-icon 断言通过(.rsrc 72.5 KB,RT_ICON + RT_GROUP_ICON 都在)

⚠️ 单据编辑器的交互(拖拽 / 改属性 / 缩放)未人眼验证 —— 只验了空状态与结构。
这条如实写在这里,没混进"完成"里。