nanjingliujinyu 5 ay önce
ebeveyn
işleme
dab7339131

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

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1754443403790" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4154" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M843.447154 408.715447l180.552846-116.03252L512 0 0 292.682927l182.113821 116.03252-182.113821 103.284553 150.634146 96.780488L0 694.894309l512 329.105691 512-329.105691-150.373984-86.113821 150.373984-96.780488z m39.544716 289.821138L512 936.585366 141.00813 698.536585l78.048781-45.00813 291.902439 187.837399 292.162601-187.837399z m-81.170732-130.0813l-69.203252 44.487804L512 754.471545l-220.357724-141.788618-69.463414-44.747968-81.170732-52.03252 109.00813-62.178862 81.430894 52.032521 69.203253 44.747967 111.349593 71.544715L624.390244 550.243902l69.463415-44.487804 81.170731-52.032521 109.00813 62.439025z" fill="#007BEA" p-id="4155"></path></svg>

+ 5 - 5
ruoyi-ui/src/layout/components/Sidebar/index.vue

@@ -7,12 +7,12 @@
         <div class="line-left-img">
           <img src="@/assets/images/top.png" alt=""/>
         </div>
-        <div class="line-left-name">
+        <div class="line-left-name" style="font-size: 22px;">
           <span>上海市水务海洋数字孪生模型服务管理系统</span>
         </div>
       </el-col>
-      <el-col :span="14">
-        <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper" style="margin-left: 6%;">
+      <el-col :span="16">
+        <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper" style="margin-left: 3%;">
           <el-menu
               :default-active="activeMenu"
               class="custom-menu"
