nanjingliujinyu il y a 6 mois
Parent
commit
e73f74f02c

+ 2 - 2
ruoyi-ui/.env.development

@@ -10,8 +10,8 @@ VITE_APP_BASE_Title = '/sh'
 # 若依管理系统/生产环境
 VITE_APP_BASE_API = '/sh-api'
 
-# VITE_DEV_PATH = 'http://localhost:8082'
-VITE_DEV_PATH = 'http://39.98.38.2:18082/sh-api'
+VITE_DEV_PATH = 'http://localhost:8082'
+# VITE_DEV_PATH = 'http://39.98.38.2:18082/sh-api'
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VITE_BUILD_COMPRESS = gzip

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

@@ -18,3 +18,6 @@ export function delMdid(id) {
     method: 'delete'
   })
 }
+export function getModelFile(id) {
+  return request.get(`/model/file//${id}`);
+}

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

@@ -46,9 +46,9 @@
                 <router-link to="/user/profile">
                   <el-dropdown-item>个人中心</el-dropdown-item>
                 </router-link>
-                <!--                <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">-->
-                <!--                  <span>布局设置</span>-->
-                <!--                </el-dropdown-item>-->
+                               <!-- <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">
+                                 <span>布局设置</span>
+                               </el-dropdown-item> -->
                 <el-dropdown-item divided command="logout">
                   <span>退出登录</span>
                 </el-dropdown-item>
@@ -68,6 +68,7 @@ import variables from '@/assets/styles/variables.module.scss'
 import useAppStore from '@/store/modules/app'
 import useSettingsStore from '@/store/modules/settings'
 import usePermissionStore from '@/store/modules/permission'
+import { ElMessageBox } from 'element-plus'
 import useUserStore from '@/store/modules/user'
 import { ref, onMounted, onUnmounted, nextTick } from 'vue';
 import Cookies from 'js-cookie'

+ 2 - 1
ruoyi-ui/src/store/modules/app.js

