nanjingliujinyu 6 месяцев назад
Родитель
Сommit
8346fdb0b6

+ 4 - 0
ruoyi-ui/package.json

@@ -27,6 +27,7 @@
     "fuse.js": "6.6.2",
     "js-cookie": "3.0.5",
     "jsencrypt": "3.3.2",
+    "json-editor-vue3": "^1.1.1",
     "moment": "^2.30.1",
     "nprogress": "0.2.0",
     "ol": "^10.2.1",
@@ -35,11 +36,14 @@
     "vue": "3.4.31",
     "vue-cropper": "1.1.1",
     "vue-draggable-plus": "^0.6.0",
+    "vue-json-editor": "^1.4.3",
+    "vue-json-viewer": "^3.0.4",
     "vue-router": "4.4.0",
     "vue3-treeselect": "^0.1.10",
     "vuedraggable": "^4.1.0"
   },
   "devDependencies": {
+    "@originjs/vite-plugin-commonjs": "^1.0.3",
     "@vitejs/plugin-vue": "5.0.5",
     "sass": "1.77.5",
     "unplugin-auto-import": "0.17.6",

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

@@ -12,9 +12,10 @@
         </div>
       </el-col>
       <el-col :span="14">
-        <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper" style="margin-left: 5%;">
+        <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper" style="margin-left: 6%;">
           <el-menu
               :default-active="activeMenu"
+              style="margin-top: 1%;"
               :collapse="isCollapse"
               :background-color="sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground"
               :text-color="sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor"
@@ -24,6 +25,7 @@
               mode="horizontal"
           >
             <sidebar-item
+                style="margin-top: -0.5%;"
                 v-for="(route, index) in sidebarRouters"
                 :key="route.path + index"
                 :item="route"

+ 3 - 0
ruoyi-ui/src/main.js

@@ -51,6 +51,8 @@ import TreeSelect from "@/components/TreeSelect";
 // 字典标签组件
 import DictTag from "@/components/DictTag";
 import * as echarts from 'echarts';
+import JsonViewer from 'vue-json-viewer'
+import 'vue-json-viewer/style.css'
 
 const app = createApp(App);
 
@@ -76,6 +78,7 @@ app.component("RightToolbar", RightToolbar);
 app.component("Editor", Editor);
 
 app.use(router);
+app.use(JsonViewer)
 app.use(store);
 app.use(plugins);
 app.use(elementIcons);

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

@@ -335,7 +335,7 @@ onMounted(() => {
 .custom-tree-node {
   flex: 1;
   display: flex;
-  align-items: center;
+  align-items: center; 
   justify-content: space-between;
   font-size: 14px;
   padding-right: 8px;

+ 930 - 393
ruoyi-ui/src/views/service/info/index.vue

@@ -1,421 +1,958 @@
 <template>
-  <div style="margin-left: 1%;padding-top: 1%;" :style="{'height':heightAll+'px'}">
-    <el-row class="box">
-      <!-- 筛选条件 -->
-      <el-form ref="formRef" :inline="true" size="mini" :model="query.data">
-        <el-form-item label="服务名称">
-          <el-input v-model="query.data.name"></el-input>
-        </el-form-item>
-<!--        <el-form-item label="所属部门">-->
-<!--          <el-input v-model="query.data.unitName"></el-input>-->
-<!--        </el-form-item>-->
-        <el-form-item label="所属模型">
-          <el-input v-model="query.data.unitName"></el-input>
-        </el-form-item>
-        <el-form-item label="服务状态">
-          <el-select clearable v-model="query.data.applyState" style="width:100px;">
-            <el-option label="待审核" value="0"></el-option>
-            <el-option label="同意" value="1"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button
-            type="primary"
-            @click="getList"
-            icon="Search"
-          >搜索</el-button>
-        </el-form-item>
-      </el-form>
-    </el-row>
-    <el-row class="box">
-      <el-button
-        @click="saveService"
-        size="small"
-        type="primary"
-        plain
-        v-hasPermi="['service:info:add']"
-      >
-        添加服务
-      </el-button>
-    </el-row>
-    <el-row class="table_box">
-      <el-table
-        stripe
-        :data="tableData"
-        :height="tableHeight"
-        style="width: 100%"
-        size="small"
-        :row-class-name="tableRowClassName"
-        :header-cell-style="{
-          background: '#ebf3fb',
-          color: '#333',
-          padding: '4px 0',
-          'border-right': '1px solid #fff',
-        }"
-      >
-        <el-table-column type="expand">
-          <template #default="prop">
-            <el-table :data="prop.row.detail1">
-              <el-table-column label="服务名称" prop="name" />
-              <el-table-column label="服务类型" prop="type" />
-              <el-table-column label="服务地址" prop="url" />
-              <el-table-column label="请求方式" prop="rqtype" />
-              <!-- <el-table-column label="调用次数" prop="cnt" /> -->
-              <el-table-column label="发布时间" prop="rlstm" />
-              <el-table-column
-                show-overflow-tooltip
-                header-align="center"
-                align="center"
-                width="60"
-                prop="status"
-                label="状态"
-              >
-                <template #default="scope">
-                  <el-tag
-                    :type="scope.row.status === '1' ? 'success' : 'warning'"
-                    disable-transitions
-                  >
-                    {{ scope.row.status === "1" ? "启用" : "停用" }}
-                  </el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column fixed="right" align="center" label="操作" width="220">
-                <template #default="scope">
-                  <el-button
-                    :type="scope.row.status == 1 ? 'warning' : 'primary'"
-                    v-hasPermi="['service:info:status']"
-                    @click="updateStatus(scope.row)"
-                    size="mini"
-                  >
-                    {{ scope.row.status == 1 ? "停用" : "启用" }}
-                  </el-button>
-                  <el-button
-                    v-hasPermi="['service:info:update']"
-                    @click="saveService(scope.row)"
-                    size="mini"
-                  >
-                    编辑
-                  </el-button>
-                  <el-button
-                    type="danger"
-                    @click="handleDelete(scope.row)"
-                    v-hasPermi="['service:info:delete']"
-                    size="mini"
-                  >
-                    删除
-                  </el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-          </template>
-        </el-table-column>
-        <el-table-column type="index" align="center" label="序号" width="50"/>
-        <el-table-column label="服务名称" prop="name" />
-      </el-table>
-      <!-- <el-table
-        stripe
-        :data="tableData"
-        :height="tableHeight"
-        style="width: 100%"
-        size="small"
-        :row-class-name="tableRowClassName"
-        :header-cell-style="{
-          background: '#ebf3fb',
-          color: '#333',
-          padding: '4px 0',
-          'border-right': '1px solid #fff',
-        }"
-      >
-        <el-table-column type="index" align="center" label="序号" :index="1"/>
-        <el-table-column
-          show-overflow-tooltip
-          v-for="(param, index) in paramList"
-          :key="index"
-          header-align="center"
-          :align="param.align ? param.align : 'center'"
-          :width="param.width ? param.width : 'auto'"
-          :prop="param.paramCode"
-          :label="param.paramName"
+  <div style="width: 100%;;display: flex;">
+    <div style="width: 15%;;background-color: #F2F6FC;">
+      <div style="display: flex;padding-top: 1%;padding-top: 5%;">
+        <el-input
+          v-model="input2"
+          style="width:60%;margin-left: 5%;background-color: #ebeef5;"
+          class="w-50 m-2"
+          :prefix-icon="Search" 
         />
-        <el-table-column
-          show-overflow-tooltip
-          header-align="center"
-          align="center"
-          width="60"
-          prop="status"
-          label="状态"
-        >
-          <template #default="scope">
-            <el-tag
-              :type="scope.row.status === '1' ? 'success' : 'warning'"
-              disable-transitions
-            >
-              {{ scope.row.status === "1" ? "启用" : "停用" }}
-            </el-tag>
+        <!-- <el-button style="margin-left: 2%;width: 10%;background-color: #F7F7F7" :icon="Filter"/> -->
+        <el-button type="primary" @click="showAdd" style="margin-left: 5%;width: 10%;" :icon="Plus"/>
+      </div>
+      <!-- <Plus style="width: 1em; height: 1em; margin-left:90%;cursor: pointer;color: #337ecc;" @click="showAddTree"/> -->
+      <el-tree class="treeLeft" :data="data" @node-click="handleNodeClick" node-key="id" style="margin-left: 5%;margin-top: 5%;width: 90%;background-color: transparent;" default-expand-all :key="valueKet">
+          <template #default="{ node, data }">
+            <span class="custom-tree-node">
+              <el-icon v-if="data.children"><Folder /></el-icon>
+              <div v-if="!data.children">
+                <el-tag v-if="data.label=='父级2'" class="ml-2" type="success">GET</el-tag>
+                <el-tag v-if="data.label=='父级1'" class="ml-2">PUT</el-tag>
+                <!-- <el-tag class="ml-2" type="warning">POST</el-tag>
+                <el-tag class="ml-2" type="danger">DEL</el-tag> -->
+              </div>
+              <span>{{ node.label }}</span>
+            </span>
           </template>
-        </el-table-column>
-        <el-table-column fixed="right" align="center" label="操作" width="220">
-          <template #default="scope">
-            <el-button
-              :type="scope.row.status == 1 ? 'warning' : 'primary'"
-              v-hasPermi="['service:info:status']"
-              @click="updateStatus(scope.row)"
-              size="mini"
-            >
-              {{ scope.row.status == 1 ? "停用" : "启用" }}
-            </el-button>
-            <el-button
-              v-hasPermi="['service:info:update']"
-              @click="saveService(scope.row)"
-              size="mini"
-            >
-              编辑
-            </el-button>
-            <el-button
-              type="danger"
-              @click="handleDelete(scope.row)"
-              v-hasPermi="['service:info:delete']"
-              size="mini"
-            >
-              删除
-            </el-button>
+        </el-tree>
+    </div>
+    <div style="width: 84%;margin-left: 1%;" class="tab-container">
+        <el-tabs style="" v-model="activeName" class="demo-tabs" @tab-click="handleClick" >
+            <el-tab-pane label="查看" name="first" style="">
+              <div style="height: 80vh;overflow: auto;">
+                <div style="display: flex;align-items: center;justify-content: space-between;">
+                    <div style="margin-left:1%;">修改数据项分类管理</div>
+                    <div style="display: flex;">
+                        <el-button type="primary" size="mini" :icon="Promotion">运行</el-button>
+                        <el-button type="" size="mini">删除</el-button>
+                    </div>
+                </div>
+                <div style="display: flex;align-items: center;margin-left:1%;margin-top: 1%;">
+                    <el-tag type="primary" size="mini">PUT</el-tag>
+                    <div style="margin-left: 0.5%;">
+                        /data/cate
+                    </div>
+                    <div style="margin-left: 0.5%;">
+                        <el-select class="transparent-select" v-model="valueSta" style="border-color: transparent;width: 100px;">
+                            <el-option
+                            v-for="item in options"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                            >
+                            <div class="flex items-center" style="display: flex;align-items: center;">
+                                <div v-if="item.label=='开发中'" style="width: 5px; height: 5px; background-color: #409EFF; border-radius: 50%;"></div>
+                                <div v-if="item.label=='运行中'" style="width: 5px; height: 5px; background-color: #67C23A; border-radius: 50%;"></div>
+                                <span style="margin-left:1%;">{{ item.label }}</span>
+                            </div>
+                            </el-option>
+                            <template #prefix>
+                                <div class="flex items-center" style="display: flex; align-items: center;">
+                                    <div v-if="valueSta && options.find(opt => opt.value === valueSta)?.label === '开发中'" 
+                                        style="width: 5px; height: 5px; background-color: #409EFF; border-radius: 50%; margin-right: 4px;"></div>
+                                    <div v-if="valueSta && options.find(opt => opt.value === valueSta)?.label === '运行中'" 
+                                        style="width: 5px; height: 5px; background-color: #67C23A; border-radius: 50%; margin-right: 4px;"></div>
+                                    <span>{{ valueSta ? options.find(opt => opt.value === valueSta)?.label : '请选择' }}</span>
+                                </div>
+                            </template>
+                        </el-select>
+                    </div>
+                </div>
+                <div style="display: flex;width: 100%;">
+                    <div style="display: flex;margin-left: 1%;font-size: 15px;color:#909399;width:100% ;">
+                        <div>
+                            服务分类:
+                        </div>
+                        <div style="margin-left: 0.5%;">
+                            2025年7月25日
+                        </div>
+                        <div style="margin-left: 5%;">
+                            服务名称:
+                        </div>
+                        <div style="margin-left: 0.5%;">
+                            2025年7月25日
+                        </div>
+                        <div style="margin-left: 5%;">
+                            接口地址:
+                        </div>
+                        <div style="margin-left: 0.5%;">
+                            几秒前
+                        </div>
+                        <div style="margin-left: 5%;">
+                            请求方式:
+                        </div>
+                        <div style="margin-left: 0.5%;">
+                            秦素衣
+                        </div>
+                        <div style="margin-left: 5%;">
+                            接口格式:
+                        </div>
+                        <div style="margin-left: 0.5%;">
+                            朱得糠
+                        </div>
+                        <div style="margin-left: 5%;">
+                            返回格式:
+                        </div>
+                        <div style="margin-left: 0.5%;">
+                            数据项分类
+                        </div>
+                        
+                        
+                    </div>
+                </div>
+                <div style="margin-left: 1%;font-size: 15px;color:#909399;width:100%;display: flex;margin-top: 0.5%;">
+                    <div style="margin-left: 0%;">
+                        服务说明:
+                    </div>
+                    <div style="margin-left: 0.5%;">
+                        数据项分类
+                    </div>
+                </div>
+                <div style="margin-left: 1%;font-size: 15px;color:#909399;width:100%;display: flex;margin-top: 0.5%;">
+                    <div style="margin-left: 0%;">
+                        返回说明:
+                    </div>
+                    <div style="margin-left: 0.5%;">
+                        数据项分类
+                    </div>
+                </div>
+                <div style="margin-top: 2.5%;margin-left: 1%;">
+                    <div>请求参数</div>
+                    <el-table 
+                      style="margin-top: 1%;"
+                      :data="tableDataCan" 
+                      :cell-style="{ textAlign: 'center', }"
+                      :header-cell-style="{ textAlign: 'center'}"
+                      :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+                      border >
+                          <el-table-column prop="itemName" label="参数字段">
+                          </el-table-column>
+                          <el-table-column prop="itemName" label="参数名称">
+                          </el-table-column>
+                          <el-table-column prop="itemName" label="参数类型" width="100">
+                          </el-table-column>
+                          <el-table-column prop="itemName" label="参数说明">
+                          </el-table-column>
+                      </el-table>
+                </div>
+                <div style="margin-top: 2.5%;margin-left: 1%;">
+                    <div>返回响应</div>
+                    <el-tabs type="card" style="margin-top: 1%;">
+                        <el-tab-pane label="成功(200)">
+                            <div style="display: flex;align-items: center;line-height: 1.5;font-size: 14px;margin-left: 1%;color: #606266;">
+                                <div>HTTP状态码:</div>
+                                <div>200</div>
+                                <div style="margin-left: 5%;">内容格式:</div>
+                                <div>JSON</div>
+                            </div>
+                            <el-tree  :data="data" :props="defaultProps" @node-click="handleNodeClick" style="margin-top: 1%;margin-left: 2%;background-color: #F7F7F7;background-color: transparent;width: 15%;" default-expand-all>
+                                <template #default="{ node, data }">
+                                    <span style="display: flex;justify-content: space-between;width: 100%;align-items: center;">
+                                        <span>{{ node.label }}</span>
+                                        <span style="display: flex;align-items: center;">
+                                            <div style="color:#67C23A;">string</div>
+                                            <el-tooltip
+                                                class="box-item"
+                                                effect="light"
+                                                content="必填"
+                                                placement="top-start"
+                                            >
+                                                <el-button style="transform: scale(0.5);transform-origin: center;margin-left: 5%; " type="success" :icon="Check" circle size="mini" plain/>
+                                            </el-tooltip>
+                                        </span>
+                                    </span>
+                                </template>
+                            </el-tree>
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+                <div style="margin-top: 2.5%;margin-left: 1%;padding-bottom: 1%;">
+                    <div>响应示例</div><el-tabs type="card" style="margin-top: 1%;">
+                        <el-tab-pane label="成功示例">
+                             <div style="overflow: auto;height: 50vh">
+                                <json-viewer 
+                                    :value="data" 
+                                    :expand-depth="5" 
+                                    copyable 
+                                    theme="my-theme"
+                                />
+                             </div>
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+            
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="修改" name="second" style="">
+                <div style="overflow: auto;height: 80vh;">
+                    <el-form size="mini" :key="tableKey" style="margin-left: 0%;width: 98%;"  :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
+                        <el-form-item label="接口地址:" prop="enname" style=""> 
+                          <div style="display: flex;width: 100%;">
+                            <el-input
+                            v-model="input3"
+                            style="width: 70%;"
+                            placeholder=""
+                            class="input-with-select"
+                            >
+                            <template #prepend>
+                                <el-select v-model="select" placeholder="" style="width: 115px">
+                                    <el-option label="http://" value="1" />
+                                    <el-option label="https://" value="2" />
+                                </el-select>
+                            </template>
+                          </el-input>
+                          <el-button type="primary" @click="showAdd" style="margin-left: 20%;">提交</el-button>
+                          <el-button type="danger" @click="showAdd" style="margin-left: 1%;">删除</el-button>
+                          </div>
+                  </el-form-item>
+                      <el-row :gutter="48">
+                            <el-col :span="12">
+                                <el-form-item label="服务分类:" prop="name" style="">
+                                    <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>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="服务名称:" prop="version" style="">
+                                    <el-input v-model="formJi.version" :disabled="isEdit"/>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row :gutter="48">
+                            <el-col :span="12">
+                                <el-form-item label="接口格式:" prop="name" style="">
+                                    <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>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="请求方式:" prop="version" style="">
+                                    <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>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-form-item label="返回格式:" prop="version" style="">
+                            <el-input v-model="formJi.version" :disabled="isEdit"/>
+                        </el-form-item>
+                        <el-form-item label="组件简介:">
+                            <el-input v-model="formJi.intro" style="width: 100%;" :disabled="isEdit" :rows="2" resize="none" type="textarea"/>
+                        </el-form-item>
+                        <el-form-item label="组件简介:">
+                            <el-input v-model="formJi.intro" style="width: 100%;" :disabled="isEdit" :rows="2" resize="none" type="textarea"/>
+                        </el-form-item>
+                    </el-form>
+                    <div style="margin-top: 2%;">
+                        <div>
+                            请求参数
+                        </div>
+                        <div style="display: flex;justify-content: flex-end;margin-right: 2%;">
+                          <el-button  @click="addPa" style="margin-top: 1%;" type="success" size="mini" plain>新增参数</el-button>
+                        </div>
+                        <div>
+                            <el-table 
+                            style="margin-top: 1%;width: 98%;"
+                            :data="tableDataCan" 
+                            :cell-style="{ textAlign: 'center', }"
+                            :header-cell-style="{ textAlign: 'center'}"
+                            :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+                            border >
+                                <el-table-column prop="itemName" label="参数字段">
+                                    <template #default="scope">
+                                        <div style="width: 100%;">
+                                            <el-input type="primary"  v-model="scope.row.itemName" size="mini" text style="margin-left: 0%;border: transparent;"></el-input>
+                                        </div>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column prop="itemName" label="参数名称">
+                                    <template #default="scope">
+                                        <div style="width: 100%;">
+                                            <el-input type="primary" v-model="scope.row.itemName" 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" v-model="scope.row.itemName" size="mini" text style="margin-left: 0%;"></el-input>
+                                        </div>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column prop="itemName" label="参数说明" width="100">
+                                    <template #default="scope">
+                                        <div style="width: 100%;">
+                                            <el-input type="primary" v-model="scope.row.itemName" size="mini" text style="margin-left: 0%;"></el-input>
+                                        </div>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column prop="address" label="操作" width="222">
+                                    <template #default="scope">
+                                        <div style="width: 100%;">
+                                            <el-button type="danger" @click="delCan(scope.row)" size="mini" text style="margin-left: 0%;">删除</el-button>
+                                        </div>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                            
+                        </div>
+                    </div>
+                    <div style="margin-top: 2%;">
+                        <div>返回响应</div>
+                        <el-tabs type="card" style="margin-top: 1%;">
+                            <el-tab-pane label="成功">
+                                <div style="display: flex;align-items: center;line-height: 1.5;font-size: 14px;margin-left: 1%;color: #606266;">
+                                </div>
+                                <div style="display: flex; flex-direction: column;">
+                                    <!-- <el-tree  :data="data" :props="defaultProps" @node-click="handleNodeClick" style="margin-top: 1%;margin-left: 2%;background-color: #F7F7F7;background-color: transparent;width: 15%;" default-expand-all>
+                                        <template #default="{ node, data }">
+                                            <span style="display: flex;justify-content: space-between;width: 100%;align-items: center;">
+                                                <span><el-input v-model="node.label" size="mini"/></span>
+                                                <span style="display: flex;align-items: center;">
+                                                    <el-tooltip
+                                                        class="box-item"
+                                                        effect="light"
+                                                        content="是否必填"
+                                                        placement="top-start"
+                                                    >
+                                                    <el-checkbox v-model="checked1" label="" size="large" />
+                                                    </el-tooltip>
+                                                    <el-select
+                                                        v-model="formJi.type"
+                                                        :disabled="isEdit"
+                                                        style="width: 100%;margin-left: -1%;"
+                                                    >
+                                                        <el-option
+                                                        v-for="item in optionsType"
+                                                        :key="item.value"
+                                                        :label="item.label"
+                                                        :value="item.value"
+                                                        />
+                                                    </el-select>
+                                                    <el-tooltip
+                                                        class="box-item"
+                                                        effect="light"
+                                                        content="是否允许null"
+                                                        placement="top-start"
+                                                    >
+                                                    <el-checkbox v-model="checked1" label="" size="large" />
+                                                    </el-tooltip>
+                                                </span>
+                                            </span>
+                                        </template>
+                                    </el-tree> -->
+                                    <el-input :rows="8" type="textarea" v-model="titleTree" size="mini" text style="margin-left: 1%;width: 98%;" ></el-input>
+                                  </div>
+                            </el-tab-pane>
+                        </el-tabs>
+                    </div>
+                    <div style="margin-top: 2.5%;margin-left: 1%;padding-bottom: 1%;">
+                    <el-tabs type="card" style="margin-top: 1%;">
+                        <el-tab-pane label="成功示例">
+                             <div style="overflow: auto;height: 20vh;">
+                              <JsonEditorVue
+                                v-model="msgSu"
+                                style="height:100%;"
+                                :mode="'code'"
+                                :showBtns="false"
+                                :options="{
+                                  navigationBar: false, // 隐藏顶部导航栏
+                                  statusBar: false,     // 隐藏底部状态栏
+                                  mode: 'code',          // 仅保留代码编辑模式
+                                  mainMenuBar: false     // 隐藏主菜单栏
+                                }"
+                                lang="zh"
+                              />
+                             </div>
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+                </div>
+            </el-tab-pane>
+        </el-tabs>
+        <el-dialog @close="clearFromTree" :title="titleTree" v-model="dialogVisible" title="" width="70%" destroy-on-close :key="tableKey">
+          <div style="overflow: auto;height: 80vh;">
+              <el-form size="mini" :key="tableKey" style="margin-left: 0%;width: 98%;"  :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
+                  <el-row :gutter="48">
+                      <el-col :span="12">
+                          <el-form-item label="服务分类:" prop="name" style="">
+                              <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>
+                          </el-form-item>
+                      </el-col>
+                      <el-col :span="12">
+                          <el-form-item label="服务名称:" prop="version" style="">
+                              <el-input v-model="formJi.version" :disabled="isEdit"/>
+                          </el-form-item>
+                      </el-col>
+                  </el-row>
+                  <el-form-item label="接口地址:" prop="enname" style=""> 
+                          <el-input
+                          v-model="input3"
+                          placeholder=""
+                          class="input-with-select"
+                          >
+                          <template #prepend>
+                              <el-select v-model="select" placeholder="" style="width: 115px">
+                                  <el-option label="http://" value="1" />
+                                  <el-option label="https://" value="2" />
+                              </el-select>
+                          </template>
+                      </el-input>
+                  </el-form-item>
+                  <el-row :gutter="48">
+                      <el-col :span="12">
+                          <el-form-item label="接口格式:" prop="name" style="">
+                              <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>
+                          </el-form-item>
+                      </el-col>
+                      <el-col :span="12">
+                          <el-form-item label="请求方式:" prop="version" style="">
+                              <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>
+                          </el-form-item>
+                      </el-col>
+                  </el-row>
+                  <el-form-item label="返回格式:" prop="version" style="">
+                      <el-input v-model="formJi.version" :disabled="isEdit"/>
+                  </el-form-item>
+                  <el-form-item label="组件简介:">
+                      <el-input v-model="formJi.intro" style="width: 100%;" :disabled="isEdit" :rows="2" resize="none" type="textarea"/>
+                  </el-form-item>
+                  <el-form-item label="组件简介:">
+                      <el-input v-model="formJi.intro" style="width: 100%;" :disabled="isEdit" :rows="2" resize="none" type="textarea"/>
+                  </el-form-item>
+              </el-form>
+              <div style="margin-top: 2%;">
+                  <div>
+                      请求参数
+                  </div>
+                  <div>
+                      <el-table 
+                      style="margin-top: 1%;"
+                      :data="tableDataCan" 
+                      :cell-style="{ textAlign: 'center', }"
+                      :header-cell-style="{ textAlign: 'center'}"
+                      :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+                      border >
+                          <el-table-column prop="itemName" label="参数字段">
+                              <template #default="scope">
+                                  <div style="width: 100%;">
+                                      <el-input type="primary" v-model="scope.row.itemName" size="mini" text style="margin-left: 0%;border: transparent;"></el-input>
+                                  </div>
+                              </template>
+                          </el-table-column>
+                          <el-table-column prop="itemName" label="参数名称">
+                              <template #default="scope">
+                                  <div style="width: 100%;">
+                                      <el-input type="primary" v-model="scope.row.itemName" 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" v-model="scope.row.itemName" 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" v-model="scope.row.itemName" size="mini" text style="margin-left: 0%;"></el-input>
+                                  </div>
+                              </template>
+                          </el-table-column>
+                          <el-table-column prop="address" label="操作" width="222">
+                              <template #default="scope">
+                                  <div style="width: 100%;">
+                                      <el-button type="danger" @click="delCan(scope.row)" size="mini" text style="margin-left: 0%;">删除</el-button>
+                                  </div>
+                              </template>
+                          </el-table-column>
+                      </el-table>
+                      
+                  </div>
+              </div>
+              <div style="margin-top: 2%;">
+                  <div>返回响应</div>
+                  <el-tabs type="card" style="margin-top:0%;">
+                      <el-tab-pane label="成功">
+                          <div style="">
+                              <!-- <el-tree  :data="data" :props="defaultProps" @node-click="handleNodeClick" style="margin-top: 1%;margin-left: 2%;background-color: #F7F7F7;background-color: transparent;width: 15%;" default-expand-all>
+                                  <template #default="{ node, data }">
+                                      <span style="display: flex;justify-content: space-between;width: 100%;align-items: center;">
+                                          <span><el-input v-model="node.label" size="mini"/></span>
+                                          <span style="display: flex;align-items: center;">
+                                              <el-tooltip
+                                                  class="box-item"
+                                                  effect="light"
+                                                  content="是否必填"
+                                                  placement="top-start"
+                                              >
+                                              <el-checkbox v-model="checked1" label="" size="large" />
+                                              </el-tooltip>
+                                              <el-select
+                                                  v-model="formJi.type"
+                                                  :disabled="isEdit"
+                                                  style="width: 100%;margin-left: -1%;"
+                                              >
+                                                  <el-option
+                                                  v-for="item in optionsType"
+                                                  :key="item.value"
+                                                  :label="item.label"
+                                                  :value="item.value"
+                                                  />
+                                              </el-select>
+                                              <el-tooltip
+                                                  class="box-item"
+                                                  effect="light"
+                                                  content="是否允许null"
+                                                  placement="top-start"
+                                              >
+                                              <el-checkbox v-model="checked1" label="" size="large" />
+                                              </el-tooltip>
+                                          </span>
+                                      </span>
+                                  </template>
+                              </el-tree> -->
+                              <el-input :rows="8" type="textarea" v-model="titleTree" size="mini" text style="margin-left: 0%;width: 100%;" ></el-input>
+                            </div>
+                      </el-tab-pane>
+                  </el-tabs>
+              </div>
+              <div style="margin-top: 2.5%;margin-left: 1%;padding-bottom: 1%;">
+              <el-tabs type="card" style="margin-top: 1%;">
+                  <el-tab-pane label="成功示例">
+                        <div style="overflow: auto;height: 20vh;">
+                        <JsonEditorVue
+                          v-model="msgSu"
+                          style="height:100%;"
+                          :mode="'code'"
+                          :showBtns="false"
+                          :options="{
+                            navigationBar: false, // 隐藏顶部导航栏
+                            statusBar: false,     // 隐藏底部状态栏
+                            mode: 'code',          // 仅保留代码编辑模式
+                            mainMenuBar: false     // 隐藏主菜单栏
+                          }"
+                          lang="zh"
+                        />
+                        </div>
+                  </el-tab-pane>
+              </el-tabs>
+          </div>
+                </div>
+          <template #footer>
+            <span class="dialog-footer">
+              <el-button size="mini" @click="dialogVisible = false">取消</el-button>
+              <el-button v-if="isAdd" type="primary" @click="addTree" size="mini">
+                提交
+              </el-button>
+              <el-button v-if="!isAdd" type="primary" @click="saveEditTree" size="mini">
+                提交
+              </el-button>
+            </span>
           </template>
