af-mobile-client-vue3 1.1.32 → 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 CHANGED
@@ -1,100 +1,111 @@
1
- {
2
- "name": "af-mobile-client-vue3",
3
- "type": "module",
4
- "version": "1.1.32",
5
- "description": "Vue + Vite component lib",
6
- "license": "MIT",
7
- "engines": {
8
- "node": ">=18.12.0",
9
- "pnpm": ">=8.15.0"
10
- },
11
- "dependencies": {
12
- "@micro-zoe/micro-app": "1.0.0-rc.24",
13
- "@vant/area-data": "^2.0.0",
14
- "@unhead/vue": "^2.0.5",
15
- "@vant/touch-emulator": "^1.4.0",
16
- "@vant/use": "^1.6.0",
17
- "@vueuse/core": "^13.1.0",
18
- "@iconify/vue": "4.3.0",
19
- "animate.css": "^4.1.1",
20
- "axios": "^1.8.4",
21
- "crypto-js": "^4.2.0",
22
- "echarts": "^5.6.0",
23
- "lodash-es": "^4.17.21",
24
- "nprogress": "^0.2.0",
25
- "ol": "^10.5.0",
26
- "pinia": "^3.0.2",
27
- "pinia-plugin-persistedstate": "^4.2.0",
28
- "qs": "^6.14.0",
29
- "resize-detector": "^0.3.0",
30
- "store": "^2.0.12",
31
- "vant": "^4.9.18",
32
- "vconsole": "^3.15.1",
33
- "vue": "^3.5.13",
34
- "vue-router": "^4.5.0"
35
- },
36
- "devDependencies": {
37
- "@antfu/eslint-config": "^4.12.0",
38
- "@iconify/json": "2.2.318",
39
- "@types/crypto-js": "^4.2.2",
40
- "@types/lodash-es": "^4.17.12",
41
- "@types/node": "^22.14.1",
42
- "@types/nprogress": "^0.2.3",
43
- "@types/store": "^2.0.5",
44
- "@unocss/eslint-plugin": "^66.1.0-beta.11",
45
- "@unocss/preset-rem-to-px": "66.1.0-beta.11",
46
- "@vitejs/plugin-legacy": "^6.0.2",
47
- "@vitejs/plugin-vue": "^5.2.3",
48
- "autoprefixer": "^10.4.21",
49
- "bumpp": "^10.1.0",
50
- "commitizen": "^4.3.1",
51
- "consola": "^3.4.2",
52
- "cross-env": "^7.0.3",
53
- "cz-emoji-chinese": "^0.3.1",
54
- "eslint": "^9.24.0",
55
- "eslint-ts-patch": "^8.57.0-0",
56
- "husky": "^9.1.7",
57
- "less": "^4.3.0",
58
- "mockjs": "^1.1.0",
59
- "postcss-mobile-forever": "^5.0.0",
60
- "rollup": "^4.40.0",
61
- "terser": "^5.39.0",
62
- "typescript": "^5.8.3",
63
- "unocss": "^66.1.0-beta.11",
64
- "unplugin-auto-import": "^19.1.2",
65
- "unplugin-vue-components": "^28.4.1",
66
- "unplugin-vue-router": "^0.12.0",
67
- "vite": "^6.2.6",
68
- "vite-plugin-compression": "^0.5.1",
69
- "vite-plugin-mock-dev-server": "^1.8.5",
70
- "vite-plugin-pwa": "^1.0.0",
71
- "vite-plugin-sitemap": "^0.7.1",
72
- "vite-plugin-svg-icons": "^2.0.1",
73
- "vite-plugin-vconsole": "^2.1.1",
74
- "vite-plugin-vue-devtools": "^7.7.2",
75
- "vite-plugin-vue-layouts": "^0.11.0",
76
- "vitest": "^3.1.1",
77
- "vue-tsc": "^2.2.8"
78
- },
79
- "config": {
80
- "commitizen": {
81
- "path": "./node_modules/cz-emoji-chinese"
82
- },
83
- "cz-emoji-chinese": {
84
- "skipQuestions": [
85
- "body",
86
- "scope"
87
- ]
88
- }
89
- },
90
- "scripts": {
91
- "dev": "cross-env MOCK_SERVER_PORT=8086 vite",
92
- "build": "vue-tsc --noEmit && vite build",
93
- "build:dev": "vue-tsc --noEmit && vite build --mode=development",
94
- "preview": "vite preview",
95
- "lint": "eslint . && vue-tsc --noEmit",
96
- "lint:fix": "eslint . --fix",
97
- "test": "vitest",
98
- "release": "bumpp --commit --push --tag"
99
- }
100
- }
1
+ {
2
+ "name": "af-mobile-client-vue3",
3
+ "type": "module",
4
+ "version": "1.1.33",
5
+ "description": "Vue + Vite component lib",
6
+ "license": "MIT",
7
+ "engines": {
8
+ "node": ">=18.12.0",
9
+ "pnpm": ">=8.15.0"
10
+ },
11
+ "scripts": {
12
+ "dev": "cross-env MOCK_SERVER_PORT=8086 vite",
13
+ "build": "vue-tsc --noEmit && vite build",
14
+ "build:dev": "vue-tsc --noEmit && vite build --mode=development",
15
+ "preview": "vite preview",
16
+ "lint": "eslint . && vue-tsc --noEmit",
17
+ "lint:fix": "eslint . --fix",
18
+ "test": "vitest",
19
+ "release": "bumpp --commit --push --tag"
20
+ },
21
+ "dependencies": {
22
+ "@micro-zoe/micro-app": "1.0.0-rc.24",
23
+ "@vant/area-data": "^2.0.0",
24
+ "@unhead/vue": "^2.0.5",
25
+ "@vant/touch-emulator": "^1.4.0",
26
+ "@vant/use": "^1.6.0",
27
+ "@vueuse/core": "^13.1.0",
28
+ "@iconify/vue": "4.3.0",
29
+ "animate.css": "^4.1.1",
30
+ "axios": "^1.8.4",
31
+ "crypto-js": "^4.2.0",
32
+ "echarts": "^5.6.0",
33
+ "lodash-es": "^4.17.21",
34
+ "nprogress": "^0.2.0",
35
+ "ol": "^10.5.0",
36
+ "pinia": "^3.0.2",
37
+ "pinia-plugin-persistedstate": "^4.2.0",
38
+ "qs": "^6.14.0",
39
+ "resize-detector": "^0.3.0",
40
+ "store": "^2.0.12",
41
+ "vant": "^4.9.18",
42
+ "vconsole": "^3.15.1",
43
+ "vue": "^3.5.13",
44
+ "vue-router": "^4.5.0"
45
+ },
46
+ "devDependencies": {
47
+ "@antfu/eslint-config": "^4.12.0",
48
+ "@iconify/json": "2.2.318",
49
+ "@types/crypto-js": "^4.2.2",
50
+ "@types/lodash-es": "^4.17.12",
51
+ "@types/node": "^22.14.1",
52
+ "@types/nprogress": "^0.2.3",
53
+ "@types/store": "^2.0.5",
54
+ "@unocss/eslint-plugin": "^66.1.0-beta.11",
55
+ "@unocss/preset-rem-to-px": "66.1.0-beta.11",
56
+ "@vitejs/plugin-legacy": "^6.0.2",
57
+ "@vitejs/plugin-vue": "^5.2.3",
58
+ "autoprefixer": "^10.4.21",
59
+ "bumpp": "^10.1.0",
60
+ "commitizen": "^4.3.1",
61
+ "consola": "^3.4.2",
62
+ "cross-env": "^7.0.3",
63
+ "cz-emoji-chinese": "^0.3.1",
64
+ "eslint": "^9.24.0",
65
+ "eslint-ts-patch": "^8.57.0-0",
66
+ "husky": "^9.1.7",
67
+ "less": "^4.3.0",
68
+ "mockjs": "^1.1.0",
69
+ "postcss-mobile-forever": "^5.0.0",
70
+ "rollup": "^4.40.0",
71
+ "terser": "^5.39.0",
72
+ "typescript": "^5.8.3",
73
+ "unocss": "^66.1.0-beta.11",
74
+ "unplugin-auto-import": "^19.1.2",
75
+ "unplugin-vue-components": "^28.4.1",
76
+ "unplugin-vue-router": "^0.12.0",
77
+ "vite": "^6.2.6",
78
+ "vite-plugin-compression": "^0.5.1",
79
+ "vite-plugin-mock-dev-server": "^1.8.5",
80
+ "vite-plugin-pwa": "^1.0.0",
81
+ "vite-plugin-sitemap": "^0.7.1",
82
+ "vite-plugin-svg-icons": "^2.0.1",
83
+ "vite-plugin-vconsole": "^2.1.1",
84
+ "vite-plugin-vue-devtools": "^7.7.2",
85
+ "vite-plugin-vue-layouts": "^0.11.0",
86
+ "vitest": "^3.1.1",
87
+ "vue-tsc": "^2.2.8"
88
+ },
89
+ "pnpm": {
90
+ "peerDependencyRules": {
91
+ "ignoreMissing": [
92
+ "postcss",
93
+ "esbuild"
94
+ ],
95
+ "allowedVersions": {
96
+ "rollup": "^4.x"
97
+ }
98
+ }
99
+ },
100
+ "config": {
101
+ "commitizen": {
102
+ "path": "./node_modules/cz-emoji-chinese"
103
+ },
104
+ "cz-emoji-chinese": {
105
+ "skipQuestions": [
106
+ "body",
107
+ "scope"
108
+ ]
109
+ }
110
+ }
111
+ }
@@ -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
- console.log('>>>> 拍照 后 上传', result)
34
- if (result.status === 'success') {
35
- handlePhotoUpload(result.data)
36
- }
37
- },
38
- })
39
- }
40
-
41
- // 处理拍照后的上传
42
- function handlePhotoUpload(photoData: any) {
43
- const formData = new FormData()
44
- formData.append('resUploadMode', props.uploadMode)
45
- formData.append('pathKey', 'Default')
46
- formData.append('formType', 'image')
47
- formData.append('useType', 'Default')
48
- formData.append('resUploadStock', '1')
49
- formData.append('filename', photoData.name)
50
- formData.append('filesize', (photoData.size / 1024 / 1024).toFixed(4))
51
- formData.append('f_operator', 'server')
52
- formData.append('imgPath', photoData.filePath)
53
- formData.append('urlPath', '/api/af-revenue/resource/upload')
54
-
55
- // 添加临时预览
56
- const tempFile = {
57
- uid: Date.now() + Math.random().toString(36).substr(2, 5),
58
- name: photoData.name,
59
- status: 'uploading',
60
- message: '上传中...',
61
- url: `data:image/png;base64,${photoData.content}`,
62
- }
63
-
64
- if (!imageList.value) {
65
- imageList.value = [tempFile]
66
- }
67
- else {
68
- imageList.value.push(tempFile)
69
- }
70
-
71
- const param = {
72
- resUploadMode: props.uploadMode,
73
- pathKey: 'Default',
74
- formType: 'image',
75
- useType: 'Default',
76
- resUploadStock: '1',
77
- filename: photoData.name,
78
- filesize: photoData.size,
79
- f_operator: 'server',
80
- imgPath: photoData.filePath,
81
- urlPath: '/api/af-revenue/resource/upload',
82
- }
83
- console.log('>>>> 上传 param: ', JSON.stringify(param))
84
- // 上传到服务器
85
- mobileUtil.execute({
86
- funcName: 'uploadResource',
87
- param,
88
- callbackFunc: (result: any) => {
89
- console.log('>>>> 上传结果: ', result)
90
- if (result.status === 'success') {
91
- const index = imageList.value.findIndex(item => item.uid === tempFile.uid)
92
- if (index !== -1) {
93
- imageList.value[index].uid = result.data.id
94
- imageList.value[index].id = result.data.id
95
- delete imageList.value[index].message
96
- imageList.value[index].status = 'done'
97
- imageList.value[index].url = result.data.f_downloadpath
98
- }
99
- }
100
- else {
101
- const index = imageList.value.findIndex(item => item.uid === tempFile.uid)
102
- if (index !== -1) {
103
- imageList.value[index].status = 'failed'
104
- imageList.value[index].message = '上传失败'
105
- }
106
- }
107
-
108
- if (props.outerIndex !== undefined)
109
- emit('updateFileList', imageList.value.filter(item => item.status === 'done'), props.outerIndex)
110
- else
111
- emit('updateFileList', imageList.value.filter(item => item.status === 'done'))
112
- },
113
- })
114
- }
115
-
116
- // 删除图片
117
- function deleteFileFunction(file: any) {
118
- if (file.id) {
119
- deleteFile({ ids: [file.id], f_state: '删除' }).then((res: any) => {
120
- if (res.msg !== undefined) {
121
- const targetIndex = imageList.value.findIndex(item => item.id === file.id)
122
- if (targetIndex !== -1) {
123
- imageList.value.splice(targetIndex, 1)
124
- if (props.outerIndex !== undefined)
125
- emit('updateFileList', imageList.value.filter(item => item.status === 'done'), props.outerIndex)
126
- else
127
- emit('updateFileList', imageList.value.filter(item => item.status === 'done'))
128
- }
129
- }
130
- })
131
- }
132
- }
133
- </script>
134
-
135
- <template>
136
- <div class="uploader-container">
137
- <van-button
138
- v-if="props.attr?.addOrEdit !== 'readonly'"
139
- icon="photograph"
140
- type="primary"
141
- @click="triggerCamera"
142
- >
143
- 拍照
144
- </van-button>
145
-
146
- <van-uploader
147
- v-model="imageList"
148
- :show-upload="false"
149
- :deletable="props.attr?.addOrEdit !== 'readonly' && props.authority === 'admin'"
150
- :multiple="props.authority === 'admin'"
151
- :preview-image="true"
152
- :before-delete="props.attr?.addOrEdit !== 'readonly' && props.authority === 'admin' ? deleteFileFunction : undefined"
153
- />
154
- </div>
155
- </template>
156
-
157
- <style scoped lang="less">
158
- .uploader-container {
159
- display: flex;
160
- flex-direction: column;
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>