前言
在比对了一些开源的自动化平台后,发现大象平台的功能做的很不错,里面有移动端自动化和web端自动化。平台的整体架构设计也非常的好,分为server、agent和frontend。server端主要处理页面数据的增删改查,agent主要处理用例的执行和设备的管理,可分布式部署多台agent服务。server和agent主要使用的java开发的,frontend使用的时vue。由于平台只有移动端和web端,正好公司需要开发接口自动化平台,所以我在此基础上进行二次开发,将接口自动化功能实现。
一、opendx下载地址?
二、功能展示
1.添加接口页面
2.server新增
server端修改比较简单,添加增删改查的接口
ApiinfoController):
package com.daxiang.controller;
import com.daxiang.mbg.po.Apiinfo;
import com.daxiang.model.PageRequest;
import com.daxiang.model.PagedData;
import com.daxiang.model.Response;
import com.daxiang.model.api.JsonString;
import com.daxiang.model.vo.ApiinfoVo;
import com.daxiang.service.ApiinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author:何明
* @Date:10/25/20 3:36 下午
*/
@RestController
@RequestMapping("/api")
public class ApiinfoController {
@Autowired
private ApiinfoService apiService;
@PostMapping("/saveOrUpdate")
public Response add(@RequestBody Apiinfo apiInfo) {
apiService.saveOrUpdate(apiInfo);
return Response.success("保存成功");
}
@DeleteMapping("/{apiinfoId}")
public Response delete(@PathVariable Integer apiinfoId) {
apiService.delete(apiinfoId);
return Response.success("删除成功");
}
@PostMapping("/list")
public Response list(Apiinfo query, String orderBy, PageRequest pageRequest) {
if (pageRequest.needPaging()) {
PagedData<ApiinfoVo> pagedData = apiService.list(query, orderBy, pageRequest);
return Response.success(pagedData);
} else {
List<ApiinfoVo> actionVos = apiService.getApiinfoVos(query, orderBy);
return Response.success(actionVos);
}
}
@PostMapping("/importJson")
public Response importJson(@RequestBody JsonString jsonString) {
return Response.success(apiService.importJson(jsonString));
}
}
ApiinfoService)
package com.daxiang.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.daxiang.exception.ServerException;
import com.daxiang.mbg.mapper.ApiinfoMapper;
import com.daxiang.mbg.po.Apiinfo;
import com.daxiang.mbg.po.ApiinfoExample;
import com.daxiang.mbg.po.User;
import com.daxiang.model.PageRequest;
import com.daxiang.model.PagedData;
import com.daxiang.model.api.JsonBody;
import com.daxiang.model.api.JsonString;
import com.daxiang.model.vo.ApiinfoVo;
import com.daxiang.security.SecurityUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Author:何明
* @Date:10/25/20 3:39 下午
*/
@Service
@Slf4j
public class ApiinfoService {
@Autowired
private ApiinfoMapper apiinfoMapper;
@Autowired
private UserService userService;
private ThreadLocal<Integer> number = new ThreadLocal<>();
private void setNumber(Integer erromsg){
number.set(erromsg);
}
private Integer getNumber(){
return number.get();
}
private void removeNumber(){
number.remove();
}
/**
* 保存或修改
* @param apiInfo
*/
public void saveOrUpdate(Apiinfo apiInfo){
try {
int insertCount = 0;
if (apiInfo.getId() != null){
apiInfo.setUpdateTime(new Date());
apiInfo.setUpdatorUid(SecurityUtil.getCurrentUserId());
insertCount = apiinfoMapper.updateByPrimaryKey(apiInfo);
}else {
apiInfo.setCreatorUid(SecurityUtil.getCurrentUserId());
apiInfo.setCreateTime(new Date());
apiInfo.setState(1);
insertCount = apiinfoMapper.insert(apiInfo);
}
if (insertCount != 1) {
throw new ServerException("保存失败,请稍后重试");
}
} catch (DuplicateKeyException e) {
throw new ServerException(apiInfo.getName() + "已存在");
}
}
/**
* 获取分页
* @param query
* @param orderBy
* @param pageRequest
* @return
*/
public PagedData<ApiinfoVo> list(Apiinfo query, String orderBy, PageRequest pageRequest) {
Page page = PageHelper.startPage(pageRequest.getPageNum(), pageRequest.getPageSize());
if (StringUtils.isEmpty(orderBy)) {
orderBy = "create_time desc";
}
List<ApiinfoVo> apiinfoVos = getApiinfoVos(query, orderBy);
return new PagedData<>(apiinfoVos, page.getTotal());
}
public List<ApiinfoVo> getApiinfoVos(Apiinfo query, String orderBy) {
List<Apiinfo> apiinfos = getApiinfos(query, orderBy);
return convertApiinfosToApiinfosVos(apiinfos);
}
public List<Apiinfo> getApiinfos(Apiinfo query, String orderBy) {
ApiinfoExample example = new ApiinfoExample();
ApiinfoExample.Criteria criteria = example.createCriteria();
if (query != null) {
if (query.getId() != null) {
criteria.andIdEqualTo(query.getId());
}
if (!StringUtils.isEmpty(query.getName())) {
criteria.andNameLike("%" + query.getName() + "%");
}
if (query.getProjectId() != null) {
criteria.andProjectIdEqualTo(query.getProjectId());
}
if (query.getCategoryId() != null) {
criteria.andCategoryIdEqualTo(query.getCategoryId());
}
if (query.getState() != null) {