af-mobile-client-vue3 1.1.31 → 1.1.33
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 +1 -1
- package/src/components/core/ImageUploader/index.vue +160 -163
- package/src/components/data/XCellList/index.vue +9 -1
- package/src/components/data/XOlMap/utils/wgs84ToGcj02.js +154 -154
- package/src/stores/modules/user.ts +20 -8
- package/src/utils/indexedDB.ts +15 -0
- package/src/utils/queryFormDefaultRangePicker.ts +57 -57
- package/src/views/component/XCellListView/index.vue +19 -57
- package/src/views/component/XFormGroupView/index.vue +2 -42
- package/src/views/component/XFormView/index.vue +27 -120
- package/src/views/component/XFormView/oldindex.vue +133 -0
- package/src/views/component/XOlMapView/XLocationPicker/index.vue +118 -118
package/package.json
CHANGED
|
@@ -1,163 +1,160 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { deleteFile } from '@af-mobile-client-vue3/services/api/common'
|
|
3
|
-
import { mobileUtil } from '@af-mobile-client-vue3/utils/mobileUtil'
|
|
4
|
-
import {
|
|
5
|
-
Button as vanButton,
|
|
6
|
-
Uploader as vanUploader,
|
|
7
|
-
} from 'vant'
|
|
8
|
-
import { ref, watch } from 'vue'
|
|
9
|
-
|
|
10
|
-
const props = defineProps({
|
|
11
|
-
imageList: Array<any>,
|
|
12
|
-
outerIndex: { default: undefined },
|
|
13
|
-
authority: { default: 'user' },
|
|
14
|
-
uploadMode: { default: 'server' },
|
|
15
|
-
attr: { type: Object as () => { addOrEdit?: string }, default: () => ({}) },
|
|
16
|
-
})
|
|
17
|
-
const emit = defineEmits(['updateFileList'])
|
|
18
|
-
|
|
19
|
-
const imageList = ref<Array<any>>(props.imageList ?? [])
|
|
20
|
-
|
|
21
|
-
// 同步 props.imageList 到内部 imageList,保证每次变化都响应
|
|
22
|
-
watch(() => props.imageList, (newVal) => {
|
|
23
|
-
imageList.value = Array.isArray(newVal) ? [...newVal] : []
|
|
24
|
-
}, { immediate: true })
|
|
25
|
-
|
|
26
|
-
// 触发拍照
|
|
27
|
-
function triggerCamera() {
|
|
28
|
-
console.log('>>>> uploader 上传111')
|
|
29
|
-
mobileUtil.execute({
|
|
30
|
-
funcName: 'takePicture',
|
|
31
|
-
param: {},
|
|
32
|
-
callbackFunc: (result: any) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
formData.append('
|
|
45
|
-
formData.append('
|
|
46
|
-
formData.append('
|
|
47
|
-
formData.append('
|
|
48
|
-
formData.append('
|
|
49
|
-
formData.append('
|
|
50
|
-
formData.append('
|
|
51
|
-
formData.append('
|
|
52
|
-
formData.append('
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
imageList.value[index].
|
|
94
|
-
imageList.value[index].
|
|
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
|
-
gap: 16px;
|
|
162
|
-
}
|
|
163
|
-
</style>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { deleteFile } from '@af-mobile-client-vue3/services/api/common'
|
|
3
|
+
import { mobileUtil } from '@af-mobile-client-vue3/utils/mobileUtil'
|
|
4
|
+
import {
|
|
5
|
+
Button as vanButton,
|
|
6
|
+
Uploader as vanUploader,
|
|
7
|
+
} from 'vant'
|
|
8
|
+
import { ref, watch } from 'vue'
|
|
9
|
+
|
|
10
|
+
const props = defineProps({
|
|
11
|
+
imageList: Array<any>,
|
|
12
|
+
outerIndex: { default: undefined },
|
|
13
|
+
authority: { default: 'user' },
|
|
14
|
+
uploadMode: { default: 'server' },
|
|
15
|
+
attr: { type: Object as () => { addOrEdit?: string }, default: () => ({}) },
|
|
16
|
+
})
|
|
17
|
+
const emit = defineEmits(['updateFileList'])
|
|
18
|
+
|
|
19
|
+
const imageList = ref<Array<any>>(props.imageList ?? [])
|
|
20
|
+
|
|
21
|
+
// 同步 props.imageList 到内部 imageList,保证每次变化都响应
|
|
22
|
+
watch(() => props.imageList, (newVal) => {
|
|
23
|
+
imageList.value = Array.isArray(newVal) ? [...newVal] : []
|
|
24
|
+
}, { immediate: true })
|
|
25
|
+
|
|
26
|
+
// 触发拍照
|
|
27
|
+
function triggerCamera() {
|
|
28
|
+
console.log('>>>> uploader 上传111')
|
|
29
|
+
mobileUtil.execute({
|
|
30
|
+
funcName: 'takePicture',
|
|
31
|
+
param: {},
|
|
32
|
+
callbackFunc: (result: any) => {
|
|
33
|
+
if (result.status === 'success') {
|
|
34
|
+
handlePhotoUpload(result.data)
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// 处理拍照后的上传
|
|
41
|
+
function handlePhotoUpload(photoData: any) {
|
|
42
|
+
const formData = new FormData()
|
|
43
|
+
formData.append('resUploadMode', props.uploadMode)
|
|
44
|
+
formData.append('pathKey', 'Default')
|
|
45
|
+
formData.append('formType', 'image')
|
|
46
|
+
formData.append('useType', 'Default')
|
|
47
|
+
formData.append('resUploadStock', '1')
|
|
48
|
+
formData.append('filename', photoData.name)
|
|
49
|
+
formData.append('filesize', (photoData.size / 1024 / 1024).toFixed(4))
|
|
50
|
+
formData.append('f_operator', 'server')
|
|
51
|
+
formData.append('imgPath', photoData.filePath)
|
|
52
|
+
formData.append('urlPath', `/api/${import.meta.env.VITE_APP_SYSTEM_NAME}/resource/upload`)
|
|
53
|
+
|
|
54
|
+
// 添加临时预览
|
|
55
|
+
const tempFile = {
|
|
56
|
+
uid: Date.now() + Math.random().toString(36).substr(2, 5),
|
|
57
|
+
name: photoData.name,
|
|
58
|
+
status: 'uploading',
|
|
59
|
+
message: '上传中...',
|
|
60
|
+
url: `data:image/png;base64,${photoData.content}`,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!imageList.value) {
|
|
64
|
+
imageList.value = [tempFile]
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
imageList.value.push(tempFile)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const param = {
|
|
71
|
+
resUploadMode: props.uploadMode,
|
|
72
|
+
pathKey: 'Default',
|
|
73
|
+
formType: 'image',
|
|
74
|
+
useType: 'Default',
|
|
75
|
+
resUploadStock: '1',
|
|
76
|
+
filename: photoData.name,
|
|
77
|
+
filesize: photoData.size,
|
|
78
|
+
f_operator: 'server',
|
|
79
|
+
imgPath: photoData.filePath,
|
|
80
|
+
urlPath: `/api/${import.meta.env.VITE_APP_SYSTEM_NAME}/resource/upload`,
|
|
81
|
+
}
|
|
82
|
+
// 上传到服务器
|
|
83
|
+
mobileUtil.execute({
|
|
84
|
+
funcName: 'uploadResource',
|
|
85
|
+
param,
|
|
86
|
+
callbackFunc: (result: any) => {
|
|
87
|
+
if (result.status === 'success') {
|
|
88
|
+
const index = imageList.value.findIndex(item => item.uid === tempFile.uid)
|
|
89
|
+
if (index !== -1) {
|
|
90
|
+
imageList.value[index].uid = result.data.id
|
|
91
|
+
imageList.value[index].id = result.data.id
|
|
92
|
+
delete imageList.value[index].message
|
|
93
|
+
imageList.value[index].status = 'done'
|
|
94
|
+
imageList.value[index].url = result.data.f_downloadpath
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const index = imageList.value.findIndex(item => item.uid === tempFile.uid)
|
|
99
|
+
if (index !== -1) {
|
|
100
|
+
imageList.value[index].status = 'failed'
|
|
101
|
+
imageList.value[index].message = '上传失败'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (props.outerIndex !== undefined)
|
|
106
|
+
emit('updateFileList', imageList.value.filter(item => item.status === 'done'), props.outerIndex)
|
|
107
|
+
else
|
|
108
|
+
emit('updateFileList', imageList.value.filter(item => item.status === 'done'))
|
|
109
|
+
},
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 删除图片
|
|
114
|
+
function deleteFileFunction(file: any) {
|
|
115
|
+
if (file.id) {
|
|
116
|
+
deleteFile({ ids: [file.id], f_state: '删除' }).then((res: any) => {
|
|
117
|
+
if (res.msg !== undefined) {
|
|
118
|
+
const targetIndex = imageList.value.findIndex(item => item.id === file.id)
|
|
119
|
+
if (targetIndex !== -1) {
|
|
120
|
+
imageList.value.splice(targetIndex, 1)
|
|
121
|
+
if (props.outerIndex !== undefined)
|
|
122
|
+
emit('updateFileList', imageList.value.filter(item => item.status === 'done'), props.outerIndex)
|
|
123
|
+
else
|
|
124
|
+
emit('updateFileList', imageList.value.filter(item => item.status === 'done'))
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<template>
|
|
133
|
+
<div class="uploader-container">
|
|
134
|
+
<van-button
|
|
135
|
+
v-if="props.attr?.addOrEdit !== 'readonly'"
|
|
136
|
+
icon="photograph"
|
|
137
|
+
type="primary"
|
|
138
|
+
@click="triggerCamera"
|
|
139
|
+
>
|
|
140
|
+
拍照
|
|
141
|
+
</van-button>
|
|
142
|
+
|
|
143
|
+
<van-uploader
|
|
144
|
+
v-model="imageList"
|
|
145
|
+
:show-upload="false"
|
|
146
|
+
:deletable="props.attr?.addOrEdit !== 'readonly' && props.authority === 'admin'"
|
|
147
|
+
:multiple="props.authority === 'admin'"
|
|
148
|
+
:preview-image="true"
|
|
149
|
+
:before-delete="props.attr?.addOrEdit !== 'readonly' && props.authority === 'admin' ? deleteFileFunction : undefined"
|
|
150
|
+
/>
|
|
151
|
+
</div>
|
|
152
|
+
</template>
|
|
153
|
+
|
|
154
|
+
<style scoped lang="less">
|
|
155
|
+
.uploader-container {
|
|
156
|
+
display: flex;
|
|
157
|
+
flex-direction: column;
|
|
158
|
+
gap: 16px;
|
|
159
|
+
}
|
|
160
|
+
</style>
|
|
@@ -512,6 +512,14 @@ defineExpose({
|
|
|
512
512
|
<template>
|
|
513
513
|
<div id="XCellList">
|
|
514
514
|
<VanRow class="filter-condition">
|
|
515
|
+
<!-- 左侧动态插槽区域 -->
|
|
516
|
+
<template v-for="(_, name) in slots" :key="name">
|
|
517
|
+
<template v-if="typeof name === 'string' && name.startsWith('search-left-')">
|
|
518
|
+
<div class="filter-icon-box">
|
|
519
|
+
<slot :name="name" />
|
|
520
|
+
</div>
|
|
521
|
+
</template>
|
|
522
|
+
</template>
|
|
515
523
|
<VanCol class="search-col">
|
|
516
524
|
<VanSearch
|
|
517
525
|
v-model="searchValue"
|
|
@@ -522,7 +530,7 @@ defineExpose({
|
|
|
522
530
|
@search="onRefresh"
|
|
523
531
|
/>
|
|
524
532
|
</VanCol>
|
|
525
|
-
<!--
|
|
533
|
+
<!-- 右侧动态插槽区域 -->
|
|
526
534
|
<template v-for="(_, name) in slots" :key="name">
|
|
527
535
|
<template v-if="typeof name === 'string' && name.startsWith('search-right-')">
|
|
528
536
|
<div class="filter-icon-box">
|