@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 CHANGED
@@ -1,1226 +1,450 @@
1
- # @yxhl/specter-pui-vtk
2
-
3
- > 雅心互联 Vue 3 + Vuetify 3 智能组件库
4
-
5
- 基于 Vuetify 3 的企业级 Vue 3 组件库,提供丰富的业务组件和工具函数。
6
-
7
- ## 📋 目录
8
-
9
- - [快速开始](#快速开始)
10
- - [安装配置](#安装配置)
11
- - [组件文档](#组件文档)
12
- - [VtkUpload - 文件上传组件](#vtkupload---文件上传组件)
13
- - [公用方法](#公用方法)
14
- - [配置选项](#配置选项)
15
- - [更新迭代](#更新迭代)
16
- - [常见问题](#常见问题)
17
-
18
- ---
19
-
20
- ## 快速开始
21
-
22
- ### 1. 安装组件库
23
-
24
- ```bash
25
- npm install @yxhl/specter-pui-vtk
26
- ```
27
-
28
- ### 2. 引入组件库
29
-
30
- `src/main.js` `src/main.ts` 中:
31
-
32
- ```javascript
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
- // 配置组件库(可选)
41
- window.VTK_CONFIG = {
42
- storageKeys: {
43
- user: import.meta.env.VITE_MIS_USERS || '_mis_acis_users',
44
- token: import.meta.env.VITE_MIS_TOKEN || '_mis_acis_token'
45
- }
46
- }
47
-
48
- // 配置 API 地址(可选)
49
- window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL
50
-
51
- app.use(SpecterPuiVtk)
52
- app.mount('#app')
53
- ```
54
-
55
- ### 3. 使用组件
56
-
57
- ```vue
58
- <template>
59
- <VtkStepper :el="currentStep" list="步骤1,步骤2,步骤3" />
60
- <VtkPage v-model="page" :total="total" />
61
- </template>
62
-
63
- <script setup>
64
- import { ref } from 'vue'
65
-
66
- const currentStep = ref(1)
67
- const page = ref({ pageno: 1, limit: 10 })
68
- const total = ref(100)
69
- </script>
70
- ```
71
-
72
- ---
73
-
74
- ## 安装配置
75
-
76
- ### 环境要求
77
-
78
- - Vue 3.x
79
- - Vuetify 3.x
80
- - Node.js >= 16
81
-
82
- ### 完整配置示例
83
-
84
- ```javascript
85
- // main.js
86
- import { createApp } from 'vue'
87
- import App from './App.vue'
88
- import SpecterPuiVtk from '@yxhl/specter-pui-vtk'
89
- import '@yxhl/specter-pui-vtk/dist/specter-pui-vtk.css'
90
-
91
- const app = createApp(App)
92
-
93
- // 1. 配置存储键名(可选)
94
- window.VTK_CONFIG = {
95
- storageKeys: {
96
- user: import.meta.env.VITE_MIS_USERS || '_mis_acis_users',
97
- token: import.meta.env.VITE_MIS_TOKEN || '_mis_acis_token'
98
- }
99
- }
100
-
101
- // 2. 配置 API 基础地址(可选)
102
- window.VITE_APP_API_URL = import.meta.env.VITE_APP_API_URL
103
-
104
- // 3. 注册组件库
105
- app.use(SpecterPuiVtk)
106
-
107
- // 4. 添加消息组件到模板(必需)
108
- // 在 App.vue 中添加:
109
- // <template>
110
- // <v-app>
111
- // <router-view />
112
- // <vtk-message />
113
- // </v-app>
114
- // </template>
115
-
116
- app.mount('#app')
117
- ```
118
-
119
- ### 环境变量配置
120
-
121
- 在项目根目录创建 `.env` 文件:
122
-
123
- ```env
124
- # API 基础地址
125
- VITE_APP_API_URL=https://api.example.com
126
-
127
- # 存储键名(可选)
128
- VITE_MIS_USERS=my_user_key
129
- VITE_MIS_TOKEN=my_token_key
130
- ```
131
-
132
- ---
133
-
134
- ## 组件文档
135
-
136
- ### 基础组件
137
-
138
- #### VtkArea - 地区选择组件
139
-
140
- 地区选择下拉组件,支持省市区三级联动。
141
-
142
- **Props:**
143
- - `modelValue` (String): 绑定值,地区代码
144
- - `placeholder` (String): 占位文本,默认 "请选择地区"
145
-
146
- **Events:**
147
- - `update:modelValue`: 值变化时触发
148
- - `change`: 选择变化时触发
149
-
150
- **使用示例:**
151
- ```vue
152
- <VtkArea v-model="areaCode" placeholder="选择地区" @change="handleChange" />
153
- ```
154
-
155
- ---
156
-
157
- #### VtkAreaTabs - 地区选择组件(Tab 版)
158
-
159
- 带 Tab 切换的地区选择组件,支持多级地区选择。
160
-
161
- **Props:**
162
- - `modelValue` (String): 绑定值,地区代码
163
- - `minArea` (Number): 最小地区级别(2=省,4=市,6=区县,9=街镇,12=村社)
164
- - `areaNode` (Number): 显示的地区节点数量
165
-
166
- **Events:**
167
- - `update:modelValue`: 值变化时触发
168
- - `change`: 选择变化时触发
169
-
170
- **使用示例:**
171
- ```vue
172
- <!-- 基础使用 -->
173
- <VtkAreaTabs v-model="areaCode" @change="handleChange" />
174
-
175
- <!-- 限制到区县级别 -->
176
- <VtkAreaTabs v-model="areaCode" :min-area="6" />
177
-
178
- <!-- 只显示最后2级地区名称 -->
179
- <VtkAreaTabs v-model="areaCode" :area-node="2" />
180
- ```
181
-
182
- ---
183
-
184
- #### VtkDept - 人员选择组件
185
-
186
- 地区-部门-人员三级联动选择组件,支持单选和多选。
187
-
188
- **Props:**
189
- - `multiple` (Boolean): 是否多选,默认 false
190
-
191
- **Events:**
192
- - `selected`: 选择完成时触发,参数为选中的人员数组
193
-
194
- **Methods:**
195
- - `add()`: 打开选择对话框
196
- - `close()`: 关闭选择对话框
197
-
198
- **使用示例:**
199
- ```vue
200
- <template>
201
- <VBtn @click="openDept">选择人员</VBtn>
202
- <VtkDept
203
- ref="deptRef"
204
- :multiple="true"
205
- @selected="handleSelected"
206
- />
207
- </template>
208
-
209
- <script setup>
210
- import { ref } from 'vue'
211
-
212
- const deptRef = ref(null)
213
-
214
- const openDept = () => {
215
- deptRef.value?.add()
216
- }
217
-
218
- const handleSelected = (persons) => {
219
- console.log('选中的人员:', persons)
220
- }
221
- </script>
222
- ```
223
-
224
- ---
225
-
226
- #### VtkBreadcrumb - 面包屑导航
227
-
228
- 面包屑导航组件,支持自定义返回路径。
229
-
230
- **Props:**
231
- - `items` (Array): 面包屑项数组,格式:`[{ title: '首页', to: '/home' }]`
232
- - `showBack` (Boolean): 是否显示返回按钮,默认 true
233
- - `backTo` (String): 返回路径
234
- - `backText` (String): 返回按钮文本,默认 "返回"
235
-
236
- **Events:**
237
- - `back`: 点击返回按钮时触发
238
-
239
- **使用示例:**
240
- ```vue
241
- <VtkBreadcrumb
242
- :items="[
243
- { title: '首页', to: '/home' },
244
- { title: '用户管理', to: '/users' },
245
- { title: '用户详情' }
246
- ]"
247
- back-to="/home"
248
- @back="handleBack"
249
- />
250
- ```
251
-
252
- ---
253
-
254
- #### VtkStepper - 步骤条组件
255
-
256
- 步骤条组件,用于展示多步骤流程。
257
-
258
- **Props:**
259
- - `el` (Number): 当前步骤,从 1 开始
260
- - `list` (String): 步骤列表,逗号分隔,如 "步骤1,步骤2,步骤3"
261
-
262
- **Slots:**
263
- - `1`, `2`, `3`...: 各步骤的内容插槽
264
-
265
- **使用示例:**
266
- ```vue
267
- <VtkStepper :el="currentStep" list="基础信息,详细信息,完成">
268
- <template #1>
269
- <div>步骤1的内容</div>
270
- </template>
271
- <template #2>
272
- <div>步骤2的内容</div>
273
- </template>
274
- <template #3>
275
- <div>步骤3的内容</div>
276
- </template>
277
- </VtkStepper>
278
- ```
279
-
280
- ---
281
-
282
- #### VtkPage - 分页组件
283
-
284
- 分页组件,支持页码和每页数量选择。
285
-
286
- **Props:**
287
- - `modelValue` (Object): 绑定值,格式:`{ pageno: 1, pageCount: 10, rowCount: 100, limit: 10 }`
288
-
289
- **Events:**
290
- - `update:modelValue`: 分页变化时触发
291
- - `change`: 分页变化时触发
292
-
293
- **使用示例:**
294
- ```vue
295
- <VtkPage v-model="pageData" @change="loadData" />
296
-
297
- <script setup>
298
- const pageData = ref({
299
- pageno: 1, // 当前页
300
- pageCount: 10, // 总页数
301
- rowCount: 100, // 总记录数
302
- limit: 10 // 每页数量
303
- })
304
- </script>
305
- ```
306
-
307
- ---
308
-
309
- #### VtkFormItem - 表单项组件
310
-
311
- 表单项组件,提供标签和帮助文本。
312
-
313
- **Props:**
314
- - `label` (String): 标签文本
315
- - `must` (Boolean): 是否必填,显示红色星号
316
- - `left` (Boolean): 标签左对齐
317
- - `help` (String): 帮助文本,支持 HTML
318
-
319
- **Slots:**
320
- - `default`: 表单控件插槽
321
-
322
- **使用示例:**
323
- ```vue
324
- <VtkFormItem
325
- label="用户名:"
326
- must
327
- left
328
- help="请输入4-20位字符"
329
- >
330
- <VTextField v-model="username" />
331
- </VtkFormItem>
332
- ```
333
-
334
- ---
335
-
336
- #### VtkSelect - 下拉选择组件
337
-
338
- 下拉选择组件,支持字符串格式的选项列表。
339
-
340
- **Props:**
341
- - `modelValue`: 绑定值
342
- - `list` (String): 选项列表,格式:`"value1:label1/value2:label2"`
343
- - `placeholder` (String): 占位文本
344
- - 其他 Vuetify VSelect 的 props
345
-
346
- **使用示例:**
347
- ```vue
348
- <VtkSelect
349
- v-model="selected"
350
- list="1:选项1/2:选项2/3:选项3"
351
- placeholder="请选择"
352
- />
353
- ```
354
-
355
- ---
356
-
357
- #### VtkCheckbox - 复选框组件
358
-
359
- 复选框组件,支持字符串格式的选项列表。
360
-
361
- **Props:**
362
- - `modelValue`: 绑定值
363
- - `list` (String): 选项列表,格式:`"value1:label1/value2:label2"`
364
-
365
- **使用示例:**
366
- ```vue
367
- <VtkCheckbox
368
- v-model="selected"
369
- list="1:选项1/2:选项2/3:选项3"
370
- />
371
- ```
372
-
373
- ---
374
-
375
- #### VtkRadio - 单选框组件
376
-
377
- 单选框组件,支持字符串格式的选项列表。
378
-
379
- **Props:**
380
- - `modelValue`: 绑定值
381
- - `list` (String): 选项列表,格式:`"value1:label1/value2:label2"`
382
-
383
- **使用示例:**
384
- ```vue
385
- <VtkRadio
386
- v-model="selected"
387
- list="1:选项1/2:选项2/3:选项3"
388
- />
389
- ```
390
-
391
- ---
392
-
393
- #### VtkDatePicker - 日期选择器
394
-
395
- 日期选择器组件。
396
-
397
- **Props:**
398
- - `modelValue`: 绑定值
399
- - `placeholder` (String): 占位文本
400
-
401
- **使用示例:**
402
- ```vue
403
- <VtkDatePicker v-model="date" placeholder="选择日期" />
404
- ```
405
-
406
- ---
407
-
408
- #### VtkDateSelector - 高级日期选择器
409
-
410
- 功能强大的日期选择器组件,支持日期、周、月、年的单选和范围选择,适配 Vuetify 3 主题(亮色/暗色)。
411
-
412
- **Props:**
413
- - `modelValue` (String | Array): 绑定值
414
- - 单选模式:字符串,如 `"2024-01-01"`
415
- - 范围模式:数组,如 `["2024-01-01", "2024-01-31"]`
416
- - `displayMode` (String): 显示模式,可选值:`'day'` | `'week'` | `'month'` | `'year'`,默认 `'day'`
417
- - `mode` (String): 选择模式,可选值:`'single'` | `'range'`,默认 `'single'`
418
- - `placeholder` (String): 占位文本,默认 `'请选择日期'`
419
- - `disabled` (Boolean): 是否禁用,默认 `false`
420
- - `format` (String): 日期格式,默认 `'YYYY-MM-DD'`
421
- - `separator` (String): 范围分隔符,默认 `' 至 '`
422
- - `inline` (Boolean): 内联模式,直接显示选择器,不需要点击输入框,默认 `false`
423
- - `singlePanel` (Boolean): 单面板模式,范围选择时只显示一个面板,默认 `false`
424
- - `disableFuture` (Boolean): 禁用未来日期,大于当前日期的都置灰不可选,默认 `false`
425
- - `onCancel` (Function): 自定义取消方法
426
- - `onConfirm` (Function): 自定义确认方法
427
- - `disableFuture` (Boolean): 是否禁用超出日期,默认 `false`
428
-
429
- **Events:**
430
- - `update:modelValue`: 值变化时触发
431
- - `change`: 选择变化时触发
432
- - `cancel`: 点击取消按钮时触发(未提供 onCancel 时)
433
- - `confirm`: 点击确认按钮时触发(未提供 onConfirm 时)
434
-
435
- **使用示例:**
436
-
437
- ```vue
438
- <template>
439
- <!-- 基础使用:单选日期 -->
440
- <VtkDateSelector v-model="date" placeholder="选择日期" />
441
-
442
- <!-- 日期范围选择 -->
443
- <VtkDateSelector
444
- v-model="dateRange"
445
- mode="range"
446
- displayMode="day"
447
- placeholder="选择日期范围"
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