vg-print 1.1.408 → 1.1.504
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -138
- package/dist/style.css +1 -1
- package/dist/vg-print.es.js +15281 -14861
- package/package.json +1 -1
- package/README.en.md +0 -552
package/README.md
CHANGED
|
@@ -124,10 +124,10 @@ setSocketIo(io)
|
|
|
124
124
|
|
|
125
125
|
也可直接使用 `window.io = io`(等价)。
|
|
126
126
|
|
|
127
|
-
###
|
|
127
|
+
### 可选依赖:请求型数据源(axios)
|
|
128
128
|
|
|
129
129
|
- 本库默认不内置 `axios`,以减少默认安装体积。
|
|
130
|
-
-
|
|
130
|
+
- 仅当你需要通过数据源配置发起接口请求、测试链接或执行数据处理时,才需要安装并注入:
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
133
|
npm i axios
|
|
@@ -142,7 +142,7 @@ import { setHttpClient } from 'vg-print'
|
|
|
142
142
|
setHttpClient(axios)
|
|
143
143
|
```
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
如果只使用 `data-sources` 外部传入数据,不需要安装 axios;未传外部数据源且未注入 axios 时,请求型“数据源”入口会自动提示依赖缺失,不会影响设计器其他功能。
|
|
146
146
|
|
|
147
147
|
### 可选插件:条码/二维码(@vg-print/plugin-bwip-js)
|
|
148
148
|
|
|
@@ -197,7 +197,7 @@ hiprint.register({
|
|
|
197
197
|
- `save` 保存(拆分按钮的主键)
|
|
198
198
|
- `edit-template` 打开“编辑模板数据”对话框
|
|
199
199
|
- `edit-data` 打开“编辑打印数据”对话框
|
|
200
|
-
- `lang-change` 语言切换(值为语言码:`cn`、`en`、`
|
|
200
|
+
- `lang-change` 语言切换(值为语言码:`cn`、`en`、`cn_tw`)
|
|
201
201
|
- `feedback` 反馈/帮助
|
|
202
202
|
|
|
203
203
|
### 插槽(Slots)
|
|
@@ -331,7 +331,7 @@ const onSaveDirect = () => designer.value?.save()
|
|
|
331
331
|
- `showPrinterSelect: boolean` 是否显示“打印机选择”下拉区域,默认 `true`
|
|
332
332
|
- `modalShow: boolean` 弹窗显隐(支持 `v-model:modalShow`)
|
|
333
333
|
- `width: string | number` 弹窗宽度(默认 `'80%'`)
|
|
334
|
-
- `defaultLang: string` 组件内 i18n 语言(Standalone 时使用);支持 `cn`、`en`、`
|
|
334
|
+
- `defaultLang: string` 组件内 i18n 语言(Standalone 时使用);支持 `cn`、`en`、`cn_tw`;默认 `cn`
|
|
335
335
|
|
|
336
336
|
预览头部标题使用
|
|
337
337
|
|
|
@@ -363,40 +363,6 @@ const onSaveDirect = () => designer.value?.save()
|
|
|
363
363
|
- 但只有“异常/进度”场景才会带 message 或 payload
|
|
364
364
|
- 普通状态(如 show:start 、 render:done 、 image:done )没有额外信息,所以就是 undefined
|
|
365
365
|
|
|
366
|
-
```ts
|
|
367
|
-
type PreviewShowOptions = {
|
|
368
|
-
width?: string | number
|
|
369
|
-
dialogTitle?: string
|
|
370
|
-
dialogTitleHtml?: string
|
|
371
|
-
showPdf?: boolean
|
|
372
|
-
showImg?: boolean
|
|
373
|
-
showPrint2?: boolean
|
|
374
|
-
showPrinterSelect?: boolean
|
|
375
|
-
showTitle?: boolean
|
|
376
|
-
pdfOptions?: object
|
|
377
|
-
imageOptions?: object
|
|
378
|
-
directPrintOptions?: object
|
|
379
|
-
browserPrintOptions?: object
|
|
380
|
-
onClick?: (type: 'pdf' | 'img' | 'print' | 'print2' | 'close') => void
|
|
381
|
-
onClose?: () => void
|
|
382
|
-
onRender?: () => void
|
|
383
|
-
callBackOptions?: {
|
|
384
|
-
statusCallback?: (status: {
|
|
385
|
-
type:
|
|
386
|
-
| 'show:start' | 'show:ready'
|
|
387
|
-
| 'render:start' | 'render:done' | 'render:error'
|
|
388
|
-
| 'pdf:start' | 'pdf:progress' | 'pdf:done' | 'pdf:error'
|
|
389
|
-
| 'image:start' | 'image:progress' | 'image:done' | 'image:error'
|
|
390
|
-
| 'print:start' | 'print:done' | 'print:error'
|
|
391
|
-
| 'directPrint:start' | 'directPrint:progress' | 'directPrint:done' | 'directPrint:error'
|
|
392
|
-
| 'close'
|
|
393
|
-
message?: string
|
|
394
|
-
payload?: any
|
|
395
|
-
}) => void
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
```
|
|
399
|
-
|
|
400
366
|
### 使用示例(单独使用)
|
|
401
367
|
|
|
402
368
|
```vue
|
|
@@ -549,60 +515,6 @@ import 'vg-print/style.css'
|
|
|
549
515
|
|
|
550
516
|
环境要求:Vue 3、Node >= 18.18。无需单独安装 `vue-plugin-hiprint`,本库已内置并导出 `hiprint` 能力。
|
|
551
517
|
|
|
552
|
-
## 快速开始
|
|
553
|
-
|
|
554
|
-
```js
|
|
555
|
-
// main.ts
|
|
556
|
-
import { createApp } from 'vue'
|
|
557
|
-
import App from './App.vue'
|
|
558
|
-
import vgPrint from 'vg-print'
|
|
559
|
-
import 'vg-print/style.css'
|
|
560
|
-
|
|
561
|
-
createApp(App).use(vgPrint).mount('#app')
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
```vue
|
|
565
|
-
<template>
|
|
566
|
-
<FullDesigner
|
|
567
|
-
ref="designer"
|
|
568
|
-
:hi-host="'http://127.0.0.1:17521'"
|
|
569
|
-
:hi-token="'your-token'"
|
|
570
|
-
:hi-auto-connect="true"
|
|
571
|
-
/>
|
|
572
|
-
|
|
573
|
-
<el-button @click="preview">预览</el-button>
|
|
574
|
-
<el-button @click="printBrowser">浏览器打印</el-button>
|
|
575
|
-
<el-button @click="exportPdf">导出 PDF</el-button>
|
|
576
|
-
<el-button @click="exportImage">导出图片</el-button>
|
|
577
|
-
<el-button @click="directPrint">直接打印(需客户端)</el-button>
|
|
578
|
-
</template>
|
|
579
|
-
|
|
580
|
-
<script setup>
|
|
581
|
-
import { ref } from 'vue'
|
|
582
|
-
const designer = ref(null)
|
|
583
|
-
|
|
584
|
-
// 预览
|
|
585
|
-
const preview = () => designer.value.preView()
|
|
586
|
-
// 浏览器打印
|
|
587
|
-
const printBrowser = () => designer.value.printView()
|
|
588
|
-
// 导出 PDF
|
|
589
|
-
const exportPdf = () => designer.value.toPdf()
|
|
590
|
-
// 导出图片
|
|
591
|
-
const exportImage = () => designer.value.toImage()
|
|
592
|
-
// 直接打印(需客户端已连接)
|
|
593
|
-
const directPrint = () => designer.value.print()
|
|
594
|
-
|
|
595
|
-
// 连接控制与参数设置
|
|
596
|
-
const setHostToken = () => designer.value.setHiwebSocket('http://127.0.0.1:17521', 'token')
|
|
597
|
-
// 主动连接客户端
|
|
598
|
-
const connect = () => designer.value.connect()
|
|
599
|
-
// 断开客户端
|
|
600
|
-
const disconnect = () => designer.value.disconnect()
|
|
601
|
-
// 关闭自动连接策略
|
|
602
|
-
const disableAutoConnect = () => designer.value.disAutoConnect()
|
|
603
|
-
</script>
|
|
604
|
-
```
|
|
605
|
-
|
|
606
518
|
## API(FullDesigner)
|
|
607
519
|
|
|
608
520
|
### 属性(Props,含描述)
|
|
@@ -610,9 +522,10 @@ const disableAutoConnect = () => designer.value.disAutoConnect()
|
|
|
610
522
|
- `hi-host: string` 客户端服务地址;示例 `http://127.0.0.1:17521`,用于直连打印
|
|
611
523
|
- `hi-token: string` 客户端鉴权令牌;与客户端配置一致时方可直连打印
|
|
612
524
|
- `hi-auto-connect: boolean` 是否自动连接客户端;默认 `true`,为 `false` 时需手动调用 `connect()`
|
|
613
|
-
- `initial-template: object` 初始化模板 JSON
|
|
525
|
+
- `initial-template: object` 初始化模板 JSON;组件会先完成设计器页面的首次渲染,再将模板数据加载进去;为空时使用内置示例模板
|
|
614
526
|
- `initial-print-data: object | array` 初始化打印数据;支持对象或数组,运行时变更会即时生效
|
|
615
|
-
- `
|
|
527
|
+
- `data-sources: Array | object` 外部传入的数据源字段元数据;支持直接传入字段列表、表结构字段列表或带 `dataSets`/`fields` 的完整结构,用于设计器字段选择器;不传时继续使用数据源配置中的请求方式
|
|
528
|
+
- `default-lang: string` 默认语言;支持 `cn`、`en`、`cn_tw`;默认 `cn`
|
|
616
529
|
- `config: object` 设计器引擎配置;会在初始化前注入到 `hiprint.setConfig(config)`(同时写入 `window.HIPRINT_CONFIG`)。常用字段:
|
|
617
530
|
- `showAdsorbLine: boolean` 是否显示吸附参考线(拖动/缩放时的对齐辅助线)
|
|
618
531
|
- `showPosition: boolean` 是否显示元素坐标提示(移动元素时显示位置)
|
|
@@ -707,18 +620,6 @@ const disableAutoConnect = () => designer.value.disAutoConnect()
|
|
|
707
620
|
- `disconnect()` 断开客户端连接
|
|
708
621
|
- `disAutoConnect()` 关闭自动连接策略;阻止自动重连
|
|
709
622
|
|
|
710
|
-
### 事件(Emits,含描述)
|
|
711
|
-
|
|
712
|
-
- `save` 保存模板与数据;回调参数结构:
|
|
713
|
-
|
|
714
|
-
```js
|
|
715
|
-
{
|
|
716
|
-
template, // 模板 JSON
|
|
717
|
-
data, // 当前打印数据(对象或数组)
|
|
718
|
-
templateId // 模板标识(若存在)
|
|
719
|
-
}
|
|
720
|
-
```
|
|
721
|
-
|
|
722
623
|
示例:
|
|
723
624
|
|
|
724
625
|
```vue
|
|
@@ -728,14 +629,30 @@ const disableAutoConnect = () => designer.value.disAutoConnect()
|
|
|
728
629
|
:initial-print-data="rows"
|
|
729
630
|
default-lang="cn"
|
|
730
631
|
@save="onSave"
|
|
632
|
+
@onDesigned="onDesigned"
|
|
731
633
|
/>
|
|
732
634
|
</template>
|
|
733
635
|
|
|
734
636
|
<script setup>
|
|
637
|
+
/* 保存方法
|
|
638
|
+
template, // 模板 JSON
|
|
639
|
+
data, // 当前打印数据(对象或数组)
|
|
640
|
+
templateId // 模板标识(若存在)
|
|
641
|
+
*/
|
|
735
642
|
const onSave = ({ template, data, templateId }) => {
|
|
736
643
|
// 调用接口持久化到数据库
|
|
737
644
|
// await api.saveTemplate({ template, data, templateId })
|
|
738
645
|
}
|
|
646
|
+
/* 设计器渲染完成后执行自定义逻辑
|
|
647
|
+
designer, // hiprint.PrintTemplate 实例
|
|
648
|
+
template, // 当前模板 JSON
|
|
649
|
+
source // initial / incoming / library / json
|
|
650
|
+
*/
|
|
651
|
+
const onDesigned = ({ designer, template, source }) => {
|
|
652
|
+
// 设计器页面与初始模板已经完成加载
|
|
653
|
+
console.log(source, designer, template)
|
|
654
|
+
// 也可以在这里继续调用 designer.update(...) 或其他设计器方法
|
|
655
|
+
}
|
|
739
656
|
</script>
|
|
740
657
|
```
|
|
741
658
|
|
|
@@ -746,12 +663,96 @@ const onSave = ({ template, data, templateId }) => {
|
|
|
746
663
|
|
|
747
664
|
## 数据源使用说明
|
|
748
665
|
|
|
749
|
-
`FullDesigner`
|
|
666
|
+
`FullDesigner` 内置了数据源管理与字段选择能力,可将接口返回字段集中整理,并在设计器字段属性中快速选择。
|
|
667
|
+
|
|
668
|
+
### 外部传入数据源字段元数据(无需请求接口)
|
|
669
|
+
|
|
670
|
+
如果业务系统已经取得表结构信息,不希望由 `vg-print` 再次请求接口,可以通过 `data-sources` 直接传入字段名和字段描述元数据。组件会根据这些元数据生成字段树,供设计器属性面板中的字段选择器使用;这种方式不依赖 axios,也不会把外部数据写入本地数据源配置。
|
|
671
|
+
|
|
672
|
+
```vue
|
|
673
|
+
<template>
|
|
674
|
+
<FullDesigner
|
|
675
|
+
:data-sources="designerDataSources"
|
|
676
|
+
/>
|
|
677
|
+
</template>
|
|
678
|
+
|
|
679
|
+
<script setup>
|
|
680
|
+
import { ref } from 'vue'
|
|
681
|
+
|
|
682
|
+
// data-sources 用于设计态字段选择器,只传字段元数据,不传实际业务数据
|
|
683
|
+
const designerDataSources = ref([
|
|
684
|
+
{
|
|
685
|
+
id: 'patient-info',
|
|
686
|
+
name: '患者信息',
|
|
687
|
+
groupName: '业务数据',
|
|
688
|
+
desc: '患者基本信息',
|
|
689
|
+
fields: [
|
|
690
|
+
{ text: '主键', field: 'id' },
|
|
691
|
+
{ text: '病人姓名', field: 'patientName' },
|
|
692
|
+
{ text: '病人年龄', field: 'patientAge' },
|
|
693
|
+
{ text: '科室名称', field: 'department.name' }
|
|
694
|
+
]
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
id: 'fee-details',
|
|
698
|
+
name: '费用明细',
|
|
699
|
+
groupName: '业务数据',
|
|
700
|
+
desc: '患者费用明细',
|
|
701
|
+
fields: [
|
|
702
|
+
{ text: '收费项目', field: 'itemName' },
|
|
703
|
+
{ text: '金额', field: 'amount' }
|
|
704
|
+
]
|
|
705
|
+
}
|
|
706
|
+
])
|
|
707
|
+
</script>
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
字段选择器中会按“业务数据 → 患者基本信息/患者费用明细 → 字段”展示。外层分类使用 `groupName`,默认数据集名称优先使用 `desc`;字段元数据变化后,字段树会随组件属性更新。
|
|
711
|
+
|
|
712
|
+
如果需要自定义字段显示名称或多个数据集,可以直接传入完整数据集结构:
|
|
713
|
+
|
|
714
|
+
```js
|
|
715
|
+
const designerDataSources = [
|
|
716
|
+
{
|
|
717
|
+
id: 'patient-info',
|
|
718
|
+
name: '患者信息',
|
|
719
|
+
groupName: '业务数据',
|
|
720
|
+
desc: '患者基本信息',
|
|
721
|
+
dataSets: [
|
|
722
|
+
{
|
|
723
|
+
id: 'patient',
|
|
724
|
+
name: '患者资料',
|
|
725
|
+
fields: [
|
|
726
|
+
{ text: '病人姓名', field: 'patientName' },
|
|
727
|
+
{ text: '科室名称', field: 'department.name' }
|
|
728
|
+
]
|
|
729
|
+
}
|
|
730
|
+
]
|
|
731
|
+
}
|
|
732
|
+
]
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
如果后端返回的是表结构记录,转换为可绑定字段:
|
|
736
|
+
|
|
737
|
+
```js
|
|
738
|
+
const designerDataSources = [
|
|
739
|
+
{
|
|
740
|
+
id: 'patient-info',
|
|
741
|
+
name: '患者信息',
|
|
742
|
+
groupName: '业务数据',
|
|
743
|
+
desc: '患者信息表',
|
|
744
|
+
data: [
|
|
745
|
+
{ column_name: 'id', column_comment: '主键' },
|
|
746
|
+
{ column_name: 'patientName', column_comment: '病人姓名' }
|
|
747
|
+
]
|
|
748
|
+
}
|
|
749
|
+
]
|
|
750
|
+
```
|
|
750
751
|
|
|
751
752
|
### 入口与能力
|
|
752
753
|
|
|
753
754
|
- 入口:二级工具栏点击“数据源”打开管理弹窗
|
|
754
|
-
-
|
|
755
|
+
- 能力:数据源配置、分类管理、测试获取、数据处理脚本、错误处理脚本、字段树选择
|
|
755
756
|
|
|
756
757
|
### 使用流程(推荐)
|
|
757
758
|
|
|
@@ -764,10 +765,8 @@ const onSave = ({ template, data, templateId }) => {
|
|
|
764
765
|
3. 编写“数据处理”脚本(`processCode`)并点击“测试链接”:
|
|
765
766
|
- 左侧显示原始返回(`rawResult`)
|
|
766
767
|
- 右侧显示处理结果(`processed`)
|
|
767
|
-
4.
|
|
768
|
-
|
|
769
|
-
- 组件规则:`manual` / `global` / `custom`
|
|
770
|
-
5. 规则生效后,组件字段下拉会按规则自动展示字段列表
|
|
768
|
+
4. 为数据源填写“分类名称”(不填写时使用唯一名称),便于在字段选择器中归类查找。
|
|
769
|
+
5. 在设计器组件的“字段名”输入框后点击选择按钮,按“分类 → 数据集 → 字段”的树结构选取字段,选中后会自动回填。
|
|
771
770
|
|
|
772
771
|
### processCode / errorProcessCode 约定
|
|
773
772
|
|
|
@@ -787,7 +786,7 @@ $message.error(error.message)
|
|
|
787
786
|
|
|
788
787
|
### 字段结构约定
|
|
789
788
|
|
|
790
|
-
|
|
789
|
+
推荐返回以下结构,字段树识别最稳定:
|
|
791
790
|
|
|
792
791
|
```js
|
|
793
792
|
[
|
|
@@ -806,26 +805,6 @@ return (result.data || []).map(item => ({
|
|
|
806
805
|
}))
|
|
807
806
|
```
|
|
808
807
|
|
|
809
|
-
### 缓存与持久化策略(当前实现)
|
|
810
|
-
|
|
811
|
-
- 数据源配置持久化:`KEY_VG_DATASOURCES`
|
|
812
|
-
- 字段绑定规则持久化:`KEY_VG_FIELD_BINDINGS`
|
|
813
|
-
- 数据源运行时缓存:`KEY_VG_DS_RUNTIME_CACHE`
|
|
814
|
-
- 仅缓存处理后数据(`processed`)
|
|
815
|
-
- 不缓存原始返回(`rawResult`)
|
|
816
|
-
- 默认 TTL:30 分钟
|
|
817
|
-
- 默认最大条目:20
|
|
818
|
-
|
|
819
|
-
### 常见问题
|
|
820
|
-
|
|
821
|
-
- 测试成功但没有字段:
|
|
822
|
-
- 检查 `processCode` 返回值是否为对象或对象数组
|
|
823
|
-
- 检查数据集 path 是否命中处理结果
|
|
824
|
-
- 字段下拉未更新:
|
|
825
|
-
- 先“测试链接”生成字段,再“保存规则”
|
|
826
|
-
- 表达式参数无效:
|
|
827
|
-
- `expression` 求值异常会被忽略,建议先用简单表达式验证
|
|
828
|
-
|
|
829
808
|
## 高级用法(hiprint)
|
|
830
809
|
|
|
831
810
|
本库导出 `hiprint`,可直接创建与操作模板对象(`hiprint.PrintTemplate`):
|
|
@@ -994,10 +973,6 @@ import {
|
|
|
994
973
|
// 连接客户端(需要先启动客户端)
|
|
995
974
|
connect()
|
|
996
975
|
|
|
997
|
-
// 检查客户端是否已连接
|
|
998
|
-
console.log(isClientConnected())
|
|
999
|
-
|
|
1000
|
-
|
|
1001
976
|
// 1) 创建模板实例(可复用)
|
|
1002
977
|
const tpl = createTemplate(tmplJson)
|
|
1003
978
|
|