forwardRule.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. <template>
  2. <a-card>
  3. <a-row justify="space-between" >
  4. <a-col :span="18" >
  5. <a-form style="width: 100%;" :label-col="{span: 5}" >
  6. <a-row style="width: 100%" :gutter="[8, 8]" >
  7. <a-col :span="6" >
  8. <a-form-item label="规则ID" >
  9. <a-input v-model:value="queryParams.ruleId" ></a-input>
  10. </a-form-item>
  11. </a-col>
  12. <a-col :span="6">
  13. <a-form-item label="规则名称" >
  14. <a-input v-model:value="queryParams.ruleLabel" ></a-input>
  15. </a-form-item>
  16. </a-col>
  17. <a-col :span="6" >
  18. <a-form-item label="数据来源" >
  19. <a-select allowClear v-model:value="queryParams.subjectResource" >
  20. <a-select-option
  21. v-for="item in subjectResourceList"
  22. :key="item.key"
  23. :value="item.value"
  24. >
  25. {{item.name}}
  26. </a-select-option>
  27. </a-select>
  28. </a-form-item>
  29. </a-col>
  30. <a-col :span="6" >
  31. <a-form-item label="触发事件" >
  32. <a-select allowClear v-model:value="queryParams.subjectEvent" >
  33. <a-select-option
  34. v-for="item in subjectEventList"
  35. :key="item.key"
  36. :value="item.value"
  37. >
  38. {{item.name}}
  39. </a-select-option>
  40. </a-select>
  41. </a-form-item>
  42. </a-col>
  43. <a-col :span="6" >
  44. <a-form-item label="状态" >
  45. <a-select allowClear v-model:value="queryParams.status" >
  46. <a-select-option
  47. v-for="item in statusList"
  48. :key="item.key"
  49. :value="item.value"
  50. >
  51. {{item.name}}
  52. </a-select-option>
  53. </a-select>
  54. </a-form-item>
  55. </a-col>
  56. </a-row>
  57. </a-form>
  58. </a-col>
  59. <a-col>
  60. <a-space>
  61. <a-button type="primary" @click="search">搜索</a-button>
  62. <a-button type="primary" @click="openModal('add', {})" >创建规则</a-button>
  63. </a-space>
  64. </a-col>
  65. </a-row>
  66. <a-table
  67. style="margin-top: 20px;"
  68. :columns="columns"
  69. :data-source="state.dataSource"
  70. :loading="state.loading"
  71. :pagination="queryParams"
  72. @change="changePage"
  73. >
  74. <template #bodyCell="{column, record}" >
  75. <template v-if="column.key === 'subjectResource'" >
  76. {{RuleController.SubjectResourceMap.get(record.subjectResource)?.name}}
  77. </template>
  78. <template v-if="column.key === 'subjectEvent'" >
  79. {{RuleController.SubjectEventMap.get(record.subjectEvent)?.name}}
  80. </template>
  81. <template v-if="column.key === 'status'" >
  82. <a-switch
  83. v-model:checked="record.status"
  84. checked-children="运行中"
  85. un-checked-children="已停止"
  86. @click="changeStatus(record)"
  87. />
  88. </template>
  89. <template v-if="column.key === 'action'" >
  90. <a-space>
  91. <a @click="openDetailModal(record.id)">详情</a>
  92. <a @click="openModal('update', record)">编辑</a>
  93. <a-popconfirm
  94. title="确实要删除吗?"
  95. ok-text="确定"
  96. cancel-text="取消"
  97. @confirm="delForwardRule(record.id)"
  98. >
  99. <a>删除</a>
  100. </a-popconfirm>
  101. </a-space>
  102. </template>
  103. </template>
  104. </a-table>
  105. </a-card>
  106. <!-- 创建规则 -->
  107. <modal-pro
  108. width="1000px"
  109. label="创建规则"
  110. :visible="state.visible"
  111. @cancel="state.visible = false"
  112. @ok="ok('visible')"
  113. >
  114. <a-steps :current="state.stepCount">
  115. <a-step title="设置转发数据" ></a-step>
  116. <a-step title="设置转发目标" />
  117. </a-steps>
  118. <div style="margin: 20px 0px;" >
  119. <div v-if="state.stepCount === 0" >针对部分类型数据提供的快速配置,将引导您完成简单的业务设置。您也可以直接编辑过滤语句,实现更复杂的查询要求</div>
  120. <div v-else-if="state.stepCount === 1" >您可以设置将数据转发至华为云其他服务或私有服务器。</div>
  121. </div>
  122. <form-pro
  123. v-if="state.stepCount == 0"
  124. validate
  125. :formProps="formProps"
  126. ref="formProo"
  127. />
  128. <div v-if="state.stepCount == 1" >
  129. <a-row>
  130. <a-col>
  131. <a-space>
  132. <a-button type="primary" @click="addForwardState">添加</a-button>
  133. </a-space>
  134. </a-col>
  135. </a-row>
  136. <a-table
  137. style="margin-top: 20px;"
  138. v-if="forwardRuleTargets.length "
  139. :columns="forwardRuleTargetsColumns"
  140. :data-source="forwardRuleTargets"
  141. size="middle"
  142. >
  143. <template #bodyCell="{column, record, index}" >
  144. <template v-if="column.key === 'action'" >
  145. <a-space>
  146. <!-- <a @click="updateForwardRuleTargets(record, index)">编辑</a> -->
  147. <a @click="forwardRuleTargets.splice(index, 1)">删除</a>
  148. </a-space>
  149. </template>
  150. </template>
  151. </a-table>
  152. <a-empty v-else :image="Empty.PRESENTED_IMAGE_SIMPLE" />
  153. </div>
  154. <!-- <div v-if="state.stepCount == 2" >
  155. <a-button @click="addForwardRule" >启动规则</a-button>
  156. </div> -->
  157. </modal-pro>
  158. <modal-pro
  159. style="width: 800px"
  160. label="转发目标"
  161. :visible="state.targetVisible"
  162. :ok-text=" state.stepCount === 0 ? '下一步' : '确定'"
  163. @cancel="state.targetVisible = false"
  164. @ok="ok('targetVisible')"
  165. >
  166. <a-form :label-col="{span: 4 }" :wrapper-col="{ span: 14 }" style="height: 600px; overflow-y: auto;">
  167. <a-form-item label="转发目标">
  168. <a-select
  169. style="width: 100%;"
  170. v-model:value="forwardState.targetType"
  171. >
  172. <a-select-option
  173. v-for="item in forwardTatget"
  174. :key="item.key"
  175. :value="item.key"
  176. >
  177. {{item.name}}
  178. </a-select-option>
  179. </a-select>
  180. </a-form-item>
  181. <span v-if="forwardState.targetType === 'HTTP'" >
  182. <a-form-item label="地址" v-bind="validateInfos.endpointUrl">
  183. <a-input v-model:value="forwardState.endpointUrl" placeholder="请填写http地址" />
  184. </a-form-item>
  185. <a-form-item label="方法" v-bind="validateInfos.requestMethod">
  186. <a-select
  187. style="width: 100%;"
  188. v-model:value="forwardState.requestMethod"
  189. >
  190. <a-select-option
  191. v-for="item in HttpRequestMethods"
  192. :key="item.key"
  193. :value="item.key"
  194. >
  195. {{item.name}}
  196. </a-select-option>
  197. </a-select>
  198. </a-form-item>
  199. <a-form-item label="超时时间" v-bind="validateInfos.defaultTimeout">
  200. <a-input-number id="inputNumber" v-model:value="forwardState.defaultTimeout" />
  201. </a-form-item>
  202. <a-form-item label="请求头" v-bind="validateInfos.requestHeaders">
  203. <a-input-group style="margin-top: 10px;" size="large" v-for="(item, index) in forwardState.requestHeaders" :key="index">
  204. <a-row :gutter="8">
  205. <a-col :span="5">
  206. <a-input style="height: 30px;" v-model:value="item.key" placeholder="key" />
  207. </a-col>
  208. <a-col :span="8">
  209. <a-input style="height: 30px;" v-model:value="item.value" placeholder="value" />
  210. </a-col>
  211. <a-col>
  212. <a-button type="link" danger @click="forwardState.requestHeaders.splice(index, 1)" >删除</a-button>
  213. </a-col>
  214. </a-row>
  215. </a-input-group>
  216. <a-button style="margin-top: 20px;" @click="addRequestHeaders('requestHeaders')" type="primary" >添加参数</a-button>
  217. </a-form-item>
  218. </span>
  219. <span v-if="forwardState.targetType === 'KAFKA'" >
  220. <a-form-item label="主题" v-bind="validateInfos.topic" >
  221. <a-input placeholder="请填写主题" v-model:value="forwardState.topic" ></a-input>
  222. </a-form-item>
  223. <a-form-item label="地址" v-bind="validateInfos.topic" >
  224. <a-input placeholder="请填写地址" v-model:value="forwardState.bootstrapServers" ></a-input>
  225. </a-form-item>
  226. <a-form-item label="acks" v-bind="validateInfos.acks" >
  227. <a-input placeholder="请填写acks" v-model:value="forwardState.acks" disabled ></a-input>
  228. </a-form-item>
  229. <a-form-item label="重试次数" v-bind="validateInfos.retries" >
  230. <a-input placeholder="请填写重试次数" v-model:value="forwardState.retries"></a-input>
  231. </a-form-item>
  232. <a-form-item label="batchSize" v-bind="validateInfos.batchSize" >
  233. <a-input placeholder="请填写batchSize" v-model:value="forwardState.batchSize"></a-input>
  234. </a-form-item>
  235. <a-form-item label="linger" v-bind="validateInfos.linger" >
  236. <a-input placeholder="请填写linger" v-model:value="forwardState.linger"></a-input>
  237. </a-form-item>
  238. <a-form-item label="bufferMemory" v-bind="validateInfos.bufferMemory" >
  239. <a-input placeholder="请填写bufferMemory" v-model:value="forwardState.bufferMemory"></a-input>
  240. </a-form-item>
  241. <a-form-item label="keySerializer" v-bind="validateInfos.keySerializer" >
  242. <a-input placeholder="请填写keySerializer" v-model:value="forwardState.keySerializer"></a-input>
  243. </a-form-item>
  244. <a-form-item label="valueSerializer" v-bind="validateInfos.valueSerializer" >
  245. <a-input placeholder="请填写valueSerializer" v-model:value="forwardState.valueSerializer"></a-input>
  246. </a-form-item>
  247. <a-form-item label="其他参数">
  248. <a-input-group style="margin-top: 10px;" size="large" v-for="(item, index) in forwardState.otherProperties" :key="index">
  249. <a-row :gutter="8">
  250. <a-col :span="5">
  251. <a-input style="height: 30px;" v-model:value="item.key" placeholder="key" />
  252. </a-col>
  253. <a-col :span="8">
  254. <a-input style="height: 30px;" v-model:value="item.value" placeholder="value" />
  255. </a-col>
  256. <a-col>
  257. <a-button type="link" danger @click="forwardState.otherProperties.splice(index, 1)" >删除</a-button>
  258. </a-col>
  259. </a-row>
  260. </a-input-group>
  261. <a-button style="margin-top: 20px;" @click="addRequestHeaders('otherProperties')" type="primary" >添加参数</a-button>
  262. </a-form-item>
  263. </span>
  264. <span v-if="forwardState.targetType === 'MQTT'" >
  265. <a-form-item label="主题" v-bind="validateInfos.topic" >
  266. <a-input placeholder="请填写主题" v-model:value="forwardState.topic" ></a-input>
  267. </a-form-item>
  268. <a-form-item label="broker服务器" v-bind="validateInfos.broker" >
  269. <a-input placeholder="请填写broker服务器" v-model:value="forwardState.broker" ></a-input>
  270. </a-form-item>
  271. <a-form-item label="连接超时时间" v-bind="validateInfos.connectTimeout" >
  272. <a-input-number placeholder="请填写连接超时时间" v-model:value="forwardState.connectTimeout" ></a-input-number>
  273. </a-form-item>
  274. <a-form-item label="客户端ID" v-bind="validateInfos.clientId" >
  275. <a-input-number placeholder="请填写客户端ID" v-model:value="forwardState.clientId" ></a-input-number>
  276. </a-form-item>
  277. <a-form-item label="保留消息" >
  278. <a-switch v-model:checked="forwardState.retainedMessage" checked-children="保留" un-checked-children="不保留" />
  279. </a-form-item>
  280. <a-form-item label="清除Session" >
  281. <a-switch v-model:checked="forwardState.cleanSession" checked-children="清除" un-checked-children="不清除" />
  282. </a-form-item>
  283. <a-form-item label="qos" v-bind="validateInfos.qos" >
  284. <a-input placeholder="请填写qos" v-model:value="forwardState.qos" ></a-input>
  285. </a-form-item>
  286. <a-form-item label="用户名" v-bind="validateInfos.userName">
  287. <a-input placeholder="请填写用户名" v-model:value="forwardState.userName" ></a-input>
  288. </a-form-item>
  289. <a-form-item label="密码" v-bind="validateInfos.password" >
  290. <a-input placeholder="请填写密码" v-model:value="forwardState.password" ></a-input>
  291. </a-form-item>
  292. </span>
  293. <span v-if="forwardState.targetType === 'RABBIT'" >
  294. <a-form-item label="exchangeName" v-bind="validateInfos.exchangeName">
  295. <a-input v-model:value="forwardState.exchangeName" placeholder="请填写交换名" />
  296. </a-form-item>
  297. <a-form-item label="路由密钥" v-bind="validateInfos.routingKey">
  298. <a-input v-model:value="forwardState.routingKey" placeholder="请填写路由密钥" />
  299. </a-form-item>
  300. <a-form-item label="消息属性" v-bind="validateInfos.messageProperties">
  301. <a-input v-model:value="forwardState.messageProperties" placeholder="请填写消息属性" />
  302. </a-form-item>
  303. <a-form-item label="域名" v-bind="validateInfos.host">
  304. <a-input v-model:value="forwardState.host" placeholder="请填写域名" />
  305. </a-form-item>
  306. <a-form-item label="端口" v-bind="validateInfos.port">
  307. <a-input v-model:value="forwardState.port" placeholder="请填写端口" />
  308. </a-form-item>
  309. <a-form-item label="虚拟主机" v-bind="validateInfos.virtualHost">
  310. <a-input v-model:value="forwardState.virtualHost" placeholder="请填写虚拟主机" />
  311. </a-form-item>
  312. <a-form-item label="自动恢复" >
  313. <a-switch v-model:checked="forwardState.automaticRecoveryEnabled" checked-children="启用" un-checked-children="未启用" />
  314. </a-form-item>
  315. <a-form-item label="连接超时" >
  316. <a-input v-model:value="forwardState.connectionTimeout" placeholder="请填写连接超时时间" />
  317. </a-form-item>
  318. <a-form-item label="握手超时" >
  319. <a-input v-model:value="forwardState.handshakeTimeout" placeholder="请填写握手超时" />
  320. </a-form-item>
  321. <a-form-item label="用户名" v-bind="validateInfos.userName">
  322. <a-input placeholder="请填写用户名" v-model:value="forwardState.userName" ></a-input>
  323. </a-form-item>
  324. <a-form-item label="密码" v-bind="validateInfos.password" >
  325. <a-input placeholder="请填写密码" v-model:value="forwardState.password" ></a-input>
  326. </a-form-item>
  327. </span>
  328. </a-form>
  329. </modal-pro>
  330. <modal-pro
  331. style="width: 1000px"
  332. label="详情"
  333. :visible="state.detailVisible"
  334. @cancel="state.detailVisible = false"
  335. @ok="state.detailVisible = false"
  336. >
  337. <a-form :label-col="{span: 2}" style="height: 600px;overflow: hidden;overflow-y: scroll;">
  338. <a-form-item label="规则名称"> {{detailForwardRef.ruleLabel}} </a-form-item>
  339. <a-form-item label="数据来源"> {{RuleController.SubjectResourceMap.get(detailForwardRef.subjectResource)?.name}} </a-form-item>
  340. <a-form-item label="触发事件"> {{RuleController.SubjectEventMap.get(detailForwardRef.subjectEvent)?.name}} </a-form-item>
  341. <a-form-item label="状态"> {{detailForwardRef.status ? '运行中' : '已停止'}} </a-form-item>
  342. <a-form-item label="HTTP">
  343. <a-table
  344. :columns="detailColumn['HTTP']"
  345. :data-source="detailHTTPList"
  346. :pagination="false"
  347. />
  348. </a-form-item>
  349. <a-form-item label="Kafka">
  350. <a-table
  351. :columns="detailColumn['Kafka']"
  352. :data-source="detailKAFKAList"
  353. :pagination="false"
  354. >
  355. </a-table>
  356. </a-form-item>
  357. <a-form-item label="MQTT">
  358. <a-table
  359. :columns="detailColumn['MQTT']"
  360. :data-source="detailMQTTList"
  361. :pagination="false"
  362. >
  363. </a-table>
  364. </a-form-item>
  365. <a-form-item label="RabbitMQ">
  366. <a-table
  367. :columns="detailColumn['RabbitMQ']"
  368. :data-source="detailRABBITList"
  369. :pagination="false"
  370. >
  371. </a-table>
  372. </a-form-item>
  373. </a-form>
  374. </modal-pro>
  375. </template>
  376. <script lang='ts' setup >
  377. import { onMounted, reactive, ref } from 'vue'
  378. import { RuleController } from '@/controller/index'
  379. import type { FormItemProps } from '@/components/FormPro/index.vue'
  380. import { Form, Empty } from 'ant-design-vue'
  381. import { computed } from '@vue/reactivity'
  382. const columns = [
  383. {
  384. title: '规则名称',
  385. dataIndex: 'ruleLabel'
  386. },
  387. {
  388. title: '规则ID',
  389. dataIndex: 'id'
  390. },
  391. {
  392. title: '数据来源',
  393. dataIndex: 'subjectResource',
  394. key: 'subjectResource'
  395. },
  396. {
  397. title: '触发事件',
  398. dataIndex: 'subjectEvent',
  399. key: 'subjectEvent'
  400. },
  401. {
  402. title: '状态',
  403. dataIndex: 'status',
  404. key: 'status'
  405. },
  406. {
  407. title: '操作',
  408. dataIndex: 'action',
  409. key: 'action'
  410. }
  411. ]
  412. const formProps: FormItemProps[] = [
  413. {
  414. label: '规则名称',
  415. key: 'ruleLabel',
  416. type: 'input',
  417. rules: true,
  418. value: ''
  419. },
  420. {
  421. label: '数据来源',
  422. key: 'subjectResource',
  423. type: 'select',
  424. rules: true,
  425. value: '',
  426. request: async () => await Array.from(RuleController.SubjectResourceMap, ([key, value]) => ({ ...value, value: value.key }))
  427. },
  428. {
  429. label: '触发事件',
  430. key: 'subjectEvent',
  431. type: 'select',
  432. rules: true,
  433. value: '',
  434. request: async () => await Array.from(RuleController.SubjectEventMap, ([key, value]) => ({ ...value, value: value.key }))
  435. },
  436. {
  437. label: '规则描述',
  438. key: 'ruleDescription',
  439. type: 'textarea',
  440. rules: false,
  441. value: ''
  442. }
  443. ]
  444. const formPropsSearch: FormItemProps[] = [
  445. {
  446. label: '规则名称',
  447. key: 'ruleLabel',
  448. type: 'input',
  449. rules: false,
  450. value: ''
  451. },
  452. {
  453. label: '规则ID',
  454. key: 'ruleId',
  455. type: 'input',
  456. rules: false,
  457. value: ''
  458. },
  459. {
  460. label: '数据来源',
  461. key: 'subjectResource',
  462. type: 'select',
  463. rules: false,
  464. request: async () => await Array.from(RuleController.SubjectResourceMap, ([key, value]) => ({ ...value, value: value.key }))
  465. },
  466. {
  467. label: '触发事件',
  468. key: 'subjectEvent',
  469. type: 'select',
  470. rules: false,
  471. request: async () => await Array.from(RuleController.SubjectEventMap, ([key, value]) => ({ ...value, value: value.key }))
  472. },
  473. {
  474. label: '状态',
  475. key: 'status',
  476. type: 'select',
  477. rules: false,
  478. request: async () => {
  479. const getData = () => {
  480. return [
  481. { name: '所有状态', key: '', value: '' },
  482. { name: '运行中', key: 'status', value: true },
  483. { name: '未启动', key: 'status', value: false }
  484. ]
  485. }
  486. return await getData()
  487. }
  488. }
  489. ]
  490. const forwardRuleTargetsColumns = [
  491. {
  492. title: '转发目标',
  493. dataIndex: 'targetType'
  494. },
  495. {
  496. title: '操作',
  497. dataIndex: 'action',
  498. key: 'action'
  499. }
  500. ]
  501. const forwardTatget = [
  502. { name: 'RabbitMQ', key: 'RABBIT' },
  503. { name: 'Kafka', key: 'KAFKA' },
  504. { name: 'HTTP编码', key: 'HTTP' },
  505. { name: 'MQTT', key: 'MQTT' }
  506. ]
  507. const HttpRequestMethods = [
  508. { name: 'GET', key: 'GET' },
  509. { name: 'POST', key: 'POST' },
  510. { name: 'PUT', key: 'PUT' }
  511. ]
  512. const subjectResourceList = Array.from(RuleController.SubjectResourceMap, ([key, value]) => ({ ...value, value: value.key }))
  513. const subjectEventList = Array.from(RuleController.SubjectEventMap, ([key, value]) => ({ ...value, value: value.key }))
  514. const statusList = [
  515. { name: '所有状态', key: '', value: '' },
  516. { name: '运行中', key: 'status', value: true },
  517. { name: '未启动', key: 'status', value: false }
  518. ]
  519. const detailColumn = reactive({
  520. HTTP: [
  521. { title: 'http地址', dataIndex: 'endpointUrl' },
  522. { title: 'requestMethod', dataIndex: '请求方法' },
  523. { title: 'defaultTimeout', dataIndex: '超时时间' },
  524. { title: 'requestHeaders', dataIndex: '请求头' }
  525. ],
  526. Kafka: [
  527. { title: '主题', dataIndex: 'topic' },
  528. { title: '地址', dataIndex: 'bootstrapServers' },
  529. { title: 'acks', dataIndex: 'acks' },
  530. { title: '重试', dataIndex: 'retries' },
  531. { title: 'batchSize', dataIndex: 'batchSize' },
  532. { title: 'linger', dataIndex: 'linger' },
  533. { title: 'bufferMemory', dataIndex: 'bufferMemory' },
  534. { title: 'keySerializer', dataIndex: 'keySerializer' },
  535. { title: 'valueSerializer', dataIndex: 'valueSerializer' },
  536. { title: '其他属性', dataIndex: 'otherProperties' }
  537. ],
  538. MQTT: [
  539. { title: '主题', dataIndex: 'topic' },
  540. { title: 'broker服务器', dataIndex: 'broker' },
  541. { title: '连接超时时间', dataIndex: 'connectTimeout' },
  542. { title: 'clientId', dataIndex: 'clientId' },
  543. { title: 'retainedMessage', dataIndex: 'retainedMessage' },
  544. { title: 'cleanSession', dataIndex: 'cleanSession' },
  545. { title: 'qos', dataIndex: 'qos' },
  546. { title: '用户名', dataIndex: 'userName' },
  547. { title: '密码', dataIndex: 'password' }
  548. ],
  549. RabbitMQ: [
  550. { title: '主题', dataIndex: 'exchangeName' },
  551. { title: '路由密钥', dataIndex: 'routingKey' },
  552. { title: '消息属性', dataIndex: 'messageProperties' },
  553. { title: '域名', dataIndex: 'host' },
  554. { title: '端口', dataIndex: 'port' },
  555. { title: '虚拟主机', dataIndex: 'virtualHost' },
  556. { title: '自动恢复', dataIndex: 'automaticRecoveryEnabled' },
  557. { title: '连接超时', dataIndex: 'connectionTimeout' },
  558. { title: '握手超时', dataIndex: 'handshakeTimeout' },
  559. { title: '用户名', dataIndex: 'userName' },
  560. { title: '密码', dataIndex: 'password' }
  561. ]
  562. })
  563. const useForm = Form.useForm
  564. const formProo = ref('')
  565. let queryParams = reactive({
  566. page: 1,
  567. pageSize: 10,
  568. total: 0,
  569. ruleId: '',
  570. ruleLabel: '',
  571. status: '',
  572. subjectEvent: '',
  573. subjectResource: ''
  574. })
  575. const state = reactive({
  576. loading: false,
  577. dataSource: [],
  578. visible: false,
  579. targetVisible: false,
  580. detailVisible: false,
  581. stepCount: 0,
  582. opraState: 'add',
  583. forwardId: ''
  584. })
  585. const requestHeader = { key: '', value: '' }
  586. const detailForwardRef = ref<Partial<IOT.API.RULE.ForwardRule>>({})
  587. const detailHTTPList = computed(() => detailForwardRef.value && detailForwardRef.value.forwardRuleTargets ? detailForwardRef.value.forwardRuleTargets!.filter(item => item.targetType === 'HTTP') : [])
  588. const detailRABBITList = computed(() => detailForwardRef.value && detailForwardRef.value.forwardRuleTargets ? detailForwardRef.value.forwardRuleTargets!.filter(item => item.targetType === 'RABBIT') : [])
  589. const detailKAFKAList = computed(() => detailForwardRef.value && detailForwardRef.value.forwardRuleTargets ? detailForwardRef.value.forwardRuleTargets!.filter(item => item.targetType === 'KAFKA') : [])
  590. const detailMQTTList = computed(() => detailForwardRef.value && detailForwardRef.value.forwardRuleTargets ? detailForwardRef.value.forwardRuleTargets!.filter(item => item.targetType === 'MQTT') : [])
  591. const initForwardState = {
  592. targetType: '',
  593. endpointUrl: '',
  594. requestMethod: 'GET',
  595. defaultTimeout: 6,
  596. requestHeaders: [],
  597. topic: '',
  598. bootstrapServers: '',
  599. acks: '-1',
  600. retries: '0',
  601. batchSize: '65535',
  602. linger: '0',
  603. bufferMemory: '33554432',
  604. keySerializer: '',
  605. valueSerializer: '',
  606. otherProperties: [],
  607. broker: '',
  608. connectTimeout: '',
  609. clientId: '',
  610. retainedMessage: false,
  611. cleanSession: false,
  612. qos: '',
  613. userName: '',
  614. password: '',
  615. exchangeName: '',
  616. routingKey: '',
  617. messageProperties: '',
  618. host: '',
  619. port: '',
  620. virtualHost: '/',
  621. automaticRecoveryEnabled: false,
  622. connectionTimeout: 60000,
  623. handshakeTimeout: 10000
  624. }
  625. const forwardR1Ref = ref()
  626. let forwardState = reactive(JSON.parse(JSON.stringify(initForwardState)))
  627. const forwardRuleState = reactive({
  628. HTTP: {
  629. endpointUrl: [{ required: true, message: '请填写http地址' }],
  630. requestMethod: [{ required: true, message: '请填写请求方法' }],
  631. defaultTimeout: [{ required: true, message: '请填写超时时间' }],
  632. requestHeaders: [{ required: true, message: '请填写请求头参数' }]
  633. },
  634. KAFKA: {
  635. topic: [{ required: true, message: '请填写主题' }],
  636. bootstrapServers: [{ required: true, message: '请填写地址' }],
  637. acks: [{ required: true, message: '请填写acks' }],
  638. retries: [{ required: true, message: '请填写retries' }],
  639. batchSize: [{ required: true, message: '请填写batchSize' }],
  640. linger: [{ required: true, message: '请填写linger' }],
  641. bufferMemory: [{ required: true, message: '请填写bufferMemory' }],
  642. keySerializer: [{ required: true, message: '请填写keySerializer' }],
  643. valueSerializer: [{ required: true, message: '请填写valueSerializer' }]
  644. },
  645. RABBIT: {
  646. exchangeName: [{ required: true, message: '请填写交换名' }],
  647. routingKey: [{ required: true, message: '请填写路由密钥' }],
  648. messageProperties: [{ required: true, message: '请填写消息属性' }],
  649. host: [{ required: true, message: '请填写域名' }],
  650. port: [{ required: true, message: 'port' }],
  651. virtualHost: [{ required: true, message: 'virtualHost' }],
  652. automaticRecoveryEnabled: [{ required: true, message: 'automaticRecoveryEnabled' }],
  653. connectionTimeout: [{ required: true, message: 'connectionTimeout' }],
  654. handshakeTimeout: [{ required: true, message: 'handshakeTimeout' }]
  655. },
  656. MQTT: {
  657. topic: [{ required: true, message: '请填写主题' }],
  658. broker: [{ required: true, message: '请填写broker服务器' }],
  659. connectTimeout: [{ required: true, message: '请填写连接超时时间' }],
  660. clientId: [{ required: true, message: '请填写客户端id' }],
  661. qos: [{ required: true, message: '请填写qos' }],
  662. userName: [{ required: true, message: '请填写用户名' }],
  663. password: [{ required: true, message: '请填写密码' }]
  664. }
  665. })
  666. let forwardRuleTargets = reactive([])
  667. const forwardRuleStateComputed = computed(() => forwardState.targetType === '' ? {} : forwardRuleState[forwardState.targetType])
  668. const { resetFields, validate, validateInfos } = useForm(forwardState, forwardRuleStateComputed)
  669. const changePage = ({ current }) => {
  670. queryParams.page = current
  671. getForwardList()
  672. }
  673. const openDetailModal = async (id: string) => {
  674. state.detailVisible = true
  675. const { data } = await RuleController.forwardById(id)
  676. detailForwardRef.value = data
  677. console.log('detailForwardRef.value :', detailForwardRef.value)
  678. // const _forwardRuleTargets = data.forwardRuleTargets
  679. }
  680. const openModal = async (opraState: 'add' | 'update', record) => {
  681. state.opraState = opraState
  682. if (opraState === 'update') {
  683. state.forwardId = record.id
  684. const { data } = await RuleController.forwardById(record.id)
  685. formProps[0].value = data.ruleLabel
  686. formProps[1].value = data.subjectResource
  687. formProps[2].value = data.subjectEvent
  688. formProps[3].value = data.ruleDescription
  689. const _forwardRuleTargets = data.forwardRuleTargets
  690. _forwardRuleTargets.forEach(item => {
  691. const _requestHeaders = item.requestHeaders
  692. ? Object.keys(item.requestHeaders).map(key => {
  693. return {
  694. key: key,
  695. value: item!.requestHeaders[key]
  696. }
  697. })
  698. : []
  699. const _otherProperties = item.otherProperties
  700. ? Object.keys(item.otherProperties).map(key => {
  701. return {
  702. key: key,
  703. value: item!.otherProperties[key]
  704. }
  705. })
  706. : []
  707. item.requestHeaders = _requestHeaders
  708. item.otherProperties = _otherProperties
  709. })
  710. console.log('_forwardRuleTargets:', _forwardRuleTargets)
  711. forwardRuleTargets = reactive(JSON.parse(JSON.stringify(_forwardRuleTargets)))
  712. }
  713. state.visible = true
  714. }
  715. const addRequestHeaders = (key: 'requestHeaders' | 'otherProperties') => forwardState[key].push({ ...requestHeader })
  716. const search = (record) => {
  717. console.log('search', record)
  718. queryParams = { ...queryParams, ...record }
  719. getForwardList()
  720. }
  721. const addForwardState = () => {
  722. state.targetVisible = true
  723. }
  724. const changeStatus = async (record) => RuleController.updateForwardStatus({ id: record.id, status: record.status })
  725. /** 提交转发规则 */
  726. const ok = async (visibleKey: string) => {
  727. if (state.stepCount === 1) {
  728. if (state.targetVisible) {
  729. validate().then(() => {
  730. console.log('forwardState:', forwardState)
  731. forwardRuleTargets.push({ ...forwardState })
  732. forwardState = reactive(JSON.parse(JSON.stringify(initForwardState)))
  733. state.targetVisible = false
  734. })
  735. } else {
  736. const _otherProperties: Record<string, string> = {}
  737. forwardRuleTargets.forEach(item => {
  738. const _requestHeaders: Record<string, string> = {}
  739. const _otherProperties: Record<string, string> = {}
  740. item.requestHeaders.forEach(item => {
  741. _requestHeaders[item.key] = item.value
  742. })
  743. item.requestHeaders = _requestHeaders
  744. item.otherProperties.forEach(item => {
  745. _otherProperties[item.key] = item.value
  746. })
  747. item.otherProperties = _otherProperties
  748. })
  749. forwardState.otherProperties.forEach(item => {
  750. _otherProperties[item.key] = item.value
  751. })
  752. if (state.opraState === 'add') {
  753. await RuleController.postForward({ ...forwardR1Ref.value, forwardRuleTargets })
  754. } else {
  755. await RuleController.updateForward({ ...forwardR1Ref.value, forwardRuleTargets, id: state.forwardId })
  756. }
  757. state.visible = false
  758. getForwardList()
  759. }
  760. }
  761. if (state.stepCount === 0) {
  762. const r1 = await formProo.value.onSubmit()
  763. if (r1) {
  764. state.stepCount = 1
  765. forwardR1Ref.value = r1
  766. }
  767. }
  768. }
  769. const delForwardRule = async (id: string) => {
  770. await RuleController.delForwardRule(id)
  771. getForwardList()
  772. }
  773. const getForwardList = async () => {
  774. state.loading = true
  775. const { data, sum } = await RuleController.pageForward(queryParams)
  776. state.loading = false
  777. state.dataSource = data
  778. queryParams.total = sum
  779. }
  780. onMounted(() => {
  781. getForwardList()
  782. })
  783. </script>
  784. <style lang='less' scoped >
  785. </style>