HttpConfigForm.vue 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <el-form-item label="请求地址" prop="config.url">
  3. <el-input v-model="urlPath" placeholder="请输入请求地址">
  4. <template #prepend>
  5. <el-select v-model="urlPrefix" placeholder="Select" style="width: 115px">
  6. <!--suppress HttpUrlsUsage -->
  7. <el-option label="http://" value="http://" />
  8. <el-option label="https://" value="https://" />
  9. </el-select>
  10. </template>
  11. </el-input>
  12. </el-form-item>
  13. <el-form-item label="请求方法" prop="config.method">
  14. <el-select v-model="config.method" placeholder="请选择请求方法">
  15. <el-option label="GET" value="GET" />
  16. <el-option label="POST" value="POST" />
  17. <el-option label="PUT" value="PUT" />
  18. <el-option label="DELETE" value="DELETE" />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="请求头" prop="config.headers">
  22. <key-value-editor v-model="config.headers" add-button-text="添加请求头" />
  23. </el-form-item>
  24. <el-form-item label="请求参数" prop="config.query">
  25. <key-value-editor v-model="config.query" add-button-text="添加参数" />
  26. </el-form-item>
  27. <el-form-item label="请求体" prop="config.body">
  28. <el-input v-model="config.body" placeholder="请输入内容" type="textarea" />
  29. </el-form-item>
  30. </template>
  31. <script lang="ts" setup>
  32. import { HttpConfig, IotDataSinkTypeEnum } from '@/api/iot/rule/data/sink'
  33. import { useVModel } from '@vueuse/core'
  34. import { isEmpty } from '@/utils/is'
  35. import KeyValueEditor from './components/KeyValueEditor.vue'
  36. defineOptions({ name: 'HttpConfigForm' })
  37. const props = defineProps<{
  38. modelValue: any
  39. }>()
  40. const emit = defineEmits(['update:modelValue'])
  41. const config = useVModel(props, 'modelValue', emit) as Ref<HttpConfig>
  42. // noinspection HttpUrlsUsage
  43. /** URL处理 */
  44. const urlPrefix = ref('http://')
  45. const urlPath = ref('')
  46. const fullUrl = computed(() => {
  47. return urlPath.value ? urlPrefix.value + urlPath.value : ''
  48. })
  49. /** 监听 URL 变化 */
  50. watch([urlPrefix, urlPath], () => {
  51. config.value.url = fullUrl.value
  52. })
  53. /** 组件初始化 */
  54. onMounted(() => {
  55. if (!isEmpty(config.value)) {
  56. // 初始化 URL
  57. if (config.value.url) {
  58. if (config.value.url.startsWith('https://')) {
  59. urlPrefix.value = 'https://'
  60. urlPath.value = config.value.url.substring(8)
  61. } else if (config.value.url.startsWith('http://')) {
  62. urlPrefix.value = 'http://'
  63. urlPath.value = config.value.url.substring(7)
  64. } else {
  65. urlPath.value = config.value.url
  66. }
  67. }
  68. return
  69. }
  70. config.value = {
  71. type: IotDataSinkTypeEnum.HTTP + '', // 序列化成对应类型时使用
  72. url: '',
  73. method: 'POST',
  74. headers: {},
  75. query: {},
  76. body: ''
  77. }
  78. })
  79. </script>