nanjingliujinyu 8 месяцев назад
Родитель
Сommit
807aed2e68

+ 7 - 0
ruoyi-ui/src/api/register/regCom.js

@@ -374,6 +374,13 @@ export function addJiCan(data) {
   });
 }
 export function changeShenhe(query) {
+  return request({
+    url: '/model/info/audit',
+    method: 'get',
+    params: query
+  })
+}
+export function changeSerShenhe(query) {
   return request({
     url: '/pt/service/audit',
     method: 'get',

+ 1 - 0
ruoyi-ui/src/assets/icons/svg/lcbsc.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='16.199' height='15.363' viewBox='0 0 16.199 15.363'><path id='路径_22994' data-name='路径 22994' d='M15.429,10.832a.557.557,0,0,1,.571.541v3.25a.557.557,0,0,1-.571.541H2.857a.557.557,0,0,1-.571-.541v-3.25a.557.557,0,0,1,.571-.541Zm-.572,1.082H3.43v2.167H14.858V11.915Zm-8.522.542a.561.561,0,0,1,.577.492.547.547,0,0,1-.474.583l-.1.009H5.173a.56.56,0,0,1-.576-.493.547.547,0,0,1,.474-.582l.1-.009H6.335ZM10.609,5.47a.592.592,0,0,1,.71.169l.053.083a.525.525,0,0,1-.178.673l-.935.645h4.6l.1.009a.547.547,0,0,1,.458.581.561.561,0,0,1-.561.493H10.311l.9.654.076.066a.521.521,0,0,1-.005.731.6.6,0,0,1-.769.061L8.223,7.966l-.082-.072A.524.524,0,0,1,8,7.477.537.537,0,0,1,8.235,7.1L10.52,5.52ZM6.286,5.416l.1.009a.551.551,0,0,1,.47.533l-.01.1a.564.564,0,0,1-.562.445H1.143V8.666H6.286l.1.009a.547.547,0,0,1,.458.58.56.56,0,0,1-.56.493H.57l-.1-.009A.551.551,0,0,1,0,9.208V5.958l.01-.1a.564.564,0,0,1,.561-.445H6.286ZM15.429,0A.557.557,0,0,1,16,.541v3.25a.557.557,0,0,1-.571.541H2.857a.557.557,0,0,1-.571-.541V.541A.557.557,0,0,1,2.857,0Zm-.572,1.083H3.43V3.25H14.858V1.083Zm-8.571.541a.56.56,0,0,1,.576.493.547.547,0,0,1-.474.582l-.1.009H5.143a.561.561,0,0,1-.584-.492.548.548,0,0,1,.481-.584l.1-.009Z' transform='translate(0.1 0.1)' fill='#2565fb' stroke='#2565fb' stroke-width='0.2'/></svg>

+ 1 - 0
ruoyi-ui/src/assets/icons/svg/lcpx.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='16.857' height='16.217' viewBox='0 0 16.857 16.217'><path id='路径_22955' data-name='路径 22955' d='M4.96,2.783a.568.568,0,0,0,.391.158.552.552,0,0,0,.51-.327.515.515,0,0,0-.121-.578L3.772.174C3.745.148,3.717.13,3.688.1h-.01A.253.253,0,0,0,3.586.059q-.051-.012-.1-.026H3.473a.138.138,0,0,0-.092-.02.378.378,0,0,0-.1.009H3.27q-.047.011-.093.026a.353.353,0,0,0-.1.044h-.01a.591.591,0,0,0-.082.071L1.013,2.037a.515.515,0,0,0,0,.746.59.59,0,0,0,.789,0l1.022-.966V13.993L1.8,13.024a.59.59,0,0,0-.789,0,.515.515,0,0,0,0,.747l1.968,1.863a.44.44,0,0,0,.084.062h.01a.273.273,0,0,0,.093.044l.1.026h.01a.378.378,0,0,0,.1.009.383.383,0,0,0,.1-.009.591.591,0,0,0,.1-.026H3.6A.444.444,0,0,0,3.69,15.7a.739.739,0,0,0,.093-.062l1.958-1.863a.515.515,0,0,0,0-.747.59.59,0,0,0-.789,0l-1.022.968V1.816l1.03.966ZM16.753,0H7.839a.544.544,0,0,0-.558.527v3.2a.545.545,0,0,0,.558.527h8.913a.544.544,0,0,0,.557-.527V.527A.544.544,0,0,0,16.753,0Zm-.558,3.2H8.4V1.054h7.8V3.2ZM14.618,5.733H7.838a.544.544,0,0,0-.558.527v3.2a.545.545,0,0,0,.558.527h6.777a.545.545,0,0,0,.558-.527V6.26a.545.545,0,0,0-.558-.527Zm-.558,3.2H8.4V6.787H14.06ZM12.016,11.52H7.839a.544.544,0,0,0-.558.527v3.244a.545.545,0,0,0,.558.527h4.177a.545.545,0,0,0,.558-.527V12.048a.545.545,0,0,0-.558-.527Zm-.557,3.244H8.4V12.576H11.46v2.188Z' transform='translate(-0.652 0.199)' fill='#2666fb' stroke='#2666fb' stroke-width='0.4'/></svg>

+ 1 - 0
ruoyi-ui/src/assets/icons/svg/lcsc.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='16' height='15.564' viewBox='0 0 16 15.564'><g id='组_23686' data-name='组 23686' transform='translate(-9.992 -9.145)'><path id='路径_22974' data-name='路径 22974' d='M25.17,14.182V9.945a.814.814,0,0,0-.828-.8H10.821a.814.814,0,0,0-.828.8V23.909a.814.814,0,0,0,.828.8H24.342a.814.814,0,0,0,.828-.8V20.791H23.791V22.71a.524.524,0,0,1-.162.377.562.562,0,0,1-.391.156H11.952a.562.562,0,0,1-.39-.156.524.524,0,0,1-.161-.377V11.17a.542.542,0,0,1,.552-.533H23.238a.543.543,0,0,1,.552.533V13.09H25.17v1.093Z' transform='translate(0)' fill='#2565fb'/><path id='路径_22975' data-name='路径 22975' d='M501.654,465.427a.682.682,0,0,0,.707.719h4.25l-1.4,1.284a.7.7,0,0,0-.251.5.737.737,0,0,0,.707.762.7.7,0,0,0,.505-.212l2.789-2.493a.868.868,0,0,0,.215-.563.667.667,0,0,0-.647-.708h-6.17a.663.663,0,0,0-.706.708Z' transform='translate(-483.185 -448.395)' fill='#2565fb'/><path id='路径_22976' data-name='路径 22976' d='M501.654,294.048a.682.682,0,0,1,.707-.719h4.25l-1.4-1.285a.7.7,0,0,1-.251-.5.737.737,0,0,1,.707-.761.7.7,0,0,1,.505.212l2.789,2.493a.87.87,0,0,1,.215.563.667.667,0,0,1-.647.708h-6.17a.663.663,0,0,1-.706-.708Z' transform='translate(-483.185 -277.197)' fill='#2565fb'/><path id='路径_22977' data-name='路径 22977' d='M871.669,220.587a.623.623,0,0,0,.57-.336.743.743,0,0,0,0-.706.623.623,0,0,0-.57-.336.7.7,0,0,0,0,1.379Zm-.633,7.311a.707.707,0,0,0,.309.621.59.59,0,0,0,.648,0,.707.707,0,0,0,.309-.621.634.634,0,1,0-1.266,0Z' transform='translate(-847.133 -206.972)' fill='#2565fb'/><path id='路径_22978' data-name='路径 22978' d='M192.547,465.5h3.04v1.419h-3.04Z' transform='translate(-179.584 -449.252)' fill='#2565fb'/><path id='路径_22979' data-name='路径 22979' d='M192.547,236.473h5.269v1.418h-5.269Z' transform='translate(-179.517 -223.791)' fill='#2565fb'/><path id='路径_22980' data-name='路径 22980' d='M192.547,694.555h5.269v1.418h-5.269Z' transform='translate(-179.517 -674.747)' fill='#2565fb'/></g></svg>

+ 1 - 0
ruoyi-ui/src/assets/icons/svg/lczd.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='16.71' height='15.18' viewBox='0 0 16.71 15.18'><g id='组_23733' data-name='组 23733' transform='translate(16175.042 21985.582)'><path id='路径_23017' data-name='路径 23017' d='M206.851,214.326h4.922a.618.618,0,1,0,0-1.235h-4.922a.618.618,0,0,0,0,1.235Zm0,3.7h4.922a.618.618,0,1,0,0-1.235h-4.922a.618.618,0,0,0,0,1.235Zm9.723-9.723H221.5a.618.618,0,1,0,0-1.235h-4.922a.618.618,0,0,0,0,1.235Zm-.618-4.31a.619.619,0,0,0,.618.618H221.5a.618.618,0,1,0,0-1.235h-4.923A.619.619,0,0,0,215.957,203.989Zm-5.414,8a.619.619,0,0,0,.618-.618V204.6h3.079a.618.618,0,0,0,0-1.235h-7.389a.618.618,0,0,0,0,1.235h3.079v6.771a.611.611,0,0,0,.613.618Z' transform='translate(-16381.125 -22188.799)' fill='#2565fb' stroke='#2565fb' stroke-width='0.3'/><path id='路径_23018' data-name='路径 23018' d='M217.153,208.861a4.31,4.31,0,1,0,4.31,4.31A4.312,4.312,0,0,0,217.153,208.861Zm2.145,4.854h-1.6v1.6a.545.545,0,1,1-1.09,0v-1.6h-1.6a.545.545,0,1,1,0-1.09h1.6v-1.6a.545.545,0,1,1,1.09,0v1.6h1.6a.545.545,0,1,1,0,1.09Z' transform='translate(-16379.795 -22187.883)' fill='#2565fb'/></g></svg>

+ 1 - 0
ruoyi-ui/src/assets/icons/svg/lczh.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='17.996' height='18.969' viewBox='0 0 17.996 18.969'><g id='组_23685' data-name='组 23685' transform='translate(16617.998 22118.969)'><path id='路径_22995' data-name='路径 22995' d='M134.693,108.713h-2.82v-.742a.742.742,0,1,0-1.484,0v.742h-2.819c-.41,0-.742.184-.742.594v3.562a.883.883,0,0,0,.742.89h2.82v1.336a.742.742,0,1,0,1.484,0v-1.336h2.82a.884.884,0,0,0,.742-.89v-3.562C135.435,108.9,135.1,108.713,134.693,108.713Zm-4.3,3.562h-2.078V110.2h2.078Zm3.562,0h-2.078V110.2h2.078Zm-7.41-13.708c.187,0,4.411.155,5.061,4.039l-.222-.148a.85.85,0,0,0-.943,1.415l1.591,1.061,0,0,.01.007.016.009a.812.812,0,0,0,.082.046l.039.018c.022.009.044.018.066.025l.046.014c.022.006.045.011.067.015l.044.008a.838.838,0,0,0,.1.007h.019a.838.838,0,0,0,.1-.007l.044-.008c.023,0,.045-.009.068-.015l.046-.014c.023-.008.045-.016.067-.025l.039-.017a.849.849,0,0,0,.082-.046l.016-.009.01-.007,0,0,1.634-1.089a.85.85,0,1,0-.943-1.415l-.36.24c-.534-4.463-4.617-5.751-6.746-5.8a.85.85,0,1,0-.041,1.7Zm-.384,15.516c-.19,0-4.57-.161-5.093-4.261l.29.193a.85.85,0,0,0,.943-1.415l-1.6-1.069h0a.841.841,0,0,0-.151-.08c-.015-.006-.031-.009-.046-.014a.864.864,0,0,0-.111-.033c-.022,0-.044,0-.065-.007a.8.8,0,0,0-.1-.009c-.017,0-.033,0-.05,0a.837.837,0,0,0-.114.012c-.013,0-.026.008-.04.012a.742.742,0,0,0-.265.114h0l-1.647,1.1a.85.85,0,0,0,.943,1.415l.309-.206c.463,4.578,4.609,5.893,6.761,5.945h.021a.85.85,0,0,0,.02-1.7Zm-7.76-8.938a.859.859,0,0,0,.106.011h4.764a.85.85,0,1,0,0-1.7H119.14v-1.275h4.127a.85.85,0,1,0,0-1.7H119.14V99.205h4.127a.85.85,0,1,0,0-1.7H118.5a.816.816,0,0,0-.106.011.821.821,0,0,0-.956.839v5.951a.85.85,0,0,0,.85.85A.859.859,0,0,0,118.4,105.146Z' transform='translate(-16735.438 -22215.836)' fill='#2666fb'/></g></svg>

Разница между файлами не показана из-за своего большого размера
+ 4 - 0
ruoyi-ui/src/assets/icons/svg/lczhzj.svg


+ 1 - 0
ruoyi-ui/src/assets/icons/svg/liuchengEx.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='17.846' height='19.494' viewBox='0 0 17.846 19.494'><path id='路径_22954' data-name='路径 22954' d='M2.766,2.683l11.217-1.6a.446.446,0,0,1,.5.379.452.452,0,0,1,0,.063v18.6a.446.446,0,0,1-.446.446.438.438,0,0,1-.063,0l-11.217-1.6A.892.892,0,0,1,2,18.08V3.567A.892.892,0,0,1,2.766,2.683ZM3.785,4.341V17.306l8.923,1.275V3.066Zm11.6,12.729h2.677V4.577H15.384V2.793h3.569a.892.892,0,0,1,.892.892V17.962a.892.892,0,0,1-.892.892H15.384ZM9.317,10.823l2.5,3.569H9.674L8.246,12.353,6.818,14.393H4.677l2.5-3.569-2.5-3.569H6.818l1.428,2.04,1.428-2.04h2.141Z' transform='translate(-2 -1.076)' fill='#2665fb'/></svg>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
ruoyi-ui/src/assets/icons/svg/liuchengbiao.svg


+ 15 - 0
ruoyi-ui/src/assets/icons/svg/liuchengcsv.svg

@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16.24" height="16.459" viewBox="0 0 16.24 16.459">
+  <g id="组_23726" data-name="组 23726" transform="translate(16660.77 22259.602)">
+    <g id="组_23717" data-name="组 23717" transform="translate(-16660.77 -22259.602)">
+      <g id="组_23711" data-name="组 23711" transform="translate(0 0)">
+        <g id="组_23710" data-name="组 23710">
+          <g id="组_23668" data-name="组 23668">
+            <path id="路径_22944" data-name="路径 22944" d="M3.624,4.551V17.908H16.617V4.551ZM2.812,3H17.429a.794.794,0,0,1,.812.776V18.684a.794.794,0,0,1-.812.776H2.812A.794.794,0,0,1,2,18.684V3.776A.794.794,0,0,1,2.812,3Z" transform="translate(-2 -3)" fill="#2665fb"/>
+          </g>
+          <text id="CSV" transform="translate(1.88 13.936)" fill="#2565fb" font-size="7" font-family="DIN-Bold, DIN" font-weight="700" letter-spacing="-0.02em"><tspan x="0" y="0">CSV</tspan></text>
+          <path id="路径_23015" data-name="路径 23015" d="M276.678,299.605v3.174a.737.737,0,0,0,1.461,0v-3.174h.83a.645.645,0,1,0,0-1.28h-3.125a.645.645,0,1,0,0,1.28ZM284,302.3h-3.022a.645.645,0,1,0,0,1.28H284a.645.645,0,1,0,0-1.28Zm0-2.318h-3.022a.645.645,0,1,0,0,1.28H284a.645.645,0,1,0,0-1.28Z" transform="translate(-272.601 -296.08)" fill="#2665fb"/>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 1 - 0
ruoyi-ui/src/assets/icons/svg/liuchengshuru.svg

@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='17.43' height='19.914' viewBox='0 0 17.43 19.914'><g id='组_23674' data-name='组 23674' transform='translate(-136.576 -115.732)'><path id='路径_22945' data-name='路径 22945' d='M143.116,126.121h10.891V115.732h-17.43v19.915h6.537v-9.527h0Zm4.056-1.02h-3.928v-3.041h3.928V125.1Zm5.3,0H148.2v-3.041h4.274Zm-14.358-7.639H152.47v2.868H138.112Zm4.107,16.456h-4.107v-3.044h4.1v3.044h0Zm0-4.2h-4.107v-3.468h4.1v3.468h0Zm-4.107-4.621v-3.041h4.1V125.1Z' fill='#2665fb'/><path id='路径_22946' data-name='路径 22946' d='M474.045,596.738a1,1,0,0,0-1-1h-4.572l1.118-1.118a1,1,0,0,0-1.411-1.411l-2.819,2.819a1,1,0,0,0-.212.315v0a.921.921,0,0,0-.047.15c0,.013-.009.025-.013.04a1.03,1.03,0,0,0,0,.392c0,.012.009.028.013.04a.917.917,0,0,0,.047.15,0,0,0,0,0,0,0,1,1,0,0,0,.212.315l2.818,2.818a1,1,0,0,0,1.411-1.411l-1.121-1.112h4.572A1,1,0,0,0,474.045,596.738Z' transform='translate(-320.038 -464.9)' fill='#2665fb'/></g></svg>

+ 1416 - 0
ruoyi-ui/src/views/platform/plugin/peizhi.vue

@@ -0,0 +1,1416 @@
+<template>
+  <div style="width: 100%;padding-top: 1%;" :style="{'height':heightAll+'px'}">
+    <div style="display: flex;width: 100%;margin-left: 1%;justify-content: space-between;">
+      <div style="display: flex;width: 35%;">
+        <div style="display: flex;width: 100%;align-items: center;">
+            <div>
+                模型名称:
+            </div>
+            <el-input v-model="name" style="width:50%;margin-left: 1%;" placeholder="" />
+        </div>
+        <div style="display: flex;width: 100%;align-items: center;margin-left:-15%;">
+            <div>
+                模型归属单位:
+            </div>
+            <el-input v-model="mdUnit" style="width: 50%;margin-left: 1%;" placeholder="" />
+        </div>
+        <el-button type="primary" style="margin-left: -10%;" @click="getModelListTable" :icon="Search">查询</el-button>
+      </div>
+        <div style="display: flex;align-items: center;margin-right: 3%;">
+            
+            <el-button type="primary" style="margin-left:5%;" @click="reg" icon="Plus">注册</el-button>
+        </div>
+    </div>
+    <div style="margin-top: 0%;margin-left: 0%;width: 100%;">
+        <el-table 
+        :data="tableData" 
+        height="80vh"
+        style="width: 98%;margin-left: 1%;margin-top: 0.5%;"
+        :cell-style="{ padding:'5px' }"
+        :header-cell-style="{height: heightAll*0.01+'px',}"
+        :row-style="{ fontSize: '16px',textAlign:'center'}"
+        border >
+        <el-table-column type="index" label="序号" width="80">
+          <template #default="{ $index }">
+            <div style="text-align: center;">
+              {{ $index + 1 }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="模型名称">
+        </el-table-column>
+        <el-table-column prop="enname" label="英文名称">
+        </el-table-column>
+        <el-table-column prop="type" label="模型类型" width="160"/>
+        <el-table-column prop="mdUnit" label="模型单位" width="200"/>
+        <el-table-column prop="mdContact" label="联系方式" width="100"/>
+        <el-table-column prop="status" label="模型状态" width="140">
+        </el-table-column>
+        <el-table-column prop="modifyBy" label="发布时间" width="170"/>
+        <el-table-column prop="version" label="版本" width="120"/>
+        <el-table-column prop="address" label="操作" width="100">
+            <template #default="scope">
+                <div style="display: flex;justify-content: space-between;width: 100%;">
+                    <!-- <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left: 0%;">编辑</el-button> -->
+                    <!-- <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button> -->
+                    <!-- <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: -5%;">查看</el-button> -->
+                    <el-button @click="showPei(scope.row)" type="warning" text size="mini" style="margin-left:0%;">配置</el-button>
+                    <!-- <el-button type="danger" @click="delModel(scope.row)" text size="mini" style="margin-left: -5%;">删除</el-button>
+                    <el-button type="danger" @click="shenhe(scope.row)" text size="mini" style="margin-left: -5%;">审核</el-button> -->
+                </div>
+            </template>
+        </el-table-column>
+      </el-table>
+        <el-dialog v-model="dialogVisible" title="" width="60%" @close="clearForm" destroy-on-close>
+                <div class="card-header">
+                  <span style="font-size: 20px;margin-left: 1%;">基本信息</span>
+                  <el-divider style="margin-top: 1%;"/>
+                </div>
+              <div>
+                <el-form  size="mini"  style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
+                  <el-row :gutter="40">
+                        <el-col :span="8">
+                          <el-form-item label="模型名称:" prop="name" style="">
+                              <div style="display: flex;width: 120%;justify-content: space-between;">
+                                <el-input  v-model="formJi.name" style="width: 100%;"/>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="英文名:" prop="enname" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.enname" style="width: 100%;"/>
+                            </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="6">
+                          <el-form-item label="版本号:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.version" style="width: 100%;"/>
+                            </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                  <el-row :gutter="48">
+                    <el-col :span="8">
+                      <el-form-item label="模型类型:" prop="" style="">
+                        <div style="display: flex;width: 100%;justify-content: space-between;">
+                          <el-input placeholder="如水利模型、排水模型、供水模型、海洋模型" v-model="formJi.type" style="width: 100%;" resize="none"/>
+                        </div>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                  <el-form-item label="排序:" prop="" style="">
+                      <div style="display: flex;width: 100%;justify-content: space-between;">
+                        <el-input-number v-model="formJi.sort" :min="1" style="width: 22%;"/>
+                      </div>
+                  </el-form-item>
+                  <el-row :gutter="48">
+                    <el-col :span="24">
+                      <el-form-item label="开发语言:">
+                          <el-radio-group v-model="formJi.devlang" class="custom-radio-group" style="width: 100%;">
+                            <el-radio label="java" size="large">java</el-radio>
+                            <el-radio label="nodeJs" size="large">nodeJs</el-radio>
+                            <el-radio label="python" size="large">python</el-radio>
+                            <el-radio label="c/c++" size="large">c/c++</el-radio>
+                            <el-radio label="1" size="large">
+                              <div class="custom-input-wrapper">
+                                <span>其它</span>
+                                <el-input 
+                                  v-model="elseLan"
+                                  class="underline-input"
+                                  v-show="isElse"
+                                />
+                              </div>
+                            </el-radio>
+                            </el-radio-group>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                  <el-row :gutter="48">
+                        <el-col :span="16">
+                          <el-form-item label="简介:">
+                              <el-input  v-model="formJi.intro" style="width: 100%;" :rows="3" resize="none" type="textarea"/>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                </el-form>
+              </div>
+            
+              <div class="card-header">
+                <span style="font-size: 20px;margin-left: 1%;">单位</span>
+                <el-divider style="margin-top: 1%;"/>
+              </div>
+            <div style="margin-top: 0%;">
+              <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right"  label-width="120px" :rules="rulesJi">
+                <el-row :gutter="48">
+                      <el-col :span="11">
+                        <el-form-item label="模型归属单位:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.mdUnit" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="11">
+                        <el-form-item label="联系方式:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.mdContact" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="11">
+                        <el-form-item label="技术支持单位:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.devUnit" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="11">
+                        <el-form-item label="联系方式:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.devContact" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+              </el-form>
+            </div>
+            <el-tabs
+            v-model="activeName"
+            type="card"
+            style="margin-top: 1%;"
+          >
+            <el-tab-pane label="部署情况" name="first">
+              <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right" label-width="120px"   :rules="rulesJi">
+                <el-row :gutter="48">
+                      <el-col :span="11">
+                        <el-form-item label="服务器IP:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input   v-model="formJi.deployIp" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="11">
+                        <el-form-item label="端口:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input placeholder="可填写多个端口,以“,”分隔"  v-model="formJi.deployPort" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="15">
+                        <el-form-item label="部署位置:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.deployDir" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="10">
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="15">
+                        <el-form-item label="服务访问地址:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.mirrorImageUrl" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="15">
+                        <el-form-item label="服务器运行命令:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.mdRunCmd" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+              </el-form>
+              <div style="display: flex;margin-top: -5%;">
+                <div class="card-header" style="margin-top: 5%;display: flex;justify-content: inherit;margin-left: 2%">
+                  <span style="font-size: 20px;margin-top: 5%; writing-mode: vertical-rl;position: relative;top: 15%;">运行环境</span>
+                </div>
+                <el-form size="mini" :key="tableKey" style="margin-top: 5%;width: 85%;"  :model="formJi" label-position="right" label-width="120px"   :rules="rulesJi">
+                  <el-row :gutter="48">
+                        <el-col :span="12">
+                          <el-form-item label="操作系统:" prop="" style="">
+                              <div style="display: flex;width: 100%;justify-content: space-between;">
+                                <el-select
+                                v-model="formJi.envOs"
+                                
+                                    style="width: 75%;margin-left: 0%;"
+                                >
+                                    <el-option
+                                    v-for="item in optionsEnv"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value"
+                                    />
+                                </el-select>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                          <el-form-item label="运行架构:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                               <el-radio-group v-model="formJi.evnArmX86" class="ml-4" size="small" style="" >
+                                    <el-radio label="X86" size="large">X86</el-radio>
+                                    <el-radio label="ARM" size="large">ARM</el-radio>
+                                </el-radio-group>
+                            </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                  <el-row :gutter="24">
+                        <el-col :span="8">
+                          <el-form-item label="硬盘:" prop="" style="">
+                              <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envDisk"
+                                  :min="100"
+                                  :max="2048"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  G
+                                </div>
+                              </div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="CPU核数:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envCpuNum"
+                                  :max="64"
+                                  :min="2"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  个
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="内存:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envMem"
+                                  :max="512"
+                                  :min="1"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  G
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                  <el-row :gutter="24">
+                        <el-col :span="8">
+                          <el-form-item label="GPU型号:" prop="" style="">
+                              <div style="display: flex;width: 100%;">
+                                <el-input   v-model="formJi.envGpuType" style="width: 100%;"/>
+                              </div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="GPU数量:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                               <el-input-number
+                                  v-model="formJi.envGpuNum"
+                                  :min="1"
+                                  :max="64"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  个
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="GUP显存:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envGpuMem"
+                                  :min="1"
+                                  size="mini"
+                                  :max="512"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  G
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                </el-form>
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="输入" name="second">
+              <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">
+                <el-form-item label="输入文档:" prop="">
+                    <div style="width: 75%;">
+                      <el-upload
+                          ref="uploadRef"
+                          :limit="1"
+                          accept=".xlsx, .xls"
+                          :headers="upload.headers"
+                          :on-change="handleChange"
+                          :file-list="fileList"
+                          :action="upload.url + '?file=' + upload.updateSupport"
+                          :on-progress="handleFileUploadProgress"
+                          :on-success="handleFileSuccess"
+                          :auto-upload="false"
+                          drag
+                      >
+                          <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                      </el-upload>
+                    </div>
+                    <div style="color: #b1b3b8;width: 100%;">
+                      注:请上传后缀名为.docx .pdf .txt的文件
+                    </div>
+                    <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
+                  </el-form-item>
+                  <el-form-item label="说明:" prop="" style="margin-left: -1%;">
+                    <el-input v-model="formJi.mdInNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
+                  </el-form-item>
+                </el-form>
+            </el-tab-pane>
+            <el-tab-pane label="输出" name="third">
+              <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">
+                <el-form-item label="输出文档:" prop="">
+                    <div style="width: 75%;">
+                      <el-upload
+                          ref="uploadRef1"
+                          :limit="1"
+                          accept=".xlsx, .xls"
+                          :headers="upload.headers"
+                          :on-change="handleChange1"
+                          :file-list="fileList1"
+                          :action="upload.url + '?file=' + upload.updateSupport"
+                          :on-progress="handleFileUploadProgress"
+                          :on-success="handleFileSuccess1"
+                          :auto-upload="false"
+                          drag
+                      >
+                          <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                      </el-upload>
+                    </div>
+                    <div style="color: #b1b3b8;width: 100%;">
+                      注:请上传后缀名为.docx .pdf .txt的文件
+                    </div>
+                    <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
+                  </el-form-item>
+                  <el-form-item label="说明:" prop="" style="margin-left: -1%;">
+                    <el-input v-model="formJi.mdOutNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
+                  </el-form-item>
+                </el-form>
+            </el-tab-pane>
+          </el-tabs>
+            <template #footer>
+            <span class="dialog-footer">
+                <el-button @click="dialogVisible = false">取消</el-button>
+                <el-button type="primary" @click="submit" v-if="!isEdit">
+                  提交
+                </el-button>
+                <el-button type="primary" @click="subEdit" v-if="isEdit">
+                  提交
+                </el-button>
+            </span>
+            </template>
+        </el-dialog>
+        <el-dialog  v-model="dialogVisibleDe" title="" width="50%" @close="" destroy-on-close class="custom-dialog-bg">
+          <el-descriptions title="基本信息" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
+            <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
+            <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
+            <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
+            <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
+            <el-descriptions-item label="开发语言:"  span="2">{{formJi.devlang}}</el-descriptions-item>
+            <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
+          </el-descriptions>
+          <el-divider style="margin-top: 0%;"/>
+          <el-descriptions title="单位" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
+            <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
+            <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
+            <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
+            <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
+          </el-descriptions>
+          <el-tabs
+            v-model="activeName"
+            type="card"
+            style="margin-top: 1%;background-color: transparent;"
+          >
+            <el-tab-pane label="部署情况" name="first" style="background-color: transparent;">
+              <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background-color: transparent;">
+                <el-descriptions-item label="服务器IP:" span="2">{{formJi.deployIp}}</el-descriptions-item>
+                <el-descriptions-item label="端口:">{{formJi.deployPort}}</el-descriptions-item>
+                <el-descriptions-item label="部署位置:" span="2">{{formJi.deployDir}}</el-descriptions-item>
+                <el-descriptions-item label="服务访问地址:">{{formJi.mirrorImageUrl}}</el-descriptions-item>
+                <el-descriptions-item label="服务器运行命令:" span="3">{{formJi.mdRunCmd}}</el-descriptions-item>
+                <el-descriptions-item label="操作系统:" span="2">{{formJi.envOs}}</el-descriptions-item>
+                <el-descriptions-item label="运行架构:" span="3">{{formJi.evnArmX86}}</el-descriptions-item>
+                <el-descriptions-item label="硬盘:" span="">
+                  {{formJi.envDisk + 'G'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="CPU核心数:">
+                  {{formJi.envCpuNum + '个'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="内存:">
+                  {{formJi.envMem + 'G'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="GPU型号:">{{formJi.envGpuType}}</el-descriptions-item>
+                <el-descriptions-item label="GPU数量:">
+                  {{formJi.envGpuNum + '个'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="GUP显存:">
+                  {{formJi.envGpuMem + 'G'}}
+                </el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+            <el-tab-pane label="输入" name="second">
+              <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
+                <el-descriptions-item label="输入文档:" span="2">
+                  <el-link type="primary"  @click="downIn">{{formJi.mdInName}}</el-link>
+                </el-descriptions-item>
+                <el-descriptions-item label="说明:">{{formJi.mdInNote}}</el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+            <el-tab-pane label="输出" name="third">
+              <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
+                <el-descriptions-item label="输出文档:" span="2">
+                  <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
+                </el-descriptions-item>
+                <el-descriptions-item label="说明:">{{formJi.mdOutNote}}</el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+          </el-tabs>
+        </el-dialog>
+        <el-dialog  @close="clearForm" v-model="dialogVisiblePei" width="70%" title="参数配置">
+          <el-tabs v-model="activeName" type="border-card">
+            <el-tab-pane label="基本信息" name="first">
+              <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
+                <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
+                <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
+                <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
+                <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
+                <el-descriptions-item label="开发语言:"  span="2">{{formJi.devlang}}</el-descriptions-item>
+                <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
+              </el-descriptions>
+              <el-divider style="margin-top: 0%;"/>
+              <el-descriptions title="" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
+                <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
+                <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
+                <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
+                <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+            <el-tab-pane label="模型参数" style="height: 50vh;" :key="activeTabKey">
+              <div style="display: flex;justify-content: space-between;margin-right: 2%;align-items: center;background-color: #e9e9eb;;width: 100%;">
+                <div style="display: flex;align-items: center;margin-left: 1%;">
+                  <el-checkbox v-model="checked1" label="参数是否分组" size="large"  @change="gatherTable"/>
+                  <el-button  @click="showAddFenzu" style="margin-left: 10%;" type="success" size="mini" plain v-if="checked1">新增分组</el-button>
+                </div>
+                <div style="display: flex;justify-content: flex-end;margin-right: 1%;">
+                  <el-button  @click="addCan" style="margin-left: 5%;" type="success" size="mini" plain :disabled="selFen">新增参数</el-button>
+                  <el-button  @click="delAllCan" style="margin-top: 0%;" type="danger" size="mini" plain>删除</el-button>
+                </div>
+              </div>
+              <div style="display: flex;">
+                <div v-if="checked1" style="margin-top:1%;width: 10%;background-color: #F2F6FC;height:45vh;">
+                  <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft" 
+                    :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">
+                        <template #default="{ node, data }">
+                          <span  style="justify-content: space-between;display: flex;width: 100%;align-items: center;margin-left: -10%;">
+                            <div class="custom-tree-node" style="align-items: center;line-height: 1.5;">
+                              <span style="">{{ node.label }}</span>
+                            </div>
+                            <div style="margin-right: 1%;position: absolute;left:78%;">
+                              <el-dropdown trigger="hover" @click.stop v-if="currentNodeKey === data.mgid">
+                                  <el-icon><MoreFilled /></el-icon>
+                                  <!-- <svg-icon icon-class="zhankai"/> -->
+                                <template #dropdown>
+                                  <el-dropdown-menu>
+                                    <el-dropdown-item style="display: flex;"  @click="showEditFen">
+                                      <el-icon class="el-icon--right" style="color: black;">
+                                        <Connection />
+                                      </el-icon>
+                                      <div>
+                                        编辑分组
+                                      </div>
+                                    </el-dropdown-item>
+                                    <divider/>
+                                    <el-dropdown-item style="display: flex;"  @click="delFenZu" divided>
+                                      <el-icon class="el-icon--right" style="color: black;">
+                                        <CircleClose />
+                                      </el-icon>
+                                      <div>
+                                        删除分组
+                                      </div>
+                                    </el-dropdown-item>
+                                  </el-dropdown-menu>
+                                </template>
+                              </el-dropdown>
+                            </div>
+                          </span>
+                        </template>
+                      </el-tree>
+                </div>
+                <div style="width: 90%;flex: 1;">
+                  <el-table 
+                style="margin-top: 1%;width: 100%;margin-left: 1%;overflow: auto;"
+                :data="tableDataCan" 
+                :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
+                :header-cell-style="{ textAlign: 'center', }"
+                max-height="45vh"
+                :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+                border>
+                    <el-table-column prop="parName" label="*参数英文名">
+                      <template #default="scope" style="width: 120%;">
+                          <el-input  v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parName" label="*参数名称">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parType" label="*参数类型" >
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parLine" label="行号">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parLine" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="维度">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parDimen" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="表达式">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parExpr" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="*默认值">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parDefVal" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="参数范围">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parRange" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="版本号">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parVersion" style="width: 120%;margin-left: -10%;"/>
+                      </template> 
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="操作" width="85">
+                      <template #default="scope">
+                          <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
+                      </template> 
+                    </el-table-column>
+                </el-table>
+                </div>
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="模型状态">Role</el-tab-pane>
+          </el-tabs>
+          <template #footer>
+          <span class="dialog-footer">
+              <el-button @click="dialogVisiblePei = false">取消</el-button>
+              <el-button type="primary" @click="saveChangePar">
+                提交
+              </el-button>
+          </span>
+          </template>
+        </el-dialog >
+        <el-dialog v-model="dialogVisibleFen" :title="titleFen" width="30%" @close="clearFromTree" destroy-on-close :key="tableKey">
+          <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">
+            <el-form-item label="名称:" prop="parGroupName" style="">
+              <el-input v-model="formTree.parGroupName" @blur="handleBlur" style="width: 75%;" placeholder=""  resize="none"/>
+            </el-form-item>
+            <el-form-item label="组编码:" prop="parGroupCode"  style="">
+              <el-input v-model="formTree.parGroupCode" style="width: 75%;" placeholder=""  resize="none"/>
+            </el-form-item>
+            <el-form-item label="说明:" prop="parGroupNote">
+              <el-input v-model="formTree.parGroupNote" style="width: 75%;" placeholder="" type="textarea"  resize="none"/>
+            </el-form-item>
+            <el-form-item label="排序:" prop="parGroupSort">
+              <el-input-number v-model="formTree.parGroupSort" :min="1" style="width: 50%;"/>
+            </el-form-item>
+          </el-form>
+          <template #footer>
+            <span class="dialog-footer">
+              <el-button size="mini" @click="dialogVisibleFen = false">取消</el-button>
+              <el-button type="primary" @click="submitFen" size="mini">
+                提交
+              </el-button>
+            </span>
+          </template>
+        </el-dialog>
+    </div>
+  </div>
+</template>
+<script   setup>
+import { getModelList,addModel,delMdid,getModelDetail,updateModel,addGroup,getParamsList,changePar,delAllPar,getModelParList,delFen,changeShenhe } from "@/api/register/regCom";
+import { ref, onMounted, onUnmounted, nextTick } from 'vue';
+import { Search } from '@element-plus/icons-vue'
+import {
+  ArrowLeft,
+  Plus
+} from '@element-plus/icons-vue'
+import { reactive } from 'vue'
+import { forwardRefProps } from 'element-plus/es/components/tooltip-v2/src/forward-ref.mjs';
+import { getToken } from "@/utils/auth";
+import { fa } from "element-plus/es/locales.mjs";
+import { column } from "element-plus/es/components/table-v2/src/common.mjs";
+import { TRUE } from "sass";
+import { editGroup } from "../../../api/register/regCom";
+import pinyin from 'pinyin';
+
+const { proxy } = getCurrentInstance();
+const dialogVisibleFen = ref(false)
+const dragTableRef = ref()
+const isaddFen = ref(false)
+const dialogVisible = ref(false)
+const dialogVisibleDe = ref(false)
+const dialogVisiblePei = ref(false)
+const active = ref(0)
+const isEdit = ref(true)
+const name = ref('')
+const isAdd = ref(true)
+const mdUnit = ref('')
+const isElse = ref(false)
+const elseLan = ref('')
+const tableDataCan = ref([])
+const selFen = ref(true)
+const groupTreeData = ref([])
+const parRow = ref({})
+const formJi = ref({
+  name:'',
+  version:'',
+  enname:'',
+  devlang:'',
+  intro:'',
+  type:'',
+  mdContact:'',
+  mdUnit:'',
+  devUnit:'',
+  devContact:'',
+  deployDir:'',
+  deployIp:'',
+  deployPort:'',
+  mirrorImageUrl:'',
+  mdRunCmd:'',
+  envOs:'',
+  envDisk:'',
+  envGpuMem:'11',
+  evnArmX86:'',
+  envCpuNum:'',
+  envGpuType:'',
+  envGpuNum:'2',
+  envMem:'',
+  mdInNote:'',
+  mdOutNote:''
+});
+const activeTabKey = ref(0)
+const rulesJi = reactive({
+  name: [{ required: true, message: '必填', trigger: 'blur' }],
+  enname: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefJi = ref();
+
+const formZu = ref({
+  mirrorImageEurl:'',
+  mdCPU:'',
+  mdGPU:''
+});
+const rulesZu = reactive({
+  mirrorImageEurl: [{ required: true, message: '必填', trigger: 'blur' }],
+  mdCPU: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefZu = ref();
+
+const formTree = ref({
+  parGroupSort:1,
+  parGroupNote:'',
+  parGroupName:'',
+  parGroupCode:''
+});
+const rulesTree = reactive({
+  parGroupName: [{ required: true, message: '必填', trigger: 'blur' }],
+  parGroupSort: [{ required: true, message: '必填', trigger: 'blur' }],
+  parGroupCode: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefTree = ref();
+const activeName = ref('first')
+const titleFen = ref('');
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: "",
+  // 是否禁用上传
+  isUploading: false,
+  // 是否更新已经存在的用户数据
+  updateSupport: '',
+  // 设置上传的请求头部
+  headers: { Authorization: "Bearer " + getToken() },
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + "/common/upload"
+});
+const downUrl = ref(import.meta.env.VITE_APP_BASE_API)
+const tableKey = ref(0);
+const totalComReg = ref()
+const currentPage = ref(1)
+const tableData2 = ref([ 
+  { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' }
+]);
+const tableData3 = ref([
+  { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' }
+]);
+const checked1 = ref(false)
+const tableData1= [{date1:'初始状态',
+  date2:'sts',
+  date3:'数据项',
+  date4:'初始状态',
+  date5:'是',
+  date6:'否',
+  date7:'2023-09-08'
+}]
+const checkGroup = [
+    {label:'水文预报'},
+    {label:'维水动力'},
+    {label:'二维水动力'},
+    {label:'机器学习'},
+]
+let tableData = ref([{name:'1'}])
+const heightAll = window.innerHeight
+const valueHelpSel = '';
+const tableheight = window.innerHeight*0.8
+const optionsType = [
+  {
+    value: '1',
+    label: '水利专业模型',
+  },
+  {
+    value: '2',
+    label: '排水专业模型',
+  },
+  {
+    value: '3',
+    label: '供水专业模型',
+  },
+  {
+    value: '4',
+    label: '海洋专业模型',
+  },
+]
+const optionsEnv = ref([
+  {
+    value: 'windwos',
+    label: 'windwos',
+  },
+  {
+    value: 'Linux',
+    label: 'Linux',
+  },
+  {
+    value: 'Ubuntu',
+    label: 'Ubuntu',
+  },
+  {
+    value: 'CentOS',
+    label: 'CentOS',
+  },
+  {
+    value: 'Debian',
+    label: 'Debian',
+  },
+  {
+    value: 'RedHat',
+    label: 'RedHat',
+  },
+  {
+    value: '统信',
+    label: '统信',
+  },
+  {
+    value: '麒麟',
+    label: '麒麟',
+  },
+  {
+    value: '欧拉',
+    label: '欧拉',
+  },
+])
+const uploadRef = ref(null);
+const fileList = ref([]);
+const fileList1 = ref([]);
+const tableDataCanAll = ref([]);
+const parForm = ref('')
+const currentNodeKey = ref('')
+const parTree = ref({})
+onMounted(() => {
+  getModelListTable()
+  // addNewModel()
+});
+
+const handleChange = (file, files) => {
+  fileList.value = files;
+};
+const handleChange1 = (file, files) => {
+  fileList1.value = files;
+};
+function getChineseInitials(str) {
+    if (!str || typeof str !== 'string') return '';
+    
+    // 拆分字符串为字符数组
+    const chars = str.split('');
+    const result = chars.map(char => {
+        // 判断是否为中文(Unicode范围:\u4e00-\u9fa5)
+        if (/[\u4e00-\u9fa5]/.test(char)) {
+            // 获取中文首字母拼音(忽略多音字)
+            const pinyinArr = pinyin(char, {
+                style: pinyin.STYLE_FIRST_LETTER,
+                heteronym: false
+            });
+            return pinyinArr[0][0]; // 返回首字母
+        }
+        return char; // 非中文字符直接保留(若需忽略英文可改为空字符串)
+    });
+    return result.join('');
+}
+function shenhe(row){
+  var par = {
+    srvIds:row.mdid,
+    audit:'2',
+    devkind:'SYS'
+  }
+  changeShenhe(par).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("已可测试!");
+    }
+  })
+}
+function handleBlur(){
+  formTree.value.parGroupCode = getChineseInitials(formTree.value.parGroupName)
+}
+function gatherTable(){
+  if(checked1.value===false){
+    var keyArray = []
+    tableDataCanAll.value.forEach(item=>{
+      keyArray.push(item.key)
+    })
+    tableDataCanAll.value.forEach(item=>{
+      tableDataCan.value.forEach(item2=>{
+        if(item2.key===item.key){
+          item = item2
+        }
+      })
+    })
+    tableDataCan.value.forEach(item=>{
+      if(!keyArray.includes(item.key)){
+        tableDataCanAll.value.push(item)
+      }
+    })
+    currentNodeKey.value = null
+    selFen.value = true
+    tableDataCan.value = tableDataCanAll.value
+  }
+}
+function handleNodeClick(node, data){
+    var keyArray = []
+    selFen.value = false
+    tableDataCanAll.value.forEach(item=>{
+      keyArray.push(item.key)
+    })
+    tableDataCanAll.value.forEach(item=>{
+      tableDataCan.value.forEach(item2=>{
+        if(item2.key===item.key){
+          item = item2
+        }
+      })
+    })
+    tableDataCan.value.forEach(item=>{
+      if(!keyArray.includes(item.key)){
+        tableDataCanAll.value.push(item)
+      }
+    })
+    parTree.value = data.data
+    tableDataCan.value = []
+    tableDataCanAll.value.forEach(item=>{
+      if(item.parGroup==data.data.parGroupCode){
+        tableDataCan.value.push(item)
+      }
+    })
+    currentNodeKey.value = data.data.mgid
+}
+function submitFen(){
+  formTree.value.mdid = parForm.value.mdid
+  console.log(isaddFen.value)
+  if(isaddFen.value===true){
+    addGroup(formTree.value).then(res=>{
+      if(res.code===200){
+        var par = {
+          mdid:parForm.value.mdid
+        }
+        getModelParList(par).then(res1=>{
+          proxy.$modal.msgSuccess("新增成功");
+          groupTreeData.value = res1.data
+          groupTreeData.value.forEach((item, index, array) => { 
+          item.label = item.parGroupName
+          item.value = item.parGroupCode
+          dialogVisibleFen.value = false
+        })
+      })
+      }
+    })
+  }
+  else{
+    editGroup(formTree.value).then(res=>{
+      if(res.code===200){
+        var par = {
+          mdid:parForm.value.mdid
+        }
+        getModelParList(par).then(res1=>{
+          proxy.$modal.msgSuccess("修改成功");
+          groupTreeData.value = res1.data
+          groupTreeData.value.forEach((item, index, array) => { 
+          item.label = item.parGroupName
+          item.value = item.parGroupCode
+          dialogVisibleFen.value = false
+        })
+      })
+      }
+    })
+  }
+  
+}
+function showEditFen(){
+  isaddFen.value = false
+  dialogVisibleFen.value = true
+  formTree.value = parTree.value
+}
+function showAddFenzu(){
+  isaddFen.value = true
+  dialogVisibleFen.value = true
+}
+function delFenZu(){
+  proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
+    return delFen(parTree.value.mgid);
+  }).then(() => {
+    var par = {
+      mdid:parForm.value.mdid
+    }
+    getModelParList(par).then(res1=>{
+        groupTreeData.value = res1.data
+        groupTreeData.value.forEach((item, index, array) => { 
+        item.label = item.parGroupName
+        item.value = item.parGroupCode
+        dialogVisibleFen.value = false
+      })
+    })
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+function delAllCan(){
+  proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
+    return delAllPar(parForm.value.mdid);
+  }).then(() => {
+    tableDataCan.value = []
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+function saveChangePar(){
+  tableDataCanAll.value.forEach((item, index, array) => { 
+      item.mdid = parForm.value.mdid
+      item.parCate = 'int'
+  })
+  changePar(tableDataCanAll.value).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("修改成功");
+      dialogVisiblePei.value = false
+      getModelListTable()
+    }
+  })
+}
+async function showPei(row){
+  dialogVisiblePei.value = true
+  parRow.value = row
+  var par = {
+    mdid:row.mdid
+  }
+  await getModelParList(par).then(res=>{
+    groupTreeData.value = res.data
+    groupTreeData.value.forEach((item, index, array) => { 
+      item.label = item.parGroupName
+      item.value = item.parGroupCode
+    })
+  })
+  await getModelDetail(row.mdid).then(res=>{
+    parForm.value = res.data
+    formJi.value = res.data
+  })
+  
+  await getParamsList(par).then(res=>{
+    tableDataCan.value = res.data
+    tableDataCan.value.forEach(item=>{
+      item.key = Math.random()
+    })
+  }) 
+  tableDataCanAll.value = JSON.parse(JSON.stringify(tableDataCan.value))
+}
+function delCan(index,row){
+  tableDataCan.value.splice(index, 1)
+  tableDataCanAll.value.forEach((item,index,array)=>{
+    if(item.key===row.key){
+      array.splice(index,1)
+    }
+  })
+}
+function showDe(row){
+  dialogVisibleDe.value = true
+  getModelDetail(row.mdid).then(res=>{
+    parForm.value = res.data
+    formJi.value = res.data
+    if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
+      isElse.value = true
+      formJi.value.devlang = 1
+    }
+  })
+}
+function addCan(){
+  tableDataCan.value.push({
+    key:Math.random(),
+    mdid:parForm.value.mdid,
+    parGroup:parTree.value.parGroupCode
+  })
+  console.log(tableDataCan.value)
+}
+function downOut(){
+  var url = window.location.host + formJi.value.mdOutFile
+  console.log(url)
+  const link = document.createElement('a');
+  link.href = 'http://' + url.toString();
+  link.download = formJi.value.mdOutName; // 自定义文件名(可选)
+  document.body.appendChild(link);
+  link.click();
+  document.body.removeChild(link);
+}
+function downIn(){
+  var url = window.location.host + formJi.value.mdInFile
+  console.log(url)
+  const link = document.createElement('a');
+  link.href = 'http://' + url.toString();
+  link.download = formJi.value.mdInName; // 自定义文件名(可选)
+  document.body.appendChild(link);
+  link.click();
+  document.body.removeChild(link);
+}
+function delModel(row){
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    return delMdid(row.mdid);
+  }).then(() => {
+    getModelListTable();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+async function showEdit(row){
+  dialogVisible.value = true
+  isEdit.value = true
+  await nextTick()
+  getModelDetail(row.mdid).then(res=>{
+    formJi.value = res.data
+    if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
+      console.log(formJi.value.devlang)
+      isElse.value = true
+      formJi.value.devlang = '1'
+    }
+  })
+}
+async function subEdit(){
+  if(fileList.value.length>0&&fileList1.value.length===0){
+    await proxy.$refs["uploadRef"].submit();
+  }
+  else if(fileList.value.length>0&&fileList.value.length===0){
+    await proxy.$refs["uploadRef1"].submit();
+  }
+  else if(fileList.value.length>0&&fileList.value.length>0){
+    await proxy.$refs["uploadRef1"].submit();
+    await proxy.$refs["uploadRef"].submit();
+  }
+  else{
+    await formRefJi.value.validate((valid) => {
+      if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+          delete formJi.value.msort
+          formJi.value.devkind = 'SYS'
+          updateModel(formJi.value).then(res=>{
+          if(res.code===200){
+            proxy.$modal.msgSuccess("修改成功");
+            dialogVisible.value = false
+            getModelListTable()
+          }
+        })
+      }
+    });
+  }
+}
+async function submit(){
+  formRefJi.value.validate((valid) => {
+    console.log(formJi.value,valid)
+    if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+        delete formJi.value.msort
+        formJi.value.devkind = 'SYS'
+        formJi.value.cateid = 'eec8aee5-d859-4b44-b0a1-56a22e0c29bb'
+        addModel(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("新增成功");
+          dialogVisible.value = false
+          getModelListTable()
+        }
+      })
+    }
+  })
+}
+async function handleFileSuccess1(response, file, fileList){
+  formJi.value.mdOutFile = response.originalFilename
+  formJi.value.mdOutName = response.fileName
+  await formRefJi.value.validate((valid) => {
+    if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+        delete formJi.value.msort
+        formJi.value.devkind = 'SYS'
+        updateModel(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("修改成功");
+          dialogVisible.value = false
+          getModelListTable()
+        }
+      })
+    }
+  });
+};
+async function handleFileSuccess(response, file, fileList){
+  formJi.value.mdInFile = response.originalFilename
+  formJi.value.mdInName = response.fileName
+  await formRefJi.value.validate((valid) => {
+    if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+        delete formJi.value.msort
+        formJi.value.devkind = 'SYS'
+        updateModel(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("修改成功");
+          dialogVisible.value = false
+          getModelListTable()
+        }
+      })
+    }
+  });
+};
+function clearFromTree(){
+  formTree.value = {}
+}
+function clearForm(){
+  tableDataCan.value = []
+  activeName.value = 'first'
+  fileList.value = []
+  fileList1.value = []
+  formJi.value = {
+    name:'',
+    version:'',
+    enname:'',
+    devlang:'',
+    intro:'',
+    type:'',
+    mdContact:'',
+    mdUnit:'',
+    devUnit:'',
+    devContact:'',
+    deployDir:'',
+    deployIp:'',
+    deployPort:'',
+    mirrorImageUrl:'',
+    mdRunCmd:'',
+    envOs:'',
+    envDisk:'',
+    envGpuMem:'',
+    evnArmX86:'',
+    envCpuNum:'',
+    envGpuType:'',
+    envGpuNum:'',
+    envMem:'',
+    mdInNote:'',
+    mdOutNote:''
+  }
+}
+function reg(){
+  isEdit.value = false
+  dialogVisible.value = true
+}
+function getModelListTable(){
+  tableData.value = [] 
+  var par = {
+    pageNum:1,
+    pageSize:20,
+    name:name.value,
+    mdUnit:mdUnit.value,
+    devkind:'SYS'
+  }
+  getModelList(par).then(res=>{
+    tableData.value = res.rows
+    totalComReg.value = res.total
+    console.log(tableData)
+  })
+}
+const seledMo = ['primary','plain','plain','plain','plain','plain','plain']
+
+</script>
+<style scoped>
+:deep(.treeLeft) .el-tree-node__content {
+  display: flex !important;
+  height: 28px;                  /* 按设计稿调整高度 */
+  align-items: center;
+  padding-top: 0 !important;
+}
+:deep(.treeLeft) .el-tree-node__content:hover {
+  background-color: #e9e9eb;
+}
+:deep(.treeLeft) .el-tree-node__content:active {
+    background-color: rgka(69,157,255,0.1) !important;
+  }
+
+  /* 选中态(Active) */
+:deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
+    background-color: #c6e2ff !important;
+  }
+
+.tabs-wrapper {
+  position: relative; /* 确保内容层在伪元素上方 */
+  z-index: 1; /* 关键:高于背景图 */
+}
+
+.tabs-wrapper :deep(.el-tabs),
+.tabs-wrapper :deep(.el-tabs__content) {
+  background-color: red !important; 
+}
+:deep(.el-tabs){
+  background-color: transparent !important;
+}
+:deep(.el-tabs__content){
+  background-color: transparent !important; 
+}
+:deep(.custom-dialog-bg) {
+  z-index: 1000;
+  background-image: url('@/assets/images/backDia.jpg') !important; 
+  background-position-x: left;
+  background-position-y: bottom;
+  background-size: initial;
+  background-repeat: repeat-x;
+  background-attachment: initial;
+  background-origin: initial;
+  background-clip: initial;
+  background-color: rgb(255, 255, 255);
+}
+:deep(.custom-dialog-bg .el-dialog__header) {
+  
+}
+:deep(.custom-dialog-bg .el-dialog__body) {
+  
+  color: #ecf0f1 !important; ; /* 内容文字颜色 */
+}
+/* 横向排列单选框标签和输入框 */
+.custom-input-wrapper {
+  display: flex;
+  align-items: center;
+  gap: 10px; /* 调整间距 */
+}
+
+/* 输入框仅显示底部横线 */
+.underline-input :deep(.el-input__wrapper) {
+  padding: 0;
+  box-shadow: none !important;
+  border-bottom: 1px solid #dcdfe6; /* 横线颜色 */
+  border-radius: 0;
+  background: transparent;
+}
+.underline-input :deep(.el-input__inner) {
+  height: 24px;
+  padding: 0 5px;
+}
+:deep(.el-table__body tr:hover > td) {
+  background-color: #eaf7ff !important;
+}
+.drag-handle {
+  cursor: move;
+}
+
+.ghost {
+  opacity: 0.5;
+  background: #c8ebfb;
+}
+
+/* 防止文字选中 */
+:deep(.el-table__row) {
+  user-select: none;
+  -webkit-user-select: none;
+}
+</style>
+<style scoped lang="scss">
+
+
+.el-table .el-table__row td {
+  height: 60px !important; /* 行高 */
+}
+.custom-tree-node {
+  display: flex;       /* 启用 Flex 布局 */
+  align-items: center; /* 垂直居中 */
+  gap: 8px;            /* 图标与文字间距 */
+}
+:deep(.svg-icon) {
+  outline: none;
+}
+:deep(.svg-icon svg) {
+  stroke: none;
+}
+</style>

+ 1415 - 0
ruoyi-ui/src/views/register/componentReg/peizhi.vue

@@ -0,0 +1,1415 @@
+<template>
+  <div style="width: 100%;padding-top: 1%;" :style="{'height':heightAll+'px'}">
+    <div style="display: flex;width: 100%;margin-left: 1%;justify-content: space-between;">
+      <div style="display: flex;width: 35%;">
+        <div style="display: flex;width: 100%;align-items: center;">
+            <div>
+                模型名称:
+            </div>
+            <el-input v-model="name" style="width:50%;margin-left: 1%;" placeholder="" />
+        </div>
+        <div style="display: flex;width: 100%;align-items: center;margin-left:-15%;">
+            <div>
+                模型归属单位:
+            </div>
+            <el-input v-model="mdUnit" style="width: 50%;margin-left: 1%;" placeholder="" />
+        </div>
+        <el-button type="primary" style="margin-left: -10%;" @click="getModelListTable" :icon="Search">查询</el-button>
+      </div>
+        <div style="display: flex;align-items: center;margin-right: 3%;">
+            
+            <el-button type="primary" style="margin-left:5%;" @click="reg" icon="Plus">注册</el-button>
+        </div>
+    </div>
+    <div style="margin-top: 0%;margin-left: 0%;width: 100%;">
+        <el-table 
+        :data="tableData" 
+        style="width: 98%;margin-left: 1%;margin-top: 0.5%;"
+        :cell-style="{ padding:'5px' }"
+        :header-cell-style="{height: heightAll*0.01+'px',}"
+        :row-style="{ fontSize: '16px',textAlign:'center'}"
+        border >
+        <el-table-column type="index" label="序号" width="80">
+          <template #default="{ $index }">
+            <div style="text-align: center;">
+              {{ $index + 1 }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="模型名称">
+        </el-table-column>
+        <el-table-column prop="enname" label="英文名称">
+        </el-table-column>
+        <el-table-column prop="type" label="模型类型" width="160"/>
+        <el-table-column prop="mdUnit" label="模型单位" width="200"/>
+        <el-table-column prop="mdContact" label="联系方式" width="100"/>
+        <el-table-column prop="status" label="模型状态" width="140">
+        </el-table-column>
+        <el-table-column prop="modifyBy" label="发布时间" width="170"/>
+        <el-table-column prop="version" label="版本" width="120"/>
+        <<el-table-column prop="address" label="操作" width="100">
+            <template #default="scope">
+                <div style="display: flex;justify-content: space-between;width: 100%;">
+                    <!-- <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left: 0%;">编辑</el-button> -->
+                    <!-- <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button> -->
+                    <!-- <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: -5%;">查看</el-button> -->
+                    <el-button @click="showPei(scope.row)" type="warning" text size="mini" style="margin-left:0%;">配置</el-button>
+                    <!-- <el-button type="danger" @click="delModel(scope.row)" text size="mini" style="margin-left: -5%;">删除</el-button>
+                    <el-button type="danger" @click="shenhe(scope.row)" text size="mini" style="margin-left: -5%;">审核</el-button> -->
+                </div>
+            </template>
+        </el-table-column>
+      </el-table>
+        <el-dialog v-model="dialogVisible" title="" width="60%" @close="clearForm" destroy-on-close>
+                <div class="card-header">
+                  <span style="font-size: 20px;margin-left: 1%;">基本信息</span>
+                  <el-divider style="margin-top: 1%;"/>
+                </div>
+              <div>
+                <el-form  size="mini"  style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
+                  <el-row :gutter="40">
+                        <el-col :span="8">
+                          <el-form-item label="模型名称:" prop="name" style="">
+                              <div style="display: flex;width: 120%;justify-content: space-between;">
+                                <el-input  v-model="formJi.name" style="width: 100%;"/>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="英文名:" prop="enname" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.enname" style="width: 100%;"/>
+                            </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="6">
+                          <el-form-item label="版本号:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.version" style="width: 100%;"/>
+                            </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                  <el-row :gutter="48">
+                    <el-col :span="8">
+                      <el-form-item label="模型类型:" prop="" style="">
+                        <div style="display: flex;width: 100%;justify-content: space-between;">
+                          <el-input placeholder="如水利模型、排水模型、供水模型、海洋模型" v-model="formJi.type" style="width: 100%;" resize="none"/>
+                        </div>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                  <el-form-item label="排序:" prop="" style="">
+                      <div style="display: flex;width: 100%;justify-content: space-between;">
+                        <el-input-number v-model="formJi.sort" :min="1" style="width: 22%;"/>
+                      </div>
+                  </el-form-item>
+                  <el-row :gutter="48">
+                    <el-col :span="24">
+                      <el-form-item label="开发语言:">
+                          <el-radio-group v-model="formJi.devlang" class="custom-radio-group" style="width: 100%;">
+                            <el-radio label="java" size="large">java</el-radio>
+                            <el-radio label="nodeJs" size="large">nodeJs</el-radio>
+                            <el-radio label="python" size="large">python</el-radio>
+                            <el-radio label="c/c++" size="large">c/c++</el-radio>
+                            <el-radio label="1" size="large">
+                              <div class="custom-input-wrapper">
+                                <span>其它</span>
+                                <el-input 
+                                  v-model="elseLan"
+                                  class="underline-input"
+                                  v-show="isElse"
+                                />
+                              </div>
+                            </el-radio>
+                            </el-radio-group>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                  <el-row :gutter="48">
+                        <el-col :span="16">
+                          <el-form-item label="简介:">
+                              <el-input  v-model="formJi.intro" style="width: 100%;" :rows="3" resize="none" type="textarea"/>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                </el-form>
+              </div>
+            
+              <div class="card-header">
+                <span style="font-size: 20px;margin-left: 1%;">单位</span>
+                <el-divider style="margin-top: 1%;"/>
+              </div>
+            <div style="margin-top: 0%;">
+              <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right"  label-width="120px" :rules="rulesJi">
+                <el-row :gutter="48">
+                      <el-col :span="11">
+                        <el-form-item label="模型归属单位:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.mdUnit" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="11">
+                        <el-form-item label="联系方式:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.mdContact" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="11">
+                        <el-form-item label="技术支持单位:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.devUnit" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="11">
+                        <el-form-item label="联系方式:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.devContact" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+              </el-form>
+            </div>
+            <el-tabs
+            v-model="activeName"
+            type="card"
+            style="margin-top: 1%;"
+          >
+            <el-tab-pane label="部署情况" name="first">
+              <el-form size="mini" :key="tableKey" style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right" label-width="120px"   :rules="rulesJi">
+                <el-row :gutter="48">
+                      <el-col :span="11">
+                        <el-form-item label="服务器IP:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input   v-model="formJi.deployIp" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="11">
+                        <el-form-item label="端口:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input placeholder="可填写多个端口,以“,”分隔"  v-model="formJi.deployPort" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="15">
+                        <el-form-item label="部署位置:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                              <el-input  v-model="formJi.deployDir" style="width: 100%;"/>
+                            </div>
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="10">
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="15">
+                        <el-form-item label="服务访问地址:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.mirrorImageUrl" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+                <el-row :gutter="48">
+                      <el-col :span="15">
+                        <el-form-item label="服务器运行命令:" prop="" style="">
+                          <div style="display: flex;width: 100%;justify-content: space-between;">
+                            <el-input  v-model="formJi.mdRunCmd" style="width: 100%;"/>
+                          </div>
+                        </el-form-item>
+                      </el-col>
+                </el-row>
+              </el-form>
+              <div style="display: flex;margin-top: -5%;">
+                <div class="card-header" style="margin-top: 5%;display: flex;justify-content: inherit;margin-left: 2%">
+                  <span style="font-size: 20px;margin-top: 5%; writing-mode: vertical-rl;position: relative;top: 15%;">运行环境</span>
+                </div>
+                <el-form size="mini" :key="tableKey" style="margin-top: 5%;width: 85%;"  :model="formJi" label-position="right" label-width="120px"   :rules="rulesJi">
+                  <el-row :gutter="48">
+                        <el-col :span="12">
+                          <el-form-item label="操作系统:" prop="" style="">
+                              <div style="display: flex;width: 100%;justify-content: space-between;">
+                                <el-select
+                                v-model="formJi.envOs"
+                                
+                                    style="width: 75%;margin-left: 0%;"
+                                >
+                                    <el-option
+                                    v-for="item in optionsEnv"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value"
+                                    />
+                                </el-select>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                          <el-form-item label="运行架构:" prop="" style="">
+                            <div style="display: flex;width: 100%;justify-content: space-between;">
+                               <el-radio-group v-model="formJi.evnArmX86" class="ml-4" size="small" style="" >
+                                    <el-radio label="X86" size="large">X86</el-radio>
+                                    <el-radio label="ARM" size="large">ARM</el-radio>
+                                </el-radio-group>
+                            </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                  <el-row :gutter="24">
+                        <el-col :span="8">
+                          <el-form-item label="硬盘:" prop="" style="">
+                              <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envDisk"
+                                  :min="100"
+                                  :max="2048"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  G
+                                </div>
+                              </div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="CPU核数:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envCpuNum"
+                                  :max="64"
+                                  :min="2"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  个
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="内存:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envMem"
+                                  :max="512"
+                                  :min="1"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  G
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                  <el-row :gutter="24">
+                        <el-col :span="8">
+                          <el-form-item label="GPU型号:" prop="" style="">
+                              <div style="display: flex;width: 100%;">
+                                <el-input   v-model="formJi.envGpuType" style="width: 100%;"/>
+                              </div>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="GPU数量:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                               <el-input-number
+                                  v-model="formJi.envGpuNum"
+                                  :min="1"
+                                  :max="64"
+                                  size="mini"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  个
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                          <el-form-item label="GUP显存:" prop="" style="">
+                            <div style="display: flex;width: 100%;" >
+                                <el-input-number
+                                  v-model="formJi.envGpuMem"
+                                  :min="1"
+                                  size="mini"
+                                  :max="512"
+                                  controls-position="right"
+                                  @change="handleChange"
+                                />
+                                <div style="margin-left: 4%;font-size: 15px;">
+                                  G
+                                </div>
+                              </div>
+                          </el-form-item>
+                        </el-col>
+                  </el-row>
+                </el-form>
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="输入" name="second">
+              <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">
+                <el-form-item label="输入文档:" prop="">
+                    <div style="width: 75%;">
+                      <el-upload
+                          ref="uploadRef"
+                          :limit="1"
+                          accept=".xlsx, .xls"
+                          :headers="upload.headers"
+                          :on-change="handleChange"
+                          :file-list="fileList"
+                          :action="upload.url + '?file=' + upload.updateSupport"
+                          :on-progress="handleFileUploadProgress"
+                          :on-success="handleFileSuccess"
+                          :auto-upload="false"
+                          drag
+                      >
+                          <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                      </el-upload>
+                    </div>
+                    <div style="color: #b1b3b8;width: 100%;">
+                      注:请上传后缀名为.docx .pdf .txt的文件
+                    </div>
+                    <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
+                  </el-form-item>
+                  <el-form-item label="说明:" prop="" style="margin-left: -1%;">
+                    <el-input v-model="formJi.mdInNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
+                  </el-form-item>
+                </el-form>
+            </el-tab-pane>
+            <el-tab-pane label="输出" name="third">
+              <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">
+                <el-form-item label="输出文档:" prop="">
+                    <div style="width: 75%;">
+                      <el-upload
+                          ref="uploadRef1"
+                          :limit="1"
+                          accept=".xlsx, .xls"
+                          :headers="upload.headers"
+                          :on-change="handleChange1"
+                          :file-list="fileList1"
+                          :action="upload.url + '?file=' + upload.updateSupport"
+                          :on-progress="handleFileUploadProgress"
+                          :on-success="handleFileSuccess1"
+                          :auto-upload="false"
+                          drag
+                      >
+                          <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                      </el-upload>
+                    </div>
+                    <div style="color: #b1b3b8;width: 100%;">
+                      注:请上传后缀名为.docx .pdf .txt的文件
+                    </div>
+                    <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
+                  </el-form-item>
+                  <el-form-item label="说明:" prop="" style="margin-left: -1%;">
+                    <el-input v-model="formJi.mdOutNote" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
+                  </el-form-item>
+                </el-form>
+            </el-tab-pane>
+          </el-tabs>
+            <template #footer>
+            <span class="dialog-footer">
+                <el-button @click="dialogVisible = false">取消</el-button>
+                <el-button type="primary" @click="submit" v-if="!isEdit">
+                  提交
+                </el-button>
+                <el-button type="primary" @click="subEdit" v-if="isEdit">
+                  提交
+                </el-button>
+            </span>
+            </template>
+        </el-dialog>
+        <el-dialog  v-model="dialogVisibleDe" title="" width="50%" @close="" destroy-on-close class="custom-dialog-bg">
+          <el-descriptions title="基本信息" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
+            <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
+            <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
+            <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
+            <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
+            <el-descriptions-item label="开发语言:"  span="2">{{formJi.devlang}}</el-descriptions-item>
+            <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
+          </el-descriptions>
+          <el-divider style="margin-top: 0%;"/>
+          <el-descriptions title="单位" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
+            <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
+            <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
+            <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
+            <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
+          </el-descriptions>
+          <el-tabs
+            v-model="activeName"
+            type="card"
+            style="margin-top: 1%;background-color: transparent;"
+          >
+            <el-tab-pane label="部署情况" name="first" style="background-color: transparent;">
+              <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background-color: transparent;">
+                <el-descriptions-item label="服务器IP:" span="2">{{formJi.deployIp}}</el-descriptions-item>
+                <el-descriptions-item label="端口:">{{formJi.deployPort}}</el-descriptions-item>
+                <el-descriptions-item label="部署位置:" span="2">{{formJi.deployDir}}</el-descriptions-item>
+                <el-descriptions-item label="服务访问地址:">{{formJi.mirrorImageUrl}}</el-descriptions-item>
+                <el-descriptions-item label="服务器运行命令:" span="3">{{formJi.mdRunCmd}}</el-descriptions-item>
+                <el-descriptions-item label="操作系统:" span="2">{{formJi.envOs}}</el-descriptions-item>
+                <el-descriptions-item label="运行架构:" span="3">{{formJi.evnArmX86}}</el-descriptions-item>
+                <el-descriptions-item label="硬盘:" span="">
+                  {{formJi.envDisk + 'G'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="CPU核心数:">
+                  {{formJi.envCpuNum + '个'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="内存:">
+                  {{formJi.envMem + 'G'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="GPU型号:">{{formJi.envGpuType}}</el-descriptions-item>
+                <el-descriptions-item label="GPU数量:">
+                  {{formJi.envGpuNum + '个'}}
+                </el-descriptions-item>
+                <el-descriptions-item label="GUP显存:">
+                  {{formJi.envGpuMem + 'G'}}
+                </el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+            <el-tab-pane label="输入" name="second">
+              <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
+                <el-descriptions-item label="输入文档:" span="2">
+                  <el-link type="primary"  @click="downIn">{{formJi.mdInName}}</el-link>
+                </el-descriptions-item>
+                <el-descriptions-item label="说明:">{{formJi.mdInNote}}</el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+            <el-tab-pane label="输出" name="third">
+              <el-descriptions title="" :column="2" style="margin-top: 0%;margin-left: 1%;">
+                <el-descriptions-item label="输出文档:" span="2">
+                  <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
+                </el-descriptions-item>
+                <el-descriptions-item label="说明:">{{formJi.mdOutNote}}</el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+          </el-tabs>
+        </el-dialog>
+        <el-dialog  @close="clearForm" v-model="dialogVisiblePei" width="70%" title="参数配置">
+          <el-tabs v-model="activeName" type="border-card">
+            <el-tab-pane label="基本信息" name="first">
+              <el-descriptions title="" :column="3" style="margin-top: 0%;margin-left: 1%;background: transparent;">
+                <el-descriptions-item label="模型名称:">{{formJi.name}}</el-descriptions-item>
+                <el-descriptions-item label="英文名:">{{formJi.enname}}</el-descriptions-item>
+                <el-descriptions-item label="版本号:">{{formJi.version}}</el-descriptions-item>
+                <el-descriptions-item label="接口分类:">{{formJi.type}}</el-descriptions-item>
+                <el-descriptions-item label="开发语言:"  span="2">{{formJi.devlang}}</el-descriptions-item>
+                <el-descriptions-item label="简介:" span="3">{{formJi.intro}}</el-descriptions-item>
+              </el-descriptions>
+              <el-divider style="margin-top: 0%;"/>
+              <el-descriptions title="" :column="2" style="margin-top: 1%;margin-left: 1%;background-color: transparent;">
+                <el-descriptions-item label="模型归属单位:">{{formJi.mdUnit}}</el-descriptions-item>
+                <el-descriptions-item label="联系方式:">{{formJi.mdContact}}</el-descriptions-item>
+                <el-descriptions-item label="技术支持单位:">{{formJi.devUnit}}</el-descriptions-item>
+                <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
+              </el-descriptions>
+            </el-tab-pane>
+            <el-tab-pane label="模型参数" style="height: 50vh;" :key="activeTabKey">
+              <div style="display: flex;justify-content: space-between;margin-right: 2%;align-items: center;background-color: #e9e9eb;;width: 100%;">
+                <div style="display: flex;align-items: center;margin-left: 1%;">
+                  <el-checkbox v-model="checked1" label="参数是否分组" size="large"  @change="gatherTable"/>
+                  <el-button  @click="showAddFenzu" style="margin-left: 10%;" type="success" size="mini" plain v-if="checked1">新增分组</el-button>
+                </div>
+                <div style="display: flex;justify-content: flex-end;margin-right: 1%;">
+                  <el-button  @click="addCan" style="margin-left: 5%;" type="success" size="mini" plain :disabled="selFen">新增参数</el-button>
+                  <el-button  @click="delAllCan" style="margin-top: 0%;" type="danger" size="mini" plain>删除</el-button>
+                </div>
+              </div>
+              <div style="display: flex;">
+                <div v-if="checked1" style="margin-top:1%;width: 10%;background-color: #F2F6FC;height:45vh;">
+                  <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft" 
+                    :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">
+                        <template #default="{ node, data }">
+                          <span  style="justify-content: space-between;display: flex;width: 100%;align-items: center;margin-left: -10%;">
+                            <div class="custom-tree-node" style="align-items: center;line-height: 1.5;">
+                              <span style="">{{ node.label }}</span>
+                            </div>
+                            <div style="margin-right: 1%;position: absolute;left:78%;">
+                              <el-dropdown trigger="hover" @click.stop v-if="currentNodeKey === data.mgid">
+                                  <el-icon><MoreFilled /></el-icon>
+                                  <!-- <svg-icon icon-class="zhankai"/> -->
+                                <template #dropdown>
+                                  <el-dropdown-menu>
+                                    <el-dropdown-item style="display: flex;"  @click="showEditFen">
+                                      <el-icon class="el-icon--right" style="color: black;">
+                                        <Connection />
+                                      </el-icon>
+                                      <div>
+                                        编辑分组
+                                      </div>
+                                    </el-dropdown-item>
+                                    <divider/>
+                                    <el-dropdown-item style="display: flex;"  @click="delFenZu" divided>
+                                      <el-icon class="el-icon--right" style="color: black;">
+                                        <CircleClose />
+                                      </el-icon>
+                                      <div>
+                                        删除分组
+                                      </div>
+                                    </el-dropdown-item>
+                                  </el-dropdown-menu>
+                                </template>
+                              </el-dropdown>
+                            </div>
+                          </span>
+                        </template>
+                      </el-tree>
+                </div>
+                <div style="width: 90%;flex: 1;">
+                  <el-table 
+                style="margin-top: 1%;width: 100%;margin-left: 1%;overflow: auto;"
+                :data="tableDataCan" 
+                :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
+                :header-cell-style="{ textAlign: 'center', }"
+                max-height="45vh"
+                :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+                border>
+                    <el-table-column prop="parName" label="*参数英文名">
+                      <template #default="scope" style="width: 120%;">
+                          <el-input  v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parName" label="*参数名称">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parType" label="*参数类型" >
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parLine" label="行号">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parLine" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="维度">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parDimen" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="表达式">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parExpr" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="*默认值">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parDefVal" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="参数范围">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parRange" style="width: 120%;margin-left: -10%;"/>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="版本号">
+                      <template #default="scope">
+                          <el-input  v-model="scope.row.parVersion" style="width: 120%;margin-left: -10%;"/>
+                      </template> 
+                    </el-table-column>
+                    <el-table-column prop="parNote" label="操作" width="85">
+                      <template #default="scope">
+                          <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
+                      </template> 
+                    </el-table-column>
+                </el-table>
+                </div>
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="模型状态">Role</el-tab-pane>
+          </el-tabs>
+          <template #footer>
+          <span class="dialog-footer">
+              <el-button @click="dialogVisiblePei = false">取消</el-button>
+              <el-button type="primary" @click="saveChangePar">
+                提交
+              </el-button>
+          </span>
+          </template>
+        </el-dialog >
+        <el-dialog v-model="dialogVisibleFen" :title="titleFen" width="30%" @close="clearFromTree" destroy-on-close :key="tableKey">
+          <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">
+            <el-form-item label="名称:" prop="parGroupName" style="">
+              <el-input v-model="formTree.parGroupName" @blur="handleBlur" style="width: 75%;" placeholder=""  resize="none"/>
+            </el-form-item>
+            <el-form-item label="组编码:" prop="parGroupCode"  style="">
+              <el-input v-model="formTree.parGroupCode" style="width: 75%;" placeholder=""  resize="none"/>
+            </el-form-item>
+            <el-form-item label="说明:" prop="parGroupNote">
+              <el-input v-model="formTree.parGroupNote" style="width: 75%;" placeholder="" type="textarea"  resize="none"/>
+            </el-form-item>
+            <el-form-item label="排序:" prop="parGroupSort">
+              <el-input-number v-model="formTree.parGroupSort" :min="1" style="width: 50%;"/>
+            </el-form-item>
+          </el-form>
+          <template #footer>
+            <span class="dialog-footer">
+              <el-button size="mini" @click="dialogVisibleFen = false">取消</el-button>
+              <el-button type="primary" @click="submitFen" size="mini">
+                提交
+              </el-button>
+            </span>
+          </template>
+        </el-dialog>
+    </div>
+  </div>
+</template>
+<script   setup>
+import { getModelList,addModel,delMdid,getModelDetail,updateModel,addGroup,getParamsList,changePar,delAllPar,getModelParList,delFen,changeShenhe } from "@/api/register/regCom";
+import { ref, onMounted, onUnmounted, nextTick } from 'vue';
+import { Search } from '@element-plus/icons-vue'
+import {
+  ArrowLeft,
+  Plus
+} from '@element-plus/icons-vue'
+import { reactive } from 'vue'
+import { forwardRefProps } from 'element-plus/es/components/tooltip-v2/src/forward-ref.mjs';
+import { getToken } from "@/utils/auth";
+import { fa } from "element-plus/es/locales.mjs";
+import { column } from "element-plus/es/components/table-v2/src/common.mjs";
+import { TRUE } from "sass";
+import { editGroup } from "../../../api/register/regCom";
+import pinyin from 'pinyin';
+
+const { proxy } = getCurrentInstance();
+const dialogVisibleFen = ref(false)
+const dragTableRef = ref()
+const isaddFen = ref(false)
+const dialogVisible = ref(false)
+const dialogVisibleDe = ref(false)
+const dialogVisiblePei = ref(false)
+const active = ref(0)
+const isEdit = ref(true)
+const name = ref('')
+const isAdd = ref(true)
+const mdUnit = ref('')
+const isElse = ref(false)
+const elseLan = ref('')
+const tableDataCan = ref([])
+const selFen = ref(true)
+const groupTreeData = ref([])
+const parRow = ref({})
+const formJi = ref({
+  name:'',
+  version:'',
+  enname:'',
+  devlang:'',
+  intro:'',
+  type:'',
+  mdContact:'',
+  mdUnit:'',
+  devUnit:'',
+  devContact:'',
+  deployDir:'',
+  deployIp:'',
+  deployPort:'',
+  mirrorImageUrl:'',
+  mdRunCmd:'',
+  envOs:'',
+  envDisk:'',
+  envGpuMem:'11',
+  evnArmX86:'',
+  envCpuNum:'',
+  envGpuType:'',
+  envGpuNum:'2',
+  envMem:'',
+  mdInNote:'',
+  mdOutNote:''
+});
+const activeTabKey = ref(0)
+const rulesJi = reactive({
+  name: [{ required: true, message: '必填', trigger: 'blur' }],
+  enname: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefJi = ref();
+
+const formZu = ref({
+  mirrorImageEurl:'',
+  mdCPU:'',
+  mdGPU:''
+});
+const rulesZu = reactive({
+  mirrorImageEurl: [{ required: true, message: '必填', trigger: 'blur' }],
+  mdCPU: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefZu = ref();
+
+const formTree = ref({
+  parGroupSort:1,
+  parGroupNote:'',
+  parGroupName:'',
+  parGroupCode:''
+});
+const rulesTree = reactive({
+  parGroupName: [{ required: true, message: '必填', trigger: 'blur' }],
+  parGroupSort: [{ required: true, message: '必填', trigger: 'blur' }],
+  parGroupCode: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefTree = ref();
+const activeName = ref('first')
+const titleFen = ref('');
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: "",
+  // 是否禁用上传
+  isUploading: false,
+  // 是否更新已经存在的用户数据
+  updateSupport: '',
+  // 设置上传的请求头部
+  headers: { Authorization: "Bearer " + getToken() },
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + "/common/upload"
+});
+const downUrl = ref(import.meta.env.VITE_APP_BASE_API)
+const tableKey = ref(0);
+const totalComReg = ref()
+const currentPage = ref(1)
+const tableData2 = ref([ 
+  { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' }
+]);
+const tableData3 = ref([
+  { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'水库', date2:'', date3:'single', date4:'基于水文响应' },
+  { date1:'雨量站', date2:'', date3:'single', date4:'基于水文响应' }
+]);
+const checked1 = ref(false)
+const tableData1= [{date1:'初始状态',
+  date2:'sts',
+  date3:'数据项',
+  date4:'初始状态',
+  date5:'是',
+  date6:'否',
+  date7:'2023-09-08'
+}]
+const checkGroup = [
+    {label:'水文预报'},
+    {label:'维水动力'},
+    {label:'二维水动力'},
+    {label:'机器学习'},
+]
+let tableData = ref([{name:'1'}])
+const heightAll = window.innerHeight
+const valueHelpSel = '';
+const tableheight = window.innerHeight*0.8
+const optionsType = [
+  {
+    value: '1',
+    label: '水利专业模型',
+  },
+  {
+    value: '2',
+    label: '排水专业模型',
+  },
+  {
+    value: '3',
+    label: '供水专业模型',
+  },
+  {
+    value: '4',
+    label: '海洋专业模型',
+  },
+]
+const optionsEnv = ref([
+  {
+    value: 'windwos',
+    label: 'windwos',
+  },
+  {
+    value: 'Linux',
+    label: 'Linux',
+  },
+  {
+    value: 'Ubuntu',
+    label: 'Ubuntu',
+  },
+  {
+    value: 'CentOS',
+    label: 'CentOS',
+  },
+  {
+    value: 'Debian',
+    label: 'Debian',
+  },
+  {
+    value: 'RedHat',
+    label: 'RedHat',
+  },
+  {
+    value: '统信',
+    label: '统信',
+  },
+  {
+    value: '麒麟',
+    label: '麒麟',
+  },
+  {
+    value: '欧拉',
+    label: '欧拉',
+  },
+])
+const uploadRef = ref(null);
+const fileList = ref([]);
+const fileList1 = ref([]);
+const tableDataCanAll = ref([]);
+const parForm = ref('')
+const currentNodeKey = ref('')
+const parTree = ref({})
+onMounted(() => {
+  getModelListTable()
+  // addNewModel()
+});
+
+const handleChange = (file, files) => {
+  fileList.value = files;
+};
+const handleChange1 = (file, files) => {
+  fileList1.value = files;
+};
+function getChineseInitials(str) {
+    if (!str || typeof str !== 'string') return '';
+    
+    // 拆分字符串为字符数组
+    const chars = str.split('');
+    const result = chars.map(char => {
+        // 判断是否为中文(Unicode范围:\u4e00-\u9fa5)
+        if (/[\u4e00-\u9fa5]/.test(char)) {
+            // 获取中文首字母拼音(忽略多音字)
+            const pinyinArr = pinyin(char, {
+                style: pinyin.STYLE_FIRST_LETTER,
+                heteronym: false
+            });
+            return pinyinArr[0][0]; // 返回首字母
+        }
+        return char; // 非中文字符直接保留(若需忽略英文可改为空字符串)
+    });
+    return result.join('');
+}
+function handleBlur(){
+  formTree.value.parGroupCode = getChineseInitials(formTree.value.parGroupName)
+}
+function shenhe(row){
+  var par = {
+    srvIds:row.mdid,
+    audit:'2',
+    devkind:'APP'
+  }
+  changeShenhe(par).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("已可测试!");
+    }
+  })
+}
+function gatherTable(){
+  if(checked1.value===false){
+    var keyArray = []
+    tableDataCanAll.value.forEach(item=>{
+      keyArray.push(item.key)
+    })
+    tableDataCanAll.value.forEach(item=>{
+      tableDataCan.value.forEach(item2=>{
+        if(item2.key===item.key){
+          item = item2
+        }
+      })
+    })
+    tableDataCan.value.forEach(item=>{
+      if(!keyArray.includes(item.key)){
+        tableDataCanAll.value.push(item)
+      }
+    })
+    currentNodeKey.value = null
+    selFen.value = true
+    tableDataCan.value = tableDataCanAll.value
+  }
+}
+function handleNodeClick(node, data){
+    var keyArray = []
+    selFen.value = false
+    tableDataCanAll.value.forEach(item=>{
+      keyArray.push(item.key)
+    })
+    tableDataCanAll.value.forEach(item=>{
+      tableDataCan.value.forEach(item2=>{
+        if(item2.key===item.key){
+          item = item2
+        }
+      })
+    })
+    tableDataCan.value.forEach(item=>{
+      if(!keyArray.includes(item.key)){
+        tableDataCanAll.value.push(item)
+      }
+    })
+    parTree.value = data.data
+    tableDataCan.value = []
+    tableDataCanAll.value.forEach(item=>{
+      if(item.parGroup==data.data.parGroupCode){
+        tableDataCan.value.push(item)
+      }
+    })
+    currentNodeKey.value = data.data.mgid
+}
+function submitFen(){
+  formTree.value.mdid = parForm.value.mdid
+  console.log(isaddFen.value)
+  if(isaddFen.value===true){
+    addGroup(formTree.value).then(res=>{
+      if(res.code===200){
+        var par = {
+          mdid:parForm.value.mdid
+        }
+        getModelParList(par).then(res1=>{
+          proxy.$modal.msgSuccess("新增成功");
+          groupTreeData.value = res1.data
+          groupTreeData.value.forEach((item, index, array) => { 
+          item.label = item.parGroupName
+          item.value = item.parGroupCode
+          dialogVisibleFen.value = false
+        })
+      })
+      }
+    })
+  }
+  else{
+    editGroup(formTree.value).then(res=>{
+      if(res.code===200){
+        var par = {
+          mdid:parForm.value.mdid
+        }
+        getModelParList(par).then(res1=>{
+          proxy.$modal.msgSuccess("修改成功");
+          groupTreeData.value = res1.data
+          groupTreeData.value.forEach((item, index, array) => { 
+          item.label = item.parGroupName
+          item.value = item.parGroupCode
+          dialogVisibleFen.value = false
+        })
+      })
+      }
+    })
+  }
+  
+}
+function showEditFen(){
+  isaddFen.value = false
+  dialogVisibleFen.value = true
+  formTree.value = parTree.value
+}
+function showAddFenzu(){
+  isaddFen.value = true
+  dialogVisibleFen.value = true
+}
+function delFenZu(){
+  proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
+    return delFen(parTree.value.mgid);
+  }).then(() => {
+    var par = {
+      mdid:parForm.value.mdid
+    }
+    getModelParList(par).then(res1=>{
+        groupTreeData.value = res1.data
+        groupTreeData.value.forEach((item, index, array) => { 
+        item.label = item.parGroupName
+        item.value = item.parGroupCode
+        dialogVisibleFen.value = false
+      })
+    })
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+function delAllCan(){
+  proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
+    return delAllPar(parForm.value.mdid);
+  }).then(() => {
+    tableDataCan.value = []
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+function saveChangePar(){
+  tableDataCanAll.value.forEach((item, index, array) => { 
+      item.mdid = parForm.value.mdid
+      item.parCate = 'int'
+  })
+  changePar(tableDataCanAll.value).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("修改成功");
+      dialogVisiblePei.value = false
+      getModelListTable()
+    }
+  })
+}
+async function showPei(row){
+  dialogVisiblePei.value = true
+  parRow.value = row
+  var par = {
+    mdid:row.mdid
+  }
+  await getModelParList(par).then(res=>{
+    groupTreeData.value = res.data
+    groupTreeData.value.forEach((item, index, array) => { 
+      item.label = item.parGroupName
+      item.value = item.parGroupCode
+    })
+  })
+  await getModelDetail(row.mdid).then(res=>{
+    parForm.value = res.data
+    formJi.value = res.data
+  })
+  
+  await getParamsList(par).then(res=>{
+    tableDataCan.value = res.data
+    tableDataCan.value.forEach(item=>{
+      item.key = Math.random()
+    })
+  }) 
+  tableDataCanAll.value = JSON.parse(JSON.stringify(tableDataCan.value))
+}
+function delCan(index,row){
+  tableDataCan.value.splice(index, 1)
+  tableDataCanAll.value.forEach((item,index,array)=>{
+    if(item.key===row.key){
+      array.splice(index,1)
+    }
+  })
+}
+function showDe(row){
+  dialogVisibleDe.value = true
+  getModelDetail(row.mdid).then(res=>{
+    parForm.value = res.data
+    formJi.value = res.data
+    if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
+      isElse.value = true
+      formJi.value.devlang = 1
+    }
+  })
+}
+function addCan(){
+  tableDataCan.value.push({
+    key:Math.random(),
+    mdid:parForm.value.mdid,
+    parGroup:parTree.value.parGroupCode
+  })
+  console.log(tableDataCan.value)
+}
+function downOut(){
+  var url = window.location.host + formJi.value.mdOutFile
+  console.log(url)
+  const link = document.createElement('a');
+  link.href = 'http://' + url.toString();
+  link.download = formJi.value.mdOutName; // 自定义文件名(可选)
+  document.body.appendChild(link);
+  link.click();
+  document.body.removeChild(link);
+}
+function downIn(){
+  var url = window.location.host + formJi.value.mdInFile
+  console.log(url)
+  const link = document.createElement('a');
+  link.href = 'http://' + url.toString();
+  link.download = formJi.value.mdInName; // 自定义文件名(可选)
+  document.body.appendChild(link);
+  link.click();
+  document.body.removeChild(link);
+}
+function delModel(row){
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    return delMdid(row.mdid);
+  }).then(() => {
+    getModelListTable();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+async function showEdit(row){
+  dialogVisible.value = true
+  isEdit.value = true
+  await nextTick()
+  getModelDetail(row.mdid).then(res=>{
+    formJi.value = res.data
+    if(formJi.value.devlang!=='java'&&formJi.value.devlang!=='nodeJs'&&formJi.value.devlang!=='python'&&formJi.value.devlang!=='c/c++'){
+      console.log(formJi.value.devlang)
+      isElse.value = true
+      formJi.value.devlang = '1'
+    }
+  })
+}
+async function subEdit(){
+  if(fileList.value.length>0&&fileList1.value.length===0){
+    await proxy.$refs["uploadRef"].submit();
+  }
+  else if(fileList.value.length>0&&fileList.value.length===0){
+    await proxy.$refs["uploadRef1"].submit();
+  }
+  else if(fileList.value.length>0&&fileList.value.length>0){
+    await proxy.$refs["uploadRef1"].submit();
+    await proxy.$refs["uploadRef"].submit();
+  }
+  else{
+    await formRefJi.value.validate((valid) => {
+      if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+          delete formJi.value.msort
+          formJi.value.devkind = 'APP'
+          updateModel(formJi.value).then(res=>{
+          if(res.code===200){
+            proxy.$modal.msgSuccess("修改成功");
+            dialogVisible.value = false
+            getModelListTable()
+          }
+        })
+      }
+    });
+  }
+}
+async function submit(){
+  formRefJi.value.validate((valid) => {
+    console.log(formJi.value,valid)
+    if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+        delete formJi.value.msort 
+        formJi.value.devkind = 'APP'
+        formJi.value.cateid = '776eba74-eaeb-47ca-8436-e05ed87b68ec'
+        addModel(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("新增成功");
+          dialogVisible.value = false
+          getModelListTable()
+        }
+      })
+    }
+  })
+}
+async function handleFileSuccess1(response, file, fileList){
+  formJi.value.mdOutFile = response.originalFilename
+  formJi.value.mdOutName = response.fileName
+  await formRefJi.value.validate((valid) => {
+    if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+        delete formJi.value.msort
+        formJi.value.devkind = 'APP'
+        updateModel(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("修改成功");
+          dialogVisible.value = false
+          getModelListTable()
+        }
+      })
+    }
+  });
+};
+async function handleFileSuccess(response, file, fileList){
+  formJi.value.mdInFile = response.originalFilename
+  formJi.value.mdInName = response.fileName
+  await formRefJi.value.validate((valid) => {
+    if(valid){
+        if(formJi.value.devlang==='1'){
+          formJi.value.devlang = elseLan.value
+        }
+        delete formJi.value.msort
+        formJi.value.devkind = 'APP'
+        updateModel(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("修改成功");
+          dialogVisible.value = false
+          getModelListTable()
+        }
+      })
+    }
+  });
+};
+function clearFromTree(){
+  formTree.value = {}
+}
+function clearForm(){
+  tableDataCan.value = []
+  activeName.value = 'first'
+  fileList.value = []
+  fileList1.value = []
+  formJi.value = {
+    name:'',
+    version:'',
+    enname:'',
+    devlang:'',
+    intro:'',
+    type:'',
+    mdContact:'',
+    mdUnit:'',
+    devUnit:'',
+    devContact:'',
+    deployDir:'',
+    deployIp:'',
+    deployPort:'',
+    mirrorImageUrl:'',
+    mdRunCmd:'',
+    envOs:'',
+    envDisk:'',
+    envGpuMem:'',
+    evnArmX86:'',
+    envCpuNum:'',
+    envGpuType:'',
+    envGpuNum:'',
+    envMem:'',
+    mdInNote:'',
+    mdOutNote:''
+  }
+}
+function reg(){
+  isEdit.value = false
+  dialogVisible.value = true
+}
+function getModelListTable(){
+  tableData.value = []
+  var par = {
+    pageNum:1,
+    pageSize:20,
+    name:name.value,
+    mdUnit:mdUnit.value,
+    devkind:'APP'
+  }
+  getModelList(par).then(res=>{
+    tableData.value = res.rows
+    totalComReg.value = res.total
+    console.log(tableData)
+  })
+}
+const seledMo = ['primary','plain','plain','plain','plain','plain','plain']
+
+</script>
+<style scoped>
+:deep(.treeLeft) .el-tree-node__content {
+  display: flex !important;
+  height: 28px;                  /* 按设计稿调整高度 */
+  align-items: center;
+  padding-top: 0 !important;
+}
+:deep(.treeLeft) .el-tree-node__content:hover {
+  background-color: #e9e9eb;
+}
+:deep(.treeLeft) .el-tree-node__content:active {
+    background-color: rgka(69,157,255,0.1) !important;
+  }
+
+  /* 选中态(Active) */
+:deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
+    background-color: #c6e2ff !important;
+  }
+
+.tabs-wrapper {
+  position: relative; /* 确保内容层在伪元素上方 */
+  z-index: 1; /* 关键:高于背景图 */
+}
+
+.tabs-wrapper :deep(.el-tabs),
+.tabs-wrapper :deep(.el-tabs__content) {
+  background-color: red !important; 
+}
+:deep(.el-tabs){
+  background-color: transparent !important;
+}
+:deep(.el-tabs__content){
+  background-color: transparent !important; 
+}
+:deep(.custom-dialog-bg) {
+  z-index: 1000;
+  background-image: url('@/assets/images/backDia.jpg') !important; 
+  background-position-x: left;
+  background-position-y: bottom;
+  background-size: initial;
+  background-repeat: repeat-x;
+  background-attachment: initial;
+  background-origin: initial;
+  background-clip: initial;
+  background-color: rgb(255, 255, 255);
+}
+:deep(.custom-dialog-bg .el-dialog__header) {
+  
+}
+:deep(.custom-dialog-bg .el-dialog__body) {
+  
+  color: #ecf0f1 !important; ; /* 内容文字颜色 */
+}
+/* 横向排列单选框标签和输入框 */
+.custom-input-wrapper {
+  display: flex;
+  align-items: center;
+  gap: 10px; /* 调整间距 */
+}
+
+/* 输入框仅显示底部横线 */
+.underline-input :deep(.el-input__wrapper) {
+  padding: 0;
+  box-shadow: none !important;
+  border-bottom: 1px solid #dcdfe6; /* 横线颜色 */
+  border-radius: 0;
+  background: transparent;
+}
+.underline-input :deep(.el-input__inner) {
+  height: 24px;
+  padding: 0 5px;
+}
+:deep(.el-table__body tr:hover > td) {
+  background-color: #eaf7ff !important;
+}
+.drag-handle {
+  cursor: move;
+}
+
+.ghost {
+  opacity: 0.5;
+  background: #c8ebfb;
+}
+
+/* 防止文字选中 */
+:deep(.el-table__row) {
+  user-select: none;
+  -webkit-user-select: none;
+}
+</style>
+<style scoped lang="scss">
+
+
+.el-table .el-table__row td {
+  height: 60px !important; /* 行高 */
+}
+.custom-tree-node {
+  display: flex;       /* 启用 Flex 布局 */
+  align-items: center; /* 垂直居中 */
+  gap: 8px;            /* 图标与文字间距 */
+}
+:deep(.svg-icon) {
+  outline: none;
+}
+:deep(.svg-icon svg) {
+  stroke: none;
+}
+</style>

