HttpEditForm.vue 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. <template>
  2. <div
  3. class="inner-container"
  4. :element-loading-text="saveText"
  5. >
  6. <el-scrollbar class="data-set-scrollbar">
  7. <div class="header">
  8. <el-page-header class="bs-el-page-header">
  9. <template slot="content">
  10. <div class="page-header">
  11. <div class="page-header-left">
  12. {{ !isEdit ? 'HTTP数据集详情' : dataForm.id ? 'HTTP数据集编辑' : 'HTTP数据集新增' }}
  13. </div>
  14. <div class="page-header-right">
  15. <el-button
  16. class="bs-el-button-default"
  17. @click="openNewWindow('https://www.yuque.com/chuinixiongkou/bigscreen/groovy_dataset')"
  18. >
  19. 帮助
  20. </el-button>
  21. <el-button
  22. v-if="isEdit"
  23. type="primary"
  24. @click="save('form')"
  25. >
  26. 保存
  27. </el-button>
  28. <el-button
  29. class="bs-el-button-default"
  30. @click="goBack"
  31. >
  32. 返回
  33. </el-button>
  34. </div>
  35. </div>
  36. </template>
  37. </el-page-header>
  38. </div>
  39. <el-row style="margin: 16px 16px 0;">
  40. <el-col :span="isEdit ? 16 : 24">
  41. <el-form
  42. ref="form"
  43. :model="dataForm"
  44. :rules="rules"
  45. label-width="120px"
  46. style="padding: 16px 16px 0;"
  47. class="bs-el-form"
  48. >
  49. <el-row :gutter="20">
  50. <el-col :span="12">
  51. <el-form-item
  52. label="名称"
  53. prop="name"
  54. >
  55. <el-input
  56. v-model="dataForm.name"
  57. class="bs-el-input"
  58. clearable
  59. :disabled="!isEdit"
  60. />
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="12">
  64. <el-form-item
  65. label="分组"
  66. prop="typeId"
  67. >
  68. <el-select
  69. ref="selectParentName"
  70. v-model="dataForm.typeId"
  71. class="bs-el-select"
  72. popper-class="bs-el-select"
  73. placeholder="请选择分组"
  74. clearable
  75. :disabled="!isEdit"
  76. @clear="clearType"
  77. @visible-change="setCurrentNode"
  78. >
  79. <el-option
  80. style="height: auto;padding: 0;"
  81. :label="typeName"
  82. :value="dataForm.typeId"
  83. >
  84. <div class="tree-box">
  85. <el-tree
  86. ref="categorySelectTree"
  87. :data="categoryData"
  88. node-key="id"
  89. :indent="0"
  90. :props="{ label: 'name', children: 'children' }"
  91. :default-expand-all="true"
  92. :highlight-current="true"
  93. :expand-on-click-node="false"
  94. class="bs-el-tree"
  95. @node-click="selectParentCategory"
  96. >
  97. <span
  98. slot-scope="{ data }"
  99. class="custom-tree-node"
  100. >
  101. <span>
  102. <i
  103. :class="data.children && data.children.length ? 'el-icon el-icon-folder' : 'el-icon el-icon-document'"
  104. />
  105. {{ data.name }}
  106. </span>
  107. </span>
  108. </el-tree>
  109. </div>
  110. </el-option>
  111. </el-select>
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. <el-row :gutter="20">
  116. <el-col :span="12">
  117. <el-form-item
  118. label="描述"
  119. prop="remark"
  120. >
  121. <el-input
  122. v-model="dataForm.remark"
  123. class="bs-el-input"
  124. :disabled="!isEdit"
  125. />
  126. </el-form-item>
  127. </el-col>
  128. <el-col :span="12">
  129. <el-form-item
  130. label="调用方式"
  131. prop="labelIds"
  132. >
  133. <el-select
  134. v-model="dataForm.config.requestType"
  135. class="bs-el-select"
  136. popper-class="bs-el-select"
  137. >
  138. <el-option
  139. label="前台代理"
  140. value="front"
  141. />
  142. <el-option
  143. label="后台代理"
  144. value="back"
  145. />
  146. </el-select>
  147. </el-form-item>
  148. </el-col>
  149. </el-row>
  150. <el-row :gutter="20">
  151. <el-col :span="12">
  152. <el-form-item
  153. label="标签"
  154. prop="labelIds"
  155. >
  156. <LabelSelect
  157. :dataset-id="datasetId"
  158. :id-list="dataForm.labelIds"
  159. @commit="(ids) =>{dataForm.labelIds = ids}"
  160. />
  161. </el-form-item>
  162. </el-col>
  163. </el-row>
  164. <el-form-item
  165. label="请求类型"
  166. prop="config.method"
  167. >
  168. <el-radio-group
  169. v-model="dataForm.config.method"
  170. class="bs-radio-wrap"
  171. >
  172. <el-radio-button label="get">
  173. GET
  174. </el-radio-button>
  175. <el-radio-button label="post">
  176. POST
  177. </el-radio-button>
  178. </el-radio-group>
  179. </el-form-item>
  180. <el-form-item
  181. label="请求地址"
  182. prop="config.url"
  183. >
  184. <el-input
  185. v-model="dataForm.config.url"
  186. autocomplete="off"
  187. class="bs-el-input"
  188. placeholder="请输入静态请求地址或动态请求地址,动态请求地址必须以${baseUrl}开头"
  189. clearable
  190. />
  191. </el-form-item>
  192. <el-form-item
  193. label="请求头"
  194. prop="config.headers"
  195. >
  196. <el-button
  197. type="primary"
  198. @click="addHeader"
  199. >
  200. 增加
  201. </el-button>
  202. <el-row
  203. v-for="(item,index) in dataForm.config.headers"
  204. :key="index"
  205. :gutter="10"
  206. :span="21"
  207. >
  208. <el-col :span="5">
  209. <el-form-item
  210. label="键"
  211. :prop="'headers.'+index+'.key'"
  212. label-width="50px"
  213. :rules="rules.key"
  214. >
  215. <el-input
  216. v-model="dataForm.config.headers[index].key"
  217. placeholder="请输入键"
  218. clearable
  219. @blur="dataForm.config.headers[index].key = inputChange($event)"
  220. />
  221. </el-form-item>
  222. </el-col>
  223. <el-col :span="5">
  224. <el-form-item
  225. label="类型"
  226. :prop="'headers.'+index+'.type'"
  227. label-width="60px"
  228. :rules="rules.type"
  229. >
  230. <el-select
  231. v-model="dataForm.config.headers[index].type"
  232. filterable
  233. clearable
  234. allow-create
  235. default-first-option
  236. placeholder="请选择类型"
  237. >
  238. <el-option
  239. v-for="item in options"
  240. :key="item.value"
  241. :label="item.label"
  242. :value="item.value"
  243. />
  244. </el-select>
  245. </el-form-item>
  246. </el-col>
  247. <el-col :span="5">
  248. <el-form-item
  249. label="值"
  250. :prop="dataForm.config.headers[index].value"
  251. label-width="50px"
  252. >
  253. <el-input
  254. v-model="dataForm.config.headers[index].value"
  255. placeholder="请输入值"
  256. clearable
  257. @blur="dataForm.config.headers[index].value = inputChange($event)"
  258. />
  259. </el-form-item>
  260. </el-col>
  261. <el-col
  262. :span="2"
  263. style="text-align: center"
  264. >
  265. <el-button
  266. type="primary"
  267. @click="delHeader(index)"
  268. >
  269. 移除
  270. </el-button>
  271. </el-col>
  272. </el-row>
  273. </el-form-item>
  274. <el-form-item
  275. label="请求参数"
  276. prop="config.params"
  277. :rules="dataForm.config.method==='get'?rules.params:[{ required: false}]"
  278. >
  279. <el-button
  280. type="primary"
  281. @click="addParam"
  282. >
  283. 增加
  284. </el-button>
  285. <el-row
  286. v-for="(item,index) in dataForm.config.params"
  287. :key="index"
  288. :gutter="10"
  289. :span="21"
  290. >
  291. <el-col :span="7">
  292. <el-form-item
  293. label="键"
  294. :prop="'params.'+index+'.key'"
  295. label-width="50px"
  296. :rules="rules.key"
  297. >
  298. <el-input
  299. v-model="dataForm.config.params[index].key"
  300. placeholder="请输入键"
  301. clearable
  302. @blur="dataForm.config.params[index].key = inputChange($event)"
  303. />
  304. </el-form-item>
  305. </el-col>
  306. <el-col :span="7">
  307. <el-form-item
  308. label="值"
  309. :prop="dataForm.config.params[index].value"
  310. label-width="50px"
  311. >
  312. <el-input
  313. v-model="dataForm.config.params[index].value"
  314. placeholder="请输入值"
  315. clearable
  316. @blur="dataForm.config.params[index].value = inputChange($event)"
  317. />
  318. </el-form-item>
  319. </el-col>
  320. <el-col
  321. :span="2"
  322. style="text-align: center"
  323. >
  324. <el-button
  325. type="primary"
  326. @click="delParam(index)"
  327. >
  328. 移除
  329. </el-button>
  330. </el-col>
  331. </el-row>
  332. </el-form-item>
  333. <el-form-item
  334. label="请求脚本"
  335. prop="requestScript"
  336. >
  337. <codemirror
  338. v-model.trim="dataForm.config.requestScript"
  339. :options="codemirrorOption"
  340. class="code"
  341. />
  342. </el-form-item>
  343. <el-form-item
  344. v-if="dataForm.config.method === 'post'"
  345. label="请求体"
  346. prop="requestScript"
  347. >
  348. <el-input
  349. v-model="dataForm.config.body"
  350. class="bs-el-input"
  351. type="textarea"
  352. :autosize="{ minRows: 10, maxRows: 10}"
  353. clearable
  354. />
  355. </el-form-item>
  356. <el-form-item
  357. label="响应脚本"
  358. prop="responseScript"
  359. >
  360. <codemirror
  361. v-model.trim="dataForm.config.responseScript"
  362. :options="codemirrorOption"
  363. class="code"
  364. />
  365. </el-form-item>
  366. </el-form>
  367. <div
  368. v-if="isEdit"
  369. class="sql-config"
  370. >
  371. <div style="text-align: center; padding: 16px 0;">
  372. <el-button
  373. type="primary"
  374. @click="scriptExecute()"
  375. >
  376. 解析并执行
  377. </el-button>
  378. </div>
  379. </div>
  380. </el-col>
  381. <el-col
  382. v-if="isEdit"
  383. :span="8"
  384. >
  385. <div class="right-setting">
  386. <div class="paramConfig">
  387. <div class="title-style bs-title-style">
  388. 动态参数
  389. <el-button
  390. type="text"
  391. style="float: right;border: none;margin-top: -4px;"
  392. @click="$refs.paramsSettingDialog.open()"
  393. >
  394. 配置
  395. </el-button>
  396. </div>
  397. <div class="field-wrap bs-field-wrap bs-scrollbar">
  398. <div
  399. v-for="param in dataForm.config.paramsList"
  400. :key="param.name"
  401. class="field-item"
  402. @click="$refs.paramsSettingDialog.open()"
  403. >
  404. <span>{{ param.name }}</span>&nbsp;<span
  405. v-show="param.remark"
  406. style="color: #909399;"
  407. >
  408. ({{ param.remark }})
  409. </span>
  410. <el-button
  411. class="edit_field"
  412. type="text"
  413. style="float: right;border: none;margin-top: 2px;"
  414. @click="$refs.paramsSettingDialog.open()"
  415. >
  416. 配置
  417. </el-button>
  418. </div>
  419. </div>
  420. </div>
  421. <div class="structure">
  422. <div class="title-style bs-title-style">
  423. 输出字段
  424. <el-button
  425. type="text"
  426. style="float: right;border: none;margin-top: -4px;"
  427. @click="$refs.outputFieldDialog.open()"
  428. >
  429. 配置
  430. </el-button>
  431. </div>
  432. <div class="field-wrap bs-field-wrap bs-scrollbar">
  433. <div
  434. v-for="(field, key) in outputFieldList"
  435. :key="key"
  436. class="field-item"
  437. @click="$refs.outputFieldDialog.open()"
  438. >
  439. <span>{{ field.fieldName }}</span>&nbsp;
  440. <span
  441. v-show="field.fieldDesc"
  442. style="color: #909399;"
  443. >
  444. ({{ field.fieldDesc }})</span>
  445. <el-button
  446. class="edit_field"
  447. type="text"
  448. style="float: right;border: none;margin-top: 2px;"
  449. @click="$refs.outputFieldDialog.open()"
  450. >
  451. 配置
  452. </el-button>
  453. </div>
  454. </div>
  455. </div>
  456. </div>
  457. </el-col>
  458. </el-row>
  459. <div
  460. v-if="isEdit"
  461. class="dataPreView"
  462. style="margin-top: 12px;"
  463. >
  464. <div class="result-view">
  465. 数据预览
  466. </div>
  467. <div
  468. v-loading="tableLoading"
  469. class="bs-table-box is-Edit bs-scrollbar"
  470. >
  471. <el-table
  472. align="center"
  473. :data="dataPreviewList"
  474. max-height="400"
  475. :border="true"
  476. class="bs-el-table bs-scrollbar"
  477. >
  478. <el-table-column
  479. v-for="(value, key) in dataPreviewList[0]"
  480. :key="key"
  481. :label="key"
  482. align="center"
  483. show-overflow-tooltip
  484. :render-header="renderHeader"
  485. >
  486. <template slot-scope="scope">
  487. <span>{{ scope.row[key] }}</span>
  488. </template>
  489. </el-table-column>
  490. </el-table>
  491. </div>
  492. </div>
  493. <div
  494. v-if="!isEdit"
  495. class="dataPreView"
  496. >
  497. <el-tabs v-model="activeName">
  498. <el-tab-pane
  499. v-loading="tableLoading"
  500. label="数据预览"
  501. name="data"
  502. >
  503. <div class="bs-table-box">
  504. <el-table
  505. align="center"
  506. :data="dataPreviewList"
  507. max-height="400"
  508. :border="true"
  509. class="bs-el-table"
  510. >
  511. <el-table-column
  512. v-for="(value, key) in dataPreviewList[0]"
  513. :key="key"
  514. :label="key"
  515. align="center"
  516. show-overflow-tooltip
  517. :render-header="renderHeader"
  518. >
  519. <template slot-scope="scope">
  520. <span>{{ scope.row[key] }}</span>
  521. </template>
  522. </el-table-column>
  523. </el-table>
  524. </div>
  525. </el-tab-pane>
  526. <el-tab-pane
  527. v-loading="tableLoading"
  528. label="数据集结构"
  529. name="structure"
  530. >
  531. <div class="bs-table-box">
  532. <el-table
  533. max-height="400"
  534. :data="outputFieldList"
  535. :border="true"
  536. align="center"
  537. >
  538. <el-table-column
  539. align="center"
  540. show-overflow-tooltip
  541. prop="fieldName"
  542. label="字段值"
  543. />
  544. <el-table-column
  545. align="center"
  546. prop="fieldDesc"
  547. label="字段描述"
  548. >
  549. <template slot-scope="scope">
  550. <el-input
  551. v-if="isEdit"
  552. v-model="scope.row.fieldDesc"
  553. size="small"
  554. class="labeldsc bs-el-input"
  555. />
  556. <span v-else>{{ scope.row.fieldDesc }}</span>
  557. </template>
  558. </el-table-column>
  559. </el-table>
  560. </div>
  561. </el-tab-pane>
  562. </el-tabs>
  563. </div>
  564. <ParamsSettingDialog
  565. ref="paramsSettingDialog"
  566. :params-list="dataForm.config.paramsList"
  567. @saveParams="saveParams"
  568. />
  569. <OutputFieldDialog
  570. ref="outputFieldDialog"
  571. :output-field-list="outputFieldList"
  572. @setFieldList="(list) => { outputFieldList = list }"
  573. />
  574. </el-scrollbar>
  575. <FieldFillDialog
  576. ref="fieldFillDialog"
  577. @fieldDescFill="fieldDescFill"
  578. @fieldDescEdit="fieldDescEdit"
  579. @toSave="toSave"
  580. />
  581. </div>
  582. </template>
  583. <script>
  584. import LabelSelect from 'data-room-ui/DataSetLabelManagement/src/LabelSelect.vue'
  585. import ParamsSettingDialog from './JsComponents/ParamsSettingDialog.vue'
  586. import OutputFieldDialog from './JsComponents/OutputFieldDialog.vue'
  587. import FieldFillDialog from './JsComponents/FieldFillDialog.vue'
  588. import { nameCheckRepeat, datasetAdd, datasetUpdate, getDataset, getCategoryTree, datasetExecuteTest } from 'data-room-ui/js/utils/datasetConfigService'
  589. import { codemirror } from 'vue-codemirror'
  590. import 'codemirror/mode/javascript/javascript'
  591. import 'codemirror/lib/codemirror.css'
  592. import 'codemirror/theme/nord.css'
  593. import axiosFormatting from '../../js/utils/httpParamsFormatting'
  594. import _ from 'lodash'
  595. export default {
  596. name: 'HttpEditForm',
  597. components: {
  598. codemirror,
  599. FieldFillDialog,
  600. ParamsSettingDialog,
  601. OutputFieldDialog,
  602. LabelSelect
  603. },
  604. props: {
  605. config: {
  606. type: Object,
  607. default: () => { }
  608. },
  609. isEdit: {
  610. type: Boolean,
  611. default: false
  612. },
  613. datasetId: {
  614. type: String,
  615. default: null
  616. },
  617. typeId: {
  618. type: String,
  619. default: ''
  620. },
  621. appCode: {
  622. type: String,
  623. default: ''
  624. }
  625. },
  626. data () {
  627. const validateName = (rule, value, callback) => {
  628. nameCheckRepeat({
  629. id: this.datasetId,
  630. name: value,
  631. moduleCode: this.appCode
  632. }).then((r) => {
  633. if (r) {
  634. callback(new Error('数据集名称已存在'))
  635. } else {
  636. callback()
  637. }
  638. })
  639. }
  640. const validateUrl = (rule, value, callback) => {
  641. // eslint-disable-next-line no-template-curly-in-string
  642. if (value.startsWith('${baseUrl}/')) {
  643. callback()
  644. }
  645. const reg = /(https?|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/
  646. if (!reg.test(value)) {
  647. // eslint-disable-next-line no-template-curly-in-string
  648. callback(new Error('请输入正确的静态请求地址或动态请求地址,动态请求地址必须以${baseUrl}/开头'))
  649. } else {
  650. callback()
  651. }
  652. }
  653. return {
  654. options: [{
  655. value: 'string',
  656. label: '字符串'
  657. }, {
  658. value: 'boolean',
  659. label: '布尔值'
  660. }, {
  661. value: 'int',
  662. label: '数字'
  663. }, {
  664. value: 'date',
  665. label: '日期'
  666. }],
  667. dataForm: {
  668. id: '',
  669. name: '',
  670. typeId: '',
  671. remark: '',
  672. labelIds: [],
  673. config: {
  674. className: 'com.gccloud.dataset.entity.config.HttpDataSetConfig',
  675. requestType: '',
  676. method: 'get',
  677. url: '',
  678. headers: [],
  679. params: [],
  680. body: null,
  681. requestScript: null,
  682. responseScript: null
  683. }
  684. },
  685. rules: {
  686. name: [
  687. { required: true, message: '请输入数据集名称', trigger: 'blur' },
  688. { validator: validateName, trigger: 'blur' }
  689. ],
  690. typeId: [
  691. { required: true, message: '请选择分组', trigger: 'blur' }
  692. ],
  693. key: [{ required: true, message: '键不能为空', trigger: 'blur' }],
  694. type: [{ required: true, message: '类型不能为空', trigger: 'blur' }],
  695. 'config.method': [{ required: true, message: '请求类型不能为空', trigger: 'blur' }],
  696. 'config.url': [
  697. { required: true, message: '请求地址不能为空', trigger: 'blur' },
  698. { validator: validateUrl, trigger: 'blur' }
  699. ]
  700. },
  701. codemirrorOption: {
  702. mode: 'text/javascript',
  703. lineNumbers: true,
  704. lineWrapping: true,
  705. theme: 'nord',
  706. extraKey: { Ctrl: 'autocomplete' },
  707. hintOptions: {
  708. completeSingle: true
  709. }
  710. },
  711. activeName: 'data',
  712. dataPreviewList: [],
  713. outputFieldList: [],
  714. structurePreviewListCopy: [],
  715. typeName: '',
  716. categoryData: [],
  717. // fieldDescVisible: false,
  718. fieldsetVisible: false,
  719. paramsVisible: false,
  720. tableLoading: false,
  721. saveloading: false,
  722. saveText: '',
  723. // paramsListCopy: [],
  724. isSet: false, // 参数是否配置状态
  725. passTest: false,
  726. fieldDesc: null // 字段描述
  727. }
  728. },
  729. watch: {
  730. 'dataForm.config.script' (val) {
  731. if (!val) {
  732. this.passTest = false
  733. }
  734. }
  735. },
  736. mounted () {
  737. this.init()
  738. },
  739. methods: {
  740. async init () {
  741. this.categoryData = await getCategoryTree({ tableName: 'dataset', moduleCode: this.appCode })
  742. if (this.typeId) {
  743. this.dataForm.typeId = this.typeId
  744. this.$nextTick(() => {
  745. try {
  746. this.typeName = this.$refs.categorySelectTree.getNode(this.dataForm.typeId).data.name
  747. } catch (error) {
  748. console.error(error)
  749. }
  750. })
  751. }
  752. if (this.datasetId) {
  753. getDataset(this.datasetId).then(res => {
  754. const { id, name, typeId, remark, datasetType, moduleCode, editable, sourceId, config } = res
  755. const { script, paramsList, fieldDesc, fieldList } = config
  756. this.dataForm = { id, name, typeId, remark, datasetType, moduleCode, editable, sourceId, config: { script, paramsList } }
  757. this.fieldDesc = fieldDesc
  758. this.outputFieldList = fieldList
  759. this.scriptExecute(true)
  760. })
  761. }
  762. },
  763. // 保存数据集
  764. save (formName, nochecktosave = false) {
  765. // if (this.passTest === false) {
  766. // this.$message.error('请确保脚本不为空且执行通过')
  767. // return
  768. // }
  769. // if (!this.outputFieldList.length) {
  770. // this.$message.warning('该执行脚本未生成输出字段,请重新检查')
  771. // return
  772. // }
  773. // if (!nochecktosave) {
  774. // const temp = this.outputFieldList.some(item => {
  775. // return item.fieldDesc === '' || !item.hasOwnProperty('fieldDesc')
  776. // }) // true-存在为空
  777. // if (temp) {
  778. // this.$refs.fieldFillDialog.open()
  779. // // this.fieldDescVisible = true
  780. // return
  781. // }
  782. // }
  783. requestType: '',
  784. this.$refs[formName].validate((valid) => {
  785. if (valid) {
  786. this.saveloading = true
  787. this.saveText = '正在保存...'
  788. const { datasetId, dataForm, appCode, fieldDesc, outputFieldList } = this
  789. const form = {
  790. id: datasetId,
  791. name: dataForm.name,
  792. typeId: dataForm.typeId,
  793. remark: dataForm.remark,
  794. datasetType: 'http',
  795. moduleCode: appCode,
  796. editable: appCode ? 1 : 0,
  797. labelIds: dataForm.labelIds,
  798. config: {
  799. className: 'com.gccloud.dataset.entity.config.HttpDataSetConfig',
  800. method: dataForm.config.headers,
  801. url: dataForm.config.url,
  802. headers: dataForm.config.headers,
  803. params: dataForm.config.params,
  804. body: dataForm.config.body,
  805. requestScript: dataForm.config.requestScript,
  806. responseScript: dataForm.config.responseScript,
  807. fieldDesc,
  808. paramsList: dataForm.config.paramsList,
  809. fieldList: outputFieldList
  810. }
  811. }
  812. const datasetSave = this.dataForm.id === '' ? datasetAdd : datasetUpdate
  813. datasetSave(form).then(() => {
  814. this.$message.success('操作成功')
  815. this.$parent.init(false)
  816. this.$parent.setType = null
  817. this.saveloading = false
  818. this.saveText = ''
  819. this.goBack()
  820. }).catch(() => {
  821. this.saveloading = false
  822. this.saveText = ''
  823. })
  824. }
  825. })
  826. },
  827. // 增加header
  828. addHeader () {
  829. const header = { key: '', type: 'string', value: '', remark: '' }
  830. console.log(this.dataForm)
  831. this.dataForm.config.headers.push(_.cloneDeep(header))
  832. },
  833. // 移除header
  834. delHeader (index) {
  835. this.dataForm.config.headers.splice(index, 1)
  836. },
  837. // 增加请求参数
  838. addParam () {
  839. const param = { key: '', value: '', remark: '' }
  840. this.dataForm.config.params.push(_.cloneDeep(param))
  841. },
  842. // 移除请求参数
  843. delParam (index) {
  844. this.dataForm.config.params.splice(index, 1)
  845. },
  846. saveParams (val) {
  847. this.dataForm.config.paramsList = val
  848. },
  849. // 取消操作
  850. // cancelField () {
  851. // this.structurePreviewListCopy = cloneDeep(this.outputFieldList)
  852. // this.fieldsetVisible = false
  853. // },
  854. // 设置输出字段
  855. setField () {
  856. // this.outputFieldList = cloneDeep(this.structurePreviewListCopy)
  857. // if (this.outputFieldList.length) {
  858. // this.fieldDesc = {}
  859. // this.outputFieldList.forEach(key => {
  860. // this.fieldDesc[key.fieldName] = key.fieldDesc
  861. // })
  862. // } else {
  863. // this.fieldDesc = null
  864. // }
  865. // this.fieldsetVisible = false
  866. },
  867. // 字段值填充
  868. fieldDescFill () {
  869. this.fieldDesc = {}
  870. this.outputFieldList.forEach(field => {
  871. if (field.fieldDesc === '' || !field.hasOwnProperty('fieldDesc')) {
  872. field.fieldDesc = field.fieldName
  873. this.fieldDesc[field.fieldName] = field.fieldName
  874. } else {
  875. this.fieldDesc[field.fieldName] = field.fieldDesc
  876. }
  877. })
  878. this.save('form')
  879. this.$refs.fieldFillDialog.close()
  880. // this.fieldDescVisible = false
  881. },
  882. // 进入编辑
  883. fieldDescEdit () {
  884. this.$refs.fieldFillDialog.close()
  885. // this.fieldDescVisible = false
  886. this.fieldsetVisible = true
  887. },
  888. // 继续保存
  889. toSave () {
  890. this.fieldDesc = {}
  891. this.outputFieldList.forEach(field => {
  892. this.fieldDesc[field.fieldName] = field.fieldDesc
  893. })
  894. this.save('form', true)
  895. this.$refs.fieldFillDialog.close()
  896. // this.fieldDescVisible = false
  897. },
  898. // 字段描述构建及同步
  899. buildFieldDesc () {
  900. const fieldDesc = {}
  901. this.outputFieldList.forEach(field => {
  902. if (this.fieldDesc.hasOwnProperty(field.fieldName)) {
  903. field.fieldDesc = this.fieldDesc[field.fieldName]
  904. }
  905. fieldDesc[field.fieldName] = field.fieldDesc
  906. })
  907. this.fieldDesc = fieldDesc
  908. },
  909. // 执行配置好的接口
  910. scriptExecute (isInit = false) {
  911. // 如果是前端代理,则自行组装接口及参数并调接口
  912. if (this.dataForm.config.requestType === 'front') {
  913. axiosFormatting({ ...this.dataForm.config }).then((res) => {
  914. console.log(res)
  915. })
  916. } else {
  917. // 如果是后端代理,则将配置传到后端
  918. const script = JSON.stringify(this.dataForm.config)
  919. const executeParams = {
  920. script,
  921. params: this.dataForm.paramsList,
  922. dataSetType: 'http'
  923. }
  924. datasetExecuteTest(executeParams).then(res => {
  925. }).catch((e) => {
  926. })
  927. }
  928. },
  929. // 清空分类
  930. clearType () {
  931. this.typeName = ''
  932. this.dataForm.typeId = ''
  933. },
  934. // 分类展开高亮
  935. setCurrentNode ($event) {
  936. if ($event) {
  937. const key = this.dataForm.typeId || null
  938. this.$refs.categorySelectTree.setCurrentKey(key)
  939. }
  940. },
  941. // 分类选择
  942. selectParentCategory (value) {
  943. this.dataForm.typeId = value.id
  944. this.typeName = value.name
  945. this.$refs.selectParentName.blur()
  946. },
  947. goBack () {
  948. this.$emit('back')
  949. },
  950. renderHeader (h, { column, index }) {
  951. const labelLong = column.label.length // 表头label长度
  952. const size = 14 // 根据需要定义标尺,直接使用字体大小确定就行,也可以根据需要定义
  953. column.minWidth = labelLong * size < 120 ? 120 : labelLong * size // 根据label长度计算该表头最终宽度
  954. return h('span', { class: 'cell-content', style: { width: '100%' } }, [column.label])
  955. },
  956. openNewWindow (url) {
  957. window.open(url, '_blank')
  958. }
  959. }
  960. }
  961. </script>
  962. <style lang="scss" scoped>
  963. @import '../../assets/style/bsTheme.scss';
  964. .data-set-scrollbar {
  965. height: 100%;
  966. overflow-y: auto;
  967. overflow-x: none;
  968. .el-scrollbar__view {
  969. height: 100%;
  970. }
  971. }
  972. ::v-deep .el-input__inner {
  973. width: 100% !important;
  974. }
  975. .page-header {
  976. display: flex;
  977. position: relative;
  978. .page-header-right {
  979. position: absolute;
  980. right: 16px;
  981. }
  982. }
  983. .sql-config {
  984. padding: 0 16px;
  985. }
  986. .operation {
  987. ::v-deep .el-select {
  988. width: 200px !important;
  989. margin-right: 16px;
  990. }
  991. display: flex;
  992. }
  993. ::v-deep .CodeMirror {
  994. height: 180px !important;
  995. font-family: Helvetica, Tahoma;
  996. }
  997. .no-border {
  998. border: 0;
  999. }
  1000. ::v-deep .fieldDescCheck {
  1001. .el-dialog__body {
  1002. height: fit-content !important;
  1003. min-height: unset !important;
  1004. }
  1005. }
  1006. .title-style {
  1007. padding: 8px 12px;
  1008. background-color: #f6f7fb;
  1009. border-left: 5px solid var(--bs-el-color-primary);
  1010. margin: 16px 16px 0 0;
  1011. }
  1012. .field-wrap {
  1013. // max-height: 110px;
  1014. overflow: auto;
  1015. margin-right: 16px;
  1016. cursor: pointer;
  1017. .field-item {
  1018. line-height: 32px;
  1019. padding: 0 12px 0 16px;
  1020. .edit_field {
  1021. display: none;
  1022. }
  1023. &:hover {
  1024. background-color: #f2f7fe;
  1025. .edit_field {
  1026. display: block;
  1027. }
  1028. }
  1029. }
  1030. }
  1031. .right-setting {
  1032. height: 358px;
  1033. overflow: hidden;
  1034. display: flex;
  1035. flex-direction: column;
  1036. .paramConfig {
  1037. max-height: 179px;
  1038. .field-wrap {
  1039. max-height: 127px;
  1040. }
  1041. }
  1042. .structure {
  1043. flex: 1;
  1044. overflow: hidden;
  1045. .field-wrap {
  1046. height: calc(100% - 40px);
  1047. }
  1048. }
  1049. }
  1050. .result-view {
  1051. font-size: 14px;
  1052. font-weight: 600;
  1053. color: var(--bs-el-text);
  1054. position: relative;
  1055. padding: 16px 0;
  1056. padding-left: 12px;
  1057. border-bottom: 1px solid var(--bs-background-1);
  1058. &::before {
  1059. content: "";
  1060. height: 14px;
  1061. position: absolute;
  1062. left: 0;
  1063. top: 50%;
  1064. transform: translateY(-50%);
  1065. border-left: 4px solid var(--bs-el-color-primary);
  1066. }
  1067. }
  1068. ::v-deep .bs-table-box.is-Edit .el-table {
  1069. max-height: unset !important;
  1070. .el-table__body-wrapper {
  1071. max-height: unset !important;
  1072. }
  1073. }
  1074. .bs-table-box {
  1075. padding: 0;
  1076. height: 100% !important;
  1077. margin-bottom: 0 !important;
  1078. }
  1079. .tree-box {
  1080. padding: 0;
  1081. }
  1082. </style>