Skip to content

Commit fd0b7be

Browse files
author
puhui999
committed
【代码优化】IoT: HTTP 数据桥梁配置编辑优化
1 parent 2fd3422 commit fd0b7be

File tree

2 files changed

+109
-39
lines changed

2 files changed

+109
-39
lines changed
Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
<template>
22
<el-form-item label="请求地址" prop="config.url">
3-
<el-input v-model="config.url" placeholder="请输入请求地址" />
3+
<el-input v-model="urlPath" placeholder="请输入请求地址">
4+
<template #prepend>
5+
<el-select v-model="urlPrefix" placeholder="Select" style="width: 115px">
6+
<el-option label="http://" value="http://" />
7+
<el-option label="https://" value="https://" />
8+
</el-select>
9+
</template>
10+
</el-input>
411
</el-form-item>
512
<el-form-item label="请求方法" prop="config.method">
613
<el-select v-model="config.method" placeholder="请选择请求方法">
@@ -11,29 +18,21 @@
1118
</el-select>
1219
</el-form-item>
1320
<el-form-item label="请求头" prop="config.headers">
14-
<el-input
15-
v-model="headersStr"
16-
placeholder="请输入请求头,格式为 JSON"
17-
type="textarea"
18-
@input="handleHeadersChange"
19-
/>
21+
<key-value-editor v-model="config.headers" add-button-text="添加请求头" />
2022
</el-form-item>
2123
<el-form-item label="请求参数" prop="config.query">
22-
<el-input
23-
v-model="queryStr"
24-
placeholder="请输入请求参数,格式为 JSON"
25-
type="textarea"
26-
@input="handleQueryChange"
27-
/>
24+
<key-value-editor v-model="config.query" add-button-text="添加参数" />
2825
</el-form-item>
2926
<el-form-item label="请求体" prop="config.body">
30-
<el-input v-model="config.body" placeholder="请输入请求体" type="textarea" />
27+
<el-input v-model="config.body" placeholder="请输入内容" type="textarea" />
3128
</el-form-item>
3229
</template>
30+
3331
<script lang="ts" setup>
3432
import { HttpConfig, IoTDataBridgeConfigType } from '@/api/iot/rule/databridge'
3533
import { useVModel } from '@vueuse/core'
3634
import { isEmpty } from '@/utils/is'
35+
import KeyValueEditor from './components/KeyValueEditor.vue'
3736
3837
defineOptions({ name: 'HttpConfigForm' })
3938
@@ -43,43 +42,43 @@ const props = defineProps<{
4342
const emit = defineEmits(['update:modelValue'])
4443
const config = useVModel(props, 'modelValue', emit) as Ref<HttpConfig>
4544
46-
const headersStr = ref('{}')
47-
const queryStr = ref('{}')
45+
// URL处理
46+
const urlPrefix = ref('http://')
47+
const urlPath = ref('')
48+
const fullUrl = computed(() => {
49+
return urlPath.value ? urlPrefix.value + urlPath.value : ''
50+
})
51+
52+
// 监听URL变化
53+
watch([urlPrefix, urlPath], () => {
54+
config.value.url = fullUrl.value
55+
})
4856
4957
/** 组件初始化 */
5058
onMounted(() => {
5159
if (!isEmpty(config.value)) {
60+
// 初始化URL
61+
if (config.value.url) {
62+
if (config.value.url.startsWith('https://')) {
63+
urlPrefix.value = 'https://'
64+
urlPath.value = config.value.url.substring(8)
65+
} else if (config.value.url.startsWith('http://')) {
66+
urlPrefix.value = 'http://'
67+
urlPath.value = config.value.url.substring(7)
68+
} else {
69+
urlPath.value = config.value.url
70+
}
71+
}
5272
return
5373
}
74+
5475
config.value = {
5576
type: IoTDataBridgeConfigType.HTTP,
5677
url: '',
57-
method: 'GET',
78+
method: 'POST',
5879
headers: {},
5980
query: {},
6081
body: ''
6182
}
62-
63-
// 初始化字符串形式
64-
headersStr.value = JSON.stringify(config.value.headers || {}, null, 2)
65-
queryStr.value = JSON.stringify(config.value.query || {}, null, 2)
6683
})
67-
68-
// 处理headers输入变化
69-
const handleHeadersChange = (val: string) => {
70-
try {
71-
config.value.headers = JSON.parse(val)
72-
} catch (e) {
73-
// 解析失败,保留原始字符串
74-
}
75-
}
76-
77-
// 处理query输入变化
78-
const handleQueryChange = (val: string) => {
79-
try {
80-
config.value.query = JSON.parse(val)
81-
} catch (e) {
82-
// 解析失败,保留原始字符串
83-
}
84-
}
8584
</script>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<template>
2+
<div v-for="(item, index) in items" :key="index" class="flex mb-2">
3+
<el-input v-model="item.key" class="mr-2" placeholder="" />
4+
<el-input v-model="item.value" placeholder="" />
5+
<el-button class="ml-2" text type="danger" @click="removeItem(index)">
6+
<el-icon>
7+
<Delete />
8+
</el-icon>
9+
删除
10+
</el-button>
11+
</div>
12+
<el-button text type="primary" @click="addItem">
13+
<el-icon>
14+
<Plus />
15+
</el-icon>
16+
{{ addButtonText }}
17+
</el-button>
18+
</template>
19+
20+
<script lang="ts" setup>
21+
import { Delete, Plus } from '@element-plus/icons-vue'
22+
import { isEmpty } from '@/utils/is'
23+
24+
defineOptions({ name: 'KeyValueEditor' })
25+
26+
interface KeyValueItem {
27+
key: string
28+
value: string
29+
}
30+
31+
const props = defineProps<{
32+
modelValue: Record<string, string>
33+
addButtonText: string
34+
}>()
35+
const emit = defineEmits(['update:modelValue'])
36+
// 内部key-value项列表
37+
const items = ref<KeyValueItem[]>([])
38+
39+
// 添加项目
40+
const addItem = () => {
41+
items.value.push({ key: '', value: '' })
42+
updateModelValue()
43+
}
44+
45+
// 移除项目
46+
const removeItem = (index: number) => {
47+
items.value.splice(index, 1)
48+
updateModelValue()
49+
}
50+
51+
// 更新modelValue
52+
const updateModelValue = () => {
53+
const result: Record<string, string> = {}
54+
items.value.forEach((item) => {
55+
if (item.key) {
56+
result[item.key] = item.value
57+
}
58+
})
59+
emit('update:modelValue', result)
60+
}
61+
62+
// 监听项目变化
63+
watch(items, updateModelValue, { deep: true })
64+
onMounted(() => {
65+
if (isEmpty(props.modelValue)) {
66+
return
67+
}
68+
69+
items.value = Object.entries(props.modelValue).map(([key, value]) => ({ key, value }))
70+
})
71+
</script>

0 commit comments

Comments
 (0)