+ 30 - 7
ruoyi-ui/src/views/service/info/shenhe.vue

@@ -99,6 +99,19 @@
           </el-table-column>
           <el-table-column prop="cateCode" label="服务分类" width="140" show-overflow-tooltip>
           </el-table-column>
+          <el-table-column prop="audit" label="审核状态" width="140">
+            <template #default="scope">
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='4'">
+                <el-tag class="ml-2" type="success">已审核</el-tag>
+              </div>
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='3'">
+                <el-tag class="ml-2" type="success">未审核</el-tag>
+              </div>
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='0'">
+                <el-tag class="ml-2" type="success">驳回</el-tag>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column prop="address" label="操作" width="100">
               <template #default="scope">
                   <!-- <div style="display: flex;justify-content: space-between;width: 100%;">
@@ -107,7 +120,7 @@
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">审核</el-button>
                   </div> -->
-                  <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">查看</el-button>
+                  <el-button @click="shenhe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">审核</el-button>
               </template>
           </el-table-column>
         </el-table>
@@ -250,6 +263,7 @@
 import {getCatalog} from "@/api/service/catalog";
 import { Plus,Search,Filter,Promotion,Check  } from '@element-plus/icons-vue'
 import { reactive } from 'vue'
+import { changeSerShenhe } from "@/api/register/regCom";
 import { modelTreeSelect,getSerDe,addService,addParam,editService,editParam,addServiceParam,delService,getTreeDe,addTree,deTree,getServiceInfo,testService } from "@/api/service/info";
 import { ref, onMounted, onUnmounted, nextTick,onBeforeMount } from 'vue';
 import JsonViewer from 'vue-json-viewer'
