vue_zhongyou 1.0.12 → 1.0.14
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/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
v-model="formData[field.field]"
|
|
9
9
|
:type="field.type === 'textarea' ? 'textarea' : 'text'"
|
|
10
10
|
:label="field.label"
|
|
11
|
-
:label-width="60"
|
|
11
|
+
:label-width="field.labelWidth || 60"
|
|
12
12
|
:placeholder="field.placeholder || `请输入${field.label}`"
|
|
13
13
|
:rules="field.rules || []"
|
|
14
14
|
:maxlength="field.maxlength"
|
|
@@ -20,7 +20,12 @@
|
|
|
20
20
|
/>
|
|
21
21
|
|
|
22
22
|
<!-- 单选 -->
|
|
23
|
-
<van-field
|
|
23
|
+
<van-field
|
|
24
|
+
v-else-if="field.type === 'radio'"
|
|
25
|
+
name="radio"
|
|
26
|
+
:label="field.label"
|
|
27
|
+
:label-width="field.labelWidth || 60"
|
|
28
|
+
:rules="field.rules || []">
|
|
24
29
|
<template #input>
|
|
25
30
|
<van-radio-group
|
|
26
31
|
v-model="formData[field.field]"
|
|
@@ -41,7 +46,12 @@
|
|
|
41
46
|
|
|
42
47
|
|
|
43
48
|
<!-- 多选 -->
|
|
44
|
-
<van-field
|
|
49
|
+
<van-field
|
|
50
|
+
v-else-if="field.type === 'checkbox'"
|
|
51
|
+
name="checkboxGroup"
|
|
52
|
+
:label="field.label"
|
|
53
|
+
:label-width="field.labelWidth || 60"
|
|
54
|
+
:rules="field.rules || []">
|
|
45
55
|
<template #input>
|
|
46
56
|
<van-checkbox-group
|
|
47
57
|
v-model="formData[field.field]"
|
|
@@ -66,6 +76,7 @@
|
|
|
66
76
|
is-link
|
|
67
77
|
readonly
|
|
68
78
|
:label="field.label"
|
|
79
|
+
:label-width="field.labelWidth || 60"
|
|
69
80
|
:placeholder="field.placeholder || `请选择${field.label}`"
|
|
70
81
|
:model-value="getSelectLabel(field)"
|
|
71
82
|
:rules="field.rules || []"
|
|
@@ -78,6 +89,7 @@
|
|
|
78
89
|
is-link
|
|
79
90
|
readonly
|
|
80
91
|
:label="field.label"
|
|
92
|
+
:label-width="field.labelWidth || 60"
|
|
81
93
|
:placeholder="field.placeholder || '请选择时间范围'"
|
|
82
94
|
:rules="field.rules || []"
|
|
83
95
|
:model-value="getDateRangeText(field)"
|
|
@@ -90,7 +102,7 @@
|
|
|
90
102
|
is-link
|
|
91
103
|
readonly
|
|
92
104
|
:label="field.label"
|
|
93
|
-
:label-width="60"
|
|
105
|
+
:label-width="field.labelWidth || 60"
|
|
94
106
|
:placeholder="field.placeholder || '请选择日期时间范围'"
|
|
95
107
|
:model-value="getDateTimeRangeText(field)"
|
|
96
108
|
:rules="field.rules || []"
|
|
@@ -103,6 +115,7 @@
|
|
|
103
115
|
is-link
|
|
104
116
|
readonly
|
|
105
117
|
:label="field.label"
|
|
118
|
+
:label-width="field.labelWidth || 60"
|
|
106
119
|
:placeholder="field.placeholder || '请选择地址'"
|
|
107
120
|
:rules="field.rules || []"
|
|
108
121
|
:model-value="getAddressText(field)"
|
|
@@ -115,7 +128,7 @@
|
|
|
115
128
|
is-link
|
|
116
129
|
readonly
|
|
117
130
|
:label="field.label"
|
|
118
|
-
:label-width="60"
|
|
131
|
+
:label-width="field.labelWidth || 60"
|
|
119
132
|
:placeholder="field.placeholder || '请选择日期时间'"
|
|
120
133
|
:model-value="getDateTimeText(field)"
|
|
121
134
|
:rules="field.rules || []"
|
|
@@ -198,6 +211,7 @@
|
|
|
198
211
|
<van-area
|
|
199
212
|
:area-list="areaList"
|
|
200
213
|
:columns-placeholder="addressPopup.columnsPlaceholder || ['请选择', '请选择', '请选择']"
|
|
214
|
+
v-model="addressPopup.value"
|
|
201
215
|
@confirm="onAddressConfirm"
|
|
202
216
|
@cancel="closeAddressPicker"
|
|
203
217
|
/>
|
|
@@ -280,7 +294,8 @@ const addressPopup = ref({
|
|
|
280
294
|
visible: false,
|
|
281
295
|
field: null,
|
|
282
296
|
areaList: null,
|
|
283
|
-
columnsPlaceholder: null
|
|
297
|
+
columnsPlaceholder: null,
|
|
298
|
+
value: ''
|
|
284
299
|
})
|
|
285
300
|
|
|
286
301
|
// 存储各个datetime字段的选择时间
|
|
@@ -309,7 +324,7 @@ const getDefaultValue = (type) => {
|
|
|
309
324
|
if (type === 'dateRange') return ['', '']
|
|
310
325
|
if (type === 'datetimeRange') return ['', '']
|
|
311
326
|
if (type === 'datetime') return ''
|
|
312
|
-
if (type === 'address') return
|
|
327
|
+
if (type === 'address') return ''
|
|
313
328
|
return ''
|
|
314
329
|
}
|
|
315
330
|
|
|
@@ -344,21 +359,31 @@ watch(
|
|
|
344
359
|
|
|
345
360
|
const updateFieldValue = (field, value) => {
|
|
346
361
|
formData[field] = value
|
|
347
|
-
emit('update:modelValue', snapshot())
|
|
348
362
|
emit('change', { field, value, values: snapshot() })
|
|
349
363
|
}
|
|
350
364
|
|
|
351
365
|
const handleSubmit = () => {
|
|
366
|
+
emit('update:modelValue', snapshot())
|
|
352
367
|
emit('submit', snapshot())
|
|
353
368
|
}
|
|
354
369
|
|
|
355
370
|
const handleReset = () => {
|
|
371
|
+
// 清空表单数据
|
|
372
|
+
Object.keys(formData).forEach(key => {
|
|
373
|
+
delete formData[key]
|
|
374
|
+
})
|
|
375
|
+
|
|
356
376
|
// 清除保存的datetime值
|
|
357
377
|
Object.keys(dateTimeValues.value).forEach(key => {
|
|
358
378
|
delete dateTimeValues.value[key]
|
|
359
379
|
})
|
|
360
380
|
|
|
361
|
-
|
|
381
|
+
// 重新初始化表单数据为空值
|
|
382
|
+
normalizedSchema.value.forEach((field) => {
|
|
383
|
+
const key = field.field
|
|
384
|
+
formData[key] = getDefaultValue(field.type)
|
|
385
|
+
})
|
|
386
|
+
|
|
362
387
|
emit('update:modelValue', snapshot())
|
|
363
388
|
emit('reset', snapshot())
|
|
364
389
|
}
|
|
@@ -383,6 +408,9 @@ const onSelectConfirm = ({ selectedOptions }) => {
|
|
|
383
408
|
const option = selectedOptions?.[0]
|
|
384
409
|
if (option && selectPopup.value.field) {
|
|
385
410
|
updateFieldValue(selectPopup.value.field.field, option.value)
|
|
411
|
+
|
|
412
|
+
// 触发modelValue更新
|
|
413
|
+
emit('update:modelValue', snapshot())
|
|
386
414
|
}
|
|
387
415
|
closeSelect()
|
|
388
416
|
}
|
|
@@ -481,6 +509,9 @@ const confirmDateTimeRange = () => {
|
|
|
481
509
|
// 更新表单数据
|
|
482
510
|
if (dateTimeRangePopup.value.field) {
|
|
483
511
|
updateFieldValue(dateTimeRangePopup.value.field.field, [startDateStr, endDateStr])
|
|
512
|
+
|
|
513
|
+
// 触发modelValue更新
|
|
514
|
+
emit('update:modelValue', snapshot())
|
|
484
515
|
}
|
|
485
516
|
// 关闭弹窗
|
|
486
517
|
closeDateTimeRange()
|
|
@@ -556,6 +587,10 @@ const onDateRangeConfirm = (values) => {
|
|
|
556
587
|
}
|
|
557
588
|
const [start, end] = values
|
|
558
589
|
updateFieldValue(dateRangePopup.value.field.field, [formatDate(start), formatDate(end)])
|
|
590
|
+
|
|
591
|
+
// 触发modelValue更新
|
|
592
|
+
emit('update:modelValue', snapshot())
|
|
593
|
+
|
|
559
594
|
closeDateRange()
|
|
560
595
|
}
|
|
561
596
|
|
|
@@ -580,16 +615,48 @@ const getDateTimeRangeText = (field) => {
|
|
|
580
615
|
|
|
581
616
|
// Address
|
|
582
617
|
const openAddressPicker = (field) => {
|
|
583
|
-
|
|
618
|
+
const config = {
|
|
584
619
|
visible: true,
|
|
585
620
|
field,
|
|
586
621
|
areaList: areaList,
|
|
587
622
|
columnsPlaceholder: field.columnsPlaceholder
|
|
588
623
|
}
|
|
624
|
+
|
|
625
|
+
// 如果表单数据中已有code值,则设置默认选中项
|
|
626
|
+
const fieldValue = formData[field.field]
|
|
627
|
+
let code = ''
|
|
628
|
+
|
|
629
|
+
// 如果fieldValue是一个对象且包含code属性
|
|
630
|
+
if (fieldValue && typeof fieldValue === 'object' && fieldValue.code) {
|
|
631
|
+
code = fieldValue.code
|
|
632
|
+
}
|
|
633
|
+
// 如果fieldValue是一个字符串(直接是code值)
|
|
634
|
+
else if (fieldValue && typeof fieldValue === 'string') {
|
|
635
|
+
code = fieldValue
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
if (code) {
|
|
639
|
+
config.value = getCodeToAreaValue(code)
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
addressPopup.value = config
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// 根据code获取地址选择器的默认值
|
|
646
|
+
const getCodeToAreaValue = (code) => {
|
|
647
|
+
if (!code) return ''
|
|
648
|
+
|
|
649
|
+
// 确保code是字符串且长度为6
|
|
650
|
+
const codeStr = String(code).padEnd(6, '0')
|
|
651
|
+
|
|
652
|
+
// 返回完整的6位code作为value
|
|
653
|
+
return codeStr
|
|
589
654
|
}
|
|
590
655
|
|
|
591
656
|
const closeAddressPicker = () => {
|
|
592
657
|
addressPopup.value.visible = false
|
|
658
|
+
// 清除value值,以免影响下次打开
|
|
659
|
+
addressPopup.value.value = ''
|
|
593
660
|
}
|
|
594
661
|
|
|
595
662
|
const onAddressConfirm = ({ selectedOptions }) => {
|
|
@@ -599,20 +666,58 @@ const onAddressConfirm = ({ selectedOptions }) => {
|
|
|
599
666
|
}
|
|
600
667
|
console.log(selectedOptions);
|
|
601
668
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
669
|
+
// 从数组中找出最后一项value值不为000000的值作为当前的code值返回
|
|
670
|
+
let code = '';
|
|
671
|
+
for (let i = selectedOptions.length - 1; i >= 0; i--) {
|
|
672
|
+
const option = selectedOptions[i];
|
|
673
|
+
if (option && option.value && option.value !== '000000') {
|
|
674
|
+
code = option.value;
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
updateFieldValue(addressPopup.value.field.field, code)
|
|
680
|
+
|
|
681
|
+
// 触发modelValue更新
|
|
682
|
+
emit('update:modelValue', snapshot())
|
|
683
|
+
|
|
609
684
|
closeAddressPicker()
|
|
610
685
|
}
|
|
611
686
|
|
|
612
687
|
const getAddressText = (field) => {
|
|
613
688
|
const value = formData[field.field]
|
|
614
|
-
|
|
615
|
-
|
|
689
|
+
// 如果value是一个对象且包含code属性
|
|
690
|
+
if (value && typeof value === 'object' && value.code) {
|
|
691
|
+
return getCodeToAddressText(value.code)
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// 如果value是一个字符串(直接是code值)
|
|
695
|
+
if (value && typeof value === 'string') {
|
|
696
|
+
return getCodeToAddressText(value)
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
return ''
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// 根据code获取地址文本
|
|
703
|
+
const getCodeToAddressText = (code) => {
|
|
704
|
+
if (!code) return ''
|
|
705
|
+
|
|
706
|
+
// 确保code是字符串且长度为6
|
|
707
|
+
const codeStr = String(code).padEnd(6, '0')
|
|
708
|
+
|
|
709
|
+
// 提取省、市、区县的code
|
|
710
|
+
const provinceCode = codeStr.substring(0, 2) + '0000'
|
|
711
|
+
const cityCode = codeStr.substring(0, 4) + '00'
|
|
712
|
+
const countyCode = codeStr
|
|
713
|
+
|
|
714
|
+
// 获取对应的文本
|
|
715
|
+
const province = areaList.province_list[provinceCode] || ''
|
|
716
|
+
const city = areaList.city_list[cityCode] || ''
|
|
717
|
+
const county = areaList.county_list[countyCode] || ''
|
|
718
|
+
|
|
719
|
+
// 过滤掉空值并拼接
|
|
720
|
+
const parts = [province, city, county].filter(Boolean)
|
|
616
721
|
return parts.join('')
|
|
617
722
|
}
|
|
618
723
|
|
|
@@ -624,16 +729,24 @@ const openDateTime = (field) => {
|
|
|
624
729
|
// 检查是否已有该字段的保存值
|
|
625
730
|
const savedTime = dateTimeValues.value[field.field]
|
|
626
731
|
|
|
627
|
-
//
|
|
732
|
+
// 检查表单数据中是否有该字段的值
|
|
733
|
+
const formValue = formData[field.field]
|
|
734
|
+
|
|
628
735
|
if (savedTime) {
|
|
736
|
+
// 如果已经有保存的时间,则使用保存的时间
|
|
629
737
|
dateTimePopup.value.selectedTime = new Date(savedTime)
|
|
738
|
+
} else if (formValue) {
|
|
739
|
+
// 如果表单数据中有该字段的值,则使用表单数据中的值
|
|
740
|
+
dateTimePopup.value.selectedTime = typeof formValue === 'string' ? reverseFormatDateTime(formValue) : new Date(formValue)
|
|
741
|
+
} else if (field.defaultValue) {
|
|
742
|
+
// 如果字段有默认值,则使用字段的默认值
|
|
743
|
+
dateTimePopup.value.selectedTime = typeof field.defaultValue === 'string' ? reverseFormatDateTime(field.defaultValue) : new Date(field.defaultValue)
|
|
630
744
|
} else {
|
|
745
|
+
// 否则设置默认时间为当天8:30
|
|
631
746
|
const today = new Date()
|
|
632
747
|
const defaultTime = new Date(today)
|
|
633
748
|
defaultTime.setHours(8, 30, 0, 0)
|
|
634
|
-
|
|
635
|
-
// 将field的时间转换为日期时间格式
|
|
636
|
-
dateTimePopup.value.selectedTime = typeof field.defaultValue === 'string' ? reverseFormatDateTime(field.defaultValue) : defaultTime
|
|
749
|
+
dateTimePopup.value.selectedTime = defaultTime
|
|
637
750
|
}
|
|
638
751
|
|
|
639
752
|
// 更新当前小时值
|
|
@@ -659,6 +772,9 @@ const confirmDateTime = () => {
|
|
|
659
772
|
|
|
660
773
|
// 更新表单数据
|
|
661
774
|
updateFieldValue(dateTimePopup.value.field.field, dateTimeStr)
|
|
775
|
+
|
|
776
|
+
// 触发modelValue更新
|
|
777
|
+
emit('update:modelValue', snapshot())
|
|
662
778
|
}
|
|
663
779
|
|
|
664
780
|
// 关闭弹窗
|