Lan 1 month ago
parent
commit
95c7722e0b

BIN
backend/db.sqlite3


BIN
scheduler/algo1Folder/测试输出/边集(教师模型测试).xlsx


BIN
scheduler/algo1Folder/测试输出/边集(教师测试删除).xlsx


BIN
scheduler/algo1Folder/测试输出/边集(教师预测).xlsx


BIN
scheduler/algo3Folder/测试输出/边集(测试).xlsx


BIN
scheduler/algo3Folder/测试输出/边集(预测).xlsx


+ 66 - 6
viewer/src/views/dashoard/analyze.vue

@@ -155,14 +155,13 @@
         </el-card>
       </el-col>
 
-      <!-- 右侧说明 -->
+      <!-- 右侧说明 输入部分 -->
       <el-col v-if="inputMethod === 'input' || inputMethod === 'upload'" :span="8">
         <el-card class="instruction-section">
           <h3>文件格式说明</h3>
           <div class="instruction-content">
             <div class="file-format">
-              <el-tag type="success" class="format-tag">节点文件格式</el-tag>
-              <el-divider />
+              <el-divider><el-tag type="success" class="format-tag">节点文件格式</el-tag></el-divider>
               <div class="format-example">
                 <P>文件应使用CSV格式</P>
                 <p>每一行按照:“节点编号,节点类型,节点名称” 顺序放置数据</p>
@@ -175,8 +174,7 @@
             </div>
 
             <div class="file-format">
-              <el-tag type="warning" class="format-tag">边文件格式</el-tag>
-              <el-divider />
+              <el-divider><el-tag type="warning" class="format-tag">边文件格式</el-tag></el-divider>
               <div class="format-example">
                 <P>文件应使用CSV格式</P>
                 <p>每一行按照:“起始节点,终止节点” 顺序放置数据</p>
@@ -190,6 +188,59 @@
           </div>
         </el-card>
       </el-col>
+      <!-- 右侧说明 规划部分 -->
+      <el-col v-if="planning" :span="8">
+        <el-card class="instruction-section">
+          <h3>流程规划说明</h3>
+          <div class="instruction-content">
+            <div class="file-format">
+              <el-divider><el-tag type="success" class="format-tag">可选择算法</el-tag></el-divider>
+              <div class="format-example">
+                <P>拓扑优化算法: 基于CROTS算法的网络快速链路预测算法 ——丁瑞华</P>
+                <P>功能体探测算法: 给予标签传播的功能体识别算法 ——亢靖</P>
+                <P>网络演化预测算法: 基于AIProbS方法的网络链路预测 ——姚亚林</P>
+              </div>
+            </div>
+
+            <div class="file-format">
+              <el-divider><el-tag type="warning" class="format-tag">算法规划规则</el-tag></el-divider>
+              <div class="format-example">
+                <P>1、可以进行串行或并行算法处理流程规划,并行规划不超过三项,串行规划不超过六项</P>
+                <p>2、必须按照拓扑优化->功能体探测->网络演化预测算法的顺序进行串行规划</p>
+                <p>3、进行并行规划时,必须使用相同类型算法</p>
+              </div>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+      <!-- 右侧说明 计算部分 -->
+      <el-col v-if="calculating" :span="8">
+        <el-card class="instruction-section">
+          <h3>计算说明</h3>
+          <div class="instruction-content">
+            <div class="file-format">
+
+              <el-divider><el-tag type="success" class="format-tag">计算注意事项</el-tag></el-divider>
+              <div class="format-example">
+                <P>1、点击开始计算后请耐心等待,计算进度将以流程内进度条形式显示</P>
+                <P>2、流程内进度条颜色变为绿色表示该流程已计算完毕,可点击查看结果</P>
+                <P>3、点击暂停将停止所有正在运行的计算流程,不影响已计算完成流程,可中断后恢复计算</P>
+                <P>4、点击停止将停止所有计算流程,并清除现有计算结果,可重新开始计算</P>
+              </div>
+            </div>
+
+            <div class="file-format">
+
+              <el-divider><el-tag type="warning" class="format-tag">如何查看结果</el-tag></el-divider>
+              <div class="format-example">
+                <P>1、流程节点变绿后表示计算完成,点击后可以图表、网页3D、VR视图形式查看结果</P>
+                <P>2、图表与网页3D视图均可点击保存结果,将当前结果以图片形式保存</P>
+                <P>3、VR视图方式查看结果,需要在五分钟内通过VR设备输入验证码以访问</P>
+              </div>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
     </el-row>
   </div>
 </template>
