yh-hiprint 2.5.2 → 2.6.0

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.
@@ -134,26 +134,48 @@ async function getData(query) {
134
134
  list = [];
135
135
  }
136
136
  }
137
- let html = hiprintTemplate.getHtml(list);
138
- if (opener && returnHtml && html[0]) {
139
- opener.postMessage({
140
- type: 'sendPrintHTML',
141
- data: html[0].innerHTML,
142
- });
143
- ElMessageBox.alert('渲染完成!确认后返回系统').then(() => {
144
- window.close();
145
- });
137
+
138
+ // 检查是否启用客户端打印
139
+ const useClientPrint = localStorage.getItem('useClientPrint') === 'true';
140
+
141
+ if (useClientPrint && hiprint.hiwebSocket.opened) {
142
+ // 使用客户端打印
143
+ loading.setText('正在连接打印客户端');
144
+
145
+ // 获取打印机列表
146
+ let printerList = hiprint.hiwebSocket.getPrinterList();
147
+ if (!printerList || printerList.length === 0) {
148
+ ElMessageBox.alert('未获取到打印机列表', '提示');
149
+ return;
150
+ }
151
+
152
+ loading.close();
153
+
154
+ // 显示打印机选择对话框
155
+ showPrinterSelectionDialog(printerList, hiprintTemplate, list);
146
156
  } else {
147
- document.body.innerHTML = '';
148
- document.body.appendChild(html[0]);
149
- if (hasData) {
150
- setTimeout(() => {
151
- window.print();
152
- }, 1000);
153
- } else {
154
- ElMessageBox.alert('数据源没有数据,打印将取消').then(() => {
157
+ // 默认浏览器打印
158
+ let html = hiprintTemplate.getHtml(list);
159
+ if (opener && returnHtml && html[0]) {
160
+ opener.postMessage({
161
+ type: 'sendPrintHTML',
162
+ data: html[0].innerHTML,
163
+ });
164
+ ElMessageBox.alert('渲染完成!确认后返回系统').then(() => {
155
165
  window.close();
156
166
  });
167
+ } else {
168
+ document.body.innerHTML = '';
169
+ document.body.appendChild(html[0]);
170
+ if (hasData) {
171
+ setTimeout(() => {
172
+ window.print();
173
+ }, 1000);
174
+ } else {
175
+ ElMessageBox.alert('数据源没有数据,打印将取消').then(() => {
176
+ window.close();
177
+ });
178
+ }
157
179
  }
158
180
  }
159
181
  success.value = false;
@@ -164,7 +186,9 @@ async function getData(query) {
164
186
  console.error(error);
165
187
  error.value = true;
166
188
  } finally {
167
- loading.close();
189
+ if (loading) {
190
+ loading.close();
191
+ }
168
192
  }
169
193
  }
170
194
  </script>
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- declare module "yh-hiprint";
1
+ declare module 'yh-hiprint';
2
2
 
3
3
  /** JQuery 简化dom操作的库 */
4
4
  export declare const jquery: JQuery;
@@ -12,7 +12,6 @@ export declare const zIndex;
12
12
  /** hiprint 侧边栏配置 */
13
13
  export declare const panel;
14
14
 
15
- export declare const hiprint;
16
15
  export declare const defaultElementTypeProvider: (options: any) => {
17
16
  addElementTypes: (context) => void;
18
17
  };
@@ -64,4 +63,315 @@ export declare interface HiprintOption {
64
63
  isCustom: boolean;
65
64
  }
66
65
 
67
- export declare const hiprint: (HiprintOption) => void;
66
+ //#region Hiprint 类型文件
67
+
68
+
69
+ /** 打印元素唯一标识 */
70
+ type Tid = string;
71
+
72
+ export interface Field {
73
+ field: string;
74
+ text: string;
75
+ }
76
+
77
+ export interface TextPrintElementType {
78
+ printElementType: {
79
+ tid: Tid;
80
+ title: string;
81
+ field: string;
82
+ data: string;
83
+ formatter: (title,value,options,templateData,target) => string;
84
+ styler: (value,options,target,templateData,) => CSSStyleDeclaration;
85
+ onRendered: (target,options,paperTarget) => void;
86
+ fields: Field[],
87
+ },
88
+ options: {
89
+ /**
90
+ * 标题
91
+ * field 存在则
92
+ */
93
+ title: string;
94
+ /** 字段名称,从数据源获取数据的属性名称 */
95
+ field: string;
96
+ /** 测试数据 设计时使用 */
97
+ testData: string;
98
+ /** 字体名称 */
99
+ fontFamily: string;
100
+ /** 字体大小 */
101
+ fontSize: string;
102
+ /** 字体粗细 */
103
+ fontWeight: string;
104
+ /** 字体间距 */
105
+ letterSpacing: number;
106
+ /** 字体颜色 */
107
+ color: string;
108
+ /** 文本描述 */
109
+ textDecoration: string;
110
+ /** 文字水平对齐 */
111
+ textAlign: 'left'|'center'|'right';
112
+ /** 行高 数字带单位 例如 18pt */
113
+ lineHeight: string;
114
+ /**
115
+ * 文本类型
116
+ * text - 纯文本
117
+ * barcode - 条形码
118
+ * qrcode - 二维码
119
+ */
120
+ textType: 'text' | 'barcode' | 'qrcode';
121
+ /** 条形码格式 */
122
+ barcodeMode: string;
123
+ /** 因此标题 */
124
+ hideTitle: boolean;
125
+ /**
126
+ * 页眉/页脚/固定定位等元素显示规则
127
+ * first - 首页显示
128
+ * odd - 奇数页显示
129
+ */
130
+ showInPage: 'first' | 'odd' | 'even' | 'last';
131
+ /** 固定定位 */
132
+ fixed: boolean;
133
+ /** 打印设计时拖拽方向 */
134
+ axis: 'v' | 'h';
135
+ /** 旋转角度 */
136
+ transform: number;
137
+ }
138
+ }
139
+
140
+ export interface ImagePrintElementType {
141
+ printElementType: {
142
+ tid: string;
143
+ field: string;
144
+ data: string;
145
+ formatter: () => void;
146
+ styler: () => void;
147
+ onRendered: () => void;
148
+ fields: Field[];
149
+ },
150
+ options: {
151
+ title: string;
152
+ field: string;
153
+ src: string;
154
+ showInPage: string;
155
+ fixed: boolean;
156
+ axis: string;
157
+ transform: number;
158
+ }
159
+ }
160
+
161
+ export interface HlinePrintElementType {
162
+ printElementType: {
163
+ tid: string;
164
+ onRendered: () => void;
165
+ },
166
+ options: {
167
+ borderColor: string;
168
+ borderWidth: string;
169
+ showInPage: string;
170
+ fixed: boolean;
171
+ axis: string;
172
+ transform: number;
173
+ }
174
+ }
175
+ export interface VlinePrintElementType {
176
+ printElementType: {
177
+ tid: string;
178
+ onRendered: () => void;
179
+ },
180
+ options: {
181
+ borderColor: string;
182
+ borderWidth: string;
183
+ showInPage: string;
184
+ fixed: boolean;
185
+ axis: string;
186
+ transform: number;
187
+ }
188
+ }
189
+ export interface RectPrintElementType {
190
+ printElementType: {
191
+ tid: string;
192
+ onRendered: () => void;
193
+ },
194
+ options: {
195
+ borderColor: string;
196
+ borderWidth: string;
197
+ showInPage: string;
198
+ fixed: boolean;
199
+ axis: string;
200
+ transform: number;
201
+ }
202
+ }
203
+ export interface OvalPrintElementType {
204
+ printElementType: {
205
+ tid: string;
206
+ onRendered: () => void;
207
+ },
208
+ options: {
209
+ borderColor: string;
210
+ borderWidth: string;
211
+ showInPage: string;
212
+ fixed: boolean;
213
+ axis: string;
214
+ transform: number;
215
+ }
216
+ }
217
+ export interface HlinePrintElementType {
218
+ printElementType: {
219
+ tid: string;
220
+ onRendered: () => void;
221
+ },
222
+ options: {
223
+ borderColor: string;
224
+ borderWidth: string;
225
+ showInPage: string;
226
+ fixed: boolean;
227
+ axis: string;
228
+ transform: number;
229
+ }
230
+ }
231
+
232
+ export interface TableColumn {
233
+ width: number;
234
+ title: string;
235
+ field: string;
236
+ fixed: boolean;
237
+ rowspan: number;
238
+ colspan: number;
239
+ align: string;
240
+ halign: string;
241
+ formater: () => void;
242
+ styler: () => void;
243
+ }
244
+
245
+ export interface TablePrintElementType {
246
+ printElementType: {
247
+ tid: string;
248
+ title: string;
249
+ field: string;
250
+ columns: TableColumn[]
251
+ styler: () => void;
252
+ rowStyler: () => void;
253
+ formatter: () => void;
254
+ groupFields: any[];
255
+ groupFormatter: () => void;
256
+ fotterFormatter: () => void;
257
+ gridColumnsFooterFormatter: () => void;
258
+ groupFooterFormatter: () => void;
259
+ onRendered: () => void;
260
+ fields: Field[];
261
+ },
262
+ options: {
263
+ field: string;
264
+ fontFamily: string;
265
+ fontSize: number;
266
+ lineHeight: number;
267
+ textAlign: 'left'|'center'|'right';
268
+ tableBorder: 'noBorder' | 'border';
269
+ tableHeaderBorder: 'noBorder'|'border'|'topBorder'|'bottomBorder'|'topBottomBorder';
270
+ tableHeaderCellBorder: 'noBorder'|'border';
271
+ tableHeaderRowHeight: number;
272
+ tableHeaderBackground: string;
273
+ tableHeaderFontSize: number;
274
+ tableHeaderFontWeight: string;
275
+ tableBodyCellBorder: string;
276
+ tableBodyRowBorder: string;
277
+ tableBodyRowHeight: number;
278
+ axis: 'v' | 'h';
279
+ lHeight: number;
280
+ }
281
+ }
282
+ export interface LongTextPrintElementType {
283
+ printElementType: {
284
+ tid: string;
285
+ title: string;
286
+ field: string;
287
+ data: string;
288
+ formatter: () => void;
289
+ styler: () => void;
290
+ onRendered: () => void;
291
+ fields: Field[];
292
+ },
293
+ options: {
294
+ title: string;
295
+ field: string;
296
+ testData: string;
297
+ fontFamily: string;
298
+ fontSize: number;
299
+ fontWeight: string;
300
+ letterSpacing: number;
301
+ color: string;
302
+ textDecoration: string;
303
+ textAlign: string;
304
+ lineHeight: number;
305
+ hideTitle: boolean;
306
+ longTextIndent: number;
307
+ showInPage: string;
308
+ fixed: boolean;
309
+ leftSpaceRemoved: boolean;
310
+ axis: string;
311
+ lHeight: number;
312
+ transform: number;
313
+ }
314
+ }
315
+ export interface HTMLPrintElementType {
316
+ printElementType: {
317
+ tid: string;
318
+ title: string;
319
+ field: string;
320
+ data: string;
321
+ formatter: () => void;
322
+ styler: () => void;
323
+ onRendered: () => void;
324
+ },
325
+ options: {
326
+ title: string;
327
+ field: string;
328
+ testData: string;
329
+ fontFamily: string;
330
+ showInPage: string;
331
+ fixed: boolean;
332
+ axis: string;
333
+ transform: number;
334
+ }
335
+ }
336
+
337
+ /** Hiprint 打印面板对象 */
338
+ export interface PrintPanel {
339
+ addPrintText: (options?) => void;
340
+ addPrintLongText: () => void;
341
+ }
342
+
343
+ /** Hprint 打印面板创建配置对象 */
344
+ export interface PrintPanelOptions {
345
+ /** 宽度 */
346
+ width: number;
347
+ /** 高度 */
348
+ height: number;
349
+ /** 页脚高度 */
350
+ paperFotter: number;
351
+ /** 页眉高度 */
352
+ paperHeader: number;
353
+ }
354
+
355
+ export interface PrintTemplateData {
356
+
357
+ }
358
+
359
+ export interface PrintTemplateOptions {
360
+ template: PrintTemplateData
361
+ }
362
+
363
+ export interface PrintTemplate {
364
+ addPrintPanel:(options:PrintPanelOptions) => void;
365
+ design: () => void;
366
+ }
367
+
368
+ export declare const hiprint = {
369
+ /** 初始化 Hiprint */
370
+ init:() => viod,
371
+ /** 创建打印模板对象 */
372
+ PrintTemplate: {
373
+ new (options: PrintTemplateOptions): PrintTemplate;
374
+ }
375
+ }
376
+
377
+ //#endregion
package/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import './libs/jquery';
2
+ import { ElDialog, ElSelect, ElOption, ElButton, ElMessageBox, ElLoading } from 'element-plus';
2
3
  export { hiprint, defaultElementTypeProvider, print, print2, usePaper, useScale, useDataSource } from './hooks/useHiprint';
3
4
  export { default as fontSize } from './font-size';
4
5
  export { default as scale } from './scale';
5
6
  export { default as zIndex } from './z-index';
6
7
  export { default as panel } from './panel';
7
8
  import { getPrintTemplate } from 'yh-hiprint/libs/index.js';
8
- import { ElMessageBox, ElLoading } from 'element-plus';
9
+ import { createVNode, render, createApp } from 'vue';
9
10
 
10
11
  export function cLog (string, isError = false) {
11
12
  if (isError) {
@@ -16,42 +17,46 @@ export function cLog (string, isError = false) {
16
17
  }
17
18
 
18
19
  const hiprintFun = async ({ code, params, data, isCustom, returnHtml }) => {
19
- let height = document.documentElement.clientHeight;
20
- let width = 1200;
21
- let left = (document.documentElement.clientWidth - 1200) / 2;
22
- // 转换数组
23
- let paramData = params;
24
- if (!Array.isArray(params)) {
25
- paramData = [params];
26
- }
27
- let url = '/hiprint/#/preview?code=' + encodeURIComponent(code);
28
- if (params) {
29
- url += `&params=${encodeURIComponent(JSON.stringify(paramData))}`;
30
- }
31
- if (data) {
32
- url += `&data=${encodeURIComponent(JSON.stringify(data))}`;
33
- }
34
- if (isCustom) {
35
- url += `&isCustom=${isCustom ? '1' : '0'}`;
36
- }
37
- if (returnHtml) {
38
- url += `&returnHtml=${returnHtml ? '1' : '0'}`;
39
- }
40
- let windowOpen = window.open(url, 'hiprintWindow', `height=${height}, width=${width}, top=20, left=${left}, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no`);
41
-
42
- return new Promise((resolve, reject) => {
43
- if (!windowOpen) {
44
- reject("预览窗口渲染失败!");
20
+ if (hiprint.hiwebSocket && hiprint.hiwebSocket.opened) {
21
+ clientPrintHandler(code, params, data);
22
+ } else {
23
+ let height = document.documentElement.clientHeight;
24
+ let width = 1200;
25
+ let left = (document.documentElement.clientWidth - 1200) / 2;
26
+ // 转换数组
27
+ let paramData = params;
28
+ if (!Array.isArray(params)) {
29
+ paramData = [params];
45
30
  }
46
- function printHTMLHandler (e) {
47
- let { type, data } = e.data;
48
- if (type === "sendPrintHTML" && data) {
49
- resolve(data);
50
- }
51
- window.removeEventListener('message', printHTMLHandler);
31
+ let url = '/hiprint/#/preview?code=' + encodeURIComponent(code);
32
+ if (params) {
33
+ url += `&params=${encodeURIComponent(JSON.stringify(paramData))}`;
52
34
  }
53
- window.addEventListener('message', printHTMLHandler);
54
- });
35
+ if (data) {
36
+ url += `&data=${encodeURIComponent(JSON.stringify(data))}`;
37
+ }
38
+ if (isCustom) {
39
+ url += `&isCustom=${isCustom ? '1' : '0'}`;
40
+ }
41
+ if (returnHtml) {
42
+ url += `&returnHtml=${returnHtml ? '1' : '0'}`;
43
+ }
44
+ let windowOpen = window.open(url, 'hiprintWindow', `height=${height}, width=${width}, top=20, left=${left}, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no`);
45
+
46
+ return new Promise((resolve, reject) => {
47
+ if (!windowOpen) {
48
+ reject("预览窗口渲染失败!");
49
+ }
50
+ function printHTMLHandler (e) {
51
+ let { type, data } = e.data;
52
+ if (type === "sendPrintHTML" && data) {
53
+ resolve(data);
54
+ }
55
+ window.removeEventListener('message', printHTMLHandler);
56
+ }
57
+ window.addEventListener('message', printHTMLHandler);
58
+ });
59
+ }
55
60
  };
56
61
 
57
62
  const silentHiprint = async ({ code, params = {}, data }) => {
@@ -89,15 +94,226 @@ const silentHiprint = async ({ code, params = {}, data }) => {
89
94
  loading = null;
90
95
  }
91
96
  }
92
-
93
97
  };
94
98
 
95
99
  window.silentHiprint = silentHiprint;
96
100
 
101
+ // 客户端打印处理函数
102
+ const clientPrintHandler = async (code, params, data) => {
103
+ let loading = null;
104
+ try {
105
+ loading = ElLoading.service({
106
+ text: "正在获取打印模板"
107
+ });
108
+
109
+ // 获取打印模板
110
+ let res = await getPrintTemplate(code, params);
111
+ if (res.status !== 200 || !res.data || !res.data.json) {
112
+ ElMessageBox.alert(res.message || "获取打印模板失败", '提示');
113
+ return false;
114
+ }
115
+
116
+ loading.setText("正在连接打印客户端");
117
+
118
+ // 检查客户端是否连接
119
+ if (!hiprint.hiwebSocket.opened) {
120
+ loading?.close();
121
+ ElMessageBox.alert("打印客户端未连接", '提示');
122
+ return false;
123
+ }
124
+
125
+ // 获取打印机列表
126
+ let printerList = hiprint.hiwebSocket.getPrinterList();
127
+ if (!printerList || printerList.length === 0) {
128
+ loading?.close();
129
+ ElMessageBox.alert("未获取到打印机列表", '提示');
130
+ return false;
131
+ }
132
+
133
+ loading.close();
134
+ loading = null;
135
+
136
+ // 显示选择打印机的对话框
137
+ return await showPrinterSelectionDialog(printerList, res.data.json, res.data.list, res.data.name, data);
138
+ } catch (error) {
139
+ if (loading) {
140
+ loading.close();
141
+ loading = null;
142
+ }
143
+ console.error(error);
144
+ ElMessageBox.alert("客户端打印出错: " + error.message, '提示');
145
+ return false;
146
+ }
147
+ };
148
+
149
+ // 显示打印机选择对话框
150
+ const showPrinterSelectionDialog = (printerList, templateJson, templateData, templateName, data) => {
151
+ return new Promise((resolve) => {
152
+ // 获取上次选择的打印机
153
+ const lastSelectedPrinter = localStorage.getItem('lastSelectedPrinter') || '';
154
+ // 创建挂载点
155
+ const mountPoint = document.createElement('div');
156
+ document.body.appendChild(mountPoint);
157
+
158
+ // 创建Vue组件
159
+ const PrinterSelectorComponent = {
160
+ components: {
161
+ ElDialog,
162
+ ElSelect,
163
+ ElOption,
164
+ ElButton
165
+ },
166
+ data () {
167
+ return {
168
+ visible: true,
169
+ selectedPrinter: lastSelectedPrinter,
170
+ printerList: printerList
171
+ };
172
+ },
173
+ methods: {
174
+ handlePrint: async function () {
175
+ if (!this.selectedPrinter) {
176
+ ElMessageBox.alert("请选择打印机", '提示');
177
+ return;
178
+ }
179
+ // 保存选择的打印机
180
+ localStorage.setItem('lastSelectedPrinter', this.selectedPrinter);
181
+
182
+ let loading = ElLoading.service({
183
+ text: "正在渲染打印内容"
184
+ });
185
+
186
+ try {
187
+ // 创建打印模板实例
188
+ let hiprintTemplate = new hiprint.PrintTemplate({ template: JSON.parse(templateJson) });
189
+
190
+ loading.setText("正在发送打印任务");
191
+
192
+ // 发送到客户端打印
193
+ hiprintTemplate.print2(data || templateData, {
194
+ printer: this.selectedPrinter,
195
+ title: templateName
196
+ });
197
+
198
+ // 监听打印结果
199
+ const printSuccessHandler = (result) => {
200
+ loading.close();
201
+ ElMessageBox.alert("打印任务已发送到打印机", '提示');
202
+ cleanup();
203
+ this.handleClose(true);
204
+ };
205
+
206
+ const printErrorHandler = (error) => {
207
+ loading.close();
208
+ ElMessageBox.alert("打印失败: " + (error.msg || "未知错误"), '提示');
209
+ cleanup();
210
+ this.handleClose(false);
211
+ };
212
+
213
+ // 注册事件监听器
214
+ hiprint.hiwebSocket.socket.on('success', printSuccessHandler);
215
+ hiprint.hiwebSocket.socket.on('error', printErrorHandler);
216
+
217
+ // 清理函数
218
+ const cleanup = () => {
219
+ hiprint.hiwebSocket.socket.off('success', printSuccessHandler);
220
+ hiprint.hiwebSocket.socket.off('error', printErrorHandler);
221
+ };
222
+
223
+ } catch (error) {
224
+ if (loading) {
225
+ loading.close();
226
+ }
227
+ console.error(error);
228
+ ElMessageBox.alert("打印过程中发生错误: " + error.message, '提示');
229
+ this.handleClose(false);
230
+ }
231
+ },
232
+ handleClose: function (result = false) {
233
+ this.visible = false;
234
+ // 延迟销毁,确保动画完成
235
+ setTimeout(() => {
236
+ app.unmount();
237
+ document.body.removeChild(mountPoint);
238
+ resolve(result);
239
+ }, 300);
240
+ }
241
+ },
242
+ render () {
243
+ return createVNode(ElDialog, {
244
+ modelValue: this.visible,
245
+ title: "选择打印机",
246
+ width: "500px",
247
+ onClose: () => this.handleClose(false),
248
+ onClosed: () => this.handleClose(false)
249
+ }, {
250
+ default: () => [
251
+ createVNode(ElSelect, {
252
+ modelValue: this.selectedPrinter,
253
+ "onUpdate:modelValue": (val) => { this.selectedPrinter = val; },
254
+ placeholder: "请选择打印机",
255
+ style: "width: 100%; margin-bottom: 15px;"
256
+ }, {
257
+ default: () => this.printerList.map(printer =>
258
+ createVNode(ElOption, {
259
+ key: printer.name,
260
+ label: printer.name,
261
+ value: printer.name
262
+ })
263
+ )
264
+ })
265
+ ],
266
+ footer: () => [
267
+ createVNode("span", { class: "dialog-footer" }, [
268
+ createVNode(ElButton, {
269
+ onClick: () => this.handleClose(false)
270
+ }, {
271
+ default: () => "取消"
272
+ }),
273
+ createVNode(ElButton, {
274
+ type: "primary",
275
+ onClick: this.handlePrint
276
+ }, {
277
+ default: () => "打印"
278
+ })
279
+ ])
280
+ ]
281
+ });
282
+ }
283
+ };
284
+
285
+ // 创建应用实例
286
+ const app = createApp(PrinterSelectorComponent);
287
+
288
+ // 挂载应用
289
+ app.mount(mountPoint);
290
+ });
291
+ };
292
+
293
+ // window.silentHiprint = silentHiprint;
294
+
97
295
  export default {
98
- install (app, { router, pinia, isAdmin }) {
296
+ install (app, { router, pinia, isAdmin, clientPrint = false, clientUrl = 'http://localhost:17521' }) {
99
297
  app.provide('$hiprint', hiprintFun);
100
298
  app.provide('$silentHiprint', silentHiprint);
299
+
300
+ // 如果启用了客户端打印,初始化连接
301
+ if (clientPrint) {
302
+ // 确保DOM加载完成后再启动连接
303
+ const initializeClientPrint = () => {
304
+ if (hiprint.hiwebSocket && !hiprint.hiwebSocket.opened) {
305
+ window.hiwebSocket.host = clientUrl;
306
+ hiprint.hiwebSocket.start();
307
+ }
308
+ };
309
+
310
+ if (document.readyState === 'loading') {
311
+ document.addEventListener('DOMContentLoaded', initializeClientPrint);
312
+ } else {
313
+ initializeClientPrint();
314
+ }
315
+ }
316
+
101
317
  if (router) {
102
318
  router.addRoute('Index', {
103
319
  path: 'hiprint/designer',
@@ -123,4 +339,4 @@ export default {
123
339
  }
124
340
  }
125
341
  },
126
- };
342
+ };
@@ -0,0 +1,42 @@
1
+ import * as babelCore from "@babel/core";
2
+ import parser from "@babel/parser";
3
+
4
+ // ✅ 只导入实际用到的插件
5
+ import pluginTransformArrowFunctions from "@babel/plugin-transform-arrow-functions";
6
+ import pluginTransformBlockScoping from "@babel/plugin-transform-block-scoping";
7
+ import pluginTransformTemplateLiterals from "@babel/plugin-transform-template-literals";
8
+ import pluginTransformShorthandProperties from "@babel/plugin-transform-shorthand-properties";
9
+ import pluginTransformComputedProperties from "@babel/plugin-transform-computed-properties";
10
+
11
+ /**
12
+ * 将 ES6 代码转换为 ES5
13
+ * @param {string} code - 用户输入的 ES6+ 代码
14
+ * @returns {string} - 编译后的 ES5 代码
15
+ */
16
+ export default function compileES6toES5 (code) {
17
+ try {
18
+ // 1. 解析为 AST
19
+ const ast = parser.parse(code, {
20
+ sourceType: "script",
21
+ plugins: [],
22
+ });
23
+
24
+ // 2. 转换 AST → ES5(内部自动调用 generator)
25
+ const result = babelCore.transformFromAstSync(ast, code, {
26
+ plugins: [
27
+ pluginTransformArrowFunctions,
28
+ pluginTransformBlockScoping,
29
+ pluginTransformTemplateLiterals,
30
+ pluginTransformShorthandProperties,
31
+ pluginTransformComputedProperties,
32
+ ],
33
+ sourceMaps: false,
34
+ ast: false, // ✅ 如果你不需要返回 AST,设为 false 更轻量
35
+ });
36
+
37
+ return result.code;
38
+ } catch (err) {
39
+ console.error("Babel 编译错误:", err);
40
+ throw new Error("编译失败:" + (err.message || err));
41
+ }
42
+ }
@@ -2291,6 +2291,7 @@ var hiprint = (function (t) {
2291
2291
  useSVG: !0,
2292
2292
  correctLevel: t.tableQRCodeLevel || 0,
2293
2293
  typeNumber,
2294
+ mode: 4,
2294
2295
  }).makeCode(p);
2295
2296
  r.html(qrcodebox);
2296
2297
  }
@@ -8618,7 +8619,7 @@ var hiprint = (function (t) {
8618
8619
  return !0;
8619
8620
  },
8620
8621
  hasIo: function hasIo (t) {
8621
- return window.io;
8622
+ return io;
8622
8623
  },
8623
8624
  send: function send (t) {
8624
8625
  try {
@@ -8669,7 +8670,7 @@ var hiprint = (function (t) {
8669
8670
  var t = this;
8670
8671
  window.WebSocket
8671
8672
  ? this.socket ||
8672
- ((this.socket = window.io(this.host, {
8673
+ ((this.socket = io(this.host, {
8673
8674
  reconnectionAttempts: 5,
8674
8675
  })),
8675
8676
  this.socket.on('connect', function (e) {
@@ -10187,7 +10188,7 @@ var hiprint = (function (t) {
10187
10188
  QRCode({
10188
10189
  level: this.options.getQRcodeLevel(),
10189
10190
  fnc1: 'None',
10190
- mode: 'Auto',
10191
+ mode: 4,
10191
10192
  moduleSize: 8,
10192
10193
  quietZone: 0,
10193
10194
  aimIndicator: 0,
package/libs/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import axios from '@/libs/api.request.js';
2
- export function getPrintTemplate(code, reqParams) {
2
+ export function getPrintTemplate (code, reqParams) {
3
3
  return axios
4
4
  .request({
5
5
  url: `/printTemplate/data/${code}`,
@@ -11,3 +11,27 @@ export function getPrintTemplate(code, reqParams) {
11
11
  return res;
12
12
  });
13
13
  }
14
+
15
+ // 获取打印机列表
16
+ export function getPrinterList () {
17
+ // 从 hiprint 获取打印机列表
18
+ if (window.hiprint && window.hiprint.hiwebSocket) {
19
+ return window.hiprint.hiwebSocket.getPrinterList() || [];
20
+ }
21
+ return [];
22
+ }
23
+
24
+ // 刷新打印机列表
25
+ export function refreshPrinterList () {
26
+ if (window.hiprint && window.hiprint.hiwebSocket) {
27
+ window.hiprint.hiwebSocket.refreshPrinterList();
28
+ }
29
+ }
30
+
31
+ // 检查客户端连接状态
32
+ export function isClientConnected () {
33
+ if (window.hiprint && window.hiprint.hiwebSocket) {
34
+ return window.hiprint.hiwebSocket.opened || false;
35
+ }
36
+ return false;
37
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yh-hiprint",
3
- "version": "2.5.2",
3
+ "version": "2.6.0",
4
4
  "description": "Hiprint for Vue3 by NoahLiu in ForceCon in Hunan Changesha",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -10,6 +10,15 @@
10
10
  "pub:npm": "npm publish --registry https://registry.npmjs.org/ --no-git-checks"
11
11
  },
12
12
  "dependencies": {
13
+ "@babel/core": "7.28.4",
14
+ "@babel/generator": "7.28.3",
15
+ "@babel/parser": "7.28.4",
16
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
17
+ "@babel/plugin-transform-block-scoping": "^7.28.4",
18
+ "@babel/plugin-transform-computed-properties": "^7.27.1",
19
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
20
+ "@babel/plugin-transform-template-literals": "^7.27.1",
21
+ "@babel/traverse": "7.28.4",
13
22
  "@nuintun/qrcode": "^5.0.1",
14
23
  "canvg": "4.0.1",
15
24
  "html2canvas": "1.4.1",