af-mobile-client-vue3 1.0.95 → 1.0.96

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.
Files changed (113) hide show
  1. package/.env +6 -6
  2. package/.env.development +4 -4
  3. package/.env.envoiceShow +6 -6
  4. package/.env.production +6 -6
  5. package/.husky/commit-msg +1 -1
  6. package/.husky/pre-commit +1 -1
  7. package/.vscode/settings.json +61 -61
  8. package/build/vite/index.ts +91 -91
  9. package/eslint.config.js +9 -1
  10. package/mock/modules/user.mock.ts +152 -152
  11. package/package.json +1 -1
  12. package/public/favicon.svg +4 -4
  13. package/public/safari-pinned-tab.svg +32 -32
  14. package/scripts/verifyCommit.js +19 -19
  15. package/src/App.vue +43 -43
  16. package/src/api/user/index.ts +40 -40
  17. package/src/bootstrap.ts +18 -18
  18. package/src/components/core/App/MicroAppView.vue +3 -3
  19. package/src/components/core/NavBar/index.vue +12 -12
  20. package/src/components/core/SvgIcon/index.vue +1 -1
  21. package/src/components/core/Tabbar/index.vue +38 -38
  22. package/src/components/core/Uploader/index.vue +1 -1
  23. package/src/components/core/XGridDropOption/index.vue +151 -151
  24. package/src/components/core/XMultiSelect/index.vue +183 -183
  25. package/src/components/data/XCellDetail/index.vue +106 -106
  26. package/src/components/data/XCellList/XCellList.md +28 -28
  27. package/src/components/data/XCellList/index.vue +50 -11
  28. package/src/components/data/XCellListFilter/QrScanner/index.vue +1 -1
  29. package/src/components/data/XCellListFilter/VpnRecognition/index.vue +3 -3
  30. package/src/components/data/XCellListFilter/index.vue +160 -62
  31. package/src/components/data/XForm/index.vue +2 -2
  32. package/src/components/data/XFormGroup/index.vue +3 -3
  33. package/src/components/data/XFormItem/index.vue +25 -26
  34. package/src/components/data/XOlMap/demo.vue +209 -0
  35. package/src/components/data/XOlMap/index.vue +644 -0
  36. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -220
  37. package/src/components/data/XReportForm/index.vue +1079 -1079
  38. package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +4 -7
  39. package/src/components/data/XReportGrid/XAddReport/index.md +3 -7
  40. package/src/components/data/XReportGrid/XAddReport/index.ts +2 -2
  41. package/src/components/data/XReportGrid/XReport.vue +25 -38
  42. package/src/components/data/XReportGrid/XReportDesign.vue +46 -46
  43. package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +3 -3
  44. package/src/components/data/XReportGrid/XReportDrawer/index.ts +2 -2
  45. package/src/components/data/XReportGrid/XReportJsonRender.vue +20 -7
  46. package/src/components/data/XReportGrid/XReportTrGroup.vue +4 -4
  47. package/src/components/data/XReportGrid/index.md +4 -6
  48. package/src/components/data/XSignature/index.vue +285 -285
  49. package/src/components/data/XTag/index.vue +10 -10
  50. package/src/components/layout/NormalDataLayout/index.vue +70 -70
  51. package/src/components/layout/TabBarLayout/index.vue +40 -40
  52. package/src/components.d.ts +53 -53
  53. package/src/env.d.ts +16 -16
  54. package/src/font-style/font.css +3 -3
  55. package/src/hooks/useCommon.ts +9 -9
  56. package/src/layout/GridView/index.vue +1 -1
  57. package/src/layout/PageLayout.vue +4 -4
  58. package/src/layout/SingleLayout.vue +2 -2
  59. package/src/locales/en-US.json +25 -25
  60. package/src/locales/zh-CN.json +25 -25
  61. package/src/plugins/AppData.ts +38 -38
  62. package/src/plugins/index.ts +1 -1
  63. package/src/router/guards.ts +59 -59
  64. package/src/router/index.ts +61 -60
  65. package/src/router/invoiceRoutes.ts +33 -33
  66. package/src/router/routes.ts +20 -14
  67. package/src/services/api/common.ts +109 -109
  68. package/src/services/api/manage.ts +8 -8
  69. package/src/services/restTools.ts +52 -52
  70. package/src/services/v3Api.ts +46 -35
  71. package/src/stores/modules/cachedView.ts +1 -1
  72. package/src/stores/modules/setting.ts +52 -52
  73. package/src/stores/modules/user.ts +5 -5
  74. package/src/stores/mutation-type.ts +7 -7
  75. package/src/styles/app.less +6 -1
  76. package/src/utils/Storage.ts +1 -1
  77. package/src/utils/authority-utils.ts +84 -84
  78. package/src/utils/crypto.ts +39 -39
  79. package/src/utils/http/index.ts +6 -6
  80. package/src/utils/i18n.ts +41 -41
  81. package/src/utils/indexedDB.ts +180 -180
  82. package/src/utils/mobileUtil.ts +26 -26
  83. package/src/utils/routerUtil.ts +271 -271
  84. package/src/utils/runEvalFunction.ts +13 -13
  85. package/src/utils/validate.ts +1 -1
  86. package/src/utils/wechatUtil.ts +9 -9
  87. package/src/views/chat/index.vue +1 -1
  88. package/src/views/common/LoadError.vue +64 -64
  89. package/src/views/common/NotFound.vue +68 -68
  90. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  91. package/src/views/component/XCellDetailView/index.vue +217 -216
  92. package/src/views/component/XCellListView/index.vue +1 -1
  93. package/src/views/component/XFormAppraiseView/index.vue +4 -4
  94. package/src/views/component/XFormGroupView/index.vue +1 -1
  95. package/src/views/component/XFormView/index.vue +6 -7
  96. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  97. package/src/views/component/XReportFormView/index.vue +13 -13
  98. package/src/views/component/XReportGridView/index.vue +2 -3
  99. package/src/views/component/XSignatureView/index.vue +50 -50
  100. package/src/views/component/index.vue +4 -4
  101. package/src/views/component/menu.vue +117 -117
  102. package/src/views/component/notice.vue +46 -46
  103. package/src/views/component/topNav.vue +36 -36
  104. package/src/views/invoiceShow/index.vue +61 -62
  105. package/src/views/user/login/ForgetPasswordForm.vue +94 -93
  106. package/src/views/user/login/LoginForm.vue +8 -7
  107. package/src/views/user/login/LoginTitle.vue +68 -68
  108. package/src/views/user/login/index.vue +22 -22
  109. package/src/views/user/my/index.vue +230 -230
  110. package/src/vue-router.d.ts +9 -9
  111. package/tsconfig.json +43 -43
  112. package/uno.config.ts +1 -1
  113. package/vite.config.ts +123 -123
