index.vue 95 KB

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