af-mobile-client-vue3 1.1.39 → 1.1.41

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.
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import type { FormInstance } from 'vant'
3
3
  import XFormItem from '@af-mobile-client-vue3/components/data/XFormItem/index.vue'
4
+ import { post } from '@af-mobile-client-vue3/services/restTools'
4
5
  import {
5
6
  Button as VanButton,
6
7
  CellGroup as VanCellGroup,
@@ -18,8 +19,11 @@ interface FormItem {
18
19
  interface GroupFormItems {
19
20
  btnName?: string
20
21
  formJson: any[] // 根据实际类型调整
22
+ showSubmitBtn?: boolean
23
+ groupName?: string
21
24
  }
22
25
  const props = withDefaults(defineProps<{
26
+ configName?: string
23
27
  groupFormItems?: GroupFormItems
24
28
  serviceName?: string
25
29
  formData?: object
@@ -27,6 +31,7 @@ const props = withDefaults(defineProps<{
27
31
  mode?: string
28
32
  submitButton?: boolean
29
33
  }>(), {
34
+ configName: undefined,
30
35
  groupFormItems: null,
31
36
  serviceName: undefined,
32
37
  formData: null,
@@ -39,24 +44,90 @@ const formRef = ref<FormInstance>()
39
44
  const myFormItems = ref<FormItem[]>([])
40
45
  const rules = reactive({})
41
46
  const form = ref({})
42
- const formGroupName = ref(null)
47
+ const formGroupName = ref<string | null>(null)
43
48
  const myServiceName = ref('')
44
49
  const loaded = ref(false)
45
50
  let myGetDataParams = reactive({})
51
+
52
+ const internalFormConfig = ref<GroupFormItems | null>(null)
53
+ const internalSubmitButton = ref<boolean | undefined>(undefined)
54
+
46
55
  const realJsonData = computed(() => {
47
- return myFormItems.value.filter((item) => {
56
+ const sourceFormItems = internalFormConfig.value?.formJson || props.groupFormItems?.formJson
57
+ if (!sourceFormItems)
58
+ return []
59
+
60
+ return sourceFormItems.filter((item) => {
48
61
  return item.addOrEdit !== 'no'
49
62
  })
50
63
  })
64
+
65
+ const resolvedSubmitButton = computed(() => {
66
+ if (props.configName && internalSubmitButton.value !== undefined) {
67
+ return internalSubmitButton.value
68
+ }
69
+ return props.submitButton
70
+ })
71
+
51
72
  onBeforeMount(() => {
52
- init({ formItems: props.groupFormItems, serviceName: props.serviceName, formData: props.formData, formName: props.formName })
73
+ if (!props.configName && props.groupFormItems) {
74
+ init({ formItems: props.groupFormItems, serviceName: props.serviceName, formData: props.formData, formName: props.formName })
75
+ }
53
76
  })
77
+
78
+ watch(() => props.configName, (newConfigName) => {
79
+ if (newConfigName) {
80
+ loadFormConfig(newConfigName)
81
+ }
82
+ else if (props.groupFormItems) {
83
+ init({ formItems: props.groupFormItems, serviceName: props.serviceName, formData: props.formData, formName: props.formName })
84
+ }
85
+ }, { immediate: true })
86
+
87
+ async function loadFormConfig(name: string) {
88
+ loaded.value = false
89
+ try {
90
+ const result = await post(`/api/${props.serviceName || 'default-service'}/logic/openapi/getLiuliConfiguration`, { configName: name })
91
+ if (result) {
92
+ internalFormConfig.value = result
93
+ internalSubmitButton.value = result.showSubmitBtn
94
+ myServiceName.value = props.serviceName || ''
95
+ formGroupName.value = result.groupName || 'default'
96
+ myFormItems.value = result.formJson as FormItem[]
97
+
98
+ form.value = props.formData || {}
99
+ Object.keys(rules).forEach(key => delete rules[key])
100
+ for (const item of realJsonData.value) {
101
+ setFormProps(form, item)
102
+ }
103
+ }
104
+ else {
105
+ console.warn(`Config '${name}' 不存在.`)
106
+ internalFormConfig.value = null
107
+ internalSubmitButton.value = undefined
108
+ myFormItems.value = []
109
+ form.value = {}
110
+ Object.keys(rules).forEach(key => delete rules[key])
111
+ }
112
+ }
113
+ catch (error) {
114
+ console.error(`无法加载配置 '${name}':`, error)
115
+ internalFormConfig.value = null
116
+ internalSubmitButton.value = undefined
117
+ myFormItems.value = []
118
+ form.value = {}
119
+ Object.keys(rules).forEach(key => delete rules[key])
120
+ }
121
+ finally {
122
+ loaded.value = true
123
+ }
124
+ }
125
+
54
126
  function init(params) {
55
127
  const {
56
128
  formItems,
57
129
  serviceName,
58
- getDataParams = {},
59
- formData = null,
130
+ formData = {},
60
131
  formName = 'default',
61
132
  } = params
62
133
  loaded.value = false
@@ -70,7 +141,7 @@ function init(params) {
70
141
  if (formData)
71
142
  form.value = formData
72
143
 
73
- myGetDataParams = getDataParams
144
+ myGetDataParams = params.getDataParams || {}
74
145
  loaded.value = true
75
146
  }
76
147
 
@@ -123,28 +194,30 @@ async function validate() {
123
194
  await formRef.value?.validate()
124
195
  }
125
196
  watch(() => props.formData, (_val) => {
126
- form.value = props.formData
197
+ form.value = _val
127
198
  })
128
199
  defineExpose({ init, form, formGroupName, validate })
129
200
  </script>
130
201
 
131
202
  <template>
132
- <VanForm ref="formRef" @submit="onSubmit">
133
- <VanCellGroup inset>
134
- <XFormItem
135
- v-for="(item, index) in realJsonData"
136
- :key="index"
137
- v-model="form[item.model]"
138
- :mode="props.mode"
139
- :form="form"
140
- :attr="item"
141
- :rules="rules"
142
- :service-name="myServiceName"
143
- :get-data-params="myGetDataParams"
144
- @set-form="setForm"
145
- />
146
- </VanCellGroup>
147
- <div v-if="props.submitButton && props.mode !== '预览'" style="margin: 16px;">
203
+ <VanForm ref="formRef" class="x-form-container" @submit="onSubmit">
204
+ <div class="form-fields-scrollable">
205
+ <VanCellGroup inset>
206
+ <XFormItem
207
+ v-for="(item, index) in realJsonData"
208
+ :key="index"
209
+ v-model="form[item.model]"
210
+ :mode="props.mode"
211
+ :form="form"
212
+ :attr="item"
213
+ :rules="rules"
214
+ :service-name="myServiceName"
215
+ :get-data-params="myGetDataParams"
216
+ @set-form="setForm"
217
+ />
218
+ </VanCellGroup>
219
+ </div>
220
+ <div v-if="resolvedSubmitButton && props.mode !== '预览'" class="form-footer-fixed">
148
221
  <VanButton round block type="primary" native-type="submit">
149
222
  {{ props.groupFormItems?.btnName ? props.groupFormItems.btnName : '提交' }}
150
223
  </VanButton>
@@ -154,5 +227,23 @@ defineExpose({ init, form, formGroupName, validate })
154
227
  </template>
155
228
 
156
229
  <style scoped>
230
+ .x-form-container {
231
+ height: calc(100vh - var(--van-nav-bar-height) - 5px);
232
+ display: flex;
233
+ flex-direction: column;
234
+ max-height: 100vh;
235
+ overflow: hidden;
236
+ }
157
237
 
238
+ .form-fields-scrollable {
239
+ flex: 1;
240
+ overflow-y: auto;
241
+ min-height: 0;
242
+ padding: 0 16px;
243
+ }
244
+
245
+ .form-footer-fixed {
246
+ margin: 16px;
247
+ flex-shrink: 0;
248
+ }
158
249
  </style>
@@ -868,7 +868,6 @@ function handleAddressConfirm(location) {
868
868
  <VanCalendar
869
869
  v-model:show="calendarShow"
870
870
  switch-mode="year-month"
871
- allow-same-day
872
871
  type="range"
873
872
  teleport="body"
874
873
  :show-confirm="attr.showConfirm"
@@ -1,154 +1,154 @@
1
- // 导入proj控件
2
- import * as proj from 'ol/proj'
3
-
4
- function forEachPoint(func) {
5
- return function (input, opt_output, opt_dimension) {
6
- const len = input.length
7
-
8
- const dimension = opt_dimension || 2
9
- let output
10
-
11
- if (opt_output) {
12
- output = opt_output
13
- }
14
- else {
15
- if (dimension !== 2) {
16
- output = input.slice()
17
- }
18
- else {
19
- output = [len]
20
- }
21
- }
22
- for (let offset = 0; offset < len; offset += dimension) {
23
- func(input, output, offset)
24
- }
25
- return output
26
- }
27
- }
28
-
29
- const gcj02 = {}
30
- const PI = Math.PI
31
- const AXIS = 6378245.0
32
- // eslint-disable-next-line no-loss-of-precision
33
- const OFFSET = 0.00669342162296594323 // (a^2 - b^2) / a^2
34
-
35
- function delta(wgLon, wgLat) {
36
- let dLat = transformLat(wgLon - 105.0, wgLat - 35.0)
37
- let dLon = transformLon(wgLon - 105.0, wgLat - 35.0)
38
- const radLat = (wgLat / 180.0) * PI
39
- let magic = Math.sin(radLat)
40
- magic = 1 - OFFSET * magic * magic
41
- const sqrtMagic = Math.sqrt(magic)
42
- dLat = (dLat * 180.0) / (((AXIS * (1 - OFFSET)) / (magic * sqrtMagic)) * PI)
43
- dLon = (dLon * 180.0) / ((AXIS / sqrtMagic) * Math.cos(radLat) * PI)
44
- return [dLon, dLat]
45
- }
46
-
47
- function outOfChina(lon, lat) {
48
- if (lon < 72.004 || lon > 137.8347) {
49
- return true
50
- }
51
- return lat < 0.8293 || lat > 55.8271
52
- }
53
-
54
- function transformLat(x, y) {
55
- let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x))
56
- ret += ((20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0) / 3.0
57
- ret += ((20.0 * Math.sin(y * PI) + 40.0 * Math.sin((y / 3.0) * PI)) * 2.0) / 3.0
58
- ret += ((160.0 * Math.sin((y / 12.0) * PI) + 320 * Math.sin((y * PI) / 30.0)) * 2.0) / 3.0
59
- return ret
60
- }
61
-
62
- function transformLon(x, y) {
63
- let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x))
64
- ret += ((20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0) / 3.0
65
- ret += ((20.0 * Math.sin(x * PI) + 40.0 * Math.sin((x / 3.0) * PI)) * 2.0) / 3.0
66
- ret += ((150.0 * Math.sin((x / 12.0) * PI) + 300.0 * Math.sin((x / 30.0) * PI)) * 2.0) / 3.0
67
- return ret
68
- }
69
-
70
- gcj02.toWGS84 = forEachPoint((input, output, offset) => {
71
- let lng = input[offset]
72
- let lat = input[offset + 1]
73
- if (!outOfChina(lng, lat)) {
74
- const deltaD = delta(lng, lat)
75
- lng = lng - deltaD[0] // 改回减法
76
- lat = lat - deltaD[1] // 改回减法
77
- }
78
- output[offset] = lng
79
- output[offset + 1] = lat
80
- })
81
-
82
- gcj02.fromWGS84 = forEachPoint((input, output, offset) => {
83
- let lng = input[offset]
84
- let lat = input[offset + 1]
85
- if (!outOfChina(lng, lat)) {
86
- const deltaD = delta(lng, lat)
87
- lng = lng + deltaD[0] // 改回加法
88
- lat = lat + deltaD[1] // 改回加法
89
- }
90
- output[offset] = lng
91
- output[offset + 1] = lat
92
- })
93
-
94
- const sphericalMercator = {}
95
- const RADIUS = 6378137
96
- const MAX_LATITUDE = 85.0511287798
97
- const RAD_PER_DEG = Math.PI / 180
98
-
99
- sphericalMercator.forward = forEachPoint((input, output, offset) => {
100
- const lat = Math.max(Math.min(MAX_LATITUDE, input[offset + 1]), -MAX_LATITUDE)
101
- const sin = Math.sin(lat * RAD_PER_DEG)
102
- output[offset] = RADIUS * input[offset] * RAD_PER_DEG
103
- output[offset + 1] = (RADIUS * Math.log((1 + sin) / (1 - sin))) / 2
104
- })
105
-
106
- sphericalMercator.inverse = forEachPoint((input, output, offset) => {
107
- output[offset] = input[offset] / RADIUS / RAD_PER_DEG
108
- output[offset + 1] = (2 * Math.atan(Math.exp(input[offset + 1] / RADIUS)) - Math.PI / 2) / RAD_PER_DEG
109
- })
110
-
111
- const projzh = {}
112
-
113
- projzh.ll2gmerc = function (input, opt_output, opt_dimension) {
114
- const output = gcj02.toWGS84(input, opt_output, opt_dimension) // 改用 toWGS84
115
- return projzh.ll2smerc(output, output, opt_dimension)
116
- }
117
-
118
- projzh.gmerc2ll = function (input, opt_output, opt_dimension) {
119
- const output = projzh.smerc2ll(input, input, opt_dimension)
120
- return gcj02.fromWGS84(output, opt_output, opt_dimension) // 改用 fromWGS84
121
- }
122
-
123
- // smerc2gmerc 需要修改
124
-
125
- projzh.smerc2gmerc = function (input, opt_output, opt_dimension) {
126
- let output = projzh.smerc2ll(input, input, opt_dimension)
127
- output = gcj02.toWGS84(output, output, opt_dimension) // 这里应该用 toWGS84
128
- return projzh.ll2smerc(output, output, opt_dimension)
129
- }
130
-
131
- // gmerc2smerc 需要修改
132
-
133
- projzh.gmerc2smerc = function (input, opt_output, opt_dimension) {
134
- let output = projzh.smerc2ll(input, input, opt_dimension)
135
- output = gcj02.fromWGS84(output, output, opt_dimension) // 这里应该用 fromWGS84
136
- return projzh.ll2smerc(output, output, opt_dimension)
137
- }
138
-
139
- projzh.ll2smerc = sphericalMercator.forward
140
- projzh.smerc2ll = sphericalMercator.inverse
141
-
142
- // 定义WGS84转GCJ02的投影
143
- const extent = [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
144
- export const wgs84ToGcj02Projection = new proj.Projection({
145
- code: 'WGS84-TO-GCJ02',
146
- extent,
147
- units: 'm',
148
- })
149
-
150
- // 添加投影和转换方法
151
- proj.addProjection(wgs84ToGcj02Projection)
152
- // 注意这里转换方法的顺序与原来相反
153
- proj.addCoordinateTransforms('EPSG:4326', wgs84ToGcj02Projection, projzh.ll2gmerc, projzh.gmerc2ll)
154
- proj.addCoordinateTransforms('EPSG:3857', wgs84ToGcj02Projection, projzh.smerc2gmerc, projzh.gmerc2smerc)
1
+ // 导入proj控件
2
+ import * as proj from 'ol/proj'
3
+
4
+ function forEachPoint(func) {
5
+ return function (input, opt_output, opt_dimension) {
6
+ const len = input.length
7
+
8
+ const dimension = opt_dimension || 2
9
+ let output
10
+
11
+ if (opt_output) {
12
+ output = opt_output
13
+ }
14
+ else {
15
+ if (dimension !== 2) {
16
+ output = input.slice()
17
+ }
18
+ else {
19
+ output = [len]
20
+ }
21
+ }
22
+ for (let offset = 0; offset < len; offset += dimension) {
23
+ func(input, output, offset)
24
+ }
25
+ return output
26
+ }
27
+ }
28
+
29
+ const gcj02 = {}
30
+ const PI = Math.PI
31
+ const AXIS = 6378245.0
32
+ // eslint-disable-next-line no-loss-of-precision
33
+ const OFFSET = 0.00669342162296594323 // (a^2 - b^2) / a^2
34
+
35
+ function delta(wgLon, wgLat) {
36
+ let dLat = transformLat(wgLon - 105.0, wgLat - 35.0)
37
+ let dLon = transformLon(wgLon - 105.0, wgLat - 35.0)
38
+ const radLat = (wgLat / 180.0) * PI
39
+ let magic = Math.sin(radLat)
40
+ magic = 1 - OFFSET * magic * magic
41
+ const sqrtMagic = Math.sqrt(magic)
42
+ dLat = (dLat * 180.0) / (((AXIS * (1 - OFFSET)) / (magic * sqrtMagic)) * PI)
43
+ dLon = (dLon * 180.0) / ((AXIS / sqrtMagic) * Math.cos(radLat) * PI)
44
+ return [dLon, dLat]
45
+ }
46
+
47
+ function outOfChina(lon, lat) {
48
+ if (lon < 72.004 || lon > 137.8347) {
49
+ return true
50
+ }
51
+ return lat < 0.8293 || lat > 55.8271
52
+ }
53
+
54
+ function transformLat(x, y) {
55
+ let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x))
56
+ ret += ((20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0) / 3.0
57
+ ret += ((20.0 * Math.sin(y * PI) + 40.0 * Math.sin((y / 3.0) * PI)) * 2.0) / 3.0
58
+ ret += ((160.0 * Math.sin((y / 12.0) * PI) + 320 * Math.sin((y * PI) / 30.0)) * 2.0) / 3.0
59
+ return ret
60
+ }
61
+
62
+ function transformLon(x, y) {
63
+ let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x))
64
+ ret += ((20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0) / 3.0
65
+ ret += ((20.0 * Math.sin(x * PI) + 40.0 * Math.sin((x / 3.0) * PI)) * 2.0) / 3.0
66
+ ret += ((150.0 * Math.sin((x / 12.0) * PI) + 300.0 * Math.sin((x / 30.0) * PI)) * 2.0) / 3.0
67
+ return ret
68
+ }
69
+
70
+ gcj02.toWGS84 = forEachPoint((input, output, offset) => {
71
+ let lng = input[offset]
72
+ let lat = input[offset + 1]
73
+ if (!outOfChina(lng, lat)) {
74
+ const deltaD = delta(lng, lat)
75
+ lng = lng - deltaD[0] // 改回减法
76
+ lat = lat - deltaD[1] // 改回减法
77
+ }
78
+ output[offset] = lng
79
+ output[offset + 1] = lat
80
+ })
81
+
82
+ gcj02.fromWGS84 = forEachPoint((input, output, offset) => {
83
+ let lng = input[offset]
84
+ let lat = input[offset + 1]
85
+ if (!outOfChina(lng, lat)) {
86
+ const deltaD = delta(lng, lat)
87
+ lng = lng + deltaD[0] // 改回加法
88
+ lat = lat + deltaD[1] // 改回加法
89
+ }
90
+ output[offset] = lng
91
+ output[offset + 1] = lat
92
+ })
93
+
94
+ const sphericalMercator = {}
95
+ const RADIUS = 6378137
96
+ const MAX_LATITUDE = 85.0511287798
97
+ const RAD_PER_DEG = Math.PI / 180
98
+
99
+ sphericalMercator.forward = forEachPoint((input, output, offset) => {
100
+ const lat = Math.max(Math.min(MAX_LATITUDE, input[offset + 1]), -MAX_LATITUDE)
101
+ const sin = Math.sin(lat * RAD_PER_DEG)
102
+ output[offset] = RADIUS * input[offset] * RAD_PER_DEG
103
+ output[offset + 1] = (RADIUS * Math.log((1 + sin) / (1 - sin))) / 2
104
+ })
105
+
106
+ sphericalMercator.inverse = forEachPoint((input, output, offset) => {
107
+ output[offset] = input[offset] / RADIUS / RAD_PER_DEG
108
+ output[offset + 1] = (2 * Math.atan(Math.exp(input[offset + 1] / RADIUS)) - Math.PI / 2) / RAD_PER_DEG
109
+ })
110
+
111
+ const projzh = {}
112
+
113
+ projzh.ll2gmerc = function (input, opt_output, opt_dimension) {
114
+ const output = gcj02.toWGS84(input, opt_output, opt_dimension) // 改用 toWGS84
115
+ return projzh.ll2smerc(output, output, opt_dimension)
116
+ }
117
+
118
+ projzh.gmerc2ll = function (input, opt_output, opt_dimension) {
119
+ const output = projzh.smerc2ll(input, input, opt_dimension)
120
+ return gcj02.fromWGS84(output, opt_output, opt_dimension) // 改用 fromWGS84
121
+ }
122
+
123
+ // smerc2gmerc 需要修改
124
+
125
+ projzh.smerc2gmerc = function (input, opt_output, opt_dimension) {
126
+ let output = projzh.smerc2ll(input, input, opt_dimension)
127
+ output = gcj02.toWGS84(output, output, opt_dimension) // 这里应该用 toWGS84
128
+ return projzh.ll2smerc(output, output, opt_dimension)
129
+ }
130
+
131
+ // gmerc2smerc 需要修改
132
+
133
+ projzh.gmerc2smerc = function (input, opt_output, opt_dimension) {
134
+ let output = projzh.smerc2ll(input, input, opt_dimension)
135
+ output = gcj02.fromWGS84(output, output, opt_dimension) // 这里应该用 fromWGS84
136
+ return projzh.ll2smerc(output, output, opt_dimension)
137
+ }
138
+
139
+ projzh.ll2smerc = sphericalMercator.forward
140
+ projzh.smerc2ll = sphericalMercator.inverse
141
+
142
+ // 定义WGS84转GCJ02的投影
143
+ const extent = [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
144
+ export const wgs84ToGcj02Projection = new proj.Projection({
145
+ code: 'WGS84-TO-GCJ02',
146
+ extent,
147
+ units: 'm',
148
+ })
149
+
150
+ // 添加投影和转换方法
151
+ proj.addProjection(wgs84ToGcj02Projection)
152
+ // 注意这里转换方法的顺序与原来相反
153
+ proj.addCoordinateTransforms('EPSG:4326', wgs84ToGcj02Projection, projzh.ll2gmerc, projzh.gmerc2ll)
154
+ proj.addCoordinateTransforms('EPSG:3857', wgs84ToGcj02Projection, projzh.smerc2gmerc, projzh.gmerc2smerc)