index.vue 57 KB

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