فهرست منبع

'430提交,完善在线输入逻辑,可正常保存文件并获取mission'

Lan 2 هفته پیش
والد
کامیت
f742871e8f

BIN
backend/api/__pycache__/api_prepare.cpython-310.pyc


BIN
backend/api/__pycache__/api_rawDataTrans.cpython-310.pyc


BIN
backend/api/__pycache__/urls.cpython-310.pyc


+ 86 - 1
backend/api/api_prepare.py

@@ -13,7 +13,10 @@ from api.utils import *
 from api.models import File, Mission, Plan, Algorithm
 
 import json
-    
+import logging 
+
+logger = logging.getLogger('prepare')
+
 class UploadFileAPI(APIView):
     def get(self, request):
         user = request.user
@@ -125,6 +128,88 @@ class UploadFileAPI(APIView):
             return failed(messgae="删除文件失败")
 
 
+class InputFileAPI(APIView):
+    def post(self, request):
+        user = request.user
+        nodes = request.data.get('nodes')
+        edges = request.data.get('edges')
+        logger.info(nodes)
+        logger.info(edges)
+        # 保存节点文件
+        # 当前设置输入的节点信息仅包含一个名称
+        nodesFile = File.objects.create(type='csv', usage='input', user=user, content='node')
+        try:
+            nodesCsvList = []
+            for node in nodes:
+                nodeList = [int(node['id']), str(node['type'])]
+                for key in [k for k in node if k not in ['id', 'type']]:
+                    nodeList.append(str(key) + ':' +str(node[key]))
+                nodesCsvList.append(nodeList)
+            logger.info(nodesCsvList)
+            nodesFile.generate(nodesCsvList)
+        except Exception:
+            # 回退操作
+            logger.error(f"从输入信息创建节点文件失败 Error:{Exception}")
+            nodesFile.delete()
+        # 保存边文件
+        edgesFile = File.objects.create(type='csv', usage='input', user=user, content='edge')
+        try:
+            edgesCsvList = []
+            for edge in edges:
+                # 边中应至少有source和target两个参数
+                edgeList = [int(edge['source']), int(edge['target'])]
+                for key in [k for k in edge if k not in ['source', 'target']]:
+                    edgeList.append(str(key) + ':' + str(edge[key]))
+                edgesCsvList.append(edgeList)
+            logger.info(edgesCsvList)
+            edgesFile.generate(edgesCsvList)
+        except Exception:
+            # 回退操作
+            logger.error(f"从输入信息创建边文件失败 Error:{Exception}")
+            nodesFile.delete()
+            edgesFile.delete()
+        
+        # 节点和边均保存成功,可以互相关联并创建mission
+        nodesFile.associate = edgesFile
+        edgesFile.associate = nodesFile
+        # 计算节点和边的信息,生成fileInfo
+        nodesFile.saveWithInfo()
+        edgesFile.saveWithInfo()
+        # 构造mission并返回完整信息
+        successUploadedFiles = []
+        if nodesFile.checkIllegal() and edgesFile.checkIllegal():
+            # 确保正确后创建mission,并将信息返回
+            mission = Mission()
+            mission.nodeFile = nodesFile
+            mission.edgeFile = edgesFile
+            mission.user = user
+            mission.save()
+            successUploadedFiles.append({
+                "id": mission.id,
+                "name": mission.name,
+                "content": "mission",
+            })
+            
+            # 初步对文件内容进行分析,获取节点和边的基本数据
+            for file in [nodesFile, edgesFile]:
+                successUploadedFiles.append({
+                    "id": file.id,
+                    "name": file.name,
+                    "content": file.content,
+                    "nodes": file.own_file_info.nodes,
+                    "sNodes": file.own_file_info.sNodes,
+                    "dNodes": file.own_file_info.dNodes,
+                    "iNodes": file.own_file_info.iNodes,
+                    "edges": file.own_file_info.edges,
+                })
+            return success(message="文件上传成功", data=successUploadedFiles, code=200)
+        else:
+            logger.error("节点和边文件的合法性检测未通过")
+            nodesFile.delete()
+            edgesFile.delete()
+            return failed(message="节点和边信息输入失败,节点或边信息未通过合法性检测")
+
+
 class PlanAPI(APIView):
     def post(self, request):
         user = request.user

+ 4 - 6
backend/api/api_rawDataTrans.py

@@ -50,16 +50,14 @@ class RawDataTrans(APIView):
             else:
                 edges = None
             progress = progress_data['progress']
-            print(request.data)
-            print(mission, plan, progress)
             for param in [mission, plan, progress]:
                 if param is None:
-                    print("结果传递参数不足")
+                    logger.error(f"传递计算结果缺少参数")
                     return failed(message="缺少结果参数")
                 
             if int(progress) == 100:
                 if not nodes or not edges:
