提交 512a8795 authored 作者: Matrix's avatar Matrix

feat(SQL执行器): SQL执行器的初版

- SQL执行器的初版 - 修改了一些不正确的目录结构 - 代码执行器
上级 06b09d75
/*
Navicat Premium Data Transfer
Source Server : 我的阿里云
Source Server Type : MySQL
Source Server Version : 80022
Source Host : 47.106.142.73:3306
Source Schema : lstest
Target Server Type : MySQL
Target Server Version : 80022
File Encoding : 65001
Date: 14/01/2022 11:22:30
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for action
-- ----------------------------
DROP TABLE IF EXISTS `action`;
CREATE TABLE `action` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`move_id` int NULL DEFAULT NULL COMMENT '行为ID',
`project_id` int NULL DEFAULT NULL COMMENT '项目ID',
`remark` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注',
`type` int NULL DEFAULT NULL COMMENT '类型 1为SQL,2为HTTP,3为CASE,4为WAIT_TIME',
`detail` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '详细参数',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_active_move`(`move_id`) USING BTREE,
CONSTRAINT `fk_active_move` FOREIGN KEY (`move_id`) REFERENCES `move` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '动作' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for connect
-- ----------------------------
DROP TABLE IF EXISTS `connect`;
CREATE TABLE `connect` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'URL',
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账号',
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`driver` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所用驱动',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for dynamic_variable
-- ----------------------------
DROP TABLE IF EXISTS `dynamic_variable`;
CREATE TABLE `dynamic_variable` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`project_id` int NULL DEFAULT NULL COMMENT '所属项目',
`taken_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '取用字段',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`type` int NOT NULL COMMENT '动态变量类型 1为KV,2为SQL,3为CASE,4为HTTP',
`remark` varchar(510) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`detail` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '详细内容',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_project_dynamicVariable`(`project_id`) USING BTREE,
CONSTRAINT `fk_project_dynamicVariable` FOREIGN KEY (`project_id`) REFERENCES `project` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for example
-- ----------------------------
DROP TABLE IF EXISTS `example`;
CREATE TABLE `example` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '实例名称',
`parameter_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数名 (例如:env)',
`project_id` int NULL DEFAULT NULL COMMENT '项目ID',
`variable` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '静态变量,以JSON的形式存储,例如({\"name\":\"张三\"})',
`ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ip,例如(http:www.abc.com)',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_project_case`(`project_id`) USING BTREE,
CONSTRAINT `fk_project_case` FOREIGN KEY (`project_id`) REFERENCES `project` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '实例表,项目对应的环境实例,例如:实验室环境,开发环境等' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for move
-- ----------------------------
DROP TABLE IF EXISTS `move`;
CREATE TABLE `move` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`project_id` int NULL DEFAULT NULL COMMENT '所属项目',
`remark` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_move_project`(`project_id`) USING BTREE,
CONSTRAINT `fk_move_project` FOREIGN KEY (`project_id`) REFERENCES `project` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for project
-- ----------------------------
DROP TABLE IF EXISTS `project`;
CREATE TABLE `project` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for test_case
-- ----------------------------
DROP TABLE IF EXISTS `test_case`;
CREATE TABLE `test_case` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`project_id` int NULL DEFAULT NULL COMMENT '所属项目',
`type` int NOT NULL COMMENT '用例类型 1为http',
`move_before` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '前置行动ID组,例如:1,2,3',
`move_afer_case` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '后置行动ID组,例如:1,2,3',
`move_afer_test` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '测试执行后行动ID组,例如:1,2,3',
`abnormal_checkpoint` int NOT NULL DEFAULT 0 COMMENT '是否进行异常检验,0为否,1为是',
`no_empty_checkpoint` int NOT NULL DEFAULT 0 COMMENT '是否进行非空检验,0为否,1为是',
`contain_checkpoint` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '包含某字段检验(例如 张三,李四) 则对检查结果中是否包含张三或者李四',
`no_contain_checkpoint` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '不包含某字段检验(例如 张三,李四) 则对检查结果中是否不包含张三或者李四',
`database_checkpoint` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '数据库检验点,以JSON形式存放',
`jsonpath_checkpoint` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'jsonpath检验点,以json形式存放',
`detail` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '详细参数',
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_case_project`(`project_id`) USING BTREE,
CONSTRAINT `fk_case_project` FOREIGN KEY (`project_id`) REFERENCES `project` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
package org.matrix.actuators;
/**
* Actuator. 执行器接口
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/14 at 6:02 PM
* Suffering is the most powerful teacher of life.
*/
public interface Actuator {
}
package org.matrix.actuator;
package org.matrix.actuators.checkpoint;
import cn.hutool.script.ScriptUtil;
import com.alibaba.fastjson.JSON;
......@@ -11,8 +11,8 @@ import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.matrix.entity.checkPoint.*;
import org.matrix.entity.httpRequest.HttpResponseDetail;
import org.matrix.actuators.Actuator;
import org.matrix.actuators.httpclient.HttpResponseDetail;
import org.matrix.exception.CheckPointException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpStatus;
......@@ -31,15 +31,15 @@ import java.util.regex.Pattern;
*
* @author huangxiahao
*/
public class CheckPointActuator {
public class CheckPointActuator implements Actuator {
private final String baseJs;
private int projectId;
private Long projectId;
private String env;
private Long envId;
CheckPointActuator(String baseJsPath, String env, int projectId) {
public CheckPointActuator(String baseJsPath, Long env, Long projectId) {
ClassPathResource cpr = new ClassPathResource(baseJsPath);
try {
this.baseJs = IOUtils.toString(cpr.getInputStream(), StandardCharsets.UTF_8);
......@@ -47,7 +47,7 @@ public class CheckPointActuator {
throw new CheckPointException("初始JS加载失败");
}
this.projectId = projectId;
this.env = env;
this.envId = env;
}
public CheckPointResult httpCheck(HttpResponseDetail httpResponseDetail, CheckPoint checkPoint) {
......
package org.matrix.entity.checkPoint;
package org.matrix.actuators.checkpoint;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package org.matrix.entity.checkPoint;
package org.matrix.actuators.checkpoint;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package org.matrix.actuators.datasource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* DataSourceDTO.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2021/12/31 at 2:18 PM
* Suffering is the most powerful teacher of life.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataSourceDTO {
/**
* 连接池名称
*/
private String poolName;
/**
* JDBC driver org.h2.Driver
*/
private String driverClassName;
/**
* JDBC url 地址
*/
private String url;
/**
* JDBC 用户名
*/
private String username;
/**
* JDBC 密码
*/
private String password;
}
package org.matrix.actuators.datasource;
import java.util.Set;
/**
* IDataSourceService.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/19 at 5:38 PM
* Suffering is the most powerful teacher of life.
*/
public interface IDataSourceService {
/**
* 将当前使用的数据替换为参数提供的数据源,如果还没有,则会添加,如果已经有了,则不会添加
*
* @param dto 数据源信息
* @return 当前已经存在的数据源集合
*/
@SuppressWarnings("UnusedReturnValue")
Set<String> switchDataSource(DataSourceDTO dto);
/**
* 添加数据源,如果已经存在同名的数据源了,则不会添加
*
* @param dto 数据源信息
* @return 数据源名称的集合, 用于 DynamicDataSourceContextHolder.push("数据源名称") 这样的代码中
*/
Set<String> add(DataSourceDTO dto);
/**
* 添加数据源,如果已经存在同名的数据源了,则会覆盖
*
* @param dto 数据源信息
* @return 数据源名称的集合, 用于 DynamicDataSourceContextHolder.push("数据源名称") 这样的代码中
*/
Set<String> addAndUpdate(DataSourceDTO dto);
/**
* 获取当前所有数据源
*
* @return 数据源名称的集合, 用于 DynamicDataSourceContextHolder.push("数据源名称") 这样的代码中
*/
Set<String> now();
/**
* 删除数据源
*
* @param name 数据源名称
* @return 删除信息
*/
public String remove(String name);
}
package org.matrix.actuators.datasource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.util.Set;
/**
* IDataSourceServiceImpl.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/19 at 5:47 PM
* Suffering is the most powerful teacher of life.
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Lazy))
public class IDataSourceServiceImpl implements IDataSourceService {
private final DataSource dataSource;
private final DefaultDataSourceCreator dataSourceCreator;
/**
* 将当前使用的数据替换为参数提供的数据源,如果还没有,则会添加,如果已经有了,则不会添加
*
* @param dto 数据源信息
* @return 当前存在的数据源集合
*/
@Override
public Set<String> switchDataSource(DataSourceDTO dto) {
// todo 该方法需要添加线程安全保护
Set<String> currentDataSources = add(dto);
DynamicDataSourceContextHolder.push(dto.getPoolName());
return currentDataSources;
}
/**
* 添加数据源,如果已经存在同名的数据源了,则不会添加
*
* @param dto 数据源信息
* @return 数据源名称的集合, 用于 DynamicDataSourceContextHolder.push("数据源名称") 这样的代码中
*/
@Override
public Set<String> add(DataSourceDTO dto) {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
if (ds.getDataSources().containsKey(dto.getPoolName())) {
return ds.getDataSources().keySet();
} else {
return addDataSource(dto);
}
}
/**
* 添加数据源,如果已经存在同名的数据源了,则会覆盖
*
* @param dto 数据源信息
* @return 数据源名称的集合, 用于 DynamicDataSourceContextHolder.push("数据源名称") 这样的代码中
*/
@Override
public Set<String> addAndUpdate(DataSourceDTO dto) {
return addDataSource(dto);
}
/**
* 获取当前所有数据源
*
* @return 数据源名称的集合, 用于 DynamicDataSourceContextHolder.push("数据源名称") 这样的代码中
*/
@Override
public Set<String> now() {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
return ds.getDataSources().keySet();
}
/**
* 删除数据源
*
* @param name 数据源名称
* @return 删除信息
*/
@Override
public String remove(String name) {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
ds.removeDataSource(name);
return "删除成功";
}
private Set<String> addDataSource(DataSourceDTO dto) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(dto, dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
ds.addDataSource(dto.getPoolName(), dataSource);
return ds.getDataSources().keySet();
}
}
package org.matrix.actuator;
package org.matrix.actuators.httpclient;
import io.netty.handler.codec.http.HttpHeaderValues;
import org.apache.commons.lang3.StringUtils;
import org.matrix.actuators.Actuator;
import org.matrix.config.HttpRequestConfig;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
......@@ -18,7 +19,6 @@ import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.matrix.entity.httpRequest.*;
import org.matrix.exception.HttpRequestException;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
......@@ -40,7 +40,7 @@ import java.util.List;
* todo 打印LOG
* @author HuangXiahao
**/
public class HttpClientActuator {
public class HttpClientActuator implements Actuator {
HttpRequestConfig config;
......@@ -48,15 +48,19 @@ public class HttpClientActuator {
CloseableHttpClient client;
private int projectId;
private Long projectId;
private String env;
private Long env;
public HttpClientActuator(HttpRequestConfig config, String env, int projectId) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
public HttpClientActuator(HttpRequestConfig config, Long env, Long projectId) {
this.config = config;
this.cookieStore = config.cookieStore();
this.client = config.client();
try {
this.client = config.client();
} catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
this.projectId = projectId;
this.env = env;
}
......
package org.matrix.entity.httpRequest;
package org.matrix.actuators.httpclient;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package org.matrix.entity.httpRequest;
package org.matrix.actuators.httpclient;
import org.springframework.lang.Nullable;
......
package org.matrix.entity.httpRequest;
package org.matrix.actuators.httpclient;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.matrix.entity.testCase.BaseTestCaseResponseDetail;
import org.matrix.actuators.usecase.BaseTestCaseResponseDetail;
import org.springframework.http.HttpStatus;
/**
......
package org.matrix.entity.httpRequest;
package org.matrix.actuators.httpclient;
import java.util.HashMap;
import java.util.Map;
......
package org.matrix.entity.httpRequest;
package org.matrix.actuators.httpclient;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
......
package org.matrix.entity.httpRequest;
package org.matrix.actuators.httpclient;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package org.matrix.actuators.sql;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* SqlExpDetail.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/19 at 5:08 PM
* Suffering is the most powerful teacher of life.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SqlExpDetail {
/**
* 连接池ID {@link org.matrix.database.entity.Connect} 这张表的主键
*/
private Long poolId;
/**
* sql 表达式 形如 select * from table where id = #{id}
*/
private String sqlExp;
}
package org.matrix.actuators.sql;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* SqlRegObject.
* SQL语法的正则取值对象
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/19 at 2:30 PM
* Suffering is the most powerful teacher of life.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SqlRegObject {
/**
* 动态变量名
*/
private String varName;
/**
* 结果下标,默认为0
*/
private int index = 0;
}
package org.matrix.actuator;
package org.matrix.actuators.usecase;
import com.alibaba.fastjson.JSON;
import org.matrix.actuators.Actuator;
import org.matrix.actuators.checkpoint.CheckPointActuator;
import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.config.HttpRequestConfig;
import org.matrix.database.entity.TestCase;
import org.matrix.entity.checkPoint.CheckPoint;
import org.matrix.entity.checkPoint.CheckPointResult;
import org.matrix.entity.httpRequest.HttpRequestDetail;
import org.matrix.entity.httpRequest.HttpResponseDetail;
import org.matrix.entity.testCase.BaseTestCaseResponseDetail;
import org.matrix.entity.testCase.TestCaseExecuteResult;
import org.matrix.entity.testCase.TestCaseTypeEnum;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.function.Function;
import org.matrix.actuators.checkpoint.CheckPoint;
import org.matrix.actuators.checkpoint.CheckPointResult;
import org.matrix.actuators.httpclient.HttpRequestDetail;
import org.matrix.actuators.httpclient.HttpResponseDetail;
/**
* 测试用例执行器
......@@ -22,11 +17,11 @@ import java.util.function.Function;
*
* @author huangxiahao
*/
public class TestCaseActuator {
public class CaseActuator implements Actuator {
private int projectId;
private Long projectId;
private String env;
private Long envId;
private CheckPointActuator checkPointActuator;
......@@ -34,11 +29,11 @@ public class TestCaseActuator {
private final String baseJsPath = "baseJs.js";
public TestCaseActuator(String env, int projectId) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
public CaseActuator(Long envId, Long projectId) {
this.projectId = projectId;
this.env = env;
checkPointActuator = new CheckPointActuator(baseJsPath, env, projectId);
httpClientActuator = new HttpClientActuator(new HttpRequestConfig(), env, projectId);
this.envId = envId;
checkPointActuator = new CheckPointActuator(baseJsPath, envId, projectId);
httpClientActuator = new HttpClientActuator(new HttpRequestConfig(), envId, projectId);
}
/**
......
package org.matrix.entity.testCase;
package org.matrix.actuators.usecase;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.matrix.entity.checkPoint.CheckPointResult;
import org.matrix.actuators.checkpoint.CheckPointResult;
/**
* @author huangxiahao
......
......@@ -24,10 +24,6 @@ import lombok.NoArgsConstructor;
@ApiModel(value = "Action对象", description = "动作")
public class Action extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
......
......@@ -11,7 +11,6 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
......
......@@ -2,14 +2,17 @@ package org.matrix.database.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import org.matrix.database.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.matrix.actuators.datasource.DataSourceDTO;
/**
* <p>
*
*
* </p>
*
* @author matrix
......@@ -22,10 +25,6 @@ import lombok.*;
@ApiModel(value = "Connect对象", description = "")
public class Connect extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
......@@ -41,5 +40,14 @@ public class Connect extends BaseEntity {
@ApiModelProperty("所用驱动")
private String driver;
/**
* 转化为数据源DTO对象
*
* @return {@link DataSourceDTO}
*/
public DataSourceDTO toDataSourceDTO() {
return new DataSourceDTO("name", driver, url, username, password);
}
}
package org.matrix.database.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.matrix.database.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.matrix.actuators.sql.SqlExpDetail;
import org.matrix.enums.DynamicVarType;
import org.matrix.misc.GlobalException;
/**
* <p>
*
*
* </p>
*
* @author matrix
......@@ -25,10 +29,6 @@ import org.matrix.enums.DynamicVarType;
@ApiModel(value = "DynamicVariable对象", description = "")
public class DynamicVariable extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("所属项目")
private Integer projectId;
......@@ -47,5 +47,19 @@ public class DynamicVariable extends BaseEntity {
@ApiModelProperty("详细内容")
private String detail;
@ApiModelProperty(hidden = true)
@TableField(exist = false)
private SqlExpDetail sqlExpDetail;
public DynamicVariable parseSqlDetail() {
if (type == DynamicVarType.SQL_VARIABLE) {
this.sqlExpDetail = JSON.parseObject(this.detail, SqlExpDetail.class);
return this;
} else {
throw new GlobalException("只有SQL类型的变量才能解析详细内容");
}
}
}
package org.matrix.database.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import org.matrix.database.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* <p>
......@@ -20,12 +27,9 @@ import lombok.*;
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "Example对象", description = "实例表,项目对应的环境实例,例如:实验室环境,开发环境等")
@TableName(autoResultMap = true)
public class Example extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("实例名称")
private String name;
......@@ -36,7 +40,8 @@ public class Example extends BaseEntity {
private Integer projectId;
@ApiModelProperty("静态变量,以JSON的形式存储,例如({\"name\":\"张三\"})")
private String variable;
@TableField(typeHandler = FastjsonTypeHandler.class)
private Map<String, String> variable;
@ApiModelProperty("ip,例如(http:www.abc.com)")
private String ip;
......
......@@ -22,10 +22,6 @@ import lombok.*;
@ApiModel(value = "Move对象", description = "")
public class Move extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
......
......@@ -22,10 +22,6 @@ import lombok.*;
@ApiModel(value = "Project对象", description = "")
public class Project extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
......
......@@ -24,10 +24,6 @@ import lombok.*;
@ApiModel(value = "TestCase对象", description = "")
public class TestCase extends BaseEntity {
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
......
......@@ -13,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IConnectService extends IService<Connect> {
}
package org.matrix.database.service;
import org.matrix.database.entity.DynamicVariable;
import com.baomidou.mybatisplus.extension.service.IService;
import org.matrix.database.entity.DynamicVariable;
import java.util.Optional;
/**
* <p>
* 服务类
* 服务类
* </p>
*
* @author matrix
......@@ -13,4 +15,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IDynamicVariableService extends IService<DynamicVariable> {
/**
* 根据变量名称获取变量
*
* @param name 变量名
* @param projectId 项目id
* @return 变量
*/
Optional<DynamicVariable> getByName(String name, Long projectId);
}
package org.matrix.database.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.matrix.database.entity.DynamicVariable;
import org.matrix.database.mapper.DynamicVariableMapper;
import org.matrix.database.service.IDynamicVariableService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* <p>
* 服务实现类
* 服务实现类
* </p>
*
* @author matrix
......@@ -17,4 +20,23 @@ import org.springframework.stereotype.Service;
@Service
public class DynamicVariableServiceImpl extends ServiceImpl<DynamicVariableMapper, DynamicVariable> implements IDynamicVariableService {
private final DynamicVariableMapper mapper;
public DynamicVariableServiceImpl(DynamicVariableMapper dynamicVariableMapper) {
this.mapper = dynamicVariableMapper;
}
/**
* 根据变量名称获取变量
*
* @param name 变量名
* @param projectId 项目id
* @return 变量
*/
@Override
public Optional<DynamicVariable> getByName(String name, Long projectId) {
return Optional.ofNullable(mapper.selectOne(Wrappers.lambdaUpdate(DynamicVariable.class)
.eq(DynamicVariable::getName, name)
.eq(DynamicVariable::getProjectId, projectId)));
}
}
package org.matrix.misc;
/**
* GlobalException.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/19 at 12:53 PM
* Suffering is the most powerful teacher of life.
*/
public class GlobalException extends RuntimeException {
public GlobalException(String message) {
super(message);
}
public GlobalException(String message, Throwable cause) {
super(message, cause);
}
public GlobalException(Throwable cause) {
super(cause);
}
public GlobalException() {
super();
}
}
package org.matrix.misc;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* GlobalExceptionHandler. 全局异常处理类
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2022/1/19 at 12:54 PM
* Suffering is the most powerful teacher of life.
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 报错信息都会通过这个方法处理并通过统一的返回方式进行返回
*
* @param e 报错信息
*/
@ResponseBody
@ExceptionHandler(Exception.class)
public ResponseEntity<String> errorMessage(Exception e) {
log.error("[其他异常] {}", e.getMessage());
return ResponseEntity.status(500).body("服务器异常" + e.getMessage());
}
/**
* 业务错误
*
* @param e 报错信息
*/
@ResponseBody
@ExceptionHandler(GlobalException.class)
public ResponseEntity<String> errorMessage(GlobalException e) {
log.warn("[自定义异常]" + e.getMessage());
return ResponseEntity.status(400).body(e.getMessage());
}
}
......@@ -45,7 +45,7 @@ public class CodeGenerator {
.enableLombok()
.disableSerialVersionUID() // 禁用序列化
.superClass("org.matrix.database.entity.BaseEntity") // 自定义实体父类
.addIgnoreColumns("create_time", "update_time"); // 忽略生成的字段
.addIgnoreColumns("create_time", "update_time", "id"); // 忽略生成的字段
})
.templateConfig(builder -> {
builder.disable(TemplateType.CONTROLLER, TemplateType.ENTITY, TemplateType.MAPPER) // 禁用模板
......
......@@ -24,8 +24,8 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<!-- 子模块版本以及依赖的版本管理-->
......@@ -59,6 +59,18 @@
<!-- 全局依赖-->
<dependencies>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
......@@ -66,10 +78,11 @@
<scope>provided</scope>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.5</version>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论