@@ -5,7 +5,8 @@ const useAppStore = defineStore(
   {
     state: () => ({
       sidebar: {
-        opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+        // opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+        opened:true,
         withoutAnimation: false,
         hide: false
       },

+ 160 - 145
ruoyi-ui/src/views/register/componentReg/index.vue

@@ -43,8 +43,8 @@
             />
         </div>
         <div style="display: flex;width: 20%;align-items: center;margin-left: 20%;">
-            <el-button type="primary" style="margin-left: 5%;" :icon="Search">查询</el-button>
-            <el-button type="primary" style="margin-left: 5%;" icon="Refresh">重置</el-button>
+            <el-button type="primary" style="margin-left: 5%;" @click="getModelListTable" :icon="Search">查询</el-button>
+            <el-button type="primary" style="margin-left: 5%;" @click="submit" icon="Refresh">重置</el-button>
             <el-button type="primary" style="margin-left:5%;" @click="reg" icon="Plus">注册</el-button>
             <!-- <el-button type="" style="margin-left:5%;" plain icon="Plus">切换展示模式</el-button> -->
         </div>
@@ -77,8 +77,8 @@
         </el-table-column>
         <el-table-column prop="className" label="组件分类" width="160"/>
         <el-table-column prop="mdUnit" label="提供单位" width="160"/>
-        <el-table-column prop="address2" label="注册人员" width="100"/>
-        <el-table-column prop="st3" label="测试状态" width="140">
+        <el-table-column prop="registrant" label="注册人员" width="100"/>
+        <el-table-column prop="status" label="测试状态" width="140">
             <template #default="scope">
               <el-button v-if="scope.row.st1=='1'" type="success" plain>测试完成</el-button>
               <el-button v-if="scope.row.st1=='2'" type="danger" plain>测试失败</el-button>
@@ -92,7 +92,7 @@
               <el-button v-if="scope.row.st2=='3'" type="" plain>暂无评价</el-button>
             </template>
         </el-table-column>
-        <el-table-column prop="isPublic" label="是否发布" width="140">
+        <el-table-column prop="isApproved" label="是否发布" width="140">
             <template #default="scope">
               <el-button v-if="scope.row.st3=='1'" type="success" plain>已发布</el-button>
               <el-button v-if="scope.row.st3=='2'" type="danger" plain>未发布</el-button>
@@ -100,16 +100,15 @@
         </el-table-column>
         <el-table-column prop="modifyBy" label="发布时间" width="170"/>
         <el-table-column prop="version" label="版本" width="120"/>
-        <el-table-column prop="address" label="操作" width="360">
+        <el-table-column prop="address" label="操作" width="300">
             <template #default="scope">
                 <div style="display: flex;justify-content: space-between;width: 80%;">
                     <el-button type="primary" size="mini" text style="margin-left: -2%;">发布</el-button>
-                    <el-button type="warning" size="mini" text style="margin-left: -5%;">下架</el-button>
-                    <el-button type="warning" text size="mini" style="margin-left: -5%;">重置测试</el-button>
                     <el-button type="primary" text size="mini" style="margin-left: -5%;">测试</el-button>
                     <el-button type="primary" size="mini" text style="margin-left: -5%;">编辑</el-button>
-                    <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button>
+                    <!-- <el-button type="danger" text size="mini" style="margin-left: -5%;" @click="handleDelete(scope.row)">注销</el-button> -->
                     <el-button type="primary" text size="mini" style="margin-left: -5%;">查看</el-button>
+                    <el-button type="primary" text size="mini" style="margin-left: -5%;">API管理</el-button>
                 </div>
             </template>
         </el-table-column>
@@ -117,13 +116,15 @@
       <div style="float: right;margin-top: 1%;margin-right: 1%;">
           <el-pagination
             small
+            v-model='currentPage'
+            @update = changePage
             background
             layout="prev, pager, next"
-            :total="50"
+            :total="totalComReg"
             class="mt-4"
           />
         </div>
-        <el-dialog v-model="dialogVisible" title="组件注册" width="50%" >
+        <el-dialog v-model="dialogVisible" title="组件注册" width="50%" @close="clearForm">
           <el-steps :active="active" finish-status="success" simple style="margin-top: 20px">
             <el-step title="第一步"></el-step>
             <el-step title="第二步"></el-step>
@@ -135,28 +136,28 @@
                 <div style="font-weight: bold;font-size: 16px;margin-left: 0.5%;">基本信息</div>
               </div>
               <div v-if="active==0" style="margin-left: 1%;margin-top: 1%;">
-                  <el-form style="margin-left: 5%;"  :model="form" label-position="left" class="demo-form-inline" :rules="rules">
+                  <el-form style="margin-left: 5%;"  :model="formJi" label-position="left" ref="formRefJi" class="demo-form-inline" :rules="rulesJi">
                       <el-row :gutter="40">
                       <el-col :span="9">
                           <el-form-item label="组件名称:" prop="name" style="margin-left: -3%;">
-                            <el-input v-model="form.name" />
+                            <el-input v-model="formJi.name" />
                           </el-form-item>
                       </el-col>
                       <el-col :span="9">
                           <el-form-item label="版本号:" prop="version" style="margin-left: -3%;">
-                              <el-input v-model="form.version" />
+                              <el-input v-model="formJi.version" />
                           </el-form-item>
                       </el-col>
                       </el-row>
                       <el-row :gutter="40" style="margin-top: 1%;">
                       <el-col :span="9" >
                           <el-form-item label="组件英文名称:" prop="enname" style="margin-left: -3%;"> 
-                            <el-input v-model="form.enname" />
+                            <el-input v-model="formJi.enname" />
                           </el-form-item>
                       </el-col>
                       <el-col :span="9">
                           <el-form-item label="排序:" prop="">
-                              <el-input v-model="form.region" />
+                              <el-input v-model="formJi.region" />
                           </el-form-item>
                       </el-col>
                       </el-row>
@@ -164,11 +165,11 @@
                       <el-col :span="9" >
                           <el-form-item label="模型分类:" prop="type">
                               <el-select
-                              v-model="form.type"
+                              v-model="formJi.type"
                               style="width: 100%;margin-left: 1%;"
                           >
                               <el-option
-                              v-for="item in options"
+                              v-for="item in optionsType"
                               :key="item.value"
                               :label="item.label"
                               :value="item.value"
@@ -178,18 +179,18 @@
                       </el-col>
                       <el-col :span="9">
                           <el-form-item label="开发语言:">
-                              <el-radio-group v-model="form.devlang" class="ml-4" size="small" style="margin-top: -10%;">
-                                  <el-radio label="1" size="large">C++</el-radio>
-                                  <el-radio label="2" size="large">.net</el-radio>    
-                                  <el-radio label="2" size="large">java</el-radio>
-                                  <el-radio label="2" size="large">Python</el-radio>
-                                  <el-radio label="2" size="large">其他</el-radio>
+                              <el-radio-group v-model="formJi.devlang" class="ml-4" size="small" style="margin-top: -10%;">
+                                  <el-radio label="C++" size="large">C++</el-radio>
+                                  <el-radio label=".net" size="large">.net</el-radio>    
+                                  <el-radio label="java" size="large">java</el-radio>
+                                  <el-radio label="Python" size="large">Python</el-radio>
+                                  <el-radio label="其他" size="large">其他</el-radio>
                               </el-radio-group>
                           </el-form-item>
                       </el-col>
                       </el-row>
                       <el-form-item label="组件简介:">
-                          <el-input v-model="form.region" style="width: 30%;" :rows="2" resize="none" type="textarea"/>
+                          <el-input v-model="formJi.intro" style="width: 30%;" :rows="2" resize="none" type="textarea"/>
                       </el-form-item>
                   </el-form>
               </div>
@@ -198,28 +199,18 @@
                   <div style="font-weight: bold;font-size: 16px;margin-left: 0.5%;">提供单位信息</div>
               </div>
               <div v-if="active==0" style="margin-left: 1%;margin-top: 1%;">
-                  <el-form style="margin-left: 5%;margin-top: 2%;"  :model="form" class="demo-form-inline" :rules="rules">
+                  <el-form style="margin-left: 5%;margin-top: 2%;"  :model="formTi" ref="formRefTi" class="demo-form-inline" :rules="rulesTi">
                       <el-row :gutter="40">
                       <el-col :span="12">
-                          <el-form-item label="提供单位:" prop="mdUnit">
-                          <el-select
-                            v-model="form.mdUnit"
-                            style="width: 65%"
-                          >
-                            <el-option
-                              v-for="item in options"
-                              :key="item.value"
-                              :label="item.label"
-                              :value="item.value"
-                            />
-                          </el-select>
+                          <el-form-item label="提供单位:" prop="ti">
+                          <el-input v-model="formTi.ti" style="width: 65%;margin-left: 1%;" placeholder="" />
                           <!-- <el-button type="primary" style="margin-left: 1%;">选择</el-button>
                             <el-button type="" style="margin-left:1%;">清空</el-button> -->
                           </el-form-item>
                       </el-col>
                       <el-col :span="12">
                           <el-form-item label="技术支撑单位:" prop="developer">
-                              <el-input v-model="form.developer" style="width: 65%;" />
+                              <el-input v-model="formTi.developer" style="width: 65%;" />
                               <!-- <el-button type="" style="margin-left:1%;">清空</el-button> -->
                           </el-form-item>
                       </el-col>
@@ -227,7 +218,7 @@
                       <el-row :gutter="40" style="margin-top: 1%;">
                       <el-col :span="9" >
                           <el-form-item label="联系方式:" prop="mdContact"> 
-                          <el-input v-model="form.mdContact" />
+                          <el-input v-model="formTi.mdContact" />
                           </el-form-item>
                       </el-col>
                       </el-row>
@@ -290,27 +281,26 @@
                   <div style="font-weight: bold;font-size: 16px;margin-left: 0.5%;">模型组件上传</div>
               </div>
               <div style="margin-left: 1%;margin-top: 1%;">
-                  <el-form style="margin-left: 5%;margin-top: 2%;"  :model="form" class="demo-form-inline" :rules="rules">
-                    <el-form-item label="组件执行:" prop="name" style="margin-left: -1%;">
-                      <el-input v-model="form.region" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
+                  <el-form style="margin-left: 5%;margin-top: 2%;"  :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
+                    <el-form-item label="组件执行路径:" prop="name" style="margin-left: -1%;">
+                      <el-input v-model="rulesZu.mirrorImageEurl" style="width: 75%;" placeholder="请输入组件执行路径" :rows="2" type="textarea" resize="none"/>
                     </el-form-item>
                     <el-form-item label="组件说明文档:" prop="">
                       <div style="width: 60%;">
                         <el-upload
-                                  class="upload-demo"
-                                  drag
-                                  action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
-                                  multiple
-                                >
-                                  <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-                                  <div class="el-upload__text">
-                                    Drop file here or <em>click to upload</em>
-                                  </div>
-                                  <template #tip>
-                                    <div class="el-upload__tip">
-                                    </div>
-                                  </template>
-                                </el-upload>
+                            ref="uploadRef"
+                            :limit="1"
+                            accept=".xlsx, .xls"
+                            :headers="upload.headers"
+                            :action="upload.url + '?updateSupport=' + upload.updateSupport"
+                            :on-progress="handleFileUploadProgress"
+                            :on-success="handleFileSuccess"
+                            :auto-upload="false"
+                            drag
+                        >
+                            <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                        </el-upload>
                       </div>
                       <div style="color: #b1b3b8;width: 100%;">
                         注:请上传后缀名为.docx .pdf .txt的文件
@@ -323,11 +313,11 @@
                 <div style="font-weight: bold;font-size: 16px;margin-left: 0.5%;">资源需求</div>
               </div>
               <div style="margin-left: 1%;margin-top: 1%;">
-                  <el-form style="margin-left: 5%;margin-top: 2%;"  :model="form" class="demo-form-inline" :rules="rules">
+                  <el-form style="margin-left: 5%;margin-top: 2%;"  :model="formZu" class="demo-form-inline" ref="formRefZu" :rules="rulesZu">
                       <el-row :gutter="40">
                       <el-col :span="12">
                           <el-form-item label="CPU核心数:" prop="mdCPU" style="margin-left: -2%;">
-                              <el-input v-model="form.mdCPU" style="width: 50%;" placeholder=""/>
+                              <el-input v-model="formZu.mdCPU" style="width: 50%;" placeholder=""/>
                               <div style="margin-left: 2%;">
                               </div>
@@ -335,7 +325,7 @@
                       </el-col>
                       <el-col :span="12">
                           <el-form-item label="内存:" prop="name">
-                            <el-input v-model="form.region" style="width: 50%;" placeholder=""/>
+                            <el-input v-model="formZu.region" style="width: 50%;" placeholder=""/>
                               <div style="margin-left: 2%;">
                                 M
                               </div>
@@ -345,13 +335,13 @@
                       <el-row :gutter="40">
                       <el-col :span="12">
                           <el-form-item label="是否需要GPU:">
-                              <el-switch v-model="form.mdGPU" />
+                              <el-switch v-model="formZu.mdGPU" />
                           </el-form-item>
                       </el-col>
                       <el-col :span="12">
                           <el-form-item label="平台:" prop="name">
                             <el-select
-                                v-model="value"
+                                v-model="formZu.name"
                                 style="width: 50%;"
                             >
                                 <el-option
@@ -573,9 +563,12 @@
             <template #footer>
             <span class="dialog-footer">
                 <el-button @click="forward" style="float: left;">上一步</el-button>
-                <el-button type="primary" @click="next">
+                <el-button type="primary" @click="next" v-if="active!=2">
                 下一步
                 </el-button>
+                <el-button type="primary" @click="submit" v-if="active==2">
+                提交
+                </el-button>
             </span>
             </template>
         </el-dialog>
@@ -593,6 +586,7 @@ import {
 } from '@element-plus/icons-vue'
 import { reactive } from 'vue'
 import { forwardRefProps } from 'element-plus/es/components/tooltip-v2/src/forward-ref.mjs';
+import { getToken } from "@/utils/auth";
 const { proxy } = getCurrentInstance();
 const dragTableRef = ref()
 const dialogVisible = ref(false)
@@ -647,6 +641,47 @@ const data = reactive({
   }
 });
 
+const formJi = ref({});
+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 formTi = ref({});
+const rulesTi = reactive({
+  ti: [{ required: true, message: '必填', trigger: 'blur' }],
+  developer: [{ required: true, message: '必填', trigger: 'blur' }],
+  mdContact: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefTi = ref();
+
+const formZu = ref({});
+const rulesZu = reactive({
+  name: [{ required: true, message: '必填', trigger: 'blur' }],
+  developer: [{ required: true, message: '必填', trigger: 'blur' }],
+  mdCPU: [{ required: true, message: '必填', trigger: 'blur' }],
+  mdContact: [{ required: true, message: '必填', trigger: 'blur' }],
+});
+const formRefZu = ref();
+
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: "",
+  // 是否禁用上传
+  isUploading: false,
+  // 是否更新已经存在的用户数据
+  updateSupport: 0,
+  // 设置上传的请求头部
+  headers: { Authorization: "Bearer " + getToken() },
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
+});
+const totalComReg = ref()
+const currentPage = ref(1)
 const { queryParams, form, rules } = toRefs(data);
 const tableData2 = ref([ 
   { date1:'流域拓扑', date2:'', date3:'single', date4:'基于水文响应' },
@@ -676,6 +711,24 @@ let tableData = ref([{name:'1'}])
 const heightAll = window.innerHeight
 const valueHelpSel = '';
 const tableheight = window.innerHeight*0.7
+const optionsType = [
+  {
+    value: '1',
+    label: '水利专业模型',
+  },
+  {
+    value: '2',
+    label: '排水专业模型',
+  },
+  {
+    value: '3',
+    label: '供水专业模型',
+  },
+  {
+    value: '4',
+    label: '海洋专业模型',
+  },
+]
 const options = [
   {
     value: 'Option1',
@@ -698,6 +751,24 @@ const options = [
     label: 'Option5',
   },
 ]
+onMounted(() => {
+  getModelListTable()
+  // addNewModel()
+});
+function submit(){
+  const data = ref({ user:1 });
+  data.value = { ...data.value, ...{ age: 20 } };
+  console.log(data.value)
+  const formTotal = { ...formJi.value,...formTi.value,...formZu.value, };
+  addModel(formTotal).then(res=>{
+    
+  })
+}
+function clearForm(){
+  formJi.value = {}
+  formTi.value = {}
+  formZu.value = {}
+}
 function addNewModel(){
   addModel(form).then(res=>{
 
@@ -706,13 +777,18 @@ function addNewModel(){
 function reg(){
   dialogVisible.value = true
 }
+function changePage(a){
+  currentPage.value = a
+  getModelListTable()
+}
 function getModelListTable(){
   var par = {
-    pageNum: 1,
+    pageNum: currentPage,
     pageSize: 10,
   }
   getModelList(par).then(res=>{
     tableData.value = res.rows
+    totalComReg.value = res.total
     console.log(tableData)
   })
 }
@@ -726,93 +802,32 @@ function handleDelete(row) {
 };
 const seledMo = ['primary','plain','plain','plain','plain','plain','plain']
 const next = () => {
-  console.log(active.value)
   active.value++
+  // if(active.value==0){
+  //   formRefJi.value.validate((valid) => {
+  //     formRefTi.value.validate((valid1) => {
+  //       if(active.value<2&&valid&&valid1){
+  //         active.value++
+  //       }
+  //     });
+  //   });
+  // }
+  // if(active.value==1){
+  //   formRefZu.value.validate((valid) => {
+  //       if(active.value<2&&valid){
+  //         active.value++
+          
+  //       }
+  //   });
+  // }
 }
 const forward = () => {
-  console.log(active.value)
-  active.value--
-}
-
-let sortableInstance = null;
-
-// 初始化拖拽
-const initSortable = () => {
-  const tbody = document.querySelector('.draggable-table .el-table__body-wrapper tbody');
-  
-  if (!tbody) return;
-  
-  // 销毁旧实例避免重复绑定
-  if (sortableInstance) {
-    sortableInstance.destroy();
+  if(active.value>0){
+    active.value--
   }
-
-  sortableInstance = Sortable.create(tbody, {
-    handle: '.drag-handle', // 指定拖动手柄[9](@ref)
-    animation: 150,
-    ghostClass: 'ghost',
-    preventOnFilter: false, // 禁用默认选中行为[7](@ref)
-    
-    // 拖拽结束回调
-    onEnd: (event) => {
-      const { oldIndex, newIndex } = event;
-      
-      // 深拷贝避免数据污染
-      const newData = [...tableData2.value];
-      const [movedItem] = newData.splice(oldIndex, 1);
-      newData.splice(newIndex, 0, movedItem);
-      
-      tableData2.value = newData; // 响应式更新数据
-      
-      // 等待DOM更新后重新初始化
-      nextTick(() => {
-        initSortable();
-      });
-    }
-  });
-};
-let sortableInstance1 = null
-const initSortable1 = () => {
-  const tbody = document.querySelector('.draggable-table1 .el-table__body-wrapper tbody');
   
-  if (!tbody) return;
-  
-  // 销毁旧实例避免重复绑定
-  if (sortableInstance1) {
-    sortableInstance1.destroy();
-  }
+}
 
-  sortableInstance1 = Sortable.create(tbody, {
-    handle: '.drag-handle', // 指定拖动手柄[9](@ref)
-    animation: 150,
-    ghostClass: 'ghost',
-    preventOnFilter: false, // 禁用默认选中行为[7](@ref)
-    
-    // 拖拽结束回调
-    onEnd: (event) => {
-      const { oldIndex, newIndex } = event;
-      
-      // 深拷贝避免数据污染
-      const newData = [...tableData3.value];
-      const [movedItem] = newData.splice(oldIndex, 1);
-      newData.splice(newIndex, 0, movedItem);
-      
-      tableData3.value = newData; // 响应式更新数据
-      
-      // 等待DOM更新后重新初始化
-      nextTick(() => {
-        initSortable1();
-      });
-    }
-  });
-};
-// 生命周期管理
-onMounted(() => {
-  nextTick(initSortable);
-  nextTick(initSortable1);
-  // getModelListTable()
-  // addNewModel()
-});
 
 onUnmounted(() => {
   if (sortableInstance) {

+ 331 - 10
ruoyi-ui/src/views/service/info/AeService.vue

@@ -1,13 +1,13 @@
 <template>
   <el-row :gutter="10" class="ae-service">
     <el-col :span="24">
-      <el-card class="header-card">
+      <!-- <el-card class="header-card">
         <el-steps :active="step" finish-status="success">
           <el-step title="基本信息" @click.native="onStep(0)"></el-step>
           <el-step title="参数/返回值" @click.native="onStep(1)"></el-step>
           <el-step title="数据集" @click.native="onStep(2)"></el-step>
         </el-steps>
-      </el-card>
+      </el-card> -->
     </el-col>
     <el-col :span="24" class="service-body">
       <el-card>
@@ -29,8 +29,12 @@
                 clearable
               />
             </el-form-item>
-            <el-form-item label="服务名称" prop="name">
-              <el-input v-model="form.name"></el-input>
+            <el-form-item label="服务名称" prop="name" style="width: 70%;">
+              <div style="display: flex;width: 100%;">
+                <el-input v-model="form.name"></el-input>
+                <el-button @click="saveService" size="small" type="primary" plain style="margin-left: 1%;">文档模式</el-button>
+                <el-button @click="saveService" size="small" type="warning" plain>调试模式</el-button>
+              </div>
             </el-form-item>
             <el-form-item label="接口地址" prop="urlSuffix">
               <el-input v-model="form.urlSuffix">
@@ -42,7 +46,7 @@
                 </template>
               </el-input>
             </el-form-item>
-            <el-row>
+            <!-- <el-row>
               <el-col :span="11">
                 <el-form-item label="开放等级">
                   <el-select v-model="form.openCndtn">
@@ -64,7 +68,7 @@
                   </el-select>
                 </el-form-item>
               </el-col>
-            </el-row>
+            </el-row> -->
             <el-row>
               <el-col :span="11">
                 <el-form-item label="请求方式">
@@ -99,7 +103,7 @@
                 </el-form-item>
               </el-col>
             </el-row>
-            <el-row>
+            <!-- <el-row>
               <el-col :span="24">
                 <el-form-item label="所属业务系统">
                   <el-input v-model="form.serviceSource"></el-input>
@@ -141,7 +145,7 @@
                   <el-input v-model="form.maintainContacer"></el-input>
                 </el-form-item>
               </el-col>
-            </el-row>
+            </el-row> -->
             <el-form-item label="服务说明">
               <el-input v-model="form.intro" type="textarea"></el-input>
             </el-form-item>
@@ -170,6 +174,159 @@
               ></el-button>
             </el-row>
           </el-form>
+          <el-tabs v-model="activeName" type="card">
+            <el-tab-pane label="请求参数" name="first">
+              <p><label style="padding: 0 10px">地址</label>{{ url }}</p>
+              <el-divider></el-divider>
+              <service-param
+                :srvId="srvId"
+                :url="url"
+                @forwardStep="forwardStep"
+                @nextStep="nextStep"
+              ></service-param>
+            </el-tab-pane>
+            <el-tab-pane label="返回值" name="second">
+              <p><label style="padding: 0 10px">地址</label>{{ url }}</p>
+              <el-divider></el-divider>
+              <service-return
+                :srvId="srvId"
+                :url="url"
+                @forwardStep="forwardStep"
+                @nextStep="nextStep"
+              ></service-return>
+            </el-tab-pane>
+          </el-tabs>
+          <div class="app-container consult-list">
+            <h3>
+              数据集
+              <el-tooltip
+                content="数据集是存放服务的数据文件,支持JSON、EXCEL格式文件。用户可下载文件获取数据。"
+                placement="top-start"
+                effect="light"
+              >
+                <i class="el-icon-question"></i>
+              </el-tooltip>
+            </h3>
+            <el-divider></el-divider>
+            <el-row type="flex" justify="space-between">
+              <el-col :span="18">
+                <el-form :inline="true" :model="table.query.data">
+                  <el-form-item>
+                    <el-input
+                      placeholder="数据集名称"
+                      v-model="table.query.data.title"
+                    ></el-input>
+                  </el-form-item>
+                  <el-form-item>
+                    <el-button
+                      type="primary"
+                      @click="getOpenDataList"
+                      icon="Search"
+                      size="small"
+                    >
+                      查询
+                    </el-button>
+                  </el-form-item>
+                </el-form>
+              </el-col>
+              <el-col :span="2" style="text-align: right">
+                <el-upload
+                  ref="upload"
+                  name="file"
+                  :action="uploadUrl"
+                  :headers="headers"
+                  :before-upload="handleBeforeUpload"
+                  :on-success="handleUploadSuccess"
+                  :on-error="handleUploadError"
+                  :data="uploadData"
+                  :show-file-list="false"
+                >
+                  <el-button size="small" type="primary">添加数据集</el-button>
+                </el-upload>
+              </el-col>
+            </el-row>
+            <el-row class="table_box">
+              <el-table
+                stripe
+                :data="table.list"
+                :height="table.height"
+                style="width: 100%"
+                size="small"
+                :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 table.params"
+                  :key="index"
+                  header-align="center"
+                  :align="param.align ? param.align : 'center'"
+                  :width="param.width ? param.width : 'auto'"
+                  :prop="param.paramCode"
+                  :label="param.paramName"
+                >
+                  <template #default="scope">
+                    <span v-if="param.paramCode != 'viewNum'">
+                      {{ scope.row[param.paramCode] }}
+                    </span>
+                    <span v-if="param.paramCode == 'viewNum'">
+                      <el-tag disable-transitions>
+                        {{
+                          scope.row[param.paramCode] == null
+                            ? "0"
+                            : scope.row[param.paramCode]
+                        }}
+                      </el-tag>
+                    </span>
+                  </template>
+                </el-table-column>
+                <el-table-column fixed="right" align="center" label="操作" width="auto">
+                  <template #default="scope">
+                    <!-- <el-button @click="handlerDoc('view', scope.row)">
+                      预览
+                    </el-button> -->
+                    <el-button type="primary" @click="downloadFile(scope.row)">
+                      下载
+                    </el-button>
+                    <el-button
+                      type="danger"
+                      @click="deleteServiceFile(scope.row.fileId)"
+                    >
+                      删除
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+              <pagination
+                v-show="table.total > 0"
+                :total="table.total"
+                :page.sync="table.query.pageNum"
+                :limit.sync="table.query.pageSize"
+                @pagination="getOpenDataList"
+              />
+            </el-row>
+            <el-row type="flex" justify="center">
+              <!-- <el-button
+                icon="ArrowLeft"
+                @click="forwardStep"
+                circle
+              ></el-button>
+              <el-button @click="exit">退出</el-button>
+              <el-button
+                icon="ArrowRight"
+                @click="nextStep"
+                disabled
+                circle
+              ></el-button> -->
+            </el-row>
+            <a ref="downloadTools" style="display: none" href="" download=""></a>
+          </div>
+
         </div>
         <div class="box" v-show="step === 1">
           <param-and-file
@@ -200,13 +357,68 @@ import ParamAndFile from "./paramAndFile.vue";
 import ServiceFile from "./serviceFile.vue";
 import { getDicts } from "@/api/system/dict/data";
 import useDictStore from '@/store/modules/dict'
-
+import ServiceParam from "./serviceParam.vue";
+import ServiceReturn from "./serviceReturn.vue";
+import {
+  getServiceFile,
+  updateServiceFile,
+  deleteServiceFile,
+} from "@/api/service/serviceFile.js";
+import {getToken} from "@/utils/auth";
 export default {
   props: ["service", "serviceVisible"],
-  components: {ParamAndFile, ServiceFile},
+  components: {ParamAndFile, ServiceFile,ServiceParam, ServiceReturn},
   dicts: ["service_data_field"],
   data() {
     return {
+      uploadUrl: "/pt/service/file/add",
+      headers: {Authorization: "Bearer " + getToken()},
+      fileSize: "100",
+      uploadData: {},
+      fileTypes: [
+        "application/vnd.ms-excel",
+        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel",
+        "application/pdf",
+        "text/xml, application/xml",
+        "application/xml",
+        "text/xml",
+        "application/json",
+        "text/csv",
+      ],
+      table: {
+        height: window.innerHeight - 430,
+        list: [],
+        params: [
+          {
+            paramCode: "fileViewname",
+            paramName: "数据集名称",
+            align: "left",
+            width: "200",
+          },
+          {
+            paramCode: "fileType",
+            paramName: "数据集类型",
+            width: "100",
+          },
+          {
+            paramCode: "fileSize",
+            paramName: "数据集大小",
+            width: "100",
+          },
+          {paramCode: "viewNum", paramName: "访问数量/次", width: "90"},
+          {paramCode: "fileTime", paramName: "提交时间", width: "120"},
+        ],
+        total: 0,
+        query: {
+          pageNum: 1,
+          pageSize: 20,
+          orderBy: "",
+          data: {
+            name: "",
+          },
+        },
+      },
       step: 0,
       type: "添加",
       optionsDataField:[],
@@ -245,6 +457,7 @@ export default {
         },
         options: [],
       },
+      activeName: "first",
       rules: {
         name: [
           {
@@ -260,6 +473,7 @@ export default {
             trigger: "blur",
           },
         ],
+        
         cateCode: [
           {
             type: "string",
@@ -274,8 +488,115 @@ export default {
   mounted() {
     this.fetchData();
     this.getDicts()
+    this.getOpenDataList();
   },
   methods: {
+    
+    // 前进一步
+    forwardStep() {
+      this.$emit("forwardStep");
+    },
+    // 后退一步
+    nextStep() {
+      this.$emit("nextStep");
+    },
+    // 查询帮助数据集表
+    getOpenDataList() {
+      if (!this.srvId) {
+        return;
+      }
+      getServiceFile(this.table.query, this.srvId).then((r) => {
+        this.table.list = r.rows;
+        this.table.total = r.total;
+      });
+    },
+    // 下载文件
+    downloadFile(file) {
+      if (file) {
+        this.$refs.downloadTools.href = "/doc/files" + file.path;
+        this.$refs.downloadTools.download = file.name;
+        this.$refs.downloadTools.click();
+      }
+    },
+    // 删除文件
+    deleteServiceFile(id) {
+      deleteServiceFile(id)
+        .then(() => {
+          this.$message.success("文件删除成功");
+          this.getOpenDataList();
+        })
+        .catch(() => {
+          this.$message.error("文件删除失败");
+        });
+    },
+    // 上传前校检格式和大小
+    handleBeforeUpload(file) {
+      if (!this.srvId) {
+        return;
+      }
+      this.headers.srvId = this.srvId;
+      this.uploadData = {srvId: this.srvId};
+      const pattern = /\.{1}[A-Za-z]{1,}$/;
+      let fileExt = pattern.exec(file.name);
+      const checkType = this.fileTypes.includes(file.type);
+      debugger;
+      if (!checkType) {
+        this.$message.warning(
+          "只能上传 .xls、.xlsx、.json、.xml、.csv 格式的文件!"
+        );
+        return false;
+      }
+      if (![".xls", ".xlsx"].includes(fileExt[0].toLowerCase())) {
+        this.$message.warning(
+          "只能上传 .xls、.xlsx、.json、.xml、.csv 格式的文件!"
+        );
+        return false;
+      }
+      // 校检文件大小
+      if (this.fileSize) {
+        const isLt = file.size / 1024 / 1024 < this.fileSize;
+        if (!isLt) {
+          this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
+          return false;
+        }
+      }
+      return true;
+    },
+    // 上传成功后
+    handleUploadSuccess(res, file) {
+      this.getOpenDataList();
+
+      // // 获取富文本组件实例
+      // let quill = this.Quill;
+      // // 如果上传成功
+      // if (res.code == 200) {
+      //   // 获取光标所在位置
+      //   let length = quill.getSelection().index;
+      //   // 插入图片  res.url为服务器返回的图片地址
+      //   quill.insertEmbed(
+      //     length,
+      //     "image",
+      //     process.env.VUE_APP_BASE_API + res.fileName
+      //   );
+      //   // 调整光标到最后
+      //   quill.setSelection(length + 1);
+      // } else {
+      //   this.$message.error("文件上传成功");
+      // }
+    },
+    // 文件上传失败
+    handleUploadError() {
+      this.$message.error("文件上传失败");
+    },
+    // 退出
+    exit() {
+      this.$nextTick(() => {
+        this.$router.replace({
+          query: {isClose: "true"},
+        });
+      });
+    },
+  
     getDicts(){
       getDicts('service_data_field').then((r) => {
         for(var i =0;i<r.data.length;i++){

+ 87 - 2
ruoyi-ui/src/views/service/info/index.vue

@@ -52,6 +52,79 @@
           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
@@ -108,7 +181,7 @@
             </el-button>
           </template>
         </el-table-column>
-      </el-table>
+      </el-table> -->
     </el-row>
     <el-row>
 
@@ -211,9 +284,21 @@ export default {
       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 = r.rows
+        this.tableData = this.addDetailPropertyInPlace(r.rows)
+        console.log(this.tableData)
         this.dataTotal = r.total;
       });
     },

+ 4 - 4
ruoyi-ui/src/views/service/info/serviceReturn.vue

@@ -80,13 +80,13 @@
       </tr>
     </table>
     <el-row type="flex" justify="center">
-      <el-button
+      <!-- <el-button
         icon="ArrowLeft"
         @click="forwardStep"
         circle
-      ></el-button>
+      ></el-button> -->
       <el-button @click="addReturn">新增参数</el-button>
-      <el-button type="primary" @click="submitForm('serviceReturnForm')">
+      <!-- <el-button type="primary" @click="submitForm('serviceReturnForm')">
         保存
       </el-button>
       <el-button @click="exit">退出</el-button>
@@ -94,7 +94,7 @@
         icon="ArrowRight"
         @click="nextStep"
         circle
-      ></el-button>
+      ></el-button> -->
     </el-row>
   </el-form>
 </template>