@@ -1,8 +1,21 @@
1
1
  <script setup lang="ts">
2
+ import type { Numeric } from 'vant/es/utils'
3
+ import Uploader from '@af-mobile-client-vue3/components/core/Uploader/index.vue'
4
+ import XGridDropOption from '@af-mobile-client-vue3/components/core/XGridDropOption/index.vue'
5
+ import XMultiSelect from '@af-mobile-client-vue3/components/core/XMultiSelect/index.vue'
6
+ import XSelect from '@af-mobile-client-vue3/components/core/XSelect/index.vue'
7
+ import { runLogic } from '@af-mobile-client-vue3/services/api/common'
8
+ import { searchToListOption, searchToOption } from '@af-mobile-client-vue3/services/v3Api'
9
+ import { useUserStore } from '@af-mobile-client-vue3/stores/modules/user'
10
+ import { getDict } from '@af-mobile-client-vue3/utils/dictUtil'
11
+ import { executeStrFunctionByContext } from '@af-mobile-client-vue3/utils/runEvalFunction'
12
+ import { areaList } from '@vant/area-data'
13
+ import { debounce } from 'lodash-es'
2
14
  import {
3
15
  Area as VanArea,
4
16
  Calendar as VanCalendar,
5
17
  Checkbox as VanCheckbox,
18
+ CheckboxGroup as vanCheckboxGroup,
6
19
  DatePicker as VanDatePicker,
7
20
  Field as VanField,
8
21
  Picker as VanPicker,
@@ -15,21 +28,8 @@ import {
15
28
  Stepper as VanStepper,
16
29
  Switch as VanSwitch,
17
30
  TimePicker as VanTimePicker,
18
- CheckboxGroup as vanCheckboxGroup,
19
31
  } from 'vant'
20
32
  import { computed, defineEmits, defineProps, getCurrentInstance, onBeforeMount, ref, watch } from 'vue'
21
- import { areaList } from '@vant/area-data'
22
- import { runLogic } from '@af-mobile-client-vue3/services/api/common'
23
- import Uploader from '@af-mobile-client-vue3/components/core/Uploader/index.vue'
24
- import XSelect from '@af-mobile-client-vue3/components/core/XSelect/index.vue'
25
- import XMultiSelect from '@af-mobile-client-vue3/components/core/XMultiSelect/index.vue'
26
- import XGridDropOption from '@af-mobile-client-vue3/components/core/XGridDropOption/index.vue'
27
- import type { Numeric } from 'vant/es/utils'
28
- import { getDict } from '@af-mobile-client-vue3/utils/dictUtil'
29
- import { executeStrFunctionByContext } from '@af-mobile-client-vue3/utils/runEvalFunction'
30
- import { useUserStore } from '@af-mobile-client-vue3/stores/modules/user'
31
- import { debounce } from 'lodash-es'
32
- import { searchToListOption, searchToOption } from '@af-mobile-client-vue3/services/v3Api'
33
33
 
34
34
  const props = defineProps({
35
35
  attr: {
@@ -87,8 +87,8 @@ const props = defineProps({
87
87
 
88
88
  const emits = defineEmits(['update:modelValue'])
89
89
  // 判断并初始化防抖函数
90
- let debouncedUserLinkFunc: Function | null = null
91
- let debouncedDepLinkFunc: Function | null = null
90
+ let debouncedUserLinkFunc: (() => void) | null = null
91
+ let debouncedDepLinkFunc: (() => void) | null = null
92
92
 
93
93
  const { attr, form, mode, serviceName, getDataParams, columnsField } = props
94
94
  const calendarShow = ref(false)
@@ -237,7 +237,7 @@ function formTypeCheck(attr, value) {
237
237
  }
238
238
  break
239
239
  case 'number':
240
- if (!/^[+-]?(\d+(\.\d*)?|\.\d+)$/.test(value)) {
240
+ if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value)) {
241
241
  errorMessage.value = `${attr.name}必须为数字`
242
242
  return
243
243
  }
@@ -263,13 +263,13 @@ function formTypeCheck(attr, value) {
263
263
  }
264
264
  break
265
265
  case 'email':
266
- if (!/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value)) {
266
+ if (!/^[\w.%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i.test(value)) {
267
267
  errorMessage.value = `请输入正确的邮箱地址`
268
268
  return
269
269
  }
270
270
  break
271
271
  case 'idNumber':
272
- if (!/^(^\d{15}$|^\d{17}([0-9]|X)$)$/.test(value)) {
272
+ if (!/^(?:\d{15}|\d{17}[0-9X])$/.test(value)) {
273
273
  errorMessage.value = `请输入正确的身份证号码`
274
274
  return
275
275
  }
@@ -281,13 +281,13 @@ function formTypeCheck(attr, value) {
281
281
  }
282
282
  break
283
283
  case 'landlineNumber':
284
- if (!/^(0\d{2,3}[-\s]?)\d{7,8}$/.test(value)) {
284
+ if (!/^0\d{2,3}[-\s]?\d{7,8}$/.test(value)) {
285
285
  errorMessage.value = `请输入正确的座机号码`
286
286
  return
287
287
  }
288
288
  break
289
289
  case 'greaterThanZero':
290
- if (!/^(?:[1-9]\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(value)) {
290
+ if (!/^(?:[1-9]\d*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(value)) {
291
291
  errorMessage.value = `请输入一个大于0的数字`
292
292
  return
293
293
  }
@@ -312,7 +312,7 @@ function formTypeCheck(attr, value) {
312
312
  const status = ref(true)
313
313
  // 提取函数体部分
314
314
  // eslint-disable-next-line no-case-declarations
315
- const funcBodyMatch = funcStr.match(/function\s*\(.*?\)\s*{([\s\S]*)}/)
315
+ const funcBodyMatch = funcStr.match(/function\s*\(.*?\)\s*\{([\s\S]*)\}/)
316
316
  if (!funcBodyMatch)
317
317
  throw new Error('自定义校验函数不合法')
318
318
  // eslint-disable-next-line no-case-declarations
@@ -624,7 +624,7 @@ function onPickerCancel() {
624
624
  name="checkboxGroup"
625
625
  :label="labelData"
626
626
  :label-align="labelAlign"
627
- :input-align="attr.inputAlign ? attr.inputAlign : 'left'"
627
+ :input-align="attr.inputAlign ? attr.inputAlign : 'left'"
628
628
  :rules="[{ required: attr.rule.required === 'true', message: `请选择${attr.name}` }]"
629
629
  >
630
630
  <template #input>
@@ -713,7 +713,7 @@ function onPickerCancel() {
713
713
  :rules="[{ required: attr.rule.required === 'true', message: '请选择' }]"
714
714
  >
715
715
  <template #input>
716
- <VanStepper :disabled="readonly" v-model="(localValue as string)" />
716
+ <VanStepper v-model="(localValue as string)" :disabled="readonly" />
717
717
  </template>
718
718
  </VanField>
719
719
 
@@ -727,7 +727,7 @@ function onPickerCancel() {
727
727
  :rules="[{ required: attr.rule.required === 'true', message: '请选择' }]"
728
728
  >
729
729
  <template #input>
730
- <VanRate :size="25" :readonly="readonly" void-color="#eee" void-icon="star" color="#ffd21e" v-model="(localValue as number)" />
730
+ <VanRate v-model="(localValue as number)" :size="25" :readonly="readonly" void-color="#eee" void-icon="star" color="#ffd21e" />
731
731
  </template>
732
732
  </VanField>
733
733
 
@@ -741,7 +741,7 @@ function onPickerCancel() {
741
741
  :rules="[{ required: attr.rule.required === 'true', message: '请选择' }]"
742
742
  >
743
743
  <template #input>
744
- <VanSlider :readonly="readonly" v-model="(localValue as number)" />
744
+ <VanSlider v-model="(localValue as number)" :readonly="readonly" />
745
745
  </template>
746
746
  </VanField>
747
747
 
@@ -969,7 +969,6 @@ function onPickerCancel() {
969
969
  :maxlength="attr.maxlength ? attr.maxlength : 200"
970
970
  :placeholder="attr.placeholder ? attr.placeholder : `请输入${attr.name}`"
971
971
  show-word-limit
972
- label-align="top"
973
972
  :rules="[{ required: attr.rule.required === 'true', message: `请填写${attr.name}` }]"
974
973
  />
975
974
 
@@ -0,0 +1,209 @@
1
+ <script setup lang="ts">
2
+ import { onMounted, ref } from 'vue'
3
+ import XOlMap from './index.vue'
4
+ import 'vant/lib/index.css'
5
+
6
+ const mapRef = ref()
7
+
8
+ onMounted(() => {
9
+ // 初始化地图
10
+ mapRef.value.init({
11
+ center: [108.948024, 34.263161], // 西安坐标
12
+ zoom: 12,
13
+ maxZoom: 18,
14
+ minZoom: 4,
15
+ tianDiTuKey: 'c16876b28898637c0a1a68b3fa410504',
16
+ })
17
+ })
18
+
19
+ // 地图控制函数
20
+ function handleSetCenter(): void {
21
+ // 切换到北京
22
+ mapRef.value.setCenter([116.404, 39.915])
23
+ }
24
+
25
+ function handleSetZoom(): void {
26
+ // 设置缩放级别为14
27
+ mapRef.value.setZoom(14)
28
+ }
29
+
30
+ function handleGetZoom(): void {
31
+ // 获取当前缩放级别
32
+ const zoom = mapRef.value.getZoom()
33
+ // eslint-disable-next-line no-alert
34
+ alert(`当前缩放级别:${zoom}`)
35
+ }
36
+
37
+ function handleSetCenterAndZoom(): void {
38
+ // 切换到杭州并设置缩放级别
39
+ mapRef.value.setCenterAndZoom([120.153576, 30.287459], 15)
40
+ }
41
+
42
+ // 添加点位示例,创建两种类型
43
+ function handleAddPoints(): void {
44
+ mapRef.value.addVectorPoints({
45
+ icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
46
+ iconAnchor: [0.5, 1],
47
+ data: [
48
+ {
49
+ longitude: 108.988024,
50
+ latitude: 34.283161,
51
+ title: '示例点2',
52
+ extData: { type: 'poi' },
53
+ },
54
+ ],
55
+ onClick: (point) => {
56
+ // eslint-disable-next-line no-alert
57
+ alert(`点击了: ${point.title}`)
58
+ },
59
+ })
60
+ mapRef.value.addVectorPoints({
61
+ icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
62
+ iconAnchor: [0.5, 1],
63
+ data: [
64
+ {
65
+ longitude: 108.948024,
66
+ latitude: 34.263161,
67
+ title: '西安市',
68
+ extData: { type: 'city' },
69
+ },
70
+ ],
71
+ onClick: (point) => {
72
+ // eslint-disable-next-line no-alert
73
+ alert(`点击了: ${point.title}`)
74
+ },
75
+ })
76
+ }
77
+
78
+ // 添加海量点示例
79
+ function handleAddMassPoints(): void {
80
+ // 生成10000个随机点
81
+ const data = Array.from({ length: 10000 }, (_, index) => {
82
+ // 在西安市区范围内随机生成点
83
+ const offset = 0.1 // 控制点的分布范围
84
+ return {
85
+ longitude: 108.948024 + (Math.random() - 0.5) * offset,
86
+ latitude: 34.263161 + (Math.random() - 0.5) * offset,
87
+ title: `点位${index + 1}`,
88
+ extData: { type: 'mass' },
89
+ }
90
+ })
91
+
92
+ mapRef.value.addWebGLPoints({
93
+ icon: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
94
+ iconSize: [6, 6],
95
+ data,
96
+ performance: {
97
+ enableChunk: true,
98
+ chunkSize: 1000,
99
+ },
100
+ })
101
+ }
102
+ </script>
103
+
104
+ <template>
105
+ <div class="demo-container">
106
+ <div class="map-container">
107
+ <XOlMap ref="mapRef" />
108
+ </div>
109
+ <div class="control-panel">
110
+ <div class="control-group">
111
+ <div class="group-title">
112
+ 地图控制
113
+ </div>
114
+ <van-button type="primary" size="small" @click="handleSetCenter">
115
+ 切换到北京
116
+ </van-button>
117
+ <van-button type="primary" size="small" @click="handleSetZoom">
118
+ 设置缩放级别14
119
+ </van-button>
120
+ <van-button type="primary" size="small" @click="handleGetZoom">
121
+ 获取当前缩放级别
122
+ </van-button>
123
+ <van-button type="primary" size="small" @click="handleSetCenterAndZoom">
124
+ 切换到杭州(级别15)
125
+ </van-button>
126
+ </div>
127
+
128
+ <div class="control-group">
129
+ <div class="group-title">
130
+ 点位示例
131
+ </div>
132
+ <van-button type="success" size="small" @click="handleAddPoints">
133
+ 添加普通点位
134
+ </van-button>
135
+ <van-button type="warning" size="small" @click="handleAddMassPoints">
136
+ 添加海量点(1万)
137
+ </van-button>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </template>
142
+
143
+ <style scoped lang="less">
144
+ .demo-container {
145
+ width: 100%;
146
+ height: 100%;
147
+ position: relative;
148
+ }
149
+
150
+ .map-container {
151
+ width: 100%;
152
+ height: 100%;
153
+ }
154
+
155
+ .control-panel {
156
+ position: absolute;
157
+ left: 10px;
158
+ top: 10px;
159
+ z-index: 1000;
160
+ background: white;
161
+ padding: 10px;
162
+ border-radius: 4px;
163
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
164
+ display: flex;
165
+ flex-direction: column;
166
+ gap: 16px;
167
+
168
+ .control-group {
169
+ display: flex;
170
+ flex-direction: column;
171
+ gap: 8px;
172
+
173
+ .group-title {
174
+ font-size: 14px;
175
+ font-weight: 500;
176
+ color: #333;
177
+ padding-left: 4px;
178
+ border-left: 3px solid #1989fa;
179
+ }
180
+ }
181
+
182
+ :deep(.van-button) {
183
+ width: 140px;
184
+ }
185
+ }
186
+
187
+ // 移动端适配
188
+ @media screen and (max-width: 768px) {
189
+ .control-panel {
190
+ left: 8px;
191
+ top: 8px;
192
+ padding: 8px;
193
+ gap: 12px;
194
+
195
+ .control-group {
196
+ gap: 6px;
197
+
198
+ .group-title {
199
+ font-size: 12px;
200
+ }
201
+ }
202
+
203
+ :deep(.van-button) {
204
+ width: 120px;
205
+ font-size: 12px;
206
+ }
207
+ }
208
+ }
209
+ </style>