dataJi.vue 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103
  1. <template>
  2. <div style="width: 99%;display: flex;margin-left: 1%;background-color:#F5F8F9;;">
  3. <el-card style="width: 18%;height: 100%;overflow: auto;height: 85vh;background-color: white;overflow-x: hidden;" shadow="never">
  4. <template #header>
  5. <div class="card-header" style="display: flex;align-items: center;justify-content: space-between;">
  6. <span>目录:</span>
  7. </div>
  8. </template>
  9. <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft"
  10. :data="data" @node-click="handleNodeClick" node-key="id" style="margin-left: -10%;margin-top: 0%;width: 120%;background-color: transparent;" default-expand-all :key="valueKet">
  11. <template #default="{ node, data }">
  12. <span style="justify-content: space-between;display: flex;width: 30%;align-items: center;margin-left: 1%;">
  13. <div class="custom-tree-node" style="align-items: center;line-height: 1.5;">
  14. <svg-icon icon-class="model" v-if="data.nodeType=='SET'"/>
  15. <svg-icon icon-class="model2" v-if="data.nodeType=='TREE'"/>
  16. <span style="font-size: 1rem;">{{ node.label }}</span>
  17. </div>
  18. <div style="margin-right: 1%;position: absolute;left:90%;">
  19. <el-dropdown trigger="hover" @click.stop v-if="currentNodeKey === data.id">
  20. <!-- <el-icon class="el-icon--right" style="color: black;">
  21. <plus />
  22. </el-icon> -->
  23. <svg-icon icon-class="zhankai"/>
  24. <template #dropdown>
  25. <el-dropdown-menu>
  26. <el-dropdown-item style="display: flex;" @click="add1Level">
  27. <el-icon class="el-icon--right" style="color: black;">
  28. <CirclePlus />
  29. </el-icon>
  30. <div>
  31. 添加同级
  32. </div>
  33. </el-dropdown-item>
  34. <el-dropdown-item style="display: flex;" @click="addNextLevel">
  35. <el-icon class="el-icon--right" style="color: black;">
  36. <Connection />
  37. </el-icon>
  38. <div>
  39. 新建下级
  40. </div>
  41. </el-dropdown-item>
  42. <divider/>
  43. <el-dropdown-item style="display: flex;" @click="delAll" divided>
  44. <el-icon class="el-icon--right" style="color: black;">
  45. <CircleClose />
  46. </el-icon>
  47. <div>
  48. 删除节点
  49. </div>
  50. </el-dropdown-item>
  51. </el-dropdown-menu>
  52. </template>
  53. </el-dropdown>
  54. </div>
  55. </span>
  56. </template>
  57. </el-tree>
  58. </el-card>
  59. <div style="width: 80%;margin-left: 1%;background-color: white;">
  60. <div style="display: flex;justify-content: space-between;width: 100%;align-items: center;margin-left: 0%;padding: 1%;">
  61. <div style="display: flex;width: 50%;align-items: center;">
  62. <div>
  63. 名称
  64. </div>
  65. <el-input size="mini" v-model="dcName" style="width: 30%;margin-left: 1%;"/>
  66. <el-button type="primary" @click="getTable" size="mini" style="margin-left:1%;">查询</el-button>
  67. </div>
  68. <el-button type="primary" @click="showAdd" size="mini" style="margin-left:1%;" :disabled="!parTree">新增</el-button>
  69. </div>
  70. <el-table
  71. :data="tableData"
  72. style="width: 99%;margin-left: 1%;margin-top: 0.5%;"
  73. :cell-style="{ padding:'5px' }"
  74. :header-cell-style="{height: heightAll*0.01+'px',}"
  75. :row-style="{ fontSize: '16px',textAlign:'center'}"
  76. border
  77. :height="tableheight">
  78. <el-table-column type="index" label="序号" width="80"></el-table-column>
  79. <el-table-column prop="dcName" label="名称:">
  80. </el-table-column>
  81. <el-table-column prop="dcType" label="分类"/>
  82. <el-table-column prop="dcNote" label="说明"/>>
  83. <el-table-column prop="address" label="操作" width="250">
  84. <template #default="scope">
  85. <div style="display: flex;justify-content: space-between;width: 100%;">
  86. <el-button type="primary" @click="showPei(scope.row)" size="mini" text style="margin-left: 0%;">数据项配置</el-button>
  87. <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left:0%;">编辑</el-button>
  88. <el-button @click="delRow(scope.row)" type="danger" text size="mini" style="margin-left: 0%;">删除</el-button>
  89. </div>
  90. </template>
  91. </el-table-column>
  92. </el-table>
  93. <div style="float: right;margin-top: 0.5%;margin-right: 1%;">
  94. <!-- <el-pagination
  95. small
  96. v-model='currentPage'
  97. @current-change="changePage"
  98. background
  99. layout="prev, pager, next"
  100. :total="total"
  101. class="mt-4"
  102. /> -->
  103. </div>
  104. </div>
  105. </div>
  106. <el-dialog :title="title" @close="clearForm" v-model="dialogVisible" title="" width="30%" destroy-on-close :key="tableKey">
  107. <el-form :label-width="140" label-position="right" :disabled="isEdit" style="margin-left: 5%;margin-top: 2%;" :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
  108. <el-form-item label="数据集中文名:" prop="dcName" style="">
  109. <el-input v-model="formZu.dcName" style="width: 75%;" placeholder="" resize="none"/>
  110. </el-form-item>
  111. <el-form-item label="数据集说明:" prop="dcNote" style="">
  112. <el-input v-model="formZu.dcNote" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
  113. </el-form-item>
  114. <el-form-item label="数据集类型:" prop="dcType" style="">
  115. <el-select
  116. v-model="formZu.dcType"
  117. class="noBorSel"
  118. placeholder=""
  119. style="width: 75%;margin-left: 0%;"
  120. >
  121. <el-option
  122. v-for="item in optionsShuLei"
  123. :key="item.value"
  124. :label="item.label"
  125. :value="item.value"
  126. />
  127. </el-select>
  128. </el-form-item>
  129. <el-form-item label="排序:" prop="dcSort">
  130. <el-input-number v-model="formZu.dcSort" :min="1" style="width: 50%;"/>
  131. </el-form-item>
  132. </el-form>
  133. <template #footer>
  134. <span class="dialog-footer">
  135. <el-button size="mini" @click="dialogVisible = false">取消</el-button>
  136. <el-button v-if="isAddTa" type="primary" @click="addTa" size="mini">
  137. 提交
  138. </el-button>
  139. <el-button v-if="!isAddTa" type="primary" @click="saveEditTa" size="mini">
  140. 提交
  141. </el-button>
  142. </span>
  143. </template>
  144. </el-dialog>
  145. <el-dialog @close="" v-model="dialogVisibleTree" title="sql配置管理" width="60%" destroy-on-close :key="tableKey" @opened="refreshEditor">
  146. <div style="display: flex;align-items: center;width: 100%;">
  147. <div>
  148. 数据源:
  149. </div>
  150. <div style="width: 15%;">
  151. <el-select
  152. v-model="valueDs"
  153. size="mini"
  154. style="width: 100%;margin-left: 1%;"
  155. >
  156. <el-option
  157. v-for="item in optionsDs"
  158. :key="item.value"
  159. :label="item.label"
  160. :value="item.value"
  161. />
  162. </el-select>
  163. </div>
  164. </div>
  165. <div style="border: solid 1px #e9e9eb;margin-top:1%;">
  166. <Codemirror
  167. v-model:value="code"
  168. :options="cmOptions"
  169. height="100px"
  170. ref="cmRef"
  171. style="margin-top: 0%;"
  172. />
  173. </div>
  174. <div style="margin-top:0%;">
  175. <div style="display: flex;justify-content: space-between;align-items: center;">
  176. </div>
  177. <el-button style="margin-top: 2%;left: 92%;z-index:555;position: absolute;" type="info" plain size="mini">测试</el-button>
  178. <el-tabs
  179. v-model="activeName"
  180. type="card"
  181. class="demo-tabs"
  182. style="margin-top: 2%;"
  183. @tab-click="handleClick"
  184. >
  185. <el-tab-pane label="参数" name="first">
  186. <div style="display: flex;width: 100%;margin-top: 0%;">
  187. <el-button @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增字段</el-button>
  188. </div>
  189. <el-table
  190. style="margin-top: 1%;width: 98%;"
  191. :data="tableDataCanAdd"
  192. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  193. :header-cell-style="{ textAlign: 'center'}"
  194. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  195. border >
  196. <el-table-column prop="itemName" label="字段编码" width="200">
  197. <template #default="scope">
  198. <el-input placeholder="(必填)" type="primary" class="noBor" v-model="scope.row.fieldCode" size="mini" text style="margin-left: 0%;"></el-input>
  199. </template>
  200. </el-table-column>
  201. <el-table-column prop="itemName" label="字段名称">
  202. <template #default="scope">
  203. <div style="width: 100%;">
  204. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.fieldName" size="mini" text style="margin-left: 0%;"></el-input>
  205. </div>
  206. </template>
  207. </el-table-column>
  208. <el-table-column prop="itemName" label="字段类型">
  209. <template #default="scope">
  210. <div style="width: 100%;">
  211. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.metaType" size="mini" text style="margin-left: 0%;"></el-input>
  212. </div>
  213. </template>
  214. </el-table-column>
  215. <el-table-column prop="itemName" label="长度" >
  216. <template #default="scope">
  217. <div style="width: 100%;">
  218. <el-input type="primary" class="noBor" v-model="scope.row.fieldLength" size="mini" text style="margin-left: 0%;"></el-input>
  219. </div>
  220. </template>
  221. </el-table-column>
  222. <el-table-column prop="itemName" label="默认值" >
  223. <template #default="scope">
  224. <div style="width: 100%;">
  225. <el-input type="primary" class="noBor" v-model="scope.row.fieldDefault" size="mini" text style="margin-left: 0%;"></el-input>
  226. </div>
  227. </template>
  228. </el-table-column>
  229. <el-table-column prop="itemName" label="说明" >
  230. <template #default="scope">
  231. <div style="width: 100%;">
  232. <el-input type="primary" class="noBor" v-model="scope.row.fieldDesc" size="mini" text style="margin-left: 0%;"></el-input>
  233. </div>
  234. </template>
  235. </el-table-column>
  236. <el-table-column prop="itemName" label="主键" width="80">
  237. <template #default="scope">
  238. <div style="width: 100%;">
  239. <el-checkbox v-model="scope.row.fieldIspri" label="" size="large" />
  240. </div>
  241. </template>
  242. </el-table-column>
  243. <el-table-column prop="address" label="操作" width="100">
  244. <template #default="scope">
  245. <div style="width: 100%;">
  246. <el-button type="danger" @click="delCanAdd(scope.$index)" size="mini" text style="margin-left: 0%;">删除</el-button>
  247. </div>
  248. </template>
  249. </el-table-column>
  250. </el-table>
  251. </el-tab-pane>
  252. <el-tab-pane label="结果集" name="second">
  253. <div style="display: flex;width: 100%;margin-top: 0%;">
  254. <el-button @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增字段</el-button>
  255. </div>
  256. <el-table
  257. style="margin-top: 1%;width: 98%;"
  258. :data="tableDataCanAdd"
  259. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  260. :header-cell-style="{ textAlign: 'center'}"
  261. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  262. border >
  263. <el-table-column prop="itemName" label="字段编码" width="200">
  264. <template #default="scope">
  265. <el-input placeholder="(必填)" type="primary" class="noBor" v-model="scope.row.fieldCode" size="mini" text style="margin-left: 0%;"></el-input>
  266. </template>
  267. </el-table-column>
  268. <el-table-column prop="itemName" label="字段名称">
  269. <template #default="scope">
  270. <div style="width: 100%;">
  271. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.fieldName" size="mini" text style="margin-left: 0%;"></el-input>
  272. </div>
  273. </template>
  274. </el-table-column>
  275. <el-table-column prop="itemName" label="字段类型">
  276. <template #default="scope">
  277. <div style="width: 100%;">
  278. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.metaType" size="mini" text style="margin-left: 0%;"></el-input>
  279. </div>
  280. </template>
  281. </el-table-column>
  282. <el-table-column prop="itemName" label="长度" >
  283. <template #default="scope">
  284. <div style="width: 100%;">
  285. <el-input type="primary" class="noBor" v-model="scope.row.fieldLength" size="mini" text style="margin-left: 0%;"></el-input>
  286. </div>
  287. </template>
  288. </el-table-column>
  289. <el-table-column prop="itemName" label="默认值" >
  290. <template #default="scope">
  291. <div style="width: 100%;">
  292. <el-input type="primary" class="noBor" v-model="scope.row.fieldDefault" size="mini" text style="margin-left: 0%;"></el-input>
  293. </div>
  294. </template>
  295. </el-table-column>
  296. <el-table-column prop="itemName" label="说明" >
  297. <template #default="scope">
  298. <div style="width: 100%;">
  299. <el-input type="primary" class="noBor" v-model="scope.row.fieldDesc" size="mini" text style="margin-left: 0%;"></el-input>
  300. </div>
  301. </template>
  302. </el-table-column>
  303. <el-table-column prop="itemName" label="主键" width="80">
  304. <template #default="scope">
  305. <div style="width: 100%;">
  306. <el-checkbox v-model="scope.row.fieldIspri" label="" size="large" />
  307. </div>
  308. </template>
  309. </el-table-column>
  310. <el-table-column prop="address" label="操作" width="100">
  311. <template #default="scope">
  312. <div style="width: 100%;">
  313. <el-button type="danger" @click="delCanAdd(scope.$index)" size="mini" text style="margin-left: 0%;">删除</el-button>
  314. </div>
  315. </template>
  316. </el-table-column>
  317. </el-table>
  318. </el-tab-pane>
  319. <el-tab-pane label="预览" name="third">
  320. <div style="overflow: auto;height: 20vh;margin-top: -1%;">
  321. <el-input placeholder="" :rows="8" type="textarea" v-model="JsonAdd" size="mini" text style="margin-top: 1%;width: 98%;" ></el-input>
  322. </div>
  323. </el-tab-pane>
  324. </el-tabs>
  325. <div>
  326. </div>
  327. </div>
  328. <template #footer>
  329. <span class="dialog-footer">
  330. <el-button size="mini" @click="dialogVisibleTree = false">取消</el-button>
  331. <el-button type="primary" @click="addPei" size="mini">
  332. 提交
  333. </el-button>
  334. </span>
  335. </template>
  336. </el-dialog>
  337. <el-dialog @close="clearForm" v-model="dialogVisibleData" title="新增数据项" width="30%" destroy-on-close :key="tableKey">
  338. <el-form :label-width="100" label-position="right" :disabled="isEdit" style="margin-left: 5%;margin-top: 2%;" :model="formTree" class="demo-form-inline" ref="formRefTree" :rules="rulesTree">
  339. <el-form-item label="名称:" prop="itemName" style="">
  340. <el-input v-model="formTree.itemName" style="width: 75%;" placeholder="" resize="none"/>
  341. </el-form-item>
  342. <el-form-item label="说明:" prop="itemNotes">
  343. <el-input v-model="formTree.itemNotes" style="width: 75%;" placeholder="" resize="none"/>
  344. </el-form-item>
  345. <el-form-item label="排序:" prop="itemNo">
  346. <el-input-number v-model="formTree.itemNo" :min="1" style="width: 50%;"/>
  347. </el-form-item>
  348. </el-form>
  349. <template #footer>
  350. <span class="dialog-footer">
  351. <el-button size="mini" @click="dialogVisibleData = false">取消</el-button>
  352. <el-button type="primary" @click="addataXiang" size="mini">
  353. 提交
  354. </el-button>
  355. </span>
  356. </template>
  357. </el-dialog>
  358. <el-dialog @close="" v-model="dialogVisibleApi" title="api配置管理" width="60%" destroy-on-close :key="tableKey">
  359. <div style="display: flex;align-items: center;width: 100%;">
  360. <div>
  361. API:
  362. </div>
  363. <div style="width: 18%;">
  364. <el-tree-select
  365. v-model="valueSel"
  366. :data="dataSel"
  367. :render-after-expand="false"
  368. style="margin-left:1%;width: 100%;"
  369. />
  370. </div>
  371. </div>
  372. <div style="margin-top:0%;">
  373. <div style="display: flex;justify-content: space-between;align-items: center;">
  374. </div>
  375. <el-button style="margin-top: 2%;left: 92%;z-index:555;position: absolute;" type="info" plain size="mini">测试</el-button>
  376. <el-tabs
  377. v-model="activeName"
  378. type="card"
  379. class="demo-tabs"
  380. style="margin-top: 2%;"
  381. @tab-click="handleClick"
  382. >
  383. <el-tab-pane label="参数" name="first">
  384. <div style="display: flex;width: 100%;margin-top: 0%;">
  385. <el-button @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增字段</el-button>
  386. </div>
  387. <el-table
  388. style="margin-top: 1%;width: 98%;"
  389. :data="tableDataCanAdd"
  390. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  391. :header-cell-style="{ textAlign: 'center'}"
  392. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  393. border >
  394. <el-table-column prop="itemName" label="字段编码" width="200">
  395. <template #default="scope">
  396. <el-input placeholder="(必填)" type="primary" class="noBor" v-model="scope.row.fieldCode" size="mini" text style="margin-left: 0%;"></el-input>
  397. </template>
  398. </el-table-column>
  399. <el-table-column prop="itemName" label="字段名称">
  400. <template #default="scope">
  401. <div style="width: 100%;">
  402. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.fieldName" size="mini" text style="margin-left: 0%;"></el-input>
  403. </div>
  404. </template>
  405. </el-table-column>
  406. <el-table-column prop="itemName" label="字段类型">
  407. <template #default="scope">
  408. <div style="width: 100%;">
  409. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.metaType" size="mini" text style="margin-left: 0%;"></el-input>
  410. </div>
  411. </template>
  412. </el-table-column>
  413. <el-table-column prop="itemName" label="长度" >
  414. <template #default="scope">
  415. <div style="width: 100%;">
  416. <el-input type="primary" class="noBor" v-model="scope.row.fieldLength" size="mini" text style="margin-left: 0%;"></el-input>
  417. </div>
  418. </template>
  419. </el-table-column>
  420. <el-table-column prop="itemName" label="默认值" >
  421. <template #default="scope">
  422. <div style="width: 100%;">
  423. <el-input type="primary" class="noBor" v-model="scope.row.fieldDefault" size="mini" text style="margin-left: 0%;"></el-input>
  424. </div>
  425. </template>
  426. </el-table-column>
  427. <el-table-column prop="itemName" label="说明" >
  428. <template #default="scope">
  429. <div style="width: 100%;">
  430. <el-input type="primary" class="noBor" v-model="scope.row.fieldDesc" size="mini" text style="margin-left: 0%;"></el-input>
  431. </div>
  432. </template>
  433. </el-table-column>
  434. <el-table-column prop="itemName" label="主键" width="80">
  435. <template #default="scope">
  436. <div style="width: 100%;">
  437. <el-checkbox v-model="scope.row.fieldIspri" label="" size="large" />
  438. </div>
  439. </template>
  440. </el-table-column>
  441. <el-table-column prop="address" label="操作" width="100">
  442. <template #default="scope">
  443. <div style="width: 100%;">
  444. <el-button type="danger" @click="delCanAdd(scope.$index)" size="mini" text style="margin-left: 0%;">删除</el-button>
  445. </div>
  446. </template>
  447. </el-table-column>
  448. </el-table>
  449. </el-tab-pane>
  450. <el-tab-pane label="结果集" name="second">
  451. <div style="display: flex;width: 100%;margin-top: 0%;">
  452. <el-button @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增字段</el-button>
  453. </div>
  454. <el-table
  455. style="margin-top: 1%;width: 98%;"
  456. :data="tableDataCanAdd"
  457. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  458. :header-cell-style="{ textAlign: 'center'}"
  459. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  460. border >
  461. <el-table-column prop="itemName" label="字段编码" width="200">
  462. <template #default="scope">
  463. <el-input placeholder="(必填)" type="primary" class="noBor" v-model="scope.row.fieldCode" size="mini" text style="margin-left: 0%;"></el-input>
  464. </template>
  465. </el-table-column>
  466. <el-table-column prop="itemName" label="字段名称">
  467. <template #default="scope">
  468. <div style="width: 100%;">
  469. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.fieldName" size="mini" text style="margin-left: 0%;"></el-input>
  470. </div>
  471. </template>
  472. </el-table-column>
  473. <el-table-column prop="itemName" label="字段类型">
  474. <template #default="scope">
  475. <div style="width: 100%;">
  476. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.metaType" size="mini" text style="margin-left: 0%;"></el-input>
  477. </div>
  478. </template>
  479. </el-table-column>
  480. <el-table-column prop="itemName" label="长度" >
  481. <template #default="scope">
  482. <div style="width: 100%;">
  483. <el-input type="primary" class="noBor" v-model="scope.row.fieldLength" size="mini" text style="margin-left: 0%;"></el-input>
  484. </div>
  485. </template>
  486. </el-table-column>
  487. <el-table-column prop="itemName" label="默认值" >
  488. <template #default="scope">
  489. <div style="width: 100%;">
  490. <el-input type="primary" class="noBor" v-model="scope.row.fieldDefault" size="mini" text style="margin-left: 0%;"></el-input>
  491. </div>
  492. </template>
  493. </el-table-column>
  494. <el-table-column prop="itemName" label="说明" >
  495. <template #default="scope">
  496. <div style="width: 100%;">
  497. <el-input type="primary" class="noBor" v-model="scope.row.fieldDesc" size="mini" text style="margin-left: 0%;"></el-input>
  498. </div>
  499. </template>
  500. </el-table-column>
  501. <el-table-column prop="itemName" label="主键" width="80">
  502. <template #default="scope">
  503. <div style="width: 100%;">
  504. <el-checkbox v-model="scope.row.fieldIspri" label="" size="large" />
  505. </div>
  506. </template>
  507. </el-table-column>
  508. <el-table-column prop="address" label="操作" width="100">
  509. <template #default="scope">
  510. <div style="width: 100%;">
  511. <el-button type="danger" @click="delCanAdd(scope.$index)" size="mini" text style="margin-left: 0%;">删除</el-button>
  512. </div>
  513. </template>
  514. </el-table-column>
  515. </el-table>
  516. </el-tab-pane>
  517. <el-tab-pane label="预览" name="third">
  518. <div style="overflow: auto;height: 20vh;margin-top: -1%;">
  519. <el-input placeholder="" :rows="8" type="textarea" v-model="JsonAdd" size="mini" text style="margin-top: 1%;width: 98%;" ></el-input>
  520. </div>
  521. </el-tab-pane>
  522. </el-tabs>
  523. <div>
  524. </div>
  525. </div>
  526. <template #footer>
  527. <span class="dialog-footer">
  528. <el-button size="mini" @click="dialogVisibleTree = false">取消</el-button>
  529. <el-button type="primary" @click="addPei" size="mini">
  530. 提交
  531. </el-button>
  532. </span>
  533. </template>
  534. </el-dialog>
  535. <el-dialog @close="" v-model="dialogVisibleFile" title="文件配置管理" width="60%" destroy-on-close :key="tableKey">
  536. <div style="display: flex;align-items: center;width: 100%;">
  537. <div>
  538. 文件类型:
  539. </div>
  540. <div style="width: 18%;">
  541. <el-select
  542. v-model="valueDs"
  543. size="mini"
  544. style="width: 100%;margin-left: 1%;"
  545. >
  546. <el-option
  547. v-for="item in optionsFileTy"
  548. :key="item.value"
  549. :label="item.label"
  550. :value="item.value"
  551. />
  552. </el-select>
  553. </div>
  554. <div style="margin-left:2% ">
  555. 文件格式:
  556. </div>
  557. <div style="width: 18%;;">
  558. <el-select
  559. v-model="valueDs"
  560. size="mini"
  561. style="width: 100%;margin-left: 1%;"
  562. >
  563. <el-option
  564. v-for="item in optionsFilege"
  565. :key="item.value"
  566. :label="item.label"
  567. :value="item.value"
  568. />
  569. </el-select>
  570. </div>
  571. </div>
  572. <el-divider/>
  573. <div style="display: flex;align-items: center;width: 100%;">
  574. </div>
  575. <div style="margin-top:0%;">
  576. <div style="display: flex;justify-content: space-between;align-items: center;">
  577. </div>
  578. <el-button style="margin-top: 2%;left: 92%;z-index:555;position: absolute;" type="info" plain size="mini">测试</el-button>
  579. <el-tabs
  580. v-model="activeName"
  581. type="card"
  582. class="demo-tabs"
  583. style="margin-top: 2%;"
  584. @tab-click="handleClick"
  585. >
  586. <el-tab-pane label="参数" name="first">
  587. <el-upload
  588. ref="uploadRef"
  589. :limit="1"
  590. accept=".xlsx, .xls"
  591. :headers="upload.headers"
  592. :on-change="handleChange"
  593. :file-list="fileList"
  594. :action="upload.url + '?file=' + upload.updateSupport"
  595. :on-progress="handleFileUploadProgress"
  596. :on-success="handleFileSuccess"
  597. :auto-upload="false"
  598. drag
  599. >
  600. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  601. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  602. </el-upload>
  603. </el-tab-pane>
  604. <el-tab-pane label="预览" name="third">
  605. <div style="overflow: auto;height: 20vh;margin-top: -1%;">
  606. <el-input placeholder="" :rows="8" type="textarea" v-model="JsonAdd" size="mini" text style="margin-top: 1%;width: 98%;" ></el-input>
  607. </div>
  608. </el-tab-pane>
  609. </el-tabs>
  610. <div>
  611. </div>
  612. </div>
  613. <template #footer>
  614. <span class="dialog-footer">
  615. <el-button size="mini" @click="dialogVisibleTree = false">取消</el-button>
  616. <el-button type="primary" @click="addPei" size="mini">
  617. 提交
  618. </el-button>
  619. </span>
  620. </template>
  621. </el-dialog>
  622. </template>
  623. <script setup>
  624. import { reactive } from 'vue'
  625. import { Plus } from '@element-plus/icons-vue'
  626. import { modelTreeSelect } from "@/api/service/info";
  627. import { cateTree,addCate,delCate,fieldAll,addSet,dataSetList,editSet,fieldAdd,delField,getDataSourceList,delSet } from "@/api/register/regCom.js";
  628. import { ref, onMounted, onUnmounted, nextTick } from 'vue';
  629. import Codemirror from 'codemirror-editor-vue3';
  630. import { getToken } from "@/utils/auth";
  631. import 'codemirror/lib/codemirror.css'; // 核心样式
  632. import 'codemirror/theme/dracula.css'; // 主题
  633. import 'codemirror/mode/sql/sql.js';
  634. const code = ref('const example = "Hello, CodeMirror!"');
  635. const cmRef = ref(null)
  636. const cmOptions = {
  637. mode: 'x-sql',
  638. hintOptions: {
  639. completeSingle: false,
  640. tables: {
  641. users: ['id', 'name', 'email'], // 自定义表字段提示
  642. products: ['id', 'price', 'stock']
  643. }
  644. }
  645. };
  646. const upload = reactive({
  647. // 是否显示弹出层(用户导入)
  648. open: false,
  649. // 弹出层标题(用户导入)
  650. title: "",
  651. // 是否禁用上传
  652. isUploading: false,
  653. // 是否更新已经存在的用户数据
  654. updateSupport: '',
  655. // 设置上传的请求头部
  656. headers: { Authorization: "Bearer " + getToken() },
  657. // 上传的地址
  658. url: import.meta.env.VITE_APP_BASE_API + "/common/upload"
  659. });
  660. const optionsShuLei = ref([
  661. {label:"SQL数据集",
  662. value:'SQL数据集'
  663. },
  664. {label:"API数据集",
  665. value:'API数据集'
  666. },
  667. {label:"文件数据集",
  668. value:'文件数据集'
  669. },
  670. ])
  671. const activeName = ref('first')
  672. const uploadRef = ref(null);
  673. const dialogVisibleApi = ref(false)
  674. const dialogVisibleFile = ref(false)
  675. const valueSel = ref('')
  676. const { proxy } = getCurrentInstance();
  677. const data = ref([])
  678. const title = ref([])
  679. const titleTree = ref([])
  680. const dialogVisibleData = ref(false)
  681. const currentPage = ref(1)
  682. const total = ref(1)
  683. const tableData = ref([])
  684. const tableheight = window.innerHeight*0.78
  685. const heightAll = window.innerHeight
  686. const dialogVisible = ref(false)
  687. const dialogVisibleTree = ref(false)
  688. const isAdd = ref(false)
  689. const isAddTa = ref(false)
  690. const treeId = ref('');
  691. const dcName =ref()
  692. const parDel = ref({})
  693. const parTree = ref(null)
  694. const formZu = ref({
  695. cateId:'',
  696. dcName:'',
  697. dcType:'',
  698. dcSort:1,
  699. dcNote:''
  700. });
  701. const optionsDs = ref([])
  702. const currentNodeKey = ref('')
  703. const rulesZu = reactive({
  704. dcName: [{ required: true, message: '必填', trigger: 'blur' }],
  705. dcType: [{ required: true, message: '必填', trigger: 'blur' }],
  706. dcSort: [{ required: true, message: '必填', trigger: 'blur' }],
  707. });
  708. const formRefZu = ref();
  709. const tableDataCanAdd = ref([])
  710. const formTree = ref({
  711. itemName:'',
  712. itemNo:'',
  713. itemNotes:'',
  714. });
  715. const dataSel = ref([])
  716. const parMeta = ref({})
  717. const rulesTree = reactive({
  718. itemName: [{ required: true, message: '必填', trigger: 'blur' }],
  719. itemNo: [{ required: true, message: '必填', trigger: 'blur' }]
  720. });
  721. const formRefTree = ref();
  722. const parDscode = ref('')
  723. const parLev = ref(1)
  724. async function getTreeSel(){
  725. await modelTreeSelect().then(res=>{
  726. dataSel.value = res.data
  727. })
  728. }
  729. function filterModelNodes(nodes) {
  730. if (!Array.isArray(nodes)) return [];
  731. const result = [];
  732. for (const node of nodes) {
  733. // 递归处理子节点(如果有)
  734. const filteredChildren = node.children ? filterModelNodes(node.children) : [];
  735. if (node.nodeType === 'MODEL') {
  736. // 保留当前节点,并更新其子节点
  737. node.value = node.id
  738. result.push({
  739. ...node,
  740. children: filteredChildren
  741. });
  742. } else {
  743. // 删除当前节点,将其子节点提升到当前层级
  744. result.push(...filteredChildren);
  745. }
  746. }
  747. return result;
  748. }
  749. function getOptionsDs(){
  750. getDataSourceList().then(res=>{
  751. optionsDs.value = res.rows
  752. optionsDs.value.forEach(item=>{
  753. item.label = item.dsDbname
  754. item.value = item.dsCode
  755. })
  756. total.value = res.total
  757. })
  758. }
  759. const refreshEditor = () => {
  760. nextTick(() => {
  761. cmRef.value?.refresh(); // 关键调用
  762. });
  763. };
  764. function delAll(){
  765. proxy.$modal.confirm('是否确认删除?').then(function () {
  766. return delCate(parTree.value.id);
  767. }).then(() => {
  768. getTree();
  769. proxy.$modal.msgSuccess("删除成功");
  770. }).catch(() => {});
  771. }
  772. function addataXiang(){
  773. if(parLev.value===1){
  774. formTree.value.catePid = parTree.value.pid
  775. }
  776. else{
  777. formTree.value.catePid = parTree.value.id
  778. }
  779. addCate(formTree.value).then(res=>{
  780. if(res.code===200){
  781. proxy.$modal.msgSuccess("修改成功");
  782. getTree()
  783. dialogVisibleData.value = false
  784. }
  785. })
  786. }
  787. function add1Level(){
  788. parLev.value = 1
  789. dialogVisibleData.value = true
  790. }
  791. function addNextLevel(){
  792. parLev.value = 2
  793. dialogVisibleData.value = true
  794. }
  795. function addPei(){
  796. tableDataCanAdd.value.forEach((item, index, array)=>{
  797. if(item.fieldIspri===true){
  798. item.fieldIspri = '1'
  799. }
  800. if(item.fieldIspri===false){
  801. item.fieldIspri = '2'
  802. }
  803. if(!item.fieldCode){
  804. array.splice(index, 1)
  805. }
  806. })
  807. if(tableDataCanAdd.value.length===0){
  808. var par = {
  809. dcCode:currentNodeKey.value,
  810. metaTable:parMeta.value.metaTable,
  811. fieldCode:parDel.value.fieldCode
  812. }
  813. delField(par).then(res=>{
  814. if(res.code===200){
  815. proxy.$modal.msgSuccess("修改成功");
  816. getTable()
  817. dialogVisibleTree.value = false
  818. }
  819. })
  820. }
  821. else{
  822. fieldAdd(tableDataCanAdd.value).then(res=>{
  823. if(res.code===200){
  824. proxy.$modal.msgSuccess("修改成功");
  825. getTable()
  826. dialogVisibleTree.value = false
  827. }
  828. })
  829. }
  830. }
  831. function showPei(row){
  832. // dialogVisibleTree.value = true
  833. if(row.dcType==='SQL数据集'){
  834. dialogVisibleTree.value = true
  835. }
  836. if(row.dcType==='API数据集'){
  837. dialogVisibleApi.value = true
  838. }
  839. if(row.dcType==='文件数据集'){
  840. dialogVisibleFile.value = true
  841. }
  842. parMeta.value = row
  843. var par = {
  844. dsCode:parDscode.value,
  845. metaTable:row.metaTable,
  846. }
  847. // getMetaFiele(par).then(res=>{
  848. // tableDataCanAdd.value = res.data
  849. // tableDataCanAdd.value.forEach(item=>{
  850. // if(item.fieldIspri==='1'){
  851. // item.fieldIspri = true
  852. // }
  853. // if(item.fieldIspri==='2'){
  854. // item.fieldIspri = false
  855. // }
  856. // })
  857. // })
  858. }
  859. function clearForm(){
  860. formTree.value = {
  861. dsTitle:'',
  862. dsType:'',
  863. dsDbname:'',
  864. dsIp:'',
  865. dsPort:'',
  866. dsUser:'',
  867. dsPass:'',
  868. dsNode:'',
  869. }
  870. formZu.value = {
  871. metaTable:'',
  872. dcName:'',
  873. metaType:'',
  874. metaNote:'',
  875. metaSort:1,
  876. }
  877. tableDataCanAdd.value = []
  878. }
  879. function addCanAdd(){
  880. var par = {
  881. dcCode:currentNodeKey.value,
  882. metaTable:parMeta.value.metaTable,
  883. }
  884. tableDataCanAdd.value.push(par)
  885. }
  886. function delCanAdd(index){
  887. if(tableDataCanAdd.value.length===1){
  888. parDel.value = tableDataCanAdd.value[0]
  889. }
  890. tableDataCanAdd.value.splice(index, 1)
  891. }
  892. function getTable(){
  893. var par = {
  894. cateId:currentNodeKey.value,
  895. }
  896. dataSetList(par).then(res=>{
  897. tableData.value = res.rows
  898. })
  899. }
  900. function showAdd(){
  901. cmRef.value = Math.random()
  902. isAddTa.value = true
  903. title.value = '新增'
  904. dialogVisible.value = true
  905. }
  906. function showEdit(row){
  907. isAddTa.value = false
  908. title.value = '编辑'
  909. dialogVisible.value = true
  910. formZu.value = row
  911. }
  912. function showAddTree(){
  913. isAdd.value = true
  914. titleTree.value = '新增节点'
  915. dialogVisibleTree.value = true
  916. }
  917. function clearFromTree(){
  918. formTree.value = {
  919. itemName:'',
  920. catePid:'',
  921. itemNo:'',
  922. itemNotes:''
  923. }
  924. }
  925. function getTree(){
  926. cateTree().then(res=>{
  927. data.value = res.data
  928. data.value.forEach(item=>{
  929. item.value = item.id
  930. item.id = item.id
  931. })
  932. })
  933. }
  934. function addTa(){
  935. formRefZu.value.validate(async (valid) => {
  936. if(valid){
  937. formZu.value.cateId = currentNodeKey.value
  938. await addSet(formZu.value).then(res=>{
  939. if(res.code===200){
  940. proxy.$modal.msgSuccess("新增成功");
  941. getTable()
  942. dialogVisible.value = false
  943. }
  944. })
  945. }
  946. });
  947. }
  948. function saveEditTa(){
  949. formRefZu.value.validate(async (valid) => {
  950. if(valid){
  951. editSet(formZu.value).then(res=>{
  952. if(res.code===200){
  953. proxy.$modal.msgSuccess("修改成功");
  954. dialogVisible.value = false
  955. getTable()
  956. }
  957. })
  958. }
  959. });
  960. }
  961. function delRow(row) {
  962. proxy.$modal.confirm('是否确认删除?').then(function () {
  963. return delSet(row.dcCode);
  964. }).then(() => {
  965. getTable();
  966. proxy.$modal.msgSuccess("删除成功");
  967. }).catch(() => {});
  968. };
  969. async function addTree(){
  970. formRefTree.value.validate(async (valid) => {
  971. await addDataCate(formTree.value).then(res=>{
  972. if(res.code===200){
  973. proxy.$modal.msgSuccess("新增成功");
  974. getTree()
  975. dialogVisibleTree.value = false
  976. }
  977. })
  978. });
  979. }
  980. function saveEditTree(){
  981. editCate(formTree.value).then(res=>{
  982. if(res.code===200){
  983. proxy.$modal.msgSuccess("修改成功");
  984. dialogVisibleTree.value = false
  985. getTree()
  986. }
  987. })
  988. }
  989. function handleNodeClick(node, data){
  990. currentNodeKey.value = data.data.id
  991. parTree.value = data.data
  992. getTable()
  993. }
  994. function delTree(node, data) {
  995. proxy.$modal.confirm('是否确认删除?').then(function () {
  996. return delCate(data.id);
  997. }).then(() => {
  998. getTree();
  999. proxy.$modal.msgSuccess("删除成功");
  1000. }).catch(() => {});
  1001. };
  1002. function editTree(node, data){
  1003. console.log(data)
  1004. titleTree.value = '编辑'
  1005. isAdd.value = false
  1006. dialogVisibleTree.value = true
  1007. getCateDe(data.id).then(res=>{
  1008. formTree.value = res.data
  1009. })
  1010. console.log(node, data)
  1011. }
  1012. onMounted(() => {
  1013. getTree()
  1014. getOptionsDs()
  1015. getTreeSel()
  1016. // getTable()
  1017. });
  1018. </script>
  1019. <style scoped>
  1020. :deep(.svg-icon) {
  1021. outline: none;
  1022. }
  1023. :deep(.svg-icon svg) {
  1024. stroke: none;
  1025. }
  1026. :deep(.el-tree-node__expand-icon) {
  1027. margin-left:5%; /* 向右推动图标 */
  1028. }
  1029. :deep(.el-table__body tr:hover > td) {
  1030. background-color: #eaf7ff !important;
  1031. }
  1032. :deep(.treeLeft) .el-tree-node__content {
  1033. width: 100%;
  1034. display: flex !important;
  1035. height: 30px !important;
  1036. align-items: center;
  1037. padding-top: 0 !important;
  1038. }
  1039. :deep(.treeLeft) .el-tree-node__content:hover {
  1040. background-color: #ecf5ff;
  1041. }
  1042. :deep(.treeLeft) .el-tree-node__content:active {
  1043. background-color: #d9ecff !important;
  1044. }
  1045. /* 选中态(Active) */
  1046. :deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
  1047. background-color: #c6e2ff !important;
  1048. }
  1049. .drag-handle {
  1050. cursor: move;
  1051. }
  1052. .ghost {
  1053. opacity: 0.5;
  1054. background: #c8ebfb;
  1055. }
  1056. /* 防止文字选中 */
  1057. :deep(.el-table__row) {
  1058. user-select: none;
  1059. -webkit-user-select: none;
  1060. }
  1061. </style>
  1062. <style scoped lang="scss">
  1063. .el-table .el-table__row td {
  1064. height: 60px !important; /* 行高 */
  1065. }
  1066. .custom-tree-node {
  1067. display: flex; /* 启用 Flex 布局 */
  1068. align-items: center; /* 垂直居中 */
  1069. gap: 6px; /* 图标与文字间距 */
  1070. }
  1071. .custom-tree-node {
  1072. flex: 1;
  1073. display: flex;
  1074. align-items: center;
  1075. justify-content: space-between;
  1076. font-size: 14px;
  1077. padding-right: 8px;
  1078. }
  1079. </style>