Merge remote-tracking branch 'origin/master' into master
This commit is contained in:
commit
0e23dbd564
|
@ -497,6 +497,15 @@
|
||||||
<outputDirectory>src/main/resources/jmeter/lib/ext</outputDirectory>
|
<outputDirectory>src/main/resources/jmeter/lib/ext</outputDirectory>
|
||||||
<destFileName>ApacheJMeter_functions.jar</destFileName>
|
<destFileName>ApacheJMeter_functions.jar</destFileName>
|
||||||
</artifactItem>
|
</artifactItem>
|
||||||
|
<artifactItem>
|
||||||
|
<groupId>org.python</groupId>
|
||||||
|
<artifactId>jython-standalone</artifactId>
|
||||||
|
<version>2.7.0</version>
|
||||||
|
<type>jar</type>
|
||||||
|
<overWrite>true</overWrite>
|
||||||
|
<outputDirectory>src/main/resources/jmeter/lib/ext</outputDirectory>
|
||||||
|
<destFileName>jython-standalone.jar</destFileName>
|
||||||
|
</artifactItem>
|
||||||
</artifactItems>
|
</artifactItems>
|
||||||
<outputDirectory>${project.build.directory}/wars</outputDirectory>
|
<outputDirectory>${project.build.directory}/wars</outputDirectory>
|
||||||
<overWriteReleases>false</overWriteReleases>
|
<overWriteReleases>false</overWriteReleases>
|
||||||
|
|
|
@ -11,7 +11,7 @@ import org.apache.jmeter.save.SaveService;
|
||||||
import org.apache.jmeter.util.JMeterUtils;
|
import org.apache.jmeter.util.JMeterUtils;
|
||||||
import org.apache.jmeter.visualizers.backend.BackendListener;
|
import org.apache.jmeter.visualizers.backend.BackendListener;
|
||||||
import org.apache.jorphan.collections.HashTree;
|
import org.apache.jorphan.collections.HashTree;
|
||||||
import org.python.core.Options;
|
|
||||||
import org.springframework.context.i18n.LocaleContextHolder;
|
import org.springframework.context.i18n.LocaleContextHolder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@ -34,10 +34,6 @@ public class JMeterService {
|
||||||
JMeterUtils.setJMeterHome(JMETER_HOME);
|
JMeterUtils.setJMeterHome(JMETER_HOME);
|
||||||
JMeterUtils.setLocale(LocaleContextHolder.getLocale());
|
JMeterUtils.setLocale(LocaleContextHolder.getLocale());
|
||||||
|
|
||||||
|
|
||||||
//解决无法加载 PyScriptEngineFactory
|
|
||||||
Options.importSite = false;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Object scriptWrapper = SaveService.loadElement(is);
|
Object scriptWrapper = SaveService.loadElement(is);
|
||||||
HashTree testPlan = getHashTree(scriptWrapper);
|
HashTree testPlan = getHashTree(scriptWrapper);
|
||||||
|
@ -51,7 +47,7 @@ public class JMeterService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getJmeterHome() {
|
public String getJmeterHome() {
|
||||||
String home = getClass().getResource("/").getPath() + "jmeter";
|
String home = getClass().getResource("/").getPath() + "jmeter";
|
||||||
try {
|
try {
|
||||||
File file = new File(home);
|
File file = new File(home);
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
package io.metersphere.listener;
|
package io.metersphere.listener;
|
||||||
|
|
||||||
|
import io.metersphere.api.jmeter.JMeterService;
|
||||||
|
import io.metersphere.commons.utils.LogUtil;
|
||||||
import io.metersphere.service.ScheduleService;
|
import io.metersphere.service.ScheduleService;
|
||||||
|
import org.python.core.Options;
|
||||||
|
import org.python.util.PythonInterpreter;
|
||||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||||
import org.springframework.context.ApplicationListener;
|
import org.springframework.context.ApplicationListener;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -12,12 +16,16 @@ public class AppStartListener implements ApplicationListener<ApplicationReadyEve
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ScheduleService scheduleService;
|
private ScheduleService scheduleService;
|
||||||
|
@Resource
|
||||||
|
private JMeterService jMeterService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
|
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
|
||||||
|
|
||||||
System.out.println("================= 应用启动 =================");
|
System.out.println("================= 应用启动 =================");
|
||||||
|
|
||||||
|
initPythonEnv();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(3 * 60 * 1000);
|
Thread.sleep(3 * 60 * 1000);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
|
@ -25,6 +33,24 @@ public class AppStartListener implements ApplicationListener<ApplicationReadyEve
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduleService.startEnableSchedules();
|
scheduleService.startEnableSchedules();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解决接口测试-无法导入内置python包
|
||||||
|
*/
|
||||||
|
private void initPythonEnv() {
|
||||||
|
//解决无法加载 PyScriptEngineFactory
|
||||||
|
Options.importSite = false;
|
||||||
|
try {
|
||||||
|
PythonInterpreter interp = new PythonInterpreter();
|
||||||
|
String path = jMeterService.getJmeterHome();
|
||||||
|
System.out.println("sys.path: " + path);
|
||||||
|
path += "/lib/ext/jython-standalone.jar/Lib";
|
||||||
|
interp.exec("import sys");
|
||||||
|
interp.exec("sys.path.append(\"" + path + "\")");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
LogUtil.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<el-input :disabled="isReadOnly" class="test-name" v-model="test.name" maxlength="60"
|
<el-input :disabled="isReadOnly" class="test-name" v-model="test.name" maxlength="60"
|
||||||
:placeholder="$t('api_test.input_name')"
|
:placeholder="$t('api_test.input_name')"
|
||||||
show-word-limit>
|
show-word-limit>
|
||||||
<el-select :disabled="isReadOnly" class="test-project" v-model="test.projectId" slot="prepend"
|
<el-select filterable class="test-project" v-model="test.projectId" slot="prepend"
|
||||||
:placeholder="$t('api_test.select_project')">
|
:placeholder="$t('api_test.select_project')">
|
||||||
<el-option v-for="project in projects" :key="project.id" :label="project.name" :value="project.id"/>
|
<el-option v-for="project in projects" :key="project.id" :label="project.name" :value="project.id"/>
|
||||||
</el-select>
|
</el-select>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
maxlength="30" show-word-limit
|
maxlength="30" show-word-limit
|
||||||
>
|
>
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
<el-select :disabled="isReadOnly" v-model="testPlan.projectId"
|
<el-select filterable v-model="testPlan.projectId"
|
||||||
:placeholder="$t('load_test.select_project')">
|
:placeholder="$t('load_test.select_project')">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in projects"
|
v-for="item in projects"
|
||||||
|
|
|
@ -101,7 +101,7 @@
|
||||||
<el-form :model="memberForm" ref="form" :rules="orgMemberRule" label-position="right" label-width="100px"
|
<el-form :model="memberForm" ref="form" :rules="orgMemberRule" label-position="right" label-width="100px"
|
||||||
size="small">
|
size="small">
|
||||||
<el-form-item :label="$t('commons.member')" prop="userIds">
|
<el-form-item :label="$t('commons.member')" prop="userIds">
|
||||||
<el-select v-model="memberForm.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
<el-select filterable v-model="memberForm.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in memberForm.userList"
|
v-for="item in memberForm.userList"
|
||||||
|
@ -114,7 +114,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
||||||
<el-select v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
<el-select filterable v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in memberForm.roles"
|
v-for="item in memberForm.roles"
|
||||||
|
@ -151,7 +151,7 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.role')" prop="roleIds"
|
<el-form-item :label="$t('commons.role')" prop="roleIds"
|
||||||
:rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}">
|
:rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}">
|
||||||
<el-select v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
<el-select filterable v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in memberForm.allroles"
|
v-for="item in memberForm.allroles"
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<el-input type="textarea" v-model="form.description"></el-input>
|
<el-input type="textarea" v-model="form.description"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('workspace.organization_name')" prop="organizationId">
|
<el-form-item :label="$t('workspace.organization_name')" prop="organizationId">
|
||||||
<el-select v-model="form.organizationId" :placeholder="$t('organization.select_organization')"
|
<el-select filterable v-model="form.organizationId" :placeholder="$t('organization.select_organization')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.orgList"
|
v-for="item in form.orgList"
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
<el-input type="textarea" v-model="form.description"></el-input>
|
<el-input type="textarea" v-model="form.description"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('workspace.organization_name')" prop="organizationId">
|
<el-form-item :label="$t('workspace.organization_name')" prop="organizationId">
|
||||||
<el-select v-model="form.organizationId" :placeholder="$t('organization.select_organization')"
|
<el-select filterable v-model="form.organizationId" :placeholder="$t('organization.select_organization')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.orgList1"
|
v-for="item in form.orgList1"
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
<el-form :model="memberForm" ref="form" :rules="wsMemberRule" label-position="right" label-width="100px"
|
<el-form :model="memberForm" ref="form" :rules="wsMemberRule" label-position="right" label-width="100px"
|
||||||
size="small">
|
size="small">
|
||||||
<el-form-item :label="$t('commons.member')" prop="userIds">
|
<el-form-item :label="$t('commons.member')" prop="userIds">
|
||||||
<el-select v-model="memberForm.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
<el-select filterable v-model="memberForm.userIds" multiple :placeholder="$t('member.please_choose_member')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in memberForm.userList"
|
v-for="item in memberForm.userList"
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
<el-form-item :label="$t('commons.role')" prop="roleIds">
|
||||||
<el-select v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
<el-select filterable v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in memberForm.roles"
|
v-for="item in memberForm.roles"
|
||||||
|
@ -166,7 +166,7 @@
|
||||||
<el-input v-model="memberForm.phone" autocomplete="off" :disabled="true"/>
|
<el-input v-model="memberForm.phone" autocomplete="off" :disabled="true"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.role')" prop="roleIds" :rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}">
|
<el-form-item :label="$t('commons.role')" prop="roleIds" :rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}">
|
||||||
<el-select v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
<el-select filterable v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
|
||||||
class="select-width">
|
class="select-width">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in memberForm.allroles"
|
v-for="item in memberForm.allroles"
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
:prop="'roles.' + index + '.id'"
|
:prop="'roles.' + index + '.id'"
|
||||||
:rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
|
:rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.id" :placeholder="$t('role.please_choose_role')">
|
<el-select filterable v-model="role.id" :placeholder="$t('role.please_choose_role')">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in activeRole(role)"
|
v-for="item in activeRole(role)"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -93,7 +93,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('organization.select_organization'), trigger: 'change'}"
|
:rules="{required: true, message: $t('organization.select_organization'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('organization.select_organization')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('organization.select_organization')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.orgList"
|
v-for="item in form.orgList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -108,7 +108,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.wsList"
|
v-for="item in form.wsList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -123,7 +123,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.wsList"
|
v-for="item in form.wsList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -138,7 +138,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.wsList"
|
v-for="item in form.wsList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -187,7 +187,7 @@
|
||||||
:prop="'roles.' + index + '.id'"
|
:prop="'roles.' + index + '.id'"
|
||||||
:rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
|
:rules="{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.id" :placeholder="$t('role.please_choose_role')" :disabled="!!role.id">
|
<el-select filterable v-model="role.id" :placeholder="$t('role.please_choose_role')" :disabled="!!role.id">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in activeRole(role)"
|
v-for="item in activeRole(role)"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -204,7 +204,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('organization.select_organization'), trigger: 'change'}"
|
:rules="{required: true, message: $t('organization.select_organization'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('organization.select_organization')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('organization.select_organization')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.orgList"
|
v-for="item in form.orgList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -219,7 +219,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.wsList"
|
v-for="item in form.wsList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -234,7 +234,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.wsList"
|
v-for="item in form.wsList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -249,7 +249,7 @@
|
||||||
:prop="'roles.' + index + '.ids'"
|
:prop="'roles.' + index + '.ids'"
|
||||||
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
:rules="{required: true, message: $t('workspace.select'), trigger: 'change'}"
|
||||||
>
|
>
|
||||||
<el-select v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
<el-select filterable v-model="role.ids" :placeholder="$t('workspace.select')" multiple>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in form.wsList"
|
v-for="item in form.wsList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
|
|
@ -1,26 +1,12 @@
|
||||||
<template>
|
<template>
|
||||||
<el-menu :unique-opened="true" mode="horizontal" active-text-color="write"
|
<div>
|
||||||
class="project_menu">
|
|
||||||
<el-submenu index="1" popper-class="submenu">
|
|
||||||
<template v-slot:title>
|
|
||||||
<span class="menu-title">{{'[' + title + ']'}}</span>
|
<span class="menu-title">{{'[' + title + ']'}}</span>
|
||||||
<span> {{currentData == null ? '' : currentData.name}} </span>
|
<el-select filterable slot="prepend" v-model="value" @change="changeData" class="project_menu"
|
||||||
</template>
|
size="small">
|
||||||
<template v-slot:default>
|
<el-option v-for="(item,index) in data" :key="index" :label="item.name" :value="index"/>
|
||||||
<div style="height:400px;">
|
</el-select>
|
||||||
<el-scrollbar style="height:100%">
|
|
||||||
<label v-for="(item,index) in data" :key="index">
|
|
||||||
<el-menu-item @click="changeData(item)">
|
|
||||||
{{item.name}}
|
|
||||||
<i class="el-icon-check" v-if="currentData && item.id === currentData.id"></i>
|
|
||||||
</el-menu-item>
|
|
||||||
</label>
|
|
||||||
</el-scrollbar>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-submenu>
|
|
||||||
</el-menu>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
|
@ -36,18 +22,35 @@
|
||||||
type: String
|
type: String
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
value: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
currentData(data) {
|
||||||
|
if (data != undefined && data != null) {
|
||||||
|
this.value = data.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
changeData(data) {
|
changeData(index) {
|
||||||
this.$emit("dataChange", data);
|
this.$emit("dataChange", this.data[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
.project_menu {
|
||||||
|
width: 214px;
|
||||||
|
}
|
||||||
|
|
||||||
.menu-title {
|
.menu-title {
|
||||||
color: darkgrey;
|
color: darkgrey;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -180,6 +180,7 @@
|
||||||
:disabled="isReadOnly"
|
:disabled="isReadOnly"
|
||||||
v-model="scope.row.executeResult"
|
v-model="scope.row.executeResult"
|
||||||
@change="stepResultChange()"
|
@change="stepResultChange()"
|
||||||
|
filterable
|
||||||
size="mini">
|
size="mini">
|
||||||
<el-option :label="$t('test_track.plan_view.pass')" value="Pass"
|
<el-option :label="$t('test_track.plan_view.pass')" value="Pass"
|
||||||
style="color: #7ebf50;"></el-option>
|
style="color: #7ebf50;"></el-option>
|
||||||
|
@ -227,6 +228,7 @@
|
||||||
{{ $t('test_track.issue.please_choose_current_owner') }}
|
{{ $t('test_track.issue.please_choose_current_owner') }}
|
||||||
<el-select v-model="testCase.tapdUsers"
|
<el-select v-model="testCase.tapdUsers"
|
||||||
multiple
|
multiple
|
||||||
|
filterable
|
||||||
style="width: 20%"
|
style="width: 20%"
|
||||||
:placeholder="$t('test_track.issue.please_choose_current_owner')"
|
:placeholder="$t('test_track.issue.please_choose_current_owner')"
|
||||||
collapse-tags>
|
collapse-tags>
|
||||||
|
|
|
@ -61,7 +61,7 @@ export default {
|
||||||
window.console.error(error.response || error.message);
|
window.console.error(error.response || error.message);
|
||||||
if (error.response && error.response.data) {
|
if (error.response && error.response.data) {
|
||||||
if (error.response.headers["authentication-status"] !== "invalid") {
|
if (error.response.headers["authentication-status"] !== "invalid") {
|
||||||
Message.error({message: error.response.data.message, showClose: true});
|
Message.error({message: error.response.data.message || error.response.data, showClose: true});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Message.error({message: error.message, showClose: true});
|
Message.error({message: error.message, showClose: true});
|
||||||
|
|
Loading…
Reference in New Issue