-        </el-table-column>
-      </el-table> -->
-    </el-row>
-    <div style="width: 100%;text-align: center;">
-      <!-- <el-pagination
-        small
-        style="margin-top:1%;"
-        background
-        v-model='pageNum'
-        @current-change="handleCurrentChange"
-        layout="prev, pager, next"
-        :total="dataTotal"
-        class="mt-4"
-      /> -->
+        </el-dialog>
     </div>
-
-    <div>
-        <el-pagination
-            style="margin-top:1%"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-            :page-sizes="[ 20, 30, 40]"
-            :page-size="pageSize"
-            :current-page="pageNum"
-            layout="total, sizes, prev, pager, next, jumper"
-            :total="dataTotal">
-        </el-pagination>
-      </div>
-    
-    <el-dialog
-      v-model="addServiceVisible"
-      title="服务"
-      fullscreen
-      @close="closeDialog"
-    >
-      <ae-service
-        :serviceVisible="addServiceVisible"
-        :service="checkedService"
-        @close="closeDialog"
-        @refreshTable="getList"
-      ></ae-service>
-    </el-dialog>
-  </div>
-  <div>
-
   </div>
 </template>
-<script setup name="Menu">
-</script>
-<script>
-import "@/assets/styles/common.scss";
-import AeService from "./AeService";
-import {
-  getServiceInfo,
-  saveServiceInfo,
-  deleteService,
-} from "@/api/service/info";
+<script   setup>
+import { Plus,Search,Filter,Promotion,Check  } from '@element-plus/icons-vue'
+import { reactive } from 'vue'
+import { addDataCate,getCateTree,getCateDe,editCate,delCate,addDataItem,getItem,getItemDe,editItem,delItem} from "@/api/service/cate";
+import { ref, onMounted, onUnmounted, nextTick,onBeforeMount } from 'vue';
+import JsonViewer from 'vue-json-viewer'
+import 'vue-json-viewer/style.css' 
+import  JsonEditorVue from 'json-editor-vue3'
 
