This commit is contained in:
chenjianxing 2020-04-27 17:36:15 +08:00
commit 0f32c916ba
12 changed files with 971 additions and 207 deletions

View File

@ -134,6 +134,25 @@
<version>5.1</version>
</dependency>
<!-- jmeter -->
<!-- <dependency>-->
<!-- <groupId>org.apache.jmeter</groupId>-->
<!-- <artifactId>ApacheJMeter_core</artifactId>-->
<!-- <version>${jmeter.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_http</artifactId>
<version>${jmeter.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>

View File

@ -11,11 +11,13 @@ import io.metersphere.base.domain.ApiTestWithBLOBs;
import io.metersphere.commons.constants.RoleConstants;
import io.metersphere.commons.utils.PageUtils;
import io.metersphere.commons.utils.Pager;
import io.metersphere.controller.request.testplan.SaveTestPlanRequest;
import io.metersphere.service.FileService;
import io.metersphere.user.SessionUtils;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@ -46,9 +48,9 @@ public class APITestController {
return PageUtils.setPageInfo(page, apiTestService.list(request));
}
@PostMapping(value = "/save")
public String save(@RequestBody SaveAPITestRequest request) {
return apiTestService.save(request);
@PostMapping(value = "/save", consumes = {"multipart/form-data"})
public String save(@RequestPart("request") SaveAPITestRequest request, @RequestPart(value = "files") List<MultipartFile> files) {
return apiTestService.save(request, files);
}
@GetMapping("/get/{testId}")
@ -61,8 +63,8 @@ public class APITestController {
apiTestService.delete(request);
}
@PostMapping("/run")
public void run(@RequestBody SaveAPITestRequest request) {
apiTestService.run(request);
@PostMapping(value = "/run", consumes = {"multipart/form-data"})
public String run(@RequestPart("request") SaveAPITestRequest request, @RequestPart(value = "files") List<MultipartFile> files) {
return apiTestService.run(request, files);
}
}

View File

@ -5,7 +5,8 @@ import io.metersphere.api.dto.DeleteAPITestRequest;
import io.metersphere.api.dto.QueryAPITestRequest;
import io.metersphere.api.dto.SaveAPITestRequest;
import io.metersphere.base.domain.*;
import io.metersphere.base.mapper.*;
import io.metersphere.base.mapper.ApiTestFileMapper;
import io.metersphere.base.mapper.ApiTestMapper;
import io.metersphere.base.mapper.ext.ExtApiTestMapper;
import io.metersphere.commons.constants.APITestStatus;
import io.metersphere.commons.exception.MSException;
@ -14,9 +15,12 @@ import io.metersphere.service.FileService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.annotation.Resource;
@ -29,12 +33,6 @@ public class ApiTestService {
@Resource
private ExtApiTestMapper extApiTestMapper;
@Resource
private ProjectMapper projectMapper;
@Resource
private FileMetadataMapper fileMetadataMapper;
@Resource
private FileContentMapper fileContentMapper;
@Resource
private ApiTestFileMapper apiTestFileMapper;
@Resource
private FileService fileService;
@ -48,13 +46,27 @@ public class ApiTestService {
return extApiTestMapper.list(request);
}
public String save(SaveAPITestRequest request) {
public String save(SaveAPITestRequest request, List<MultipartFile> files) {
if (files == null) {
throw new IllegalArgumentException(Translator.get("file_cannot_be_null"));
}
final ApiTestWithBLOBs test;
if (StringUtils.isNotBlank(request.getId())) {
// 删除原来的文件
deleteFileByTestId(request.getId());
test = updateTest(request);
} else {
test = createTest(request);
}
// 保存新文件
files.forEach(file -> {
final FileMetadata fileMetadata = fileService.saveFile(file);
ApiTestFile apiTestFile = new ApiTestFile();
apiTestFile.setTestId(test.getId());
apiTestFile.setFileId(fileMetadata.getId());
apiTestFileMapper.insert(apiTestFile);
});
return test.getId();
}
@ -66,8 +78,8 @@ public class ApiTestService {
apiTestMapper.deleteByPrimaryKey(request.getId());
}
public void run(SaveAPITestRequest request) {
save(request);
public String run(SaveAPITestRequest request, List<MultipartFile> files) {
return save(request, files);
}
private ApiTestWithBLOBs updateTest(SaveAPITestRequest request) {
@ -101,4 +113,17 @@ public class ApiTestService {
return test;
}
public void deleteFileByTestId(String testId) {
ApiTestFileExample ApiTestFileExample = new ApiTestFileExample();
ApiTestFileExample.createCriteria().andTestIdEqualTo(testId);
final List<ApiTestFile> ApiTestFiles = apiTestFileMapper.selectByExample(ApiTestFileExample);
apiTestFileMapper.deleteByExample(ApiTestFileExample);
if (!CollectionUtils.isEmpty(ApiTestFiles)) {
final List<String> fileIds = ApiTestFiles.stream().map(ApiTestFile::getFileId).collect(Collectors.toList());
fileService.deleteFileByIds(fileIds);
}
}
}

View File

@ -5,11 +5,18 @@ import io.metersphere.base.mapper.FileContentMapper;
import io.metersphere.base.mapper.FileMetadataMapper;
import io.metersphere.base.mapper.ApiTestFileMapper;
import io.metersphere.base.mapper.LoadTestFileMapper;
import io.metersphere.commons.constants.FileType;
import io.metersphere.commons.exception.MSException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@Service
@ -58,25 +65,6 @@ public class FileService {
return fileContentMapper.selectByPrimaryKey(fileId);
}
public void deleteFileByTestId(String testId) {
LoadTestFileExample loadTestFileExample = new LoadTestFileExample();
loadTestFileExample.createCriteria().andTestIdEqualTo(testId);
final List<LoadTestFile> loadTestFiles = loadTestFileMapper.selectByExample(loadTestFileExample);
loadTestFileMapper.deleteByExample(loadTestFileExample);
if (!CollectionUtils.isEmpty(loadTestFiles)) {
final List<String> fileIds = loadTestFiles.stream().map(LoadTestFile::getFileId).collect(Collectors.toList());
FileMetadataExample fileMetadataExample = new FileMetadataExample();
fileMetadataExample.createCriteria().andIdIn(fileIds);
fileMetadataMapper.deleteByExample(fileMetadataExample);
FileContentExample fileContentExample = new FileContentExample();
fileContentExample.createCriteria().andFileIdIn(fileIds);
fileContentMapper.deleteByExample(fileContentExample);
}
}
public void deleteFileByIds(List<String> ids) {
if (CollectionUtils.isEmpty(ids)) {
return;
@ -89,4 +77,33 @@ public class FileService {
example2.createCriteria().andFileIdIn(ids);
fileContentMapper.deleteByExample(example2);
}
public FileMetadata saveFile(MultipartFile file) {
final FileMetadata fileMetadata = new FileMetadata();
fileMetadata.setId(UUID.randomUUID().toString());
fileMetadata.setName(file.getOriginalFilename());
fileMetadata.setSize(file.getSize());
fileMetadata.setCreateTime(System.currentTimeMillis());
fileMetadata.setUpdateTime(System.currentTimeMillis());
FileType fileType = getFileType(fileMetadata.getName());
fileMetadata.setType(fileType.name());
fileMetadataMapper.insert(fileMetadata);
FileContent fileContent = new FileContent();
fileContent.setFileId(fileMetadata.getId());
try {
fileContent.setFile(file.getBytes());
} catch (IOException e) {
MSException.throwException(e);
}
fileContentMapper.insert(fileContent);
return fileMetadata;
}
private FileType getFileType(String filename) {
int s = filename.lastIndexOf(".") + 1;
String type = filename.substring(s);
return FileType.valueOf(type.toUpperCase());
}
}

View File

@ -22,6 +22,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@ -39,10 +40,6 @@ public class PerformanceTestService {
@Resource
private ExtLoadTestMapper extLoadTestMapper;
@Resource
private FileMetadataMapper fileMetadataMapper;
@Resource
private FileContentMapper fileContentMapper;
@Resource
private LoadTestFileMapper loadTestFileMapper;
@Resource
private FileService fileService;
@ -62,7 +59,19 @@ public class PerformanceTestService {
public void delete(DeleteTestPlanRequest request) {
loadTestMapper.deleteByPrimaryKey(request.getId());
fileService.deleteFileByTestId(request.getId());
deleteFileByTestId(request.getId());
}
public void deleteFileByTestId(String testId) {
LoadTestFileExample loadTestFileExample = new LoadTestFileExample();
loadTestFileExample.createCriteria().andTestIdEqualTo(testId);
final List<LoadTestFile> loadTestFiles = loadTestFileMapper.selectByExample(loadTestFileExample);
loadTestFileMapper.deleteByExample(loadTestFileExample);
if (!CollectionUtils.isEmpty(loadTestFiles)) {
final List<String> fileIds = loadTestFiles.stream().map(LoadTestFile::getFileId).collect(Collectors.toList());
fileService.deleteFileByIds(fileIds);
}
}
public String save(SaveTestPlanRequest request, List<MultipartFile> files) {
@ -71,7 +80,7 @@ public class PerformanceTestService {
}
final LoadTestWithBLOBs loadTest = saveLoadTest(request);
files.forEach(file -> {
final FileMetadata fileMetadata = saveFile(file);
final FileMetadata fileMetadata = fileService.saveFile(file);
LoadTestFile loadTestFile = new LoadTestFile();
loadTestFile.setTestId(loadTest.getId());
loadTestFile.setFileId(fileMetadata.getId());
@ -102,35 +111,6 @@ public class PerformanceTestService {
return loadTest;
}
private FileMetadata saveFile(MultipartFile file) {
final FileMetadata fileMetadata = new FileMetadata();
fileMetadata.setId(UUID.randomUUID().toString());
fileMetadata.setName(file.getOriginalFilename());
fileMetadata.setSize(file.getSize());
fileMetadata.setCreateTime(System.currentTimeMillis());
fileMetadata.setUpdateTime(System.currentTimeMillis());
FileType fileType = getFileType(fileMetadata.getName());
fileMetadata.setType(fileType.name());
fileMetadataMapper.insert(fileMetadata);
FileContent fileContent = new FileContent();
fileContent.setFileId(fileMetadata.getId());
try {
fileContent.setFile(file.getBytes());
} catch (IOException e) {
MSException.throwException(e);
}
fileContentMapper.insert(fileContent);
return fileMetadata;
}
private FileType getFileType(String filename) {
int s = filename.lastIndexOf(".") + 1;
String type = filename.substring(s);
return FileType.valueOf(type.toUpperCase());
}
public String edit(EditTestPlanRequest request, List<MultipartFile> files) {
//
LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(request.getId());
@ -151,7 +131,7 @@ public class PerformanceTestService {
if (files != null) {
files.forEach(file -> {
final FileMetadata fileMetadata = saveFile(file);
final FileMetadata fileMetadata = fileService.saveFile(file);
LoadTestFile loadTestFile = new LoadTestFile();
loadTestFile.setTestId(request.getId());
loadTestFile.setFileId(fileMetadata.getId());

View File

@ -32,6 +32,8 @@
<script>
import MsApiScenarioConfig from "./components/ApiScenarioConfig";
import {Test} from "./model/ScenarioModel"
import Jmx from "./model/JMX";
import {get, post, scenario} from "./model/test"
export default {
name: "MsApiTestConfig",
@ -75,21 +77,23 @@
},
getTest: function (id) {
this.result = this.$get("/api/get/" + id, response => {
let item = response.data;
if (response.data) {
let item = response.data;
this.test = new Test({
id: item.id,
projectId: item.projectId,
name: item.name,
scenarioDefinition: JSON.parse(item.scenarioDefinition),
});
this.$refs.config.reset();
this.test = new Test({
id: item.id,
projectId: item.projectId,
name: item.name,
scenarioDefinition: JSON.parse(item.scenarioDefinition),
});
this.$refs.config.reset();
}
});
},
saveTest: function () {
this.change = false;
this.result = this.$post("/api/save", this.getParam(), response => {
this.result = this.$request(this.getOptions("/api/save"), response => {
this.test.id = response.data;
this.$success(this.$t('commons.save_success'));
});
@ -97,7 +101,7 @@
runTest: function () {
this.change = false;
this.result = this.$post("/api/run", this.getParam(), response => {
this.result = this.$request(this.getOptions("/api/run"), response => {
this.test.id = response.data;
this.$success(this.$t('commons.save_success'));
});
@ -105,13 +109,32 @@
cancel: function () {
this.$router.push('/api/test/list/all');
},
getParam: function () {
return {
getOptions: function (url) {
let formData = new FormData();
let request = {
id: this.test.id,
projectId: this.test.projectId,
name: this.test.name,
scenarioDefinition: JSON.stringify(this.test.scenarioDefinition)
}
let requestJson = JSON.stringify(request);
formData.append('request', new Blob([requestJson], {
type: "application/json"
}));
let jmx = new Jmx(get, "baidu", ["www.baidu.com"]).generate();
let blob = new Blob([jmx], {type: "application/octet-stream"});
formData.append("files", new File([blob], "baidu.jmx"));
return {
method: 'POST',
url: url,
data: formData,
headers: {
'Content-Type': undefined
}
};
}
},

View File

@ -12,18 +12,20 @@
{{$t('api_test.scenario.config')}}
</span>
</div>
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link el-icon-more scenario-btn"/>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'delete', index:index}">删除场景</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- 暂时去掉将来再-->
<!-- <el-dropdown trigger="click" @command="handleCommand">-->
<!-- <span class="el-dropdown-link el-icon-more scenario-btn"/>-->
<!-- <el-dropdown-menu slot="dropdown">-->
<!-- <el-dropdown-item :command="{type:'delete', index:index}">删除场景</el-dropdown-item>-->
<!-- </el-dropdown-menu>-->
<!-- </el-dropdown>-->
</template>
<ms-api-request-config :requests="scenario.requests" :open="select"/>
</ms-api-collapse-item>
</ms-api-collapse>
</div>
<el-button class="scenario-create" type="primary" size="mini" icon="el-icon-plus" plain @click="createScenario"/>
<!-- 暂时去掉将来再-->
<!-- <el-button class="scenario-create" type="primary" size="mini" icon="el-icon-plus" plain @click="createScenario"/>-->
</el-aside>
<el-main class="scenario-main">

View File

@ -0,0 +1,619 @@
let Xml4js = function (options = {}) {
this.depth = 0;
this.encoding = options.encoding || 'UTF-8';
this.xml = '<?xml version="1.0" encoding="UTF-8"?>\n';
};
Xml4js.prototype = {
toString: function () {
return this.xml;
},
write: function () {
let context = this,
elem,
attr = null,
value = null,
callback = false,
fn = null,
hasValue = null,
empty = null;
elem = arguments[0];
if (elem === '<hashTree/>') {
this.xml += '<hashTree/>\n'
return;
}
if (typeof arguments[1] == 'object') {
attr = arguments[1];
} else if (typeof arguments[1] == 'function') {
callback = true;
fn = arguments[1];
} else {
value = arguments[1];
}
if (typeof arguments[2] == 'function') {
if (!callback) {
callback = true;
fn = arguments[2];
}
} else {
if (value === null) {
value = arguments[2];
}
}
hasValue = value !== null;
empty = !hasValue && !callback;
function indent(depth) {
if (depth == null)
return '';
let space = '';
for (let i = 0; i < depth; i++)
if (context.tabs)
space += "\t";
else
space += ' ';
return space;
}
if (elem === 'cdata') {
this.xml += indent(this.depth) + '<![CDATA[' + value + ']]>\n';
} else {
this.xml += indent(this.depth) + '<' + elem;
if (attr) {
for (let key in attr) {
if (attr.hasOwnProperty(key)) {
this.xml += ' ';
this.xml += key + '="' + attr[key] + '"';
}
}
}
if (value !== null)
this.xml += '>' + value + '</' + elem + '>\n';
if (callback) {
this.xml += '>\n'
this.depth++;
if (fn instanceof Function) {
fn();
}
this.depth--;
this.xml += indent(this.depth) + '</' + elem + '>\n'
}
if (empty)
this.xml += '/>\n';
}
}
};
/**
*
*JMX 构造对象
*/
let Jmx = function (data, name, ds) {
this.data = data;
this.name = name;
let domains = {};
ds.forEach(function (d) {
domains[d] = d;
});
this.domains = domains;
this.xml = new Xml4js();
};
Jmx.prototype = {
generate: function () {
generateXml(this.xml, this.preprocessing());
return this.xml.toString();
},
preprocessing: function () {
let domainAlias = {};
let index = 1;
Object.getOwnPropertyNames(this.domains).forEach(function (key) {
domainAlias[key] = "BASE_URL_" + index;
index = index + 1;
});
let UserAgent = null;
let hsps = [];
let domains = this.domains;
this.data.forEach(function (item) {
let url = new URL(item.url);
if (domains[url.hostname]) {
let hsp = new HTTPSamplerProxy(item.label.replace(/&/gi, "&amp;"));
hsp.stringProp("HTTPSampler.domain", "${" + domainAlias[url.hostname] + "}");
hsp.stringProp("HTTPSampler.protocol", url.protocol.split(":")[0]);
hsp.stringProp("HTTPSampler.path", url.pathname);
hsp.stringProp("HTTPSampler.method", item.method);
if (url.port === "") {
hsp.intProp("HTTPSampler.port", 0);
} else {
hsp.intProp("HTTPSampler.port", url.port);
}
hsp.addArguments(item.url, item.body);
hsps.push(hsp);
if (item.headers.length === 0) {
hsps.push("<hashTree/>");
} else {
let cphmh = new CollectionPropHeaderManagerHeaders();
item.headers.forEach(function (h) {
if (h.name === 'User-Agent') {
UserAgent = h.value;
} else {
cphmh.addValue(new elementPropHeaderManager(h.name, h.value));
}
});
// Add Header
let ephm = new HeaderManager();
ephm.addValue(cphmh);
let ht = new HashTree();
ht.addValue(ephm);
ht.addValue("<hashTree/>");
hsps.push(ht);
}
}
});
let jmeterTestPlan = new JmeterTestPlan();
let hashTree = new HashTree();
jmeterTestPlan.addValue(hashTree);
let testPlan = new TestPlan(this.name);
testPlan.boolProp("TestPlan.functional_mode", false);
testPlan.boolProp("TestPlan.serialize_threadgroups", false);
testPlan.boolProp("TestPlan.tearDown_on_shutdown", true);
testPlan.stringProp("TestPlan.comments", "");
testPlan.stringProp("TestPlan.user_define_classpath", "");
testPlan.addArguments();
hashTree.addValue(testPlan);
let hashTree1 = new HashTree();
hashTree.addValue(hashTree1);
//HeaderManager
let hm = new HeaderManager();
hm.userAgent(UserAgent);
hashTree1.addValue(hm);
hashTree1.addValue("<hashTree/>");
//Arguments
let arg = new Arguments();
arg.addArguments(domainAlias);
hashTree1.addValue(arg);
hashTree1.addValue("<hashTree/>");
//DNSCacheManager
let dns = new DNSCacheManager();
dns.init();
hashTree1.addValue(dns);
hashTree1.addValue("<hashTree/>");
//AuthManager
let auth = new AuthManager();
auth.init();
hashTree1.addValue(auth);
hashTree1.addValue("<hashTree/>");
//CookieManager
let cookie = new CookieManager();
cookie.init();
hashTree1.addValue(cookie);
hashTree1.addValue("<hashTree/>");
//CacheManager
let cache = new CacheManager();
cache.boolProp("clearEachIteration", true);
cache.boolProp("useExpires", false);
cache.boolProp("CacheManager.controlledByThread", false);
hashTree1.addValue(cache);
hashTree1.addValue("<hashTree/>");
let threadGroup = new ThreadGroup();
hashTree1.addValue(threadGroup);
threadGroup.intProp("ThreadGroup.num_threads", 1);
threadGroup.intProp("ThreadGroup.ramp_time", 1);
threadGroup.longProp("ThreadGroup.delay", 0);
threadGroup.longProp("ThreadGroup.duration", 0);
threadGroup.stringProp("ThreadGroup.on_sample_error", "continue");
threadGroup.boolProp("ThreadGroup.scheduler", false);
let lc = new LoopController();
threadGroup.addValue(lc);
lc.boolProp("LoopController.continue_forever", false);
lc.stringProp("LoopController.loops", 1);
let ht = new HashTree();
hashTree1.addValue(ht);
hsps.forEach(function (hsp) {
ht.addValue(hsp);
});
return jmeterTestPlan;
}
};
function generateXml(xml, hashTree) {
if (hashTree instanceof HashTree) {
if (hashTree.values.length > 0 && !(hashTree.values[0] instanceof HashTree)) {
xml.write(hashTree.element, hashTree.attributes, hashTree.values[0]);
} else {
xml.write(hashTree.element, hashTree.attributes, function () {
if (hashTree.values.length > 0) {
hashTree.values.forEach(function (v) {
generateXml(xml, v);
})
}
});
}
} else {
xml.write(hashTree);
}
}
/**
* HashTree 初始对象
*/
let HashTree = function (element, attributes, value) {
this.element = element || "hashTree";
this.attributes = attributes || {};
this.values = [];
if (value !== undefined) {
this.values.push(value);
}
};
HashTree.prototype.addValue = function (hashTree) {
this.values.push(hashTree)
};
HashTree.prototype.commonValue = function (element, name, value) {
this.values.push(new HashTree(element, {name: name}, value))
};
HashTree.prototype.intProp = function (name, value) {
this.commonValue("intProp", name, value);
};
HashTree.prototype.longProp = function (name, value) {
this.commonValue("longProp", name, value);
};
HashTree.prototype.stringProp = function (name, value) {
this.commonValue("stringProp", name, value);
};
HashTree.prototype.boolProp = function (name, value) {
this.commonValue("boolProp", name, value);
};
/**
* HashTree 的帮助对象
*/
let CHashTree = function (element, guiclass, testclass, testname, enabled) {
HashTree.call(this, element, {
guiclass: guiclass,
testclass: testclass,
testname: testname || "TEST",
enabled: enabled || "true"
});
};
CHashTree.prototype = new HashTree();
/**
* JmeterTestPlan
*
*/
let JmeterTestPlan = function (options = {}) {
HashTree.call(this, "jmeterTestPlan",
{
version: options.version || "1.2",
properties: options.properties || "5.0",
jmeter: options.jmeter || "5.2.1"
});
};
JmeterTestPlan.prototype = new HashTree();
/**
* TestPlan
*
*/
let TestPlan = function (name) {
CHashTree.call(this, "TestPlan", "TestPlanGui", "TestPlan", name);
};
TestPlan.prototype = new CHashTree();
TestPlan.prototype.addArguments = function () {
let ht = new HashTree("elementProp", {
name: "TestPlan.user_defined_variables",
elementType: "Arguments"
});
ht.addValue(new HashTree("collectionProp", {name: "Arguments.arguments"}));
this.values.push(ht);
};
/**
* HeaderManager
*
*/
let HeaderManager = function () {
CHashTree.call(this, "HeaderManager", "HeaderPanel", "HeaderManager", "HTTP Header manager");
};
HeaderManager.prototype = new CHashTree();
HeaderManager.prototype.userAgent = function (userAgent) {
let cp = new HashTree("collectionProp", {
name: "HeaderManager.headers",
});
let ep = new HashTree("elementProp", {
name: "User-Agent",
elementType: "Header"
});
ep.stringProp("Header.name", "User-Agent");
ep.stringProp("Header.value", userAgent);
cp.addValue(ep);
this.values.push(cp);
};
/**
* Arguments
*
*/
let Arguments = function () {
CHashTree.call(this, "Arguments", "ArgumentsPanel", "Arguments", "User Defined Variables");
};
Arguments.prototype = new CHashTree();
Arguments.prototype.addArguments = function (domianAlias) {
let cp = new HashTree("collectionProp", {name: "Arguments.arguments"});
if (domianAlias) {
Object.getOwnPropertyNames(domianAlias).forEach(function (key) {
cp.addValue(addArgumentsCommon(domianAlias[key], key, true, true));
});
}
this.values.push(cp);
};
/**
* DNSCacheManager
*
*/
let DNSCacheManager = function () {
CHashTree.call(this, "DNSCacheManager", "DNSCachePanel", "DNSCacheManager", "DNS Cache Manager");
};
DNSCacheManager.prototype = new CHashTree();
DNSCacheManager.prototype.init = function () {
let cp = new HashTree("collectionProp", {name: "DNSCacheManager.servers"});
this.values.push(cp);
this.boolProp("DNSCacheManager.clearEachIteration", true);
this.boolProp("DNSCacheManager.isCustomResolver", false);
};
/**
* AuthManager
*
*/
let AuthManager = function () {
CHashTree.call(this, "AuthManager", "AuthPanel", "AuthManager", "HTTP Authorization Manager");
};
AuthManager.prototype = new CHashTree();
AuthManager.prototype.init = function () {
let cp = new HashTree("collectionProp", {name: "AuthManager.auth_list"});
this.values.push(cp);
this.boolProp("AuthManager.controlledByThreadGroup", false);
};
/**
* CookieManager
*
*/
let CookieManager = function () {
CHashTree.call(this, "CookieManager", "CookiePanel", "CookieManager", "HTTP Cookie Manager");
};
CookieManager.prototype = new CHashTree();
CookieManager.prototype.init = function () {
let cp = new HashTree("collectionProp", {name: "CookieManager.cookies"});
this.values.push(cp);
this.boolProp("CookieManager.clearEachIteration", true);
this.boolProp("CookieManager.controlledByThreadGroup", false);
};
/**
* CacheManager
*
*/
let CacheManager = function () {
CHashTree.call(this, "CacheManager", "CacheManagerGui", "CacheManager", "HTTP Cache Manager");
};
CacheManager.prototype = new CHashTree();
/**
* ThreadGroup
*
*/
let ThreadGroup = function () {
CHashTree.call(this, "ThreadGroup", "ThreadGroupGui", "ThreadGroup", "Group1");
};
ThreadGroup.prototype = new CHashTree();
let LoopController = function () {
HashTree.call(this, "elementProp", {
name: "ThreadGroup.main_controller",
elementType: "LoopController",
guiclass: "LoopControlPanel",
testclass: "LoopController",
testname: "Loop Controller",
enabled: "true"
});
};
LoopController.prototype = new HashTree();
/**
* HTTPSamplerProxy
*
*/
let HTTPSamplerProxy = function (name) {
HashTree.call(this, "HTTPSamplerProxy", {
guiclass: "HttpTestSampleGui",
testclass: "HTTPSamplerProxy",
testname: name,
enabled: "true"
});
};
HTTPSamplerProxy.prototype = new HashTree();
HTTPSamplerProxy.prototype.addArguments = function (url, body) {
let ht = new HashTree("elementProp", {
name: "HTTPSampler.Arguments",
elementType: "Arguments",
guiclass: "HTTPArgumentsPanel",
testclass: "Arguments",
enabled: "true"
});
let cp = new HashTree("collectionProp", {name: "Arguments.arguments"});
ht.addValue(cp);
let params = getUrlParams(url);
params.forEach(function (item) {
cp.addValue(addArgumentsCommon(item.name, item.value, false));
});
if (body) {
this.boolProp("HTTPSampler.postBodyRaw", true);
if (body instanceof Array) {
cp.addValue(addArgumentsBody(body[0], true));
} else {
cp.addValue(addArgumentsBody(body, true));
}
}
this.values.push(ht);
};
function addArgumentsCommon(name, value, alwaysEncode, metadata) {
let ht = new HashTree("elementProp", {
name: name,
elementType: "HTTPArgument"
});
ht.boolProp("HTTPArgument.always_encode", alwaysEncode);
if (typeof (name) == 'string') {
ht.stringProp("Argument.name", name);
}
ht.stringProp("Argument.value", value);
if (!metadata) {
ht.stringProp("Argument.metadata", "=");
}
return ht;
}
function addArgumentsBody(value, alwaysEncode, metadata) {
let ht = new HashTree("elementProp", {
name: name,
elementType: "HTTPArgument"
});
ht.boolProp("HTTPArgument.always_encode", alwaysEncode);
ht.stringProp("Argument.value", value);
if (!metadata) {
ht.stringProp("Argument.metadata", "=");
}
return ht;
}
function getUrlParams(url) {
let params = [];
if (url.indexOf('?') === -1) {
return params;
}
let queryString = url.split('?')[1];
queryString = queryString.split('#')[0];
let arr = queryString.split('&');
arr.forEach(function (item) {
let a = item.split('=');
params.push({
name: a[0],
value: a[1]
});
});
return params;
}
let ElementPropHeaderManager = function () {
HashTree.call(this, "elementProp", {
name: "HTTPSampler.header_manager",
elementType: "HeaderManager"
});
};
ElementPropHeaderManager.prototype = new HashTree();
let CollectionPropHeaderManagerHeaders = function () {
HashTree.call(this, "collectionProp", {
name: "HeaderManager.headers"
});
};
CollectionPropHeaderManagerHeaders.prototype = new HashTree();
let elementPropHeaderManager = function (name, value) {
let ht = new HashTree("elementProp", {
name: name,
elementType: "Header"
});
ht.stringProp("Header.name", name);
ht.stringProp("Header.value", value);
return ht;
};
export default Jmx;

View File

@ -0,0 +1,95 @@
export const get = [{
"headers": [{"name": "Upgrade-Insecure-Requests", "value": "1"}, {
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
}, {
"name": "Accept",
"value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
}],
"label": "https://www.baidu.com/",
"method": "GET",
"requestId": "21478",
"request_subtype": "",
"request_type": "top_level",
"tabId": 394,
"timestamp": 1587958164590,
"url": "https://www.baidu.com/"
}, {
"headers": [{"name": "Accept", "value": "application/json, text/javascript, */*; q=0.01"}, {
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
}],
"label": "https://www.baidu.com/sugrec?prod=pc_his&from=pc_web&json=1&sid=1447_31124_21122_31424_31341_30903_31229_30824_26350_31164_31195&hisdata=&csor=0",
"method": "GET",
"requestId": "21522",
"request_subtype": "",
"request_type": "ajax",
"tabId": 394,
"timestamp": 1587958165726,
"url": "https://www.baidu.com/sugrec?prod=pc_his&from=pc_web&json=1&sid=1447_31124_21122_31424_31341_30903_31229_30824_26350_31164_31195&hisdata=&csor=0"
}, {
"headers": [{"name": "Accept", "value": "text/plain, */*; q=0.01"}, {
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
}, {"name": "X-Requested-With", "value": "XMLHttpRequest"}],
"label": "https://www.baidu.com/home/xman/data/tipspluslist?indextype=manht&_req_seqid=0xacf4e73f00017936&asyn=1&t=1587958166015&sid=1447_31124_21122_31424_31341_30903_31229_30824_26350_31164_31195",
"method": "GET",
"requestId": "21540",
"request_subtype": "",
"request_type": "ajax",
"tabId": 394,
"timestamp": 1587958166018,
"url": "https://www.baidu.com/home/xman/data/tipspluslist?indextype=manht&_req_seqid=0xacf4e73f00017936&asyn=1&t=1587958166015&sid=1447_31124_21122_31424_31341_30903_31229_30824_26350_31164_31195"
}, {
"headers": [{"name": "Accept", "value": "text/plain, */*; q=0.01"}, {
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
}, {"name": "X-Requested-With", "value": "XMLHttpRequest"}],
"label": "https://www.baidu.com/home/msg/data/personalcontent?num=8&indextype=manht&_req_seqid=0xacf4e73f00017936&asyn=1&t=1587958166028&sid=1447_31124_21122_31424_31341_30903_31229_30824_26350_31164_31195",
"method": "GET",
"requestId": "21541",
"request_subtype": "",
"request_type": "ajax",
"tabId": 394,
"timestamp": 1587958166031,
"url": "https://www.baidu.com/home/msg/data/personalcontent?num=8&indextype=manht&_req_seqid=0xacf4e73f00017936&asyn=1&t=1587958166028&sid=1447_31124_21122_31424_31341_30903_31229_30824_26350_31164_31195"
}];
export const post = [{
"body": ["{\"id\":null,\"projectId\":\"e15d2d02-7404-485f-944b-2f2dbd456e3e\",\"name\":\"test second\",\"scenarioDefinition\":\"[{\\\"name\\\":null,\\\"url\\\":null,\\\"variables\\\":[],\\\"headers\\\":[],\\\"requests\\\":[{\\\"randomId\\\":2311,\\\"name\\\":null,\\\"url\\\":null,\\\"method\\\":\\\"GET\\\",\\\"parameters\\\":[],\\\"headers\\\":[],\\\"body\\\":{\\\"type\\\":null,\\\"text\\\":null,\\\"kvs\\\":[]},\\\"assertions\\\":{\\\"text\\\":[],\\\"regex\\\":[],\\\"responseTime\\\":{\\\"type\\\":\\\"RESPONSE_TIME\\\",\\\"responseInTime\\\":null}},\\\"extract\\\":[]}]}]\"}"],
"headers": [{"name": "Accept", "value": "application/json, text/plain, */*"}, {
"name": "User-Agent",
"value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
}, {"name": "Content-Type", "value": "application/json;charset=UTF-8"}],
"label": "http://localhost:8080/api/save",
"method": "POST",
"requestId": "26129",
"request_subtype": "",
"request_type": "ajax",
"tabId": 466,
"timestamp": 1587968228917,
"url": "http://localhost:8080/api/save"
}]
export const scenario = [{
"name": "Scenario 1",
"url": null,
"variables": [],
"headers": [],
"requests": [{
"randomId": 6271,
"name": "Request 1",
"url": "https://www.baidu.com",
"method": "GET",
"parameters": [{"key": "flag", "value": "test"}],
"headers": [{"key": "test_header", "value": "test_heade_value"}],
"body": {"type": null, "text": null, "kvs": []},
"assertions": {
"text": [],
"regex": [{"type": "REGEX", "subject": "HTTP_CODE", "expression": "^200$", "description": "equals: 200"}],
"responseTime": {"type": "RESPONSE_TIME", "responseInTime": null}
},
"extract": []
}]
}]

View File

@ -27,7 +27,7 @@
:total="total"/>
</el-card>
<el-dialog :title="$t('workspace.create')" :visible.sync="createVisible" width="30%">
<el-dialog :title="$t('workspace.create')" :visible.sync="dialogWsAddVisible" width="30%">
<el-form :model="form" :rules="rules" ref="form" label-position="right" label-width="100px" size="small">
<el-form-item :label="$t('commons.name')" prop="name">
<el-input v-model="form.name" autocomplete="off"/>
@ -45,8 +45,8 @@
</el-dialog>
<!-- dialog of workspace member -->
<el-dialog :visible.sync="memberVisible" width="70%" :destroy-on-close="true" @close="closeMemberFunc">
<ms-table-header :condition.sync="dialogCondition" @create="addMember"
<el-dialog :visible.sync="dialogWsMemberVisible" width="70%" :destroy-on-close="true" @close="closeMemberFunc">
<ms-table-header :condition.sync="dialogCondition" @create="addMember" @search="wsMemberList"
:create-tip="dialogBtnTips" :title="$t('commons.member')"/>
<!-- organization member table -->
<el-table :data="memberLineData" style="width: 100%;margin-top: 5px;">
@ -69,12 +69,12 @@
</template>
</el-table-column>
</el-table>
<ms-table-pagination :change="wsMemberList" :current-page.sync="currentMemberPage" :page-size.sync="pageMemberSize"
:total="memberTotal"/>
<ms-table-pagination :change="wsMemberList" :current-page.sync="dialogCurrentPage" :page-size.sync="dialogPageSize"
:total="dialogTotal"/>
</el-dialog>
<!-- add workspace member dialog -->
<el-dialog :title="$t('member.create')" :visible.sync="addMemberVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('member.create')" :visible.sync="dialogWsMemberAddVisible" width="30%" :destroy-on-close="true"
@close="closeFunc">
<el-form :model="memberForm" ref="form" :rules="wsMemberRule" label-position="right" label-width="100px"
size="small">
@ -112,7 +112,7 @@
</el-dialog>
<!-- update workspace member dialog -->
<el-dialog :title="$t('member.modify')" :visible.sync="updateMemberVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('member.modify')" :visible.sync="dialogWsMemberUpdateVisible" width="30%" :destroy-on-close="true"
@close="closeFunc">
<el-form :model="memberForm" label-position="right" label-width="100px" size="small" ref="updateUserForm">
<el-form-item label="ID" prop="id">
@ -171,7 +171,7 @@
},
methods: {
create() {
this.createVisible = true;
this.dialogWsAddVisible = true;
this.form = {};
},
submit(formName) {
@ -182,7 +182,7 @@
saveType = 'update'
}
this.$post("/workspace/" + saveType, this.form, () => {
this.createVisible = false;
this.dialogWsAddVisible = false;
this.list();
Message.success(this.$t('commons.save_success'));
});
@ -192,16 +192,8 @@
});
},
edit(row) {
this.createVisible = true;
this.dialogWsAddVisible = true;
this.form = row;
// let self = this;
// let getUser1 = this.$get("/test/user");
// let getUser2 = this.$get("/test/sleep");
// this.$all([getUser1, getUser2], function (r1, r2) {
// window.console.log(r1.data.data, r2.data.data);
// self.loading = false;
// });
},
del(row) {
this.$confirm(this.$t('workspace.delete_confirm'), '', {
@ -250,7 +242,7 @@
},
addMember() {
this.addMemberVisible = true;
this.dialogWsMemberAddVisible = true;
this.memberForm = {};
this.result = this.$get('/user/list/', response => {
this.$set(this.memberForm, "userList", response.data);
@ -262,7 +254,7 @@
cellClick(row) {
// currentRow
this.currentWorkspaceRow = row;
this.memberVisible = true;
this.dialogWsMemberVisible = true;
let param = {
name: '',
workspaceId: row.id
@ -279,16 +271,14 @@
this.$set(this.memberLineData[i], "roles", roles);
})
}
this.memberTotal = data.itemCount;
this.dialogTotal = data.itemCount;
});
},
wsMemberList() {
let row = this.currentWorkspaceRow;
this.memberVisible = true;
let param = {
name: '',
workspaceId: row.id
};
this.dialogWsMemberVisible = true;
let param = this.dialogCondition;
this.$set(param, 'workspaceId', row.id);
let path = "/user/ws/member/list";
this.result = this.$post(this.buildPagePath(path), param, res => {
let data = res.data;
@ -301,7 +291,7 @@
this.$set(this.memberLineData[i], "roles", roles);
})
}
this.memberTotal = data.itemCount;
this.dialogTotal = data.itemCount;
});
},
closeFunc() {
@ -321,7 +311,7 @@
};
this.result = this.$post("user/ws/member/add", param, () => {
this.cellClick(this.currentWorkspaceRow);
this.addMemberVisible = false;
this.dialogWsMemberAddVisible = false;
})
} else {
return false;
@ -329,7 +319,7 @@
});
},
editMember(row) {
this.updateMemberVisible = true;
this.dialogWsMemberUpdateVisible = true;
this.memberForm = row;
let roleIds = this.memberForm.roles.map(r => r.id);
this.result = this.$get('/role/list/test', response => {
@ -363,19 +353,21 @@
}
this.result = this.$post("/workspace/member/update", param, () => {
this.$success(this.$t('commons.modify_success'));
this.updateMemberVisible = false;
this.dialogWsMemberUpdateVisible = false;
this.cellClick(this.currentWorkspaceRow);
});
},
buildPagePath(path) {
return path + "/" + this.currentMemberPage + "/" + this.pageMemberSize;
return path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize;
},
},
data() {
return {
result: {},
loading: false,
createVisible: false,
dialogWsAddVisible: false,
dialogWsMemberVisible: false,
dialogWsMemberAddVisible: false,
dialogWsMemberUpdateVisible: false,
btnTips: this.$t('workspace.create'),
dialogBtnTips: this.$t('member.create'),
addTips: this.$t('member.create'),
@ -385,13 +377,9 @@
currentPage: 1,
pageSize: 5,
total: 0,
updateVisible: false,
memberVisible: false,
addMemberVisible: false,
updateMemberVisible: false,
currentMemberPage: 1,
pageMemberSize: 5,
memberTotal: 0,
dialogCurrentPage: 1,
dialogPageSize: 5,
dialogTotal: 0,
memberLineData: [],
memberForm: {},
form: {

View File

@ -3,7 +3,7 @@
<el-card>
<template v-slot:header>
<ms-table-header :condition.sync="condition" @search="search" @create="create"
<ms-table-header :condition.sync="condition" @search="initTableData" @create="create"
:create-tip="btnTips" :title="$t('commons.organization')"/>
</template>
<!-- system menu organization table-->
@ -29,9 +29,10 @@
<ms-table-pagination :change="initTableData" :current-page.sync="currentPage" :page-size.sync="pageSize"
:total="total"/>
</el-card>
<!-- dialog of organization member -->
<el-dialog :visible.sync="memberVisible" width="70%" :destroy-on-close="true" @close="closeMemberFunc">
<ms-table-header :condition.sync="dialogCondition" @create="addMember"
<el-dialog :visible.sync="dialogOrgMemberVisible" width="70%" :destroy-on-close="true" @close="closeMemberFunc">
<ms-table-header :condition.sync="dialogCondition" @create="addMember" @search="orgMemberList"
:create-tip="dialogBtnTips" :title="$t('commons.member')"/>
<!-- organization member table -->
<el-table :data="memberLineData" style="width: 100%;margin-top:5px;">
@ -54,13 +55,13 @@
</template>
</el-table-column>
</el-table>
<ms-table-pagination :change="orgMemberList" :current-page.sync="currentMemberPage"
:page-size.sync="pageMemberSize"
:total="memberTotal"/>
<ms-table-pagination :change="orgMemberList" :current-page.sync="dialogCurrentPage"
:page-size.sync="dialogPageSize"
:total="dialogTotal"/>
</el-dialog>
<!-- add organization form -->
<el-dialog :title="$t('organization.create')" :visible.sync="createVisible" width="30%" @closed="closeFunc"
<el-dialog :title="$t('organization.create')" :visible.sync="dialogOrgAddVisible" width="30%" @closed="closeFunc"
:destroy-on-close="true">
<el-form :model="form" label-position="right" label-width="100px" size="small" :rules="rule"
ref="createOrganization">
@ -80,7 +81,8 @@
</el-dialog>
<!-- update organization form -->
<el-dialog :title="$t('organization.modify')" :visible.sync="updateVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('organization.modify')" :visible.sync="dialogOrgUpdateVisible" width="30%"
:destroy-on-close="true"
@close="closeFunc">
<el-form :model="form" label-position="right" label-width="100px" size="small" :rules="rule"
ref="updateOrganizationForm">
@ -101,7 +103,8 @@
</el-dialog>
<!-- add organization member form -->
<el-dialog :title="$t('member.create')" :visible.sync="addMemberVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('member.create')" :visible.sync="dialogOrgMemberAddVisible" width="30%"
:destroy-on-close="true"
@close="closeFunc">
<el-form :model="memberForm" ref="form" :rules="orgMemberRule" label-position="right" label-width="100px"
size="small">
@ -139,7 +142,8 @@
</el-dialog>
<!-- update organization member form -->
<el-dialog :title="$t('member.modify')" :visible.sync="updateMemberVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('member.modify')" :visible.sync="dialogOrgMemberUpdateVisible" width="30%"
:destroy-on-close="true"
@close="closeFunc">
<el-form :model="memberForm" label-position="right" label-width="100px" size="small" ref="updateUserForm">
<el-form-item label="ID" prop="id">
@ -192,18 +196,18 @@
createPath: '/organization/add',
updatePath: '/organization/update',
result: {},
createVisible: false,
updateVisible: false,
memberVisible: false,
addMemberVisible: false,
updateMemberVisible: false,
dialogOrgAddVisible: false,
dialogOrgUpdateVisible: false,
dialogOrgMemberVisible: false,
dialogOrgMemberAddVisible: false,
dialogOrgMemberUpdateVisible: false,
multipleSelection: [],
currentPage: 1,
pageSize: 5,
total: 0,
currentMemberPage: 1,
pageMemberSize: 5,
memberTotal: 0,
dialogCurrentPage: 1,
dialogPageSize: 5,
dialogTotal: 0,
currentRow: {},
btnTips: this.$t('organization.create'),
dialogBtnTips: this.$t('member.create'),
@ -243,10 +247,10 @@
},
methods: {
create() {
this.createVisible = true;
this.dialogOrgAddVisible = true;
},
addMember() {
this.addMemberVisible = true;
this.dialogOrgMemberAddVisible = true;
this.memberForm = {};
this.result = this.$get('/user/list/', response => {
this.$set(this.memberForm, "userList", response.data);
@ -256,11 +260,11 @@
})
},
edit(row) {
this.updateVisible = true;
this.dialogOrgUpdateVisible = true;
this.form = row;
},
editMember(row) {
this.updateMemberVisible = true;
this.dialogOrgMemberUpdateVisible = true;
this.memberForm = row;
let roleIds = this.memberForm.roles.map(r => r.id);
this.result = this.$get('/role/list/org', response => {
@ -272,13 +276,13 @@
cellClick(row) {
// currentRow
this.currentRow = row;
this.memberVisible = true;
this.dialogOrgMemberVisible = true;
let param = {
name: '',
organizationId: row.id
};
let path = "/user/special/org/member/list";
this.result = this.$post(path + "/" + this.currentMemberPage + "/" + this.pageMemberSize, param, res => {
this.result = this.$post(path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize, param, res => {
let data = res.data;
this.memberLineData = data.listObject;
let url = "/userrole/list/org/" + row.id;
@ -288,18 +292,16 @@
this.$set(this.memberLineData[i], "roles", roles);
})
}
this.memberTotal = data.itemCount;
this.dialogTotal = data.itemCount;
});
},
orgMemberList() {
let row = this.currentRow;
this.memberVisible = true;
let param = {
name: '',
organizationId: row.id
};
this.dialogOrgMemberVisible = true;
let param = this.dialogCondition;
this.$set(param, 'organizationId', row.id);
let path = "/user/special/org/member/list";
this.result = this.$post(path + "/" + this.currentMemberPage + "/" + this.pageMemberSize, param, res => {
this.result = this.$post(path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize, param, res => {
let data = res.data;
this.memberLineData = data.listObject;
let url = "/userrole/list/org/" + row.id;
@ -309,7 +311,7 @@
this.$set(this.memberLineData[i], "roles", roles);
})
}
this.memberTotal = data.itemCount;
this.dialogTotal = data.itemCount;
});
},
del(row) {
@ -346,7 +348,7 @@
this.result = this.$post(this.createPath, this.form, () => {
this.$success(this.$t('commons.save_success'));
this.initTableData();
this.createVisible = false;
this.dialogOrgAddVisible = false;
});
} else {
return false;
@ -358,7 +360,7 @@
if (valide) {
this.result = this.$post(this.updatePath, this.form, () => {
this.$success(this.$t('commons.modify_success'))
this.updateVisible = false;
this.dialogOrgUpdateVisible = false;
this.initTableData();
});
} else {
@ -366,9 +368,6 @@
}
})
},
search() {
this.initTableData();
},
initTableData() {
this.result = this.$post(this.queryPath + "/" + this.currentPage + "/" + this.pageSize, this.condition, response => {
let data = response.data;
@ -407,7 +406,7 @@
};
this.result = this.$post("user/special/org/member/add", param, () => {
this.cellClick(this.currentRow);
this.addMemberVisible = false;
this.dialogOrgMemberAddVisible = false;
})
} else {
return false;
@ -425,7 +424,7 @@
}
this.result = this.$post("/organization/member/update", param, () => {
this.$success(this.$t('commons.modify_success'))
this.updateMemberVisible = false;
this.dialogOrgMemberUpdateVisible = false;
this.cellClick(this.currentRow);
});
},

View File

@ -28,7 +28,7 @@
</el-card>
<!-- add workspace dialog -->
<el-dialog :title="$t('workspace.create')" :visible.sync="createVisible" width="30%">
<el-dialog :title="$t('workspace.create')" :visible.sync="dialogWsAddVisible" width="30%">
<el-form :model="form" :rules="rules" ref="form" label-position="right" label-width="100px" size="small">
<el-form-item :label="$t('commons.name')" prop="name">
<el-input v-model="form.name" autocomplete="off"/>
@ -56,7 +56,7 @@
</el-dialog>
<!-- update workspace dialog -->
<el-dialog :title="$t('workspace.update')" :visible.sync="updateVisible" width="30%">
<el-dialog :title="$t('workspace.update')" :visible.sync="dialogWsUpdateVisible" width="30%">
<el-form :model="form" :rules="rules" ref="updateForm" label-position="right" label-width="100px" size="small">
<el-form-item :label="$t('commons.name')" prop="name">
<el-input v-model="form.name" autocomplete="off"/>
@ -86,8 +86,8 @@
</el-dialog>
<!-- dialog of workspace member -->
<el-dialog :visible.sync="memberVisible" width="70%" :destroy-on-close="true" @close="closeMemberFunc">
<ms-table-header :condition.sync="dialogCondition" @create="addMember"
<el-dialog :visible.sync="dialogWsMemberVisible" width="70%" :destroy-on-close="true" @close="closeMemberFunc">
<ms-table-header :condition.sync="dialogCondition" @create="addMember" @search="wsMemberList"
:create-tip="dialogBtnTips" :title="$t('commons.member')"/>
<!-- organization member table -->
<el-table :data="memberLineData" style="width: 100%;margin-top: 5px;">
@ -110,13 +110,13 @@
</template>
</el-table-column>
</el-table>
<ms-table-pagination :change="wsMemberList" :current-page.sync="currentMemberPage"
:page-size.sync="pageMemberSize"
:total="memberTotal"/>
<ms-table-pagination :change="wsMemberList" :current-page.sync="dialogCurrentPage"
:page-size.sync="dialogPageSize"
:total="dialogTotal"/>
</el-dialog>
<!-- add workspace member dialog -->
<el-dialog :title="$t('member.create')" :visible.sync="addMemberVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('member.create')" :visible.sync="dialogWsMemberAddVisible" width="30%" :destroy-on-close="true"
@close="closeFunc">
<el-form :model="memberForm" ref="form" :rules="wsMemberRule" label-position="right" label-width="100px"
size="small">
@ -153,7 +153,7 @@
</el-dialog>
<!-- update workspace member dialog -->
<el-dialog :title="$t('member.modify')" :visible.sync="updateMemberVisible" width="30%" :destroy-on-close="true"
<el-dialog :title="$t('member.modify')" :visible.sync="dialogWsMemberUpdateVisible" width="30%" :destroy-on-close="true"
@close="closeFunc">
<el-form :model="memberForm" label-position="right" label-width="100px" size="small" ref="updateUserForm">
<el-form-item label="ID" prop="id">
@ -206,7 +206,7 @@
},
methods: {
create() {
this.createVisible = true;
this.dialogWsAddVisible = true;
this.form = {};
this.$get("/organization/list", response => {
this.$set(this.form, "orgList", response.data);
@ -220,7 +220,7 @@
saveType = 'update'
}
this.result = this.$post("/workspace/" + saveType, this.form, () => {
this.createVisible = false;
this.dialogWsAddVisible = false;
this.list();
Message.success(this.$t('commons.save_success'));
});
@ -230,7 +230,7 @@
});
},
addMember() {
this.addMemberVisible = true;
this.dialogWsMemberAddVisible = true;
this.memberForm = {};
this.result = this.$get('/user/list/', response => {
this.$set(this.memberForm, "userList", response.data);
@ -242,13 +242,13 @@
cellClick(row) {
// currentRow
this.currentWorkspaceRow = row;
this.memberVisible = true;
this.dialogWsMemberVisible = true;
let param = {
name: '',
workspaceId: row.id
};
let path = "/user/special/ws/member/list";
this.result = this.$post(this.buildPagePath(path), param, res => {
this.result = this.$post(path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize, param, res => {
let data = res.data;
this.memberLineData = data.listObject;
let url = "/userrole/list/ws/" + row.id;
@ -259,18 +259,16 @@
this.$set(this.memberLineData[i], "roles", roles);
})
}
this.memberTotal = data.itemCount;
this.dialogTotal = data.itemCount;
});
},
wsMemberList() {
let row = this.currentWorkspaceRow;
this.memberVisible = true;
let param = {
name: '',
workspaceId: row.id
};
this.dialogWsMemberVisible = true;
let param = this.dialogCondition;
this.$set(param, 'workspaceId', row.id);
let path = "/user/special/ws/member/list";
this.result = this.$post(this.buildPagePath(path), param, res => {
this.result = this.$post(path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize, param, res => {
let data = res.data;
this.memberLineData = data.listObject;
let url = "/userrole/list/ws/" + row.id;
@ -281,11 +279,11 @@
this.$set(this.memberLineData[i], "roles", roles);
})
}
this.memberTotal = data.itemCount;
this.dialogTotal = data.itemCount;
});
},
edit(row) {
this.updateVisible = true;
this.dialogWsUpdateVisible = true;
// copy user
this.form = Object.assign({}, row);
this.$get("/organization/list", response => {
@ -297,7 +295,7 @@
if (valide) {
this.result = this.$post("/workspace/special/update", this.form, () => {
this.$success(this.$t('commons.modify_success'));
this.updateVisible = false;
this.dialogWsUpdateVisible = false;
this.list();
});
} else {
@ -348,9 +346,6 @@
this.total = data.itemCount;
});
},
buildPagePath(path) {
return path + "/" + this.currentMemberPage + "/" + this.pageMemberSize;
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
@ -361,7 +356,7 @@
};
this.result = this.$post("user/special/ws/member/add", param, () => {
this.cellClick(this.currentWorkspaceRow);
this.addMemberVisible = false;
this.dialogWsMemberAddVisible = false;
})
} else {
return false;
@ -369,7 +364,7 @@
});
},
editMember(row) {
this.updateMemberVisible = true;
this.dialogWsMemberUpdateVisible = true;
this.memberForm = row;
let roleIds = this.memberForm.roles.map(r => r.id);
this.result = this.$get('/role/list/test', response => {
@ -403,7 +398,7 @@
}
this.result = this.$post("/workspace/member/update", param, () => {
this.$success(this.$t('commons.modify_success'));
this.updateMemberVisible = false;
this.dialogWsMemberUpdateVisible = false;
this.cellClick(this.currentWorkspaceRow);
});
},
@ -411,11 +406,11 @@
data() {
return {
result: {},
createVisible: false,
updateVisible: false,
memberVisible: false,
addMemberVisible: false,
updateMemberVisible: false,
dialogWsAddVisible: false,
dialogWsUpdateVisible: false,
dialogWsMemberVisible: false,
dialogWsMemberAddVisible: false,
dialogWsMemberUpdateVisible: false,
btnTips: this.$t('workspace.create'),
dialogBtnTips: this.$t('member.create'),
addTips: this.$t('member.create'),
@ -425,9 +420,9 @@
currentPage: 1,
pageSize: 5,
total: 0,
currentMemberPage: 1,
pageMemberSize: 5,
memberTotal: 0,
dialogCurrentPage: 1,
dialogPageSize: 5,
dialogTotal: 0,
memberLineData: [],
memberForm: {},
form: {