Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

181250114 4 tahun lalu
induk
melakukan
8a1fb4cf52

+ 92 - 0
web/src/main/java/cn/seecoder/web/controller/InterfaceTest/InterfaceTestController.java

@@ -0,0 +1,92 @@
+package cn.seecoder.web.controller.InterfaceTest;
+
+import cn.seecoder.web.model.vo.InterfaceTest.InterfaceTestInfoVO;
+import cn.seecoder.web.model.vo.InterfaceTest.InterfaceTestResultVO;
+import cn.seecoder.web.service.InterfaceTest.InterfaceTestService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import cn.seecoder.web.model.vo.Response;
+
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/interfaces")
+@Api(tags = "接口方法测试 API")
+public class InterfaceTestController {
+
+    private final InterfaceTestService interfaceTestService;
+
+    @Autowired
+    public InterfaceTestController(InterfaceTestService interfaceTestService) {
+        this.interfaceTestService = interfaceTestService;
+    }
+    /**
+     * 创建一条接口方法测试
+     */
+    @PostMapping("/create")
+    @ApiOperation(value = "创建一个方法测试", httpMethod = "POST")
+    public Response createInterfaceTest(@RequestBody InterfaceTestInfoVO interfaceTestInfoVO) {
+        interfaceTestService.createInterfaceTest(interfaceTestInfoVO);
+        return Response.buildSuccess();
+    }
+    /**
+     * 获取所有接口方法测试
+     */
+    @GetMapping("/list/{projectId}")
+    @ApiOperation(value = "获取所有方法测试", httpMethod = "GET")
+    @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
+    public Response<List<InterfaceTestInfoVO>> getInterfaceTestInfosByProjectId(@PathVariable("projectId") Integer projectId) {
+        return Response.buildSuccess(interfaceTestService.getInterfaceTestByProjectId(projectId));
+    }
+    /**
+     * 执行一条测试
+     */
+    @GetMapping("/execute/{id}/{username}/{type}")
+    @ApiOperation(value = "执行一条方法测试", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", dataType ="int", paramType = "query"),
+            @ApiImplicitParam(name = "username", dataType ="string", paramType = "query"),
+            @ApiImplicitParam(name = "type", dataType = "string", paramType = "query")
+    })
+    public Response executeInterfaceTestById(@PathVariable("id") Integer id, @PathVariable("username") String username, @PathVariable("type") String type) throws IOException {
+        interfaceTestService.executeInterfaceTestById(id, username, type);
+        return Response.buildSuccess();
+    }
+    /**
+     * 获取指定接口方法测试的所有执行结果(手动触发)
+     */
+
+    @GetMapping("/results/{id}")
+    @ApiOperation(value = "获取一条方法测试的所有结果(手动触发)", httpMethod = "GET")
+    @ApiImplicitParam(name = "id", dataType = "int", paramType = "query")
+    public Response<List<InterfaceTestResultVO>> getInterfaceResultsById(@PathVariable("id") Integer id) {
+        return Response.buildSuccess(interfaceTestService.getInterfaceTestResultsById(id));
+    }
+
+    /**
+     * 删除一条接口方法测试
+     */
+    @GetMapping("/delete/{id}")
+    @ApiOperation(value = "删除指定方法测试", httpMethod = "DELETE")
+    @ApiImplicitParam(name = "id", dataType = "int", paramType = "query")
+    public Response deleteInterfaceInfoById(@PathVariable("id") Integer id) {
+        interfaceTestService.deleteInterfaceTestById(id);
+        return Response.buildSuccess();
+    }
+
+    /**
+     * 获取指定接口方法测试的所有执行结果(自动化测试)
+     */
+    @GetMapping("/results/auto/{id}")
+    @ApiOperation(value = "获取一条方法测试的所有结果(自动化测试)", httpMethod = "GET")
+    @ApiImplicitParam(name = "id", dataType = "int", paramType = "query")
+    public Response<List<InterfaceTestResultVO>> getAutoInterfaceResultsById(@PathVariable("id") Integer id) {
+        return Response.buildSuccess(interfaceTestService.getAutoInterfaceTestResultsById(id));
+    }
+
+}

