index.vue 91 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296
  1. <template>
  2. <div style="width: 100%;padding-top: 1%;" :style="{'height':heightAll+'px'}">
  3. <div style="display: flex;width: 100%;margin-left: 1%;justify-content: space-between;">
  4. <div style="display: flex;width: 35%;">
  5. <div style="display: flex;width: 100%;align-items: center;">
  6. <div>
  7. 模型名称:
  8. </div>
  9. <el-input v-model="name" style="width:50%;margin-left: 1%;" placeholder="" />
  10. </div>
  11. <div style="display: flex;width: 100%;align-items: center;margin-left:-15%;">
  12. <div>
  13. 模型归属单位:
  14. </div>
  15. <el-input v-model="mdUnit" style="width: 50%;margin-left: 1%;" placeholder="" />
  16. </div>
  17. <el-button type="primary" style="margin-left: -10%;" @click="getModelListTable" :icon="Search">查询</el-button>
  18. </div>
  19. <div style="display: flex;align-items: center;margin-right: 3%;">
  20. <el-button type="primary" style="margin-left:5%;" @click="reg" icon="Plus">注册</el-button>
  21. </div>
  22. </div>
  23. <div style="margin-top: 0%;margin-left: 0%;width: 100%;">
  24. <el-table
  25. :data="tableData"
  26. height="80vh"
  27. style="width: 98%;margin-left: 1%;margin-top: 0.5%;"
  28. :cell-style="{ padding:'5px' }"
  29. :header-cell-style="{height: heightAll*0.01+'px',}"
  30. :row-style="{ fontSize: '16px',textAlign:'center'}"
  31. border >
  32. <el-table-column type="index" label="序号" width="80">
  33. <template #default="{ $index }">
  34. <div style="text-align: center;">
  35. {{ $index + 1 }}
  36. </div>
  37. </template>
  38. </el-table-column>
  39. <el-table-column prop="name" label="模型名称">
  40. <template #default="scope">
  41. <div style="color: #409EFF;cursor: pointer;" @click="showDe(scope.row)">{{scope.row.name}}</div>
  42. </template>
  43. </el-table-column>
  44. <el-table-column prop="enname" label="英文名称">
  45. <!-- <template #default="scope">
  46. <div style="color: #409EFF;cursor: pointer;" @click="showTest(scope.row)">{{scope.row.enname}}</div>
  47. </template> -->
  48. </el-table-column>
  49. <el-table-column prop="type" label="模型类型" width="160"/>
  50. <el-table-column prop="mdUnit" label="模型单位" width="220"/>
  51. <el-table-column prop="mdContact" label="联系方式" width="150"/>
  52. <el-table-column prop="audit" label="审核状态" width="140">
  53. <template #default="scope">
  54. <div>
  55. <div v-if="scope.row.audit === '0'||scope.row.audit === null" style="color:#909399">待审核</div>
  56. <div v-else-if="scope.row.audit === '1'" style="color: #67C23A">审核通过</div>
  57. <div v-else-if="scope.row.audit === '2'" style="color: #F56C6C">驳回</div>
  58. </div>
  59. </template>
  60. </el-table-column>
  61. <el-table-column prop="status" label="发布状态" width="140">
  62. <template #default="scope">
  63. <div>
  64. <div v-if="scope.row.publish === '0'||scope.row.publish === null" style="color:#909399">未发布</div>
  65. <div v-else-if="scope.row.publish === '1'" style="color: #67C23A">已发布</div>
  66. </div>
  67. </template>
  68. </el-table-column>
  69. <el-table-column prop="modifyBy" label="发布时间" width="170"/>
  70. <el-table-column prop="version" label="版本" width="120"/>
  71. <el-table-column prop="address" label="操作" width="270">
  72. <template #default="scope">
  73. <div style="display: flex;justify-content: space-between;width: 100%;">
  74. <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left: 0%;">编辑</el-button>
  75. <!-- <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button> -->
  76. <!-- <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: -5%;">查看</el-button> -->
  77. <el-button @click="showPei(scope.row)" type="warning" text size="mini" style="margin-left: -5%;">配置</el-button>
  78. <el-button type="danger" @click="delModel(scope.row)" text size="mini" style="margin-left: -5%;">删除</el-button>
  79. <el-button v-if="scope.row.audit === '0'||scope.row.audit === null" type="info" @click="shenhe(scope.row)" text size="mini" style="margin-left: -5%;">审核申请</el-button>
  80. </div>
  81. </template>
  82. </el-table-column>
  83. </el-table>
  84. <el-dialog v-model="dialogVisible" title="" width="60%" @close="clearForm">
  85. <div class="card-header">
  86. <span style="font-size: 20px;margin-left: 1%;">基本信息</span>
  87. <el-divider style="margin-top: 1%;"/>
  88. </div>
  89. <div>
  90. <el-form size="mini" style="margin-top: 0%;width: 98%;" :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
  91. <el-row :gutter="40">
  92. <el-col :span="8">
  93. <el-form-item label="模型名称:" prop="name" style="">
  94. <div style="display: flex;width: 120%;justify-content: space-between;">
  95. <el-input v-model="formJi.name" style="width: 100%;"/>
  96. </div>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="8">
  100. <el-form-item label="英文名:" prop="enname" style="">
  101. <div style="display: flex;width: 100%;justify-content: space-between;">
  102. <el-input v-model="formJi.enname" style="width: 100%;"/>
  103. </div>
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="6">
  107. <el-form-item label="版本号:" prop="" style="">
  108. <div style="display: flex;width: 100%;justify-content: space-between;">
  109. <el-input v-model="formJi.version" style="width: 100%;"/>
  110. </div>
  111. </el-form-item>
  112. </el-col>
  113. </el-row>
  114. <el-row :gutter="48">
  115. <el-col :span="8">
  116. <el-form-item label="模型类型:" prop="" style="">
  117. <div style="display: flex;width: 100%;justify-content: space-between;">
  118. <el-input placeholder="如水利模型、排水模型、供水模型、海洋模型" v-model="formJi.type" style="width: 100%;" resize="none"/>
  119. </div>
  120. </el-form-item>
  121. </el-col>
  122. </el-row>
  123. <el-form-item label="排序:" prop="" style="">
  124. <div style="display: flex;width: 100%;justify-content: space-between;">
  125. <el-input-number v-model="formJi.sort" :min="1" style="width: 22%;"/>
  126. </div>
  127. </el-form-item>
  128. <el-row :gutter="48">
  129. <el-col :span="24">
  130. <el-form-item label="开发语言:">
  131. <el-radio-group v-model="formJi.devlang" class="custom-radio-group" style="width: 100%;">
  132. <el-radio label="java" size="large">java</el-radio>
  133. <el-radio label="nodeJs" size="large">nodeJs</el-radio>
  134. <el-radio label="python" size="large">python</el-radio>
  135. <el-radio label="c/c++" size="large">c/c++</el-radio>
  136. <el-radio label="1" size="large">
  137. <div class="custom-input-wrapper">
  138. <span>其它</span>
  139. <el-input
  140. v-model="elseLan"
  141. class="underline-input"
  142. v-show="isElse"
  143. />
  144. </div>
  145. </el-radio>
  146. </el-radio-group>
  147. </el-form-item>
  148. </el-col>
  149. </el-row>
  150. <el-row :gutter="48">
  151. <el-col :span="16">
  152. <el-form-item label="简介:">
  153. <el-input v-model="formJi.intro" style="width: 100%;" :rows="3" resize="none" type="textarea"/>
  154. </el-form-item>
  155. </el-col>
  156. </el-row>
  157. </el-form>
  158. </div>
  159. <div class="card-header">
  160. <span style="font-size: 20px;margin-left: 1%;">单位</span>
  161. <el-divider style="margin-top: 1%;"/>
  162. </div>
  163. <div style="margin-top: 0%;">
  164. <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;" :model="formJi" label-position="right" label-width="120px" :rules="rulesJi">
  165. <el-row :gutter="48">
  166. <el-col :span="11">
  167. <el-form-item label="模型归属单位:" prop="" style="">
  168. <div style="display: flex;width: 100%;justify-content: space-between;">
  169. <el-input v-model="formJi.mdUnit" style="width: 100%;"/>
  170. </div>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="11">
  174. <el-form-item label="联系方式:" prop="" style="" >
  175. <div style="display: flex;width: 100%;justify-content: space-between;">
  176. <el-input v-model="formJi.mdContact" style="width: 100%;"/>
  177. </div>
  178. </el-form-item>
  179. </el-col>
  180. </el-row>
  181. <el-row :gutter="48">
  182. <el-col :span="11">
  183. <el-form-item label="技术支持单位:" prop="" style="">
  184. <div style="display: flex;width: 100%;justify-content: space-between;">
  185. <el-input v-model="formJi.devUnit" style="width: 100%;"/>
  186. </div>
  187. </el-form-item>
  188. </el-col>
  189. <el-col :span="11">
  190. <el-form-item label="联系方式:" prop="" style="">
  191. <div style="display: flex;width: 100%;justify-content: space-between;">
  192. <el-input v-model="formJi.devContact" style="width: 100%;"/>
  193. </div>
  194. </el-form-item>
  195. </el-col>
  196. </el-row>
  197. </el-form>
  198. </div>
  199. <el-tabs
  200. v-model="activeName"
  201. type="card"
  202. style="margin-top: 1%;"
  203. >
  204. <el-tab-pane label="部署情况" name="first">
  205. <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;" :model="formJi" label-position="right" label-width="120px" :rules="rulesJi">
  206. <el-row :gutter="48">
  207. <el-col :span="11">
  208. <el-form-item label="服务器IP:" prop="" style="">
  209. <div style="display: flex;width: 100%;justify-content: space-between;">
  210. <el-input v-model="formJi.deployIp" style="width: 100%;"/>
  211. </div>
  212. </el-form-item>
  213. </el-col>
  214. <el-col :span="11">
  215. <el-form-item label="端口:" prop="" style="">
  216. <div style="display: flex;width: 100%;justify-content: space-between;">
  217. <el-input placeholder="可填写多个端口,以“,”分隔" v-model="formJi.deployPort" style="width: 100%;"/>
  218. </div>
  219. </el-form-item>
  220. </el-col>
  221. </el-row>
  222. <el-row :gutter="48">
  223. <el-col :span="15">
  224. <el-form-item label="部署位置:" prop="" style="">
  225. <div style="display: flex;width: 100%;justify-content: space-between;">
  226. <el-input v-model="formJi.deployDir" style="width: 100%;"/>
  227. </div>
  228. </el-form-item>
  229. </el-col>
  230. <el-col :span="10">
  231. </el-col>
  232. </el-row>
  233. <el-row :gutter="48">
  234. <el-col :span="15">
  235. <el-form-item label="服务访问地址:" prop="" style="">
  236. <div style="display: flex;width: 100%;justify-content: space-between;">
  237. <el-input v-model="formJi.mirrorImageUrl" style="width: 100%;"/>
  238. </div>
  239. </el-form-item>
  240. </el-col>
  241. </el-row>
  242. <el-row :gutter="48">
  243. <el-col :span="15">
  244. <el-form-item label="服务器运行命令:" prop="" style="">
  245. <div style="display: flex;width: 100%;justify-content: space-between;">
  246. <el-input v-model="formJi.mdRunCmd" style="width: 100%;"/>
  247. </div>
  248. </el-form-item>
  249. </el-col>
  250. </el-row>
  251. </el-form>
  252. <div style="display: flex;margin-top: -5%;">
  253. <div class="card-header" style="margin-top: 5%;display: flex;justify-content: inherit;margin-left: 2%">
  254. <span style="font-size: 20px;margin-top: 5%; writing-mode: vertical-rl;position: relative;top: 15%;">运行环境</span>
  255. </div>
  256. <el-form size="mini" :key="tableKey" style="margin-top: 5%;width: 85%;" :model="formJi" label-position="right" label-width="120px" :rules="rulesJi">
  257. <el-row :gutter="48">
  258. <el-col :span="12">
  259. <el-form-item label="操作系统:" prop="" style="">
  260. <div style="display: flex;width: 100%;justify-content: space-between;">
  261. <el-select
  262. v-model="formJi.envOs"
  263. style="width: 75%;margin-left: 0%;"
  264. >
  265. <el-option
  266. v-for="item in optionsEnv"
  267. :key="item.value"
  268. :label="item.label"
  269. :value="item.value"
  270. />
  271. </el-select>
  272. </div>
  273. </el-form-item>
  274. </el-col>
  275. <el-col :span="12">
  276. <el-form-item label="运行架构:" prop="" style="">
  277. <div style="display: flex;width: 100%;justify-content: space-between;">
  278. <el-radio-group v-model="formJi.evnArmX86" class="ml-4" size="small" style="" >
  279. <el-radio label="X86" size="large">X86</el-radio>
  280. <el-radio label="ARM" size="large">ARM</el-radio>
  281. </el-radio-group>
  282. </div>
  283. </el-form-item>
  284. </el-col>
  285. </el-row>
  286. <el-row :gutter="24">
  287. <el-col :span="8">
  288. <el-form-item label="硬盘:" prop="" style="">
  289. <div style="display: flex;width: 100%;" >
  290. <el-input-number
  291. v-model="formJi.envDisk"
  292. :min="100"
  293. :max="2048"
  294. size="mini"
  295. controls-position="right"
  296. @change="handleChange"
  297. />
  298. <div style="margin-left: 4%;font-size: 15px;">
  299. G
  300. </div>
  301. </div>
  302. </el-form-item>
  303. </el-col>
  304. <el-col :span="8">
  305. <el-form-item label="CPU核数:" prop="" style="">
  306. <div style="display: flex;width: 100%;" >
  307. <el-input-number
  308. v-model="formJi.envCpuNum"
  309. :max="64"
  310. :min="2"
  311. size="mini"
  312. controls-position="right"
  313. @change="handleChange"
  314. />
  315. <div style="margin-left: 4%;font-size: 15px;">
  316. </div>
  317. </div>
  318. </el-form-item>
  319. </el-col>
  320. <el-col :span="8">
  321. <el-form-item label="内存:" prop="" style="">
  322. <div style="display: flex;width: 100%;" >
  323. <el-input-number
  324. v-model="formJi.envMem"
  325. :max="512"
  326. :min="1"
  327. size="mini"
  328. controls-position="right"
  329. @change="handleChange"
  330. />
  331. <div style="margin-left: 4%;font-size: 15px;">
  332. G
  333. </div>
  334. </div>
  335. </el-form-item>
  336. </el-col>
  337. </el-row>
  338. <el-row :gutter="24">
  339. <el-col :span="8">
  340. <el-form-item label="GPU型号:" prop="" style="">
  341. <div style="display: flex;width: 100%;">
  342. <el-input v-model="formJi.envGpuType" style="width: 100%;"/>
  343. </div>
  344. </el-form-item>
  345. </el-col>
  346. <el-col :span="8">
  347. <el-form-item label="GPU数量:" prop="" style="">
  348. <div style="display: flex;width: 100%;" >
  349. <el-input-number
  350. v-model="formJi.envGpuNum"
  351. :min="1"
  352. :max="64"
  353. size="mini"
  354. controls-position="right"
  355. @change="handleChange"
  356. />
  357. <div style="margin-left: 4%;font-size: 15px;">
  358. </div>
  359. </div>
  360. </el-form-item>
  361. </el-col>
  362. <el-col :span="8">
  363. <el-form-item label="GUP显存:" prop="" style="">
  364. <div style="display: flex;width: 100%;" >
  365. <el-input-number
  366. v-model="formJi.envGpuMem"
  367. :min="1"
  368. size="mini"
  369. :max="512"
  370. controls-position="right"
  371. @change="handleChange"
  372. />
  373. <div style="margin-left: 4%;font-size: 15px;">
  374. G
  375. </div>
  376. </div>
  377. </el-form-item>
  378. </el-col>
  379. </el-row>
  380. </el-form>
  381. </div>
  382. </el-tab-pane>
  383. <el-tab-pane label="输入" name="second">
  384. <el-form style="margin-left: 5%;margin-top: 2%;" label-position="right" label-width="120px" :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
  385. <el-form-item label="输入文档:" prop="">
  386. <div style="width: 75%;">
  387. <el-upload
  388. ref="uploadRef"
  389. :limit="1"
  390. accept=".xlsx, .xls"
  391. :headers="upload.headers"
  392. :on-change="handleChange"
  393. :file-list="fileList"
  394. :action="upload.url + '?file=' + upload.updateSupport"
  395. :on-progress="handleFileUploadProgress"
  396. :on-success="handleFileSuccess"
  397. :auto-upload="false"
  398. drag
  399. >
  400. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  401. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  402. </el-upload>
  403. </div>
  404. <div style="color: #b1b3b8;width: 100%;">
  405. 注:请上传后缀名为.docx .pdf .txt的文件
  406. </div>
  407. <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
  408. </el-form-item>
  409. <el-form-item label="说明:" prop="" style="margin-left: -1%;">
  410. <el-input v-model="formJi.mdInNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
  411. </el-form-item>
  412. </el-form>
  413. </el-tab-pane>
  414. <el-tab-pane label="输出" name="third">
  415. <el-form style="margin-left: 5%;margin-top: 2%;" label-position="right" label-width="120px" :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
  416. <el-form-item label="输出文档:" prop="">
  417. <div style="width: 75%;">
  418. <el-upload
  419. ref="uploadRef1"
  420. :limit="1"
  421. accept=".xlsx, .xls"
  422. :headers="upload.headers"
  423. :on-change="handleChange1"
  424. :file-list="fileList1"
  425. :action="upload.url + '?file=' + upload.updateSupport"
  426. :on-progress="handleFileUploadProgress"
  427. :on-success="handleFileSuccess1"
  428. :auto-upload="false"
  429. drag
  430. >
  431. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  432. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  433. </el-upload>
  434. </div>
  435. <div style="color: #b1b3b8;width: 100%;">
  436. 注:请上传后缀名为.docx .pdf .txt的文件
  437. </div>
  438. <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
  439. </el-form-item>
  440. <el-form-item label="说明:" prop="" style="margin-left: -1%;">
  441. <el-input v-model="formJi.mdOutNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
  442. </el-form-item>
  443. </el-form>
  444. </el-tab-pane>
  445. </el-tabs>
  446. <template #footer>
  447. <span class="dialog-footer">
  448. <el-button @click="dialogVisible = false">取消</el-button>
  449. <el-button type="primary" @click="submit" v-if="!isEdit">
  450. 提交
  451. </el-button>
  452. <el-button type="primary" @click="subEdit" v-if="isEdit">
  453. 提交
  454. </el-button>
  455. </span>
  456. </template>
  457. </el-dialog>
  458. <el-dialog v-model="dialogVisibleDe" title="" width="50%" @close="" destroy-on-close class="custom-dialog-bg">
  459. <el-descriptions title="基本信息" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
  460. <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
  461. <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
  462. <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
  463. <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
  464. <el-descriptions-item label="开发语言:" span="2">{{formJi.devlang}}</el-descriptions-item>
  465. <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
  466. </el-descriptions>
  467. <el-divider style="margin-top: 0%;"/>
  468. <el-descriptions title="单位" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
  469. <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
  470. <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
  471. <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
  472. <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
  473. </el-descriptions>
  474. <el-tabs
  475. v-model="activeName"
  476. type="card"
  477. style="margin-top: 1%;background-color: transparent;"
  478. >
  479. <el-tab-pane label="部署情况" name="first" style="background-color: transparent;">
  480. <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background-color: transparent;">
  481. <el-descriptions-item label="服务器IP:" span="2">{{formJi.deployIp}}</el-descriptions-item>
  482. <el-descriptions-item label="端口:">{{formJi.deployPort}}</el-descriptions-item>
  483. <el-descriptions-item label="部署位置:" span="2">{{formJi.deployDir}}</el-descriptions-item>
  484. <el-descriptions-item label="服务访问地址:">{{formJi.mirrorImageUrl}}</el-descriptions-item>
  485. <el-descriptions-item label="服务器运行命令:" span="3">{{formJi.mdRunCmd}}</el-descriptions-item>
  486. <el-descriptions-item label="操作系统:" span="2">{{formJi.envOs}}</el-descriptions-item>
  487. <el-descriptions-item label="运行架构:" span="3">{{formJi.evnArmX86}}</el-descriptions-item>
  488. <el-descriptions-item label="硬盘:" span="">
  489. {{formJi.envDisk + 'G'}}
  490. </el-descriptions-item>
  491. <el-descriptions-item label="CPU核心数:">
  492. {{formJi.envCpu + '个'}}
  493. </el-descriptions-item>
  494. <el-descriptions-item label="内存:">
  495. {{formJi.envMem + 'G'}}
  496. </el-descriptions-item>
  497. <el-descriptions-item label="GPU型号:">{{formJi.envGpuType}}</el-descriptions-item>
  498. <el-descriptions-item label="GPU数量:">
  499. {{formJi.envGpuNum + '个'}}
  500. </el-descriptions-item>
  501. <el-descriptions-item label="GUP显存:">
  502. {{formJi.envGpuMem + 'G'}}
  503. </el-descriptions-item>
  504. </el-descriptions>
  505. </el-tab-pane>
  506. <el-tab-pane label="输入" name="second">
  507. <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
  508. <el-descriptions-item label="输入文档:" span="2">
  509. <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
  510. </el-descriptions-item>
  511. <el-descriptions-item label="说明:">{{formJi.mdInNote}}</el-descriptions-item>
  512. </el-descriptions>
  513. </el-tab-pane>
  514. <el-tab-pane label="输出" name="third">
  515. <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
  516. <el-descriptions-item label="输出文档:" span="2">
  517. <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
  518. </el-descriptions-item>
  519. <el-descriptions-item label="说明:">{{formJi.mdOutNote}}</el-descriptions-item>
  520. </el-descriptions>
  521. </el-tab-pane>
  522. </el-tabs>
  523. </el-dialog>
  524. <el-dialog @close="clearForm" v-model="dialogVisiblePei" width="70%" title="参数配置">
  525. <el-tabs v-model="activeName" type="border-card" style="height: 50vh;">
  526. <el-tab-pane label="基本信息" name="first" >
  527. <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
  528. <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
  529. <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
  530. <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
  531. <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
  532. <el-descriptions-item label="开发语言:" span="2">{{formJi.devlang}}</el-descriptions-item>
  533. <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
  534. </el-descriptions>
  535. <el-divider style="margin-top: 0%;"/>
  536. <el-descriptions title="" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
  537. <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
  538. <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
  539. <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
  540. <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
  541. </el-descriptions>
  542. </el-tab-pane>
  543. <el-tab-pane label="模型参数" style="height: 50vh;" :key="activeTabKey">
  544. <div style="display: flex;justify-content: space-between;margin-right: 2%;align-items: center;background-color: #e9e9eb;;width: 100%;">
  545. <div style="display: flex;align-items: center;margin-left: 1%;">
  546. <el-checkbox v-model="checked1" label="参数是否分组" size="large" @change="gatherTable"/>
  547. <el-button @click="showAddFenzu" style="margin-left: 10%;" type="success" size="mini" plain v-if="checked1">新增分组</el-button>
  548. </div>
  549. <div style="display: flex;justify-content: flex-end;margin-right: 1%;">
  550. <el-button @click="addCan" style="margin-left: 5%;" type="success" size="mini" plain :disabled="selFen">新增参数</el-button>
  551. <el-button @click="delAllCan" style="margin-top: 0%;" type="danger" size="mini" plain>删除</el-button>
  552. </div>
  553. </div>
  554. <div style="display: flex;">
  555. <div v-if="checked1" style="margin-top:1%;width: 10%;background-color: #F2F6FC;height:32vh;">
  556. <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft"
  557. :data="groupTreeData" @node-click="handleNodeClick" node-key="id" style="margin-left: 0%;margin-top: 1%;width: 100%;background-color: transparent;" default-expand-all :key="valueKet">
  558. <template #default="{ node, data }">
  559. <span style="justify-content: space-between;display: flex;width: 100%;align-items: center;margin-left: -10%;">
  560. <div class="custom-tree-node" style="align-items: center;line-height: 1.5;">
  561. <span style="">{{ node.label }}</span>
  562. </div>
  563. <div style="margin-right: 1%;position: absolute;left:78%;">
  564. <el-dropdown trigger="hover" @click.stop v-if="currentNodeKey === data.mgid">
  565. <el-icon><MoreFilled /></el-icon>
  566. <!-- <svg-icon icon-class="zhankai"/> -->
  567. <template #dropdown>
  568. <el-dropdown-menu>
  569. <el-dropdown-item style="display: flex;" @click="showEditFen">
  570. <el-icon class="el-icon--right" style="color: black;">
  571. <Connection />
  572. </el-icon>
  573. <div>
  574. 编辑分组
  575. </div>
  576. </el-dropdown-item>
  577. <divider/>
  578. <el-dropdown-item style="display: flex;" @click="delFenZu" divided>
  579. <el-icon class="el-icon--right" style="color: black;">
  580. <CircleClose />
  581. </el-icon>
  582. <div>
  583. 删除分组
  584. </div>
  585. </el-dropdown-item>
  586. </el-dropdown-menu>
  587. </template>
  588. </el-dropdown>
  589. </div>
  590. </span>
  591. </template>
  592. </el-tree>
  593. </div>
  594. <div style="width: 90%;flex: 1;">
  595. <el-table
  596. style="margin-top: 1%;width: 100%;margin-left: 1%;overflow: auto;height:32vh;"
  597. :data="tableDataCan"
  598. :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
  599. :header-cell-style="{ textAlign: 'center', }"
  600. max-height="45vh"
  601. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  602. border>
  603. <el-table-column prop="parName" label="*参数英文名">
  604. <template #default="scope" style="width: 120%;">
  605. <el-input v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
  606. </template>
  607. </el-table-column>
  608. <el-table-column prop="parName" label="*参数名称">
  609. <template #default="scope">
  610. <el-input v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
  611. </template>
  612. </el-table-column>
  613. <el-table-column prop="parType" label="*参数类型" >
  614. <template #default="scope">
  615. <el-input v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
  616. </template>
  617. </el-table-column>
  618. <el-table-column prop="parLine" label="行号">
  619. <template #default="scope">
  620. <el-input v-model="scope.row.parLine" style="width: 120%;margin-left: -10%;"/>
  621. </template>
  622. </el-table-column>
  623. <el-table-column prop="parNote" label="维度">
  624. <template #default="scope">
  625. <el-input v-model="scope.row.parDimen" style="width: 120%;margin-left: -10%;"/>
  626. </template>
  627. </el-table-column>
  628. <el-table-column prop="parNote" label="表达式">
  629. <template #default="scope">
  630. <el-input v-model="scope.row.parExpr" style="width: 120%;margin-left: -10%;"/>
  631. </template>
  632. </el-table-column>
  633. <el-table-column prop="parNote" label="*默认值">
  634. <template #default="scope">
  635. <el-input v-model="scope.row.parDefVal" style="width: 120%;margin-left: -10%;"/>
  636. </template>
  637. </el-table-column>
  638. <el-table-column prop="parNote" label="参数范围">
  639. <template #default="scope">
  640. <el-input v-model="scope.row.parRange" style="width: 120%;margin-left: -10%;"/>
  641. </template>
  642. </el-table-column>
  643. <el-table-column prop="parNote" label="版本号">
  644. <template #default="scope">
  645. <el-input v-model="scope.row.parVersion" style="width: 120%;margin-left: -10%;"/>
  646. </template>
  647. </el-table-column>
  648. <el-table-column prop="parNote" label="操作" width="85">
  649. <template #default="scope">
  650. <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
  651. </template>
  652. </el-table-column>
  653. </el-table>
  654. </div>
  655. </div>
  656. </el-tab-pane>
  657. <el-tab-pane label="服务信息" style="height: 50vh;" :key="activeTabKey">
  658. <el-button @click="showAddSer" type="primary" plain size="mini" style="margin-left: 1%;">新增服务</el-button>
  659. <el-table
  660. :data="tableDataSer"
  661. style="width: 98%;margin-left: 1%;margin-top: 1%;height: 38vh;"
  662. :cell-style="{ padding:'5px' }"
  663. :header-cell-style="{height: heightAll*0.01+'px',}"
  664. :row-style="{ fontSize: '16px',textAlign:'center'}"
  665. border >
  666. <el-table-column type="index" label="序号" width="80">
  667. <template #default="{ $index }">
  668. <div style="text-align: center;">
  669. {{ $index + 1 }}
  670. </div>
  671. </template>
  672. </el-table-column>
  673. <el-table-column prop="name" label="服务名称" width="200">
  674. </el-table-column>
  675. <el-table-column prop="type" label="接口类型" width="200">
  676. </el-table-column>
  677. <el-table-column prop="url" label="接口地址" show-overflow-tooltip/>
  678. <el-table-column prop="rqtype" label="请求方式" width="200"/>
  679. <el-table-column prop="rptype" label="响应类型" width="150">
  680. <template #default="scope">
  681. <div style="text-align: center;display: flex;" v-if="scope.row.rptype=='1'">
  682. JSON
  683. </div>
  684. <div style="text-align: center;display: flex;" v-if="scope.row.rptype=='2'">
  685. XML
  686. </div>
  687. <div style="text-align: center;display: flex;" v-if="scope.row.rptype=='3'">
  688. HTML
  689. </div>
  690. </template>
  691. </el-table-column>
  692. <el-table-column prop="address" label="操作" width="190">
  693. <template #default="scope">
  694. <div style="display: flex;justify-content: space-between;width: 100%;">
  695. <el-button @click="editSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">编辑</el-button>
  696. <el-button @click="showTest(scope.row)" type="warning" text size="mini" style="margin-left:-5%;">调试</el-button>
  697. <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="delSer(scope.row)">注销</el-button>
  698. </div>
  699. </template>
  700. </el-table-column>
  701. </el-table>
  702. </el-tab-pane>
  703. </el-tabs>
  704. <template #footer>
  705. <span class="dialog-footer">
  706. <el-button @click="dialogVisiblePei = false">取消</el-button>
  707. <el-button type="primary" @click="saveChangePar">
  708. 提交
  709. </el-button>
  710. </span>
  711. </template>
  712. </el-dialog >
  713. <el-dialog @close="clearAdd" v-model="dialogVisibleSer" title="" width="70%" destroy-on-close
  714. :key="tableKey">
  715. <div style="overflow: auto;height: 80vh;">
  716. <el-form size="mini" :key="tableKey" style="margin-top: 1%;width: 98%;" :model="formAdd"
  717. label-position="right" ref="formRefAdd" label-width="120px" :rules="rulesAdd">
  718. <el-row :gutter="48">
  719. <el-col :span="10">
  720. <el-form-item label="服务名称:" prop="name" style="">
  721. <div style="display: flex;width: 100%;justify-content: space-between;">
  722. <el-input v-model="formAdd.name" style="width: 100%;"/>
  723. </div>
  724. </el-form-item>
  725. </el-col>
  726. <el-col :span="6">
  727. <el-form-item label="接口类型:" prop="" style="">
  728. <div style="display: flex;width: 100%;justify-content: space-between;">
  729. <el-select
  730. v-model="formAdd.type"
  731. style="width: 100%;margin-left: 0%;"
  732. >
  733. <el-option
  734. v-for="item in optionsType"
  735. :key="item.value"
  736. :label="item.label"
  737. :value="item.value"
  738. />
  739. </el-select>
  740. <div style="display: flex;">
  741. </div>
  742. </div>
  743. </el-form-item>
  744. </el-col>
  745. </el-row>
  746. <el-row :gutter="48">
  747. <el-col :span="10">
  748. <el-form-item label="接口地址:" prop="url">
  749. <el-input v-model="formAdd.url" style="width: 100%;" class="input-with-select">
  750. <template #prepend>
  751. <el-select v-model="formAdd.proxyPath" placeholder="Select" style="width: 115px;">
  752. <el-option v-for="item in gatewayRouters" :key="item.id" :label="item.serviceName"
  753. :value="item.predicates"/>
  754. </el-select>
  755. </template>
  756. </el-input>
  757. </el-form-item>
  758. </el-col>
  759. <el-col :span="6">
  760. <el-form-item label="请求方式:" prop="" style="">
  761. <el-select
  762. v-model="formAdd.rqtype"
  763. style="width: 100%;margin-left: 0%;"
  764. >
  765. <el-option
  766. v-for="item in optionsRqtype"
  767. :key="item.value"
  768. :label="item.label"
  769. :value="item.value"
  770. />
  771. </el-select>
  772. </el-form-item>
  773. </el-col>
  774. </el-row>
  775. <el-row :gutter="48">
  776. <el-col :span="10">
  777. <el-form-item label="所属模型:" prop="mdid" style="">
  778. <el-tree-select
  779. v-model="formAdd.mdid"
  780. :data="optionsMdid"
  781. check-strictly
  782. disabled
  783. :render-after-expand="false"
  784. style="width: 100%"
  785. />
  786. <!-- <el-select
  787. v-model="formAdd.mdid"
  788. style="width: 100%;margin-left: 0%;"
  789. >
  790. <el-option
  791. v-for="item in optionsMdid"
  792. :key="item.value"
  793. :label="item.label"
  794. :value="item.id"
  795. />
  796. </el-select> -->
  797. </el-form-item>
  798. </el-col>
  799. </el-row>
  800. <el-form-item label="排序:" prop="dcSort">
  801. <el-input-number v-model="formAdd.sort" :min="1" style="width: 15%;"/>
  802. </el-form-item>
  803. <el-row :gutter="48">
  804. <el-col :span="10">
  805. <el-form-item label="响应类型:" prop="" style="display: flex; align-items: center;">
  806. <el-radio-group v-model="formAdd.rptype" class="ml-4"
  807. style="display: inline-flex; align-items: center;">
  808. <el-radio label="1" size="large" style="display: inline-flex; align-items: center;">
  809. <span style="position: relative; top: -1px">JSON</span> <!-- 微调文字位置 -->
  810. </el-radio>
  811. <el-radio label="2" size="large" style="display: inline-flex; align-items: center;">
  812. <span style="position: relative; top: -1px">XML</span>
  813. </el-radio>
  814. <el-radio label="3" size="large" style="display: inline-flex; align-items: center;">
  815. <span style="position: relative; top: -1px">HTML</span>
  816. </el-radio>
  817. </el-radio-group>
  818. </el-form-item>
  819. </el-col>
  820. <el-col :span="6">
  821. <!-- <el-form-item label="服务分类:" prop="cateCode" style="">
  822. <el-cascader v-model="formAdd.cateCode" :options="cascaderOptions" :props="props1" clearable
  823. style="width: 100%;"></el-cascader>
  824. </el-form-item> -->
  825. </el-col>
  826. <!-- <el-col :span="8">
  827. <el-form-item label="请求方式:" prop="name" style="">
  828. <el-select
  829. v-model="formJi.type"
  830. :disabled="isEdit"
  831. style="width: 100%;margin-left: 0%;"
  832. >
  833. <el-option
  834. v-for="item in optionsType"
  835. :key="item.value"
  836. :label="item.label"
  837. :value="item.value"
  838. />
  839. </el-select>
  840. </el-form-item>
  841. </el-col> -->
  842. </el-row>
  843. <el-row :gutter="48">
  844. <el-col :span="13">
  845. <el-form-item label="服务说明:">
  846. <el-input v-model="formAdd.intro" style="width: 100%;" :rows="3" resize="none" type="textarea"/>
  847. </el-form-item>
  848. </el-col>
  849. </el-row>
  850. </el-form>
  851. <div style="margin-top: 2%;">
  852. <div style="display: flex;justify-content: space-between;align-items: center;">
  853. <div>
  854. 请求参数
  855. </div>
  856. <div style="display: flex;justify-content: flex-end;margin-right: 2%;">
  857. <el-button @click="addCanAdd" style="margin-top: 1%;" type="success" size="mini" plain>新增参数
  858. </el-button>
  859. </div>
  860. </div>
  861. <div>
  862. <el-table
  863. style="margin-top: 1%;width: 98%;"
  864. :data="tableDataCanAdd"
  865. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  866. :header-cell-style="{ textAlign: 'center'}"
  867. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  868. border>
  869. <el-table-column prop="itemName" label="参数字段(必填)">
  870. <template #default="scope">
  871. <div style="width: 100%;">
  872. <el-input placeholder="请填写参数编码" type="primary" class="noBor" v-model="scope.row.paramCode"
  873. size="mini" text style="margin-left: 0%;border: transparent;"></el-input>
  874. </div>
  875. </template>
  876. </el-table-column>
  877. <el-table-column prop="itemName" label="参数名称(必填)">
  878. <template #default="scope">
  879. <div style="width: 100%;">
  880. <el-input placeholder="请填写参数名称" type="primary" class="noBor" v-model="scope.row.paramName"
  881. size="mini" text style="margin-left: 0%;"></el-input>
  882. </div>
  883. </template>
  884. </el-table-column>
  885. <el-table-column prop="itemName" label="参数类型(必填)" width="200">
  886. <template #default="scope">
  887. <div style="width: 100%;">
  888. <el-select
  889. v-model="scope.row.paramType"
  890. class="noBorSel"
  891. placeholder=""
  892. style="width: 100%;margin-left: 0%;"
  893. >
  894. <el-option
  895. v-for="item in optionsCan"
  896. :key="item.value"
  897. :label="item.label"
  898. :value="item.value"
  899. />
  900. </el-select>
  901. </div>
  902. </template>
  903. </el-table-column>
  904. <el-table-column prop="itemName" label="参数示例">
  905. <template #default="scope">
  906. <div style="width: 100%;">
  907. <el-input placeholder="请填写参数示例" type="primary" class="noBor" v-model="scope.row.paramValue"
  908. size="mini" text style="margin-left: 0%;"></el-input>
  909. </div>
  910. </template>
  911. </el-table-column>
  912. <el-table-column prop="itemName" label="参数说明">
  913. <template #default="scope">
  914. <div style="width: 100%;">
  915. <el-input type="primary" class="noBor" v-model="scope.row.paramNote" size="mini" text
  916. style="margin-left: 0%;"></el-input>
  917. </div>
  918. </template>
  919. </el-table-column>
  920. <el-table-column prop="address" label="操作" width="100">
  921. <template #default="scope">
  922. <div style="width: 100%;">
  923. <el-button type="danger" @click="delCanAdd(scope.$index)" size="mini" text
  924. style="margin-left: 0%;">删除
  925. </el-button>
  926. </div>
  927. </template>
  928. </el-table-column>
  929. </el-table>
  930. </div>
  931. </div>
  932. <div style="margin-top: 2%;">
  933. <!-- <div>返回响应</div> -->
  934. <div style="color: #909399;margin-left: 8%;margin-top:1%;">此处填写本服务接口响应信息描述</div>
  935. <el-tabs type="card" style="margin-top: -2%;width: 98%;">
  936. <el-tab-pane label="响应内容">
  937. <div style="display: flex; flex-direction: column;">
  938. </div>
  939. </el-tab-pane>
  940. </el-tabs>
  941. <div style="overflow: auto;height: 20vh;margin-top: -1%;">
  942. <el-input placeholder="" :rows="8" type="textarea" v-model="JsonAdd" size="mini" text
  943. style="margin-top: 0%;width: 98%;"></el-input>
  944. </div>
  945. </div>
  946. <div style="margin-top: 2.5%;margin-left: 0%;padding-bottom: 1%;">
  947. <el-tabs type="card" style="margin-top: -1.5%;width: 98%;">
  948. <el-tab-pane label="使用说明">
  949. </el-tab-pane>
  950. </el-tabs>
  951. <el-input placeholder="请输入示例" :rows="8" type="textarea" v-model="exampleAdd" size="mini" text
  952. style="margin-top: -1%;width: 98%;"></el-input>
  953. </div>
  954. </div>
  955. <template #footer>
  956. <span class="dialog-footer">
  957. <el-button size="mini" @click="dialogVisible = false">取消</el-button>
  958. <el-button type="primary" v-if="isAddser" @click="addSer" size="mini">
  959. 提交
  960. </el-button>
  961. <el-button type="primary" v-if="!isAddser" @click="saveEditService" size="mini">
  962. 提交
  963. </el-button>
  964. </span>
  965. </template>
  966. </el-dialog>
  967. <el-dialog v-model="dialogVisibleFen" :title="titleFen" width="30%" @close="clearFromTree" destroy-on-close :key="tableKey">
  968. <el-form :label-width="100" label-position="right" style="margin-left: 5%;margin-top: 2%;" :model="formTree" class="demo-form-inline" ref="formRefTree" :rules="rulesTree">
  969. <el-form-item label="名称:" prop="parGroupName" style="">
  970. <el-input v-model="formTree.parGroupName" @blur="handleBlur" style="width: 75%;" placeholder="" resize="none"/>
  971. </el-form-item>
  972. <el-form-item label="组编码:" prop="parGroupCode" style="">
  973. <el-input v-model="formTree.parGroupCode" style="width: 75%;" placeholder="" resize="none"/>
  974. </el-form-item>
  975. <el-form-item label="说明:" prop="parGroupNote">
  976. <el-input v-model="formTree.parGroupNote" style="width: 75%;" placeholder="" type="textarea" resize="none"/>
  977. </el-form-item>
  978. <el-form-item label="排序:" prop="parGroupSort">
  979. <el-input-number v-model="formTree.parGroupSort" :min="1" style="width: 50%;"/>
  980. </el-form-item>
  981. </el-form>
  982. <template #footer>
  983. <span class="dialog-footer">
  984. <el-button size="mini" @click="dialogVisibleFen = false">取消</el-button>
  985. <el-button type="primary" @click="submitFen" size="mini">
  986. 提交
  987. </el-button>
  988. </span>
  989. </template>
  990. </el-dialog>
  991. <el-dialog v-model="dialogVisibleDetail" :title="titleFen" width="80%" @close="clearFromTree" destroy-on-close :key="tableKey">
  992. <div ref="expandableDiv" :style="{ height: currentHeight + 'px' }" style="position: relative;width: 98%;margin-left: 1%;border: #47AFE5 1px solid;min-height: 10vh;margin-top: 1%;border-radius: 8px;">
  993. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  994. <div style="display: flex;align-items: center;width: 50%;">
  995. <div style="font-size: 16px;font-weight: bold;">
  996. 模型名称:
  997. </div>
  998. <div style="font-size: 15px;">
  999. 上海沿海风暴潮预报模型
  1000. </div>
  1001. </div>
  1002. <div style="display: flex;align-items: center;width: 50%;">
  1003. <div style="font-size: 16px;font-weight: bold;">
  1004. 英文名称:
  1005. </div>
  1006. <div style="font-size: 15px;">
  1007. Shang Hai Shi Cheng Qu Hong Lao Fang Zhen Mo Xing
  1008. </div>
  1009. </div>
  1010. </div>
  1011. <div style="display: flex;align-items: center;width: 50%;margin-top: 1%;margin-left: 3%;">
  1012. <div style="font-size: 16px;font-weight: bold;">
  1013. 模型简介:
  1014. </div>
  1015. <div style="font-size: 15px;">
  1016. Shang Hai Shi Cheng Qu Hong Lao Fang Zhen Mo Xing
  1017. </div>
  1018. </div>
  1019. <div v-if="isExpanded">
  1020. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  1021. <div style="display: flex;align-items: center;width: 50%;">
  1022. <div style="font-size: 16px;font-weight: bold;">
  1023. 版本号:
  1024. </div>
  1025. <div style="font-size: 15px;">
  1026. </div>
  1027. </div>
  1028. <div style="display: flex;align-items: center;width: 50%;">
  1029. <div style="font-size: 16px;font-weight: bold;">
  1030. 接口分类:
  1031. </div>
  1032. <div style="font-size: 15px;">
  1033. </div>
  1034. </div>
  1035. </div>
  1036. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  1037. <div style="display: flex;align-items: center;width: 50%;">
  1038. <div style="font-size: 16px;font-weight: bold;">
  1039. 开发语言:
  1040. </div>
  1041. <div style="font-size: 15px;">
  1042. </div>
  1043. </div>
  1044. </div>
  1045. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  1046. <div style="display: flex;align-items: center;width: 50%;">
  1047. <div style="font-size: 16px;font-weight: bold;">
  1048. 模型归属单位:
  1049. </div>
  1050. <div style="font-size: 15px;">
  1051. </div>
  1052. </div>
  1053. <div style="display: flex;align-items: center;width: 50%;">
  1054. <div style="font-size: 16px;font-weight: bold;">
  1055. 联系方式:
  1056. </div>
  1057. <div style="font-size: 15px;">
  1058. </div>
  1059. </div>
  1060. </div>
  1061. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  1062. <div style="display: flex;align-items: center;width: 50%;">
  1063. <div style="font-size: 16px;font-weight: bold;">
  1064. 技术支持单位:
  1065. </div>
  1066. <div style="font-size: 15px;">
  1067. </div>
  1068. </div>
  1069. <div style="display: flex;align-items: center;width: 50%;">
  1070. <div style="font-size: 16px;font-weight: bold;">
  1071. 联系方式:
  1072. </div>
  1073. <div style="font-size: 15px;">
  1074. </div>
  1075. </div>
  1076. </div>
  1077. </div>
  1078. <el-link :icon="isExpanded ? ArrowUp : ArrowDown" @click="zhankai" type="primary" size="mini" style="position: absolute;right:1%;bottom: 5%;">{{ isExpanded ? '收起' : '展开' }}</el-link >
  1079. </div>
  1080. <div style="position: relative;width: 98%;margin-left: 1%;border: #47AFE5 1px solid;height: 40vh;margin-top: 1%;border-radius: 8px;">
  1081. <div style="width: 100%;height:3vh;background-color: #6CA8DB;display: flex;align-items: center;padding-left: 1%;border-top-left-radius: 8px;border-top-right-radius: 8px;color: white;font-size: 14px">
  1082. <div @click="changeBack(0)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[0]}">
  1083. 服务信息
  1084. </div>
  1085. <div @click="changeBack(1)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[1]}">
  1086. 数据信息
  1087. </div>
  1088. <div @click="changeBack(2)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[2]}">
  1089. 工作流程
  1090. </div>
  1091. <div @click="changeBack(3)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[3]}">
  1092. 任务信息
  1093. </div>
  1094. <div @click="changeBack(4)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[4]}">
  1095. 消息信息
  1096. </div>
  1097. <div @click="changeBack(5)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[5]}">
  1098. 日志信息
  1099. </div>
  1100. <div @click="changeBack(6)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;":style="{backgroundColor: activeColor[6]}">
  1101. 访问统计
  1102. </div>
  1103. </div>
  1104. </div>
  1105. <template #footer>
  1106. <span class="dialog-footer">
  1107. <el-button size="mini" @click="dialogVisibleDetail = false">取消</el-button>
  1108. <el-button type="primary" @click="submitFen" size="mini">
  1109. 提交
  1110. </el-button>
  1111. </span>
  1112. </template>
  1113. </el-dialog>
  1114. <el-dialog @close="clearAdd" v-model="dialogVisibleTest" :title="formJi.name" width="60%" destroy-on-close :key="tableKey">
  1115. <div style="margin-left: 1%;">
  1116. {{ detailJson.name }}:
  1117. </div>
  1118. <div style="display: flex;align-items: center;width: 98%;margin-top: 1%;">
  1119. <div v-if="detailJson.rqtype==='GET'">
  1120. <el-tag class="ml-2" type="warning">GET</el-tag>
  1121. </div>
  1122. <div v-if="detailJson.rqtype==='POST'">
  1123. <el-tag class="ml-2" type="warning">POST</el-tag>
  1124. </div>
  1125. <div style="margin-left: 1%;">
  1126. {{ detailJson.url }}
  1127. </div>
  1128. <!-- <svg-icon @click="test" icon-class="startTest" style="margin-left: 1%;width: 50px;height: 25px;cursor: pointer;"/> -->
  1129. <el-button @click="test" size="mini" type="primary" style="margin-left: 1%;cursor: pointer;" plain>点击测试</el-button>
  1130. </div>
  1131. <div style="margin-top:2%;font-size: 18px;">
  1132. 请求参数
  1133. </div>
  1134. <el-table
  1135. style="margin-top: 1%;width: 98%;"
  1136. :data="tableDataCan"
  1137. :cell-style="{ textAlign: 'center',padding:'2px 0' }"
  1138. :header-cell-style="{ textAlign: 'center'}"
  1139. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  1140. border >
  1141. <el-table-column prop="paramCode" label="参数字段">
  1142. </el-table-column>
  1143. <el-table-column prop="paramName" label="参数名称">
  1144. </el-table-column>
  1145. <el-table-column prop="paramType" label="参数类型" width="200">
  1146. </el-table-column>
  1147. <el-table-column prop="paramValue" label="测试值">
  1148. <template #default="scope">
  1149. <div style="width: 100%;">
  1150. <el-input placeholder="请填写" type="primary" class="noBor" v-model="scope.row.paramValue" size="mini" text style="margin-left: 0%;"></el-input>
  1151. </div>
  1152. </template>
  1153. </el-table-column>
  1154. <el-table-column prop="paramNote" label="参数说明" show-overflow-tooltip>
  1155. </el-table-column>
  1156. </el-table>
  1157. <div style="margin-top:4%;font-size: 18px;">
  1158. 测试结果
  1159. </div>
  1160. <el-input :style="isError ? '--el-input-text-color: red' : ''" placeholder="" :rows="8" type="textarea" v-model="dataReturn" size="mini" text style="margin-top: 1%;width: 98%;color: red;" ></el-input>
  1161. <template #footer>
  1162. <span class="dialog-footer">
  1163. </span>
  1164. </template>
  1165. </el-dialog>
  1166. </div>
  1167. </div>
  1168. </template>
  1169. <script setup>
  1170. import { getModelList,addModel,delMdid,getModelDetail,updateModel,
  1171. addGroup,getParamsList,changePar,delAllPar,getModelParList,delFen,changeShenhe,delModelPar } from "@/api/register/regCom";
  1172. import {getServiceInfo,addService,modelTreeSelect,getSerDe,delService,testService,
  1173. addServiceParam,editService} from "@/api/service/info";
  1174. import { ref, onMounted, onUnmounted, nextTick } from 'vue';
  1175. import { Search } from '@element-plus/icons-vue'
  1176. import {
  1177. ArrowLeft,
  1178. ArrowUp,
  1179. ArrowDown
  1180. } from '@element-plus/icons-vue'
  1181. import { reactive } from 'vue'
  1182. import { forwardRefProps } from 'element-plus/es/components/tooltip-v2/src/forward-ref.mjs';
  1183. import { getToken } from "@/utils/auth";
  1184. import { fa } from "element-plus/es/locales.mjs";
  1185. import { column } from "element-plus/es/components/table-v2/src/common.mjs";
  1186. import { TRUE } from "sass";
  1187. import { editGroup } from "../../../api/register/regCom";
  1188. import pinyin from 'pinyin';
  1189. const { proxy } = getCurrentInstance();
  1190. const dialogVisibleFen = ref(false)
  1191. const currentHeight = ref(100)
  1192. const dragTableRef = ref()
  1193. const isaddFen = ref(false)
  1194. const isAddser = ref(true)
  1195. const dialogVisibleDetail = ref(false)
  1196. const dialogVisible = ref(false)
  1197. const dialogVisibleDe = ref(false)
  1198. const dialogVisiblePei = ref(false)
  1199. const active = ref(1)
  1200. const isEdit = ref(true)
  1201. const name = ref('')
  1202. const isAdd = ref(true)
  1203. const mdUnit = ref('')
  1204. const tableDataCanAdd = ref([])
  1205. const JsonAdd = ref('')
  1206. const isElse = ref(false)
  1207. const elseLan = ref('')
  1208. const tableDataCan = ref([])
  1209. const selFen = ref(true)
  1210. const groupTreeData = ref([])
  1211. const isExpanded = ref(false)
  1212. const expandableDiv = ref(null)
  1213. const parRow = ref({})
  1214. const initialHeight = 100
  1215. const optionsMdid = ref([])
  1216. const activeColor = ref(['#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB'])
  1217. const expandedHeight = 250
  1218. const tableDataSer = ref([])
  1219. const formAdd = ref({
  1220. name: '',
  1221. cateCode: '',
  1222. type: '',
  1223. proxyPath: '',
  1224. url: '',
  1225. rqtype: '',
  1226. rptype: '',
  1227. intro: '',
  1228. mdid: ''
  1229. });
  1230. const rulesAdd = reactive({
  1231. mdid: [{required: true, message: '必填', trigger: 'blur'}],
  1232. name: [{required: true, message: '必填', trigger: 'blur'}],
  1233. url: [{required: true, message: '必填', trigger: 'blur'}],
  1234. });
  1235. const formRefAdd = ref();
  1236. const optionsRqtype = ref([
  1237. {
  1238. label: 'GET',
  1239. value: 'GET'
  1240. },
  1241. {
  1242. label: 'POST',
  1243. value: 'POST'
  1244. },
  1245. ])
  1246. const formJi = ref({
  1247. name:'',
  1248. version:'',
  1249. enname:'',
  1250. devlang:'',
  1251. intro:'',
  1252. type:'',
  1253. mdContact:'',
  1254. mdUnit:'',
  1255. devUnit:'',
  1256. devContact:'',
  1257. deployDir:'',
  1258. deployIp:'',
  1259. deployPort:'',
  1260. mirrorImageUrl:'',
  1261. mdRunCmd:'',
  1262. envOs:'',
  1263. envDisk:'',
  1264. envGpuMem:'11',
  1265. evnArmX86:'',
  1266. envCpuNum:'',
  1267. envGpuType:'',
  1268. envGpuNum:'2',
  1269. envMem:'',
  1270. mdInNote:'',
  1271. mdOutNote:''
  1272. });
  1273. const activeTabKey = ref(0)
  1274. const rulesJi = reactive({
  1275. name: [{ required: true, message: '必填', trigger: 'blur' }],
  1276. enname: [{ required: true, message: '必填', trigger: 'blur' }],
  1277. });
  1278. const formRefJi = ref();
  1279. const formZu = ref({
  1280. mirrorImageEurl:'',
  1281. mdCPU:'',
  1282. mdGPU:''
  1283. });
  1284. const rulesZu = reactive({
  1285. mirrorImageEurl: [{ required: true, message: '必填', trigger: 'blur' }],
  1286. mdCPU: [{ required: true, message: '必填', trigger: 'blur' }],
  1287. });
  1288. const formRefZu = ref();
  1289. const formTree = ref({
  1290. parGroupSort:1,
  1291. parGroupNote:'',
  1292. parGroupName:'',
  1293. parGroupCode:''
  1294. });
  1295. const rulesTree = reactive({
  1296. parGroupName: [{ required: true, message: '必填', trigger: 'blur' }],
  1297. parGroupSort: [{ required: true, message: '必填', trigger: 'blur' }],
  1298. parGroupCode: [{ required: true, message: '必填', trigger: 'blur' }],
  1299. });
  1300. const formRefTree = ref();
  1301. const optionsCan = ref([
  1302. {
  1303. label: "string",
  1304. value: 'string'
  1305. },
  1306. {
  1307. label: "int",
  1308. value: 'int'
  1309. },
  1310. {
  1311. label: "boolean",
  1312. value: 'boolean'
  1313. },
  1314. {
  1315. label: "array",
  1316. value: 'array'
  1317. },
  1318. {
  1319. label: "object",
  1320. value: 'object'
  1321. },
  1322. {
  1323. label: "number",
  1324. value: 'number'
  1325. },
  1326. {
  1327. label: "null",
  1328. value: 'null'
  1329. },
  1330. {
  1331. label: "any",
  1332. value: 'any'
  1333. },
  1334. ])
  1335. const activeName = ref('first')
  1336. const titleFen = ref('');
  1337. const upload = reactive({
  1338. // 是否显示弹出层(用户导入)
  1339. open: false,
  1340. // 弹出层标题(用户导入)
  1341. title: "",
  1342. // 是否禁用上传
  1343. isUploading: false,
  1344. // 是否更新已经存在的用户数据
  1345. updateSupport: '',
  1346. // 设置上传的请求头部
  1347. headers: { Authorization: "Bearer " + getToken() },
  1348. // 上传的地址
  1349. url: import.meta.env.VITE_APP_BASE_API + "/common/upload"
  1350. });
  1351. const downUrl = ref(import.meta.env.VITE_APP_BASE_API)
  1352. const tableKey = ref(0);
  1353. const totalComReg = ref()
  1354. const parMgid = ref()
  1355. const currentPage = ref(1)
  1356. const tableData2 = ref([
  1357. { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
  1358. { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' },
  1359. { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' }
  1360. ]);
  1361. const tableData3 = ref([
  1362. { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
  1363. { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' },
  1364. { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' }
  1365. ]);
  1366. const checked1 = ref(true)
  1367. const tableData1= [{date1:'初始状态',
  1368. date2:'sts',
  1369. date3:'数据项',
  1370. date4:'初始状态',
  1371. date5:'是',
  1372. date6:'否',
  1373. date7:'2023-09-08'
  1374. }]
  1375. const checkGroup = [
  1376. {label:'水文预报'},
  1377. {label:'维水动力'},
  1378. {label:'二维水动力'},
  1379. {label:'机器学习'},
  1380. ]
  1381. let tableData = ref([{name:'1'}])
  1382. const heightAll = window.innerHeight
  1383. const valueHelpSel = '';
  1384. const tableheight = window.innerHeight*0.8
  1385. const optionsType = [
  1386. {
  1387. value: '1',
  1388. label: '水利专业模型',
  1389. },
  1390. {
  1391. value: '2',
  1392. label: '排水专业模型',
  1393. },
  1394. {
  1395. value: '3',
  1396. label: '供水专业模型',
  1397. },
  1398. {
  1399. value: '4',
  1400. label: '海洋专业模型',
  1401. },
  1402. ]
  1403. const optionsEnv = ref([
  1404. {
  1405. value: 'windwos',
  1406. label: 'windwos',
  1407. },
  1408. {
  1409. value: 'Linux',
  1410. label: 'Linux',
  1411. },
  1412. {
  1413. value: 'Ubuntu',
  1414. label: 'Ubuntu',
  1415. },
  1416. {
  1417. value: 'CentOS',
  1418. label: 'CentOS',
  1419. },
  1420. {
  1421. value: 'Debian',
  1422. label: 'Debian',
  1423. },
  1424. {
  1425. value: 'RedHat',
  1426. label: 'RedHat',
  1427. },
  1428. {
  1429. value: '统信',
  1430. label: '统信',
  1431. },
  1432. {
  1433. value: '麒麟',
  1434. label: '麒麟',
  1435. },
  1436. {
  1437. value: '欧拉',
  1438. label: '欧拉',
  1439. },
  1440. ])
  1441. const uploadRef = ref(null);
  1442. const fileList = ref([]);
  1443. const fileList1 = ref([]);
  1444. const tableDataCanAll = ref([]);
  1445. const parForm = ref('')
  1446. const currentNodeKey = ref('')
  1447. const parTree = ref({})
  1448. onMounted(() => {
  1449. getModelListTable()
  1450. // addNewModel()
  1451. });
  1452. const handleChange = (file, files) => {
  1453. fileList.value = files;
  1454. };
  1455. const handleChange1 = (file, files) => {
  1456. fileList1.value = files;
  1457. };
  1458. function changeBack(index){
  1459. active.value = index
  1460. for(var i=0;i<activeColor.value.length;i++){
  1461. if(i===index){
  1462. activeColor.value[i] = 'rgb(51, 126, 204)'
  1463. }
  1464. else{
  1465. activeColor.value[i] = ''
  1466. }
  1467. }
  1468. }
  1469. function zhankai(){
  1470. isExpanded.value = !isExpanded.value
  1471. currentHeight.value = isExpanded.value ? expandedHeight : initialHeight
  1472. }
  1473. function getChineseInitials(str) {
  1474. if (!str || typeof str !== 'string') return '';
  1475. // 拆分字符串为字符数组
  1476. const chars = str.split('');
  1477. const result = chars.map(char => {
  1478. // 判断是否为中文(Unicode范围:\u4e00-\u9fa5)
  1479. if (/[\u4e00-\u9fa5]/.test(char)) {
  1480. // 获取中文首字母拼音(忽略多音字)
  1481. const pinyinArr = pinyin(char, {
  1482. style: pinyin.STYLE_FIRST_LETTER,
  1483. heteronym: false
  1484. });
  1485. return pinyinArr[0][0]; // 返回首字母
  1486. }
  1487. return char; // 非中文字符直接保留(若需忽略英文可改为空字符串)
  1488. });
  1489. return result.join('');
  1490. }
  1491. function shenhe(row){
  1492. var par = {
  1493. srvIds:row.mdid,
  1494. audit:'2',
  1495. devkind:'APP'
  1496. }
  1497. changeShenhe(par).then(res=>{
  1498. if(res.code===200){
  1499. proxy.$modal.msgSuccess("已可测试!");
  1500. }
  1501. })
  1502. }
  1503. function addCanAdd() {
  1504. var par = {
  1505. parName: ''
  1506. }
  1507. tableDataCanAdd.value.push(par)
  1508. }
  1509. function delCanAdd(index) {
  1510. tableDataCanAdd.value.splice(index, 1)
  1511. }
  1512. const exampleAdd = ref('')
  1513. const parId = ref('')
  1514. const isError = ref(false)
  1515. const dataReturn = ref('')
  1516. function test(){
  1517. var par = detailJson.value
  1518. par.params = tableDataCan.value
  1519. testService(par).then(res=>{
  1520. if(res.code===444){
  1521. isError.value = true
  1522. }else{
  1523. isError.value = false
  1524. }
  1525. console.log(res)
  1526. dataReturn.value = res.msg
  1527. })
  1528. }
  1529. async function saveEditService() {
  1530. console.log(tableDataCanAdd.value.length)
  1531. var valid
  1532. await formRefAdd.value.validate((valid1) => {
  1533. valid = valid1
  1534. });
  1535. if (valid) {
  1536. var par = formAdd.value
  1537. par.example = exampleAdd.value
  1538. par.rpcontent = JsonAdd.value
  1539. var validTable = true
  1540. for (const item of tableDataCanAdd.value) {
  1541. if (item.paramCode.length === 0 || item.paramName.length === 0 || item.paramType.length === 0) {
  1542. proxy.$modal.msgError("请填写必填项!");
  1543. validTable = false
  1544. break;
  1545. }
  1546. }
  1547. if (validTable) {
  1548. await editService(par).then(res => {
  1549. if (res.code === 200) {
  1550. var parCan = tableDataCanAdd.value
  1551. if(parCan.length!== 0){
  1552. parCan.forEach(item => {
  1553. item.srvId = parId.value
  1554. });
  1555. addServiceParam(parCan).then(res1 => {
  1556. if (res1.code === 200) {
  1557. proxy.$modal.msgSuccess("修改成功");
  1558. dialogVisibleSer.value = false
  1559. showPei(parRow.value)
  1560. }
  1561. })
  1562. }
  1563. else{
  1564. proxy.$modal.msgSuccess("修改成功");
  1565. dialogVisibleSer.value = false
  1566. showPei(parRow.value)
  1567. }
  1568. }
  1569. })
  1570. }
  1571. }
  1572. }
  1573. function clearAdd(){
  1574. formAdd.value = {
  1575. name: '',
  1576. cateCode: '',
  1577. type: '',
  1578. proxyPath: '',
  1579. url: '',
  1580. rqtype: '',
  1581. rptype: '',
  1582. intro: '',
  1583. mdid: parId.value
  1584. }
  1585. tableDataCanAdd.value = []
  1586. JsonAdd.value = ''
  1587. exampleAdd.value = ''
  1588. }
  1589. async function addSer() {
  1590. console.log(JsonAdd.value)
  1591. var valid
  1592. await formRefAdd.value.validate((valid1) => {
  1593. valid = valid1
  1594. });
  1595. console.log(valid)
  1596. if (valid) {
  1597. var par = formAdd.value
  1598. par.example = exampleAdd.value
  1599. par.rpcontent = JsonAdd.value
  1600. console.log(par)
  1601. await addService(par).then(res => {
  1602. if (res.code === 200) {
  1603. var parCan = tableDataCanAdd.value
  1604. if (tableDataCanAdd.value.length !== 0) {
  1605. parCan.forEach((item, index) => {
  1606. item.srvId = res.data.srvId
  1607. if (item.paramName === '') {
  1608. parCan.splice(index, 1)
  1609. }
  1610. });
  1611. addServiceParam(parCan).then(res1 => {
  1612. if (res1.code === 200) {
  1613. proxy.$modal.msgSuccess("新增成功");
  1614. dialogVisibleSer.value = false
  1615. showPei(parRow.value)
  1616. }
  1617. })
  1618. }
  1619. }
  1620. })
  1621. }
  1622. }
  1623. function handleBlur(){
  1624. formTree.value.parGroupCode = getChineseInitials(formTree.value.parGroupName)
  1625. }
  1626. function gatherTable(){
  1627. if(checked1.value===false){
  1628. var keyArray = []
  1629. tableDataCanAll.value.forEach(item=>{
  1630. keyArray.push(item.key)
  1631. })
  1632. tableDataCanAll.value.forEach(item=>{
  1633. tableDataCan.value.forEach(item2=>{
  1634. if(item2.key===item.key){
  1635. item = item2
  1636. }
  1637. })
  1638. })
  1639. tableDataCan.value.forEach(item=>{
  1640. if(!keyArray.includes(item.key)){
  1641. tableDataCanAll.value.push(item)
  1642. }
  1643. })
  1644. currentNodeKey.value = null
  1645. selFen.value = true
  1646. tableDataCan.value = tableDataCanAll.value
  1647. }
  1648. }
  1649. function showAddSer(){
  1650. dialogVisibleSer.value = true
  1651. isAddser.value = true
  1652. }
  1653. async function editSer(row){
  1654. dialogVisibleSer.value = true
  1655. isAddser.value = false
  1656. parId.value = row.srvId
  1657. await getSerDe(row.srvId).then(res => {
  1658. tableDataCanAdd.value = res.data.list
  1659. JsonAdd.value = res.data.ptService.rpcontent
  1660. formAdd.value = res.data.ptService
  1661. exampleAdd.value = res.data.ptService.example
  1662. })
  1663. }
  1664. const dialogVisibleSer = ref(false)
  1665. function handleNodeClick(node, data){
  1666. console.log(node.mgid)
  1667. parMgid.value = node.mgid
  1668. var keyArray = []
  1669. selFen.value = false
  1670. tableDataCanAll.value.forEach(item=>{
  1671. keyArray.push(item.key)
  1672. })
  1673. tableDataCanAll.value.forEach(item=>{
  1674. tableDataCan.value.forEach(item2=>{
  1675. if(item2.key===item.key){
  1676. item = item2
  1677. }
  1678. })
  1679. })
  1680. tableDataCan.value.forEach(item=>{
  1681. if(!keyArray.includes(item.key)){
  1682. tableDataCanAll.value.push(item)
  1683. }
  1684. })
  1685. parTree.value = data.data
  1686. tableDataCan.value = []
  1687. tableDataCanAll.value.forEach(item=>{
  1688. if(item.parGroup==data.data.parGroupCode){
  1689. tableDataCan.value.push(item)
  1690. }
  1691. })
  1692. currentNodeKey.value = data.data.mgid
  1693. }
  1694. function submitFen(){
  1695. formTree.value.mdid = parForm.value.mdid
  1696. console.log(isaddFen.value)
  1697. if(isaddFen.value===true){
  1698. addGroup(formTree.value).then(res=>{
  1699. if(res.code===200){
  1700. var par = {
  1701. mdid:parForm.value.mdid
  1702. }
  1703. getModelParList(par).then(res1=>{
  1704. proxy.$modal.msgSuccess("新增成功");
  1705. groupTreeData.value = res1.data
  1706. groupTreeData.value.forEach((item, index, array) => {
  1707. item.label = item.parGroupName
  1708. item.value = item.parGroupCode
  1709. dialogVisibleFen.value = false
  1710. })
  1711. })
  1712. }
  1713. })
  1714. }
  1715. else{
  1716. editGroup(formTree.value).then(res=>{
  1717. if(res.code===200){
  1718. var par = {
  1719. mdid:parForm.value.mdid
  1720. }
  1721. getModelParList(par).then(res1=>{
  1722. proxy.$modal.msgSuccess("修改成功");
  1723. groupTreeData.value = res1.data
  1724. groupTreeData.value.forEach((item, index, array) => {
  1725. item.label = item.parGroupName
  1726. item.value = item.parGroupCode
  1727. dialogVisibleFen.value = false
  1728. })
  1729. })
  1730. }
  1731. })
  1732. }
  1733. }
  1734. function showEditFen(){
  1735. isaddFen.value = false
  1736. dialogVisibleFen.value = true
  1737. formTree.value = parTree.value
  1738. }
  1739. function showAddFenzu(){
  1740. isaddFen.value = true
  1741. dialogVisibleFen.value = true
  1742. }
  1743. function delFenZu(){
  1744. proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
  1745. return delFen(parTree.value.mgid);
  1746. }).then(() => {
  1747. var par = {
  1748. mdid:parForm.value.mdid
  1749. }
  1750. getModelParList(par).then(res1=>{
  1751. groupTreeData.value = res1.data
  1752. groupTreeData.value.forEach((item, index, array) => {
  1753. item.label = item.parGroupName
  1754. item.value = item.parGroupCode
  1755. dialogVisibleFen.value = false
  1756. })
  1757. })
  1758. proxy.$modal.msgSuccess("删除成功");
  1759. }).catch(() => {});
  1760. }
  1761. function delAllCan(){
  1762. proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
  1763. return delAllPar(parForm.value.mdid);
  1764. }).then(() => {
  1765. tableDataCan.value = []
  1766. proxy.$modal.msgSuccess("删除成功");
  1767. }).catch(() => {});
  1768. }
  1769. function saveChangePar(){
  1770. if(checked1.value===true&&tableDataCan.value.length>0){
  1771. tableDataCan.value.forEach((item, index, array) => {
  1772. tableDataCanAll.value.push(item)
  1773. })
  1774. }
  1775. if(tableDataCanAll.value.length>0){
  1776. tableDataCanAll.value.forEach((item, index, array) => {
  1777. item.mdid = parForm.value.mdid
  1778. item.parCate = 'int'
  1779. })
  1780. changePar(tableDataCanAll.value).then(res=>{
  1781. if(res.code===200){
  1782. proxy.$modal.msgSuccess("修改成功");
  1783. dialogVisiblePei.value = false
  1784. getModelListTable()
  1785. }
  1786. })
  1787. }
  1788. else{
  1789. var par = {
  1790. mdid:parForm.value.mdid
  1791. }
  1792. delModelPar(par).then(res=>{
  1793. if(res.code===200){
  1794. proxy.$modal.msgSuccess("修改成功");
  1795. dialogVisiblePei.value = false
  1796. getModelListTable()
  1797. }
  1798. })
  1799. }
  1800. }
  1801. async function showPei(row){
  1802. dialogVisiblePei.value = true
  1803. parRow.value = row
  1804. var par = {
  1805. mdid:row.mdid
  1806. }
  1807. parId.value = row.mdid
  1808. formAdd.value.mdid = row.mdid
  1809. await getServiceInfo(par).then(res=>{
  1810. if(res.data){
  1811. tableDataSer.value = res.data.serviceList
  1812. }
  1813. var par = [
  1814. {
  1815. value:'1',
  1816. label:'JSON'
  1817. },
  1818. {
  1819. value:'2',
  1820. label:'XML'
  1821. },
  1822. {
  1823. value:'3',
  1824. label:'HTML'
  1825. }
  1826. ]
  1827. for(var i = 0; i < par.length; i++){
  1828. for(var i1 = 0; i1 < tableDataSer.value.length; i1++){
  1829. if(par[i].value === tableDataSer.value[i1].rptype){
  1830. tableDataSer.value[i1].rptype = par[i].label
  1831. }
  1832. }
  1833. }
  1834. })
  1835. await getModelParList(par).then(res=>{
  1836. groupTreeData.value = res.data
  1837. groupTreeData.value.forEach((item, index, array) => {
  1838. item.label = item.parGroupName
  1839. item.value = item.parGroupCode
  1840. })
  1841. })
  1842. await getModelDetail(row.mdid).then(res=>{
  1843. parForm.value = res.data
  1844. formJi.value = res.data
  1845. })
  1846. await getParamsList(par).then(res=>{
  1847. tableDataCan.value = res.data
  1848. tableDataCan.value.forEach(item=>{
  1849. item.key = Math.random()
  1850. })
  1851. })
  1852. tableDataCanAll.value = JSON.parse(JSON.stringify(tableDataCan.value))
  1853. }
  1854. function delCan(index,row){
  1855. tableDataCan.value.splice(index, 1)
  1856. tableDataCanAll.value.forEach((item,index,array)=>{
  1857. if(item.key===row.key){
  1858. array.splice(index,1)
  1859. }
  1860. })
  1861. }
  1862. const detailJson = ref({})
  1863. const dialogVisibleTest = ref(false)
  1864. function showTest(row){
  1865. dialogVisibleTest.value = true
  1866. dataReturn.value = ''
  1867. getSerDe(row.srvId).then(res=>{
  1868. if(res.code===200){
  1869. detailJson.value = res.data.ptService
  1870. console.log(detailJson.value)
  1871. dialogVisibleTest.value = true
  1872. tableDataCan.value = res.data.list
  1873. }
  1874. })
  1875. }
  1876. function convertNullToEmptyString(data) {
  1877. // 如果不是对象或者是null,直接返回(基础类型)
  1878. if (typeof data !== 'object' || data === null) {
  1879. return data;
  1880. }
  1881. // 如果是数组,遍历每个元素并递归处理
  1882. if (Array.isArray(data)) {
  1883. return data.map(item => convertNullToEmptyString(item));
  1884. }
  1885. // 处理普通对象
  1886. const result = {};
  1887. for (let key in data) {
  1888. if (data.hasOwnProperty(key)) {
  1889. const value = data[key];
  1890. if (value === null) {
  1891. // 将null直接转为空字符串
  1892. result[key] = '';
  1893. } else if (typeof value === 'object') {
  1894. // 递归处理嵌套对象或数组
  1895. result[key] = convertNullToEmptyString(value);
  1896. } else {
  1897. // 其他类型的值直接复制
  1898. result[key] = value;
  1899. }
  1900. }
  1901. }
  1902. return result;
  1903. }
  1904. function showDe(row){
  1905. dialogVisibleDe.value = true
  1906. getModelDetail(row.mdid).then(res=>{
  1907. parForm.value = res.data
  1908. formJi.value = res.data
  1909. formJi.value = convertNullToEmptyString(formJi.value)
  1910. if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
  1911. isElse.value = true
  1912. formJi.value.devlang = 1
  1913. }
  1914. })
  1915. }
  1916. function addCan(){
  1917. tableDataCan.value.push({
  1918. key:Math.random(),
  1919. mgid:parMgid.value,
  1920. parGroup:parTree.value.parGroupCode
  1921. })
  1922. console.log(tableDataCan.value)
  1923. }
  1924. function downOut(){
  1925. var url = window.location.host + formJi.value.mdOutFile
  1926. console.log(url)
  1927. const link = document.createElement('a');
  1928. link.href = 'http://' + url.toString();
  1929. link.download = formJi.value.mdOutName; // 自定义文件名(可选)
  1930. document.body.appendChild(link);
  1931. link.click();
  1932. document.body.removeChild(link);
  1933. }
  1934. function downIn(){
  1935. var url = window.location.host + formJi.value.mdInFile
  1936. console.log(url)
  1937. const link = document.createElement('a');
  1938. link.href = 'http://' + url.toString();
  1939. link.download = formJi.value.mdInName; // 自定义文件名(可选)
  1940. document.body.appendChild(link);
  1941. link.click();
  1942. document.body.removeChild(link);
  1943. }
  1944. function delModel(row){
  1945. proxy.$modal.confirm('是否确认删除?').then(function () {
  1946. return delMdid(row.mdid);
  1947. }).then(() => {
  1948. getModelListTable();
  1949. proxy.$modal.msgSuccess("删除成功");
  1950. }).catch(() => {});
  1951. }
  1952. async function showEdit(row){
  1953. dialogVisible.value = true
  1954. isEdit.value = true
  1955. await nextTick()
  1956. getModelDetail(row.mdid).then(res=>{
  1957. formJi.value = res.data
  1958. if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
  1959. console.log(formJi.value.devlang)
  1960. isElse.value = true
  1961. formJi.value.devlang = '1'
  1962. }
  1963. })
  1964. }
  1965. async function subEdit(){
  1966. if(fileList.value&&fileList.value.length>0&&fileList1.value.length===0){
  1967. await proxy.$refs["uploadRef"].submit();
  1968. }
  1969. else if(fileList1.value&&fileList1.value.length>0&&fileList1.value.length===0){
  1970. await proxy.$refs["uploadRef1"].submit();
  1971. }
  1972. else if(fileList.value&&fileList1.value&&fileList.value.length>0&&fileList1.value.length>0){
  1973. await proxy.$refs["uploadRef1"].submit();
  1974. await proxy.$refs["uploadRef"].submit();
  1975. }
  1976. else{
  1977. await formRefJi.value.validate((valid) => {
  1978. if(valid){
  1979. if(formJi.value.devlang==='1'){
  1980. formJi.value.devlang = elseLan.value
  1981. }
  1982. delete formJi.value.msort
  1983. formJi.value.devkind = 'APP'
  1984. updateModel(formJi.value).then(res=>{
  1985. if(res.code===200){
  1986. proxy.$modal.msgSuccess("修改成功");
  1987. dialogVisible.value = false
  1988. getModelListTable()
  1989. }
  1990. })
  1991. }
  1992. });
  1993. }
  1994. }
  1995. async function submit(){
  1996. formRefJi.value.validate((valid) => {
  1997. console.log(formJi.value,valid)
  1998. if(valid){
  1999. if(formJi.value.devlang==='1'){
  2000. formJi.value.devlang = elseLan.value
  2001. }
  2002. delete formJi.value.msort
  2003. formJi.value.devkind = 'APP'
  2004. formJi.value.cateid = '776eba74-eaeb-47ca-8436-e05ed87b68ec'//区分目录
  2005. addModel(formJi.value).then(res=>{
  2006. if(res.code===200){
  2007. proxy.$modal.msgSuccess("新增成功");
  2008. dialogVisible.value = false
  2009. getModelListTable()
  2010. }
  2011. })
  2012. }
  2013. })
  2014. }
  2015. async function handleFileSuccess1(response, file, fileList){
  2016. formJi.value.mdOutFile = response.originalFilename
  2017. formJi.value.mdOutName = response.fileName
  2018. await formRefJi.value.validate((valid) => {
  2019. if(valid){
  2020. if(formJi.value.devlang==='1'){
  2021. formJi.value.devlang = elseLan.value
  2022. }
  2023. delete formJi.value.msort
  2024. formJi.value.devkind = 'APP'
  2025. updateModel(formJi.value).then(res=>{
  2026. if(res.code===200){
  2027. proxy.$modal.msgSuccess("修改成功");
  2028. dialogVisible.value = false
  2029. getModelListTable()
  2030. }
  2031. })
  2032. }
  2033. });
  2034. };
  2035. async function handleFileSuccess(response, file, fileList){
  2036. formJi.value.mdInFile = response.originalFilename
  2037. formJi.value.mdInName = response.fileName
  2038. await formRefJi.value.validate((valid) => {
  2039. if(valid){
  2040. if(formJi.value.devlang==='1'){
  2041. formJi.value.devlang = elseLan.value
  2042. }
  2043. delete formJi.value.msort
  2044. formJi.value.devkind = 'APP'
  2045. updateModel(formJi.value).then(res=>{
  2046. if(res.code===200){
  2047. proxy.$modal.msgSuccess("修改成功");
  2048. dialogVisible.value = false
  2049. getModelListTable()
  2050. }
  2051. })
  2052. }
  2053. });
  2054. };
  2055. function clearFromTree(){
  2056. formTree.value = {}
  2057. }
  2058. async function delSer(row) {
  2059. proxy.$modal.confirm('是否确认删除?').then(function () {
  2060. return delService(row.srvId);
  2061. }).then(() => {
  2062. showPei(parRow.value)
  2063. proxy.$modal.msgSuccess("删除成功");
  2064. }).catch(() => {
  2065. });
  2066. }
  2067. function clearForm(){
  2068. tableDataCan.value = []
  2069. formAdd.value = {
  2070. }
  2071. tableDataCanAdd.value = []
  2072. checked1.value = false
  2073. activeName.value = 'first'
  2074. fileList.value = []
  2075. fileList1.value = []
  2076. formJi.value = {
  2077. name:'',
  2078. version:'',
  2079. enname:'',
  2080. devlang:'',
  2081. intro:'',
  2082. type:'',
  2083. mdContact:'',
  2084. mdUnit:'',
  2085. devUnit:'',
  2086. devContact:'',
  2087. deployDir:'',
  2088. deployIp:'',
  2089. deployPort:'',
  2090. mirrorImageUrl:'',
  2091. mdRunCmd:'',
  2092. envOs:'',
  2093. envDisk:'',
  2094. envGpuMem:'',
  2095. evnArmX86:'',
  2096. envCpuNum:'',
  2097. envGpuType:'',
  2098. envGpuNum:'',
  2099. envMem:'',
  2100. mdInNote:'',
  2101. mdOutNote:''
  2102. }
  2103. }
  2104. function reg(){
  2105. isEdit.value = false
  2106. dialogVisible.value = true
  2107. }
  2108. async function getTreeLeft() {
  2109. var par = {
  2110. params:{
  2111. level:'2',
  2112. devkind:'APP'
  2113. }
  2114. }
  2115. await modelTreeSelect(par).then(res => {
  2116. par = res.data
  2117. optionsMdid.value = filterModelNodes(par)
  2118. })
  2119. }
  2120. function filterModelNodes(nodes) {
  2121. if (!Array.isArray(nodes)) return [];
  2122. const result = [];
  2123. for (const node of nodes) {
  2124. // 递归处理子节点(如果有)
  2125. const filteredChildren = node.children ? filterModelNodes(node.children) : [];
  2126. if (node.nodeType === 'MODEL') {
  2127. // 保留当前节点,并更新其子节点
  2128. node.value = node.id
  2129. result.push({
  2130. ...node,
  2131. children: filteredChildren
  2132. });
  2133. } else {
  2134. // 删除当前节点,将其子节点提升到当前层级
  2135. result.push(...filteredChildren);
  2136. }
  2137. }
  2138. return result;
  2139. }
  2140. function getModelListTable(){
  2141. tableData.value = []
  2142. var par = {
  2143. pageNum:1,
  2144. pageSize:20,
  2145. name:name.value,
  2146. mdUnit:mdUnit.value,
  2147. devkind:'APP'
  2148. }
  2149. getModelList(par).then(res=>{
  2150. tableData.value = res.rows
  2151. totalComReg.value = res.total
  2152. formJi.value.sort = res.total+1
  2153. })
  2154. }
  2155. const seledMo = ['primary','plain','plain','plain','plain','plain','plain']
  2156. onMounted(() => {
  2157. getTreeLeft()
  2158. });
  2159. </script>
  2160. <style scoped>
  2161. :deep(.treeLeft) .el-tree-node__content {
  2162. display: flex !important;
  2163. height: 28px; /* 按设计稿调整高度 */
  2164. align-items: center;
  2165. padding-top: 0 !important;
  2166. }
  2167. :deep(.treeLeft) .el-tree-node__content:hover {
  2168. background-color: #e9e9eb;
  2169. }
  2170. :deep(.treeLeft) .el-tree-node__content:active {
  2171. background-color: rgka(69,157,255,0.1) !important;
  2172. }
  2173. /* 选中态(Active) */
  2174. :deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
  2175. background-color: #c6e2ff !important;
  2176. }
  2177. .tabs-wrapper {
  2178. position: relative; /* 确保内容层在伪元素上方 */
  2179. z-index: 1; /* 关键:高于背景图 */
  2180. }
  2181. .tabs-wrapper :deep(.el-tabs),
  2182. .tabs-wrapper :deep(.el-tabs__content) {
  2183. background-color: red !important;
  2184. }
  2185. :deep(.el-tabs){
  2186. background-color: transparent !important;
  2187. }
  2188. :deep(.el-tabs__content){
  2189. background-color: transparent !important;
  2190. }
  2191. :deep(.custom-dialog-bg) {
  2192. z-index: 1000;
  2193. background-image: url('@/assets/images/backDia.jpg') !important;
  2194. background-position-x: left;
  2195. background-position-y: bottom;
  2196. background-size: initial;
  2197. background-repeat: repeat-x;
  2198. background-attachment: initial;
  2199. background-origin: initial;
  2200. background-clip: initial;
  2201. background-color: rgb(255, 255, 255);
  2202. }
  2203. :deep(.custom-dialog-bg .el-dialog__header) {
  2204. }
  2205. :deep(.custom-dialog-bg .el-dialog__body) {
  2206. color: #ecf0f1 !important; ; /* 内容文字颜色 */
  2207. }
  2208. /* 横向排列单选框标签和输入框 */
  2209. .custom-input-wrapper {
  2210. display: flex;
  2211. align-items: center;
  2212. gap: 10px; /* 调整间距 */
  2213. }
  2214. /* 输入框仅显示底部横线 */
  2215. .underline-input :deep(.el-input__wrapper) {
  2216. padding: 0;
  2217. box-shadow: none !important;
  2218. border-bottom: 1px solid #dcdfe6; /* 横线颜色 */
  2219. border-radius: 0;
  2220. background: transparent;
  2221. }
  2222. .underline-input :deep(.el-input__inner) {
  2223. height: 24px;
  2224. padding: 0 5px;
  2225. }
  2226. :deep(.el-table__body tr:hover > td) {
  2227. background-color: #eaf7ff !important;
  2228. }
  2229. .drag-handle {
  2230. cursor: move;
  2231. }
  2232. .ghost {
  2233. opacity: 0.5;
  2234. background: #c8ebfb;
  2235. }
  2236. /* 防止文字选中 */
  2237. :deep(.el-table__row) {
  2238. user-select: none;
  2239. -webkit-user-select: none;
  2240. }
  2241. </style>
  2242. <style scoped lang="scss">
  2243. .el-table .el-table__row td {
  2244. height: 60px !important; /* 行高 */
  2245. }
  2246. .custom-tree-node {
  2247. display: flex; /* 启用 Flex 布局 */
  2248. align-items: center; /* 垂直居中 */
  2249. gap: 8px; /* 图标与文字间距 */
  2250. }
  2251. :deep(.svg-icon) {
  2252. outline: none;
  2253. }
  2254. :deep(.svg-icon svg) {
  2255. stroke: none;
  2256. }
  2257. </style>