From ee91aeb24caae7bd8e5e0fdbf50f6ddb86e8d1ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AF=9B=E9=B9=8F?= <729164035@qq.com> Date: Mon, 20 Oct 2025 15:31:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=A5=E5=8F=A3=E7=9A=84?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MangoServer/src/auto_test/auto_api/urls.py | 4 +- .../src/auto_test/auto_api/views/api_info.py | 45 +++++++ .../0011_alter_projectproduct_name.py | 18 +++ .../src/auto_test/auto_system/models.py | 2 +- MangoServer/src/tools/view/response_msg.py | 2 + .../upload_template/接口批量上传模版.xlsx | Bin 0 -> 10754 bytes mango-console/src/api/apitest/info.ts | 16 +++ .../src/views/apitest/info/index.vue | 115 +++++++++++++++++- 8 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 MangoServer/src/auto_test/auto_system/migrations/0011_alter_projectproduct_name.py create mode 100644 MangoServer/upload_template/接口批量上传模版.xlsx diff --git a/MangoServer/src/auto_test/auto_api/urls.py b/MangoServer/src/auto_test/auto_api/urls.py index fd9538b4..3c00122d 100644 --- a/MangoServer/src/auto_test/auto_api/urls.py +++ b/MangoServer/src/auto_test/auto_api/urls.py @@ -20,6 +20,7 @@ urlpatterns = [ path("info/type", ApiInfoViews.as_view({'put': 'put_api_info_type'})), path("info/copy", ApiInfoViews.as_view({'post': 'copy_api_info'})), path("info/import/api", ApiInfoViews.as_view({'post': 'import_api'})), + path("upload/api", ApiInfoViews.as_view({'post': 'post_upload_api'})), # path("case", ApiCaseCRUD.as_view()), path("case/test", ApiCaseViews.as_view({'get': 'api_test_case'})), @@ -33,7 +34,8 @@ urlpatterns = [ path("case/detailed/refresh", ApiCaseDetailedViews.as_view({'put': 'put_refresh_api_info'})), # path("case/detailed/parameter", ApiCaseDetailedParameterCRUD.as_view()), - path("case/detailed/parameter/test/jsonpath", ApiCaseDetailedParameterViews.as_view({'post': 'post_test_jsonpath'})), + path("case/detailed/parameter/test/jsonpath", + ApiCaseDetailedParameterViews.as_view({'post': 'post_test_jsonpath'})), # path("public", ApiPublicCRUD.as_view()), path("public/status", ApiPublicViews.as_view({'put': 'put_status'})), diff --git a/MangoServer/src/auto_test/auto_api/views/api_info.py b/MangoServer/src/auto_test/auto_api/views/api_info.py index 0098e8b4..b47ded44 100644 --- a/MangoServer/src/auto_test/auto_api/views/api_info.py +++ b/MangoServer/src/auto_test/auto_api/views/api_info.py @@ -6,6 +6,7 @@ import json from urllib.parse import urlparse, parse_qs +import pandas as pd from curlparser import parse from django.forms import model_to_dict from rest_framework import serializers @@ -15,6 +16,7 @@ from rest_framework.viewsets import ViewSet from src.auto_test.auto_api.models import ApiInfo from src.auto_test.auto_api.service.test_case.test_api_info import TestApiInfo +from src.auto_test.auto_system.models import ProjectProduct, ProductModule from src.auto_test.auto_system.views.product_module import ProductModuleSerializers from src.auto_test.auto_system.views.project_product import ProjectProductSerializersC from src.enums.api_enum import MethodEnum @@ -148,3 +150,46 @@ class ApiInfoViews(ViewSet): result['json'] = json.dumps(parsed.json, indent=4, ensure_ascii=False) data = ApiInfoCRUD.inside_post(result) return ResponseData.success(RESPONSE_MSG_0069, data=data) + + @action(methods=['POST'], detail=False) + @error_response('ui') + def post_upload_api(self, request): + uploaded_file = request.FILES['file'] + df = pd.read_excel(uploaded_file, keep_default_na=False) + df = df.where(df.notna(), None) + df = df.replace('', None) + df['*请求方法'] = df['*请求方法'].map(MethodEnum.reversal_obj()) + + df = df.rename(columns={ + '*产品名称': 'project_product', + '*模块名称': 'module', + '*接口名称': 'name', + '*请求方法': 'method', + '*url': 'url', + '请求头': 'headers', + '参数': 'params', + '表单': 'data', + 'JSON': 'json', + '文件': 'file', + }) + for index, row in df.iterrows(): + record = row.to_dict() + record['type'] = request.data.get("type") + try: + record['project_product'] = ProjectProduct.objects.get(name=record['project_product']).id + record['module'] = ProductModule.objects.get(name=record['module'], + project_product=record['project_product']).id + except ( + ProductModule.MultipleObjectsReturned, ProjectProduct.MultipleObjectsReturned, ProductModule.DoesNotExist, + ProjectProduct.DoesNotExist): + return ResponseData.fail(RESPONSE_MSG_0138) + for i in ['headers', 'params', 'data', 'json', 'file']: + if record[i] == '' or record[i] is None: + record[i] = None + elif i == 'file': + try: + record[i] = json.loads(record[i]) + except json.decoder.JSONDecodeError: + return ResponseData.fail(RESPONSE_MSG_0137) + ApiInfoCRUD.inside_post(record) + return ResponseData.success(RESPONSE_MSG_0083) diff --git a/MangoServer/src/auto_test/auto_system/migrations/0011_alter_projectproduct_name.py b/MangoServer/src/auto_test/auto_system/migrations/0011_alter_projectproduct_name.py new file mode 100644 index 00000000..958db7b7 --- /dev/null +++ b/MangoServer/src/auto_test/auto_system/migrations/0011_alter_projectproduct_name.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.5 on 2025-10-20 07:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auto_system', '0010_testsuitedetails_case_sum_testsuitedetails_fail_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='projectproduct', + name='name', + field=models.CharField(max_length=64, unique=True, verbose_name='产品名称'), + ), + ] diff --git a/MangoServer/src/auto_test/auto_system/models.py b/MangoServer/src/auto_test/auto_system/models.py index caeb5147..5d55dfe5 100644 --- a/MangoServer/src/auto_test/auto_system/models.py +++ b/MangoServer/src/auto_test/auto_system/models.py @@ -31,7 +31,7 @@ class ProjectProduct(models.Model): create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True) update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True) project = models.ForeignKey(to=Project, to_field="id", on_delete=models.PROTECT) - name = models.CharField(verbose_name="产品名称", max_length=64) + name = models.CharField(verbose_name="产品名称", max_length=64, unique=True) ui_client_type = models.SmallIntegerField(verbose_name="UI客户端类型", default=0) api_client_type = models.SmallIntegerField(verbose_name="API客户端类型", default=0) diff --git a/MangoServer/src/tools/view/response_msg.py b/MangoServer/src/tools/view/response_msg.py index f276228f..6099d7d8 100644 --- a/MangoServer/src/tools/view/response_msg.py +++ b/MangoServer/src/tools/view/response_msg.py @@ -139,3 +139,5 @@ RESPONSE_MSG_0133 = (200, '测试子任务成功') RESPONSE_MSG_0134 = (300, '只支持cURL(base)的格式') RESPONSE_MSG_0135 = (200, '提取jsonpath预发成功') RESPONSE_MSG_0136 = (200, '设置日志状态成功') +RESPONSE_MSG_0137 = (300, 'file必须上传json格式,请参照webAPI新增模版') +RESPONSE_MSG_0138 = (300, '请确保上传的产品和模块没有重名,并且存在') diff --git a/MangoServer/upload_template/接口批量上传模版.xlsx b/MangoServer/upload_template/接口批量上传模版.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..87ad9b65b3ecc702b8e0ad8672e147456adf984f GIT binary patch literal 10754 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 WG4Pit2Czw>0L234tU~hg*Z%;4A+W;$ literal 0 HcmV?d00001 diff --git a/mango-console/src/api/apitest/info.ts b/mango-console/src/api/apitest/info.ts index 386c6933..33ee76c4 100644 --- a/mango-console/src/api/apitest/info.ts +++ b/mango-console/src/api/apitest/info.ts @@ -92,3 +92,19 @@ export function postApiCopyInfo(id: number) { }, }) } + +export function postApiUploadApi(type: number, file?: File) { + const formData = new FormData() + formData.append('type', type.toString()) + if (file) { + formData.append('file', file) + } + + return post({ + url: '/api/upload/api', + data: () => formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} diff --git a/mango-console/src/views/apitest/info/index.vue b/mango-console/src/views/apitest/info/index.vue index ef6e1301..fda0832f 100644 --- a/mango-console/src/views/apitest/info/index.vue +++ b/mango-console/src/views/apitest/info/index.vue @@ -11,7 +11,7 @@ + + + + 下载模板 + + + tips:如果需要直接上传到调试接口Tab里面,请点击开关打开 +
+ 选择文件 + 已选择: {{ selectedFile.name }} + +
+
+
+