-export default {
-  name: "SerivceInfo",
-  components: {
-    AeService,
-  },
-  data() {
-    return {
-      dialogVisible:false,
-      addServiceVisible: false,
-      checkedService: undefined,
-      tableData: [],
-      pageSize:20,
-      heightAll:window.innerHeight,
-      tableHeight: window.innerHeight - 300,
-      paramList: [
-        {
-          paramCode: "name",
-          paramName: "服务名称",
-          align: "left",
-          width: "150",
-        },
-        {paramCode: "type", paramName: "服务类型", width: "100"},
-        {paramCode: "url", paramName: "服务地址", align: "left"},
-        {paramCode: "rqtype", paramName: "请求方式", width: "76"},
-        // {
-        //   paramCode: "serviceSource",
-        //   paramName: "所属模型",
-        //   align: "left",
-        //   width: "150",
-        // },
-        {paramCode: "cnt", paramName: "调用次数", width: "76"},
-        {paramCode: "rlstm", paramName: "发布时间", width: "110"},
-      ],
-      dataTotal: 0,
-      pageNum:1,
-      query: {
-        pageNum: 1,
-        pageSize: 20,
-        orderBy: " RLSTM DESC ",
-        data: {
-          name: "",
-          cateCode: "",
-        },
-      },
-    };
-  },
-  mounted() {
-    this.getList();
-  },
-  methods: {
-    handleSizeChange(num){
-      this.query.pageSize = num
-      this.getList()
+const { proxy } = getCurrentInstance();
+const treeData =  ref(
+    {label:'上海市城区洪涝仿真模型'}, 
+    {label:'上海沿海风暴潮预报模型'},
+    {label:'黄浦江水系水文分析预报数值模拟'},
+    {label:'苏州河水系水情预报模型'},
+    {label:'内涝风险实时预警与预报'},
+    {label:'上海市中心城区排水系统模型'},
+    {label:'温带风暴潮预报模型等专业模型的标准化改造'},
+)
+const msgSu= ref({
+  "msg":"操作成功",
+  "code":200
+})
+const options =  ref([
+    {label:'开发中',
+    value:'1'
     },
-    handleCurrentChange(num){
-      this.query.pageNum = num
-      this.getList()
+    {label:'运行中',
+    value:'2'
     },
-    addDetailPropertyInPlace(arr) {
-      arr.forEach(obj => {
-        obj.detail = structuredClone ? structuredClone(obj) : deepCopy(obj);
-      });
-      arr.forEach(obj => {
-        obj.detail1 = []
-        obj.detail1.push(obj.detail)
-      });
-      return arr
-    },
-    getList() {
-      getServiceInfo(this.query).then((r) => {
-        // this.tableData = r.rows
-        this.tableData = this.addDetailPropertyInPlace(r.rows)
-        console.log(this.tableData)
-        this.dataTotal = r.total
-      });
-    },
-    // 关闭弹窗
-    closeDialog() {
-      // this.addServiceVisible = false;
-      // this.checkedService = undefined;
-    },
-    /** 添加、修改服务 */
-    saveService(service) {
-      this.addServiceVisible = true;
-      console.log(service.serviceList)
-      if (service.serviceList[0].srvId) {
-        this.checkedService = service.serviceList[0];
-      }
-      else{
-        return
-      }
+])
+const tableDataCan = ref([
+    {itemName:'1'}
+])
+const data =  ref([])
+const select =  ref('1')
+const activeName =  ref('first')
+const title =  ref([])
+const titleTree =  ref([])
+const currentPage =  ref(1)
+const total =  ref(1)
+const tableData = ref([])
+const tableheight = window.innerHeight*0.7
+const heightAll = window.innerHeight
+const dialogVisible = ref(false)
+const dialogVisibleTree = ref(false)
+const isAdd = ref(false)
+const isAddTa = ref(false)
+const treeId = ref('');
+const valueSta = ref('1');
+const formZu = ref({
+  itemName:'',
+  itemTp:'',
+  itemEn:'',
+  itemTp:'',
+  itemDataTp:'',
+  itemDefaultVal:'',
+  itemUnit:'',
+  itemNotes:'',
+});
+const formJi = ref({
+  name:'',
+  version:'',
+  enname:'',
+  devlang:'',
+  intro:'',
+  type:''
+});
+const rulesJi = reactive({
+  name: [{ required: true, message: '必填', trigger: 'blur' }],
+  version: [{ required: true, message: '必填', trigger: 'blur' }],
+  enname: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefJi = ref();
+const rulesZu = reactive({
+  itemName: [{ required: true, message: '必填', trigger: 'blur' }],
+  itemEn: [{ required: true, message: '必填', trigger: 'blur' }],
+  itemTp: [{ required: true, message: '必填', trigger: 'blur' }],
+  itemDataTp: [{ required: true, message: '必填', trigger: 'blur' }],
+  itemDefaultVal: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefZu = ref();
 
-    },
-    // 更新状态
-    updateStatus(service) {
-      if (service.status == "1") {
-        service.status = "0";
-      } else {
-        service.status = "1";
+const formTree = ref({
+  itemName:'',
+  catePid:'',
+  itemNo:'',
+  itemNotes:''
+});
+const rulesTree = reactive({
+  itemNo: [{ required: true, message: '必填', trigger: 'blur' }],
+  catePid: [{ required: true, message: '必填', trigger: 'blur' }],
+  itemName: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefTree = ref();
+
+function addPa(){
+    var par = {
+        itemName:''
+    }
+    tableDataCan.value.push(par)
+}
+function delCan(row){
+
+}
+function clearForm(){
+  formZu.value = {
+    itemName:'',
+    itemTp:'',
+    itemEn:'',
+    itemTp:'',
+    itemDataTp:'',
+    itemDefaultVal:'',
+    itemUnit:'',
+    itemNotes:'',
+  }
+}
+function getTable(){
+  var par = {
+    pageNum:currentPage.value,
+    pageSize:15,
+    cateId:''
+  }
+  getItem(par).then(res=>{
+    tableData.value = res.rows
+    total.value = res.total
+  })
+}
+function showAdd(){
+  title.value = '新增'
+  dialogVisible.value = true
+}
+function showEdit(row){
+  isAddTa.value = false
+  title.value = '编辑'
+  dialogVisible.value = true
+  getItemDe(row.dataId).then(res=>{
+    formZu.value = res.data
+  })
+}
+function showAddTree(){
+  isAdd.value = true
+  titleTree.value = '新增节点'
+  dialogVisibleTree.value = true
+}
+function clearFromTree(){
+  formTree.value = {
+    itemName:'',
+    catePid:'',
+    itemNo:'',
+    itemNotes:''
+  }
+}
+function getTree(){
+  getCateTree().then(res=>{
+    data.value = res.data
+  })
+}
+function addTa(){
+  formRefZu.value.validate(async (valid) => {
+    await addDataItem(formZu.value).then(res=>{
+      if(res.code===200){
+        proxy.$modal.msgSuccess("新增成功");
+        getTable()
+        dialogVisible.value = false
       }
-      saveServiceInfo({srvId: service.srvId, status: service.status}).then(
-        (r) => {
-          this.$message({
-            message: (service.status == 1 ? "启用" : "停用") + "成功",
-            type: "success",
-          });
-          this.getList();
-        }
-      );
-    },
-    handleDelete(service) {
-      const srvId = service.srvId;
-      const name = service.name;
-      this.$modal
-        .confirm('是否确认删除"' + name + '"服务的数据项?')
-        .then(() => deleteService({params: {srvId: srvId}}))
-        .then(() => {
-          this.getList();
-          this.$modal.msgSuccess("删除成功");
-        })
-        .catch(() => {
-        });
-    },
-    tableRowClassName({row, rowIndex}) {
-      if (row.status != 1) {
-        return "warning-row";
+    })
+  });
+}
+function saveEditTa(){
+  editItem(formZu.value).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("修改成功");
+      dialogVisible.value = false
+      getTable()
+    }
+  })
+}
+function delRow(row) {
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    return delItem(row.dataId);
+  }).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
       }
-      return "";
-    },
-  },
+    })
+  });
+}
+function saveEditTree(){
+  editCate(formTree.value).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess("修改成功");
+      dialogVisibleTree.value = false
+      getTree()
+    }
+  })
+}
+function handleNodeClick(node, data){
+  console.log(data)
+}
+function delTree(node, data) {
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    return delCate(data.id);
+  }).then(() => {
+    getTree();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
 };
-</script>
-<style lang="scss" scoped>
-.box {
-  margin-bottom: 10px;
+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()
+});
 