+ 1 - 0
web/src/main/java/cn/seecoder/web/core/pipeline/PipelineException.java

@@ -22,6 +22,7 @@ public class PipelineException extends Exception{
     public static final String CONFIG_JSON_ERROR = "获取模板的config json错误";
     public static final String DOCKERFILE_MODIFY_ERROR = "修改模板的dockerfile错误";
     public static final String API_TEST_ID_RESOLVE_ERROR = "解析Api test id列表错误";
+    public static final String INTERFACE_TEST_ID_RESOLVE_ERROR = "解析Interface test id列表错误";
 
 
 

+ 1 - 0
web/src/main/java/cn/seecoder/web/core/pipeline/config/HandlerConfigTable.java

@@ -37,6 +37,7 @@ public class HandlerConfigTable {
         handlerConfigMap.put("k8s-namespace", K8sNamespaceHandler.class);
         handlerConfigMap.put("deploy", DeployHandler.class);
         handlerConfigMap.put("api-test", ApiTestHandler.class);
+//        handlerConfigMap.put("interface-test", InterfaceTestHandler.class);
         handlerConfigMap.put("mysql-deploy", MysqlDeployHandler.class);
     }
 

+ 44 - 22
web/src/main/java/cn/seecoder/web/core/pipeline/handler/ApiTestHandler.java

@@ -4,11 +4,14 @@ import cn.seecoder.common.util.SpringUtil;
 import cn.seecoder.web.core.pipeline.Context;
 import cn.seecoder.web.core.pipeline.PipelineException;
 import cn.seecoder.web.service.APITest.APITestService;
+import cn.seecoder.web.service.InterfaceTest.InterfaceTestService;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.IOException;
+
 
 /**
  * @author PuHong Weng
@@ -21,36 +24,55 @@ import lombok.extern.slf4j.Slf4j;
 @EqualsAndHashCode(callSuper = false)
 public class ApiTestHandler extends AbstractHandler {
 
-    private final APITestService apiTestService;
+//    private final APITestService apiTestService;
+//
+//    public ApiTestHandler() {
+//        this.apiTestService = SpringUtil.getBean(APITestService.class);
+//    }
+//
+//
+//    /**
+//     * 要自动执行的apiTest的json
+//     * 格式 [1,2,3]
+//     */
+//    private Integer[] apiTestIds = new Integer[]{};
+//
+//
+//
+//    @Override
+//    public void process(Context context) throws PipelineException {
+//        ObjectMapper objectMapper = new ObjectMapper();
+////        List<Integer> ids;
+////        try {
+////            ids = objectMapper.readValue(apiTestIds, new TypeReference<List<Integer>>() {
+////            });
+////        } catch (JsonProcessingException e) {
+////            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE,API_TEST_ID_RESOLVE_ERROR,e);
+////        }
+//        for (Integer testId : apiTestIds){
+//            try {
+//                apiTestService.executeAPITest(testId);
+//            } catch (InterruptedException e) {
+//                log.warn("api test 出现 InterruptedException, 目前暂无特殊处理。 Test id: {}",testId);
+//            }
+//        }
+//    }
+    private final InterfaceTestService interfaceTestService;
 
     public ApiTestHandler() {
-        this.apiTestService = SpringUtil.getBean(APITestService.class);
+        this.interfaceTestService = SpringUtil.getBean(InterfaceTestService.class);
     }
 
-
-    /**
-     * 要自动执行的apiTest的json
-     * 格式 [1,2,3]
-     */
-    private Integer[] apiTestIds = new Integer[]{};
-
-
+    private Integer[] interfaceTestIds = new Integer[]{};
 
     @Override
-    public void process(Context context) throws PipelineException {
+    public void process(Context  context) throws PipelineException {
         ObjectMapper objectMapper = new ObjectMapper();
-//        List<Integer> ids;
-//        try {
-//            ids = objectMapper.readValue(apiTestIds, new TypeReference<List<Integer>>() {
-//            });
-//        } catch (JsonProcessingException e) {
-//            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE,API_TEST_ID_RESOLVE_ERROR,e);
-//        }
-        for (Integer testId : apiTestIds){
+        for (Integer testId : interfaceTestIds) {
             try {
-                apiTestService.executeAPITest(testId);
-            } catch (InterruptedException e) {
-                log.warn("api test 出现 InterruptedException, 目前暂无特殊处理。 Test id: {}",testId);
+                interfaceTestService.executeInterfaceTestById(testId, "devcloud", "computer");
+            } catch (IOException e) {
+                log.warn("interface test 出现 IOException, 目前暂无特殊处理。 Test id: {}",testId);
             }
         }
     }

+ 37 - 0
web/src/main/java/cn/seecoder/web/core/pipeline/handler/InterfaceTestHandler.java

@@ -0,0 +1,37 @@
+package cn.seecoder.web.core.pipeline.handler;
+
+import cn.seecoder.common.util.SpringUtil;
+import cn.seecoder.web.core.pipeline.Context;
+import cn.seecoder.web.core.pipeline.PipelineException;
+import cn.seecoder.web.service.InterfaceTest.InterfaceTestService;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class InterfaceTestHandler extends AbstractHandler{
+    private final InterfaceTestService interfaceTestService;
+
+    public InterfaceTestHandler() {
+        this.interfaceTestService = SpringUtil.getBean(InterfaceTestService.class);
+    }
+
+    private Integer[] interfaceTestIds = new Integer[]{};
+
+    @Override
+    public void process(Context  context) throws PipelineException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        for (Integer testId : interfaceTestIds) {
+            try {
+                interfaceTestService.executeInterfaceTestById(testId, "devcloud", "computer");
+            } catch (IOException e) {
+                log.warn("interface test 出现 IOException, 目前暂无特殊处理。 Test id: {}",testId);
+            }
+        }
+    }
+}

+ 43 - 0
web/src/main/java/cn/seecoder/web/dao/InterfaceTest/InterfaceTestMapper.java

@@ -0,0 +1,43 @@
+package cn.seecoder.web.dao.InterfaceTest;
+
+import cn.seecoder.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import cn.seecoder.web.model.po.InterfaceTest.InterfaceTestInfo;
+import cn.seecoder.web.model.po.InterfaceTest.InterfaceTestResult;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface InterfaceTestMapper {
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id")
+    boolean insert(InterfaceTestInfo interfaceTestInfo, String... ignoredCols);
+
+    @Select("select * from interface_test_info where project_id = #{id}")
+    List<InterfaceTestInfo> selectByProjectId(Integer id);
+
+    @Delete("delete from interface_test_info where id = #{id}")
+    boolean deleteInterfaceTestById(Integer id);
+
+    @Select("select * from interface_test_info where id = #{id}")
+    InterfaceTestInfo selectById(Integer id);
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id")
+    boolean insertResult(InterfaceTestResult interfaceTestResult, String... ignoredCols);
+
+    // 获取某条测试手动触发测试的结果
+    @Select("select * from interface_test_result where test_id = #{id} and deployment_id = -1")
+    List<InterfaceTestResult> selectByTestId(Integer id);
+
+    @Delete("delete from interface_test_result where test_id = #{id}")
+    boolean deleteInterfaceResultsById(Integer id);
+
+    // 获取某条测试自动化测试的结果
+    @Select("select * from interface_test_result where test_id = #{id} and deployment_id != -1")
+    List<InterfaceTestResult> selectAutoResultsByTestId(Integer id);
+}

+ 7 - 0
web/src/main/java/cn/seecoder/web/infrastructure/config/WebSecurityConfig.java

@@ -64,6 +64,13 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers(GET, "/test/result/{testId}").access("@authTools.checkTestOwnership(#testId)")
                 .antMatchers(GET, "/test/latest/{testId}").access("@authTools.checkTestOwnership(#testId)")
                 .antMatchers(POST, "/test/create").authenticated()
+                // Interface Test Controller
+                .antMatchers(POST, "/interfaces/create").permitAll()
+                .antMatchers(GET, "/interfaces/list/{projectId}").permitAll()
+                .antMatchers(GET, "/interfaces/delete/{id}").permitAll()
+                .antMatchers(GET, "/interfaces/execute/{id}/{username}/{type}").permitAll()
+                .antMatchers(GET, "/interfaces/results/{id}").permitAll()
+                .antMatchers(GET, "/interfaces/results/auto/{id}").permitAll()
                 // Auto Test Controller
                 .antMatchers(GET, "/auto_test/list").access("@authTools.checkProjOwnershipParam(request)")
                 // Bug List Controller

+ 22 - 0
web/src/main/java/cn/seecoder/web/model/po/InterfaceTest/InterfaceTestInfo.java

@@ -0,0 +1,22 @@
+package cn.seecoder.web.model.po.InterfaceTest;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class InterfaceTestInfo {
+    private Integer id;
+    private String name;
+    private Integer projectId;
+    private String createTime;
+    private String username;
+    private String url;
+    private String method;
+    private String params;
+}

+ 21 - 0
web/src/main/java/cn/seecoder/web/model/po/InterfaceTest/InterfaceTestResult.java

@@ -0,0 +1,21 @@
+package cn.seecoder.web.model.po.InterfaceTest;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class InterfaceTestResult {
+    private Integer id;
+    private Integer testId;
+    private String executeTime;
+    private String username;
+    private Integer code;
+    private Integer cost;
+    private String result;
+    private Integer deploymentId;
+}

+ 69 - 0
web/src/main/java/cn/seecoder/web/model/vo/InterfaceTest/InterfaceTestInfoVO.java

@@ -0,0 +1,69 @@
+package cn.seecoder.web.model.vo.InterfaceTest;
+
+import cn.seecoder.web.model.po.InterfaceTest.InterfaceTestInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class InterfaceTestInfoVO {
+
+    @ApiModelProperty("方法测试id")
+    private Integer id;
+
+    @ApiModelProperty("方法测试名称")
+    private String name;
+
+    @ApiModelProperty("所属项目id")
+    private Integer projectId;
+
+    @ApiModelProperty("创建时间")
+    private String createTime;
+
+    @ApiModelProperty("创建者")
+    private String username;
+
+    @ApiModelProperty("方法测试url")
+    private String url;
+
+    @ApiModelProperty("方法类型")
+    private String method;
+
+    @ApiModelProperty("可能携带的参数")
+    private Map<String, Object> params;
+
+    public InterfaceTestInfoVO(InterfaceTestInfo interfaceTestInfo) {
+        String params = interfaceTestInfo.getParams();
+        BeanUtils.copyProperties(interfaceTestInfo, this);
+        this.params = parseJson2Map(params);
+    }
+
+    public Map<String, Object> parseJson2Map(String str) {
+        Map<String, Object> map = new HashMap<>();
+        JSONObject json = JSONObject.fromObject(str);
+        for (Object k:json.keySet()) {
+            Object v = json.get(k);
+            if (v instanceof JSONArray) {
+                List<Map<String, Object>> list = new ArrayList<>();
+                for (JSONObject json2 : (Iterable<JSONObject>) v) {
+                    list.add(parseJson2Map(json2.toString()));
+                }
+                map.put(k.toString(), list);
+            } else {
+                map.put(k.toString(), v);
+            }
+        }
+        return map;
+    }
+}

+ 42 - 0
web/src/main/java/cn/seecoder/web/model/vo/InterfaceTest/InterfaceTestResultVO.java

@@ -0,0 +1,42 @@
+package cn.seecoder.web.model.vo.InterfaceTest;
+
+import cn.seecoder.web.model.po.InterfaceTest.InterfaceTestResult;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class InterfaceTestResultVO {
+
+    @ApiModelProperty("结果id")
+    private Integer id;
+
+    @ApiModelProperty("所属测试id")
+    private Integer testId;
+
+    @ApiModelProperty("执行时间")
+    private String executeTime;
+
+    @ApiModelProperty("执行者")
+    private String username;
+
+    @ApiModelProperty("HTTP状态码")
+    private Integer code;
+
+    @ApiModelProperty("耗时")
+    private Integer cost;
+
+    @ApiModelProperty("执行结果")
+    private String result;
+
+    @ApiModelProperty("关联部署产物id")
+    private Integer deploymentId;
+
+    public InterfaceTestResultVO(InterfaceTestResult interfaceTestResult) {
+        BeanUtils.copyProperties(interfaceTestResult, this);
+    }
+}

+ 39 - 0
web/src/main/java/cn/seecoder/web/service/InterfaceTest/InterfaceTestService.java

@@ -0,0 +1,39 @@
+package cn.seecoder.web.service.InterfaceTest;
+
+import cn.seecoder.web.model.vo.InterfaceTest.InterfaceTestInfoVO;
+import cn.seecoder.web.model.vo.InterfaceTest.InterfaceTestResultVO;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface InterfaceTestService {
+    /**
+     * 新建一个方法测试
+     */
+    void createInterfaceTest(InterfaceTestInfoVO interfaceTestInfoVO);
+
+    /**
+     * 获取指定项目中所有的测试任务
+     */
+    List<InterfaceTestInfoVO> getInterfaceTestByProjectId(Integer projectId);
+
+    /**
+     * 删除指定方法测试
+     */
+    void deleteInterfaceTestById(Integer id);
+
+    /**
+     * 执行指定方法测试
+     */
+    void executeInterfaceTestById(Integer id, String username, String type) throws IOException;
+
+    /**
+     * 获取指定方法测试的所有执行结果(手动触发)
+     */
+    List<InterfaceTestResultVO> getInterfaceTestResultsById(Integer id);
+
+    /**
+     * 获取指定方法测试的所有执行结果(自动化测试)
+     */
+    List<InterfaceTestResultVO> getAutoInterfaceTestResultsById(Integer id);
+}

+ 252 - 0
web/src/main/java/cn/seecoder/web/service/impl/InterfaceTest/InterfaceTestServiceImpl.java

@@ -0,0 +1,252 @@
+package cn.seecoder.web.service.impl.InterfaceTest;
+
+import cn.seecoder.web.dao.InterfaceTest.InterfaceTestMapper;
+import cn.seecoder.web.dao.pipeline.PipelineMapper;
+import cn.seecoder.web.dao.pipeline.PipelineRecordMapper;
+import cn.seecoder.web.model.po.InterfaceTest.InterfaceTestInfo;
+import cn.seecoder.web.model.po.InterfaceTest.InterfaceTestResult;
+import cn.seecoder.web.model.po.pipeline.PipelinePO;
+import cn.seecoder.web.model.po.pipeline.PipelineRecordPO;
+import cn.seecoder.web.model.vo.InterfaceTest.InterfaceTestInfoVO;
+import cn.seecoder.web.model.vo.InterfaceTest.InterfaceTestResultVO;
+import cn.seecoder.web.service.InterfaceTest.InterfaceTestService;
+import com.google.gson.Gson;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.net.*;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class InterfaceTestServiceImpl implements InterfaceTestService {
+
+    private final InterfaceTestMapper interfaceTestMapper;
+
+    private final PipelineMapper pipelineMapper;
+
+    private final PipelineRecordMapper pipelineRecordMapper;
+
+    @Autowired
+    public InterfaceTestServiceImpl(InterfaceTestMapper interfaceTestMapper, PipelineMapper pipelineMapper, PipelineRecordMapper pipelineRecordMapper) {
+        this.interfaceTestMapper = interfaceTestMapper;
+        this.pipelineMapper = pipelineMapper;
+        this.pipelineRecordMapper = pipelineRecordMapper;
+    }
+
+    @Override
+    public void createInterfaceTest(InterfaceTestInfoVO interfaceTestInfoVO) {
+        Date d = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String createTime = sdf.format(d);
+        InterfaceTestInfo info = InterfaceTestInfo.builder()
+                .name(interfaceTestInfoVO.getName())
+                .projectId(interfaceTestInfoVO.getProjectId())
+                .createTime(createTime)
+                .username(interfaceTestInfoVO.getUsername())
+                .url(interfaceTestInfoVO.getUrl())
+                .method(interfaceTestInfoVO.getMethod())
+                .params(JSONObject.fromObject(interfaceTestInfoVO.getParams()).toString())
+                .build();
+        interfaceTestMapper.insert(info);
+    }
+
+    @Override
+    public List<InterfaceTestInfoVO> getInterfaceTestByProjectId(Integer projectId) {
+        return interfaceTestMapper.selectByProjectId(projectId).stream()
+                .map(InterfaceTestInfoVO::new).collect(Collectors.toList());
+    }
+
+    @Override
+    public void deleteInterfaceTestById(Integer id) {
+        interfaceTestMapper.deleteInterfaceTestById(id);
+        interfaceTestMapper.deleteInterfaceResultsById(id);
+    }
+
+    @Override
+    public void executeInterfaceTestById(Integer id, String username, String type) throws IOException {
+        InterfaceTestInfo info = interfaceTestMapper.selectById(id);
+        String url = info.getUrl();
+        Map<String, Object> params = parseJson2Map(info.getParams());
+        String method = info.getMethod();
+        Integer projectId = info.getProjectId();
+        handleRequest(url, params, id, method, username, type, projectId);
+    }
+
+    @Override
+    public List<InterfaceTestResultVO> getInterfaceTestResultsById(Integer id) {
+        return interfaceTestMapper.selectByTestId(id).stream()
+                .map(InterfaceTestResultVO::new).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<InterfaceTestResultVO> getAutoInterfaceTestResultsById(Integer id) {
+        return interfaceTestMapper.selectAutoResultsByTestId(id).stream()
+                .map(InterfaceTestResultVO::new).collect(Collectors.toList());
+    }
+
+    public Map<String, Object> parseJson2Map(String str) {
+        Map<String, Object> map = new HashMap<>();
+        JSONObject json = JSONObject.fromObject(str);
+        for (Object k : json.keySet()) {
+            Object v = json.get(k);
+            if (v instanceof JSONArray) {
+                List<Map<String, Object>> list = new ArrayList<>();
+                for (JSONObject json2 : (Iterable<JSONObject>) v) {
+                    list.add(parseJson2Map(json2.toString()));
+                }
+                map.put(k.toString(), list);
+            } else {
+                map.put(k.toString(), v);
+            }
+        }
+        return map;
+    }
+
+    public void handleRequest(String url, Map<String, Object> params, int id, String method, String username, String type, Integer projectId) throws IOException {
+        String[] res = null;
+        if (method.equals("GET")) {
+            res = doGet(url, params);
+        } else if (method.equals("POST")) {
+            res = doPost(url, params);
+        }
+        for (String _res : res) {
+            System.out.println(_res);
+        }
+        Date d = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String executeTime = sdf.format(d);
+        int deploymentId = -111;
+        if (type.equals("artificial")) {
+            deploymentId = -1;
+        } else if (type.equals("computer")) {
+            // 获取最新的部署构建信息id
+            List<Integer> pipelineIds = pipelineMapper.selectByProjectId(projectId).stream().map(PipelinePO::getId).collect(Collectors.toList());
+            PipelineRecordPO latestRecord = pipelineRecordMapper.selectPipelinesLatestRecord(pipelineIds);
+            deploymentId = latestRecord.getId();
+        }
+        InterfaceTestResult result = InterfaceTestResult.builder()
+                .testId(id)
+                .executeTime(executeTime)
+                .username(username)
+                .code(Integer.parseInt(res[0]))
+                .cost(Integer.parseInt(res[1]))
+                .result(res[2])
+                .deploymentId(deploymentId)
+                .build();
+        interfaceTestMapper.insertResult(result);
+    }
+
+    public String[] doGet(String url, Map<String, Object> params) {
+        HttpURLConnection connection;
+        BufferedReader br = null;
+        StringBuilder sb = new StringBuilder();
+        StringBuilder result = new StringBuilder();
+        String path = "";
+
+        String[] res = new String[3];
+        long start = System.currentTimeMillis();
+        try {
+            if (params.size() == 1) {
+                for (String name : params.keySet()) {
+                    sb.append(name).append("=").append(URLEncoder.encode(String.valueOf(params.get(name)), "utf-8"));
+                }
+                path = sb.toString();
+            } else if (params.size() >= 2) {
+                for (String name : params.keySet()) {
+                    sb.append(name).append("=").append(URLEncoder.encode(String.valueOf(params.get(name)), "utf-8")).append("&");
+                }
+                path = sb.deleteCharAt(sb.length() - 1).toString();
+            }
+            String full_url = url;
+            if (!path.equals("")) {
+                full_url = url + "?" + path;
+            }
+
+            URL connURL = new URL(full_url);
+
+            connection = (HttpURLConnection) connURL.openConnection();
+            // 设置一些请求头
+            connection.setRequestProperty("Accept", "*/*");
+            connection.setRequestProperty("Connection", "Keep-Alive");
+            connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
+
+            // 建立连接
+            connection.connect();
+            res[0] = connection.getResponseCode() + "";
+            br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
+            String line;
+            while ((line = br.readLine()) != null) {
+                result.append(line);
+            }
+        } catch (Exception e) {
+            res[2] = e + "";
+            e.printStackTrace();
+        } finally {
+            try {
+                if (br != null) {
+                    br.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        long end = System.currentTimeMillis();
+        res[1] = (end - start) + "";
+        if (result.length() != 0) {
+            res[2] = StringEscapeUtils.unescapeJava(result.toString());
+        }
+        return res;
+    }
+
+    public String[] doPost(String url, Map<String, Object> params) throws IOException {
+        Gson gson = new Gson();
+        String param = gson.toJson(params);
+        StringBuilder response = new StringBuilder();
+        long start = System.currentTimeMillis();
+        String[] res = new String[3];
+        System.out.println(param);
+        try {
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
+            // 设置通用的请求属性
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            connection.setInstanceFollowRedirects(true);
+            connection.setRequestMethod("POST"); // 设置请求方式
+            connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
+            connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
+            connection.connect();
+            // 获取URLConnection对象对应的输出流
+            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
+            out.append(param);
+            // flush输出流的缓冲
+            out.flush();
+            out.close();
+            // 定义BufferedReader输入流来读取URL的响应
+            BufferedReader reader = null;
+            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                response.append(line);
+            }
+            reader.close();
+            res[0] = connection.getResponseCode() + "";
+        } catch (Exception e) {
+            System.out.println("发送POST请求出现异常!" + e);
+            e.printStackTrace();
+        }
+        long end = System.currentTimeMillis();
+        res[1] = (end - start) + "";
+        res[2] = StringEscapeUtils.unescapeJava(response.toString());
+        return res;
+    }
+}

+ 2 - 2
web/src/main/java/cn/seecoder/web/service/impl/tree/TreeNodeServiceImpl.java

@@ -67,8 +67,8 @@ public class TreeNodeServiceImpl implements TreeNodeService {
                     .startTime(format.format(new Date()))
                     .projectId(projectId)
                     .state(NodeStateEnum.CREATED)
-                    .title("默认需求节点")
-                    .description("Requirement节点\n例如:打造一个学习成果测试及学习交流的平台便于学生更好的开发工作")
+                    .title("默认战略举措节点")
+                    .description("Epic节点\n例如:打造一个学习成果测试及学习交流的平台便于学生更好的开发工作")
                     .priority(PriorityEnum.MIDDLE)
                     .type(NodeTypeEnum.REQUIREMENT)
                     .timeToTake(0L)