# m7_Print_Designer
**Repository Path**: jiangzeyu/m7_print_designer
## Basic Information
- **Project Name**: m7_Print_Designer
- **Description**: m7_Print_Designer
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-29
- **Last Updated**: 2026-10-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# m7_print_designer · 通用打印设计器
面向 **Vue 3** 技术栈的可复用打印设计器组件 —— 单据、标签、报表、合同、回执等「**固定版式 + 精确套打**」场景都能用同一套方式设计(仓库内示例为加工单、质检单、采购订单、收货回单、采购合同)。
> **官网**:[m7-print-designer.m7wl.cn](https://m7-print-designer.m7wl.cn) · **开源仓库**:[Gitee](https://gitee.com/jiangzeyu/m7_print_designer) · **版权**:© 2026 [烟台梦起网络科技有限公司](https://m7wl.cn)
## 特性
- **拖拽式设计器**:组件面板 → 画布拖入,画布内自由拖动、8 向缩放、旋转、网格吸附、参考线对齐、撤销/重做
- **打印元素组件**:
- 文本(支持 `{字段}` 数据绑定)
- 图片(URL / 本地上传)
- 二维码(qrcode)
- 条码(jsbarcode:CODE128 / CODE39 / EAN13 / EAN8 / UPC / ITF14 / MSI / Codabar)
- 公章(SVG 圆形章,公司名环绕 + 五角星 + 章文字)
- 手写签名(Canvas 手写板,矢量笔迹存储)
- 直线、矩形
- 自定义表格(行列/单元格编辑)
- 数据表格(绑定数据源数组,打印时自动分页)
- **精确打印**:模板用 **mm 坐标** 建模,打印时生成独立静态 HTML(`@page` 精确尺寸),画布预览与打印共用同一套渲染逻辑
- **模板序列化**:纯 JSON 模板,可存储/复用/后端保存
## 快速开始
```bash
npm install
npm run dev # 演示页(5 类示例单据)
npm run build:lib # 构建组件库产物(ES + UMD + d.ts)
```
## 在项目中使用
```ts
import { PrintDesigner, PrintPreview, printTemplate, printBatch, type Template } from 'm7_print_designer'
// 模板数据(可由后端保存/加载的 JSON)
const template: Template = { id, name, version, paper, elements, dataFields }
// 单据数据(打印时绑定 {字段} 占位、数据表格数据源)
const data = { orderNo: 'PO-001', supplier: 'xx公司', items: [...] }
```
```vue
```
## 使用模式:预览页 + 设计器页
被其他系统引用时,拆成**两个页面**:
```
宿主系统(勾选数据 → 打印)
│
▼
PrintPreview(预览页) ──配置模板──▶ PrintDesigner(设计器页)
· 切换模板 · 拖拽/缩放/改属性编排
· 内嵌预览(模板 + 真实数据) · 保存为不同模板
· 打印
```
| 组件 | 定位 | 使用方 |
| --- | --- | --- |
| `PrintPreview` | 预览页:切换模板 + 内嵌预览 + 打印 | 业务用户(操作员/文员) |
| `PrintDesigner` | 设计器页:可视化编排模板 | 模板管理员 |
> **批量打印**:勾选多条单据用 `printBatch([{ template, data }, ...])` 合并为一次打印任务(每张单据从新页开始,要求同纸张尺寸)。
**预览页**:
```vue
:data="recordData"
@template-change="t => currentTemplate = t"
@configure="openDesigner"
@print="onPrint"
/>
```
**设计器页**:
```vue
```
`save` 回调拿到模板 JSON,宿主持久化后加入 `templates` 列表,即可实现「保存为不同模板」。完整可运行流程见 `src/App.vue`。
## Props / Events(PrintDesigner)
| Props | 类型 | 说明 |
| --- | --- | --- |
| `modelValue` | `Template` | 模板对象(v-model 双向绑定) |
| `data` | `Record` | 单据数据,用于 `{字段}` 占位与数据表格 |
| `dataFields` | `DataField[]` | 可绑定字段清单(属性面板「插入字段」下拉) |
| `readonly` | `boolean` | 只读模式(隐藏编辑面板,仅预览) |
| Events | 说明 |
| --- | --- |
| `update:modelValue` | 模板变更 |
| `print` | 触发打印 |
| `save` | 点击「保存模板」,回调携带模板 JSON |
## Props / Events(PrintPreview)
| Props | 类型 | 说明 |
| --- | --- | --- |
| `template` | `Template` | 当前模板 |
| `templates` | `Template[]` | 可切换的模板列表 |
| `data` | `Record` | 单据真实数据 |
| `dataFields` | `DataField[]` | 可绑定字段清单(可选) |
| Events | 说明 |
| --- | --- |
| `template-change` | 切换模板,回调新模板 |
| `configure` | 点击「配置模板」(宿主跳转到设计器页) |
| `print` | 点击「打印」(组件内部已调 `printTemplate`) |
## 模板 Schema(核心)
```ts
interface Template {
id: string
name: string
version: string
paper: PaperConfig // 纸张尺寸 / 方向 / 页边距
elements: PrintElement[] // 元素列表(mm 坐标 + 各自属性)
dataFields?: DataField[] // 可绑定字段清单
}
```
元素基类:`{ id, type, x, y, width, height, rotation, opacity, visible, locked, zIndex }`,单位均为 **mm**。
## 数据绑定
- 文本 / 二维码 / 条码的内容支持 `{字段名}` 占位(支持 `a.b` 点路径),打印时用 `data` 解析。
- 数据表格通过 `dataSource` 指向 `data` 中的数组字段,按 `rowHeight` 自动计算每页行数并分页。
> 完整的数据源接入契约(字段字典 `DataField`、数据实例 `DataRecord`、`DataSource`、命名约定、后端供数方式)见 [`docs/data-source-spec.md`](docs/data-source-spec.md)。
## 授权与遥测
```ts
import { setupLicense } from 'm7_print_designer'
// 生产环境初始化时调用一次;开发 / 测试环境可不调用
setupLicense({ code: 'M7PD1.xxxxxxxx.yyyyyyyy' })
```
- 授权校验**完全离线**(内置公钥本地验签),**不发网络请求** —— 断网、内网、无法连接公网时照常工作。
- 未授权只在打印与预览输出铺倾斜重复水印,**不限制任何功能**;开发 / 测试环境(`localhost`、`*.local`、`*.test`)不加水印。
- **默认开启使用情况上报**:仅生产环境、每浏览器每月最多一次、未配置授权码也会上报;上报内容**不含用户信息与业务数据**。
- 关闭遥测:`setupLicense({ report: false })`。
详见官网 [授权与遥测](https://m7-print-designer.m7wl.cn/telemetry)。
## 维护者:授权码签发(离线)
私钥只保存在本机 `~/.m7pd/key.json`,不进 git、不上服务器。
**方式一:桌面工具(推荐)** —— 构建一次,之后双击即用
```bash
bash tools/license-tool/build.sh # 或双击 tools/license-tool/build.bat
```
产物 `tools/license-tool/dist/m7pd-license-tool.exe`(约 6 MB,**私钥编译在 exe 内,运行时不需要任何外部文件**),双击打开签发界面;界面内还可查看 / 导出私钥、**更换密钥对**(应急,含公钥指纹核对),并导出 `pool.csv` / `pool.sql`。详见 [`tools/license-tool/README.md`](tools/license-tool/README.md)。
> ⚠️ 该 exe 内含私钥,**只放自己电脑、不要外发**(销售/代理/外包都不行);`dist/` 已在 `.gitignore` 中排除。
**方式二:命令行**
```bash
node tools/license-cli.mjs keygen # 一次性生成密钥对
node tools/license-cli.mjs issue --customer ABC001 --days 365 # 单客户发码(打印到控制台)
node tools/license-cli.mjs issue --count 100 --start 1 # 批量发码 → pool.csv / pool.sql
node tools/license-cli.mjs verify # 校验授权码
```
## 目录结构
```
src/designer/
├── index.ts # 公共 API
├── types.ts # 类型 / 模板 Schema
├── schema.ts # 元素工厂 + 默认值
├── constants.ts # 纸张尺寸 / mm↔px
├── data.ts # 数据绑定解析
├── license.ts # 授权校验(离线验签)+ 遥测 + 打印水印
├── render.ts # 元素 → HTML(画布/打印共用)
├── print.ts # 打印 HTML 生成 + 分页
├── seal.ts # 公章 SVG 生成器
├── composables/ # 状态 / 历史 / 资源
├── components/ # 画布 / 面板 / 元素交互
├── PrintDesigner.vue # 设计器页(根组件)
└── PrintPreview.vue # 预览页(切换模板 / 内嵌预览 / 打印)
tools/
├── license-cli.mjs # 离线发码工具(命令行)
└── license-tool/ # 授权码签发桌面工具(Go,构建为单文件 exe)
```
详细设计见 [`docs/architecture.md`](docs/architecture.md)。