IoTDataBridgeForm.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <template>
  2. <Dialog v-model="dialogVisible" :title="dialogTitle">
  3. <el-form
  4. ref="formRef"
  5. v-loading="formLoading"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="120px"
  9. >
  10. <el-form-item label="桥梁名称" prop="name">
  11. <el-input v-model="formData.name" placeholder="请输入桥梁名称" />
  12. </el-form-item>
  13. <el-form-item label="桥梁方向" prop="direction">
  14. <el-radio-group v-model="formData.direction">
  15. <el-radio
  16. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_DATA_BRIDGE_DIRECTION_ENUM)"
  17. :key="dict.value"
  18. :label="dict.value"
  19. >
  20. {{ dict.label }}
  21. </el-radio>
  22. </el-radio-group>
  23. </el-form-item>
  24. <el-form-item label="桥梁类型" prop="type">
  25. <el-radio-group :model-value="formData.type" @change="handleTypeChange">
  26. <el-radio
  27. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_DATA_BRIDGE_TYPE_ENUM)"
  28. :key="dict.value"
  29. :label="dict.value"
  30. >
  31. {{ dict.label }}
  32. </el-radio>
  33. </el-radio-group>
  34. </el-form-item>
  35. <HttpConfigForm v-if="showConfig(IoTDataBridgeConfigType.HTTP)" v-model="formData.config" />
  36. <MqttConfigForm v-if="showConfig(IoTDataBridgeConfigType.MQTT)" v-model="formData.config" />
  37. <RocketMQConfigForm
  38. v-if="showConfig(IoTDataBridgeConfigType.ROCKETMQ)"
  39. v-model="formData.config"
  40. />
  41. <KafkaMQConfigForm
  42. v-if="showConfig(IoTDataBridgeConfigType.KAFKA)"
  43. v-model="formData.config"
  44. />
  45. <RabbitMQConfigForm
  46. v-if="showConfig(IoTDataBridgeConfigType.RABBITMQ)"
  47. v-model="formData.config"
  48. />
  49. <RedisStreamConfigForm
  50. v-if="showConfig(IoTDataBridgeConfigType.REDIS_STREAM)"
  51. v-model="formData.config"
  52. />
  53. <el-form-item label="桥梁状态" prop="status">
  54. <el-radio-group v-model="formData.status">
  55. <el-radio
  56. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  57. :key="dict.value"
  58. :label="dict.value"
  59. >
  60. {{ dict.label }}
  61. </el-radio>
  62. </el-radio-group>
  63. </el-form-item>
  64. <el-form-item label="桥梁描述" prop="description">
  65. <el-input v-model="formData.description" height="150px" type="textarea" />
  66. </el-form-item>
  67. </el-form>
  68. <template #footer>
  69. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  70. <el-button @click="dialogVisible = false">取 消</el-button>
  71. </template>
  72. </Dialog>
  73. </template>
  74. <script lang="ts" setup>
  75. import { DICT_TYPE, getDictObj, getIntDictOptions } from '@/utils/dict'
  76. import { CommonStatusEnum } from '@/utils/constants'
  77. import {
  78. DataBridgeApi,
  79. DataBridgeVO,
  80. IoTDataBridgeConfigType,
  81. IotDataBridgeDirectionEnum
  82. } from '@/api/iot/rule/databridge'
  83. import {
  84. HttpConfigForm,
  85. KafkaMQConfigForm,
  86. MqttConfigForm,
  87. RabbitMQConfigForm,
  88. RedisStreamConfigForm,
  89. RocketMQConfigForm
  90. } from './config'
  91. /** IoT 数据桥梁的表单 */
  92. defineOptions({ name: 'IoTDataBridgeForm' })
  93. const { t } = useI18n() // 国际化
  94. const message = useMessage() // 消息弹窗
  95. const dialogVisible = ref(false) // 弹窗的是否展示
  96. const dialogTitle = ref('') // 弹窗的标题
  97. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  98. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  99. const formData = ref<DataBridgeVO>({
  100. status: CommonStatusEnum.ENABLE,
  101. direction: IotDataBridgeDirectionEnum.INPUT,
  102. type: IoTDataBridgeConfigType.HTTP,
  103. config: {} as any
  104. })
  105. const formRules = reactive({
  106. // 通用字段
  107. name: [{ required: true, message: '桥梁名称不能为空', trigger: 'blur' }],
  108. status: [{ required: true, message: '桥梁状态不能为空', trigger: 'blur' }],
  109. direction: [{ required: true, message: '桥梁方向不能为空', trigger: 'blur' }],
  110. type: [{ required: true, message: '桥梁类型不能为空', trigger: 'change' }],
  111. // HTTP 配置
  112. 'config.url': [{ required: true, message: '请求地址不能为空', trigger: 'blur' }],
  113. 'config.method': [{ required: true, message: '请求方法不能为空', trigger: 'blur' }],
  114. // MQTT 配置
  115. 'config.username': [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
  116. 'config.password': [{ required: true, message: '密码不能为空', trigger: 'blur' }],
  117. 'config.clientId': [{ required: true, message: '客户端ID不能为空', trigger: 'blur' }],
  118. 'config.topic': [{ required: true, message: '主题不能为空', trigger: 'blur' }],
  119. // RocketMQ 配置
  120. 'config.nameServer': [{ required: true, message: 'NameServer 地址不能为空', trigger: 'blur' }],
  121. 'config.accessKey': [{ required: true, message: 'AccessKey 不能为空', trigger: 'blur' }],
  122. 'config.secretKey': [{ required: true, message: 'SecretKey 不能为空', trigger: 'blur' }],
  123. 'config.group': [{ required: true, message: '消费组不能为空', trigger: 'blur' }],
  124. // Kafka 配置
  125. 'config.bootstrapServers': [{ required: true, message: '服务地址不能为空', trigger: 'blur' }],
  126. 'config.ssl': [{ required: true, message: 'SSL 配置不能为空', trigger: 'change' }],
  127. // RabbitMQ 配置
  128. 'config.host': [{ required: true, message: '主机地址不能为空', trigger: 'blur' }],
  129. 'config.port': [
  130. { required: true, message: '端口不能为空', trigger: 'blur' },
  131. { type: 'number', min: 1, max: 65535, message: '端口号范围 1-65535', trigger: 'blur' }
  132. ],
  133. 'config.virtualHost': [{ required: true, message: '虚拟主机不能为空', trigger: 'blur' }],
  134. 'config.exchange': [{ required: true, message: '交换机不能为空', trigger: 'blur' }],
  135. 'config.routingKey': [{ required: true, message: '路由键不能为空', trigger: 'blur' }],
  136. 'config.queue': [{ required: true, message: '队列不能为空', trigger: 'blur' }],
  137. // Redis Stream 配置
  138. 'config.database': [
  139. { required: true, message: '数据库索引不能为空', trigger: 'blur' },
  140. { type: 'number', min: 0, message: '数据库索引必须是非负整数', trigger: 'blur' }
  141. ]
  142. })
  143. const formRef = ref() // 表单 Ref
  144. const showConfig = computed(() => (val: number) => {
  145. const dict = getDictObj(DICT_TYPE.IOT_DATA_BRIDGE_TYPE_ENUM, formData.value.type)
  146. return dict && dict.value + '' === val + ''
  147. }) // 显示对应的 Config 配置项
  148. /** 打开弹窗 */
  149. const open = async (type: string, id?: number) => {
  150. dialogVisible.value = true
  151. dialogTitle.value = t('action.' + type)
  152. formType.value = type
  153. resetForm()
  154. // 修改时,设置数据
  155. if (id) {
  156. formLoading.value = true
  157. try {
  158. formData.value = await DataBridgeApi.getDataBridge(id)
  159. } finally {
  160. formLoading.value = false
  161. }
  162. }
  163. }
  164. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  165. /** 提交表单 */
  166. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  167. const submitForm = async () => {
  168. // 校验表单
  169. await formRef.value.validate()
  170. // 提交请求
  171. formLoading.value = true
  172. try {
  173. const data = formData.value as unknown as DataBridgeVO
  174. if (formType.value === 'create') {
  175. await DataBridgeApi.createDataBridge(data)
  176. message.success(t('common.createSuccess'))
  177. } else {
  178. await DataBridgeApi.updateDataBridge(data)
  179. message.success(t('common.updateSuccess'))
  180. }
  181. dialogVisible.value = false
  182. // 发送操作成功的事件
  183. emit('success')
  184. } finally {
  185. formLoading.value = false
  186. }
  187. }
  188. /** 处理类型切换事件 */
  189. const handleTypeChange = (val: number) => {
  190. formData.value.type = val
  191. // 切换类型时重置配置
  192. formData.value.config = {} as any
  193. }
  194. /** 重置表单 */
  195. const resetForm = () => {
  196. formData.value = {
  197. status: CommonStatusEnum.ENABLE,
  198. direction: IotDataBridgeDirectionEnum.INPUT,
  199. type: IoTDataBridgeConfigType.HTTP,
  200. config: {} as any
  201. }
  202. formRef.value?.resetFields()
  203. }
  204. </script>