Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
a6ee8d4fc0
|
@ -0,0 +1,12 @@
|
||||||
|
package io.metersphere.base.mapper.ext;
|
||||||
|
|
||||||
|
import io.metersphere.controller.request.ReportRequest;
|
||||||
|
import io.metersphere.dto.ReportDTO;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ExtLoadTestReportMapper {
|
||||||
|
|
||||||
|
List<ReportDTO> getReportList(@Param("reportRequest")ReportRequest request);
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||||
|
<mapper namespace="io.metersphere.base.mapper.ext.ExtLoadTestReportMapper">
|
||||||
|
|
||||||
|
<select id="getReportList" resultType="io.metersphere.dto.ReportDTO">
|
||||||
|
select ltr.id, ltr.name, ltr.test_id as testId, ltr.description,
|
||||||
|
ltr.create_time as createTime, ltr.update_time as updateTime, ltr.status as status, lt.name as testName
|
||||||
|
from load_test_report ltr join load_test lt on ltr.test_id = lt.id
|
||||||
|
<where>
|
||||||
|
<if test="reportRequest.name != null">
|
||||||
|
AND ltr.name like CONCAT('%', #{reportRequest.name},'%')
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
|
@ -1,17 +1,18 @@
|
||||||
package io.metersphere.controller;
|
package io.metersphere.controller;
|
||||||
|
|
||||||
|
import com.github.pagehelper.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import io.metersphere.base.domain.LoadTestReport;
|
import io.metersphere.base.domain.LoadTestReport;
|
||||||
import io.metersphere.commons.constants.RoleConstants;
|
import io.metersphere.commons.constants.RoleConstants;
|
||||||
|
import io.metersphere.commons.utils.PageUtils;
|
||||||
|
import io.metersphere.commons.utils.Pager;
|
||||||
import io.metersphere.controller.request.ReportRequest;
|
import io.metersphere.controller.request.ReportRequest;
|
||||||
|
import io.metersphere.dto.ReportDTO;
|
||||||
import io.metersphere.service.ReportService;
|
import io.metersphere.service.ReportService;
|
||||||
import io.metersphere.user.SessionUtils;
|
import io.metersphere.user.SessionUtils;
|
||||||
import org.apache.shiro.authz.annotation.Logical;
|
import org.apache.shiro.authz.annotation.Logical;
|
||||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -33,4 +34,15 @@ public class ReportController {
|
||||||
PageHelper.startPage(1, count);
|
PageHelper.startPage(1, count);
|
||||||
return reportService.getRecentReportList(request);
|
return reportService.getRecentReportList(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/list/all/{goPage}/{pageSize}")
|
||||||
|
public Pager<List<ReportDTO>> getReportList(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody ReportRequest request) {
|
||||||
|
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
||||||
|
return PageUtils.setPageInfo(page, reportService.getReportList(request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/delete/{reportId}")
|
||||||
|
public void deleteReport(@PathVariable String reportId) {
|
||||||
|
reportService.deleteReport(reportId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package io.metersphere.controller.request;
|
package io.metersphere.controller.request;
|
||||||
|
|
||||||
public class ReportRequest {
|
public class ReportRequest {
|
||||||
|
private String name;
|
||||||
private String workspaceId;
|
private String workspaceId;
|
||||||
|
|
||||||
public String getWorkspaceId() {
|
public String getWorkspaceId() {
|
||||||
|
@ -10,4 +11,12 @@ public class ReportRequest {
|
||||||
public void setWorkspaceId(String workspaceId) {
|
public void setWorkspaceId(String workspaceId) {
|
||||||
this.workspaceId = workspaceId;
|
this.workspaceId = workspaceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
package io.metersphere.dto;
|
||||||
|
|
||||||
|
public class ReportDTO {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private String testId;
|
||||||
|
private String name;
|
||||||
|
private String description;
|
||||||
|
private Long createTime;
|
||||||
|
private Long updateTime;
|
||||||
|
private String status;
|
||||||
|
private String content;
|
||||||
|
private String testName;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTestId() {
|
||||||
|
return testId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTestId(String testId) {
|
||||||
|
this.testId = testId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getCreateTime() {
|
||||||
|
return createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreateTime(Long createTime) {
|
||||||
|
this.createTime = createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getUpdateTime() {
|
||||||
|
return updateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdateTime(Long updateTime) {
|
||||||
|
this.updateTime = updateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContent(String content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTestName() {
|
||||||
|
return testName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTestName(String testName) {
|
||||||
|
this.testName = testName;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,7 +3,9 @@ package io.metersphere.service;
|
||||||
import io.metersphere.base.domain.LoadTestReport;
|
import io.metersphere.base.domain.LoadTestReport;
|
||||||
import io.metersphere.base.domain.LoadTestReportExample;
|
import io.metersphere.base.domain.LoadTestReportExample;
|
||||||
import io.metersphere.base.mapper.LoadTestReportMapper;
|
import io.metersphere.base.mapper.LoadTestReportMapper;
|
||||||
|
import io.metersphere.base.mapper.ext.ExtLoadTestReportMapper;
|
||||||
import io.metersphere.controller.request.ReportRequest;
|
import io.metersphere.controller.request.ReportRequest;
|
||||||
|
import io.metersphere.dto.ReportDTO;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@ -16,6 +18,8 @@ public class ReportService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private LoadTestReportMapper loadTestReportMapper;
|
private LoadTestReportMapper loadTestReportMapper;
|
||||||
|
@Resource
|
||||||
|
private ExtLoadTestReportMapper extLoadTestReportMapper;
|
||||||
|
|
||||||
public List<LoadTestReport> getRecentReportList(ReportRequest request) {
|
public List<LoadTestReport> getRecentReportList(ReportRequest request) {
|
||||||
LoadTestReportExample example = new LoadTestReportExample();
|
LoadTestReportExample example = new LoadTestReportExample();
|
||||||
|
@ -25,4 +29,12 @@ public class ReportService {
|
||||||
example.setOrderByClause("update_time desc");
|
example.setOrderByClause("update_time desc");
|
||||||
return loadTestReportMapper.selectByExample(example);
|
return loadTestReportMapper.selectByExample(example);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ReportDTO> getReportList(ReportRequest request) {
|
||||||
|
return extLoadTestReportMapper.getReportList(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteReport(String reportId) {
|
||||||
|
loadTestReportMapper.deleteByPrimaryKey(reportId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,11 @@ export default {
|
||||||
role: {
|
role: {
|
||||||
'please_choose_role': 'Please Choose Role',
|
'please_choose_role': 'Please Choose Role',
|
||||||
},
|
},
|
||||||
|
report: {
|
||||||
|
'recent': 'Recent Report',
|
||||||
|
'search_by_name': 'Search by Name',
|
||||||
|
'test_name': 'Test',
|
||||||
|
},
|
||||||
load_test: {
|
load_test: {
|
||||||
'recent': 'Recent Tests',
|
'recent': 'Recent Tests',
|
||||||
'search_by_name': 'Search by name',
|
'search_by_name': 'Search by name',
|
||||||
|
|
|
@ -90,6 +90,11 @@ export default {
|
||||||
role: {
|
role: {
|
||||||
'please_choose_role': '请选择角色',
|
'please_choose_role': '请选择角色',
|
||||||
},
|
},
|
||||||
|
report: {
|
||||||
|
'recent': '最近的报告',
|
||||||
|
'search_by_name': '根据名称搜索',
|
||||||
|
'test_name': '所属测试',
|
||||||
|
},
|
||||||
load_test: {
|
load_test: {
|
||||||
'recent': '最近的测试',
|
'recent': '最近的测试',
|
||||||
'search_by_name': '根据名称搜索',
|
'search_by_name': '根据名称搜索',
|
||||||
|
|
|
@ -135,8 +135,7 @@
|
||||||
changeWs(data) {
|
changeWs(data) {
|
||||||
let sign = "workspace";
|
let sign = "workspace";
|
||||||
let workspaceId = data.id;
|
let workspaceId = data.id;
|
||||||
// todo 工作空间为空判断
|
if (!workspaceId) {
|
||||||
if (typeof (workspaceId) == "undefined") {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
this.$post("/user/switch/source/" + sign + "/" + workspaceId, {}, response => {
|
this.$post("/user/switch/source/" + sign + "/" + workspaceId, {}, response => {
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
<template>
|
||||||
|
<div class="testreport-container" v-loading="result.loading">
|
||||||
|
|
||||||
|
<div class="main-content">
|
||||||
|
<el-card>
|
||||||
|
<div slot="header">
|
||||||
|
<el-row type="flex" justify="space-between" align="middle">
|
||||||
|
<span class="title">{{$t('commons.report')}}</span>
|
||||||
|
<span class="search">
|
||||||
|
<el-input type="text" size="small" :placeholder="$t('report.search_by_name')"
|
||||||
|
prefix-icon="el-icon-search"
|
||||||
|
maxlength="60"
|
||||||
|
v-model="condition" @change="search" clearable/>
|
||||||
|
</span>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table :data="tableData" class="test-content">
|
||||||
|
<el-table-column
|
||||||
|
prop="name"
|
||||||
|
:label="$t('commons.name')"
|
||||||
|
width="150"
|
||||||
|
show-overflow-tooltip>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="description"
|
||||||
|
:label="$t('commons.description')"
|
||||||
|
show-overflow-tooltip>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="testName"
|
||||||
|
:label="$t('report.test_name')"
|
||||||
|
width="150"
|
||||||
|
show-overflow-tooltip>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
width="250"
|
||||||
|
:label="$t('commons.create_time')">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
width="250"
|
||||||
|
:label="$t('commons.update_time')">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.updateTime | timestampFormatDate }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
width="150"
|
||||||
|
:label="$t('commons.operating')">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button @click="handleEdit(scope.row)" type="primary" icon="el-icon-edit" size="mini" circle/>
|
||||||
|
<el-button @click="handleDelete(scope.row)" type="danger" icon="el-icon-delete" size="mini" circle/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<div>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="22" :offset="1">
|
||||||
|
<div class="table-page">
|
||||||
|
<el-pagination
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
:current-page.sync="currentPage"
|
||||||
|
:page-sizes="[5, 10, 20, 50, 100]"
|
||||||
|
:page-size="pageSize"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="total">
|
||||||
|
</el-pagination>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "MsAllTestReport",
|
||||||
|
created: function () {
|
||||||
|
this.initTableData();
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
result: {},
|
||||||
|
queryPath: "/report/list/all",
|
||||||
|
deletePath: "/report/delete/",
|
||||||
|
condition: "",
|
||||||
|
projectId: null,
|
||||||
|
tableData: [],
|
||||||
|
multipleSelection: [],
|
||||||
|
currentPage: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
total: 0,
|
||||||
|
loading: false,
|
||||||
|
testId: null,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initTableData() {
|
||||||
|
let param = {
|
||||||
|
name: this.condition,
|
||||||
|
};
|
||||||
|
this.result = this.$post(this.buildPagePath(this.queryPath), param, response => {
|
||||||
|
let data = response.data;
|
||||||
|
this.total = data.itemCount;
|
||||||
|
this.tableData = data.listObject;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
search() {
|
||||||
|
this.initTableData();
|
||||||
|
},
|
||||||
|
buildPagePath(path) {
|
||||||
|
return path + "/" + this.currentPage + "/" + this.pageSize;
|
||||||
|
},
|
||||||
|
handleSizeChange(size) {
|
||||||
|
this.pageSize = size;
|
||||||
|
this.initTableData();
|
||||||
|
},
|
||||||
|
handleCurrentChange(current) {
|
||||||
|
this.currentPage = current;
|
||||||
|
this.initTableData();
|
||||||
|
},
|
||||||
|
handleSelectionChange(val) {
|
||||||
|
this.multipleSelection = val;
|
||||||
|
},
|
||||||
|
handleEdit() {
|
||||||
|
|
||||||
|
},
|
||||||
|
handleDelete(report) {
|
||||||
|
this.$alert(this.$t('load_test.delete_confirm') + report.name + "?", '', {
|
||||||
|
confirmButtonText: this.$t('commons.confirm'),
|
||||||
|
callback: (action) => {
|
||||||
|
if (action === 'confirm') {
|
||||||
|
this._handleDelete(report);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
_handleDelete(report) {
|
||||||
|
this.result = this.$post(this.deletePath + report.id, {},() => {
|
||||||
|
this.$message({
|
||||||
|
message: this.$t('commons.delete_success'),
|
||||||
|
type: 'success'
|
||||||
|
});
|
||||||
|
this.initTableData();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
.testreport-container {
|
||||||
|
padding: 15px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.test-content {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-page {
|
||||||
|
padding-top: 20px;
|
||||||
|
margin-right: -9px;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -1,5 +1,9 @@
|
||||||
<template>
|
<template>
|
||||||
<el-menu router menu-trigger="click" :default-active="$route.path">
|
<el-menu router menu-trigger="click" :default-active="$route.path">
|
||||||
|
<div class="recent-text">
|
||||||
|
<i class="el-icon-time"/>
|
||||||
|
{{$t('load_test.recent')}}
|
||||||
|
</div>
|
||||||
<el-menu-item :key="p.id" v-for="p in recentReports"
|
<el-menu-item :key="p.id" v-for="p in recentReports"
|
||||||
:index="'/report/' + p.id" :route="{name:'report', params:{projectId:p.id, projectName:p.name}}">
|
:index="'/report/' + p.id" :route="{name:'report', params:{projectId:p.id, projectName:p.name}}">
|
||||||
{{ p.name }}
|
{{ p.name }}
|
||||||
|
@ -32,5 +36,8 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
.recent-text {
|
||||||
|
padding-left: 10%;
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -14,6 +14,7 @@ import OrganizationWorkspace from "../settings/organization/OrganizationWorkspac
|
||||||
import PersonSetting from "../settings/personal/PersonSetting";
|
import PersonSetting from "../settings/personal/PersonSetting";
|
||||||
import SystemWorkspace from "../settings/system/SystemWorkspace";
|
import SystemWorkspace from "../settings/system/SystemWorkspace";
|
||||||
import MsChart from "../project/MsChart";
|
import MsChart from "../project/MsChart";
|
||||||
|
import AllTestReport from "../report/AllTestReport";
|
||||||
|
|
||||||
Vue.use(VueRouter);
|
Vue.use(VueRouter);
|
||||||
|
|
||||||
|
@ -101,6 +102,13 @@ const router = new VueRouter({
|
||||||
content: MsProject
|
content: MsProject
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/report/:type",
|
||||||
|
name: 'report',
|
||||||
|
components: {
|
||||||
|
content: AllTestReport
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/chart",
|
path: "/chart",
|
||||||
name: 'chart',
|
name: 'chart',
|
||||||
|
|
Loading…
Reference in New Issue