@yxhl/specter-pui-vtk 1.0.67 → 1.0.69
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 +450 -1226
- package/dist/specter-pui.es.js +1540 -1494
- package/dist/specter-pui.es.js.map +1 -1
- package/dist/specter-pui.umd.js +1 -1
- package/dist/specter-pui.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/commons/filters/appParams.js +105 -0
- package/src/commons/filters/dictionary.js +73 -75
- package/src/commons/index.js +20 -18
- package/src/index.js +143 -155
package/README.md
CHANGED
|
@@ -1,1226 +1,450 @@
|
|
|
1
|
-
# @yxhl/specter-pui-vtk
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- [
|
|
10
|
-
- [
|
|
11
|
-
- [
|
|
12
|
-
|
|
13
|
-
- [
|
|
14
|
-
- [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
import { createApp } from
|
|
34
|
-
import App from
|
|
35
|
-
import SpecterPuiVtk from
|
|
36
|
-
import
|
|
37
|
-
|
|
38
|
-
const app = createApp(App)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
```vue
|
|
58
|
-
<template>
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
- `
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
- `
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
- `
|
|
260
|
-
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
- `
|
|
422
|
-
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
<VtkDateSelector
|
|
452
|
-
v-model="monthRange"
|
|
453
|
-
mode="range"
|
|
454
|
-
displayMode="month"
|
|
455
|
-
placeholder="选择月份范围"
|
|
456
|
-
/>
|
|
457
|
-
|
|
458
|
-
<!-- 年份范围选择 -->
|
|
459
|
-
<VtkDateSelector
|
|
460
|
-
v-model="yearRange"
|
|
461
|
-
mode="range"
|
|
462
|
-
displayMode="year"
|
|
463
|
-
placeholder="选择年份范围"
|
|
464
|
-
/>
|
|
465
|
-
|
|
466
|
-
<!-- 周范围选择 -->
|
|
467
|
-
<VtkDateSelector
|
|
468
|
-
v-model="weekRange"
|
|
469
|
-
mode="range"
|
|
470
|
-
displayMode="week"
|
|
471
|
-
placeholder="选择周范围"
|
|
472
|
-
/>
|
|
473
|
-
|
|
474
|
-
<!-- 内联模式:直接显示选择器 -->
|
|
475
|
-
<VtkDateSelector
|
|
476
|
-
v-model="date"
|
|
477
|
-
mode="range"
|
|
478
|
-
displayMode="month"
|
|
479
|
-
inline
|
|
480
|
-
/>
|
|
481
|
-
|
|
482
|
-
<!-- 单面板模式:范围选择时只显示一个面板 -->
|
|
483
|
-
<VtkDateSelector
|
|
484
|
-
v-model="dateRange"
|
|
485
|
-
mode="range"
|
|
486
|
-
displayMode="day"
|
|
487
|
-
singlePanel
|
|
488
|
-
/>
|
|
489
|
-
|
|
490
|
-
<!-- 禁用未来日期:只能选择今天及之前的日期 -->
|
|
491
|
-
<VtkDateSelector
|
|
492
|
-
v-model="date"
|
|
493
|
-
displayMode="month"
|
|
494
|
-
:disableFuture="true"
|
|
495
|
-
placeholder="选择月份(不能选未来)"
|
|
496
|
-
/>
|
|
497
|
-
|
|
498
|
-
<!-- 自定义取消和确认方法 -->
|
|
499
|
-
<VtkDateSelector
|
|
500
|
-
v-model="date"
|
|
501
|
-
:onCancel="handleCancel"
|
|
502
|
-
:onConfirm="handleConfirm"
|
|
503
|
-
/>
|
|
504
|
-
|
|
505
|
-
<!-- 监听事件 -->
|
|
506
|
-
<VtkDateSelector
|
|
507
|
-
v-model="date"
|
|
508
|
-
@cancel="handleCancel"
|
|
509
|
-
@confirm="handleConfirm"
|
|
510
|
-
@change="handleChange"
|
|
511
|
-
/>
|
|
512
|
-
</template>
|
|
513
|
-
|
|
514
|
-
<script setup>
|
|
515
|
-
import { ref } from 'vue'
|
|
516
|
-
|
|
517
|
-
// 单选日期
|
|
518
|
-
const date = ref('2024-01-01')
|
|
519
|
-
|
|
520
|
-
// 日期范围
|
|
521
|
-
const dateRange = ref(['2024-01-01', '2024-01-31'])
|
|
522
|
-
|
|
523
|
-
// 月份范围
|
|
524
|
-
const monthRange = ref(['2024-01', '2024-12'])
|
|
525
|
-
|
|
526
|
-
// 年份范围
|
|
527
|
-
const yearRange = ref(['2023', '2024'])
|
|
528
|
-
|
|
529
|
-
// 周范围
|
|
530
|
-
const weekRange = ref(['2024-W01', '2024-W10'])
|
|
531
|
-
|
|
532
|
-
// 自定义处理方法
|
|
533
|
-
const handleCancel = () => {
|
|
534
|
-
console.log('取消选择')
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
const handleConfirm = (value) => {
|
|
538
|
-
console.log('确认选择:', value)
|
|
539
|
-
// 执行自定义逻辑
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
const handleChange = (value) => {
|
|
543
|
-
console.log('值变化:', value)
|
|
544
|
-
}
|
|
545
|
-
</script>
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
**特性说明:**
|
|
549
|
-
|
|
550
|
-
1. **多种显示模式**
|
|
551
|
-
- `day`: 日期选择(显示日历)
|
|
552
|
-
- `month`: 月份选择(显示月份网格)
|
|
553
|
-
- `year`: 年份选择(显示年份网格)
|
|
554
|
-
- `week`: 周选择(显示周列表)
|
|
555
|
-
|
|
556
|
-
2. **单选和范围选择**
|
|
557
|
-
- `single`: 单选模式,返回单个值
|
|
558
|
-
- `range`: 范围模式,返回数组 `[开始, 结束]`
|
|
559
|
-
|
|
560
|
-
3. **内联模式**
|
|
561
|
-
- 设置 `inline="true"` 后,选择器直接显示,无需点击输入框
|
|
562
|
-
- 选择后立即赋值,无需点击确认按钮
|
|
563
|
-
- 适合嵌入表单或页面中
|
|
564
|
-
|
|
565
|
-
4. **单面板模式**
|
|
566
|
-
- 设置 `singlePanel="true"` 后,范围选择时只显示一个面板
|
|
567
|
-
- 通过导航按钮切换月份/年份
|
|
568
|
-
- 适合空间受限的场景
|
|
569
|
-
|
|
570
|
-
5. **主题适配**
|
|
571
|
-
- 自动适配 Vuetify 3 的亮色和暗色主题
|
|
572
|
-
- 使用 Vuetify 主题变量,无需额外配置
|
|
573
|
-
|
|
574
|
-
6. **禁用未来日期**
|
|
575
|
-
- 设置 `disableFuture="true"` 后,大于当前日期的所有日期、月份、年份都会置灰
|
|
576
|
-
- 禁用的项目无法点击选择
|
|
577
|
-
- 适用于生日选择、历史数据查询等场景
|
|
578
|
-
|
|
579
|
-
7. **自定义操作**
|
|
580
|
-
- 可通过 `onCancel` 和 `onConfirm` props 自定义取消和确认逻辑
|
|
581
|
-
- 或通过 `@cancel` 和 `@confirm` 事件监听
|
|
582
|
-
|
|
583
|
-
---
|
|
584
|
-
|
|
585
|
-
#### VtkImg - 图片组件
|
|
586
|
-
|
|
587
|
-
图片展示组件,支持预览和列表展示。
|
|
588
|
-
|
|
589
|
-
**Props:**
|
|
590
|
-
- `list` (Array): 图片列表,格式:`[{ url: '', title: '', description: '' }]`
|
|
591
|
-
|
|
592
|
-
**使用示例:**
|
|
593
|
-
```vue
|
|
594
|
-
<VtkImg :list="imageList" />
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
---
|
|
598
|
-
|
|
599
|
-
#### VtkPdf - PDF 查看器
|
|
600
|
-
|
|
601
|
-
PDF 文件查看组件。
|
|
602
|
-
|
|
603
|
-
**Props:**
|
|
604
|
-
- `list` (Array): PDF 列表,格式:`[{ url: '', title: '', description: '' }]`
|
|
605
|
-
|
|
606
|
-
**使用示例:**
|
|
607
|
-
```vue
|
|
608
|
-
<VtkPdf :list="pdfList" />
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
---
|
|
612
|
-
|
|
613
|
-
#### VtkUpload - 文件上传组件
|
|
614
|
-
|
|
615
|
-
文件上传组件,参考 Element Plus `el-upload` 设计,支持拖拽上传、多种列表展示模式、图片预览、PDF 新窗口预览、Excel Online 查看器等功能。
|
|
616
|
-
|
|
617
|
-
**Props:**
|
|
618
|
-
|
|
619
|
-
| 属性 | 类型 | 默认值 | 说明 |
|
|
620
|
-
|---|---|---|---|
|
|
621
|
-
| `modelValue` | `Array` | `[]` | 文件列表(v-model 双向绑定) |
|
|
622
|
-
| `action` | `String` | `''` | 上传接口地址 |
|
|
623
|
-
| `accept` | `String` | `''` | 接受的文件类型,同原生 `accept` 属性,如 `image/*`、`.pdf,.xlsx` |
|
|
624
|
-
| `multiple` | `Boolean` | `false` | 是否允许多文件同时选择 |
|
|
625
|
-
| `limit` | `Number` | `0` | 最大可上传文件数量,`0` 表示不限制 |
|
|
626
|
-
| `maxSize` | `Number` | `0` | 单个文件最大体积(MB),`0` 表示不限制 |
|
|
627
|
-
| `listType` | `String` | `'text'` | 文件列表展示类型:`text` \| `picture` \| `picture-card` |
|
|
628
|
-
| `showFileList` | `Boolean` | `true` | 是否显示文件列表 |
|
|
629
|
-
| `autoUpload` | `Boolean` | `true` | 选择文件后是否自动上传 |
|
|
630
|
-
| `disabled` | `Boolean` | `false` | 是否禁用 |
|
|
631
|
-
| `headers` | `Object` | `{}` | 附加的请求头 |
|
|
632
|
-
| `data` | `Object` | `{}` | 上传时附加的表单数据 |
|
|
633
|
-
| `name` | `String` | `'file'` | 上传文件的字段名 |
|
|
634
|
-
| `tip` | `String` | `''` | 拖拽区底部的提示文字 |
|
|
635
|
-
| `beforeUpload` | `Function` | `null` | 上传前的钩子函数,接收 `(rawFile)` 参数,返回 `false` 或 rejected Promise 则停止上传 |
|
|
636
|
-
| `beforeRemove` | `Function` | `null` | 移除文件前的钩子函数,接收 `(file, fileList)` 参数,返回 `false` 则阻止移除 |
|
|
637
|
-
|
|
638
|
-
**Events:**
|
|
639
|
-
|
|
640
|
-
| 事件 | 参数 | 说明 |
|
|
641
|
-
|---|---|---|
|
|
642
|
-
| `update:modelValue` | `fileList` | 文件列表变化时触发(v-model) |
|
|
643
|
-
| `change` | `(file, fileList)` | 文件添加、上传成功/失败时触发 |
|
|
644
|
-
| `success` | `(response, file, fileList)` | 文件上传成功时触发 |
|
|
645
|
-
| `error` | `(error, file, fileList)` | 文件上传失败时触发 |
|
|
646
|
-
| `remove` | `(file, fileList)` | 文件被移除时触发 |
|
|
647
|
-
| `exceed` | `(files, fileList)` | 超出文件数量限制时触发 |
|
|
648
|
-
| `preview` | `(file)` | 点击文件预览时触发 |
|
|
649
|
-
|
|
650
|
-
**Methods(通过 ref 调用):**
|
|
651
|
-
|
|
652
|
-
| 方法 | 说明 |
|
|
653
|
-
|---|---|
|
|
654
|
-
| `submit()` | 手动触发所有 `ready` 状态文件的上传(`autoUpload: false` 时使用) |
|
|
655
|
-
| `clearFiles()` | 清空文件列表 |
|
|
656
|
-
| `remove(file)` | 手动移除指定文件 |
|
|
657
|
-
|
|
658
|
-
**文件预览策略:**
|
|
659
|
-
|
|
660
|
-
| 文件类型 | 有服务端 URL | 仅本地(未上传) |
|
|
661
|
-
|---|---|---|
|
|
662
|
-
| 图片 | Dialog 内嵌预览 | Dialog 显示 base64 预览 |
|
|
663
|
-
| PDF | 新标签页直接打开 | 生成 Blob URL 新标签页打开 |
|
|
664
|
-
| xlsx / xls | Microsoft Office Online 查看器(需公网地址) | Dialog 提示无法预览 |
|
|
665
|
-
| 其他 | Dialog 内嵌展示 | Dialog 内嵌展示 |
|
|
666
|
-
|
|
667
|
-
> Office Online 查看器要求文件 URL 必须是**公网可访问的 https 地址**。
|
|
668
|
-
|
|
669
|
-
**Slots:**
|
|
670
|
-
|
|
671
|
-
| 插槽 | 说明 |
|
|
672
|
-
|---|---|
|
|
673
|
-
| `default` | 自定义拖拽区域内容(仅 `text` / `picture` 模式生效) |
|
|
674
|
-
|
|
675
|
-
**使用示例:**
|
|
676
|
-
|
|
677
|
-
```vue
|
|
678
|
-
<template>
|
|
679
|
-
<!-- 1. 基础文本列表模式 -->
|
|
680
|
-
<VtkUpload
|
|
681
|
-
v-model="files"
|
|
682
|
-
action="/api/upload"
|
|
683
|
-
tip="支持 jpg / png / pdf,单个文件不超过 5MB"
|
|
684
|
-
/>
|
|
685
|
-
|
|
686
|
-
<!-- 2. 图片缩略图列表模式 -->
|
|
687
|
-
<VtkUpload
|
|
688
|
-
v-model="files"
|
|
689
|
-
action="/api/upload"
|
|
690
|
-
list-type="picture"
|
|
691
|
-
accept="image/*"
|
|
692
|
-
:max-size="2"
|
|
693
|
-
/>
|
|
694
|
-
|
|
695
|
-
<!-- 3. 图片卡片模式(最多 5 张) -->
|
|
696
|
-
<VtkUpload
|
|
697
|
-
v-model="files"
|
|
698
|
-
action="/api/upload"
|
|
699
|
-
list-type="picture-card"
|
|
700
|
-
accept="image/*"
|
|
701
|
-
:limit="5"
|
|
702
|
-
:max-size="2"
|
|
703
|
-
tip="只能上传 jpg/png,不超过 2MB"
|
|
704
|
-
/>
|
|
705
|
-
|
|
706
|
-
<!-- 4. 手动上传 -->
|
|
707
|
-
<VtkUpload
|
|
708
|
-
ref="uploadRef"
|
|
709
|
-
v-model="files"
|
|
710
|
-
action="/api/upload"
|
|
711
|
-
:auto-upload="false"
|
|
712
|
-
@change="handleChange"
|
|
713
|
-
/>
|
|
714
|
-
<VBtn @click="uploadRef.submit()">开始上传</VBtn>
|
|
715
|
-
|
|
716
|
-
<!-- 5. 上传前校验 -->
|
|
717
|
-
<VtkUpload
|
|
718
|
-
v-model="files"
|
|
719
|
-
action="/api/upload"
|
|
720
|
-
:before-upload="beforeUpload"
|
|
721
|
-
:before-remove="beforeRemove"
|
|
722
|
-
/>
|
|
723
|
-
|
|
724
|
-
<!-- 6. 附加数据 / 自定义请求头 -->
|
|
725
|
-
<VtkUpload
|
|
726
|
-
v-model="files"
|
|
727
|
-
action="/api/upload"
|
|
728
|
-
:data="{ bizType: 'avatar' }"
|
|
729
|
-
:headers="{ 'X-Custom': 'value' }"
|
|
730
|
-
/>
|
|
731
|
-
</template>
|
|
732
|
-
|
|
733
|
-
<script setup>
|
|
734
|
-
import { ref } from 'vue'
|
|
735
|
-
|
|
736
|
-
const files = ref([])
|
|
737
|
-
const uploadRef = ref(null)
|
|
738
|
-
|
|
739
|
-
// 上传前校验示例
|
|
740
|
-
const beforeUpload = (rawFile) => {
|
|
741
|
-
if (rawFile.size / 1024 / 1024 > 5) {
|
|
742
|
-
alert('文件大小不能超过 5MB')
|
|
743
|
-
return false
|
|
744
|
-
}
|
|
745
|
-
return true
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
// 移除前确认示例
|
|
749
|
-
const beforeRemove = (file) => {
|
|
750
|
-
return window.confirm(`确认移除 ${file.name}?`)
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
const handleChange = (file, fileList) => {
|
|
754
|
-
console.log('文件变化:', file, fileList)
|
|
755
|
-
}
|
|
756
|
-
</script>
|
|
757
|
-
```
|
|
758
|
-
|
|
759
|
-
---
|
|
760
|
-
|
|
761
|
-
#### VtkEmpty - 空状态组件
|
|
762
|
-
|
|
763
|
-
空状态展示组件。
|
|
764
|
-
|
|
765
|
-
**Props:**
|
|
766
|
-
- `text` (String): 提示文本,默认 "暂无数据"
|
|
767
|
-
|
|
768
|
-
**使用示例:**
|
|
769
|
-
```vue
|
|
770
|
-
<VtkEmpty text="暂无内容" />
|
|
771
|
-
```
|
|
772
|
-
|
|
773
|
-
---
|
|
774
|
-
|
|
775
|
-
#### VtkFab - 浮动按钮
|
|
776
|
-
|
|
777
|
-
浮动操作按钮组件。
|
|
778
|
-
|
|
779
|
-
**使用示例:**
|
|
780
|
-
```vue
|
|
781
|
-
<VtkFab />
|
|
782
|
-
```
|
|
783
|
-
|
|
784
|
-
---
|
|
785
|
-
|
|
786
|
-
### 消息组件
|
|
787
|
-
|
|
788
|
-
#### vtkMessage - 全局消息
|
|
789
|
-
|
|
790
|
-
全局消息提示组件,需要在 App.vue 中添加 `<vtk-message />` 组件。
|
|
791
|
-
|
|
792
|
-
**方法:**
|
|
793
|
-
|
|
794
|
-
```javascript
|
|
795
|
-
// 在组件中使用
|
|
796
|
-
const { proxy } = getCurrentInstance()
|
|
797
|
-
|
|
798
|
-
// 成功提示
|
|
799
|
-
proxy.$vtk.message.success('操作成功')
|
|
800
|
-
|
|
801
|
-
// 错误提示
|
|
802
|
-
proxy.$vtk.message.error('操作失败')
|
|
803
|
-
|
|
804
|
-
// 警告提示
|
|
805
|
-
proxy.$vtk.message.warning('警告信息')
|
|
806
|
-
|
|
807
|
-
// 信息提示
|
|
808
|
-
proxy.$vtk.message.info('提示信息')
|
|
809
|
-
|
|
810
|
-
// Toast 提示
|
|
811
|
-
proxy.$vtk.message.toast('提示文本', { color: 'primary' })
|
|
812
|
-
|
|
813
|
-
// 确认对话框
|
|
814
|
-
proxy.$vtk.message.confirm({
|
|
815
|
-
title: '提示',
|
|
816
|
-
text: '确认删除吗?',
|
|
817
|
-
onConfirm: () => {
|
|
818
|
-
console.log('确认')
|
|
819
|
-
},
|
|
820
|
-
onCancel: () => {
|
|
821
|
-
console.log('取消')
|
|
822
|
-
}
|
|
823
|
-
})
|
|
824
|
-
|
|
825
|
-
// Alert 对话框
|
|
826
|
-
proxy.$vtk.message.alert({
|
|
827
|
-
title: '提示',
|
|
828
|
-
text: '操作成功',
|
|
829
|
-
onConfirm: () => {
|
|
830
|
-
console.log('确认')
|
|
831
|
-
}
|
|
832
|
-
})
|
|
833
|
-
|
|
834
|
-
// Loading 加载
|
|
835
|
-
proxy.$vtk.message.loading.show()
|
|
836
|
-
proxy.$vtk.message.loading.hide()
|
|
837
|
-
```
|
|
838
|
-
|
|
839
|
-
---
|
|
840
|
-
|
|
841
|
-
## 公用方法
|
|
842
|
-
|
|
843
|
-
### 1. Storage - 本地存储
|
|
844
|
-
|
|
845
|
-
封装的本地存储工具,支持 localStorage 和 sessionStorage。
|
|
846
|
-
|
|
847
|
-
**使用方式:**
|
|
848
|
-
|
|
849
|
-
```javascript
|
|
850
|
-
import { getCurrentInstance } from 'vue'
|
|
851
|
-
|
|
852
|
-
const { proxy } = getCurrentInstance()
|
|
853
|
-
|
|
854
|
-
// 设置值
|
|
855
|
-
proxy.$vtk.storage.set('key', 'value')
|
|
856
|
-
proxy.$vtk.storage.set('key', { name: 'test' }) // 自动序列化对象
|
|
857
|
-
|
|
858
|
-
// 获取值
|
|
859
|
-
const value = proxy.$vtk.storage.get('key')
|
|
860
|
-
|
|
861
|
-
// 删除值
|
|
862
|
-
proxy.$vtk.storage.remove('key')
|
|
863
|
-
|
|
864
|
-
// 清空所有
|
|
865
|
-
proxy.$vtk.storage.clear()
|
|
866
|
-
```
|
|
867
|
-
|
|
868
|
-
**或者直接导入:**
|
|
869
|
-
|
|
870
|
-
```javascript
|
|
871
|
-
import { storage } from '@yxhl/specter-pui-vtk'
|
|
872
|
-
|
|
873
|
-
storage.set('key', 'value')
|
|
874
|
-
storage.get('key')
|
|
875
|
-
storage.remove('key')
|
|
876
|
-
storage.clear()
|
|
877
|
-
```
|
|
878
|
-
|
|
879
|
-
---
|
|
880
|
-
|
|
881
|
-
### 2. Request - HTTP 请求
|
|
882
|
-
|
|
883
|
-
封装的 Axios 请求工具,自动处理 token 和错误。
|
|
884
|
-
|
|
885
|
-
**使用方式:**
|
|
886
|
-
|
|
887
|
-
```javascript
|
|
888
|
-
const { proxy } = getCurrentInstance()
|
|
889
|
-
|
|
890
|
-
// GET 请求(表单格式)
|
|
891
|
-
proxy.$vtk.request.getForm('/api/user', { id: 1 })
|
|
892
|
-
|
|
893
|
-
// POST 请求(表单格式)
|
|
894
|
-
proxy.$vtk.request.postForm('/api/user', { name: 'test' })
|
|
895
|
-
|
|
896
|
-
// GET 请求(JSON 格式)
|
|
897
|
-
proxy.$vtk.request.getJson('/api/user', { id: 1 })
|
|
898
|
-
|
|
899
|
-
// POST 请求(JSON 格式)
|
|
900
|
-
proxy.$vtk.request.postJson('/api/user', { name: 'test' })
|
|
901
|
-
|
|
902
|
-
// 文件上传
|
|
903
|
-
proxy.$vtk.request.imp('/api/upload', formData)
|
|
904
|
-
|
|
905
|
-
// 文件下载
|
|
906
|
-
proxy.$vtk.request.exp('/api/download', { id: 1 })
|
|
907
|
-
|
|
908
|
-
// 自定义请求
|
|
909
|
-
proxy.$vtk.request.http(
|
|
910
|
-
'/api/data',
|
|
911
|
-
{ key: 'value' },
|
|
912
|
-
'POST',
|
|
913
|
-
{ 'content-type': 'application/json' },
|
|
914
|
-
null
|
|
915
|
-
)
|
|
916
|
-
```
|
|
917
|
-
|
|
918
|
-
**或者直接导入:**
|
|
919
|
-
|
|
920
|
-
```javascript
|
|
921
|
-
import { request } from '@yxhl/specter-pui-vtk'
|
|
922
|
-
|
|
923
|
-
request.getForm('/api/user')
|
|
924
|
-
request.postJson('/api/user', { name: 'test' })
|
|
925
|
-
```
|
|
926
|
-
|
|
927
|
-
---
|
|
928
|
-
|
|
929
|
-
### 3. Filters - 过滤器方法
|
|
930
|
-
|
|
931
|
-
提供常用的数据格式化方法。
|
|
932
|
-
|
|
933
|
-
**字典过滤:**
|
|
934
|
-
|
|
935
|
-
```javascript
|
|
936
|
-
const { proxy } = getCurrentInstance()
|
|
937
|
-
|
|
938
|
-
// 字典转换
|
|
939
|
-
proxy.$vtk.filters.dict('1', 'status') // 根据字典类型转换值
|
|
940
|
-
|
|
941
|
-
// 分析类型
|
|
942
|
-
proxy.$vtk.filters.analyType('type_code')
|
|
943
|
-
|
|
944
|
-
// 分析级别
|
|
945
|
-
proxy.$vtk.filters.analyLevel('level_code')
|
|
946
|
-
```
|
|
947
|
-
|
|
948
|
-
**脱敏方法:**
|
|
949
|
-
|
|
950
|
-
```javascript
|
|
951
|
-
// 手机号脱敏
|
|
952
|
-
proxy.$vtk.filters.mobile('13812345678') // 138****5678
|
|
953
|
-
|
|
954
|
-
// 身份证脱敏
|
|
955
|
-
proxy.$vtk.filters.idcard('110101199001011234') // 110101********1234
|
|
956
|
-
```
|
|
957
|
-
|
|
958
|
-
**格式化方法:**
|
|
959
|
-
|
|
960
|
-
```javascript
|
|
961
|
-
// 日期格式化
|
|
962
|
-
proxy.$vtk.filters.date('2024-01-01', 'YYYY-MM-DD')
|
|
963
|
-
|
|
964
|
-
// 数字格式化
|
|
965
|
-
proxy.$vtk.filters.num(1234.56, 2) // 1,234.56
|
|
966
|
-
|
|
967
|
-
// 年龄计算
|
|
968
|
-
proxy.$vtk.filters.age('1990-01-01') // 34
|
|
969
|
-
|
|
970
|
-
// 文本截取
|
|
971
|
-
proxy.$vtk.filters.txt('很长的文本...', 10) // 很长的文本...
|
|
972
|
-
|
|
973
|
-
// 绝对值
|
|
974
|
-
proxy.$vtk.filters.abs(-123) // 123
|
|
975
|
-
```
|
|
976
|
-
|
|
977
|
-
---
|
|
978
|
-
|
|
979
|
-
### 4. Validation - 表单验证
|
|
980
|
-
|
|
981
|
-
提供常用的表单验证规则。
|
|
982
|
-
|
|
983
|
-
**使用方式:**
|
|
984
|
-
|
|
985
|
-
```javascript
|
|
986
|
-
const { proxy } = getCurrentInstance()
|
|
987
|
-
|
|
988
|
-
// 必填验证
|
|
989
|
-
const rules = [
|
|
990
|
-
proxy.$vtk.Validation.required('用户名不能为空')
|
|
991
|
-
]
|
|
992
|
-
|
|
993
|
-
// 邮箱验证
|
|
994
|
-
const emailRules = [
|
|
995
|
-
proxy.$vtk.Validation.email('请输入正确的邮箱')
|
|
996
|
-
]
|
|
997
|
-
|
|
998
|
-
// 手机号验证
|
|
999
|
-
const mobileRules = [
|
|
1000
|
-
proxy.$vtk.Validation.mobile('请输入正确的手机号')
|
|
1001
|
-
]
|
|
1002
|
-
|
|
1003
|
-
// 自定义验证
|
|
1004
|
-
const customRules = [
|
|
1005
|
-
(v) => !!v || '不能为空',
|
|
1006
|
-
(v) => v.length >= 6 || '至少6个字符'
|
|
1007
|
-
]
|
|
1008
|
-
```
|
|
1009
|
-
|
|
1010
|
-
---
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
## 配置选项
|
|
1015
|
-
|
|
1016
|
-
### 存储键名配置
|
|
1017
|
-
|
|
1018
|
-
组件库使用 localStorage 存储用户信息和 token,可以通过配置自定义键名。
|
|
1019
|
-
|
|
1020
|
-
**配置方式:**
|
|
1021
|
-
|
|
1022
|
-
```javascript
|
|
1023
|
-
// main.js
|
|
1024
|
-
window.VTK_CONFIG = {
|
|
1025
|
-
storageKeys: {
|
|
1026
|
-
user: import.meta.env.VITE_MIS_USERS || '_mis_acis_users',
|
|
1027
|
-
token: import.meta.env.VITE_MIS_TOKEN || '_mis_acis_token'
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1030
|
-
```
|
|
1031
|
-
|
|
1032
|
-
**默认值:**
|
|
1033
|
-
- `user`: `_mis_acis_users`
|
|
1034
|
-
- `token`: `_mis_acis_token`
|
|
1035
|
-
|
|
1036
|
-
---
|
|
1037
|
-
|
|
1038
|
-
### API 基础地址配置
|
|
1039
|
-
|
|
1040
|
-
配置 HTTP 请求的基础地址。
|
|
1041
|
-
|
|
1042
|
-
**配置方式:**
|
|
1043
|
-
|
|
1044
|
-
```javascript
|
|
1045
|
-
// main.js
|
|
1046
|
-
window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL
|
|
1047
|
-
```
|
|
1048
|
-
|
|
1049
|
-
**或在 .env 文件中:**
|
|
1050
|
-
|
|
1051
|
-
```env
|
|
1052
|
-
VITE_APP_API_URL=https://api.example.com
|
|
1053
|
-
```
|
|
1054
|
-
|
|
1055
|
-
---
|
|
1056
|
-
|
|
1057
|
-
## 更新迭代
|
|
1058
|
-
|
|
1059
|
-
### 组件库维护者
|
|
1060
|
-
|
|
1061
|
-
#### 1. 修改组件
|
|
1062
|
-
|
|
1063
|
-
在 `pui-vtks/src/` 目录下修改组件代码。
|
|
1064
|
-
|
|
1065
|
-
#### 2. 构建组件库
|
|
1066
|
-
|
|
1067
|
-
```bash
|
|
1068
|
-
cd pui-vtks
|
|
1069
|
-
npm run build
|
|
1070
|
-
```
|
|
1071
|
-
|
|
1072
|
-
#### 3. 更新版本号
|
|
1073
|
-
|
|
1074
|
-
```bash
|
|
1075
|
-
# 补丁版本 (1.0.0 -> 1.0.1)
|
|
1076
|
-
npm version patch
|
|
1077
|
-
|
|
1078
|
-
# 小版本 (1.0.0 -> 1.1.0)
|
|
1079
|
-
npm version minor
|
|
1080
|
-
|
|
1081
|
-
# 大版本 (1.0.0 -> 2.0.0)
|
|
1082
|
-
npm version major
|
|
1083
|
-
```
|
|
1084
|
-
|
|
1085
|
-
#### 4. 发布到 npm
|
|
1086
|
-
|
|
1087
|
-
```bash
|
|
1088
|
-
npm config set //registry.npmjs.org/:_authToken=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
|
|
1089
|
-
npm publish --access public
|
|
1090
|
-
```
|
|
1091
|
-
|
|
1092
|
-
---
|
|
1093
|
-
|
|
1094
|
-
### 项目使用者
|
|
1095
|
-
|
|
1096
|
-
#### 更新组件库
|
|
1097
|
-
|
|
1098
|
-
```bash
|
|
1099
|
-
# 更新到最新版本
|
|
1100
|
-
npm update @yxhl/specter-pui-vtk
|
|
1101
|
-
|
|
1102
|
-
# 或指定版本
|
|
1103
|
-
npm install @yxhl/specter-pui-vtk@1.0.5
|
|
1104
|
-
|
|
1105
|
-
# 强制重新安装
|
|
1106
|
-
rm -rf node_modules package-lock.json
|
|
1107
|
-
npm install
|
|
1108
|
-
```
|
|
1109
|
-
|
|
1110
|
-
#### 查看当前版本
|
|
1111
|
-
|
|
1112
|
-
```bash
|
|
1113
|
-
npm list @yxhl/specter-pui-vtk
|
|
1114
|
-
```
|
|
1115
|
-
|
|
1116
|
-
---
|
|
1117
|
-
|
|
1118
|
-
## 常见问题
|
|
1119
|
-
|
|
1120
|
-
### 1. 组件未定义
|
|
1121
|
-
|
|
1122
|
-
**问题:** 使用组件时提示组件未定义
|
|
1123
|
-
|
|
1124
|
-
**解决:**
|
|
1125
|
-
- 确保在 main.js 中正确引入并注册了组件库
|
|
1126
|
-
- 确保引入了 CSS 文件
|
|
1127
|
-
|
|
1128
|
-
```javascript
|
|
1129
|
-
import SpecterPuiVtk from '@yxhl/specter-pui-vtk'
|
|
1130
|
-
import '@yxhl/specter-pui-vtk/dist/specter-pui-vtk.css'
|
|
1131
|
-
|
|
1132
|
-
app.use(SpecterPuiVtk)
|
|
1133
|
-
```
|
|
1134
|
-
|
|
1135
|
-
---
|
|
1136
|
-
|
|
1137
|
-
### 2. 消息组件不显示
|
|
1138
|
-
|
|
1139
|
-
**问题:** 调用 `proxy.$vtk.message` 方法后没有显示
|
|
1140
|
-
|
|
1141
|
-
**解决:**
|
|
1142
|
-
- 确保在 App.vue 中添加了 `<vtk-message />` 组件
|
|
1143
|
-
|
|
1144
|
-
```vue
|
|
1145
|
-
<template>
|
|
1146
|
-
<v-app>
|
|
1147
|
-
<router-view />
|
|
1148
|
-
<vtk-message />
|
|
1149
|
-
</v-app>
|
|
1150
|
-
</template>
|
|
1151
|
-
```
|
|
1152
|
-
|
|
1153
|
-
---
|
|
1154
|
-
|
|
1155
|
-
### 3. API 请求 baseURL 为 undefined
|
|
1156
|
-
|
|
1157
|
-
**问题:** HTTP 请求的 baseURL 是 undefined
|
|
1158
|
-
|
|
1159
|
-
**解决:**
|
|
1160
|
-
- 在 main.js 中配置 API 地址
|
|
1161
|
-
|
|
1162
|
-
```javascript
|
|
1163
|
-
window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL
|
|
1164
|
-
```
|
|
1165
|
-
|
|
1166
|
-
- 或在 .env 文件中配置
|
|
1167
|
-
|
|
1168
|
-
```env
|
|
1169
|
-
VITE_APP_API_URL=https://api.example.com
|
|
1170
|
-
```
|
|
1171
|
-
|
|
1172
|
-
---
|
|
1173
|
-
|
|
1174
|
-
### 4. 用户信息获取失败
|
|
1175
|
-
|
|
1176
|
-
**问题:** 组件无法获取用户信息
|
|
1177
|
-
|
|
1178
|
-
**解决:**
|
|
1179
|
-
- 确保在 localStorage 中存储了用户信息
|
|
1180
|
-
- 如果使用自定义键名,需要配置 `window.VTK_CONFIG`
|
|
1181
|
-
|
|
1182
|
-
```javascript
|
|
1183
|
-
window.VTK_CONFIG = {
|
|
1184
|
-
storageKeys: {
|
|
1185
|
-
user: 'my_custom_user_key'
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
```
|
|
1189
|
-
|
|
1190
|
-
---
|
|
1191
|
-
|
|
1192
|
-
### 5. 组件样式异常
|
|
1193
|
-
|
|
1194
|
-
**问题:** 组件样式显示不正常
|
|
1195
|
-
|
|
1196
|
-
**解决:**
|
|
1197
|
-
- 确保引入了 CSS 文件
|
|
1198
|
-
- 确保 Vuetify 已正确配置
|
|
1199
|
-
- 检查是否有样式冲突
|
|
1200
|
-
|
|
1201
|
-
```javascript
|
|
1202
|
-
import '@yxhl/specter-pui-vtk/dist/specter-pui-vtk.css'
|
|
1203
|
-
```
|
|
1204
|
-
|
|
1205
|
-
---
|
|
1206
|
-
|
|
1207
|
-
## 版本历史
|
|
1208
|
-
|
|
1209
|
-
### v1.0.0
|
|
1210
|
-
- 初始版本发布
|
|
1211
|
-
- 包含基础组件和工具函数
|
|
1212
|
-
|
|
1213
|
-
---
|
|
1214
|
-
|
|
1215
|
-
## 许可证
|
|
1216
|
-
|
|
1217
|
-
MIT License
|
|
1218
|
-
|
|
1219
|
-
## 作者
|
|
1220
|
-
|
|
1221
|
-
yxhl <17363318852@139.com>
|
|
1222
|
-
|
|
1223
|
-
## 链接
|
|
1224
|
-
|
|
1225
|
-
- [npm 包](https://www.npmjs.com/package/@yxhl/specter-pui-vtk)
|
|
1226
|
-
- [问题反馈](https://gitee.com/liangthink/specter-core-vue/issues)
|
|
1
|
+
# @yxhl/specter-pui-vtk
|
|
2
|
+
|
|
3
|
+
基于 Vue 3 + Vuetify 3 的业务组件库,内置常用业务组件、消息能力、请求封装、存储工具和格式化方法。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [安装](#安装)
|
|
8
|
+
- [快速开始](#快速开始)
|
|
9
|
+
- [全局能力](#全局能力)
|
|
10
|
+
- [组件使用](#组件使用)
|
|
11
|
+
- [工具方法](#工具方法)
|
|
12
|
+
- [配置说明](#配置说明)
|
|
13
|
+
- [开发与发布](#开发与发布)
|
|
14
|
+
- [常见问题](#常见问题)
|
|
15
|
+
|
|
16
|
+
## 安装
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @yxhl/specter-pui-vtk
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
适用环境:
|
|
23
|
+
|
|
24
|
+
- Vue 3.x
|
|
25
|
+
- Vuetify 3.x
|
|
26
|
+
- Node.js >= 16
|
|
27
|
+
|
|
28
|
+
## 快速开始
|
|
29
|
+
|
|
30
|
+
### 1. 在 `main.js` 中注册组件库
|
|
31
|
+
|
|
32
|
+
```js
|
|
33
|
+
import { createApp } from "vue";
|
|
34
|
+
import App from "./App.vue";
|
|
35
|
+
import SpecterPuiVtk from "@yxhl/specter-pui-vtk";
|
|
36
|
+
import "@yxhl/specter-pui-vtk/dist/specter-pui-vtk.css";
|
|
37
|
+
|
|
38
|
+
const app = createApp(App);
|
|
39
|
+
|
|
40
|
+
window.VTK_CONFIG = {
|
|
41
|
+
storageKeys: {
|
|
42
|
+
user: import.meta.env.VITE_MIS_USERS || "_mis_acis_users",
|
|
43
|
+
token: import.meta.env.VITE_MIS_TOKEN || "_mis_acis_token"
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL;
|
|
48
|
+
|
|
49
|
+
app.use(SpecterPuiVtk);
|
|
50
|
+
app.mount("#app");
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. 在根组件挂载消息组件
|
|
54
|
+
|
|
55
|
+
`proxy.$vtk.message` 依赖全局消息组件,建议在 `App.vue` 中加入:
|
|
56
|
+
|
|
57
|
+
```vue
|
|
58
|
+
<template>
|
|
59
|
+
<v-app>
|
|
60
|
+
<router-view />
|
|
61
|
+
<vtk-message />
|
|
62
|
+
</v-app>
|
|
63
|
+
</template>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. 基础使用示例
|
|
67
|
+
|
|
68
|
+
```vue
|
|
69
|
+
<template>
|
|
70
|
+
<VtkStepper :el="step" list="基础信息,详细信息,完成" />
|
|
71
|
+
<VtkPage v-model="pageData" @change="loadData" />
|
|
72
|
+
</template>
|
|
73
|
+
|
|
74
|
+
<script setup>
|
|
75
|
+
import { ref } from "vue";
|
|
76
|
+
|
|
77
|
+
const step = ref(1);
|
|
78
|
+
const pageData = ref({
|
|
79
|
+
pageno: 1,
|
|
80
|
+
pageCount: 1,
|
|
81
|
+
rowCount: 0,
|
|
82
|
+
limit: 10
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const loadData = () => {
|
|
86
|
+
console.log("分页变化", pageData.value);
|
|
87
|
+
};
|
|
88
|
+
</script>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 全局能力
|
|
92
|
+
|
|
93
|
+
安装后可以通过 `this.$vtk` 或 `getCurrentInstance().proxy.$vtk` 使用以下能力:
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
const { proxy } = getCurrentInstance();
|
|
97
|
+
|
|
98
|
+
proxy.$vtk.request;
|
|
99
|
+
proxy.$vtk.storage;
|
|
100
|
+
proxy.$vtk.message;
|
|
101
|
+
proxy.$vtk.Validation;
|
|
102
|
+
proxy.$vtk.filters;
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
其中:
|
|
106
|
+
|
|
107
|
+
- `request`:HTTP 请求封装
|
|
108
|
+
- `storage`:本地存储封装
|
|
109
|
+
- `message`:全局消息、确认框、加载框
|
|
110
|
+
- `Validation`:表单校验方法
|
|
111
|
+
- `filters`:字典转换、脱敏、格式化等工具
|
|
112
|
+
|
|
113
|
+
## 组件使用
|
|
114
|
+
|
|
115
|
+
组件库默认全局注册,注册插件后可直接在模板中使用。
|
|
116
|
+
|
|
117
|
+
### 常用组件列表
|
|
118
|
+
|
|
119
|
+
- `VtkArea`:地区下拉选择
|
|
120
|
+
- `VtkAreaTabs`:Tab 版地区选择
|
|
121
|
+
- `VtkDept`:人员选择
|
|
122
|
+
- `VtkBreadcrumb`:面包屑导航
|
|
123
|
+
- `VtkStepper`:步骤条
|
|
124
|
+
- `VtkPage`:分页
|
|
125
|
+
- `VtkFormItem`:表单项包装
|
|
126
|
+
- `VtkSelect`:下拉选择
|
|
127
|
+
- `VtkCheckbox`:复选框组
|
|
128
|
+
- `VtkRadio`:单选框组
|
|
129
|
+
- `VtkDatePicker`:日期选择
|
|
130
|
+
- `VtkDateSelector`:高级日期选择
|
|
131
|
+
- `VtkImg`:图片预览
|
|
132
|
+
- `VtkPdf`:PDF 查看
|
|
133
|
+
- `VtkUpload`:文件上传
|
|
134
|
+
- `VtkEmpty`:空状态
|
|
135
|
+
- `VtkFab`:悬浮按钮
|
|
136
|
+
|
|
137
|
+
### VtkArea
|
|
138
|
+
|
|
139
|
+
```vue
|
|
140
|
+
<template>
|
|
141
|
+
<VtkArea v-model="areaCode" />
|
|
142
|
+
</template>
|
|
143
|
+
|
|
144
|
+
<script setup>
|
|
145
|
+
import { ref } from "vue";
|
|
146
|
+
|
|
147
|
+
const areaCode = ref("");
|
|
148
|
+
</script>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
常用属性:
|
|
152
|
+
|
|
153
|
+
- `v-model`:地区编码
|
|
154
|
+
- `maxArea`:最大地区层级
|
|
155
|
+
- `minArea`:最小地区层级
|
|
156
|
+
|
|
157
|
+
### VtkDept
|
|
158
|
+
|
|
159
|
+
```vue
|
|
160
|
+
<template>
|
|
161
|
+
<VBtn @click="openDept">选择人员</VBtn>
|
|
162
|
+
<VtkDept ref="deptRef" :multiple="true" @selected="handleSelected" />
|
|
163
|
+
</template>
|
|
164
|
+
|
|
165
|
+
<script setup>
|
|
166
|
+
import { ref } from "vue";
|
|
167
|
+
|
|
168
|
+
const deptRef = ref(null);
|
|
169
|
+
|
|
170
|
+
const openDept = () => {
|
|
171
|
+
deptRef.value?.add();
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const handleSelected = (persons) => {
|
|
175
|
+
console.log(persons);
|
|
176
|
+
};
|
|
177
|
+
</script>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### VtkDateSelector
|
|
181
|
+
|
|
182
|
+
```vue
|
|
183
|
+
<template>
|
|
184
|
+
<VtkDateSelector v-model="date" placeholder="请选择日期" />
|
|
185
|
+
|
|
186
|
+
<VtkDateSelector
|
|
187
|
+
v-model="dateRange"
|
|
188
|
+
mode="range"
|
|
189
|
+
display-mode="month"
|
|
190
|
+
placeholder="请选择月份范围"
|
|
191
|
+
/>
|
|
192
|
+
</template>
|
|
193
|
+
|
|
194
|
+
<script setup>
|
|
195
|
+
import { ref } from "vue";
|
|
196
|
+
|
|
197
|
+
const date = ref("");
|
|
198
|
+
const dateRange = ref([]);
|
|
199
|
+
</script>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
常用属性:
|
|
203
|
+
|
|
204
|
+
- `display-mode`:`day` / `week` / `month` / `year`
|
|
205
|
+
- `mode`:`single` / `range`
|
|
206
|
+
- `inline`:是否内联显示
|
|
207
|
+
- `singlePanel`:范围选择时是否单面板
|
|
208
|
+
- `disableFuture`:是否禁用未来日期
|
|
209
|
+
|
|
210
|
+
### VtkUpload
|
|
211
|
+
|
|
212
|
+
```vue
|
|
213
|
+
<template>
|
|
214
|
+
<VtkUpload
|
|
215
|
+
v-model="files"
|
|
216
|
+
action="/api/upload"
|
|
217
|
+
list-type="picture-card"
|
|
218
|
+
accept=".jpg,.png,.pdf,.xlsx"
|
|
219
|
+
:limit="5"
|
|
220
|
+
:max-size="5"
|
|
221
|
+
tip="支持 jpg/png/pdf/xlsx,单文件不超过 5MB"
|
|
222
|
+
/>
|
|
223
|
+
</template>
|
|
224
|
+
|
|
225
|
+
<script setup>
|
|
226
|
+
import { ref } from "vue";
|
|
227
|
+
|
|
228
|
+
const files = ref([]);
|
|
229
|
+
</script>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
常用属性:
|
|
233
|
+
|
|
234
|
+
- `action`:上传接口地址
|
|
235
|
+
- `listType`:`text` / `picture` / `picture-card`
|
|
236
|
+
- `limit`:最大文件数
|
|
237
|
+
- `maxSize`:单文件大小限制,单位 MB
|
|
238
|
+
- `beforeUpload`:上传前校验
|
|
239
|
+
- `beforeRemove`:删除前校验
|
|
240
|
+
|
|
241
|
+
## 工具方法
|
|
242
|
+
|
|
243
|
+
### 1. request
|
|
244
|
+
|
|
245
|
+
```js
|
|
246
|
+
const { proxy } = getCurrentInstance();
|
|
247
|
+
|
|
248
|
+
proxy.$vtk.request.getForm("/api/user", { id: 1 });
|
|
249
|
+
proxy.$vtk.request.postForm("/api/user", { name: "test" });
|
|
250
|
+
proxy.$vtk.request.getJson("/api/user", { id: 1 });
|
|
251
|
+
proxy.$vtk.request.postJson("/api/user", { name: "test" });
|
|
252
|
+
proxy.$vtk.request.imp("/api/upload", formData);
|
|
253
|
+
proxy.$vtk.request.exp("/api/export", { id: 1 });
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
说明:
|
|
257
|
+
|
|
258
|
+
- 自动读取 token 并注入请求头
|
|
259
|
+
- `baseURL` 来自 `window.VITE_APP_API_URL`
|
|
260
|
+
- 登录失效时会自动弹窗并回到首页
|
|
261
|
+
|
|
262
|
+
### 2. storage
|
|
263
|
+
|
|
264
|
+
```js
|
|
265
|
+
const { proxy } = getCurrentInstance();
|
|
266
|
+
|
|
267
|
+
proxy.$vtk.storage.set("key", "value");
|
|
268
|
+
proxy.$vtk.storage.set("user", { name: "admin" });
|
|
269
|
+
|
|
270
|
+
proxy.$vtk.storage.get("key");
|
|
271
|
+
proxy.$vtk.storage.remove("key");
|
|
272
|
+
proxy.$vtk.storage.clear();
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### 3. message
|
|
276
|
+
|
|
277
|
+
```js
|
|
278
|
+
const { proxy } = getCurrentInstance();
|
|
279
|
+
|
|
280
|
+
proxy.$vtk.message.success("操作成功");
|
|
281
|
+
proxy.$vtk.message.error("操作失败");
|
|
282
|
+
proxy.$vtk.message.warning("警告信息");
|
|
283
|
+
proxy.$vtk.message.info("提示信息");
|
|
284
|
+
proxy.$vtk.message.toast("普通提示");
|
|
285
|
+
|
|
286
|
+
proxy.$vtk.message.confirm({
|
|
287
|
+
title: "提示",
|
|
288
|
+
text: "确认删除吗?",
|
|
289
|
+
onConfirm: () => console.log("confirm"),
|
|
290
|
+
onCancel: () => console.log("cancel")
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
proxy.$vtk.message.alert({
|
|
294
|
+
title: "提示",
|
|
295
|
+
text: "保存成功"
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
proxy.$vtk.message.loading.show();
|
|
299
|
+
proxy.$vtk.message.loading.hide();
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 4. Validation
|
|
303
|
+
|
|
304
|
+
```js
|
|
305
|
+
const { proxy } = getCurrentInstance();
|
|
306
|
+
|
|
307
|
+
const rules = [
|
|
308
|
+
proxy.$vtk.Validation.required("不能为空"),
|
|
309
|
+
proxy.$vtk.Validation.mobile("手机号格式不正确")
|
|
310
|
+
];
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### 5. filters
|
|
314
|
+
|
|
315
|
+
`dictionary.js`、`mask.js`、`format.js` 中的方法会一起挂到 `$vtk.filters`,同时字典方法也会被直接导出。
|
|
316
|
+
|
|
317
|
+
```js
|
|
318
|
+
const { proxy } = getCurrentInstance();
|
|
319
|
+
|
|
320
|
+
proxy.$vtk.filters.dict("1", "0:禁用/1:启用");
|
|
321
|
+
proxy.$vtk.filters.analyType("1");
|
|
322
|
+
proxy.$vtk.filters.analyLevel("2");
|
|
323
|
+
proxy.$vtk.filters.mobile("13812345678");
|
|
324
|
+
proxy.$vtk.filters.idcard("330101199001011234");
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### 6. appendAppParams
|
|
328
|
+
|
|
329
|
+
用于根据应用 `aid` 获取真实地址,或对已有 URL 追加参数。
|
|
330
|
+
|
|
331
|
+
```js
|
|
332
|
+
const { proxy } = getCurrentInstance();
|
|
333
|
+
|
|
334
|
+
const url1 = await proxy.$vtk.filters.appendAppParams(
|
|
335
|
+
"1226652a-3245-11ec-ad84-506b4bfd2204",
|
|
336
|
+
"",
|
|
337
|
+
{ stoken: "123", name: "xiong" }
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
const url2 = await proxy.$vtk.filters.appendAppParams(
|
|
341
|
+
"https://mis.hzcl.org.cn/test#/page",
|
|
342
|
+
"",
|
|
343
|
+
{ stoken: "123" }
|
|
344
|
+
);
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
当前逻辑:
|
|
348
|
+
|
|
349
|
+
- 如果第一个参数是 `aid`,会请求 `/kudas/xfwez/apps`
|
|
350
|
+
- 接口参数格式:`{ aid }`
|
|
351
|
+
- 默认取返回结果中的 `puri`
|
|
352
|
+
- `sobject` 中的参数会自动拼接到结果 URL 上
|
|
353
|
+
- 如果 URL 已有同名参数,则不会重复追加
|
|
354
|
+
|
|
355
|
+
## 配置说明
|
|
356
|
+
|
|
357
|
+
### VTK_CONFIG
|
|
358
|
+
|
|
359
|
+
```js
|
|
360
|
+
window.VTK_CONFIG = {
|
|
361
|
+
storageKeys: {
|
|
362
|
+
user: "_mis_acis_users",
|
|
363
|
+
token: "_mis_acis_token"
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
默认值:
|
|
369
|
+
|
|
370
|
+
- `user`: `_mis_acis_users`
|
|
371
|
+
- `token`: `_mis_acis_token`
|
|
372
|
+
|
|
373
|
+
### API 地址
|
|
374
|
+
|
|
375
|
+
```js
|
|
376
|
+
window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL;
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
也可以在 `.env` 中配置:
|
|
380
|
+
|
|
381
|
+
```env
|
|
382
|
+
VITE_APP_API_URL=https://api.example.com
|
|
383
|
+
VITE_MIS_USERS=_mis_acis_users
|
|
384
|
+
VITE_MIS_TOKEN=_mis_acis_token
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## 开发与发布
|
|
388
|
+
|
|
389
|
+
### 本地开发
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
npm run dev
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### 打包
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
npm run build
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 发布前版本更新
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
npm version patch
|
|
405
|
+
npm version minor
|
|
406
|
+
npm version major
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### 发布
|
|
410
|
+
|
|
411
|
+
```bash
|
|
412
|
+
npm publish --access public
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## 常见问题
|
|
416
|
+
|
|
417
|
+
### 1. 组件未生效
|
|
418
|
+
|
|
419
|
+
请确认:
|
|
420
|
+
|
|
421
|
+
- 已执行 `app.use(SpecterPuiVtk)`
|
|
422
|
+
- 已引入样式 `@yxhl/specter-pui-vtk/dist/specter-pui-vtk.css`
|
|
423
|
+
|
|
424
|
+
### 2. 消息组件不显示
|
|
425
|
+
|
|
426
|
+
请确认根组件中已挂载:
|
|
427
|
+
|
|
428
|
+
```vue
|
|
429
|
+
<vtk-message />
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### 3. 请求地址是 `undefined`
|
|
433
|
+
|
|
434
|
+
请确认已设置:
|
|
435
|
+
|
|
436
|
+
```js
|
|
437
|
+
window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL;
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 4. 组件读取不到用户信息
|
|
441
|
+
|
|
442
|
+
请确认用户信息已写入本地存储,并且 key 与 `window.VTK_CONFIG.storageKeys.user` 一致。
|
|
443
|
+
|
|
444
|
+
## 版本
|
|
445
|
+
|
|
446
|
+
当前版本:`1.0.68`
|
|
447
|
+
|
|
448
|
+
## License
|
|
449
|
+
|
|
450
|
+
MIT
|