@@ -118,7 +118,7 @@ function handleCommand(command) {
   height: 60px;
   line-height: 60px;
   background-image: url('../../../assets/images/title-background.png') !important;
-
+  background-position: -90px 0;
   .line-left-img {
     float: left;
 
@@ -133,7 +133,7 @@ function handleCommand(command) {
     float: left;
 
     span {
-      font-size: 25px;
+      font-size: 22px;
       font-weight: bold;
       color: #f5f6f8;
       height: 60px;

+ 332 - 112
ruoyi-ui/src/views/platform/plugin/index.vue

@@ -41,7 +41,7 @@
         <el-table-column prop="enname" label="英文名称">
         </el-table-column>
         <el-table-column prop="className" label="模型类型" width="160"/>
-        <el-table-column prop="mdUnit" 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>
@@ -98,6 +98,11 @@
                       </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="开发语言:">
@@ -381,13 +386,8 @@
                     <div style="color: #b1b3b8;width: 100%;">
                       注:请上传后缀名为.docx .pdf .txt的文件
                     </div>
-                    <div style="display: flex;align-items: center;width: 100%;">
-                        <el-link type="primary" @click="downIn">{{formJi.mdInName}}</el-link>
-                        <el-icon v-if="formJi.mdInName" :size="size" color="red" style="margin-left: 1%;cursor: pointer;" @click="delFileIn()" >
-                            <Delete />
-                        </el-icon>
-                    </div>
-                 </el-form-item>
+                    <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>
@@ -417,12 +417,7 @@
                     <div style="color: #b1b3b8;width: 100%;">
                       注:请上传后缀名为.docx .pdf .txt的文件
                     </div>
-                    <div style="display: flex;align-items: center;width: 100%;">
-                        <el-link type="primary" @click="downOut">{{formJi.mdOutName}}</el-link>
-                        <el-icon :size="size" color="red" style="margin-left: 1%;cursor: pointer;" @click="delFileOut()" >
-                            <Delete />
-                        </el-icon>
-                    </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"/>
@@ -527,87 +522,121 @@
                 <el-descriptions-item label="联系方式:">{{formJi.devContact}}</el-descriptions-item>
               </el-descriptions>
             </el-tab-pane>
-            <el-tab-pane label="模型参数" style="height: 50vh;">
+            <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"  />
-                  <el-button  @click="addCan" style="margin-left: 10%;" type="success" size="mini" plain v-if="checked1">新增分组</el-button>
+                  <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>新增参数</el-button>
+                  <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-show="checked1" style="flex:1;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-top: 10%;background-color: transparent;" default-expand-all :key="valueKet">
-                  
-              </el-tree>
-              </div>
-              <div style="width: 90%;flex: 1;">
-                <el-table 
-              style="margin-top: 1%;width: 100%;margin-left: 1%;"
-              :data="tableDataCan" 
-              :cell-style="{ textAlign: 'center',padding:'3px 0px' }"
-              :header-cell-style="{ textAlign: 'center', }"
-              :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)" text size="mini" style="margin-left: 0%;">删除</el-button>
-                    </template> 
-                  </el-table-column>
-              </el-table>
-              </div>
+                <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-tab-pane label="Task">Task</el-tab-pane>
           </el-tabs>
           <template #footer>
           <span class="dialog-footer">
@@ -618,11 +647,35 @@
           </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,delFile,getParamsList,changePar,delAllPar,getModelParList } from "@/api/register/regCom";
+import { getModelList,addModel,delMdid,getModelDetail,updateModel,addGroup,getParamsList,changePar,delAllPar,getModelParList,delFen } from "@/api/register/regCom";
 import { ref, onMounted, onUnmounted, nextTick } from 'vue';
 import { Search } from '@element-plus/icons-vue'
 import {
@@ -635,8 +688,13 @@ 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)
@@ -648,7 +706,9 @@ 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:'',
@@ -676,6 +736,7 @@ const formJi = ref({
   mdInNote:'',
   mdOutNote:''
 });
+const activeTabKey = ref(0)
 const rulesJi = reactive({
   name: [{ required: true, message: '必填', trigger: 'blur' }],
   enname: [{ required: true, message: '必填', trigger: 'blur' }],
@@ -692,8 +753,21 @@ const rulesZu = reactive({
   mdCPU: [{ required: true, message: '必填', trigger: 'blur' }],
 });
 const formRefZu = ref();
-const activeName = ref('first')
 
+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,
@@ -800,49 +874,175 @@ const optionsEnv = ref([
 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 delFileIn(){
+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 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 = {
-        filePath:formJi.value.mdInFile
+      mdid:parForm.value.mdid
     }
-    proxy.$modal.confirm('是否确认文件?').then(function () {
-    return delFile(par);
-    }).then(() => {
-        formJi.value.mdInName = ''
-        proxy.$modal.msgSuccess("删除成功");
-    }).catch(() => {});
-}
-function delFileOut(){
-    
+    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(){
-  var par = {
-        filePath:formJi.value.mdOutFile
-    }
   proxy.$modal.confirm('是否确认删除所有参数?').then(function () {
     return delAllPar(parForm.value.mdid);
   }).then(() => {
-    formJi.value.mdOutName = ''
+    tableDataCan.value = []
     proxy.$modal.msgSuccess("删除成功");
   }).catch(() => {});
 }
 function saveChangePar(){
-  tableDataCan.value.forEach((item, index, array) => { 
+  tableDataCanAll.value.forEach((item, index, array) => { 
       item.mdid = parForm.value.mdid
-      item.parGroup = 'def'
       item.parCate = 'int'
   })
-  changePar(tableDataCan.value).then(res=>{
+  changePar(tableDataCanAll.value).then(res=>{
     if(res.code===200){
       proxy.$modal.msgSuccess("修改成功");
       dialogVisiblePei.value = false
@@ -852,9 +1052,9 @@ function saveChangePar(){
 }
 async function showPei(row){
   dialogVisiblePei.value = true
+  parRow.value = row
   var par = {
-    mdid:row.mdid,
-    devkind:'SYS'
+    mdid:row.mdid
   }
   await getModelParList(par).then(res=>{
     groupTreeData.value = res.data
@@ -870,11 +1070,19 @@ async function showPei(row){
   
   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){
+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
@@ -889,8 +1097,11 @@ function showDe(row){
 }
 function addCan(){
   tableDataCan.value.push({
-    mdid:parForm.value.mdid
+    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
@@ -951,6 +1162,7 @@ async function subEdit(){
           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("修改成功");
@@ -970,6 +1182,7 @@ async function submit(){
           formJi.value.devlang = elseLan.value
         }
         delete formJi.value.msort
+        formJi.value.devkind = 'SYS'
         addModel(formJi.value).then(res=>{
         if(res.code===200){
           proxy.$modal.msgSuccess("新增成功");
@@ -1003,7 +1216,6 @@ async function handleFileSuccess1(response, file, fileList){
 async function handleFileSuccess(response, file, fileList){
   formJi.value.mdInFile = response.originalFilename
   formJi.value.mdInName = response.fileName
-  formJi.value.devkind = 'SYS'
   await formRefJi.value.validate((valid) => {
     if(valid){
         if(formJi.value.devlang==='1'){
@@ -1021,6 +1233,9 @@ async function handleFileSuccess(response, file, fileList){
     }
   });
 };
+function clearFromTree(){
+  formTree.value = {}
+}
 function clearForm(){
   tableDataCan.value = []
   activeName.value = 'first'
@@ -1064,8 +1279,7 @@ function getModelListTable(){
     pageNum:1,
     pageSize:20,
     name:name.value,
-    mdUnit:mdUnit.value,
-    devkind:'SYS'
+    mdUnit:mdUnit.value
   }
   getModelList(par).then(res=>{
     tableData.value = res.rows
@@ -1177,4 +1391,10 @@ const seledMo = ['primary','plain','plain','plain','plain','plain','plain']
   align-items: center; /* 垂直居中 */
   gap: 8px;            /* 图标与文字间距 */
 }
+:deep(.svg-icon) {
+  outline: none;
+}
+:deep(.svg-icon svg) {
+  stroke: none;
+}
 </style>

+ 6 - 1
ruoyi-ui/src/views/register/componentReg/index.vue

@@ -41,7 +41,7 @@
         <el-table-column prop="enname" label="英文名称">
         </el-table-column>
         <el-table-column prop="className" label="模型类型" width="160"/>
-        <el-table-column prop="mdUnit" 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>
@@ -98,6 +98,11 @@
                       </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="开发语言:">

+ 3 - 3
ruoyi-ui/src/views/register/modelData/dataJi.vue

@@ -131,10 +131,10 @@
     </template>
   </el-dialog>
   <el-dialog @close=""  v-model="dialogVisibleTree" title="配置管理" width="50%" destroy-on-close :key="tableKey">
-    <div style="margin-top: 2%;">
+    <div style="margin-top:0%;">
       <div style="display: flex;justify-content: space-between;align-items: center;">
         <div style="display: flex;justify-content: flex-end;width: 100%;margin-right: 2%;">
-          <el-button  @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增参数</el-button>
+          <el-button  @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增字段</el-button>
         </div>
       </div>
       <div>
@@ -398,7 +398,7 @@ function addCanAdd(){
         dcCode:currentNodeKey.value,
         metaTable:parMeta.value.metaTable,
     }
-    tableDataCanAdd.value.push(par)
+    tableDataCanAdd.value.push(par) 
 }
 function delCanAdd(index){
   if(tableDataCanAdd.value.length===1){

+ 599 - 0
ruoyi-ui/src/views/register/modelData/dataJiDe.vue

@@ -0,0 +1,599 @@
+<template>
+  <div style="width: 99%;display: flex;margin-left: 1%;background-color:#F5F8F9;;">
+    <el-card style="width: 18%;height: 100%;overflow: auto;height: 85vh;background-color: white;overflow-x: hidden;" shadow="never">
+      <template #header>
+      <div class="card-header" style="display: flex;align-items: center;justify-content: space-between;">
+        <span>数据集:</span>
+      </div>
+    </template>
+      <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft" 
+      :data="data" @node-click="handleNodeClick" node-key="id" style="margin-left: -10%;margin-top: 0%;width: 120%;background-color: transparent;" default-expand-all :key="valueKet">
+          <template #default="{ node, data }">
+            <span  style="justify-content: space-between;display: flex;width: 30%;align-items: center;margin-left: 1%;">
+              <div class="custom-tree-node" style="align-items: center;line-height: 1.5;">
+                <svg-icon icon-class="model"  v-if="data.nodeType=='SET'"/>
+                <svg-icon icon-class="model2"  v-if="data.nodeType=='TREE'"/>
+                <span style="font-size: 1rem;">{{ node.label }}</span>
+              </div>
+              <div style="margin-right: 1%;position: absolute;left:90%;">
+                <el-dropdown trigger="hover" @click.stop v-if="currentNodeKey === data.id">
+                    <!-- <el-icon class="el-icon--right" style="color: black;">
+                      <plus />
+                    </el-icon> -->
+                    <svg-icon icon-class="zhankai"/>
+                  <template #dropdown>
+                    <el-dropdown-menu>
+                      <el-dropdown-item style="display: flex;" @click="add1Level">
+                        <el-icon class="el-icon--right" style="color: black;">
+                          <CirclePlus />
+                        </el-icon>
+                        <div>
+                          添加同级
+                        </div>
+                      </el-dropdown-item>
+                      <el-dropdown-item style="display: flex;"  @click="addNextLevel">
+                        <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="delAll" 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>
+    </el-card>
+    <div style="width: 80%;margin-left: 1%;background-color: white;">
+        <div style="display: flex;justify-content: space-between;width: 100%;align-items: center;margin-left: 0%;padding: 1%;">
+            <div style="display: flex;width: 50%;align-items: center;">
+                <div>
+                    名称
+                </div>
+                <el-input size="mini" v-model="dcName" style="width: 30%;margin-left: 1%;"/>
+                <el-button type="primary" @click="getTable" size="mini" style="margin-left:1%;">查询</el-button>
+            </div>
+            <el-button type="primary" @click="showAdd" size="mini" style="margin-left:1%;" :disabled="!parTree">新增</el-button>
+        </div>
+      <el-table 
+        :data="tableData" 
+        style="width: 99%;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 
+        :height="tableheight">
+        <el-table-column prop="address" label="操作" width="250">
+            <template #default="scope">
+                <div style="display: flex;justify-content: space-between;width: 100%;">
+                    <el-button type="primary" @click="showPei(scope.row)" size="mini" text style="margin-left: 0%;">数据项配置</el-button>
+                    <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left:0%;">编辑</el-button>
+                    <el-button @click="delRow(scope.row)" type="danger" text size="mini" style="margin-left: 0%;">删除</el-button>
+                </div>
+            </template>
+        </el-table-column>
+      </el-table>
+      <div style="float: right;margin-top: 0.5%;margin-right: 1%;">
+          <!-- <el-pagination
+            small
+            v-model='currentPage'
+            @current-change="changePage"
+            background
+            layout="prev, pager, next"
+            :total="total"
+            class="mt-4"
+          /> -->
+        </div>
+    </div>
+  </div>
+  <el-dialog :title="title" @close="clearForm" v-model="dialogVisible" title="" width="30%"  destroy-on-close :key="tableKey">
+    <el-form :label-width="140" label-position="right" :disabled="isEdit" style="margin-left: 5%;margin-top: 2%;"  :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
+      <el-form-item label="数据集中文名:" prop="dcName" style="">
+        <el-input v-model="formZu.dcName" style="width: 75%;" placeholder=""  resize="none"/>
+      </el-form-item>
+      <el-form-item label="数据集说明:" prop="dcNote" style="">
+        <el-input v-model="formZu.dcNote" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
+      </el-form-item>
+      <el-form-item label="数据集类型:" prop="dcType" style="">
+        <el-input v-model="formZu.dcType" style="width: 75%;" placeholder="" type="" :row="2" resize="none"/>
+      </el-form-item>
+      <el-form-item label="排序:" prop="dcSort">
+        <el-input-number v-model="formZu.dcSort" :min="1" style="width: 50%;"/>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="dialogVisible = false">取消</el-button>
+        <el-button v-if="isAddTa" type="primary" @click="addTa" size="mini">
+          提交
+        </el-button>
+        <el-button v-if="!isAddTa" type="primary" @click="saveEditTa" size="mini">
+          提交
+        </el-button>
+      </span>
+    </template>
+  </el-dialog>
+  <el-dialog @close=""  v-model="dialogVisibleTree" title="配置管理" width="50%" destroy-on-close :key="tableKey">
+    <div style="margin-top: 2%;">
+      <div style="display: flex;justify-content: space-between;align-items: center;">
+        <div style="display: flex;justify-content: flex-end;width: 100%;margin-right: 2%;">
+          <el-button  @click="addCanAdd" style="margin-top: 0%;" type="success" size="mini" plain>新增参数</el-button>
+        </div>
+      </div>
+      <div>
+          <el-table 
+          style="margin-top: 1%;width: 98%;"
+          :data="tableDataCanAdd" 
+          :cell-style="{ textAlign: 'center',padding:'2px 0' }"
+          :header-cell-style="{ textAlign: 'center'}"
+          :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+          border >
+              <el-table-column prop="itemName" label="字段编码" width="200">
+                  <template #default="scope">
+                      <el-input placeholder="(必填)" type="primary" class="noBor" v-model="scope.row.fieldCode" size="mini" text style="margin-left: 0%;"></el-input>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="itemName" label="字段名称">
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.fieldName" size="mini" text style="margin-left: 0%;"></el-input>
+                      </div>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="itemName" label="字段类型">
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.metaType" size="mini" text style="margin-left: 0%;"></el-input>
+                      </div>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="itemName" label="长度" >
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-input type="primary" class="noBor" v-model="scope.row.fieldLength" size="mini" text style="margin-left: 0%;"></el-input>
+                      </div>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="itemName" label="默认值" >
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-input type="primary" class="noBor" v-model="scope.row.fieldDefault" size="mini" text style="margin-left: 0%;"></el-input>
+                      </div>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="itemName" label="说明" >
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-input type="primary" class="noBor" v-model="scope.row.fieldDesc" size="mini" text style="margin-left: 0%;"></el-input>
+                      </div>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="itemName" label="主键" width="80">
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-checkbox v-model="scope.row.fieldIspri" label="" size="large" />
+                      </div>
+                  </template>
+              </el-table-column>
+              <el-table-column prop="address" label="操作" width="100">
+                  <template #default="scope">
+                      <div style="width: 100%;">
+                          <el-button type="danger" @click="delCanAdd(scope.$index)" size="mini" text style="margin-left: 0%;">删除</el-button>
+                      </div>
+                  </template>
+              </el-table-column>
+          </el-table>
+          
+      </div>
+  </div>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="dialogVisibleTree = false">取消</el-button>
+        <el-button type="primary" @click="addPei" size="mini">
+          提交
+        </el-button>
+      </span>
+    </template>
+  </el-dialog>
+  <el-dialog @close="clearForm" v-model="dialogVisibleData" title="新增数据项" width="30%"  destroy-on-close :key="tableKey">
+    <el-form :label-width="100" label-position="right" :disabled="isEdit" style="margin-left: 5%;margin-top: 2%;"  :model="formTree" class="demo-form-inline" ref="formRefTree" :rules="rulesTree">
+      <el-form-item label="名称:" prop="itemName" style="">
+        <el-input v-model="formTree.itemName" style="width: 75%;" placeholder=""  resize="none"/>
+      </el-form-item>
+      <el-form-item label="说明:" prop="itemNotes">
+        <el-input v-model="formTree.itemNotes" style="width: 75%;" placeholder=""  resize="none"/>
+      </el-form-item>
+      <el-form-item label="排序:" prop="itemNo">
+        <el-input-number v-model="formTree.itemNo" :min="1" style="width: 50%;"/>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="dialogVisibleData = false">取消</el-button>
+        <el-button type="primary" @click="addataXiang" size="mini">
+          提交
+        </el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script   setup>
+import { reactive } from 'vue'
+import { Plus } from '@element-plus/icons-vue'
+import { cateTree,addCate,delCate,fieldAll,addSet,dataSetList,editSet,fieldAdd,delField  } from "@/api/register/regCom.js";
+import { ref, onMounted, onUnmounted, nextTick } from 'vue';
+const { proxy } = getCurrentInstance();
+const data =  ref([])
+const title =  ref([])
+const titleTree =  ref([])
+const dialogVisibleData = ref(false)
+const currentPage =  ref(1)
+const total =  ref(1)
+const tableData = ref([])
+const tableheight = window.innerHeight*0.78
+const heightAll = window.innerHeight
+const dialogVisible = ref(false)
+const dialogVisibleTree = ref(false)
+const isAdd = ref(false)
+const isAddTa = ref(false)
+const treeId = ref('');
+const dcName =ref()
+const parDel = ref({})
+const parTree = ref({})
+const formZu = ref({
+  cateId:'',
+  dcName:'',
+  dcType:'',
+  dcSort:1,
+  dcNote:''
+});
+const currentNodeKey = ref('')
+const rulesZu = reactive({
+  dcName: [{ required: true, message: '必填', trigger: 'blur' }],
+  dcType: [{ required: true, message: '必填', trigger: 'blur' }],
+  dcSort: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefZu = ref();
+const tableDataCanAdd = ref([])
+const formTree = ref({
+  itemName:'',
+  itemNo:'',
+  itemNotes:'',
+});
+const parMeta = ref({})
+const rulesTree = reactive({
+  itemName: [{ required: true, message: '必填', trigger: 'blur' }],
+  itemNo: [{ required: true, message: '必填', trigger: 'blur' }]
+});
+const formRefTree = ref();
+const parDscode = ref('')
+const parLev = ref(1)
+
+function delAll(){
+    proxy.$modal.confirm('是否确认删除?').then(function () {
+        return delCate(parTree.value.id);
+    }).then(() => {
+        getTree();
+        proxy.$modal.msgSuccess("删除成功");
+    }).catch(() => {});
+}
+function addataXiang(){
+    if(parLev.value===1){
+        formTree.value.catePid = parTree.value.pid
+    }
+    else{
+        formTree.value.catePid = parTree.value.id
+    }
+    addCate(formTree.value).then(res=>{
+        if(res.code===200){
+            proxy.$modal.msgSuccess("修改成功");
+            getTree()
+            dialogVisibleData.value = false
+        }
+    })
+}
+function add1Level(){
+    parLev.value = 1
+    dialogVisibleData.value = true
+}
+function addNextLevel(){
+    parLev.value = 2
+    dialogVisibleData.value = true
+}
+function addPei(){
+tableDataCanAdd.value.forEach((item, index, array)=>{
+    if(item.fieldIspri===true){
+      item.fieldIspri = '1'
+    }
+    if(item.fieldIspri===false){
+      item.fieldIspri = '2'
+    }
+    if(!item.fieldCode){
+      array.splice(index, 1)
+    }
+  })
+  if(tableDataCanAdd.value.length===0){
+    var par = {
+      dcCode:currentNodeKey.value,
+      metaTable:parMeta.value.metaTable,
+      fieldCode:parDel.value.fieldCode
+    }
+    delField(par).then(res=>{
+      if(res.code===200){
+        proxy.$modal.msgSuccess("修改成功");
+        getTable()
+        dialogVisibleTree.value = false
+      }
+    })
+  }
+  else{
+    fieldAdd(tableDataCanAdd.value).then(res=>{
+      if(res.code===200){
+        proxy.$modal.msgSuccess("修改成功");
+        getTable()
+        dialogVisibleTree.value = false
+      }
+    })
+  }
+  
+}
+function showPei(row){
+  dialogVisibleTree.value = true
+  parMeta.value = row
+  var par = {
+    dsCode:parDscode.value,
+    metaTable:row.metaTable,
+  }
+  getMetaFiele(par).then(res=>{
+    tableDataCanAdd.value = res.data
+    tableDataCanAdd.value.forEach(item=>{
+    if(item.fieldIspri==='1'){
+      item.fieldIspri = true
+    }
+    if(item.fieldIspri==='2'){
+      item.fieldIspri = false 
+    }
+  })
+  })
+}
+function clearForm(){
+  formTree.value = {
+    dsTitle:'',
+    dsType:'',
+    dsDbname:'',
+    dsIp:'',
+    dsPort:'',
+    dsUser:'',
+    dsPass:'',
+    dsNode:'',
+  }
+  formZu.value = {
+    metaTable:'',
+    dcName:'',
+    metaType:'',
+    metaNote:'',
+    metaSort:1,
+  }
+  tableDataCanAdd.value = []
+}
+function addCanAdd(){
+    var par = {
+        dcCode:currentNodeKey.value,
+        metaTable:parMeta.value.metaTable,
+    }
+    tableDataCanAdd.value.push(par)
+}
+function delCanAdd(index){
+  if(tableDataCanAdd.value.length===1){
+    parDel.value = tableDataCanAdd.value[0]
+  }
+  tableDataCanAdd.value.splice(index, 1)
+}
+function getTable(){
+  var par = {
+    dcCode:currentNodeKey.value,
+  }
+  dataSetList(par).then(res=>{
+    tableData.value = res.rows
+  })
+}
+function showAdd(){
+  isAddTa.value = true
+  title.value = '新增'
+  dialogVisible.value = true
+}
+function showEdit(row){
+  isAddTa.value = false
+  title.value = '编辑'
+  dialogVisible.value = true
+  formZu.value = row
+}
+function showAddTree(){
+  isAdd.value = true
+  titleTree.value = '新增节点'
+  dialogVisibleTree.value = true
+}
+function clearFromTree(){
+  formTree.value = {
+    itemName:'',
+    catePid:'',
+    itemNo:'',
+    itemNotes:''
+  }
+}
+function getTree(){
+  cateTree().then(res=>{
+    data.value = res.data
+    data.value.forEach(item=>{
+      item.value = item.id
+      item.id = item.id
+    })
+  })
+}
+function addTa(){
+  formRefZu.value.validate(async (valid) => {
+      if(valid){
+        formZu.value.dcCode = currentNodeKey.value
+        await addSet(formZu.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("新增成功");
+          getTable()
+          dialogVisible.value = false
+        }
+      })
+    }
+  }); 
+}
+function saveEditTa(){
+  formRefZu.value.validate(async (valid) => {
+      if(valid){
+        editSet(formZu.value).then(res=>{
+        if(res.code===200){
+            proxy.$modal.msgSuccess("修改成功");
+            dialogVisible.value = false
+            getTable()
+        }
+    })
+    }
+  });
+  
+}
+function delRow(row) {
+  var par = {
+    dsCode:parDscode.value,
+    metaTable:row.metaTable
+  }
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    return delMeta(par);
+  }).then(() => {
+    getTable();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+};
+async function addTree(){
+  formRefTree.value.validate(async (valid) => {
+    await addDataCate(formTree.value).then(res=>{
+      if(res.code===200){
+        proxy.$modal.msgSuccess("新增成功");
+        getTree()
+        dialogVisibleTree.value = false
+      }
+    })
+  });
+}
+function saveEditTree(){
+  editCate(formTree.value).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("修改成功");
+      dialogVisibleTree.value = false
+      getTree()
+    }
+  })
+}
+function handleNodeClick(node, data){
+    currentNodeKey.value = data.data.id
+    parTree.value = data.data
+    getTable()
+}
+function delTree(node, data) {
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    return delCate(data.id);
+  }).then(() => {
+    getTree();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+};
+function editTree(node, data){
+  console.log(data)
+  titleTree.value = '编辑'
+  isAdd.value = false
+  dialogVisibleTree.value = true
+  getCateDe(data.id).then(res=>{
+    formTree.value = res.data
+  })
+  console.log(node, data)
+}
+onMounted(() => {
+//   getTree()
+  // getTable()
+});
+
+</script>
+<style scoped>
+:deep(.svg-icon) {
+  outline: none;
+}
+:deep(.svg-icon svg) {
+  stroke: none;
+}
+:deep(.el-tree-node__expand-icon) {
+  margin-left:5%; /* 向右推动图标 */
+}
+:deep(.el-table__body tr:hover > td) {
+  background-color: #eaf7ff !important;
+}
+ :deep(.treeLeft) .el-tree-node__content {
+  width: 100%;
+  display: flex !important;
+  height: 30px !important;
+  align-items: center;
+  padding-top: 0 !important;
+}
+:deep(.treeLeft) .el-tree-node__content:hover {
+  background-color: #ecf5ff;
+}
+:deep(.treeLeft) .el-tree-node__content:active {
+    background-color: #d9ecff !important;
+  }
+
+  /* 选中态(Active) */
+:deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
+    background-color: #c6e2ff !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: 6px;            /* 图标与文字间距 */
+}
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center; 
+  justify-content: space-between;
+  font-size: 14px;
+  padding-right: 8px;
+}
+</style>

+ 3 - 1
ruoyi-ui/src/views/register/modelData/index.vue

@@ -10,7 +10,7 @@
                   <svg-icon icon-class="model" style="color: #13E03B;;width: 1.5rem;height:1.5rem;" v-if="data.label=='数据集(编辑)'"/>
                   <svg-icon svg-icon icon-class="cate" style="color: red;;width: 1.5rem;height:1.5rem;" v-if="data.label=='元数据'"/>
                   <svg-icon icon-class="流程图" style="color: red;;width: 1.5rem;height:1.5rem;" v-if="data.label=='流程图'"/>
-                  <svg-icon icon-class="流程图" style="color: red;;width: 1.5rem;height:1.5rem;" v-if="data.label=='数据集(查看)'"/>
+                  <svg-icon icon-class="shujuji" style="color: red;;width: 1.5rem;height:1.5rem;" v-if="data.label=='数据集(查看)'"/>
                 <span style="font-size: 1rem;">{{ node.label }}</span>
               </div>
             </span>
@@ -22,6 +22,7 @@
         <metaData :data="dataSourceData" v-if="currentNodeKey =='2'"/>
         <dataJi :data="dataSourceData" v-if="currentNodeKey =='3'"/>
         <liucheng v-if="currentNodeKey =='4'"/>
+        <dataJiDe v-if="currentNodeKey =='5'"/>
     </div>
   </div>
 </template>
@@ -31,6 +32,7 @@ import dataSource from './dataSource.vue';
 import metaData from './metaData.vue';
 import dataJi from './dataJi.vue';
 import liucheng from './liucheng.vue';
+import dataJiDe from './dataJiDe.vue';
 import { ref, onMounted, onUnmounted, nextTick } from 'vue';
 const { proxy } = getCurrentInstance();
 const data =  ref([

+ 1 - 0
ruoyi-ui/src/views/register/modelData/metaData.vue

@@ -338,6 +338,7 @@ function showPei(row){
   var par = {
     dsCode:parDscode.value,
     metaTable:row.metaTable,
+    fieldCode:row.fieldCode
   }
   getMetaFiele(par).then(res=>{
     tableDataCanAdd.value = res.data