Commit 5189c225b5ba9151e48dfe968bd88535fb2d3566

Authored by ww
1 parent 9177697d

fix(dynamic request): 修复动态请求header回显

  1 +<script lang="ts" setup>
  2 +import { PublicInterfaceRecord } from '@/api/external/dynamicRequest/model';
  3 +import { RequestParams } from '@/enums/httpEnum';
  4 +import { ExtraRequestConfigType } from '@/store/external/modules/extraComponentInfo.d';
  5 +import { FormItemInst, NDatePicker, NForm, NFormItem, NInput, NSelect, NTreeSelect } from 'naive-ui'
  6 +import { computed, ref, unref, watch } from 'vue';
  7 +import { ComponentType, useDynamicPublicForm } from './useDynamicPublicForm';
  8 +import { transferData } from './utils';
  9 +
  10 +const props = defineProps<{
  11 + publicInterfaceRecord: PublicInterfaceRecord
  12 +}>()
  13 +
  14 +const componentMap: { [key in ComponentType]?: any } = {
  15 + [ComponentType.SELECT_TREE]: NTreeSelect,
  16 + [ComponentType.SELECT]: NSelect,
  17 + [ComponentType.INPUT]: NInput,
  18 + [ComponentType.DATE_PICKER]: NDatePicker
  19 +}
  20 +
  21 +const getPublicInterfaceRecord = computed(() => {
  22 + return props.publicInterfaceRecord
  23 +})
  24 +const dynamicFormItemEl = ref<FormItemInst[]>()
  25 +
  26 +const { getDynamicFormSchemas, validFlag, getValue, createForm, clearParams, setDynamicFormValue } = useDynamicPublicForm(getPublicInterfaceRecord)
  27 +
  28 +const getConfigurationData = () => {
  29 + return transferData(unref(getPublicInterfaceRecord), unref(getValue))
  30 +}
  31 +
  32 +const validate = async () => {
  33 + for (const item of unref(dynamicFormItemEl) || []) {
  34 + await item.validate()
  35 + }
  36 + return unref(validFlag)
  37 +}
  38 +const setConfigurationData = async (requestParams: RequestParams) => {
  39 + setDynamicFormValue(requestParams)
  40 +}
  41 +
  42 +watch(
  43 + () => props.publicInterfaceRecord,
  44 + (newValue) => {
  45 + if (newValue) {
  46 + clearParams()
  47 + createForm()
  48 + }
  49 + }
  50 +)
  51 +
  52 +defineExpose({
  53 + validate,
  54 + getConfigurationData,
  55 + setConfigurationData,
  56 +})
  57 +
  58 +</script>
  59 +
  60 +<template>
  61 + <NForm>
  62 + <template v-for="item in getDynamicFormSchemas" :key="item.key">
  63 + <NFormItem ref="dynamicFormItemEl" :required="item.required" :label="item.name" :rule="item.rules">
  64 + <component :is="componentMap[item.component]" v-bind="item.props" clearable />
  65 + </NFormItem>
  66 + </template>
  67 + </NForm>
  68 +</template>