-                    print("进度完成却没有返回结果数据")
+                    logger.error(f"传递计算结果进度达到100却没有结果")
                     return failed(message="缺少结果参数")
             try:
                 result = plan.own_result
@@ -69,12 +67,12 @@ class RawDataTrans(APIView):
                     nodeFile = File(type='csv', usage='result', content='node', user=plan.user)
                     nodeFile.save()
                     if not nodeFile.generate(nodes) == OK:
-                        print("保存节点结果文件失败")
+                        logger.error("保存计算结果文件失败")
                         return failed(message="保存节点结果文件失败")
                     edgeFile = File(type='csv', usage='result', content='edge', user=plan.user)
                     edgeFile.save()
                     if not edgeFile.generate(edges) == OK:
-                        print("保存边结果文件失败")
+                        logger.error("保存计算结果文件失败")
                         return failed(message="保存边结果文件失败")
                     nodeFile.associate = edgeFile
                     edgeFile.associate = nodeFile

BIN
backend/api/models/__pycache__/file.cpython-310.pyc


+ 8 - 7
backend/api/models/file.py

@@ -80,7 +80,7 @@ class File(models.Model):
     def saveWithInfo(self):
         path = os.path.join(os.path.join(BASE_FILE_PATH, str(self.user.id)), str(self.id))
         path2 = os.path.join(os.path.join(BASE_FILE_PATH, str(self.user.id)), str(self.associate.id))
-        if self.content == 'node':
+        if self.content in ['node', 'nodes']:
             sCount = dCount = iCount = 0
             nodeFile = csv.reader(open(path, 'r'))
             for line in nodeFile:
@@ -97,7 +97,7 @@ class File(models.Model):
             fileInfo.dNodes = dCount
             fileInfo.iNodes = iCount
             fileInfo.save()
-        if self.content == 'edge':
+        if self.content in ['edge', 'edges']:
             edges = 0
             edgeFile = csv.reader(open(path2, 'r'))
             for line in edgeFile:
@@ -144,6 +144,7 @@ class File(models.Model):
                         print("check file illegal failed", "edge", "len =2")
                         return FAILED
                     # 注意默认将边视为无向边
+                    # 检查重复
                     if [line[0], line[1]] not in edges and [line[1], line[0]] not in edges:
                         edges.append([line[0], line[1]])
                     # 后续参数放在line的后续位置
@@ -185,8 +186,8 @@ class File(models.Model):
             if self.type == 'csv':
                 nodes = []
                 for line in file:
-                    if not len(line) == 2:
-                        print("check file illegal failed", "node", "len = 2")
+                    if not len(line) >= 2:
+                        print("check file illegal failed", "node", "len >= 2")
                         return False
                     if not line[0].isdigit():
                         print("check file illegal failed", "node", "id wrong")
@@ -208,11 +209,11 @@ class File(models.Model):
                 nodes = []
                 edges = []
                 for line in nodeFile:
-                    if not len(line) == 2:
-                        print("check file illegal failed", "node", "len = 2")
+                    if not len(line) >= 2:
+                        print("check file illegal failed", "node", "len >= 2")
                         return False
                     if not line[0].isdigit():
-                        print("check file illegal failed", "node", "len = 2")
+                        print("check file illegal failed", "node", "id wrong")
                         return False
                     nodes.append(line[0])
                 for line in edgeFile:

+ 2 - 1
backend/api/urls.py

@@ -1,7 +1,7 @@
 from django.urls import path
 from .api_user import UserRegisterAPI, UserLoginAPI
 from .api_user import getDashboard
-from .api_prepare import UploadFileAPI, PlanAPI
+from .api_prepare import UploadFileAPI, PlanAPI, InputFileAPI
 from .api_calculate import CalculateAPI
 from .api_rawDataTrans import RawDataTrans
 from .api_results import Results
@@ -23,4 +23,5 @@ urlpatterns = [
     path('alert/', AlertAPI.as_view(), name="alert_api"),
     path('alertCheck/', AlertCheck.as_view(), name="alert_check_api"),
     path('systemPerformance/', SystemPerformanceAPI.as_view(), name="system_performance_api"),
+    path('inputFile/', InputFileAPI.as_view(), name='input_file_api'),
 ]

BIN
backend/db.sqlite3


BIN
scheduler/__pycache__/processManager.cpython-310.pyc


+ 2 - 4
viewer/src/views/dashoard/analyze.vue

@@ -396,15 +396,13 @@ const handleValidation = async () => {
 
   // 执行上传
   try {
-    // await postData('/api/upload', uploadData)
-    ElMessage.success('数据验证通过,上传成功')
+    response = await postData('/inputFile/', uploadData)
+    ElMessage.success('输入数据验证通过,上传成功')
   } catch (error) {
     ElMessage.error('上传失败: ' + error.message)
   }
 }
 
-
-
 // 上传文件处理
 
 const handleNodeFileChange = (file, fileList) => {