refactor: 删除旧版api的页面

This commit is contained in:
Captain.B 2021-10-11 14:58:48 +08:00 committed by 刘瑞斌
parent 2035a17857
commit 607a8bc8ea
15 changed files with 8 additions and 1476 deletions

View File

@ -5,47 +5,20 @@
<el-col :span="14"> <el-col :span="14">
<el-menu class="header-menu" :unique-opened="true" mode="horizontal" router :default-active='$route.path'> <el-menu class="header-menu" :unique-opened="true" mode="horizontal" router :default-active='$route.path'>
<el-menu-item v-show="isNewVersion" :index="'/api/home'"> <el-menu-item :index="'/api/home'">
{{ $t("i18n.home") }} {{ $t("i18n.home") }}
</el-menu-item> </el-menu-item>
<el-menu-item v-show="isOldVersion" :index="'/api/home_obsolete'"> <el-menu-item :index="'/api/definition'" v-permission="['PROJECT_API_DEFINITION:READ']">
{{ $t("i18n.home") }}
</el-menu-item>
<el-menu-item v-show="isNewVersion" :index="'/api/definition'" v-permission="['PROJECT_API_DEFINITION:READ']">
{{ $t("i18n.definition") }} {{ $t("i18n.definition") }}
</el-menu-item> </el-menu-item>
<el-menu-item v-show="isNewVersion" :index="'/api/automation'" v-permission="['PROJECT_API_SCENARIO:READ']"> <el-menu-item :index="'/api/automation'" v-permission="['PROJECT_API_SCENARIO:READ']">
{{ $t("i18n.automation") }} {{ $t("i18n.automation") }}
</el-menu-item> </el-menu-item>
<el-menu-item v-show="isNewVersion" :index="'/api/automation/report'" <el-menu-item :index="'/api/automation/report'" v-permission="['PROJECT_API_REPORT:READ']">
v-permission="['PROJECT_API_REPORT:READ']">
{{ $t("i18n.report") }} {{ $t("i18n.report") }}
</el-menu-item> </el-menu-item>
<el-submenu v-show="isOldVersion" index="4">
<template v-slot:title>{{ $t('commons.test') }}</template>
<ms-recent-list ref="testRecent" :options="testRecent"/>
<el-divider class="menu-divider"/>
<ms-show-all :index="'/api/test/list/all'"/>
<el-menu-item :index="apiTestProjectPath" class="blank_item"></el-menu-item>
<ms-create-button :index="'/api/test/create'"
:title="$t('load_test.create')"/>
</el-submenu>
<el-submenu v-show="isOldVersion" index="5">
<template v-slot:title>{{ $t('commons.report') }}</template>
<ms-recent-list ref="reportRecent" :options="reportRecent"/>
<el-divider class="menu-divider"/>
<ms-show-all :index="'/api/report/list/all'"/>
</el-submenu>
<el-menu-item v-show="isOldVersion" :index="'/api/monitor/view'">
{{ $t('commons.monitor') }}
</el-menu-item>
</el-menu> </el-menu>
</el-col> </el-col>
</el-row> </el-row>
@ -92,12 +65,6 @@ export default {
currentProject: '' currentProject: ''
}; };
}, },
computed: {
...mapGetters([
'isNewVersion',
'isOldVersion',
])
},
methods: { methods: {
reload() { reload() {
this.isRouterAlive = false; this.isRouterAlive = false;

View File

@ -1,77 +0,0 @@
<template>
<el-card class="table-card" v-loading="result.loading">
<template v-slot:header>
<span class="title">{{$t('api_report.title')}}</span>
</template>
<el-table border :data="tableData" class="adjust-table table-content" @row-click="link" height="300px">
<el-table-column prop="name" :label="$t('commons.name')" width="150" show-overflow-tooltip/>
<el-table-column width="250" :label="$t('commons.create_time')">
<template v-slot:default="scope">
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column width="250" :label="$t('commons.update_time')">
<template v-slot:default="scope">
<span>{{ scope.row.updateTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column prop="triggerMode" width="150" :label="'触发方式'">
<template v-slot:default="scope">
<report-trigger-mode-item :trigger-mode="scope.row.triggerMode"/>
</template>
</el-table-column>
<el-table-column prop="status" :label="$t('commons.status')">
<template v-slot:default="{row}">
<ms-api-report-status :row="row"/>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<script>
import MsApiReportStatus from "../report/ApiReportStatus";
import ReportTriggerModeItem from "../../common/tableItem/ReportTriggerModeItem";
export default {
name: "MsApiReportRecentList",
components: {ReportTriggerModeItem, MsApiReportStatus},
data() {
return {
result: {},
tableData: [],
loading: false
}
},
methods: {
search() {
this.result = this.$get("/api/report/recent/5", response => {
this.tableData = response.data;
});
},
link(row) {
this.$router.push({
path: '/api/report/view/' + row.id,
})
}
},
created() {
this.search();
},
activated() {
this.search();
}
}
</script>
<style scoped>
.el-table {
cursor:pointer;
}
</style>

View File

@ -1,72 +0,0 @@
<template>
<ms-container>
<ms-main-container v-loading="result.loading">
<el-row :gutter="20">
<el-col :span="12">
<ms-api-test-recent-list/>
</el-col>
<el-col :span="12">
<ms-api-report-recent-list/>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<ms-test-heatmap :values="values"/>
</el-col>
<el-col :span="12">
<ms-schedule-list :group="'API_TEST'"/>
</el-col>
</el-row>
</ms-main-container>
</ms-container>
</template>
<script>
import MsContainer from "../../common/components/MsContainer";
import MsMainContainer from "../../common/components/MsMainContainer";
import MsApiTestRecentList from "./ApiTestRecentList";
import MsApiReportRecentList from "./ApiReportRecentList";
import MsTestHeatmap from "../../common/components/MsTestHeatmap";
import MsScheduleList from "./ScheduleList";
export default {
name: "ApiTestHome",
components: {
MsScheduleList,
MsTestHeatmap, MsApiReportRecentList, MsApiTestRecentList, MsMainContainer, MsContainer
},
data() {
return {
values: [],
result: {},
}
},
activated() {
this.getValues();
},
mounted() {
this.getValues();
},
methods: {
getValues() {
this.result = this.$get('/api/report/dashboard/tests', response => {
this.values = response.data;
});
}
}
}
</script>
<style scoped>
.el-row {
margin-bottom: 20px;
}
.el-row:last-child {
margin-bottom: 0;
}
</style>

View File

@ -1,72 +0,0 @@
<template>
<el-card class="table-card" v-loading="result.loading">
<template v-slot:header>
<span class="title">{{$t('commons.test')}}</span>
</template>
<el-table border :data="tableData" class="adjust-table table-content" @row-click="link" height="300px">
<el-table-column prop="name" :label="$t('commons.name')" width="150" show-overflow-tooltip/>
<el-table-column prop="projectName" :label="$t('load_test.project_name')" width="150" show-overflow-tooltip/>
<el-table-column width="250" :label="$t('commons.create_time')">
<template v-slot:default="scope">
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column width="250" :label="$t('commons.update_time')">
<template v-slot:default="scope">
<span>{{ scope.row.updateTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column prop="status" :label="$t('commons.status')">
<template v-slot:default="{row}">
<ms-api-test-status :row="row"/>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<script>
import MsApiTestStatus from "../test/ApiTestStatus";
export default {
name: "MsApiTestRecentList",
components: {MsApiTestStatus},
data() {
return {
result: {},
tableData: [],
loading: false
}
},
methods: {
search() {
this.result = this.$get("/api/recent/5", response => {
this.tableData = response.data;
});
},
link(row) {
this.$router.push({
path: '/api/test/edit?id=' + row.id,
})
}
},
created() {
this.search();
},
activated() {
this.search();
}
}
</script>
<style scoped>
.el-table {
cursor: pointer;
}
</style>

View File

@ -1,5 +1,3 @@
import MsProject from "@/business/components/settings/workspace/MsProject";
export default { export default {
path: "/api", path: "/api",
name: "api", name: "api",
@ -13,22 +11,6 @@ export default {
name: 'fucHome', name: 'fucHome',
component: () => import('@/business/components/api/homepage/ApiTestHomePage'), component: () => import('@/business/components/api/homepage/ApiTestHomePage'),
}, },
{
path: 'home_obsolete',
name: 'fucHome',
component: () => import('@/business/components/api/home/ApiTestHome'),
},
{
path: "test/:type",
name: "ApiTestConfig",
component: () => import('@/business/components/api/test/ApiTestConfig'),
props: (route) => ({id: route.query.id})
},
{
path: "test/list/:projectId",
name: "ApiTestList",
component: () => import('@/business/components/api/test/ApiTestList'),
},
// { // {
// path: "project/:type", // path: "project/:type",
// name: "fucProject", // name: "fucProject",
@ -50,8 +32,8 @@ export default {
component: () => import('@/business/components/api/automation/report/ApiReportList'), component: () => import('@/business/components/api/automation/report/ApiReportList'),
}, },
{ {
path:"automation/report/view/:reportId", path: "automation/report/view/:reportId",
name:"ApiReportView", name: "ApiReportView",
component: () => import('@/business/components/api/automation/report/ApiReportView'), component: () => import('@/business/components/api/automation/report/ApiReportView'),
}, },
@ -71,4 +53,4 @@ export default {
component: () => import('@/business/components/api/monitor/ApiMonitor'), component: () => import('@/business/components/api/monitor/ApiMonitor'),
}, },
] ]
} };

View File

@ -1,79 +0,0 @@
<template>
<el-dialog :title="$t('api_report.title')" :visible.sync="reportVisible">
<el-table border class="adjust-table" :data="tableData" v-loading="result.loading">
<el-table-column :label="$t('commons.name')" width="150" show-overflow-tooltip>
<template v-slot:default="scope">
<el-link type="info" @click="link(scope.row)">{{ scope.row.name }}</el-link>
</template>
</el-table-column>
<el-table-column width="250" :label="$t('commons.create_time')">
<template v-slot:default="scope">
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column width="250" :label="$t('commons.update_time')">
<template v-slot:default="scope">
<span>{{ scope.row.updateTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column prop="status" :label="$t('commons.status')">
<template v-slot:default="{row}">
<ms-api-report-status :row="row"/>
</template>
</el-table-column>
</el-table>
<ms-table-pagination :change="search" :current-page.sync="currentPage" :page-size.sync="pageSize"
:total="total"/>
</el-dialog>
</template>
<script>
import MsApiReportStatus from "../report/ApiReportStatus";
import MsTablePagination from "@/business/components/common/pagination/TablePagination";
export default {
name: "MsApiReportDialog",
components: {MsApiReportStatus, MsTablePagination},
props: ["testId"],
data() {
return {
reportVisible: false,
result: {},
tableData: [],
loading: false,
currentPage: 1,
pageSize: 10,
total: 0,
}
},
methods: {
open() {
this.reportVisible = true;
this.search();
},
link(row) {
this.reportVisible = false;
this.$router.push({
path: '/api/report/view/' + row.id,
})
},
search() {
let url = "/api/report/list/" + this.testId + "/" + this.currentPage + "/" + this.pageSize;
this.result = this.$get(url, response => {
let data = response.data;
this.total = data.itemCount;
this.tableData = data.listObject;
});
},
},
}
</script>
<style scoped>
</style>

View File

@ -1,423 +0,0 @@
<template>
<ms-container>
<ms-main-container>
<el-card>
<el-container class="test-container" v-loading="result.loading">
<el-header>
<el-row>
<el-input :disabled="isReadOnly" class="test-name" v-model="test.name" maxlength="60"
:placeholder="$t('api_test.input_name')"
show-word-limit>
<template slot="prepend">测试名称</template>
</el-input>
<el-tooltip :content="'Ctrl + S'"
placement="top"
:enterable="false">
<el-button type="primary" plain :disabled="isReadOnly" @click="saveTest">
{{ $t('commons.save') }}
</el-button>
</el-tooltip>
<el-button type="primary" plain :disabled="isReadOnly"
@click="saveRunTest">
{{ $t('load_test.save_and_run') }}
</el-button>
<!-- <el-button :disabled="isReadOnly" type="primary" plain v-if="isShowRun" @click="runTest">-->
<!-- {{$t('api_test.run')}}-->
<!-- </el-button>-->
<el-button :disabled="isReadOnly" type="warning" plain @click="cancel">{{ $t('commons.cancel') }}
</el-button>
<el-dropdown trigger="click" @command="handleCommand">
<el-button class="el-dropdown-link more" icon="el-icon-more" plain/>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="report">
{{ $t('api_report.title') }}
</el-dropdown-item>
<el-dropdown-item command="jar" :disabled="isReadOnly">
{{ $t('api_test.jar_config.title') }}
</el-dropdown-item>
<el-dropdown-item command="performance" :disabled="create || isReadOnly">
{{ $t('api_test.create_performance_test') }}
</el-dropdown-item>
<el-dropdown-item command="export" :disabled="isReadOnly || create">
{{ $t('api_test.export_config') }}
</el-dropdown-item>
<el-dropdown-item command="import" :disabled="isReadOnly">
{{ $t('api_test.api_import.label') }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<api-import ref="apiImport"/>
<ms-api-report-dialog :test-id="id" ref="reportDialog"/>
<ms-schedule-config :schedule="test.schedule" :is-read-only="isReadOnly" :save="saveCronExpression"
@scheduleChange="saveSchedule" :test-id="id" :check-open="checkScheduleEdit"/>
<ms-jar-config :is-read-only="isReadOnly" ref="jarConfig"/>
</el-row>
</el-header>
<ms-api-scenario-config :debug-report-id="debugReportId" @runDebug="runDebug" :is-read-only="isReadOnly"
:test="test" :scenarios="test.scenarioDefinition" :project-id="test.projectId"
ref="config"/>
</el-container>
</el-card>
</ms-main-container>
</ms-container>
</template>
<script>
import MsApiScenarioConfig from "./components/ApiScenarioConfig";
import {Scenario, Test} from "./model/ScenarioModel"
import MsApiReportStatus from "../report/ApiReportStatus";
import MsApiReportDialog from "./ApiReportDialog";
import {downloadFile, getCurrentProjectID, getCurrentWorkspaceId, getUUID} from "@/common/js/utils";
import MsScheduleConfig from "../../common/components/MsScheduleConfig";
import ApiImport from "./components/import/ApiImport";
import MsContainer from "@/business/components/common/components/MsContainer";
import MsMainContainer from "@/business/components/common/components/MsMainContainer";
import MsJarConfig from "./components/jar/JarConfig";
export default {
name: "MsApiTestConfig",
components: {
MsJarConfig,
MsMainContainer,
MsContainer, ApiImport, MsScheduleConfig, MsApiReportDialog, MsApiReportStatus, MsApiScenarioConfig
},
props: ["id"],
data() {
return {
reportVisible: false,
create: false,
result: {},
projects: [],
change: false,
test: new Test(),
isReadOnly: false,
debugReportId: ''
}
},
watch: {
'$route': 'init',
test: {
handler: function () {
this.change = true;
},
deep: true
}
},
methods: {
init() {
this.isReadOnly = false;
if (this.id) {
this.create = false;
this.getTest(this.id);
} else {
this.create = true;
this.test = new Test();
if (this.$refs.config) {
this.$refs.config.reset();
}
}
this.test.projectId = getCurrentProjectID();
},
updateReference() {
let updateIds = [];
this.test.scenarioDefinition.forEach(scenario => {
if (scenario.isReference()) {
updateIds.push(scenario.id.split("#")[0]);
}
})
if (updateIds.length === 0) return;
//
this.result = this.$post("/api/list/ids", {ids: updateIds}, response => {
let scenarioMap = {};
if (response.data) {
response.data.forEach(test => {
JSON.parse(test.scenarioDefinition).forEach(options => {
let referenceId = test.id + "#" + options.id;
scenarioMap[referenceId] = new Scenario(options);
scenarioMap[referenceId].id = referenceId;
})
})
}
let scenarios = [];
this.test.scenarioDefinition.forEach(scenario => {
if (scenario.isReference()) {
if (scenarioMap[scenario.id]) {
let item = scenarioMap[scenario.id];
item.referenceEnable = scenario.referenceEnable;
scenarios.push(item);
}
} else {
scenarios.push(scenario);
}
})
this.test.scenarioDefinition = scenarios;
})
},
getTest(id) {
this.result = this.$get("/api/get/" + id, response => {
if (response.data) {
let item = response.data;
this.test = new Test({
id: item.id,
projectId: item.projectId,
name: item.name,
status: item.status,
scenarioDefinition: JSON.parse(item.scenarioDefinition),
schedule: item.schedule ? item.schedule : {},
});
this.updateReference();
this.$refs.config.reset();
}
});
},
save(callback) {
let validator = this.test.isValid();
if (!validator.isValid) {
this.$warning(this.$t(validator.info));
return;
}
this.change = false;
let bodyFiles = this.getBodyUploadFiles();
let url = this.create ? "/api/create" : "/api/update";
let jmx = this.test.toJMX();
let blob = new Blob([jmx.xml], {type: "application/octet-stream"});
let file = new File([blob], jmx.name);
this.result = this.$fileUpload(url, file, bodyFiles, this.test, () => {
if (callback) callback();
this.create = false;
this.resetBodyFile();
});
},
saveTest() {
this.save(() => {
this.$success(this.$t('commons.save_success'));
if (this.create) {
this.$router.push({
path: '/api/test/edit?id=' + this.test.id
})
}
})
},
runTest() {
this.result = this.$post("/api/run", {id: this.test.id, triggerMode: 'MANUAL'}, (response) => {
this.$success(this.$t('api_test.running'));
this.$router.push({
path: '/api/report/view/' + response.data
})
});
},
saveRunTest() {
this.change = false;
if (!this.validateEnableTest()) {
this.$warning(this.$t('api_test.enable_validate_tip'));
return;
}
this.save(() => {
this.$success(this.$t('commons.save_success'));
this.runTest();
})
},
getBodyUploadFiles() {
let bodyUploadFiles = [];
this.test.bodyUploadIds = [];
this.test.scenarioDefinition.forEach(scenario => {
scenario.requests.forEach(request => {
if (request.body) {
request.body.kvs.forEach(param => {
if (param.files) {
param.files.forEach(item => {
if (item.file) {
let fileId = getUUID().substring(0, 8);
item.name = item.file.name;
item.id = fileId;
this.test.bodyUploadIds.push(fileId);
bodyUploadFiles.push(item.file);
}
});
}
});
}
});
});
return bodyUploadFiles;
},
validateEnableTest() {
for (let scenario of this.test.scenarioDefinition) {
if (scenario.enable) {
for (let request of scenario.requests) {
if (request.enable) {
return true;
}
}
}
}
return false;
},
resetBodyFile() {
//
this.test.scenarioDefinition.forEach(scenario => {
scenario.requests.forEach(request => {
if (request.body) {
request.body.kvs.forEach(param => {
if (param.files) {
param.files.forEach(item => {
if (item.file) {
item.file = undefined;
}
});
}
});
}
});
});
},
cancel() {
this.$router.push('/api/test/list/all');
// console.log(this.test.toJMX().xml);
},
handleCommand(command) {
switch (command) {
case "report":
this.$refs.reportDialog.open();
break;
case "performance":
this.$store.commit('setTest', {
name: this.test.name,
jmx: this.test.toJMX()
})
this.$router.push({
path: "/performance/test/create"
})
break;
case "export":
downloadFile(this.test.name + ".json", this.test.export());
break;
case "jar":
this.$refs.jarConfig.open();
break;
case "import":
this.$refs.apiImport.open();
break;
}
},
saveCronExpression(cronExpression) {
this.test.schedule.enable = true;
this.test.schedule.value = cronExpression;
this.saveSchedule();
},
saveSchedule() {
this.checkScheduleEdit();
let param = {};
param = this.test.schedule;
param.resourceId = this.test.id;
// projectId
if (!param.projectId) {
param.projectId = getCurrentProjectID();
}
if (!param.workspaceId) {
param.workspaceId = getCurrentWorkspaceId();
}
let url = '/api/schedule/create';
if (param.id) {
url = '/api/schedule/update';
}
this.$post(url, param, () => {
this.$success(this.$t('commons.save_success'));
this.getTest(this.test.id);
});
},
checkScheduleEdit() {
if (this.create) {
this.$message(this.$t('api_test.environment.please_save_test'));
return false;
}
return true;
},
runDebug(scenario) {
if (this.create) {
this.$warning(this.$t('api_test.environment.please_save_test'));
return;
}
let url = "/api/run/debug";
let runningTest = new Test();
Object.assign(runningTest, this.test);
let bodyFiles = this.getBodyUploadFiles();
runningTest.scenarioDefinition = [];
runningTest.scenarioDefinition.push(scenario);
let validator = runningTest.isValid();
if (!validator.isValid) {
this.$warning(this.$t(validator.info));
return;
}
let jmx = runningTest.toJMX();
let blob = new Blob([jmx.xml], {type: "application/octet-stream"});
let file = new File([blob], jmx.name);
this.$fileUpload(url, file, bodyFiles, this.test, response => {
this.debugReportId = response.data;
this.resetBodyFile();
});
},
handleEvent(event) {
if (event.keyCode === 83 && event.ctrlKey) {
// console.log(' ctrl + s');//ctrl+s
this.saveTest();
event.preventDefault();
event.returnValue = false;
return false;
}
},
},
created() {
this.init();
//
document.addEventListener('keydown', this.handleEvent)
},
beforeDestroy() {
document.removeEventListener('keydown', this.handleEvent);
}
}
</script>
<style scoped>
.test-container {
height: calc(100vh - 155px);
min-height: 600px;
}
.test-name {
width: 600px;
margin-left: -20px;
margin-right: 20px;
}
.test-project {
min-width: 150px;
}
.test-container .more {
margin-left: 10px;
}
</style>

View File

@ -1,231 +0,0 @@
<template>
<ms-container>
<ms-main-container>
<el-card class="table-card" v-loading="result.loading">
<template v-slot:header>
<ms-table-header :condition.sync="condition" @search="search"
:title="$t('commons.test')"
@create="create" :createTip="$t('load_test.create')" :runTip="$t('load_test.run')"
:show-run="true"
@runTest="runTest" @historicalDataUpgrade="historicalDataUpgrade"/>
</template>
<one-click-operation ref="OneClickOperation" :select-ids="selectIds"
:select-project-names="selectProjectNames" :select-project-id="selectProjectId"
@refresh="init()"></one-click-operation>
<el-table border :data="tableData" class="adjust-table table-content" @sort-change="sort"
@row-click="handleView"
@filter-change="filter" @select-all="select" @select="select">
<el-table-column
type="selection"></el-table-column>
<el-table-column prop="name" :label="$t('commons.name')" width="250" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="projectName" :label="$t('load_test.project_name')" width="200" show-overflow-tooltip/>
<el-table-column prop="userName" :label="$t('api_test.creator')" width="150" show-overflow-tooltip/>
<el-table-column width="250" :label="$t('commons.create_time')" sortable
prop="createTime">
<template v-slot:default="scope">
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column width="250" :label="$t('commons.update_time')" sortable
prop="updateTime">
<template v-slot:default="scope">
<span>{{ scope.row.updateTime | timestampFormatDate }}</span>
</template>
</el-table-column>
<el-table-column prop="status" :label="$t('commons.status')"
column-key="status"
:filters="statusFilters">
<template v-slot:default="{row}">
<ms-api-test-status :row="row"/>
</template>
</el-table-column>
<el-table-column width="150" :label="$t('commons.operating')">
<template v-slot:default="scope">
<div>
<ms-table-operators :buttons="buttons" :row="scope.row"/>
</div>
</template>
</el-table-column>
</el-table>
<ms-table-pagination :change="search" :current-page.sync="currentPage" :page-size.sync="pageSize"
:total="total"/>
</el-card>
<api-copy-dialog ref="apiCopy" @refresh="search"/>
<ms-upgrade ref="upgrade" :select-ids="selectIds"
:select-project-names="selectProjectNames" :select-project-id="selectProjectId"/>
</ms-main-container>
</ms-container>
</template>
<script>
import OneClickOperation from './OneClickOperation';
import MsTablePagination from "../../common/pagination/TablePagination";
import MsTableHeader from "../../common/components/MsTableHeader";
import MsTableOperator from "../../common/components/MsTableOperator";
import MsContainer from "../../common/components/MsContainer";
import MsMainContainer from "../../common/components/MsMainContainer";
import MsApiTestStatus from "./ApiTestStatus";
import MsTableOperators from "../../common/components/MsTableOperators";
import {TEST_CONFIGS} from "../../common/components/search/search-components";
import ApiCopyDialog from "./components/ApiCopyDialog";
import MsUpgrade from "./Upgrade";
import {_filter, _sort} from "@/common/js/tableUtils";
export default {
components: {
ApiCopyDialog,
OneClickOperation,
MsTableOperators,
MsApiTestStatus, MsMainContainer, MsContainer, MsTableHeader, MsTablePagination, MsTableOperator, MsUpgrade
},
data() {
return {
result: {},
condition: {
components: TEST_CONFIGS
},
projectId: null,
tableData: [],
multipleSelection: [],
currentPage: 1,
pageSize: 10,
total: 0,
loading: false,
selectIds: new Set(),
selectProjectNames: new Set(),
selectProjectId: new Set(),
buttons: [
{
tip: this.$t('commons.edit'), icon: "el-icon-edit",
exec: this.handleEdit
}, {
tip: this.$t('commons.copy'), icon: "el-icon-copy-document", type: "success",
exec: this.handleCopy
}, {
tip: this.$t('commons.delete'), icon: "el-icon-delete", type: "danger",
exec: this.handleDelete
}
],
statusFilters: [
{text: 'Saved', value: 'Saved'},
{text: 'Starting', value: 'Starting'},
{text: 'Running', value: 'Running'},
{text: 'Reporting', value: 'Reporting'},
{text: 'Completed', value: 'Completed'},
{text: 'Error', value: 'Error'}
]
}
},
watch: {
'$route': 'init'
},
methods: {
create() {
this.$router.push('/api/test/create');
},
select(selection) {
this.selectIds.clear()
this.selectProjectNames.clear()
this.selectProjectId.clear()
selection.forEach(s => {
this.selectIds.add(s.id)
this.selectProjectNames.add(s.projectName)
this.selectProjectId.add(s.projectId)
})
},
runTest() {
if (this.selectIds.size < 1) {
this.$warning(this.$t('test_track.plan_view.select_manipulate'));
} else {
this.$refs.OneClickOperation.openOneClickOperation();
}
},
search() {
if (this.projectId !== 'all') {
this.condition.projectId = this.projectId;
}
let url = "/api/list/" + this.currentPage + "/" + this.pageSize;
this.result = this.$post(url, this.condition, response => {
let data = response.data;
this.total = data.itemCount;
this.tableData = data.listObject;
});
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
handleEdit(test) {
this.$router.push({
path: '/api/test/edit?id=' + test.id,
})
},
handleView(test) {
this.$router.push({
path: '/api/test/view?id=' + test.id,
})
},
handleDelete(test) {
this.$alert(this.$t('load_test.delete_confirm') + test.name + "", '', {
confirmButtonText: this.$t('commons.confirm'),
callback: (action) => {
if (action === 'confirm') {
this.result = this.$post("/api/delete", {id: test.id}, () => {
this.$success(this.$t('commons.delete_success'));
this.search();
});
}
}
});
},
handleCopy(test) {
this.$refs.apiCopy.open(test);
},
init() {
this.selectIds.clear()
this.selectProjectNames.clear()
this.selectIds.clear()
this.projectId = this.$route.params.projectId;
if (this.projectId && this.projectId !== "all") {
this.$store.commit('setProjectId', this.projectId);
}
this.search();
},
sort(column) {
_sort(column, this.condition);
this.init();
},
filter(filters) {
_filter(filters, this.condition);
this.init();
},
historicalDataUpgrade() {
if (this.selectIds.size < 1) {
this.$warning(this.$t('test_track.plan_view.select_manipulate'));
} else {
this.$refs.upgrade.openOneClickOperation();
}
}
},
created() {
this.init();
}
}
</script>
<style scoped>
.table-content {
width: 100%;
}
.el-table {
cursor: pointer;
}
</style>

View File

@ -1,38 +0,0 @@
<template>
<div>
<el-tag size="mini" type="primary" v-if="row.status === 'Starting'">
{{ row.status }}
</el-tag>
<el-tag size="mini" type="success" v-else-if="row.status === 'Running'">
{{ row.status }}
</el-tag>
<el-tag size="mini" type="warning" v-else-if="row.status === 'Reporting'">
{{ row.status }}
</el-tag>
<el-tooltip placement="top" v-else-if="row.status === 'Error'" effect="light">
<template v-slot:content>
<div>{{row.description}}</div>
</template>
<el-tag size="mini" type="danger">
{{ row.status }}
</el-tag>
</el-tooltip>
<el-tag v-else size="mini" type="info">
{{ row.status }}
</el-tag>
</div>
</template>
<script>
export default {
name: "MsApiTestStatus",
props: {
row: Object
}
}
</script>
<style scoped>
</style>

View File

@ -1,205 +0,0 @@
<template>
<el-dialog
:title="$t('load_test.run')"
:visible.sync="oneClickOperationVisible"
width="30%"
left
:destroy-on-close="true"
show-close
@closed="handleClose">
<el-form :model="ruleForm" label-position="right" label-width="100px" size="small" :rules="rule">
<el-form-item :label="$t('test_track.case.test_name')" prop="testName">
<el-input v-model="ruleForm.testName" autocomplete="off" clearable show-word-limit></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<ms-dialog-footer
@cancel="oneClickOperationVisible = false"
@confirm="checkedSaveAndRunTest"/>
</span>
</el-dialog>
</template>
<script>
import MsDialogFooter from '../../common/components/MsDialogFooter'
import {Test} from "./model/ScenarioModel"
import MsApiScenarioConfig from "./components/ApiScenarioConfig";
import MsApiReportStatus from "../report/ApiReportStatus";
import MsApiReportDialog from "./ApiReportDialog";
import {getUUID} from "@/common/js/utils";
import {parseEnvironment} from "./model/EnvironmentModel";
export default {
name: "OneClickOperation",
components: {
MsApiReportDialog, MsApiReportStatus, MsApiScenarioConfig, MsDialogFooter
},
data() {
return {
oneClickOperationVisible: false,
test: null,
tests: [],
ruleForm: {},
change: false,
projectId: "",
rule: {
testName: [
{required: true, message: this.$t('api_test.input_name'), trigger: 'blur'},
],
}
};
},
watch: {
test: {
handler: function () {
this.change = true;
},
deep: true
}
},
props: {
selectIds: {
type: Set
},
selectProjectNames: {
type: Set
},
selectProjectId: {
type: Set
}
},
methods: {
openOneClickOperation() {
this.oneClickOperationVisible = true;
},
checkedSaveAndRunTest() {
if (this.ruleForm.testName) {
if (this.selectProjectNames.size > 1) {
this.$warning(this.$t('load_test.same_project_test'));
this.oneClickOperationVisible = false;
this.$emit('refresh')
} else {
this.checkNameResult(this.ruleForm.testName)
}
} else {
this.$warning(this.$t('api_test.input_name'))
}
},
checkNameResult() {
this.checkName(() => {
for (let x of this.selectIds) {
this.getTest(x)
}
})
},
checkName(callback) {
for (let i of this.selectProjectId) {
this.result = this.$post('/api/checkName', {name: this.ruleForm.testName, projectId: i}, () => {
if (callback) callback();
})
}
},
_getEnvironmentAndRunTest: function (item) {
this.result = this.$get('/api/environment/list/' + item.projectId, response => {
let environments = response.data;
let environmentMap = new Map();
environments.forEach(environment => {
parseEnvironment(environment);
environmentMap.set(environment.id, environment);
});
this.test.scenarioDefinition.forEach(scenario => {
if (scenario.environmentId) {
let env = environmentMap.get(scenario.environmentId);
if (!env) {
scenario.environmentId = undefined;
} else {
scenario.environment = env;
}
}
}
)
this.tests = [];
this.saveRunTest();
this.oneClickOperationVisible = false;
this.$emit('refresh')
});
},
getTest(id) {
this.result = this.$get("/api/get/" + id, response => {
if (response.data) {
let item = response.data;
this.tests.push(item);
let test = new Test({
projectId: item.projectId,
name: this.ruleForm.testName,
scenarioDefinition: JSON.parse(item.scenarioDefinition),
schedule: {},
});
this.test = this.test || test;
if (this.tests.length > 1) {
this.test.scenarioDefinition = this.test.scenarioDefinition.concat(test.scenarioDefinition);
}
if (this.tests.length === this.selectIds.size) {
this._getEnvironmentAndRunTest(item);
}
}
});
},
saveRunTest() {
this.change = false;
this.save(() => {
this.$success(this.$t('commons.save_success'));
this.runTest();
})
},
save(callback) {
this.change = false;
let url = "/api/create/merge";
this.result = this.$request(this.getOptions(url, this.selectIds), () => {
if (callback) callback();
});
},
runTest() {
this.result = this.$post("/api/run", {id: this.test.id, triggerMode: 'MANUAL'}, (response) => {
this.$success(this.$t('api_test.running'));
this.$router.push({
path: '/api/report/view/' + response.data
})
this.test = ""
});
},
getOptions(url, selectIds) {
let formData = new FormData();
formData.append('request', new Blob([JSON.stringify(this.test)], {
type: "application/json"
}));
formData.append('selectIds', new Blob([JSON.stringify(Array.from(selectIds))], {
type: "application/json"
}));
let jmx = this.test.toJMX();
let blob = new Blob([jmx.xml], {type: "application/octet-stream"});
formData.append("file", new File([blob], jmx.name));
return {
method: 'POST',
url: url,
data: formData,
headers: {
'Content-Type': undefined
}
};
},
handleClose() {
this.ruleForm = {}
},
}
}
</script>
<style scoped>
</style>

View File

@ -1,198 +0,0 @@
<template>
<el-dialog
:title="$t('commons.module.select_module')"
:visible.sync="oneClickOperationVisible"
width="600px"
left
:destroy-on-close="true"
show-close
@closed="handleClose" v-loading="loading">
<ms-node-tree
v-loading="result.loading"
:tree-nodes="data"
@add="add"
:type="'edit'"
@edit="edit"
@drag="drag"
@remove="remove"
@nodeSelectEvent="nodeChange"
ref="nodeTree">
<template v-slot:header>
<el-input :placeholder="$t('test_track.module.search')" v-model="condition.filterText" size="small">
</el-input>
</template>
</ms-node-tree>
<span slot="footer" class="dialog-footer">
<ms-dialog-footer
@cancel="oneClickOperationVisible = false"
@confirm="confirm"/>
</span>
</el-dialog>
</template>
<script>
import MsDialogFooter from '../../common/components/MsDialogFooter'
import MsApiScenarioConfig from "./components/ApiScenarioConfig";
import MsApiReportStatus from "../report/ApiReportStatus";
import MsApiReportDialog from "./ApiReportDialog";
import {getUUID, getCurrentProjectID} from "@/common/js/utils";
import SelectMenu from "../../track/common/SelectMenu";
import MsNodeTree from "../../track/common/NodeTree";
import {buildNodePath} from "../definition/model/NodeTree";
export default {
name: "MsUpgrade",
components: {
MsApiReportDialog, MsApiReportStatus, MsApiScenarioConfig,
MsDialogFooter,
MsNodeTree,
SelectMenu,
},
data() {
return {
oneClickOperationVisible: false,
moduleOptions: [],
loading: false,
result: {},
data: [],
condition: {
filterText: "",
trashEnable: false
},
currentModule: undefined,
};
},
props: {
selectIds: {
type: Set
},
selectProjectNames: {
type: Set
},
selectProjectId: {
type: Set
}
},
watch: {
'condition.filterText'(val) {
this.$refs.nodeTree.filter(val);
},
},
methods: {
openOneClickOperation() {
this.initModule();
this.oneClickOperationVisible = true;
},
getPath(id) {
let path = this.moduleOptions.filter(function (item) {
return item.id === id ? item.path : "";
});
return path[0].path;
},
confirm() {
if (!this.currentModule) {
this.$warning("请选择一个模块");
return;
}
if (this.currentModule.id === "root") {
this.$warning("不能选根模块,请重新选择一个模块");
return;
}
this.loading = true;
let arr = Array.from(this.selectIds);
let obj = {testIds: arr, projectId: getCurrentProjectID(), modulePath: this.getPath(this.currentModule.id), moduleId: this.currentModule.id};
this.$post("/api/historicalDataUpgrade", obj, response => {
this.loading = false;
this.$success(this.$t('organization.integration.successful_operation'));
this.oneClickOperationVisible = false;
})
},
initModule() {
let url = "/api/automation/module/list/" + getCurrentProjectID();
this.$get(url, response => {
if (response.data != undefined && response.data != null) {
this.data = response.data;
let modules = [];
this.data.forEach(node => {
buildNodePath(node, {path: ''}, modules);
});
this.moduleOptions = modules;
}
});
},
handleClose() {
this.ruleForm = {}
},
edit(param) {
param.projectId = getCurrentProjectID();
param.protocol = this.condition.protocol;
this.$post("/api/automation/module/edit", param, () => {
this.$success(this.$t('commons.save_success'));
this.initModule();
this.refresh();
}, (error) => {
this.initModule();
});
},
add(param) {
param.projectId = getCurrentProjectID();
param.protocol = this.condition.protocol;
this.$post("/api/automation/module/add", param, () => {
this.$success(this.$t('commons.save_success'));
this.initModule();
}, (error) => {
this.initModule();
});
},
remove(nodeIds) {
this.$post("/api/automation/module/delete", nodeIds, () => {
this.initModule();
this.refresh();
}, (error) => {
this.initModule();
});
},
drag(param, list) {
this.$post("/api/automation/module/drag", param, () => {
this.$post("/api/automation/module/pos", list, () => {
this.initModule();
});
}, (error) => {
this.initModule();
});
},
nodeChange(node, nodeIds, pNodes) {
this.currentModule = node.data;
this.condition.trashEnable = false;
if (node.data.id === 'root') {
this.$emit("nodeSelectEvent", node, [], pNodes);
} else {
this.$emit("nodeSelectEvent", node, nodeIds, pNodes);
}
},
saveAsEdit(data) {
this.$emit('saveAsEdit', data);
},
refresh() {
this.$emit("refreshTable");
},
addScenario() {
if (!getCurrentProjectID()) {
this.$warning(this.$t('commons.check_project_tip'));
return;
}
this.$refs.basisScenario.open(this.currentModule);
},
enableTrash() {
this.condition.trashEnable = true;
}
}
}
</script>
<style scoped>
</style>

View File

@ -82,23 +82,13 @@ export default {
this.registerEvents(); this.registerEvents();
}, },
computed: {
...mapGetters([
'isNewVersion',
'isOldVersion',
])
},
methods: { methods: {
handleSelect(index) { handleSelect(index) {
this.activeIndex = index; this.activeIndex = index;
}, },
active() { active() {
if (this.activeIndex === '/api') { if (this.activeIndex === '/api') {
if (this.isNewVersion) { window.location.href = "/#/api/home";
window.location.href = "/#/api/home";
} else if (this.isOldVersion) {
window.location.href = "/#/api/home_obsolete";
}
} }
}, },
check(key) { check(key) {

View File

@ -39,10 +39,6 @@ export default {
currentUser: () => { currentUser: () => {
return getCurrentUser(); return getCurrentUser();
}, },
...mapGetters([
'isNewVersion',
'isOldVersion',
])
}, },
methods: { methods: {
logout: function () { logout: function () {

View File

@ -49,12 +49,6 @@ export default {
inject: [ inject: [
'reload' 'reload'
], ],
computed: {
...mapGetters([
'isNewVersion',
'isOldVersion',
]),
},
data() { data() {
return { return {
result: {}, result: {},

View File

@ -1,6 +1,4 @@
const getters = { const getters = {
isNewVersion: state => state.versionSwitch === 'new',
isOldVersion: state => state.versionSwitch === 'old',
// getTestCaseNodePath(state, nodeId) { // getTestCaseNodePath(state, nodeId) {
// for (const index in state.moduleOptions) { // for (const index in state.moduleOptions) {
// let item = state.moduleOptions[index]; // let item = state.moduleOptions[index];