... ...
src/views/chart/ContentConfigurations/components/ChartData/external/components/DynamicForm/useDynamicPublicForm.ts renamed from src/views/chart/ContentConfigurations/components/ChartData/external/components/PublicInterfaceForm/useDynamicPublicForm.ts
... ... @@ -46,7 +46,6 @@ export const useDynamicPublicForm = (publicInterfaceRef: Ref<PublicInterfaceReco
46 46 const getParams = computed(() => {
47 47 let params = (publicInterfaceRef.value.requestParams as unknown as RequestParams).Params || []
48 48 if (!Array.isArray(params)) params = []
49   - console.log(params)
50 49 return params
51 50 })
52 51
... ... @@ -131,7 +130,7 @@ export const useDynamicPublicForm = (publicInterfaceRef: Ref<PublicInterfaceReco
131 130 if (Reflect.has(value, BuiltInVariable.DATE_RANGE)) {
132 131 const fieldMapping = unref(getParams).find(item => item.key === BuiltInVariable.DATE_RANGE)
133 132 const [start, end] = ((fieldMapping || {}).value || '').split(GROUP_SEPARATOR)
134   - const [startValue, endValue] = value[BuiltInVariable.DATE_RANGE]
  133 + const [startValue, endValue] = value[BuiltInVariable.DATE_RANGE] || []
135 134 value[start] = startValue
136 135 value[end] = endValue
137 136
... ... @@ -333,17 +332,23 @@ export const useDynamicPublicForm = (publicInterfaceRef: Ref<PublicInterfaceReco
333 332 const splitKeys = value ? value.split(GROUP_SEPARATOR) : key.split(GROUP_SEPARATOR)
334 333 if (isDateComponent(key as BuiltInVariable)) {
335 334 if (key as BuiltInVariable === BuiltInVariable.DATE_FIXED) {
336   - params[key] = Params[splitKeys[0]]
  335 + params[key] = Params[splitKeys[0]] || null
337 336 continue
338 337 }
339   - params[key] = [Params[splitKeys[0]], Params[splitKeys[1]]]
  338 + const value = [Params[splitKeys[0]], Params[splitKeys[1]]]
  339 + params[key] = value.every(Boolean) ? value : null
340 340 continue
341 341 }
342 342 for (const temp of splitKeys) {
343 343 params[temp] = Params[temp]
344 344 }
345   - }
  345 + }
  346 + }
346 347
  348 + const clearParams = () => {
  349 + Object.keys(params).forEach(key => {
  350 + Reflect.deleteProperty(params, key)
  351 + })
347 352 }
348 353
349 354 const setDynamicFormValue = (requestParams: RequestConfigType['requestParams']) => {
... ... @@ -364,7 +369,8 @@ export const useDynamicPublicForm = (publicInterfaceRef: Ref<PublicInterfaceReco
364 369 getValue,
365 370 getDynamicFormSchemas,
366 371 setDynamicFormValue,
367   - createForm
  372 + createForm,
  373 + clearParams
368 374 }
369 375 }
370 376
... ...
src/views/chart/ContentConfigurations/components/ChartData/external/components/DynamicForm/utils.ts renamed from src/views/chart/ContentConfigurations/components/ChartData/external/components/PublicInterfaceForm/utils.ts
... ... @@ -3,9 +3,10 @@ import { RequestDataTypeEnum, RequestParams } from "@/enums/httpEnum"
3 3 import { ExternalRequestType } from "@/store/external/modules/extraComponentInfo.d"
4 4 import { unref } from "vue"
5 5
6   -export const transferData = (publicInterfaceRecord: PublicInterfaceRecord, requestParams: RequestParams, fillParams: Recordable) => {
7   - const { requestContentType, requestHttpType, id, requestUrl, requestParamsBodyType, requestOriginUrl } = publicInterfaceRecord
8   - const { Header, Body } = requestParams
  6 +export const transferData = (publicInterfaceRecord: PublicInterfaceRecord, fillParams: Recordable, fillBody: Recordable = {}) => {
  7 + const { requestContentType, requestHttpType, id, requestUrl, requestOriginUrl, requestParams } = publicInterfaceRecord
  8 + const { Header, Body } = requestParams as RequestParams
  9 + const { requestParamsBodyType } = Body as Recordable
9 10 return {
10 11 requestDataPondId: id,
11 12 // requestInterval
... ... @@ -28,7 +29,7 @@ export const transferData = (publicInterfaceRecord: PublicInterfaceRecord, reque
28 29 // requestIntervalUnit
29 30 requestParams: {
30 31 Header,
31   - Body,
  32 + Body: unref(fillBody),
32 33 Params: unref(fillParams)
33 34 }
34 35
... ...
... ... @@ -4,21 +4,14 @@ import { PublicInterfaceRecord, PublicInterfaceStateEnum } from '@/api/external/
4 4 import { SettingItem, SettingItemBox } from '@/components/Pages/ChartItemSetting';
5 5 import { RequestContentTypeEnum, RequestContentTypeNameEnum } from '@/enums/external/httpEnum';
6 6 import { RequestBodyEnum, RequestHttpEnum, RequestHttpIntervalEnum, RequestParams, RequestParamsTypeEnum } from '@/enums/httpEnum';
7   -import { NForm, NCard, NDatePicker, NEmpty, NFormItem, NInput, NInputGroup, NInputNumber, NScrollbar, NSelect, NTabPane, NTabs, NTreeSelect, SelectOption, FormItemInst } from 'naive-ui';
8   -import { ref, computed, unref } from 'vue'
  7 +import { NCard, NEmpty, NInputGroup, NInputNumber, NScrollbar, NSelect, NTabPane, NTabs, SelectOption } from 'naive-ui';
  8 +import { ref, computed, unref, nextTick } from 'vue'
9 9 import { selectTimeOptions, selectTypeOptions } from '../../../index.d';
10 10 import ParamsTable from '../RequestModal/ParamsTable.vue';
11 11 import RequestBody from '../RequestModal/RequestBody.vue';
12   -import { ComponentType, useDynamicPublicForm } from './useDynamicPublicForm';
13   -import { transferData } from './utils';
14 12 import { ExtraRequestConfigType } from '@/store/external/modules/extraComponentInfo.d';
  13 +import { DynamicForm } from '../DynamicForm';
15 14
16   -const componentMap: { [key in ComponentType]?: any } = {
17   - [ComponentType.SELECT_TREE]: NTreeSelect,
18   - [ComponentType.SELECT]: NSelect,
19   - [ComponentType.INPUT]: NInput,
20   - [ComponentType.DATE_PICKER]: NDatePicker
21   -}
22 15 const publicInterfaceList = ref<PublicInterfaceRecord[]>([])
23 16
24 17 const selectedPublicInterface = ref<string>()
... ... @@ -31,7 +24,7 @@ const toJSON = (string: string) => {
31 24 }
32 25 }
33 26
34   -const getSelectedInterface = computed(() => {
  27 +const getSelectedInterface = computed<PublicInterfaceRecord>(() => {
35 28 const record = unref(publicInterfaceList).find(item => item.id === unref(selectedPublicInterface))! || {}
36 29 const _record = JSON.parse(JSON.stringify(record))
37 30 _record.requestParams = toJSON(_record.requestParams)
... ... @@ -48,12 +41,6 @@ const handleFilter = (query: string, option: SelectOption) => {
48 41 return ((option as Recordable).interfaceName).includes(query)
49 42 }
50 43
51   -const { getDynamicFormSchemas, getValue, createForm, validFlag, setDynamicFormValue } = useDynamicPublicForm(getSelectedInterface)
52   -
53   -const getConfigurationData = () => {
54   - const value = transferData(unref(getSelectedInterface), unref(getSelectedInterface).requestParams as unknown as RequestParams, unref(getValue))
55   - return value
56   -}
57 44
58 45 const requestHttpTypeRef = ref<RequestHttpEnum>()
59 46
... ... @@ -65,16 +52,17 @@ const requestContentTypeRef = ref<RequestContentTypeEnum>()
65 52
66 53 const requestParamsTypeRef = ref<RequestParamsTypeEnum>(RequestParamsTypeEnum.PARAMS)
67 54
68   -const requestParamsRef = ref<RequestParams>({ Body: { [RequestBodyEnum.FORM_DATA]: {}, [RequestBodyEnum.JSON]: '', [RequestBodyEnum.XML]: '', [RequestBodyEnum.X_WWW_FORM_URLENCODED]: {} }, Header: {}, Params: {} })
  55 +const requestBodyRef = ref<RequestParams>({ Body: { [RequestBodyEnum.FORM_DATA]: {}, [RequestBodyEnum.JSON]: '', [RequestBodyEnum.XML]: '', [RequestBodyEnum.X_WWW_FORM_URLENCODED]: {} }, Header: {}, Params: {} })
69 56
70 57 const requestParamsBodyTypeRef = ref<RequestBodyEnum>(RequestBodyEnum.X_WWW_FORM_URLENCODED)
71 58
72 59 const headerRef = ref()
73 60
74   -const dynamicFormItemEl = ref<FormItemInst[]>()
  61 +
  62 +const paramsDynamicFormEl = ref<InstanceType<typeof DynamicForm>>()
  63 +const socketDynamicFormEl = ref<InstanceType<typeof DynamicForm>>()
75 64
76 65 const handleSelectedInterfaceChange = (value: string, option: PublicInterfaceRecord) => {
77   - createForm()
78 66 requestContentTypeRef.value = option.requestContentType as RequestContentTypeEnum
79 67 requestHttpTypeRef.value = option.requestHttpType as RequestHttpEnum
80 68 }
... ... @@ -83,6 +71,22 @@ const getGetRequestTypeName = (key: RequestContentTypeEnum) => {
83 71 return RequestContentTypeNameEnum[RequestContentTypeEnum[key] as keyof typeof RequestContentTypeEnum]
84 72 }
85 73
  74 +const validate = async () => {
  75 + if (unref(paramsDynamicFormEl)) return await unref(paramsDynamicFormEl)?.validate()
  76 + if (unref(socketDynamicFormEl)) return await unref(socketDynamicFormEl)?.validate()
  77 +}
  78 +
  79 +const setDynamicFormValue = (requestParams: RequestParams) => {
  80 + if (unref(paramsDynamicFormEl)) unref(paramsDynamicFormEl)?.setConfigurationData(requestParams)
  81 + if (unref(socketDynamicFormEl)) unref(socketDynamicFormEl)?.setConfigurationData(requestParams)
  82 +}
  83 +
  84 +
  85 +const getConfigurationData = () => {
  86 + if (unref(paramsDynamicFormEl)) return unref(paramsDynamicFormEl)?.getConfigurationData()
  87 + if (unref(socketDynamicFormEl)) return unref(socketDynamicFormEl)?.getConfigurationData()
  88 +}
  89 +
86 90 const setConfigurationData = async (request: ExtraRequestConfigType) => {
87 91 await getPublicInterfaceList()
88 92 const { requestDataPondId, requestParams, requestParamsBodyType, requestContentType, requestHttpType } = request
... ... @@ -92,19 +96,11 @@ const setConfigurationData = async (request: ExtraRequestConfigType) => {
92 96 requestHttpTypeRef.value = requestHttpType
93 97 headerRef.value = Header
94 98 requestParamsBodyTypeRef.value = requestParamsBodyType
95   - requestParamsRef.value = requestParams
  99 + requestBodyRef.value = requestParams
  100 + await nextTick()
96 101 setDynamicFormValue(requestParams)
97 102 }
98 103
99   -
100   -const validate = async () => {
101   - for (const item of unref(dynamicFormItemEl) || []) {
102   - await item.validate()
103   - }
104   - return unref(validFlag)
105   -}
106   -
107   -
108 104 defineExpose({
109 105 getConfigurationData,
110 106 setConfigurationData,
... ... @@ -159,55 +155,26 @@ defineExpose({
159 155
160 156 <SettingItemBox v-if="requestContentTypeRef === RequestContentTypeEnum.DEFAULT"
161 157 :item-right-style="{ gridTemplateColumns: '7fr 1fr' }">
162   - <NCard v-if="requestParamsTypeRef === RequestParamsTypeEnum.PARAMS" class="dynamic-form">
  158 + <NCard v-show="requestParamsTypeRef === RequestParamsTypeEnum.PARAMS" class="dynamic-form">
163 159 <NScrollbar style="max-height: 400px; box-sizing: border-box;">
164   - <NForm>
165   - <template v-for="item in getDynamicFormSchemas" :key="item.key">
166   - <NFormItem ref="dynamicFormItemEl" :required="item.required" :label="item.name" :rule="item.rules">
167   - <component :is="componentMap[item.component]" v-bind="item.props" clearable />
168   - </NFormItem>
169   - </template>
170   - </NForm>
171   - <NEmpty v-if="!selectedPublicInterface || !getDynamicFormSchemas.length" description="请选择公共接口" />
  160 + <DynamicForm ref="paramsDynamicFormEl" :public-interface-record="getSelectedInterface" />
  161 + <NEmpty v-if="!selectedPublicInterface" description="请选择公共接口" />
172 162 </NScrollbar>
173 163 </NCard>
174 164
175   - <!-- <section v-if="requestParamsTypeRef === RequestParamsTypeEnum.PARAMS">
176   - <NCard>
177   - <NSpace vertical>
178   - <NTag type="info">
179   - <span class="func-keyword">function</span>&nbsp;&nbsp;filter(res)&nbsp;&nbsp;{
180   - </NTag>
181   - <MonacoEditor v-model:modelValue="filter" width="380px" height="300px" language="javascript" />
182   - <NTag type="info">}</NTag>
183   - </NSpace>
184   - </NCard>
185   - <NCard style="margin-top: 20px;">
186   - <NText>转换结果:</NText>
187   - <section>
188   - <NText>{{ params }}</NText>
189   - </section>
190   - </NCard>
191   - </section> -->
192   -
193   - <RequestBody v-if="requestParamsTypeRef === RequestParamsTypeEnum.BODY"
194   - v-model:request-params-body-type="requestParamsBodyTypeRef" v-model:value="requestParamsRef" />
195   -
196   - <ParamsTable v-if="requestParamsTypeRef === RequestParamsTypeEnum.HEADER" v-model:value="headerRef" />
  165 + <RequestBody v-show="requestParamsTypeRef === RequestParamsTypeEnum.BODY"
  166 + v-model:request-params-body-type="requestParamsBodyTypeRef" v-model:value="requestBodyRef" />
  167 +
  168 + <ParamsTable v-show="requestParamsTypeRef === RequestParamsTypeEnum.HEADER" v-model:value="headerRef"
  169 + :disabled="true" />
197 170
198 171 </SettingItemBox>
199 172
200 173 <SettingItemBox v-if="requestContentTypeRef === RequestContentTypeEnum.WEB_SOCKET">
201 174 <NCard v-if="requestParamsTypeRef === RequestParamsTypeEnum.PARAMS" class="dynamic-form">
202 175 <NScrollbar style="max-height: 400px; box-sizing: border-box;">
203   - <NForm>
204   - <template v-for="item in getDynamicFormSchemas" :key="item.key">
205   - <NFormItem ref="dynamicFormItemEl" :required="item.required" :label="item.name" :rule="item.rules">
206   - <component :is="componentMap[item.component]" v-bind="item.props" clearable />
207   - </NFormItem>
208   - </template>
209   - </NForm>
210   - <NEmpty v-if="!selectedPublicInterface || !getDynamicFormSchemas.length" description="请选择公共接口" />
  176 + <DynamicForm ref="socketDynamicFormEl" :public-interface-record="getSelectedInterface" />
  177 + <NEmpty v-if="!selectedPublicInterface" description="请选择公共接口" />
211 178 </NScrollbar>
212 179 </NCard>
213 180 </SettingItemBox>
... ...
... ... @@ -125,6 +125,13 @@ const props = withDefaults(
125 125 }
126 126 )
127 127
  128 +watch(
  129 + () => props.value,
  130 + () => {
  131 + console.log(props.value)
  132 + }
  133 +)
  134 +
128 135 const emit = defineEmits(['update:value'])
129 136
130 137 const createNewRow = () => {
... ...
1 1 <script lang="ts" setup>
2 2 import { MonacoEditor } from '@/components/Pages/MonacoEditor';
3 3 import { RequestBodyEnum, RequestBodyEnumList, RequestParams } from '@/enums/httpEnum';
4   -import { NCard } from 'naive-ui';
  4 +import { NCard } from 'naive-ui';
5 5 import ParamsTable from './ParamsTable.vue';
6 6
7 7 defineProps<{
... ... @@ -12,14 +12,15 @@ defineProps<{
12 12 const emit = defineEmits(['update:requestParamsBodyType'])
13 13
14 14 const handleSyncRequestParamsBodyType = (value: RequestBodyEnum) => {
15   - emit('update:requestParamsBodyType', value)
  15 + emit('update:requestParamsBodyType', value || RequestBodyEnum.X_WWW_FORM_URLENCODED)
16 16 }
17 17
18 18 </script>
19 19
20 20 <template>
21 21 <section>
22   - <NRadioGroup v-model:value="requestParamsBodyType" @update:value="handleSyncRequestParamsBodyType">
  22 + <NRadioGroup :value="requestParamsBodyType || RequestBodyEnum.X_WWW_FORM_URLENCODED"
  23 + @update:value="handleSyncRequestParamsBodyType">
23 24 <NSpace>
24 25 <NRadio v-for="item in RequestBodyEnumList" :key="item" :value="item">
25 26 {{ item }}
... ... @@ -36,7 +37,7 @@ const handleSyncRequestParamsBodyType = (value: RequestBodyEnum) => {
36 37 <ParamsTable v-if="requestParamsBodyType === RequestBodyEnum.FORM_DATA"
37 38 v-model:value="value.Body[RequestBodyEnum.FORM_DATA]" />
38 39
39   - <ParamsTable v-if="requestParamsBodyType === RequestBodyEnum.X_WWW_FORM_URLENCODED"
  40 + <ParamsTable v-if="requestParamsBodyType === RequestBodyEnum.X_WWW_FORM_URLENCODED || !requestParamsBodyType"
40 41 v-model:value="value.Body[RequestBodyEnum.X_WWW_FORM_URLENCODED]" />
41 42
42 43 <MonacoEditor v-if="requestParamsBodyType === RequestBodyEnum.JSON"
... ... @@ -49,7 +50,7 @@ const handleSyncRequestParamsBodyType = (value: RequestBodyEnum) => {
49 50 </template>
50 51
51 52 <style lang="scss" scoped>
52   - .body-container {
53   - margin-top: 20px;
54   - }
  53 +.body-container {
  54 + margin-top: 20px;
  55 +}
55 56 </style>
... ...