-.box ::v-deep .el-form-item {
-  margin-bottom: 0;
+</script>
+<style scoped>
+/* 节点垂直间距 */
+:deep(.el-tree-node) {
+  margin-bottom:5px !important; /* 增大节点间距 */
 }
-
-.table_box ::v-deep .el-table {
-  border: 1px solid #e6e6e6;
-  border-right: 1px solid #e6e6e6;
-  border-bottom: none;
-  border-radius: 5px;
+.el-popover.custom-popover {
+  min-width: 50px;
+  padding: 8px; /* 可选:调整内边距 */
+}
+</style>
+<style>
+.dot {
+  width: 20px;          /* 控制圆点直径 */
+  height: 20px;
+  background-color: #333; /* 实心颜色 */
+  border-radius: 50%;    /* 关键属性 */
+  display: inline-block; /* 确保与其他元素并排 */
+}
+/* 全局透明样式(不使用 scoped) */
+.transparent-select .el-select__wrapper {
+  background-color: transparent !important;
+  border-color: transparent !important;
+  box-shadow: none !important;
 }
 
-::v-deep .el-dialog {
-  position: relative;
-  margin: 0 auto 0px;
-  background: #ffffff;
-  border-radius: 2px;
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 100%;
-  height: 100%;
+.transparent-select .el-select__selection {
+  background-color: transparent;
 }
 
-::v-deep .el-dialog__body {
-  // border-top: 1px solid #dcdfe6;
-  max-height: 100% !important;
-  min-height: 70%;
-  overflow-y: auto;
+/* 处理悬停和聚焦状态 */
+.transparent-select .el-select__wrapper:hover,
+.transparent-select .el-select__wrapper.is-focused {
+  border-color: transparent !important;
+  box-shadow: none !important;
+}
 
-  &::-webkit-scrollbar {
-    width: 2px;
-    background-color: #ccc;
+/* 下拉箭头图标 */
+.transparent-select .el-select__caret {
+  color: rgba(0, 0, 0, 0.5); /* 半透明图标 */
+}
+</style>
+<style scoped>
+:deep(.treeLeft) .el-tree-node__content {
+  padding-top: 10px;
+}
+:deep(.treeLeft) .el-tree-node__content:hover {
+  background-color: rgb(243,243,245);
+}
+:deep(.treeLeft) .el-tree-node__content:active {
+    background-color: rgka(69,157,255,0.1) !important;
+    transform: scale(0.98); /* 轻微缩放增强按压感 */
   }
 
-  &::-webkit-scrollbar-thumb {
-    background-color: #0ae;
+  /* 选中态(Active) */
+:deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
+    background-color: rgb(237,237,239) !important;
   }
 
-  &::-webkit-scrollbar-track {
-    background-color: #ccc;
-  }
+.tab-container {
+  height: 100vh; /* 关键:父容器明确高度 */
+  display: flex;
+  flex-direction: column;
+}
+.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">
+
+.custom-tree-node {
+  display: flex;       /* 启用 Flex 布局 */
+  align-items: center; /* 垂直居中 */
+  gap: 8px;            /* 图标与文字间距 */
+}
+.el-table .el-table__row td {
+  height: 60px !important; /* 行高 */
+}
+.custom-tree-node {
+  display: flex;       /* 启用 Flex 布局 */
+  align-items: center; /* 垂直居中 */
+  gap: 8px;            /* 图标与文字间距 */
+}
+</style>

+ 421 - 0
ruoyi-ui/src/views/service/info/index1.vue

@@ -0,0 +1,421 @@
+<template>
+  <div style="margin-left: 1%;padding-top: 1%;" :style="{'height':heightAll+'px'}">
+    <el-row class="box">
+      <!-- 筛选条件 -->
+      <el-form ref="formRef" :inline="true" size="mini" :model="query.data">
+        <el-form-item label="服务名称">
+          <el-input v-model="query.data.name"></el-input>
+        </el-form-item>
+<!--        <el-form-item label="所属部门">-->
+<!--          <el-input v-model="query.data.unitName"></el-input>-->
+<!--        </el-form-item>-->
+        <el-form-item label="所属模型">
+          <el-input v-model="query.data.unitName"></el-input>
+        </el-form-item>
+        <el-form-item label="服务状态">
+          <el-select clearable v-model="query.data.applyState" style="width:100px;">
+            <el-option label="待审核" value="0"></el-option>
+            <el-option label="同意" value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            @click="getList"
+            icon="Search"
+          >搜索</el-button>
+        </el-form-item>
+      </el-form>
+    </el-row>
+    <el-row class="box">
+      <el-button
+        @click="saveService"
+        size="small"
+        type="primary"
+        plain
+        v-hasPermi="['service:info:add']"
+      >
+        添加服务
+      </el-button>
+    </el-row>
+    <el-row class="table_box">
+      <el-table
+        stripe
+        :data="tableData"
+        :height="tableHeight"
+        style="width: 100%"
+        size="small"
+        :row-class-name="tableRowClassName"
+        :header-cell-style="{
+          background: '#ebf3fb',
+          color: '#333',
+          padding: '4px 0',
+          'border-right': '1px solid #fff',
+        }"
+      >
+        <el-table-column type="expand">
+          <template #default="prop">
+            <el-table :data="prop.row.detail1">
+              <el-table-column label="服务名称" prop="name" />
+              <el-table-column label="服务类型" prop="type" />
+              <el-table-column label="服务地址" prop="url" />
+              <el-table-column label="请求方式" prop="rqtype" />
+              <!-- <el-table-column label="调用次数" prop="cnt" /> -->
+              <el-table-column label="发布时间" prop="rlstm" />
+              <el-table-column
+                show-overflow-tooltip
+                header-align="center"
+                align="center"
+                width="60"
+                prop="status"
+                label="状态"
+              >
+                <template #default="scope">
+                  <el-tag
+                    :type="scope.row.status === '1' ? 'success' : 'warning'"
+                    disable-transitions
+                  >
+                    {{ scope.row.status === "1" ? "启用" : "停用" }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column fixed="right" align="center" label="操作" width="220">
+                <template #default="scope">
+                  <el-button
+                    :type="scope.row.status == 1 ? 'warning' : 'primary'"
+                    v-hasPermi="['service:info:status']"
+                    @click="updateStatus(scope.row)"
+                    size="mini"
+                  >
+                    {{ scope.row.status == 1 ? "停用" : "启用" }}
+                  </el-button>
+                  <el-button
+                    v-hasPermi="['service:info:update']"
+                    @click="saveService(scope.row)"
+                    size="mini"
+                  >
+                    编辑
+                  </el-button>
+                  <el-button
+                    type="danger"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['service:info:delete']"
+                    size="mini"
+                  >
+                    删除
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </template>
+        </el-table-column>
+        <el-table-column type="index" align="center" label="序号" width="50"/>
+        <el-table-column label="服务名称" prop="name" />
+      </el-table>
+      <!-- <el-table
+        stripe
+        :data="tableData"
+        :height="tableHeight"
+        style="width: 100%"
+        size="small"
+        :row-class-name="tableRowClassName"
+        :header-cell-style="{
+          background: '#ebf3fb',
+          color: '#333',
+          padding: '4px 0',
+          'border-right': '1px solid #fff',
+        }"
+      >
+        <el-table-column type="index" align="center" label="序号" :index="1"/>
+        <el-table-column
+          show-overflow-tooltip
+          v-for="(param, index) in paramList"
+          :key="index"
+          header-align="center"
+          :align="param.align ? param.align : 'center'"
+          :width="param.width ? param.width : 'auto'"
+          :prop="param.paramCode"
+          :label="param.paramName"
+        />
+        <el-table-column
+          show-overflow-tooltip
+          header-align="center"
+          align="center"
+          width="60"
+          prop="status"
+          label="状态"
+        >
+          <template #default="scope">
+            <el-tag
+              :type="scope.row.status === '1' ? 'success' : 'warning'"
+              disable-transitions
+            >
+              {{ scope.row.status === "1" ? "启用" : "停用" }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column fixed="right" align="center" label="操作" width="220">
+          <template #default="scope">
+            <el-button
+              :type="scope.row.status == 1 ? 'warning' : 'primary'"
+              v-hasPermi="['service:info:status']"
+              @click="updateStatus(scope.row)"
+              size="mini"
+            >
+              {{ scope.row.status == 1 ? "停用" : "启用" }}
+            </el-button>
+            <el-button
+              v-hasPermi="['service:info:update']"
+              @click="saveService(scope.row)"
+              size="mini"
+            >
+              编辑
+            </el-button>
+            <el-button
+              type="danger"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['service:info:delete']"
+              size="mini"
+            >
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table> -->
+    </el-row>
+    <div style="width: 100%;text-align: center;">
+      <!-- <el-pagination
+        small
+        style="margin-top:1%;"
+        background
+        v-model='pageNum'
+        @current-change="handleCurrentChange"
+        layout="prev, pager, next"
+        :total="dataTotal"
+        class="mt-4"
+      /> -->
+    </div>
+
+    <div>
+        <el-pagination
+            style="margin-top:1%"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+            :page-sizes="[ 20, 30, 40]"
+            :page-size="pageSize"
+            :current-page="pageNum"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="dataTotal">
+        </el-pagination>
+      </div>
+    
+    <el-dialog
+      v-model="addServiceVisible"
+      title="服务"
+      fullscreen
+      @close="closeDialog"
+    >
+      <ae-service
+        :serviceVisible="addServiceVisible"
+        :service="checkedService"
+        @close="closeDialog"
+        @refreshTable="getList"
+      ></ae-service>
+    </el-dialog>
+  </div>
+  <div>
+
+  </div>
+</template>
+<script setup name="Menu">
+</script>
+<script>
+import "@/assets/styles/common.scss";
+import AeService from "./AeService";
+import {
+  getServiceInfo,
+  saveServiceInfo,
+  deleteService,
+} from "@/api/service/info";
+
+export default {
+  name: "SerivceInfo",
+  components: {
+    AeService,
+  },
+  data() {
+    return {
+      dialogVisible:false,
+      addServiceVisible: false,
+      checkedService: undefined,
+      tableData: [],
+      pageSize:20,
+      heightAll:window.innerHeight,
+      tableHeight: window.innerHeight - 300,
+      paramList: [
+        {
+          paramCode: "name",
+          paramName: "服务名称",
+          align: "left",
+          width: "150",
+        },
+        {paramCode: "type", paramName: "服务类型", width: "100"},
+        {paramCode: "url", paramName: "服务地址", align: "left"},
+        {paramCode: "rqtype", paramName: "请求方式", width: "76"},
+        // {
+        //   paramCode: "serviceSource",
+        //   paramName: "所属模型",
+        //   align: "left",
+        //   width: "150",
+        // },
+        {paramCode: "cnt", paramName: "调用次数", width: "76"},
+        {paramCode: "rlstm", paramName: "发布时间", width: "110"},
+      ],
+      dataTotal: 0,
+      pageNum:1,
+      query: {
+        pageNum: 1,
+        pageSize: 20,
+        orderBy: " RLSTM DESC ",
+        data: {
+          name: "",
+          cateCode: "",
+        },
+      },
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    handleSizeChange(num){
+      this.query.pageSize = num
+      this.getList()
+    },
+    handleCurrentChange(num){
+      this.query.pageNum = num
+      this.getList()
+    },
+    addDetailPropertyInPlace(arr) {
+      arr.forEach(obj => {
+        obj.detail = structuredClone ? structuredClone(obj) : deepCopy(obj);
+      });
+      arr.forEach(obj => {
+        obj.detail1 = []
+        obj.detail1.push(obj.detail)
+      });
+      return arr
+    },
+    getList() {
+      getServiceInfo(this.query).then((r) => {
+        // this.tableData = r.rows
+        this.tableData = this.addDetailPropertyInPlace(r.rows)
+        console.log(this.tableData)
+        this.dataTotal = r.total
+      });
+    },
+    // 关闭弹窗
+    closeDialog() {
+      // this.addServiceVisible = false;
+      // this.checkedService = undefined;
+    },
+    /** 添加、修改服务 */
+    saveService(service) {
+      this.addServiceVisible = true;
+      console.log(service.serviceList)
+      if (service.serviceList[0].srvId) {
+        this.checkedService = service.serviceList[0];
+      }
+      else{
+        return
+      }
+
+    },
+    // 更新状态
+    updateStatus(service) {
+      if (service.status == "1") {
+        service.status = "0";
+      } else {
+        service.status = "1";
+      }
+      saveServiceInfo({srvId: service.srvId, status: service.status}).then(
+        (r) => {
+          this.$message({
+            message: (service.status == 1 ? "启用" : "停用") + "成功",
+            type: "success",
+          });
+          this.getList();
+        }
+      );
+    },
+    handleDelete(service) {
+      const srvId = service.srvId;
+      const name = service.name;
+      this.$modal
+        .confirm('是否确认删除"' + name + '"服务的数据项?')
+        .then(() => deleteService({params: {srvId: srvId}}))
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {
+        });
+    },
+    tableRowClassName({row, rowIndex}) {
+      if (row.status != 1) {
+        return "warning-row";
+      }
+      return "";
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.box {
+  margin-bottom: 10px;
+}
+
+.box ::v-deep .el-form-item {
+  margin-bottom: 0;
+}
+
+.table_box ::v-deep .el-table {
+  border: 1px solid #e6e6e6;
+  border-right: 1px solid #e6e6e6;
+  border-bottom: none;
+  border-radius: 5px;
+}
+
+::v-deep .el-dialog {
+  position: relative;
+  margin: 0 auto 0px;
+  background: #ffffff;
+  border-radius: 2px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+}
+
+::v-deep .el-dialog__body {
+  // border-top: 1px solid #dcdfe6;
+  max-height: 100% !important;
+  min-height: 70%;
+  overflow-y: auto;
+
+  &::-webkit-scrollbar {
+    width: 2px;
+    background-color: #ccc;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    background-color: #0ae;
+  }
+
+  &::-webkit-scrollbar-track {
+    background-color: #ccc;
+  }
+}
+</style>

+ 8 - 2
ruoyi-ui/vite.config.js

@@ -1,17 +1,23 @@
 import {defineConfig, loadEnv} from 'vite'
 import path from 'path'
 import createVitePlugins from './vite/plugins'
-
+import { viteCommonjs } from '@originjs/vite-plugin-commonjs'
 // https://vitejs.dev/config/
 export default defineConfig(({mode, command}) => {
     const env = loadEnv(mode, process.cwd())
+    const isBuild = command === 'build';
     // const {VITE_APP_ENV} = env
     return {
         // 部署生产环境和开发环境下的URL。
         // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
         // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
         base: env.VITE_APP_BASE_Title,
-        plugins: createVitePlugins(env, command === 'build'),
+        plugins: [
+            viteCommonjs({ 
+                include: ['jsoneditor'] // 必须为首个插件[3](@ref)
+            }),
+            ...createVitePlugins(env, isBuild) // 展开原有插件
+        ],
         resolve: {
             // https://cn.vitejs.dev/config/#resolve-alias
             alias: {