@@ -207,6 +258,8 @@ const useAnalyzeInfo = inject('analyzeInfo')
 
 // 响应式数据
 const inputMethod = ref('upload')
+const planning = ref(false)
+const calculating = ref(false)
 // 上传的节点和边文件
 const nodeFile = ref(null)
 const edgeFile = ref(null)
@@ -483,8 +536,15 @@ watch(
   () => route.path,
   (newPath) => {
     // 路由变为plan时,修改显示内容
-    if (newPath === '/dashboard/analyze/plan' || newPath === '/dashboard/analyze/plan/calculate') {
+    if (newPath === '/dashboard/analyze/plan') {
+      inputMethod.value = "done"
+      planning.value = true
+      calculating.value = false
+    }
+    if (newPath === '/dashboard/analyze/plan/calculate') {
       inputMethod.value = "done"
+      planning.value = false
+      calculating.value = true
     }
     if (newPath === '/dashboard/analyze') {
       inputMethod.value = "upload"

+ 21 - 11
viewer/src/views/dashoard/calculate.vue

@@ -4,7 +4,7 @@
       <div style="display: flex; align-items: center">
         <h3 style="margin: 0; flex-grow: 1">处理算法计算&nbsp;&nbsp;&nbsp;状态:{{ missionStatus }}</h3>
         <div class="custom-icon-plans">
-          <el-button type="primary" :disabled="!['未开始计算', '暂停中'].includes(missionStatus)"
+          <el-button type="primary" :disabled="!['未开始计算', '暂停中', '已停止'].includes(missionStatus)"
             @click="startCalculate">开始</el-button>
           <el-button type="warning" :disabled="missionStatus !== '正在计算'" @click="pauseCalculate">暂停</el-button>
           <el-button type="danger" :disabled="!['正在计算', '暂停中'].includes(missionStatus)"
@@ -348,12 +348,16 @@ const startCalculate = async () => {
           if (result.missionId) {
             if (result.status === 'init') {
               missionStatus.value = '未开始计算'
-
+            } else if (result.status === 'stop') {
+              missionStatus.value = '已停止'
+              // 停止后清除所有现有进度
+              for (let i = 0; i < progress.value.length; i++) {
+                progress.value[i] = 0
+              }
             } else if (result.status === 'calculating') {
               missionStatus.value = '正在计算'
             } else if (result.status === 'pause') {
               missionStatus.value = '暂停中'
-
             } else if (result.status === 'done') {
               missionStatus.value = '已完成'
             }
@@ -382,8 +386,8 @@ const startCalculate = async () => {
           clearInterval(progressInterval.value)
         }
         // 任务状态变换,判断是否停止更新信息
-        if (['未开始计算', '暂停中'].includes(missionStatus.value)) {
-          ElMessageBox.alert("任务状态切换", "当前任务状态:" + missionStatus.value, {
+        if (['未开始计算', '暂停中', '已停止'].includes(missionStatus.value)) {
+          ElMessageBox.alert("当前任务状态:" + missionStatus.value, "任务状态切换", {
             confirmButtonText: '确定',
           })
           clearInterval(progressInterval.value)
@@ -408,10 +412,13 @@ const getCalculate = async () => {
       // 任务是否发生失败
       let missionFailed = false
       response.data.forEach(result => {
+        console.log(result)
         // 传递Mission信息
         if (result.missionId) {
-          if (result.status === 'init' || result.status === 'stop') {
+          if (result.status === 'init') {
             missionStatus.value = '未开始计算'
+          } else if (result.status === 'stop') {
+            missionStatus.value = '已停止'
           } else if (result.status === 'calculating') {
             missionStatus.value = '正在计算'
           } else if (result.status === 'pause') {
@@ -429,6 +436,7 @@ const getCalculate = async () => {
         if (result.progress !== 100) {
           missionComplete = false
         }
+        console.log(result)
         if (result.progress == -1 || result.progress == -2) {
           // -1表示单个任务中止
           console.log("由-1状态识别任务已暂停")
@@ -468,8 +476,8 @@ const pauseCalculate = async () => {
     // 切换状态
     missionStatus.value = '暂停中'
     // 清除所有未结束任务的进度
-    for(let i=0; i < progress.value.length; i++){
-      if(progress.value[i] !== 100){
+    for (let i = 0; i < progress.value.length; i++) {
+      if (progress.value[i] !== 100) {
         progress.value[i] = 0
       }
     }
@@ -492,9 +500,9 @@ const stopCalculate = async () => {
       command: 'stop',
     })
     // 切换状态
-    missionStatus.value = '未开始计算'
+    missionStatus.value = '已停止'
     // 清除所有进度
-    for(let i=0; i < progress.value.length; i++){
+    for (let i = 0; i < progress.value.length; i++) {
       progress.value[i] = 0
     }
   } catch (error) {
@@ -526,13 +534,15 @@ onMounted(() => {
       const response = await getData('/missionStatus/', { missionId: useAnalyzeInfo.analyzeInfo.value.mission.id })
       if (response.data.status === 'init') {
         missionStatus.value = '未开始计算'
-
       } else if (response.data.status === 'calculating') {
         missionStatus.value = '正在计算'
         getCalculate()
       } else if (response.data.status === 'pause') {
         missionStatus.value = '暂停中'
         getCalculate()
+      } else if (response.data.status === 'stop') {
+        missionStatus.value = '已停止'
+        getCalculate()
       } else if (response.data.status === 'done') {
         missionStatus.value = '已完成'
         getCalculate()

+ 4 - 3
viewer/src/views/dashoard/networkfile.vue

@@ -97,10 +97,12 @@ const handleDownloadFile = async (file) => {
 
       ElMessage.success('文件下载已开始')
     } catch (error) {
-      ElMessage.error('文件下载失败')
+      ElMessage.error('文件下载失败,下载前请先解密文件')
       console.error('下载错误:', error)
     }
-  }).catch(() => { })
+  }).catch(error => {
+    console.log(error)
+  })
 }
 
 const handleEncryptFile = async (file, password = "") => {
@@ -195,7 +197,6 @@ const updateUploadHistory = () => {
       // history.forEach(element => {
       //   console.log(element.uploadTime.replace('T', ' ').aplit('.')[0])
       // });
-      console.log(fileHistory.value)
     })
     .catch(error => {
       ElMessage.error('获取上传历史失败')

+ 17 - 15
viewer/src/views/dashoard/plan.vue

@@ -127,10 +127,9 @@ const edgeData = ref(useAnalyzeInfo.analyzeInfo.value.edgeFile)
 const mission = ref(useAnalyzeInfo.analyzeInfo.value.mission)
 // 算法列表
 const algorithms = ref([
-  { label: '算法A', value: 'algA', level: 0 },
-  { label: '算法B', value: 'algB', level: 1 },
-  { label: '算法C', value: 'algC', level: 2 },
-  { label: '算法D', value: 'algD', level: 3 }
+  { label: '拓扑优化算法', value: 'algA', level: 0 },
+  { label: '功能体发现算法', value: 'algB', level: 1 },
+  { label: '网络演化算法', value: 'algC', level: 2 },
 ])
 
 // 流程规划与开始计算的控制
@@ -184,7 +183,6 @@ const fetchData = async () => {
   // 如果当前没有保存的节点和边的数据,则尝试获取任务数据
   // 如果已经保存了节点和边的数据,则省略获取数据
   // 更新节点、边、任务数据
-  console.log(useAnalyzeInfo.analyzeInfo.value)
   if (nodeData.value.amound == 0 || edgeData.value.amound == 0 || mission.value.id == null) {
     const recoveryData = JSON.parse(sessionStorage.getItem('analyze-info'))
     if (recoveryData == null) {
@@ -233,7 +231,6 @@ const calculateLayout = () => {
     // 第一代按钮布局
     let currentRow = 0
     let currentCol = 0
-
     buttons.value.forEach((btn) => {
       // 仅处理根节点按钮
       if (!btn.parentId) {
@@ -292,7 +289,6 @@ const getButtonCenter = (btn) => {
 
   const containerRect = flowContainer.value.getBoundingClientRect()
   const btnRect = el.getBoundingClientRect()
-  console.log(btn.id, containerRect, btnRect)
   return {
     x: btnRect.left - containerRect.left + el.offsetWidth / 2,
     y: btnRect.top - containerRect.top + el.offsetHeight / 2,
@@ -310,7 +306,6 @@ const updateConnections = () => {
 
   connections.value = []
   // 遍历所有按钮建立连接关系
-  console.log(buttons)
   buttons.value.forEach(btn => {
     if (btn.parentId) {
       const parent = buttons.value.find(b => b.id === btn.parentId)
@@ -366,8 +361,6 @@ const deleteChildren = (btn) => {
 const handleDelete = (btn) => {
   // 处理删除逻辑
   const parent = buttons.value.find(b => b.id === btn.parentId)
-  console.log('btn', btn)
-  console.log('parent', parent)
   deleteChildren(btn)
   parent.children = parent.children.filter(b => b.id !== btn.id)
   parent.algorithms = algorithms.value.filter(al => al.level >= parent.algorithm.level)
@@ -438,6 +431,8 @@ const addButton = (parentIndex, direction, button = null) => {
     // 初始节点有更上一级
     if (parent.parentId) {
       parent = buttons.value.find(b => b.id === parent.parentId)
+    } else {
+      // 父节点没有父节点,则本节点应与父节点并列
     }
     colRecord.value.forEach((col, index) => {
       if (findEmptyCol) {
@@ -497,6 +492,7 @@ const addButton = (parentIndex, direction, button = null) => {
   }
 
   buttons.value.push(newBtn)
+
   parent.children.push(newBtn)
 
   // 添加防抖调用
@@ -510,7 +506,6 @@ const selectAlgorithm = (index, algorithm) => {
   selectedAlgorithms.value[index] = algorithm.value
   buttons.value[index].label = algorithm.label
   buttons.value[index].algorithm = algorithm
-  console.log(buttons.value[index])
   menuVisible.value[index] = false
 }
 
@@ -588,7 +583,6 @@ const submitPlan = async () => {
 
 // 初始化
 onMounted(async () => {
-  console.log("Mounted")
   try {
     await fetchData()
   } finally {
@@ -621,7 +615,7 @@ watch(
           if (mission.value.id === null) {
             // 从sessionstorage中仍未获取到数据,则需要继续跳回
             router.push("/dashboard")
-            return 
+            return
           }
           const response = await getData('/plan/', { mission: mission.value.id })
           const rootBtn = response.data.find(p => p.parent === null)
@@ -650,9 +644,17 @@ watch(
                 // 后续节点,同一个parent,在panrent的下方水平扩展
                 if (col == 0) {
                   // 子节点中第一个,在parent的下方扩展
+                  if (p.parent === rootBtn.id) {
+                    // 以虚拟根节点为父节点的节点要删去父节点
+                    p.parent = null
+                  }
                   addButton(p.parent, 'bottom', p)
                 } else {
                   // 子节点的后续,在第一个子节点的水平扩展
+                  if (p.parent === rootBtn.id) {
+                    // 以虚拟根节点为父节点的节点要删去父节点
+                    p.parent = null
+                  }
                   addButton(pre.id, 'right', p)
                 }
               }
@@ -738,11 +740,11 @@ watch(
 .left-panel {
   flex: 1;
   padding: 20px;
-  margin-right: 20px;
+  /* margin-right: 20px; */
 }
 
 .right-panel {
-  flex: 3;
+  flex: 4;
   padding: 20px;
   position: relative;
 }