@@ -306,6 +320,7 @@ const optionsCan = ref([
   },
   
 ])
+const parMdid = ref('')
 const currentNodeKey = ref('')
 const options =  ref([
     {label:'开发中',
@@ -534,13 +549,20 @@ function extractModelNodesDFSIterative(root) {
   }
   return result;
 }
-function delAll(){
-  proxy.$modal.confirm('是否确认删除?').then(function () {
-    return deTree(parTree.value.id);
+function shenhe(row){
+  var par = {
+      srvIds:row.srvId,
+      audit:'4',
+      devkind:'APP'
+    }
+  proxy.$modal.confirm('是否确认审核?').then(function () {
+    return changeSerShenhe(par).then(res=>{
+      if(res.code===200){
+        proxy.$modal.msgSuccess("已审核!");
+        handleNodeClick(parMdid.value)
+      }
+    })
   }).then(() => {
-    getTreeLeft();
-    proxy.$modal.msgSuccess("删除成功");
-    dialogVisibleLevel.value = false
   }).catch(() => {});
 }
 function clearFromLev(){
@@ -650,6 +672,7 @@ async function handleNodeClick(node,data,event){
   //   }
     
   // })
+  parMdid.value = data.data.id
   var par = {
     mdid:data.data.id
   }

+ 18 - 3
ruoyi-ui/src/views/service/info/test.vue

@@ -99,6 +99,16 @@
           </el-table-column>
           <el-table-column prop="cateCode" label="服务分类" width="140" show-overflow-tooltip>
           </el-table-column>
+          <el-table-column prop="audit" label="测试状态" width="140">
+            <template #default="scope">
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='3'">
+                <el-tag class="ml-2" type="success">已测试</el-tag>
+              </div>
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='2'">
+                <el-tag class="ml-2" type="success">未测试</el-tag>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column prop="address" label="操作" width="100">
               <template #default="scope">
                   <!-- <div style="display: flex;justify-content: space-between;width: 100%;">
@@ -107,7 +117,8 @@
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">审核</el-button>
                   </div> -->
-                  <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">查看</el-button>
+                  <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
+                  <!-- <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">查看</el-button> -->
               </template>
           </el-table-column>
         </el-table>
@@ -375,6 +386,7 @@ const tableDataCanAdd = ref([
       paramNote:''
     }
 ])
+const parMdid = ref('')
 const formZu = ref({
   itemName:'',
   itemTp:'',
@@ -464,6 +476,7 @@ function test(){
   testService(par).then(res=>{
     console.log(res)
     dataReturn.value = res.msg
+    handleNodeClick(parMdid.value)
   })
 }
 function testSer(row){
@@ -632,7 +645,7 @@ async function addSer(){
 function showAdd(){
   dialogVisible.value = true
 }
-async function handleNodeClick(node,data,event){
+async function handleNodeClick(data){
   // parTree.value = data.data
   // currentNodeKey.value = data.data.id
  
@@ -650,6 +663,7 @@ async function handleNodeClick(node,data,event){
   //   }
     
   // })
+  parMdid.value = data.data.id
   var par = {
     mdid:data.data.id
   }
@@ -698,7 +712,8 @@ async function handleNodeClick(node,data,event){
 async function getTreeLeft(){
   var par = {
     params:{
-      level:'2'
+      level:'2',
+      devkind : 'SYS'
     }
   }
   await modelTreeSelect(par).then(res=>{

+ 33 - 2
ruoyi-ui/src/views/service/shenhe/index.vue

@@ -99,6 +99,19 @@
           </el-table-column>
           <el-table-column prop="cateCode" label="服务分类" width="140" show-overflow-tooltip>
           </el-table-column>
+          <el-table-column prop="audit" label="审核状态" width="140">
+            <template #default="scope">
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='4'">
+                <el-tag class="ml-2" type="success">已审核</el-tag>
+              </div>
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='3'">
+                <el-tag class="ml-2" type="success">未审核</el-tag>
+              </div>
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='0'">
+                <el-tag class="ml-2" type="success">驳回</el-tag>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column prop="address" label="操作" width="100">
               <template #default="scope">
                   <!-- <div style="display: flex;justify-content: space-between;width: 100%;">
@@ -107,7 +120,7 @@
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">审核</el-button>
                   </div> -->
-                  <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">查看</el-button>
+                  <el-button @click="shenhe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">审核</el-button>
               </template>
           </el-table-column>
         </el-table>
@@ -250,6 +263,7 @@
 import {getCatalog} from "@/api/service/catalog";
 import { Plus,Search,Filter,Promotion,Check  } from '@element-plus/icons-vue'
 import { reactive } from 'vue'
+import { changeSerShenhe } from "@/api/register/regCom";
 import { modelTreeSelect,getSerDe,addService,addParam,editService,editParam,addServiceParam,delService,getTreeDe,addTree,deTree,getServiceInfo,testService } from "@/api/service/info";
 import { ref, onMounted, onUnmounted, nextTick,onBeforeMount } from 'vue';
 import JsonViewer from 'vue-json-viewer'
@@ -401,6 +415,7 @@ const rulesJi = reactive({
   cateCode: [{ required: true, message: '必填', trigger: 'blur' }],
 });
 const formRefJi = ref();
+const parMdid = ref('')
 const formAdd = ref({
   name:'',
   cateCode:'',
@@ -457,7 +472,22 @@ const filterNode = (value, data) => {
 };
 
 const copied = ref(false);
-
+function shenhe(row){
+  var par = {
+      srvIds:row.srvId,
+      audit:'4',
+      devkind:'SYS'
+    }
+  proxy.$modal.confirm('是否确认审核?').then(function () {
+    return changeSerShenhe(par).then(res=>{
+      if(res.code===200){
+        proxy.$modal.msgSuccess("已审核!");
+        handleNodeClick(parMdid.value)
+      }
+    })
+  }).then(() => {
+  }).catch(() => {});
+}
 function test(){
   var par = detailJson.value
   par.params = tableDataCan.value
@@ -650,6 +680,7 @@ async function handleNodeClick(node,data,event){
   //   }
     
   // })
+  parMdid.value = data.data.id
   var par = {
     mdid:data.data.id
   }

+ 14 - 1
ruoyi-ui/src/views/service/test/index.vue

@@ -99,6 +99,16 @@
           </el-table-column>
           <el-table-column prop="cateCode" label="服务分类" width="140" show-overflow-tooltip>
           </el-table-column>
+          <el-table-column prop="audit" label="测试状态" width="140">
+            <template #default="scope">
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='3'">
+                <el-tag class="ml-2" type="success">已测试</el-tag>
+              </div>
+              <div style="text-align: center;display: flex;" v-if="scope.row.audit=='2'">
+                <el-tag class="ml-2" type="danger">未测试</el-tag>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column prop="address" label="操作" width="100">
               <template #default="scope">
                   <!-- <div style="display: flex;justify-content: space-between;width: 100%;">
@@ -107,7 +117,7 @@
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
                       <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">审核</el-button>
                   </div> -->
-                  <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">查看</el-button>
+                  <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
               </template>
           </el-table-column>
         </el-table>
@@ -366,6 +376,7 @@ const isAdd = ref(false)
 const isAddTa = ref(false)
 const treeId = ref('');
 const valueSta = ref('1');
+const parMdid = ref('')
 const example = ref('');
 const tableDataCanAdd = ref([
   {
@@ -464,6 +475,7 @@ function test(){
   testService(par).then(res=>{
     console.log(res)
     dataReturn.value = res.msg
+    handleNodeClick(parMdid.value)
   })
 }
 function testSer(row){
@@ -650,6 +662,7 @@ async function handleNodeClick(node,data,event){
   //   }
     
   // })
+  parMdid.value = data.data.id
   var par = {
     mdid:data.data.id
   }

+ 5 - 4
ruoyi-ui/src/views/standardization/modelUsing/index.vue

@@ -36,8 +36,8 @@
                     <div style="margin-left: 3%;font-size: 12px;">
                         创建人:{{ item.createBy }} 更新时间:{{item.createTime}}
                     </div>
-                    <el-icon style="color: #79bbff;margin-left: auto;cursor: pointer;" @@click.stop="editModel(item)" v-if="hoverIndex === index"><Edit /></el-icon>
-                    <el-icon style="color: red;margin-left: 2%;cursor: pointer;" @@click.stop="delModel(item)" v-if="hoverIndex === index"><Delete /></el-icon>
+                    <el-icon style="color: #79bbff;margin-left: auto;cursor: pointer;" @click.stop="editModel(item)" v-if="hoverIndex === index"><Edit /></el-icon>
+                    <el-icon style="color: red;margin-left: 2%;cursor: pointer;" @click.stop="delModel(item)" v-if="hoverIndex === index"><Delete /></el-icon>
                 </div>
             </div>
         </div>
@@ -123,12 +123,13 @@ const formAdd = ref({
     appNote: '',
 });
 const formAddref = ref()
-const parModel = ref({})
-const parFile = ref({})
+
 const rulesAdd = reactive({
   appTitle: [{ required: true, message: '必填', trigger: 'blur' }], 
   appNote: [{ required: true, message: '必填', trigger: 'blur' }], 
 });
+const parModel = ref({})
+const parFile = ref({})
 const upload = reactive({
   // 是否显示弹出层(用户导入)
   open: false,

+ 483 - 63
ruoyi-ui/src/views/standardization/modeling/index.vue

@@ -8,7 +8,7 @@
       <el-button style="margin-left: 1%;" type="primary" size="mini" @click="saveFlow">保存</el-button>
       <el-button style="margin-left: 1%;" type="primary" size="mini" @click="showData">ceshi</el-button>
     </div>
-    <div v-if="nodeDeSer" style="height: 85vh;width: 20vw;position: absolute;float: right;z-index: 1000;right: 1%;top: 1%;border: 0.1px solid #dedfe0;border-radius: 6px;background-color: white;">
+    <div v-if="nodeDeSer" style="height: 85vh;overflow-y: auto;width: 20vw;position: absolute;float: right;z-index: 1000;right: 1%;top: 1%;border: 0.1px solid #dedfe0;border-radius: 6px;background-color: white;">
       <div style="display: flex;margin-left: 3%;margin-top: 3%;align-items: center;justify-content: space-between;width: 95%;">
         <el-tag class="ml-2" style="" type="warning">服务</el-tag>
         <div style="margin-left: 4%;">
@@ -81,13 +81,22 @@
     </div>
     <div style="display: flex;height: 87vh;width: 100%;padding-top:2%;justify-items: center;">
       <div style="width: 20%;margin-left: 1%;overflow-y: auto;margin-top: 0.5%;">
+        <el-checkbox-group v-model="checkboxGroup1" size="" style="margin-left: 5%;" @change="oneSel">
+          <el-checkbox-button key="service" label="service">
+            服务
+          </el-checkbox-button>
+          <el-checkbox-button key="tool" label="tool">
+            工具
+          </el-checkbox-button>
+      </el-checkbox-group>
         <el-input
+          v-if="checkboxGroup1.includes('service')"
           v-model="inputNode"
           style="width:90%;margin-left: 5%;background-color: #ebeef5;margin-top: 1%;"
           class="w-50 m-2"
           :prefix-icon="Search" 
         />
-        <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft" :data="dataTree" 
+        <el-tree v-if="checkboxGroup1.includes('service')" :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft" :data="dataTree" 
         @node-click="handleNodeClick" node-key="id" style="margin-left: 5%;margin-top: 3%;width: 90%;background-color: transparent;" default-expand-all :key="valueKet">
           <template #default="{ node, data }">
             <span  style="justify-content: space-between;display: flex;width: 100%;align-items: center;" :draggable="true" @dragstart="onDragStart($event,data)">
@@ -104,65 +113,108 @@
             </span>
           </template>
         </el-tree>
+        <el-tree v-if="!checkboxGroup1.includes('service')" :expand-on-click-node="false" ref="treeRef" :current-node-key="currentNodeKey" class="treeLeft" :data="dataTreeTool" 
+        @node-click="handleNodeClick" node-key="id" style="margin-left: 5%;margin-top: 3%;width: 90%;background-color: transparent;" default-expand-all :key="valueKet">
+          <template #default="{ node, data }">
+            <span  style="justify-content: space-between;display: flex;width: 120%;align-items: center;" :draggable="true" @dragstart="onDragStart($event,data)">
+              <div class="custom-tree-node">
+                  <svg-icon icon-class="liuchengshuru" style="color: #eebe77;" v-if="data.label=='输入'"/>
+                  <svg-icon icon-class="liuchengEx" dstyle="color: #13E03B;" v-if="data.label=='Excel文件输入组件'"/>
+                  <svg-icon icon-class="liuchengbiao" dstyle="color: #13E03B;" v-if="data.label=='表输入组件'"/>
+                  <svg-icon icon-class="liuchengcsv" dstyle="color: #13E03B;" v-if="data.label=='csv输入组件'"/>
+                  <svg-icon icon-class="lczh" dstyle="color: #13E03B;" v-if="data.label=='转换'"/>
+                  <svg-icon icon-class="lczhzj" dstyle="color: #13E03B;" v-if="data.label=='转换组件'"/>
+                  <svg-icon icon-class="lcpx" dstyle="color: #13E03B;" v-if="data.label=='排序记录'"/>
+                  <svg-icon icon-class="lczd" dstyle="color: #13E03B;" v-if="data.label=='字段派生器'"/>
+                  <svg-icon icon-class="lcsc" dstyle="color: #13E03B;" v-if="data.label=='输出'"/>
+                  <svg-icon icon-class="lcbsc" dstyle="color: #13E03B;" v-if="data.label=='表输出组件'"/>
+                <span style="margin-left: 2%;">&nbsp;{{ node.label }}</span>
+              </div>
+            </span>
+          </template>
+        </el-tree>
       </div>
       <div ref="flowContainer" style="width: 80%;">
         <VueFlow  ref="vueFlowRef" style="background-color: #EFEFF4;margin-top: 0.5%;" :nodes="nodes" :viewport="zoom" :edges="edges" @drop="onDrop" @dragover="onDragOver" @dragleave="onDragLeave"
           @node-click="onNodeClick"   @connect="onConnect" fit-view-on-init>
           <Controls :showInteractive="false" :showFitView="false"/>
           <template #node-special="specialNodeProps">
+            <div v-if="specialNodeProps.data.nodeType=='tool'" class="vue-flow__node-default" style="border: 0.2px solid #c8c9cc;border-radius: 6px;min-height: 6vh;min-width: 11vw">
+              <div style='width:100%;font-size:15px;display:flex;align-items:center;height: 3vh;margin-top: 2%;'>
+                <div style="margin-left: 0%;font-weight: 500;">
+                  <svg-icon icon-class="liuchengshuru" style="color: #eebe77;height:20px;width:20px;" v-if="specialNodeProps.data.label=='输入'"/>
+                  <svg-icon icon-class="liuchengEx" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='Excel文件输入组件'"/>
+                  <svg-icon icon-class="liuchengbiao" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='表输入组件'"/>
+                  <svg-icon icon-class="liuchengcsv" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='csv输入组件'"/>
+                  <svg-icon icon-class="lczh" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='转换'"/>
+                  <svg-icon icon-class="lczhzj" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='转换组件'"/>
+                  <svg-icon icon-class="lcpx" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='排序记录'"/>
+                  <svg-icon icon-class="lczd" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='字段派生器'"/>
+                  <svg-icon icon-class="lcsc" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='输出'"/>
+                  <svg-icon icon-class="lcbsc" style="color: #13E03B;height:20px;width:20px;" v-if="specialNodeProps.data.label=='表输出组件'"/>
+                </div>
+                <div style="margin-left: 10%;">
+                  <el-input class="custom-no-border" @click.stop="handleInputClick" type="primary" v-model="specialNodeProps.data.label" size="mini" text 
+                  style="margin-left: -20%;font-size: 15px;height: 15px;width: 100%;" ></el-input>
+                </div>
+              </div>
+                <Handle type="source" :position="Position.Right"/>
+                <Handle type="target" :position="Position.Left"/>
+            </div>
             <div v-if="specialNodeProps.data.label=='开始'" class="vue-flow__node-default" style="border: 0.2px solid #c8c9cc;border-radius: 6px;min-height: 6vh;min-width: 11vw">
-                <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;'>
-                  <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-Start-v2.jpg" alt="">
-                  <div style="margin-left: 3%;font-weight: 500;">
-                    开始
-                  </div>
-                  <el-tag class="ml-2" style="width: 30px;height: 15px;font-size: 7px;margin-left: 6%;" type="info">触发器</el-tag>
+              <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;'>
+                <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-Start-v2.jpg" alt="">
+                <div style="margin-left: 3%;font-weight: 500;">
+                  开始
                 </div>
-                  <Handle type="source" :position="Position.Right"/>
+                <el-tag class="ml-2" style="width: 30px;height: 15px;font-size: 7px;margin-left: 6%;" type="info">触发器</el-tag>
               </div>
-              <div v-if="specialNodeProps.data.label=='结束'" class="vue-flow__node-default" style="border: 0.2px solid #c8c9cc;border-radius: 6px;min-height: 6vh;min-width: 11vw">
-                <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;'>
-                  <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-Start-v2.jpg" alt="">
-                  <div style="margin-left: 3%;font-weight: 500;">
-                    结束
-                  </div>
-                  <div>
+                <Handle type="source" :position="Position.Right"/>
+            </div>
+            <div v-if="specialNodeProps.data.label=='结束'" class="vue-flow__node-default" style="border: 0.2px solid #c8c9cc;border-radius: 6px;min-height: 6vh;min-width: 11vw">
+              <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;'>
+                <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-Start-v2.jpg" alt="">
+                <div style="margin-left: 3%;font-weight: 500;">
+                  结束
+                </div>
+                <div>
 
-                  </div>
                 </div>
-                  <Handle type="target" :position="Position.Left"/>
               </div>
-              <div v-if="specialNodeProps.data.label!=='结束'&&specialNodeProps.data.label!=='开始'" class="vue-flow__node-default" 
-              style="border: 0.5px solid #c8c9cc;border-radius: 6px;border-radius: 6px;min-height: 8vh;min-width: 13vw">
-                <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;justify-content: space-between;'>
-                  <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-HTTP.png" alt="">
-                  <div style="margin-left:3%;font-weight: 500;"> 
-                    <el-input class="custom-no-border" placeholder="" type="primary" v-model="specialNodeProps.data.label" size="mini" text 
-                    style="margin-left: 0%;font-size: 10px;height: 15px;width: 150%;" ></el-input>
-                    <!-- {{ specialNodeProps.data.label}} -->
-                  </div>
-                  <el-icon style="cursor: pointer;margin-left: auto;"><CaretRight /></el-icon>
-                  <el-icon @click.stop="delNode(specialNodeProps)" style="cursor: pointer;color: #F56C6C;margin-left: 2%;"><Delete /></el-icon>
+                <Handle type="target" :position="Position.Left"/>
+            </div>
+            <div v-if="specialNodeProps.data.nodeType=='SERVICE'" 
+            class="vue-flow__node-default" 
+            style="border: 0.5px solid #c8c9cc;border-radius: 6px;border-radius: 6px;min-height: 8vh;min-width: 13vw">
+              <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;justify-content: space-between;'>
+                <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-HTTP.png" alt="">
+                <div style="margin-left:3%;font-weight: 500;"> 
+                  <el-input class="custom-no-border" placeholder="" type="primary" v-model="specialNodeProps.data.label" size="mini" text 
+                  style="margin-left: 0%;font-size: 10px;height: 15px;width: 150%;" ></el-input>
+                  <!-- {{ specialNodeProps.data.label}} -->
                 </div>
-                <div style="display: flex;margin-top: 3%;">
-                  <el-tag class="ml-2" style="width: 35px;height: 20px;font-size: 10px;" type="warning">服务</el-tag>
+                <el-icon style="cursor: pointer;margin-left: auto;"><CaretRight /></el-icon>
+                <el-icon @click.stop="delNode(specialNodeProps)" style="cursor: pointer;color: #F56C6C;margin-left: 2%;"><Delete /></el-icon>
+              </div>
+              <div style="display: flex;margin-top: 3%;">
+                <el-tag class="ml-2" style="width: 35px;height: 20px;font-size: 10px;" type="warning">服务</el-tag>
+              </div>
+              <div style="display: flex;margin-top: 3%;font-size: 9px;color: #b1b3b8;flex-wrap: wrap;align-items: flex-start;">
+                <div style="word-break: break-all;min-width: 0;width: 100%;text-align: left;">
+                  {{ specialNodeProps.data.service.rqtype+ ':' }}{{ specialNodeProps.data.service.url }}
                 </div>
-                <div style="display: flex;margin-top: 3%;font-size: 9px;color: #b1b3b8;flex-wrap: wrap;align-items: flex-start;">
-                  <div style="word-break: break-all;min-width: 0;width: 100%;text-align: left;">
-                    {{ specialNodeProps.data.service.rqtype+ ':' }}{{ specialNodeProps.data.service.url }}
-                  </div>
+              </div>
+              <div style="display: flex;margin-top: 3%;font-size: 9px;color: #b1b3b8;align-items: center;">
+                <div>
+                  说明:
                 </div>
-                <div style="display: flex;margin-top: 3%;font-size: 9px;color: #b1b3b8;align-items: center;">
-                  <div>
-                    说明:
-                  </div>
-                  <div>
-                    {{ specialNodeProps.data.service.intro }}
-                  </div>
+                <div>
+                  {{ specialNodeProps.data.service.intro }}
                 </div>
-                  <Handle type="source" :position="Position.Right"/>
-                  <Handle type="target" :position="Position.Left"/>
               </div>
+                <Handle type="source" :position="Position.Right"/>
+                <Handle type="target" :position="Position.Left"/>
+            </div>
           </template>
           <template #edge-custom="specialEdgeProps">
             <div style="height: 1px;color: red;">
@@ -171,7 +223,261 @@
           </template> 
         </VueFlow>
       </div>
-      
+      <el-dialog @close="clearFromLev" title="" v-model="dialogVisibleBiao" width="50%" destroy-on-close :key="tableKey">
+        <el-form size="mini" :key="tableKey" style="margin-top: 1%;width: 98%;"  :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
+          <el-form-item label="连接方式:" prop="" style="display: flex; align-items: center;">
+            <el-radio-group :disabled="isEdit" v-model="formJi.rptype" class="ml-4" style="display: inline-flex; align-items: center;">
+              <el-radio label="1" size="large" style="display: inline-flex; align-items: center;">
+                <span style="position: relative; top: -1px">资产表</span>
+              </el-radio>
+              <el-radio label="2" size="large" style="display: inline-flex; align-items: center;">
+                <span style="position: relative; top: -1px">sql</span>
+              </el-radio>
+              <el-radio label="3" size="large" style="display: inline-flex; align-items: center;">
+                <span style="position: relative; top: -1px">数据连接</span>
+              </el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="数据源:" prop="" style="">
+            <div style="display: flex;width: 30%;justify-content: space-between;">
+              <el-select
+                v-model="formJi.type"
+                :disabled="isEdit"
+                    style="width: 100%;margin-left: 0%;"
+                >
+                    <el-option
+                    v-for="item in optionsType"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                    />
+                </el-select>
+            </div>
+            </el-form-item>
+            <el-form-item label="读取模式:" prop="" style="display: flex; align-items: center;">
+            <el-radio-group :disabled="isEdit" v-model="formJi.rptype" class="ml-4" style="display: inline-flex; align-items: center;">
+              <el-radio label="1" size="large" style="display: inline-flex; align-items: center;">
+                <span style="position: relative; top: -1px">全量</span>
+              </el-radio>
+              <el-radio label="2" size="large" style="display: inline-flex; align-items: center;">
+                <span style="position: relative; top: -1px">id增量</span>
+              </el-radio>
+              <el-radio label="3" size="large" style="display: inline-flex; align-items: center;">
+                <span style="position: relative; top: -1px">时间范围增量</span>
+              </el-radio>
+            </el-radio-group>
+            </el-form-item>  
+            <el-form-item label="where条件:">
+                <el-input v-model="formJi.intro" style="width: 100%;" :rows="3" resize="none" type="textarea"/>
+            </el-form-item>
+          </el-form>
+          <div style="font-size: 16px;margin-left: 1%">
+            属性字段
+          </div>
+          <el-table 
+          style="margin-top: 2%;width: 100%;margin-left: 1%;overflow: auto;"
+          :data="tableDataCan" 
+          :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
+          :header-cell-style="{ textAlign: 'center', }"
+          max-height="45vh"
+          :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+          border>
+              <el-table-column prop="parName" label="参数英文名">
+                <template #default="scope" style="width: 120%;">
+                    <el-input  v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parName" label="参数名称">
+                <template #default="scope">
+                    <el-input  v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parType" label="参数类型" >
+                <template #default="scope">
+                    <el-input  v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parNote" label="操作" width="85">
+                <template #default="scope">
+                    <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
+                </template> 
+              </el-table-column>
+          </el-table>
+        <template #footer>
+            <span class="dialog-footer">
+              <el-button size="mini" @click="dialogVisibleBiao = false">取消</el-button>
+              <el-button type="primary" @click="saveAdd1Level" size="mini" v-if="show1Lev">
+                提交
+              </el-button>
+              <el-button type="primary" @click="saveAddNextLevel" size="mini" v-if="!show1Lev">
+                提交
+              </el-button>
+          </span>
+        </template>
+      </el-dialog>
+      <el-dialog
+        :title="title"
+        v-model="dialogVisibleExcel"
+        width="50%">
+        <div>
+            <el-form ref="formAddref" :model="formAdd" label-width="100px" class="coz-mg-card" :rules="rulesAdd">
+              <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="选择附件:">
+                  <el-upload
+                    ref="uploadRef"
+                    style="margin-top: 0%;"
+                    :limit="1"
+                    :show-file-list="false"
+                    :file-list="fileList"
+                    :headers="upload.headers"
+                    :on-progress="handlepro"
+                    :on-success="handleFileSuccess"
+                    :on-change="handleChange"
+                    :action="upload.url + '?file=' + upload.updateSupport"
+                    :auto-upload="false">
+                      <el-button @click="clearDefault" plain type="primary" size="mini" style="margin-left:auto;width: 80px;" :icon="Upload">上传文件</el-button>
+                  </el-upload>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="起始行:" prop="appTitle">
+                <el-input-number
+                    v-model="num"
+                    class="mx-4"
+                    :min="1"
+                    controls-position="right"
+                    @change="handleChange"
+                  />
+                </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="起始列:" prop="appNote">
+                <el-input-number
+                    v-model="num"
+                    class="mx-4"
+                    :min="1"
+                    controls-position="right"
+                    @change="handleChange"
+                  />
+                </el-form-item>
+            </el-col>
+            </el-row>
+            </el-form>
+        </div>
+        <div style="font-size: 16px;margin-left: 1%">
+            属性字段
+          </div>
+          <el-table 
+          style="margin-top: 2%;width: 100%;margin-left: 1%;overflow: auto;"
+          :data="tableDataCan" 
+          :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
+          :header-cell-style="{ textAlign: 'center', }"
+          max-height="45vh"
+          :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+          border>
+              <el-table-column prop="parName" label="参数英文名">
+                <template #default="scope" style="width: 120%;">
+                    <el-input  v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parName" label="参数名称">
+                <template #default="scope">
+                    <el-input  v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parType" label="参数类型" >
+                <template #default="scope">
+                    <el-input  v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parNote" label="操作" width="85">
+                <template #default="scope">
+                    <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
+                </template> 
+              </el-table-column>
+          </el-table>
+        <template #footer>
+            <el-button @click="dialogVisibleExcel = false">取消</el-button>
+            <el-button v-if="isAdd" type="primary" @click="submitAdd">确定</el-button>
+            <el-button v-if="!isAdd" type="primary" @click="subEdit">确定</el-button>
+        </template>
+    </el-dialog>
+    <el-dialog @close="clearFromLev" title="" v-model="dialogVisibleCsv" width="50%" destroy-on-close :key="tableKey">
+        <el-form ref="formAddref" :model="formAdd" label-width="100px" class="coz-mg-card" :rules="rulesAdd">
+              <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="上传附件:">
+                  <el-upload
+                    ref="uploadRef"
+                    style="margin-top: 0%;"
+                    :limit="1"
+                    :show-file-list="false"
+                    :file-list="fileList"
+                    :headers="upload.headers"
+                    :on-progress="handlepro"
+                    :on-success="handleFileSuccess"
+                    :on-change="handleChange"
+                    :action="upload.url + '?file=' + upload.updateSupport"
+                    :auto-upload="false">
+                      <el-button @click="clearDefault" plain type="primary" size="mini" style="margin-left:auto;width: 80px;" :icon="Upload">选择文件</el-button>
+                  </el-upload>
+                  <el-button @click="clearDefault" plain type="primary" size="mini" style="margin-left:auto;width: 80px;" :icon="Upload">解析文件</el-button>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="" prop="">
+                
+                </el-form-item>
+            </el-col>
+            <el-col :span="8">
+            </el-col>
+            </el-row>
+            </el-form>
+          <div style="font-size: 16px;margin-left: 1%">
+            属性字段
+          </div>
+          <el-table 
+          style="margin-top: 2%;width: 100%;margin-left: 1%;overflow: auto;"
+          :data="tableDataCan" 
+          :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
+          :header-cell-style="{ textAlign: 'center', }"
+          max-height="45vh"
+          :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+          border>
+              <el-table-column prop="parName" label="参数英文名">
+                <template #default="scope" style="width: 120%;">
+                    <el-input  v-model="scope.row.parEnname" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parName" label="参数名称">
+                <template #default="scope">
+                    <el-input  v-model="scope.row.parName" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parType" label="参数类型" >
+                <template #default="scope">
+                    <el-input  v-model="scope.row.parType" style="width: 120%;margin-left: -10%;"/>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parNote" label="操作" width="85">
+                <template #default="scope">
+                    <el-button type="danger" @click="delCan(scope.$index, scope.row)" text size="mini" style="margin-left: 0%;">删除</el-button>
+                </template> 
+              </el-table-column>
+          </el-table>
+        <template #footer>
+            <span class="dialog-footer">
+              <el-button size="mini" @click="dialogVisibleBiao = false">取消</el-button>
+              <el-button type="primary" @click="saveAdd1Level" size="mini" v-if="show1Lev">
+                提交
+              </el-button>
+              <el-button type="primary" @click="saveAddNextLevel" size="mini" v-if="!show1Lev">
+                提交
+              </el-button>
+          </span>
+        </template>
+      </el-dialog>
     </div>
 
   </div>
@@ -189,6 +495,7 @@ import {useVueFlow, VueFlow ,MarkerType } from '@vue-flow/core'
 import SpecialNode from './components/SpecialNode.vue'
 import SpecialEdge from './components/SpecialEdge.vue'
 import {getPtServiceList,getSerDe} from "@/api/service/info.js";
+import { getToken } from '@/utils/auth'
 import {getModelList2} from "@/api/register/regCom.js";
 import {copyObject} from "@/utils/index.js";
 import {getModelingDe,addModelingFlow,editModelingFlow,delFlow} from "@/api/standardization/modeling.js";
@@ -212,7 +519,102 @@ const {
   getEdges,
 } = useVueFlow()
 snapToGrid.value = true
+const formAdd = ref({
+    appTitle: '',
+    appNote: '',
+});
+const dialogVisibleCsv = ref(false)
+const formAddref = ref()
+const dialogVisibleExcel = ref(false)
+const rulesAdd = reactive({
+  appTitle: [{ required: true, message: '必填', trigger: 'blur' }], 
+  appNote: [{ required: true, message: '必填', trigger: 'blur' }], 
+});
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: "",
+  // 是否禁用上传
+  isUploading: false,
+  // 是否更新已经存在的用户数据
+  updateSupport: '',
+  // 设置上传的请求头部
+  headers: { Authorization: "Bearer " + getToken() },
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + "/common/upload"
+});
+const dialogVisibleBiao = ref(false)
 const vueFlowModel = ref();
+const formJi = ref({
+  name:'',
+  cateCode:'',
+  type:'',
+  url:'',
+  rqtype:'',
+  rptype:'',
+  intro:'',
+});
+const rulesJi = reactive({
+  name: [{ required: true, message: '必填', trigger: 'blur' }],
+  url: [{ required: true, message: '必填', trigger: 'blur' }],
+  cateCode: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const dataTreeTool = ref([
+  {
+    label:'输入',
+    value:'输入',
+    children:[
+      {
+        label:'表输入组件',
+        nodeType:'tool',
+        value:'表输入组件',
+      },
+      {
+        label:'Excel文件输入组件',
+        value:'Excel文件输入组件',
+        nodeType:'tool',
+      },
+      {
+        label:'csv输入组件',
+        nodeType:'tool',
+        value:'csv输入组件',
+      },
+    ]
+  },
+  {
+    label:'转换',
+    value:'转换',
+    children:[
+      {
+        label:'转换组件',
+        nodeType:'tool',
+        value:'转换组件',
+      },
+      {
+        label:'排序记录',
+        nodeType:'tool',
+        value:'排序记录',
+      },
+      {
+        label:'字段派生器',
+        nodeType:'tool',
+        value:'字段派生器',
+      },
+    ]
+  },
+  {
+    label:'输出',
+    value:'输出',
+    children:[
+      {
+        label:'表输出组件',
+        nodeType:'tool',
+        value:'表输出组件',
+      },
+    ]
+  },
+])
 const tableDataCanOut = ref([]);
 const flowContainer = ref(null);
 const status = ref('就绪');
@@ -239,6 +641,7 @@ const dataTree = ref([]);
 const modelOptions = ref(undefined);
 const modelId = ref(undefined);
 const loading = ref(true);
+const checkboxGroup1 = ref(['service'])
 const toolType = ref('0');
 const serviceList = ref([]);
 const defaultEdgeStyle = {
@@ -278,6 +681,9 @@ watch(inputNode, (val) => {
 function showData(){
   console.log(nodes.value)
 }
+function handleInputClick(){
+  console.log(nodes.value)
+}
 function delWholeFlow(){
   proxy.$confirm('是否删除该模型流程?', '提示', {
         confirmButtonText: '确定',
@@ -322,6 +728,11 @@ const toImage = async () => {
     console.error('导出错误:', error);
   }
 };
+function oneSel(){
+  if(checkboxGroup1.value.length>1){
+    checkboxGroup1.value.splice(0,1)
+  }
+}
 async function delNode(node){
   removeNodes([node])
   await nextTick()
@@ -376,7 +787,7 @@ function saveFlow(){
   }
 }
 onNodeClick(({event, node}) => {
-  console.log(node)
+  tableDataCan.value = []
   if(node.data.nodeType==='SERVICE'){
     getSerDe(node.data.id).then(res=>{
       serviceRqtype.value = res.data.ptService.rqtype
@@ -388,6 +799,18 @@ onNodeClick(({event, node}) => {
     })
     
   }
+  if(node.data.nodeType==='tool'){
+    console.log(node.data.value)
+    if(node.data.value==='表输入组件'){
+      dialogVisibleBiao.value = true
+    }
+    if(node.data.value==='Excel文件输入组件'){
+      dialogVisibleExcel.value = true
+    }
+    if(node.data.value==='csv输入组件'){
+      dialogVisibleCsv.value = true
+    }
+  }
   
 });
 
@@ -397,19 +820,20 @@ onNodeClick(({event, node}) => {
  * @param data
  */
 function onDragStart(event, data) {
-  if (event.dataTransfer) {
-    event.dataTransfer.setData('application/vueflow', data)
-    event.dataTransfer.effectAllowed = 'move'
-  }
+  if(data.nodeType==='SERVICE'||data.nodeType==='tool'){
+    if (event.dataTransfer) {
+      event.dataTransfer.setData('application/vueflow', data)
+      event.dataTransfer.effectAllowed = 'move'
+    }
 
-  draggedData.value = data
-  isDragging.value = true
+    draggedData.value = data
+    isDragging.value = true
+    
+    document.addEventListener('drop', onDragEnd)
+  }
   
-  document.addEventListener('drop', onDragEnd)
-}
-function back(){
-  proxy.$router.push({ path: '/standardization/modelUsing' });
 }
+
 /**
  * 拖拽到画布vueflow的事件
  * @param event
@@ -482,7 +906,9 @@ function onDragEnd() {
 function onConnect(params) {
   addEdges({ ...params, ...defaultEdgeStyle })
 }
-
+function back(){
+  proxy.$router.push({ path: '/standardization/modelUsing' });
+}
 /** 查询模型列表 */
 function getModelList() {
   getModelList2(modelQueryParams.value).then(res => {
@@ -498,12 +924,6 @@ const filterNode = (value, data) => {
 };
 
 
-/** 搜索按钮操作 */
-function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
-}
-
 /** 查询流程图 */
 function getList() {
   const count = computed(() => store.getters.id)

Некоторые файлы не были показаны из-за большого количества измененных файлов