parent
e9f312a1a0
commit
fae8ff5f8c
|
@ -2,6 +2,7 @@ package io.metersphere.api.controller;
|
||||||
|
|
||||||
import io.metersphere.api.service.ApiDefinitionService;
|
import io.metersphere.api.service.ApiDefinitionService;
|
||||||
import io.metersphere.api.service.MockConfigService;
|
import io.metersphere.api.service.MockConfigService;
|
||||||
|
import io.metersphere.api.tcp.TCPPool;
|
||||||
import io.metersphere.base.domain.Project;
|
import io.metersphere.base.domain.Project;
|
||||||
import io.metersphere.controller.handler.annotation.NoResultHolder;
|
import io.metersphere.controller.handler.annotation.NoResultHolder;
|
||||||
import io.metersphere.service.ProjectService;
|
import io.metersphere.service.ProjectService;
|
||||||
|
@ -79,4 +80,9 @@ public class MockApiController {
|
||||||
Project project = projectService.findBySystemId(projectSystemId);
|
Project project = projectService.findBySystemId(projectSystemId);
|
||||||
mockConfigService.checkReturnWithMockExpectByUrlParam("HEAD", project, request, response);
|
mockConfigService.checkReturnWithMockExpectByUrlParam("HEAD", project, request, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/getTcpMockPortStatus/")
|
||||||
|
public String genTcpMockPort(){
|
||||||
|
return TCPPool.getTcpStatus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -342,7 +342,7 @@ public class ApiTestEnvironmentService {
|
||||||
tcpConfigObj.put("closeConnection", false);
|
tcpConfigObj.put("closeConnection", false);
|
||||||
if(project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0){
|
if(project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0){
|
||||||
tcpConfigObj.put("server", tcpSocket);
|
tcpConfigObj.put("server", tcpSocket);
|
||||||
tcpConfigObj.put("port", 12138);
|
tcpConfigObj.put("port", project.getMockTcpPort().intValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject object = new JSONObject();
|
JSONObject object = new JSONObject();
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class TCPPool {
|
||||||
stringBuffer.append("Server is null;");
|
stringBuffer.append("Server is null;");
|
||||||
}else {
|
}else {
|
||||||
stringBuffer.append("Port is "+port + ";");
|
stringBuffer.append("Port is "+port + ";");
|
||||||
stringBuffer.append("Server is open: "+ tcpServer.isSocketOpen());
|
stringBuffer.append("Server is open: "+ tcpServer.isSocketOpen()+";");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stringBuffer.toString();
|
return stringBuffer.toString();
|
||||||
|
|
|
@ -30,4 +30,6 @@ public interface ExtProjectMapper {
|
||||||
Map<String, Project> queryNameByIds(@Param("ids") List<String> ids);
|
Map<String, Project> queryNameByIds(@Param("ids") List<String> ids);
|
||||||
|
|
||||||
Organization getOrganizationByProjectId(@Param("projectId")String projectId);
|
Organization getOrganizationByProjectId(@Param("projectId")String projectId);
|
||||||
|
|
||||||
|
List<Integer> selectTcpPorts();
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,4 +158,11 @@
|
||||||
JOIN project ON workspace.id = workspace_id
|
JOIN project ON workspace.id = workspace_id
|
||||||
WHERE project.id = #{projectId, jdbcType=VARCHAR}
|
WHERE project.id = #{projectId, jdbcType=VARCHAR}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectTcpPorts" resultType="java.lang.Integer">
|
||||||
|
SELECT mock_tcp_port
|
||||||
|
FROM project
|
||||||
|
WHERE mock_tcp_port is not null and mock_tcp_port != 0
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
@ -136,4 +136,9 @@ public class ProjectController {
|
||||||
public Collection<String> getOwnerProjectIds() {
|
public Collection<String> getOwnerProjectIds() {
|
||||||
return checkPermissionService.getUserRelatedProjectIds();
|
return checkPermissionService.getUserRelatedProjectIds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/genTcpMockPort/{id}")
|
||||||
|
public String genTcpMockPort(@PathVariable String id){
|
||||||
|
return projectService.genTcpMockPort(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,6 +302,34 @@ public class ProjectService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isMockTcpPortIsInRange(int port){
|
||||||
|
boolean inRange = false;
|
||||||
|
if(StringUtils.isNotEmpty(this.tcpMockPorts)){
|
||||||
|
try {
|
||||||
|
if(this.tcpMockPorts.contains("-")){
|
||||||
|
String [] tcpMockPortArr = this.tcpMockPorts.split("-");
|
||||||
|
int num1 = Integer.parseInt(tcpMockPortArr[0]);
|
||||||
|
int num2 = Integer.parseInt(tcpMockPortArr[1]);
|
||||||
|
|
||||||
|
int startNum = num1 > num2 ? num2 : num1;
|
||||||
|
int endNum = num1 < num2 ? num2 : num1;
|
||||||
|
|
||||||
|
if(port < startNum || port > endNum){
|
||||||
|
inRange = false;
|
||||||
|
}else {
|
||||||
|
inRange = true;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
int tcpPortConfigNum = Integer.parseInt(this.tcpMockPorts);
|
||||||
|
if(port == tcpPortConfigNum){
|
||||||
|
inRange = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inRange;
|
||||||
|
}
|
||||||
private void checkMockTcpPort(int port) {
|
private void checkMockTcpPort(int port) {
|
||||||
if(StringUtils.isNotEmpty(this.tcpMockPorts)){
|
if(StringUtils.isNotEmpty(this.tcpMockPorts)){
|
||||||
try {
|
try {
|
||||||
|
@ -338,8 +366,9 @@ public class ProjectService {
|
||||||
private void checkProjectTcpPort(Project project) {
|
private void checkProjectTcpPort(Project project) {
|
||||||
//判断端口是否重复
|
//判断端口是否重复
|
||||||
if (project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0) {
|
if (project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0) {
|
||||||
|
String projectId = StringUtils.isEmpty(project.getId())?"":project.getId();
|
||||||
ProjectExample example = new ProjectExample();
|
ProjectExample example = new ProjectExample();
|
||||||
example.createCriteria().andMockTcpPortEqualTo(project.getMockTcpPort());
|
example.createCriteria().andMockTcpPortEqualTo(project.getMockTcpPort()).andIdNotEqualTo(projectId);
|
||||||
long countResult = projectMapper.countByExample(example);
|
long countResult = projectMapper.countByExample(example);
|
||||||
if (countResult > 0) {
|
if (countResult > 0) {
|
||||||
MSException.throwException("TCP Port is not unique!");
|
MSException.throwException("TCP Port is not unique!");
|
||||||
|
@ -609,12 +638,71 @@ public class ProjectService {
|
||||||
example.createCriteria().andIsMockTcpOpenEqualTo(statusBoolean).andMockTcpPortNotEqualTo(portInteger);
|
example.createCriteria().andIsMockTcpOpenEqualTo(statusBoolean).andMockTcpPortNotEqualTo(portInteger);
|
||||||
List<Project> projectList = projectMapper.selectByExample(example);
|
List<Project> projectList = projectMapper.selectByExample(example);
|
||||||
|
|
||||||
|
List<Integer> opendPortList = new ArrayList<>();
|
||||||
for (Project p : projectList) {
|
for (Project p : projectList) {
|
||||||
|
boolean isPortInRange = this.isMockTcpPortIsInRange(p.getMockTcpPort());
|
||||||
|
if(isPortInRange && !opendPortList.contains(p.getMockTcpPort())){
|
||||||
|
opendPortList.add(p.getMockTcpPort());
|
||||||
this.openMockTcp(p);
|
this.openMockTcp(p);
|
||||||
|
}else {
|
||||||
|
if(opendPortList.contains(p.getMockTcpPort())){
|
||||||
|
p.setMockTcpPort(0);
|
||||||
|
}
|
||||||
|
p.setIsMockTcpOpen(false);
|
||||||
|
projectMapper.updateByPrimaryKeySelective(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Organization getOrganizationByProjectId(String projectId) {
|
public Organization getOrganizationByProjectId(String projectId) {
|
||||||
return extProjectMapper.getOrganizationByProjectId(projectId);
|
return extProjectMapper.getOrganizationByProjectId(projectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String genTcpMockPort(String id) {
|
||||||
|
int returnPort = 0;
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(id);
|
||||||
|
if(project != null && project.getMockTcpPort() != null && project.getMockTcpPort().intValue() != 0 ){
|
||||||
|
if(this.isMockTcpPortIsInRange(project.getMockTcpPort().intValue())){
|
||||||
|
returnPort = project.getMockTcpPort();
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(StringUtils.isNotEmpty(this.tcpMockPorts)){
|
||||||
|
List<Integer> portInRange = new ArrayList<>();
|
||||||
|
List<Integer> tcpPortInDataBase = extProjectMapper.selectTcpPorts();
|
||||||
|
for (Integer port :tcpPortInDataBase) {
|
||||||
|
if(this.isMockTcpPortIsInRange(port)){
|
||||||
|
portInRange.add(port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(this.tcpMockPorts.contains("-")){
|
||||||
|
String [] tcpMockPortArr = this.tcpMockPorts.split("-");
|
||||||
|
int num1 = Integer.parseInt(tcpMockPortArr[0]);
|
||||||
|
int num2 = Integer.parseInt(tcpMockPortArr[1]);
|
||||||
|
|
||||||
|
int startNum = num1 > num2 ? num2 : num1;
|
||||||
|
int endNum = num1 < num2 ? num2 : num1;
|
||||||
|
|
||||||
|
for (int i = startNum; i <= endNum ; i++) {
|
||||||
|
if(!portInRange.contains(i)){
|
||||||
|
returnPort = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
int tcpPortConfigNum = Integer.parseInt(this.tcpMockPorts);
|
||||||
|
if(!portInRange.contains(tcpPortConfigNum)){
|
||||||
|
returnPort = tcpPortConfigNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(returnPort == 0 ){
|
||||||
|
MSException.throwException("无可用TCP端口");
|
||||||
|
}
|
||||||
|
return String.valueOf(returnPort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
|
|
||||||
<el-form-item :label-width="labelWidth" label="TCP Mock Port">
|
<el-form-item :label-width="labelWidth" label="TCP Mock Port">
|
||||||
<el-input-number v-model="form.mockTcpPort" :controls="false" style="width: 30%;margin-right: 30px"></el-input-number>
|
<el-input-number v-model="form.mockTcpPort" :controls="false" style="width: 30%;margin-right: 30px"></el-input-number>
|
||||||
<el-switch v-model="form.isMockTcpOpen"></el-switch>
|
<el-switch v-model="form.isMockTcpOpen" @change="chengeMockTcpSwitch"></el-switch>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item :label-width="labelWidth" :label="$t('commons.description')" prop="description">
|
<el-form-item :label-width="labelWidth" :label="$t('commons.description')" prop="description">
|
||||||
|
@ -185,6 +185,7 @@ import MsResourceFiles from "@/business/components/performance/test/components/R
|
||||||
import TemplateSelect from "@/business/components/settings/workspace/template/TemplateSelect";
|
import TemplateSelect from "@/business/components/settings/workspace/template/TemplateSelect";
|
||||||
import {PROJECT_CONFIGS} from "@/business/components/common/components/search/search-components";
|
import {PROJECT_CONFIGS} from "@/business/components/common/components/search/search-components";
|
||||||
import MsInstructionsIcon from "@/business/components/common/components/MsInstructionsIcon";
|
import MsInstructionsIcon from "@/business/components/common/components/MsInstructionsIcon";
|
||||||
|
import {parseEnvironment} from "@/business/components/api/test/model/EnvironmentModel";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "MsProject",
|
name: "MsProject",
|
||||||
|
@ -394,13 +395,21 @@ export default {
|
||||||
openEnvironmentConfig(project) {
|
openEnvironmentConfig(project) {
|
||||||
this.$refs.environmentConfig.open(project.id);
|
this.$refs.environmentConfig.open(project.id);
|
||||||
},
|
},
|
||||||
|
chengeMockTcpSwitch(value){
|
||||||
|
if(value && this.form.mockTcpPort === 0){
|
||||||
|
this.result = this.$get('/project/genTcpMockPort/' + this.form.id, res => {
|
||||||
|
let port = res.data;
|
||||||
|
this.form.mockTcpPort = port;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
document.addEventListener('keydown', this.handleEvent);
|
document.addEventListener('keydown', this.handleEvent);
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
document.removeEventListener('keydown', this.handleEvent);
|
document.removeEventListener('keydown', this.handleEvent);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,10 @@
|
||||||
<template-select :data="form" scene="ISSUE" prop="issueTemplateId" ref="issueTemplate"/>
|
<template-select :data="form" scene="ISSUE" prop="issueTemplateId" ref="issueTemplate"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item :label-width="labelWidth" label="TCP Mock Port">
|
||||||
|
<el-input-number v-model="form.mockTcpPort" :controls="false" style="width: 30%;margin-right: 30px"></el-input-number>
|
||||||
|
<el-switch v-model="form.isMockTcpOpen" @change="chengeMockTcpSwitch"></el-switch>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item :label-width="labelWidth" :label="$t('commons.description')" prop="description">
|
<el-form-item :label-width="labelWidth" :label="$t('commons.description')" prop="description">
|
||||||
<el-input :autosize="{ minRows: 2, maxRows: 4}" type="textarea" v-model="form.description"></el-input>
|
<el-input :autosize="{ minRows: 2, maxRows: 4}" type="textarea" v-model="form.description"></el-input>
|
||||||
|
@ -662,6 +666,14 @@ export default {
|
||||||
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
|
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
chengeMockTcpSwitch(value){
|
||||||
|
if(value && this.form.mockTcpPort === 0){
|
||||||
|
this.result = this.$get('/project/genTcpMockPort/' + this.form.id, res => {
|
||||||
|
let port = res.data;
|
||||||
|
this.form.mockTcpPort = port;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
document.addEventListener('keydown', this.handleEvent);
|
document.addEventListener('keydown', this.handleEvent);
|
||||||
|
|
Loading…
Reference in New Issue