index.vue 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595
  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="status" label="模型状态" width="140">
  53. </el-table-column>
  54. <el-table-column prop="modifyBy" label="发布时间" width="170"/>
  55. <el-table-column prop="version" label="版本" width="120"/>
  56. <el-table-column prop="address" label="操作" width="270">
  57. <template #default="scope">
  58. <div style="display: flex;justify-content: space-between;width: 100%;">
  59. <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left: 0%;">编辑</el-button>
  60. <!-- <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button> -->
  61. <!-- <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: -5%;">查看</el-button> -->
  62. <el-button @click="showPei(scope.row)" type="warning" text size="mini" style="margin-left: -5%;">配置</el-button>
  63. <el-button type="danger" @click="delModel(scope.row)" text size="mini" style="margin-left: -5%;">删除</el-button>
  64. <el-button type="danger" @click="shenhe(scope.row)" text size="mini" style="margin-left: -5%;">审核申请</el-button>
  65. </div>
  66. </template>
  67. </el-table-column>
  68. </el-table>
  69. <el-dialog v-model="dialogVisible" title="" width="60%" @close="clearForm">
  70. <div class="card-header">
  71. <span style="font-size: 20px;margin-left: 1%;">基本信息</span>
  72. <el-divider style="margin-top: 1%;"/>
  73. </div>
  74. <div>
  75. <el-form size="mini" style="margin-top: 0%;width: 98%;" :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
  76. <el-row :gutter="40">
  77. <el-col :span="8">
  78. <el-form-item label="模型名称:" prop="name" style="">
  79. <div style="display: flex;width: 120%;justify-content: space-between;">
  80. <el-input v-model="formJi.name" style="width: 100%;"/>
  81. </div>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="8">
  85. <el-form-item label="英文名:" prop="enname" style="">
  86. <div style="display: flex;width: 100%;justify-content: space-between;">
  87. <el-input v-model="formJi.enname" style="width: 100%;"/>
  88. </div>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="6">
  92. <el-form-item label="版本号:" prop="" style="">
  93. <div style="display: flex;width: 100%;justify-content: space-between;">
  94. <el-input v-model="formJi.version" style="width: 100%;"/>
  95. </div>
  96. </el-form-item>
  97. </el-col>
  98. </el-row>
  99. <el-row :gutter="48">
  100. <el-col :span="8">
  101. <el-form-item label="模型类型:" prop="" style="">
  102. <div style="display: flex;width: 100%;justify-content: space-between;">
  103. <el-input placeholder="如水利模型、排水模型、供水模型、海洋模型" v-model="formJi.type" style="width: 100%;" resize="none"/>
  104. </div>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. <el-form-item label="排序:" prop="" style="">
  109. <div style="display: flex;width: 100%;justify-content: space-between;">
  110. <el-input-number v-model="formJi.sort" :min="1" style="width: 22%;"/>
  111. </div>
  112. </el-form-item>
  113. <el-row :gutter="48">
  114. <el-col :span="24">
  115. <el-form-item label="开发语言:">
  116. <el-radio-group v-model="formJi.devlang" class="custom-radio-group" style="width: 100%;">
  117. <el-radio label="java" size="large">java</el-radio>
  118. <el-radio label="nodeJs" size="large">nodeJs</el-radio>
  119. <el-radio label="python" size="large">python</el-radio>
  120. <el-radio label="c/c++" size="large">c/c++</el-radio>
  121. <el-radio label="1" size="large">
  122. <div class="custom-input-wrapper">
  123. <span>其它</span>
  124. <el-input
  125. v-model="elseLan"
  126. class="underline-input"
  127. v-show="isElse"
  128. />
  129. </div>
  130. </el-radio>
  131. </el-radio-group>
  132. </el-form-item>
  133. </el-col>
  134. </el-row>
  135. <el-row :gutter="48">
  136. <el-col :span="16">
  137. <el-form-item label="简介:">
  138. <el-input v-model="formJi.intro" style="width: 100%;" :rows="3" resize="none" type="textarea"/>
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. </el-form>
  143. </div>
  144. <div class="card-header">
  145. <span style="font-size: 20px;margin-left: 1%;">单位</span>
  146. <el-divider style="margin-top: 1%;"/>
  147. </div>
  148. <div style="margin-top: 0%;">
  149. <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;" :model="formJi" label-position="right" label-width="120px" :rules="rulesJi">
  150. <el-row :gutter="48">
  151. <el-col :span="11">
  152. <el-form-item label="模型归属单位:" prop="" style="">
  153. <div style="display: flex;width: 100%;justify-content: space-between;">
  154. <el-input v-model="formJi.mdUnit" style="width: 100%;"/>
  155. </div>
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="11">
  159. <el-form-item label="联系方式:" prop="" style="" >
  160. <div style="display: flex;width: 100%;justify-content: space-between;">
  161. <el-input v-model="formJi.mdContact" style="width: 100%;"/>
  162. </div>
  163. </el-form-item>
  164. </el-col>
  165. </el-row>
  166. <el-row :gutter="48">
  167. <el-col :span="11">
  168. <el-form-item label="技术支持单位:" prop="" style="">
  169. <div style="display: flex;width: 100%;justify-content: space-between;">
  170. <el-input v-model="formJi.devUnit" style="width: 100%;"/>
  171. </div>
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="11">
  175. <el-form-item label="联系方式:" prop="" style="">
  176. <div style="display: flex;width: 100%;justify-content: space-between;">
  177. <el-input v-model="formJi.devContact" style="width: 100%;"/>
  178. </div>
  179. </el-form-item>
  180. </el-col>
  181. </el-row>
  182. </el-form>
  183. </div>
  184. <el-tabs
  185. v-model="activeName"
  186. type="card"
  187. style="margin-top: 1%;"
  188. >
  189. <el-tab-pane label="部署情况" name="first">
  190. <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;" :model="formJi" label-position="right" label-width="120px" :rules="rulesJi">
  191. <el-row :gutter="48">
  192. <el-col :span="11">
  193. <el-form-item label="服务器IP:" prop="" style="">
  194. <div style="display: flex;width: 100%;justify-content: space-between;">
  195. <el-input v-model="formJi.deployIp" style="width: 100%;"/>
  196. </div>
  197. </el-form-item>
  198. </el-col>
  199. <el-col :span="11">
  200. <el-form-item label="端口:" prop="" style="">
  201. <div style="display: flex;width: 100%;justify-content: space-between;">
  202. <el-input placeholder="可填写多个端口,以“,”分隔" v-model="formJi.deployPort" style="width: 100%;"/>
  203. </div>
  204. </el-form-item>
  205. </el-col>
  206. </el-row>
  207. <el-row :gutter="48">
  208. <el-col :span="15">
  209. <el-form-item label="部署位置:" prop="" style="">
  210. <div style="display: flex;width: 100%;justify-content: space-between;">
  211. <el-input v-model="formJi.deployDir" style="width: 100%;"/>
  212. </div>
  213. </el-form-item>
  214. </el-col>
  215. <el-col :span="10">
  216. </el-col>
  217. </el-row>
  218. <el-row :gutter="48">
  219. <el-col :span="15">
  220. <el-form-item label="服务访问地址:" prop="" style="">
  221. <div style="display: flex;width: 100%;justify-content: space-between;">
  222. <el-input v-model="formJi.mirrorImageUrl" style="width: 100%;"/>
  223. </div>
  224. </el-form-item>
  225. </el-col>
  226. </el-row>
  227. <el-row :gutter="48">
  228. <el-col :span="15">
  229. <el-form-item label="服务器运行命令:" prop="" style="">
  230. <div style="display: flex;width: 100%;justify-content: space-between;">
  231. <el-input v-model="formJi.mdRunCmd" style="width: 100%;"/>
  232. </div>
  233. </el-form-item>
  234. </el-col>
  235. </el-row>
  236. </el-form>
  237. <div style="display: flex;margin-top: -5%;">
  238. <div class="card-header" style="margin-top: 5%;display: flex;justify-content: inherit;margin-left: 2%">
  239. <span style="font-size: 20px;margin-top: 5%; writing-mode: vertical-rl;position: relative;top: 15%;">运行环境</span>
  240. </div>
  241. <el-form size="mini" :key="tableKey" style="margin-top: 5%;width: 85%;" :model="formJi" label-position="right" label-width="120px" :rules="rulesJi">
  242. <el-row :gutter="48">
  243. <el-col :span="12">
  244. <el-form-item label="操作系统:" prop="" style="">
  245. <div style="display: flex;width: 100%;justify-content: space-between;">
  246. <el-select
  247. v-model="formJi.envOs"
  248. style="width: 75%;margin-left: 0%;"
  249. >
  250. <el-option
  251. v-for="item in optionsEnv"
  252. :key="item.value"
  253. :label="item.label"
  254. :value="item.value"
  255. />
  256. </el-select>
  257. </div>
  258. </el-form-item>
  259. </el-col>
  260. <el-col :span="12">
  261. <el-form-item label="运行架构:" prop="" style="">
  262. <div style="display: flex;width: 100%;justify-content: space-between;">
  263. <el-radio-group v-model="formJi.evnArmX86" class="ml-4" size="small" style="" >
  264. <el-radio label="X86" size="large">X86</el-radio>
  265. <el-radio label="ARM" size="large">ARM</el-radio>
  266. </el-radio-group>
  267. </div>
  268. </el-form-item>
  269. </el-col>
  270. </el-row>
  271. <el-row :gutter="24">
  272. <el-col :span="8">
  273. <el-form-item label="硬盘:" prop="" style="">
  274. <div style="display: flex;width: 100%;" >
  275. <el-input-number
  276. v-model="formJi.envDisk"
  277. :min="100"
  278. :max="2048"
  279. size="mini"
  280. controls-position="right"
  281. @change="handleChange"
  282. />
  283. <div style="margin-left: 4%;font-size: 15px;">
  284. G
  285. </div>
  286. </div>
  287. </el-form-item>
  288. </el-col>
  289. <el-col :span="8">
  290. <el-form-item label="CPU核数:" prop="" style="">
  291. <div style="display: flex;width: 100%;" >
  292. <el-input-number
  293. v-model="formJi.envCpuNum"
  294. :max="64"
  295. :min="2"
  296. size="mini"
  297. controls-position="right"
  298. @change="handleChange"
  299. />
  300. <div style="margin-left: 4%;font-size: 15px;">
  301. </div>
  302. </div>
  303. </el-form-item>
  304. </el-col>
  305. <el-col :span="8">
  306. <el-form-item label="内存:" prop="" style="">
  307. <div style="display: flex;width: 100%;" >
  308. <el-input-number
  309. v-model="formJi.envMem"
  310. :max="512"
  311. :min="1"
  312. size="mini"
  313. controls-position="right"
  314. @change="handleChange"
  315. />
  316. <div style="margin-left: 4%;font-size: 15px;">
  317. G
  318. </div>
  319. </div>
  320. </el-form-item>
  321. </el-col>
  322. </el-row>
  323. <el-row :gutter="24">
  324. <el-col :span="8">
  325. <el-form-item label="GPU型号:" prop="" style="">
  326. <div style="display: flex;width: 100%;">
  327. <el-input v-model="formJi.envGpuType" style="width: 100%;"/>
  328. </div>
  329. </el-form-item>
  330. </el-col>
  331. <el-col :span="8">
  332. <el-form-item label="GPU数量:" prop="" style="">
  333. <div style="display: flex;width: 100%;" >
  334. <el-input-number
  335. v-model="formJi.envGpuNum"
  336. :min="1"
  337. :max="64"
  338. size="mini"
  339. controls-position="right"
  340. @change="handleChange"
  341. />
  342. <div style="margin-left: 4%;font-size: 15px;">
  343. </div>
  344. </div>
  345. </el-form-item>
  346. </el-col>
  347. <el-col :span="8">
  348. <el-form-item label="GUP显存:" prop="" style="">
  349. <div style="display: flex;width: 100%;" >
  350. <el-input-number
  351. v-model="formJi.envGpuMem"
  352. :min="1"
  353. size="mini"
  354. :max="512"
  355. controls-position="right"
  356. @change="handleChange"
  357. />
  358. <div style="margin-left: 4%;font-size: 15px;">
  359. G
  360. </div>
  361. </div>
  362. </el-form-item>
  363. </el-col>
  364. </el-row>
  365. </el-form>
  366. </div>
  367. </el-tab-pane>
  368. <el-tab-pane label="输入" name="second">
  369. <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">
  370. <el-form-item label="输入文档:" prop="">
  371. <div style="width: 75%;">
  372. <el-upload
  373. ref="uploadRef"
  374. :limit="1"
  375. accept=".xlsx, .xls"
  376. :headers="upload.headers"
  377. :on-change="handleChange"
  378. :file-list="fileList"
  379. :action="upload.url + '?file=' + upload.updateSupport"
  380. :on-progress="handleFileUploadProgress"
  381. :on-success="handleFileSuccess"
  382. :auto-upload="false"
  383. drag
  384. >
  385. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  386. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  387. </el-upload>
  388. </div>
  389. <div style="color: #b1b3b8;width: 100%;">
  390. 注:请上传后缀名为.docx .pdf .txt的文件
  391. </div>
  392. <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
  393. </el-form-item>
  394. <el-form-item label="说明:" prop="" style="margin-left: -1%;">
  395. <el-input v-model="formJi.mdInNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
  396. </el-form-item>
  397. </el-form>
  398. </el-tab-pane>
  399. <el-tab-pane label="输出" name="third">
  400. <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">
  401. <el-form-item label="输出文档:" prop="">
  402. <div style="width: 75%;">
  403. <el-upload
  404. ref="uploadRef1"
  405. :limit="1"
  406. accept=".xlsx, .xls"
  407. :headers="upload.headers"
  408. :on-change="handleChange1"
  409. :file-list="fileList1"
  410. :action="upload.url + '?file=' + upload.updateSupport"
  411. :on-progress="handleFileUploadProgress"
  412. :on-success="handleFileSuccess1"
  413. :auto-upload="false"
  414. drag
  415. >
  416. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  417. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  418. </el-upload>
  419. </div>
  420. <div style="color: #b1b3b8;width: 100%;">
  421. 注:请上传后缀名为.docx .pdf .txt的文件
  422. </div>
  423. <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
  424. </el-form-item>
  425. <el-form-item label="说明:" prop="" style="margin-left: -1%;">
  426. <el-input v-model="formJi.mdOutNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
  427. </el-form-item>
  428. </el-form>
  429. </el-tab-pane>
  430. </el-tabs>
  431. <template #footer>
  432. <span class="dialog-footer">
  433. <el-button @click="dialogVisible = false">取消</el-button>
  434. <el-button type="primary" @click="submit" v-if="!isEdit">
  435. 提交
  436. </el-button>
  437. <el-button type="primary" @click="subEdit" v-if="isEdit">
  438. 提交
  439. </el-button>
  440. </span>
  441. </template>
  442. </el-dialog>
  443. <el-dialog v-model="dialogVisibleDe" title="" width="50%" @close="" destroy-on-close class="custom-dialog-bg">
  444. <el-descriptions title="基本信息" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
  445. <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
  446. <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
  447. <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
  448. <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
  449. <el-descriptions-item label="开发语言:" span="2">{{formJi.devlang}}</el-descriptions-item>
  450. <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
  451. </el-descriptions>
  452. <el-divider style="margin-top: 0%;"/>
  453. <el-descriptions title="单位" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
  454. <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
  455. <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
  456. <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
  457. <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
  458. </el-descriptions>
  459. <el-tabs
  460. v-model="activeName"
  461. type="card"
  462. style="margin-top: 1%;background-color: transparent;"
  463. >
  464. <el-tab-pane label="部署情况" name="first" style="background-color: transparent;">
  465. <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background-color: transparent;">
  466. <el-descriptions-item label="服务器IP:" span="2">{{formJi.deployIp}}</el-descriptions-item>
  467. <el-descriptions-item label="端口:">{{formJi.deployPort}}</el-descriptions-item>
  468. <el-descriptions-item label="部署位置:" span="2">{{formJi.deployDir}}</el-descriptions-item>
  469. <el-descriptions-item label="服务访问地址:">{{formJi.mirrorImageUrl}}</el-descriptions-item>
  470. <el-descriptions-item label="服务器运行命令:" span="3">{{formJi.mdRunCmd}}</el-descriptions-item>
  471. <el-descriptions-item label="操作系统:" span="2">{{formJi.envOs}}</el-descriptions-item>
  472. <el-descriptions-item label="运行架构:" span="3">{{formJi.evnArmX86}}</el-descriptions-item>
  473. <el-descriptions-item label="硬盘:" span="">
  474. {{formJi.envDisk + 'G'}}
  475. </el-descriptions-item>
  476. <el-descriptions-item label="CPU核心数:">
  477. {{formJi.envCpuNum + '个'}}
  478. </el-descriptions-item>
  479. <el-descriptions-item label="内存:">
  480. {{formJi.envMem + 'G'}}
  481. </el-descriptions-item>
  482. <el-descriptions-item label="GPU型号:">{{formJi.envGpuType}}</el-descriptions-item>
  483. <el-descriptions-item label="GPU数量:">
  484. {{formJi.envGpuNum + '个'}}
  485. </el-descriptions-item>
  486. <el-descriptions-item label="GUP显存:">
  487. {{formJi.envGpuMem + 'G'}}
  488. </el-descriptions-item>
  489. </el-descriptions>
  490. </el-tab-pane>
  491. <el-tab-pane label="输入" name="second">
  492. <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
  493. <el-descriptions-item label="输入文档:" span="2">
  494. <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
  495. </el-descriptions-item>
  496. <el-descriptions-item label="说明:">{{formJi.mdInNote}}</el-descriptions-item>
  497. </el-descriptions>
  498. </el-tab-pane>
  499. <el-tab-pane label="输出" name="third">
  500. <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
  501. <el-descriptions-item label="输出文档:" span="2">
  502. <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
  503. </el-descriptions-item>
  504. <el-descriptions-item label="说明:">{{formJi.mdOutNote}}</el-descriptions-item>
  505. </el-descriptions>
  506. </el-tab-pane>
  507. </el-tabs>
  508. </el-dialog>
  509. <el-dialog @close="clearForm" v-model="dialogVisiblePei" width="70%" title="参数配置">
  510. <el-tabs v-model="activeName" type="border-card">
  511. <el-tab-pane label="基本信息" name="first">
  512. <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
  513. <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
  514. <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
  515. <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
  516. <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
  517. <el-descriptions-item label="开发语言:" span="2">{{formJi.devlang}}</el-descriptions-item>
  518. <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
  519. </el-descriptions>
  520. <el-divider style="margin-top: 0%;"/>
  521. <el-descriptions title="" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
  522. <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
  523. <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
  524. <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
  525. <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
  526. </el-descriptions>
  527. </el-tab-pane>
  528. <el-tab-pane label="模型参数" style="height: 50vh;" :key="activeTabKey">
  529. <div style="display: flex;justify-content: space-between;margin-right: 2%;align-items: center;background-color: #e9e9eb;;width: 100%;">
  530. <div style="display: flex;align-items: center;margin-left: 1%;">
  531. <el-checkbox v-model="checked1" label="参数是否分组" size="large" @change="gatherTable"/>
  532. <el-button @click="showAddFenzu" style="margin-left: 10%;" type="success" size="mini" plain v-if="checked1">新增分组</el-button>
  533. </div>
  534. <div style="display: flex;justify-content: flex-end;margin-right: 1%;">
  535. <el-button @click="addCan" style="margin-left: 5%;" type="success" size="mini" plain :disabled="selFen">新增参数</el-button>
  536. <el-button @click="delAllCan" style="margin-top: 0%;" type="danger" size="mini" plain>删除</el-button>
  537. </div>
  538. </div>
  539. <div style="display: flex;">
  540. <div v-if="checked1" style="margin-top:1%;width: 10%;background-color: #F2F6FC;height:45vh;">
  541. <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft"
  542. :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">
  543. <template #default="{ node, data }">
  544. <span style="justify-content: space-between;display: flex;width: 100%;align-items: center;margin-left: -10%;">
  545. <div class="custom-tree-node" style="align-items: center;line-height: 1.5;">
  546. <span style="">{{ node.label }}</span>
  547. </div>
  548. <div style="margin-right: 1%;position: absolute;left:78%;">
  549. <el-dropdown trigger="hover" @click.stop v-if="currentNodeKey === data.mgid">
  550. <el-icon><MoreFilled /></el-icon>
  551. <!-- <svg-icon icon-class="zhankai"/> -->
  552. <template #dropdown>
  553. <el-dropdown-menu>
  554. <el-dropdown-item style="display: flex;" @click="showEditFen">
  555. <el-icon class="el-icon--right" style="color: black;">
  556. <Connection />
  557. </el-icon>
  558. <div>
  559. 编辑分组
  560. </div>
  561. </el-dropdown-item>
  562. <divider/>
  563. <el-dropdown-item style="display: flex;" @click="delFenZu" divided>
  564. <el-icon class="el-icon--right" style="color: black;">
  565. <CircleClose />
  566. </el-icon>
  567. <div>
  568. 删除分组
  569. </div>
  570. </el-dropdown-item>
  571. </el-dropdown-menu>
  572. </template>
  573. </el-dropdown>
  574. </div>
  575. </span>
  576. </template>
  577. </el-tree>
  578. </div>
  579. <div style="width: 90%;flex: 1;">
  580. <el-table
  581. style="margin-top: 1%;width: 100%;margin-left: 1%;overflow: auto;"
  582. :data="tableDataCan"
  583. :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
  584. :header-cell-style="{ textAlign: 'center', }"
  585. max-height="45vh"
  586. :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center' }"
  587. border>
  588. <el-table-column prop="parName" label="*参数英文名">
  589. <template #default="scope" style="width: 120%;">
  590. <el-input v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
  591. </template>
  592. </el-table-column>
  593. <el-table-column prop="parName" label="*参数名称">
  594. <template #default="scope">
  595. <el-input v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
  596. </template>
  597. </el-table-column>
  598. <el-table-column prop="parType" label="*参数类型" >
  599. <template #default="scope">
  600. <el-input v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
  601. </template>
  602. </el-table-column>
  603. <el-table-column prop="parLine" label="行号">
  604. <template #default="scope">
  605. <el-input v-model="scope.row.parLine" style="width: 120%;margin-left: -10%;"/>
  606. </template>
  607. </el-table-column>
  608. <el-table-column prop="parNote" label="维度">
  609. <template #default="scope">
  610. <el-input v-model="scope.row.parDimen" style="width: 120%;margin-left: -10%;"/>
  611. </template>
  612. </el-table-column>
  613. <el-table-column prop="parNote" label="表达式">
  614. <template #default="scope">
  615. <el-input v-model="scope.row.parExpr" style="width: 120%;margin-left: -10%;"/>
  616. </template>
  617. </el-table-column>
  618. <el-table-column prop="parNote" label="*默认值">
  619. <template #default="scope">
  620. <el-input v-model="scope.row.parDefVal" style="width: 120%;margin-left: -10%;"/>
  621. </template>
  622. </el-table-column>
  623. <el-table-column prop="parNote" label="参数范围">
  624. <template #default="scope">
  625. <el-input v-model="scope.row.parRange" style="width: 120%;margin-left: -10%;"/>
  626. </template>
  627. </el-table-column>
  628. <el-table-column prop="parNote" label="版本号">
  629. <template #default="scope">
  630. <el-input v-model="scope.row.parVersion" style="width: 120%;margin-left: -10%;"/>
  631. </template>
  632. </el-table-column>
  633. <el-table-column prop="parNote" label="操作" width="85">
  634. <template #default="scope">
  635. <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
  636. </template>
  637. </el-table-column>
  638. </el-table>
  639. </div>
  640. </div>
  641. </el-tab-pane>
  642. <el-tab-pane label="模型状态">Role</el-tab-pane>
  643. </el-tabs>
  644. <template #footer>
  645. <span class="dialog-footer">
  646. <el-button @click="dialogVisiblePei = false">取消</el-button>
  647. <el-button type="primary" @click="saveChangePar">
  648. 提交
  649. </el-button>
  650. </span>
  651. </template>
  652. </el-dialog >
  653. <el-dialog v-model="dialogVisibleFen" :title="titleFen" width="30%" @close="clearFromTree" destroy-on-close :key="tableKey">
  654. <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">
  655. <el-form-item label="名称:" prop="parGroupName" style="">
  656. <el-input v-model="formTree.parGroupName" @blur="handleBlur" style="width: 75%;" placeholder="" resize="none"/>
  657. </el-form-item>
  658. <el-form-item label="组编码:" prop="parGroupCode" style="">
  659. <el-input v-model="formTree.parGroupCode" style="width: 75%;" placeholder="" resize="none"/>
  660. </el-form-item>
  661. <el-form-item label="说明:" prop="parGroupNote">
  662. <el-input v-model="formTree.parGroupNote" style="width: 75%;" placeholder="" type="textarea" resize="none"/>
  663. </el-form-item>
  664. <el-form-item label="排序:" prop="parGroupSort">
  665. <el-input-number v-model="formTree.parGroupSort" :min="1" style="width: 50%;"/>
  666. </el-form-item>
  667. </el-form>
  668. <template #footer>
  669. <span class="dialog-footer">
  670. <el-button size="mini" @click="dialogVisibleFen = false">取消</el-button>
  671. <el-button type="primary" @click="submitFen" size="mini">
  672. 提交
  673. </el-button>
  674. </span>
  675. </template>
  676. </el-dialog>
  677. <el-dialog v-model="dialogVisibleDetail" :title="titleFen" width="80%" @close="clearFromTree" destroy-on-close :key="tableKey">
  678. <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;">
  679. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  680. <div style="display: flex;align-items: center;width: 50%;">
  681. <div style="font-size: 16px;font-weight: bold;">
  682. 模型名称:
  683. </div>
  684. <div style="font-size: 15px;">
  685. 上海沿海风暴潮预报模型
  686. </div>
  687. </div>
  688. <div style="display: flex;align-items: center;width: 50%;">
  689. <div style="font-size: 16px;font-weight: bold;">
  690. 英文名称:
  691. </div>
  692. <div style="font-size: 15px;">
  693. Shang Hai Shi Cheng Qu Hong Lao Fang Zhen Mo Xing
  694. </div>
  695. </div>
  696. </div>
  697. <div style="display: flex;align-items: center;width: 50%;margin-top: 1%;margin-left: 3%;">
  698. <div style="font-size: 16px;font-weight: bold;">
  699. 模型简介:
  700. </div>
  701. <div style="font-size: 15px;">
  702. Shang Hai Shi Cheng Qu Hong Lao Fang Zhen Mo Xing
  703. </div>
  704. </div>
  705. <div v-if="isExpanded">
  706. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  707. <div style="display: flex;align-items: center;width: 50%;">
  708. <div style="font-size: 16px;font-weight: bold;">
  709. 版本号:
  710. </div>
  711. <div style="font-size: 15px;">
  712. </div>
  713. </div>
  714. <div style="display: flex;align-items: center;width: 50%;">
  715. <div style="font-size: 16px;font-weight: bold;">
  716. 接口分类:
  717. </div>
  718. <div style="font-size: 15px;">
  719. </div>
  720. </div>
  721. </div>
  722. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  723. <div style="display: flex;align-items: center;width: 50%;">
  724. <div style="font-size: 16px;font-weight: bold;">
  725. 开发语言:
  726. </div>
  727. <div style="font-size: 15px;">
  728. </div>
  729. </div>
  730. </div>
  731. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  732. <div style="display: flex;align-items: center;width: 50%;">
  733. <div style="font-size: 16px;font-weight: bold;">
  734. 模型归属单位:
  735. </div>
  736. <div style="font-size: 15px;">
  737. </div>
  738. </div>
  739. <div style="display: flex;align-items: center;width: 50%;">
  740. <div style="font-size: 16px;font-weight: bold;">
  741. 联系方式:
  742. </div>
  743. <div style="font-size: 15px;">
  744. </div>
  745. </div>
  746. </div>
  747. <div style="display: flex;margin-top: 1%;margin-left: 3%;">
  748. <div style="display: flex;align-items: center;width: 50%;">
  749. <div style="font-size: 16px;font-weight: bold;">
  750. 技术支持单位:
  751. </div>
  752. <div style="font-size: 15px;">
  753. </div>
  754. </div>
  755. <div style="display: flex;align-items: center;width: 50%;">
  756. <div style="font-size: 16px;font-weight: bold;">
  757. 联系方式:
  758. </div>
  759. <div style="font-size: 15px;">
  760. </div>
  761. </div>
  762. </div>
  763. </div>
  764. <el-link :icon="isExpanded ? ArrowUp : ArrowDown" @click="zhankai" type="primary" size="mini" style="position: absolute;right:1%;bottom: 5%;">{{ isExpanded ? '收起' : '展开' }}</el-link >
  765. </div>
  766. <div style="position: relative;width: 98%;margin-left: 1%;border: #47AFE5 1px solid;height: 40vh;margin-top: 1%;border-radius: 8px;">
  767. <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">
  768. <div @click="changeBack(0)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[0]}">
  769. 服务信息
  770. </div>
  771. <div @click="changeBack(1)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[1]}">
  772. 数据信息
  773. </div>
  774. <div @click="changeBack(2)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[2]}">
  775. 工作流程
  776. </div>
  777. <div @click="changeBack(3)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[3]}">
  778. 任务信息
  779. </div>
  780. <div @click="changeBack(4)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[4]}">
  781. 消息信息
  782. </div>
  783. <div @click="changeBack(5)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;" :style="{backgroundColor: activeColor[5]}">
  784. 日志信息
  785. </div>
  786. <div @click="changeBack(6)" style="width: 5%;height: 100%;display: grid; place-items: center;cursor: pointer;":style="{backgroundColor: activeColor[6]}">
  787. 访问统计
  788. </div>
  789. </div>
  790. </div>
  791. <template #footer>
  792. <span class="dialog-footer">
  793. <el-button size="mini" @click="dialogVisibleDetail = false">取消</el-button>
  794. <el-button type="primary" @click="submitFen" size="mini">
  795. 提交
  796. </el-button>
  797. </span>
  798. </template>
  799. </el-dialog>
  800. </div>
  801. </div>
  802. </template>
  803. <script setup>
  804. import { getModelList,addModel,delMdid,getModelDetail,updateModel,addGroup,getParamsList,changePar,delAllPar,getModelParList,delFen,changeShenhe,delModelPar } from "@/api/register/regCom";
  805. import { ref, onMounted, onUnmounted, nextTick } from 'vue';
  806. import { Search } from '@element-plus/icons-vue'
  807. import {
  808. ArrowLeft,
  809. ArrowUp,
  810. ArrowDown
  811. } from '@element-plus/icons-vue'
  812. import { reactive } from 'vue'
  813. import { forwardRefProps } from 'element-plus/es/components/tooltip-v2/src/forward-ref.mjs';
  814. import { getToken } from "@/utils/auth";
  815. import { fa } from "element-plus/es/locales.mjs";
  816. import { column } from "element-plus/es/components/table-v2/src/common.mjs";
  817. import { TRUE } from "sass";
  818. import { editGroup } from "../../../api/register/regCom";
  819. import pinyin from 'pinyin';
  820. const { proxy } = getCurrentInstance();
  821. const dialogVisibleFen = ref(false)
  822. const currentHeight = ref(100)
  823. const dragTableRef = ref()
  824. const isaddFen = ref(false)
  825. const dialogVisibleDetail = ref(true)
  826. const dialogVisible = ref(false)
  827. const dialogVisibleDe = ref(false)
  828. const dialogVisiblePei = ref(false)
  829. const active = ref(0)
  830. const isEdit = ref(true)
  831. const name = ref('')
  832. const isAdd = ref(true)
  833. const mdUnit = ref('')
  834. const isElse = ref(false)
  835. const elseLan = ref('')
  836. const tableDataCan = ref([])
  837. const selFen = ref(true)
  838. const groupTreeData = ref([])
  839. const isExpanded = ref(false)
  840. const expandableDiv = ref(null)
  841. const parRow = ref({})
  842. const initialHeight = 100
  843. const activeColor = ref(['#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB','#6CA8DB'])
  844. const expandedHeight = 250
  845. const formJi = ref({
  846. name:'',
  847. version:'',
  848. enname:'',
  849. devlang:'',
  850. intro:'',
  851. type:'',
  852. mdContact:'',
  853. mdUnit:'',
  854. devUnit:'',
  855. devContact:'',
  856. deployDir:'',
  857. deployIp:'',
  858. deployPort:'',
  859. mirrorImageUrl:'',
  860. mdRunCmd:'',
  861. envOs:'',
  862. envDisk:'',
  863. envGpuMem:'11',
  864. evnArmX86:'',
  865. envCpuNum:'',
  866. envGpuType:'',
  867. envGpuNum:'2',
  868. envMem:'',
  869. mdInNote:'',
  870. mdOutNote:''
  871. });
  872. const activeTabKey = ref(0)
  873. const rulesJi = reactive({
  874. name: [{ required: true, message: '必填', trigger: 'blur' }],
  875. enname: [{ required: true, message: '必填', trigger: 'blur' }],
  876. });
  877. const formRefJi = ref();
  878. const formZu = ref({
  879. mirrorImageEurl:'',
  880. mdCPU:'',
  881. mdGPU:''
  882. });
  883. const rulesZu = reactive({
  884. mirrorImageEurl: [{ required: true, message: '必填', trigger: 'blur' }],
  885. mdCPU: [{ required: true, message: '必填', trigger: 'blur' }],
  886. });
  887. const formRefZu = ref();
  888. const formTree = ref({
  889. parGroupSort:1,
  890. parGroupNote:'',
  891. parGroupName:'',
  892. parGroupCode:''
  893. });
  894. const rulesTree = reactive({
  895. parGroupName: [{ required: true, message: '必填', trigger: 'blur' }],
  896. parGroupSort: [{ required: true, message: '必填', trigger: 'blur' }],
  897. parGroupCode: [{ required: true, message: '必填', trigger: 'blur' }],
  898. });
  899. const formRefTree = ref();
  900. const activeName = ref('first')
  901. const titleFen = ref('');
  902. const upload = reactive({
  903. // 是否显示弹出层(用户导入)
  904. open: false,
  905. // 弹出层标题(用户导入)
  906. title: "",
  907. // 是否禁用上传
  908. isUploading: false,
  909. // 是否更新已经存在的用户数据
  910. updateSupport: '',
  911. // 设置上传的请求头部
  912. headers: { Authorization: "Bearer " + getToken() },
  913. // 上传的地址
  914. url: import.meta.env.VITE_APP_BASE_API + "/common/upload"
  915. });
  916. const downUrl = ref(import.meta.env.VITE_APP_BASE_API)
  917. const tableKey = ref(0);
  918. const totalComReg = ref()
  919. const parMgid = ref()
  920. const currentPage = ref(1)
  921. const tableData2 = ref([
  922. { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
  923. { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' },
  924. { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' }
  925. ]);
  926. const tableData3 = ref([
  927. { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
  928. { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' },
  929. { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' }
  930. ]);
  931. const checked1 = ref(false)
  932. const tableData1= [{date1:'初始状态',
  933. date2:'sts',
  934. date3:'数据项',
  935. date4:'初始状态',
  936. date5:'是',
  937. date6:'否',
  938. date7:'2023-09-08'
  939. }]
  940. const checkGroup = [
  941. {label:'水文预报'},
  942. {label:'维水动力'},
  943. {label:'二维水动力'},
  944. {label:'机器学习'},
  945. ]
  946. let tableData = ref([{name:'1'}])
  947. const heightAll = window.innerHeight
  948. const valueHelpSel = '';
  949. const tableheight = window.innerHeight*0.8
  950. const optionsType = [
  951. {
  952. value: '1',
  953. label: '水利专业模型',
  954. },
  955. {
  956. value: '2',
  957. label: '排水专业模型',
  958. },
  959. {
  960. value: '3',
  961. label: '供水专业模型',
  962. },
  963. {
  964. value: '4',
  965. label: '海洋专业模型',
  966. },
  967. ]
  968. const optionsEnv = ref([
  969. {
  970. value: 'windwos',
  971. label: 'windwos',
  972. },
  973. {
  974. value: 'Linux',
  975. label: 'Linux',
  976. },
  977. {
  978. value: 'Ubuntu',
  979. label: 'Ubuntu',
  980. },
  981. {
  982. value: 'CentOS',
  983. label: 'CentOS',
  984. },
  985. {
  986. value: 'Debian',
  987. label: 'Debian',
  988. },
  989. {
  990. value: 'RedHat',
  991. label: 'RedHat',
  992. },
  993. {
  994. value: '统信',
  995. label: '统信',
  996. },
  997. {
  998. value: '麒麟',
  999. label: '麒麟',
  1000. },
  1001. {
  1002. value: '欧拉',
  1003. label: '欧拉',
  1004. },
  1005. ])
  1006. const uploadRef = ref(null);
  1007. const fileList = ref([]);
  1008. const fileList1 = ref([]);
  1009. const tableDataCanAll = ref([]);
  1010. const parForm = ref('')
  1011. const currentNodeKey = ref('')
  1012. const parTree = ref({})
  1013. onMounted(() => {
  1014. getModelListTable()
  1015. // addNewModel()
  1016. });
  1017. const handleChange = (file, files) => {
  1018. fileList.value = files;
  1019. };
  1020. const handleChange1 = (file, files) => {
  1021. fileList1.value = files;
  1022. };
  1023. function changeBack(index){
  1024. active.value = index
  1025. for(var i=0;i<activeColor.value.length;i++){
  1026. if(i===index){
  1027. activeColor.value[i] = 'rgb(51, 126, 204)'
  1028. }
  1029. else{
  1030. activeColor.value[i] = ''
  1031. }
  1032. }
  1033. }
  1034. function zhankai(){
  1035. isExpanded.value = !isExpanded.value
  1036. currentHeight.value = isExpanded.value ? expandedHeight : initialHeight
  1037. }
  1038. function getChineseInitials(str) {
  1039. if (!str || typeof str !== 'string') return '';
  1040. // 拆分字符串为字符数组
  1041. const chars = str.split('');
  1042. const result = chars.map(char => {
  1043. // 判断是否为中文(Unicode范围:\u4e00-\u9fa5)
  1044. if (/[\u4e00-\u9fa5]/.test(char)) {
  1045. // 获取中文首字母拼音(忽略多音字)
  1046. const pinyinArr = pinyin(char, {
  1047. style: pinyin.STYLE_FIRST_LETTER,
  1048. heteronym: false
  1049. });
  1050. return pinyinArr[0][0]; // 返回首字母
  1051. }
  1052. return char; // 非中文字符直接保留(若需忽略英文可改为空字符串)
  1053. });
  1054. return result.join('');
  1055. }
  1056. function shenhe(row){
  1057. var par = {
  1058. srvIds:row.mdid,
  1059. audit:'2',
  1060. devkind:'APP'
  1061. }
  1062. changeShenhe(par).then(res=>{
  1063. if(res.code===200){
  1064. proxy.$modal.msgSuccess("已可测试!");
  1065. }
  1066. })
  1067. }
  1068. function handleBlur(){
  1069. formTree.value.parGroupCode = getChineseInitials(formTree.value.parGroupName)
  1070. }
  1071. function gatherTable(){
  1072. if(checked1.value===false){
  1073. var keyArray = []
  1074. tableDataCanAll.value.forEach(item=>{
  1075. keyArray.push(item.key)
  1076. })
  1077. tableDataCanAll.value.forEach(item=>{
  1078. tableDataCan.value.forEach(item2=>{
  1079. if(item2.key===item.key){
  1080. item = item2
  1081. }
  1082. })
  1083. })
  1084. tableDataCan.value.forEach(item=>{
  1085. if(!keyArray.includes(item.key)){
  1086. tableDataCanAll.value.push(item)
  1087. }
  1088. })
  1089. currentNodeKey.value = null
  1090. selFen.value = true
  1091. tableDataCan.value = tableDataCanAll.value
  1092. }
  1093. }
  1094. function handleNodeClick(node, data){
  1095. console.log(node.mgid)
  1096. parMgid.value = node.mgid
  1097. var keyArray = []
  1098. selFen.value = false
  1099. tableDataCanAll.value.forEach(item=>{
  1100. keyArray.push(item.key)
  1101. })
  1102. tableDataCanAll.value.forEach(item=>{
  1103. tableDataCan.value.forEach(item2=>{
  1104. if(item2.key===item.key){
  1105. item = item2
  1106. }
  1107. })
  1108. })
  1109. tableDataCan.value.forEach(item=>{
  1110. if(!keyArray.includes(item.key)){
  1111. tableDataCanAll.value.push(item)
  1112. }
  1113. })
  1114. parTree.value = data.data
  1115. tableDataCan.value = []
  1116. tableDataCanAll.value.forEach(item=>{
  1117. if(item.parGroup==data.data.parGroupCode){
  1118. tableDataCan.value.push(item)
  1119. }
  1120. })
  1121. currentNodeKey.value = data.data.mgid
  1122. }
  1123. function submitFen(){
  1124. formTree.value.mdid = parForm.value.mdid
  1125. console.log(isaddFen.value)
  1126. if(isaddFen.value===true){
  1127. addGroup(formTree.value).then(res=>{
  1128. if(res.code===200){
  1129. var par = {
  1130. mdid:parForm.value.mdid
  1131. }
  1132. getModelParList(par).then(res1=>{
  1133. proxy.$modal.msgSuccess("新增成功");
  1134. groupTreeData.value = res1.data
  1135. groupTreeData.value.forEach((item, index, array) => {
  1136. item.label = item.parGroupName
  1137. item.value = item.parGroupCode
  1138. dialogVisibleFen.value = false
  1139. })
  1140. })
  1141. }
  1142. })
  1143. }
  1144. else{
  1145. editGroup(formTree.value).then(res=>{
  1146. if(res.code===200){
  1147. var par = {
  1148. mdid:parForm.value.mdid
  1149. }
  1150. getModelParList(par).then(res1=>{
  1151. proxy.$modal.msgSuccess("修改成功");
  1152. groupTreeData.value = res1.data
  1153. groupTreeData.value.forEach((item, index, array) => {
  1154. item.label = item.parGroupName
  1155. item.value = item.parGroupCode
  1156. dialogVisibleFen.value = false
  1157. })
  1158. })
  1159. }
  1160. })
  1161. }
  1162. }
  1163. function showEditFen(){
  1164. isaddFen.value = false
  1165. dialogVisibleFen.value = true
  1166. formTree.value = parTree.value
  1167. }
  1168. function showAddFenzu(){
  1169. isaddFen.value = true
  1170. dialogVisibleFen.value = true
  1171. }
  1172. function delFenZu(){
  1173. proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
  1174. return delFen(parTree.value.mgid);
  1175. }).then(() => {
  1176. var par = {
  1177. mdid:parForm.value.mdid
  1178. }
  1179. getModelParList(par).then(res1=>{
  1180. groupTreeData.value = res1.data
  1181. groupTreeData.value.forEach((item, index, array) => {
  1182. item.label = item.parGroupName
  1183. item.value = item.parGroupCode
  1184. dialogVisibleFen.value = false
  1185. })
  1186. })
  1187. proxy.$modal.msgSuccess("删除成功");
  1188. }).catch(() => {});
  1189. }
  1190. function delAllCan(){
  1191. proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
  1192. return delAllPar(parForm.value.mdid);
  1193. }).then(() => {
  1194. tableDataCan.value = []
  1195. proxy.$modal.msgSuccess("删除成功");
  1196. }).catch(() => {});
  1197. }
  1198. function saveChangePar(){
  1199. if(checked1.value===true&&tableDataCan.value.length>0){
  1200. tableDataCan.value.forEach((item, index, array) => {
  1201. tableDataCanAll.value.push(item)
  1202. })
  1203. }
  1204. if(tableDataCanAll.value.length>0){
  1205. tableDataCanAll.value.forEach((item, index, array) => {
  1206. item.mdid = parForm.value.mdid
  1207. item.parCate = 'int'
  1208. })
  1209. changePar(tableDataCanAll.value).then(res=>{
  1210. if(res.code===200){
  1211. proxy.$modal.msgSuccess("修改成功");
  1212. dialogVisiblePei.value = false
  1213. getModelListTable()
  1214. }
  1215. })
  1216. }
  1217. else{
  1218. var par = {
  1219. mdid:parForm.value.mdid
  1220. }
  1221. delModelPar(par).then(res=>{
  1222. if(res.code===200){
  1223. proxy.$modal.msgSuccess("修改成功");
  1224. dialogVisiblePei.value = false
  1225. getModelListTable()
  1226. }
  1227. })
  1228. }
  1229. }
  1230. async function showPei(row){
  1231. dialogVisiblePei.value = true
  1232. parRow.value = row
  1233. var par = {
  1234. mdid:row.mdid
  1235. }
  1236. await getModelParList(par).then(res=>{
  1237. groupTreeData.value = res.data
  1238. groupTreeData.value.forEach((item, index, array) => {
  1239. item.label = item.parGroupName
  1240. item.value = item.parGroupCode
  1241. })
  1242. })
  1243. await getModelDetail(row.mdid).then(res=>{
  1244. parForm.value = res.data
  1245. formJi.value = res.data
  1246. })
  1247. await getParamsList(par).then(res=>{
  1248. tableDataCan.value = res.data
  1249. tableDataCan.value.forEach(item=>{
  1250. item.key = Math.random()
  1251. })
  1252. })
  1253. tableDataCanAll.value = JSON.parse(JSON.stringify(tableDataCan.value))
  1254. }
  1255. function delCan(index,row){
  1256. tableDataCan.value.splice(index, 1)
  1257. tableDataCanAll.value.forEach((item,index,array)=>{
  1258. if(item.key===row.key){
  1259. array.splice(index,1)
  1260. }
  1261. })
  1262. }
  1263. function showTest(){
  1264. dialogVisibleDetail.value = true
  1265. }
  1266. function showDe(row){
  1267. dialogVisibleDe.value = true
  1268. getModelDetail(row.mdid).then(res=>{
  1269. parForm.value = res.data
  1270. formJi.value = res.data
  1271. if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
  1272. isElse.value = true
  1273. formJi.value.devlang = 1
  1274. }
  1275. })
  1276. }
  1277. function addCan(){
  1278. tableDataCan.value.push({
  1279. key:Math.random(),
  1280. mgid:parMgid.value,
  1281. parGroup:parTree.value.parGroupCode
  1282. })
  1283. console.log(tableDataCan.value)
  1284. }
  1285. function downOut(){
  1286. var url = window.location.host + formJi.value.mdOutFile
  1287. console.log(url)
  1288. const link = document.createElement('a');
  1289. link.href = 'http://' + url.toString();
  1290. link.download = formJi.value.mdOutName; // 自定义文件名(可选)
  1291. document.body.appendChild(link);
  1292. link.click();
  1293. document.body.removeChild(link);
  1294. }
  1295. function downIn(){
  1296. var url = window.location.host + formJi.value.mdInFile
  1297. console.log(url)
  1298. const link = document.createElement('a');
  1299. link.href = 'http://' + url.toString();
  1300. link.download = formJi.value.mdInName; // 自定义文件名(可选)
  1301. document.body.appendChild(link);
  1302. link.click();
  1303. document.body.removeChild(link);
  1304. }
  1305. function delModel(row){
  1306. proxy.$modal.confirm('是否确认删除?').then(function () {
  1307. return delMdid(row.mdid);
  1308. }).then(() => {
  1309. getModelListTable();
  1310. proxy.$modal.msgSuccess("删除成功");
  1311. }).catch(() => {});
  1312. }
  1313. async function showEdit(row){
  1314. dialogVisible.value = true
  1315. isEdit.value = true
  1316. await nextTick()
  1317. getModelDetail(row.mdid).then(res=>{
  1318. formJi.value = res.data
  1319. if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
  1320. console.log(formJi.value.devlang)
  1321. isElse.value = true
  1322. formJi.value.devlang = '1'
  1323. }
  1324. })
  1325. }
  1326. async function subEdit(){
  1327. if(fileList.value&&fileList.value.length>0&&fileList1.value.length===0){
  1328. await proxy.$refs["uploadRef"].submit();
  1329. }
  1330. else if(fileList1.value&&fileList1.value.length>0&&fileList1.value.length===0){
  1331. await proxy.$refs["uploadRef1"].submit();
  1332. }
  1333. else if(fileList.value&&fileList1.value&&fileList.value.length>0&&fileList1.value.length>0){
  1334. await proxy.$refs["uploadRef1"].submit();
  1335. await proxy.$refs["uploadRef"].submit();
  1336. }
  1337. else{
  1338. await formRefJi.value.validate((valid) => {
  1339. if(valid){
  1340. if(formJi.value.devlang==='1'){
  1341. formJi.value.devlang = elseLan.value
  1342. }
  1343. delete formJi.value.msort
  1344. formJi.value.devkind = 'APP'
  1345. updateModel(formJi.value).then(res=>{
  1346. if(res.code===200){
  1347. proxy.$modal.msgSuccess("修改成功");
  1348. dialogVisible.value = false
  1349. getModelListTable()
  1350. }
  1351. })
  1352. }
  1353. });
  1354. }
  1355. }
  1356. async function submit(){
  1357. formRefJi.value.validate((valid) => {
  1358. console.log(formJi.value,valid)
  1359. if(valid){
  1360. if(formJi.value.devlang==='1'){
  1361. formJi.value.devlang = elseLan.value
  1362. }
  1363. delete formJi.value.msort
  1364. formJi.value.devkind = 'APP'
  1365. formJi.value.cateid = '776eba74-eaeb-47ca-8436-e05ed87b68ec'//区分目录
  1366. addModel(formJi.value).then(res=>{
  1367. if(res.code===200){
  1368. proxy.$modal.msgSuccess("新增成功");
  1369. dialogVisible.value = false
  1370. getModelListTable()
  1371. }
  1372. })
  1373. }
  1374. })
  1375. }
  1376. async function handleFileSuccess1(response, file, fileList){
  1377. formJi.value.mdOutFile = response.originalFilename
  1378. formJi.value.mdOutName = response.fileName
  1379. await formRefJi.value.validate((valid) => {
  1380. if(valid){
  1381. if(formJi.value.devlang==='1'){
  1382. formJi.value.devlang = elseLan.value
  1383. }
  1384. delete formJi.value.msort
  1385. formJi.value.devkind = 'APP'
  1386. updateModel(formJi.value).then(res=>{
  1387. if(res.code===200){
  1388. proxy.$modal.msgSuccess("修改成功");
  1389. dialogVisible.value = false
  1390. getModelListTable()
  1391. }
  1392. })
  1393. }
  1394. });
  1395. };
  1396. async function handleFileSuccess(response, file, fileList){
  1397. formJi.value.mdInFile = response.originalFilename
  1398. formJi.value.mdInName = response.fileName
  1399. await formRefJi.value.validate((valid) => {
  1400. if(valid){
  1401. if(formJi.value.devlang==='1'){
  1402. formJi.value.devlang = elseLan.value
  1403. }
  1404. delete formJi.value.msort
  1405. formJi.value.devkind = 'APP'
  1406. updateModel(formJi.value).then(res=>{
  1407. if(res.code===200){
  1408. proxy.$modal.msgSuccess("修改成功");
  1409. dialogVisible.value = false
  1410. getModelListTable()
  1411. }
  1412. })
  1413. }
  1414. });
  1415. };
  1416. function clearFromTree(){
  1417. formTree.value = {}
  1418. }
  1419. function clearForm(){
  1420. tableDataCan.value = []
  1421. checked1.value = false
  1422. activeName.value = 'first'
  1423. fileList.value = []
  1424. fileList1.value = []
  1425. formJi.value = {
  1426. name:'',
  1427. version:'',
  1428. enname:'',
  1429. devlang:'',
  1430. intro:'',
  1431. type:'',
  1432. mdContact:'',
  1433. mdUnit:'',
  1434. devUnit:'',
  1435. devContact:'',
  1436. deployDir:'',
  1437. deployIp:'',
  1438. deployPort:'',
  1439. mirrorImageUrl:'',
  1440. mdRunCmd:'',
  1441. envOs:'',
  1442. envDisk:'',
  1443. envGpuMem:'',
  1444. evnArmX86:'',
  1445. envCpuNum:'',
  1446. envGpuType:'',
  1447. envGpuNum:'',
  1448. envMem:'',
  1449. mdInNote:'',
  1450. mdOutNote:''
  1451. }
  1452. }
  1453. function reg(){
  1454. isEdit.value = false
  1455. dialogVisible.value = true
  1456. }
  1457. function getModelListTable(){
  1458. tableData.value = []
  1459. var par = {
  1460. pageNum:1,
  1461. pageSize:20,
  1462. name:name.value,
  1463. mdUnit:mdUnit.value,
  1464. devkind:'APP'
  1465. }
  1466. getModelList(par).then(res=>{
  1467. tableData.value = res.rows
  1468. totalComReg.value = res.total
  1469. console.log(tableData)
  1470. })
  1471. }
  1472. const seledMo = ['primary','plain','plain','plain','plain','plain','plain']
  1473. </script>
  1474. <style scoped>
  1475. :deep(.treeLeft) .el-tree-node__content {
  1476. display: flex !important;
  1477. height: 28px; /* 按设计稿调整高度 */
  1478. align-items: center;
  1479. padding-top: 0 !important;
  1480. }
  1481. :deep(.treeLeft) .el-tree-node__content:hover {
  1482. background-color: #e9e9eb;
  1483. }
  1484. :deep(.treeLeft) .el-tree-node__content:active {
  1485. background-color: rgka(69,157,255,0.1) !important;
  1486. }
  1487. /* 选中态(Active) */
  1488. :deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
  1489. background-color: #c6e2ff !important;
  1490. }
  1491. .tabs-wrapper {
  1492. position: relative; /* 确保内容层在伪元素上方 */
  1493. z-index: 1; /* 关键:高于背景图 */
  1494. }
  1495. .tabs-wrapper :deep(.el-tabs),
  1496. .tabs-wrapper :deep(.el-tabs__content) {
  1497. background-color: red !important;
  1498. }
  1499. :deep(.el-tabs){
  1500. background-color: transparent !important;
  1501. }
  1502. :deep(.el-tabs__content){
  1503. background-color: transparent !important;
  1504. }
  1505. :deep(.custom-dialog-bg) {
  1506. z-index: 1000;
  1507. background-image: url('@/assets/images/backDia.jpg') !important;
  1508. background-position-x: left;
  1509. background-position-y: bottom;
  1510. background-size: initial;
  1511. background-repeat: repeat-x;
  1512. background-attachment: initial;
  1513. background-origin: initial;
  1514. background-clip: initial;
  1515. background-color: rgb(255, 255, 255);
  1516. }
  1517. :deep(.custom-dialog-bg .el-dialog__header) {
  1518. }
  1519. :deep(.custom-dialog-bg .el-dialog__body) {
  1520. color: #ecf0f1 !important; ; /* 内容文字颜色 */
  1521. }
  1522. /* 横向排列单选框标签和输入框 */
  1523. .custom-input-wrapper {
  1524. display: flex;
  1525. align-items: center;
  1526. gap: 10px; /* 调整间距 */
  1527. }
  1528. /* 输入框仅显示底部横线 */
  1529. .underline-input :deep(.el-input__wrapper) {
  1530. padding: 0;
  1531. box-shadow: none !important;
  1532. border-bottom: 1px solid #dcdfe6; /* 横线颜色 */
  1533. border-radius: 0;
  1534. background: transparent;
  1535. }
  1536. .underline-input :deep(.el-input__inner) {
  1537. height: 24px;
  1538. padding: 0 5px;
  1539. }
  1540. :deep(.el-table__body tr:hover > td) {
  1541. background-color: #eaf7ff !important;
  1542. }
  1543. .drag-handle {
  1544. cursor: move;
  1545. }
  1546. .ghost {
  1547. opacity: 0.5;
  1548. background: #c8ebfb;
  1549. }
  1550. /* 防止文字选中 */
  1551. :deep(.el-table__row) {
  1552. user-select: none;
  1553. -webkit-user-select: none;
  1554. }
  1555. </style>
  1556. <style scoped lang="scss">
  1557. .el-table .el-table__row td {
  1558. height: 60px !important; /* 行高 */
  1559. }
  1560. .custom-tree-node {
  1561. display: flex; /* 启用 Flex 布局 */
  1562. align-items: center; /* 垂直居中 */
  1563. gap: 8px; /* 图标与文字间距 */
  1564. }
  1565. :deep(.svg-icon) {
  1566. outline: none;
  1567. }
  1568. :deep(.svg-icon svg) {
  1569. stroke: none;
  1570. }
  1571. </style>