feat(测试跟踪): 用例数量统计

This commit is contained in:
shiziyuan9527 2021-03-12 16:57:16 +08:00
parent 846345cdd2
commit 7d26ee82c5
10 changed files with 756 additions and 29 deletions

View File

@ -5,6 +5,7 @@ import io.metersphere.controller.request.BaseQueryRequest;
import io.metersphere.track.dto.TestCaseDTO; import io.metersphere.track.dto.TestCaseDTO;
import io.metersphere.track.request.testcase.QueryTestCaseRequest; import io.metersphere.track.request.testcase.QueryTestCaseRequest;
import io.metersphere.track.request.testcase.TestCaseBatchRequest; import io.metersphere.track.request.testcase.TestCaseBatchRequest;
import io.metersphere.track.response.TrackCountResult;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -48,4 +49,15 @@ public interface ExtTestCaseMapper {
int checkIsHave(@Param("caseId") String caseId, @Param("workspaceIds") Set<String> workspaceIds); int checkIsHave(@Param("caseId") String caseId, @Param("workspaceIds") Set<String> workspaceIds);
List<String> selectIds(@Param("request") BaseQueryRequest condition); List<String> selectIds(@Param("request") BaseQueryRequest condition);
/**
* 按照用例等级统计
* @param projectId 项目ID
* @return 统计结果
*/
List<TrackCountResult> countPriority(@Param("projectId") String projectId);
long countCreatedThisWeek(@Param("projectId") String projectId, @Param("firstDayTimestamp") long firstDayTimestamp, @Param("lastDayTimestamp") long lastDayTimestamp);
List<TrackCountResult> countStatus(@Param("projectId") String projectId);
} }

View File

@ -319,4 +319,18 @@
</where> </where>
</sql> </sql>
<select id="countPriority" resultType="io.metersphere.track.response.TrackCountResult">
SELECT test_case.priority as groupField,count(id) AS countNumber FROM test_case WHERE project_id = #{projectId} GROUP BY test_case.priority
</select>
<!-- todo 排除删除的用例统计-->
<select id="countCreatedThisWeek" resultType="java.lang.Long">
SELECT count(id) AS countNumber FROM test_case WHERE test_case.project_id = #{projectId}
AND create_time BETWEEN #{firstDayTimestamp} AND #{lastDayTimestamp}
</select>
<select id="countStatus" resultType="io.metersphere.track.response.TrackCountResult">
SELECT review_status AS groupField,count(id) AS countNumber FROM test_case WHERE project_id = #{projectId} GROUP BY test_case.review_status;
</select>
</mapper> </mapper>

View File

@ -0,0 +1,53 @@
package io.metersphere.track.controller;
import io.metersphere.commons.constants.RoleConstants;
import io.metersphere.track.response.TrackCountResult;
import io.metersphere.track.response.TrackStatisticsDTO;
import io.metersphere.track.service.TrackService;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.web.bind.annotation.GetMapping;
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 java.text.DecimalFormat;
import java.util.List;
@RestController
@RequestMapping("/track")
@RequiresRoles(value = {RoleConstants.ADMIN, RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER, RoleConstants.TEST_VIEWER, RoleConstants.ORG_ADMIN}, logical = Logical.OR)
public class TrackController {
@Resource
private TrackService trackService;
@GetMapping("/count/{projectId}")
public TrackStatisticsDTO getTrackCount(@PathVariable String projectId) {
TrackStatisticsDTO statistics = new TrackStatisticsDTO();
List<TrackCountResult> priorityResults = trackService.countPriority(projectId);
statistics.countPriority(priorityResults);
long size = trackService.countCreatedThisWeek(projectId);
statistics.setThisWeekAddedCount(size);
List<TrackCountResult> statusResults = trackService.countStatus(projectId);
statistics.countStatus(statusResults);
long total = statistics.getPrepareCount() + statistics.getPassCount() + statistics.getUnPassCount();
if (total != 0) {
float reviewed = (float) (statistics.getPassCount() + statistics.getUnPassCount()) * 100 / total;
DecimalFormat df = new DecimalFormat("0.0");
statistics.setReviewRage(df.format(reviewed) + "%");
}
statistics.setP0CountStr("P0&nbsp;&nbsp;<br/><br/>" + statistics.getP0CaseCountNumber());
statistics.setP1CountStr("P1&nbsp;&nbsp;<br/><br/>" + statistics.getP1CaseCountNumber());
statistics.setP2CountStr("P2&nbsp;&nbsp;<br/><br/>" + statistics.getP2CaseCountNumber());
statistics.setP3CountStr("P3&nbsp;&nbsp;<br/><br/>" + statistics.getP3CaseCountNumber());
return statistics;
}
}

View File

@ -0,0 +1,8 @@
package io.metersphere.track.request.testcase;
public class CasePriority {
public static final String P0 = "P0";
public static final String P1 = "P1";
public static final String P2 = "P2";
public static final String P3 = "P3";
}

View File

@ -0,0 +1,19 @@
package io.metersphere.track.response;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class TrackCountResult {
/**
* 分组统计字段
*/
private String groupField;
/**
* 数据统计
*/
private long countNumber;
}

View File

@ -0,0 +1,143 @@
package io.metersphere.track.response;
import io.metersphere.commons.constants.TestReviewCaseStatus;
import io.metersphere.track.request.testcase.CasePriority;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 用例数量统计数据
*/
@Getter
@Setter
public class TrackStatisticsDTO {
/**
* 用例总计
*/
private long allCaseCountNumber = 0;
/**
* P0登记用例总计
*/
private long p0CaseCountNumber = 0;
/**
* P1登记用例总计
*/
private long p1CaseCountNumber = 0;
/**
* P2登记用例总计
*/
private long p2CaseCountNumber = 0;
/**
* P3登记用例总计
*/
private long p3CaseCountNumber = 0;
private String p0CountStr = "";
private String p1CountStr = "";
private String p2CountStr = "";
private String p3CountStr = "";
/**
* 关联用例数量统计
*/
private long relevanceCaseCount = 0;
/**
* 接口用例数量统计
*/
private long apiCaseCount = 0;
/**
* 场景用例数量统计
*/
private long scenarioCaseCount = 0;
/**
* 性能用例数量统计
*/
private long performanceCaseCount = 0;
private String apiCaseCountStr = "";
private String scenarioCaseStr = "";
private String performanceCaseCountStr = "";
/**
* 本周新增数量
*/
private long thisWeekAddedCount = 0;
/**
* 未覆盖
*/
private long uncoverageCount = 0;
/**
* 已覆盖
*/
private long coverageCount = 0;
/**
* 覆盖率
*/
private String coverageRage = " 0%";
/**
* 评审率
*/
private String reviewRage = " 0%";
/**
* 未评审
*/
private long prepareCount = 0;
/**
* 已通过
*/
private long passCount = 0;
/**
* 未通过
*/
private long unPassCount = 0;
/**
* 按照 Priority 统计
* @param trackCountResults 统计结果
*/
public void countPriority(List<TrackCountResult> trackCountResults) {
for (TrackCountResult countResult : trackCountResults) {
switch (countResult.getGroupField().toUpperCase()){
case CasePriority.P0:
this.p0CaseCountNumber += countResult.getCountNumber();
break;
case CasePriority.P1:
this.p1CaseCountNumber += countResult.getCountNumber();
break;
case CasePriority.P2:
this.p2CaseCountNumber += countResult.getCountNumber();
break;
case CasePriority.P3:
this.p3CaseCountNumber += countResult.getCountNumber();
break;
default:
break;
}
this.allCaseCountNumber += countResult.getCountNumber();
}
}
public void countStatus(List<TrackCountResult> statusResults) {
for (TrackCountResult countResult : statusResults) {
if(TestReviewCaseStatus.Prepare.name().equals(countResult.getGroupField())){
this.prepareCount += countResult.getCountNumber();
}else if(TestReviewCaseStatus.Pass.name().equals(countResult.getGroupField())){
this.passCount += countResult.getCountNumber();
}else if(TestReviewCaseStatus.UnPass.name().equals(countResult.getGroupField())){
this.unPassCount += countResult.getCountNumber();
}
}
}
}

View File

@ -0,0 +1,40 @@
package io.metersphere.track.service;
import io.metersphere.base.mapper.ext.ExtTestCaseMapper;
import io.metersphere.commons.utils.DateUtils;
import io.metersphere.track.response.TrackCountResult;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
@Transactional(rollbackFor = Exception.class)
public class TrackService {
@Resource
private ExtTestCaseMapper extTestCaseMapper;
public List<TrackCountResult> countPriority(String projectId) {
return extTestCaseMapper.countPriority(projectId);
}
public long countCreatedThisWeek(String projectId) {
Map<String, Date> startAndEndDateInWeek = DateUtils.getWeedFirstTimeAndLastTime(new Date());
Date firstTime = startAndEndDateInWeek.get("firstTime");
Date lastTime = startAndEndDateInWeek.get("lastTime");
if (firstTime == null || lastTime == null) {
return 0;
} else {
return extTestCaseMapper.countCreatedThisWeek(projectId, firstTime.getTime(), lastTime.getTime());
}
}
public List<TrackCountResult> countStatus(String projectId) {
return extTestCaseMapper.countStatus(projectId);
}
}

View File

@ -1,17 +1,44 @@
<template> <template>
<ms-container> <ms-container>
<ms-main-container> <el-header height="0">
<el-row :gutter="20"> <div style="float: right">
<el-col :span="15"> <div v-if="tipsType==='1'">
<el-row> 🤔 天凉了保温杯买了吗
<related-test-plan-list ref="relatedTestPlanList"/> </div>
</el-row> <div v-else-if="tipsType==='2'">
<el-row> 😔 觉得MeterSphere不好用就来
<review-list :title="$t('test_track.review.my_review')" ref="caseReviewList"/> <el-link href="https://github.com/metersphere/metersphere/issues" target="_blank" style="color: black"
</el-row> type="primary">https://github.com/metersphere/metersphere/issues
</el-link>
吐个槽吧
</div>
<div v-else-if="tipsType==='3'">
😄 觉得MeterSphere好用就来
<el-link href="https://github.com/metersphere/metersphere" target="_blank" style="color: black"
type="primary">https://github.com/metersphere/metersphere
</el-link>
点个star吧
</div>
<div v-else>
😊 MeterSphere温馨提醒 多喝热水哟
</div>
</div>
</el-header>
<ms-main-container v-loading="result.loading">
<el-row :gutter="0"></el-row>
<el-row :gutter="10">
<el-col :span="6">
<div class="square">
<case-count-card :track-count-data="trackCountData" class="track-card"/>
</div>
</el-col> </el-col>
<el-col :span="9"> <el-col :span="6">
<test-case-side-list :title="$t('test_track.home.recent_test')" ref="testCaseRecentList"/> <div class="square">
<relevance-case-card class="track-card"/>
</div>
</el-col>
<el-col :span="12">
<div class="square">3</div>
</el-col> </el-col>
</el-row> </el-row>
</ms-main-container> </ms-main-container>
@ -19,39 +46,68 @@
</template> </template>
<script> <script>
import RelatedTestPlanList from "./components/RelatedTestPlanList";
import TestCaseSideList from "./components/TestCaseSideList"; import MsMainContainer from "@/business/components/common/components/MsMainContainer";
import MsContainer from "../../common/components/MsContainer"; import MsContainer from "@/business/components/common/components/MsContainer";
import MsMainContainer from "../../common/components/MsMainContainer"; import CaseCountCard from "@/business/components/track/home/components/CaseCountCard";
import ReviewList from "./components/ReviewList"; import RelevanceCaseCard from "@/business/components/track/home/components/RelevanceCaseCard";
import {getCurrentProjectID} from "@/common/js/utils";
export default { export default {
name: "TrackHome", name: "TrackHome",
components: {MsMainContainer, MsContainer, TestCaseSideList, RelatedTestPlanList, ReviewList}, components: {
watch: { RelevanceCaseCard,
'$route'(to, from) { CaseCountCard,
if (to.path.indexOf('/track/home') > -1) { MsMainContainer,
this.innitData(); MsContainer
} },
data() {
return {
tipsType: "1",
result: {},
trackCountData: {}
} }
}, },
activated() {
this.checkTipsType();
this.init();
},
methods: { methods: {
innitData() { checkTipsType() {
this.$refs.relatedTestPlanList.initTableData(); let random = Math.floor(Math.random() * (4 - 1 + 1)) + 1;
this.$refs.testCaseRecentList.initTableData(); this.tipsType = random + "";
this.$refs.caseReviewList.initTableData(); },
init() {
let selectProjectId = getCurrentProjectID();
this.$get("/track/count/" + selectProjectId, response => {
this.trackCountData = response.data;
});
} }
} }
} }
</script> </script>
<style scoped> <style scoped>
.square {
background-color: #ecf0f3;
width: 100%;
height: 400px;
}
.ms-main-container >>> .el-table { .rectangle {
cursor: pointer; background-color: #e7e5e5;
width: 100%;
height: 400px;
} }
.el-row { .el-row {
padding-bottom: 20px; margin-bottom: 20px;
margin-left: 20px;
margin-right: 20px;
}
.track-card {
height: 100%;
} }
</style> </style>

View File

@ -0,0 +1,191 @@
<template>
<el-card class="table-card" v-loading="result.loading" body-style="padding:10px;">
<div slot="header" >
<span class="title">
用例数量统计
</span>
</div>
<el-container>
<el-aside width="120px">
<div class="main-number-show">
<span class="count-number">
{{trackCountData.allCaseCountNumber}}
</span>
<span style="color: #6C317C;">
{{$t('api_test.home_page.unit_of_measurement')}}
</span>
</div>
</el-aside>
<el-main style="padding-left: 0px;padding-right: 0px;">
<div style="width: 200px;margin:0 auto">
<el-row align="center">
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="trackCountData.p0CountStr"></div>
</el-col>
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="trackCountData.p1CountStr"></div>
</el-col>
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="trackCountData.p2CountStr"></div>
</el-col>
<el-col :span="6" style="padding: 5px;">
<div class="count-info-div" v-html="trackCountData.p3CountStr"></div>
</el-col>
</el-row>
<!-- <el-row align="right" style="margin-left: 20px" class="hidden-xl-only">-->
<!-- <el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">-->
<!-- <div class="count-info-div" v-html="trackCountData.p0CountStr"></div>-->
<!-- </el-col>-->
<!-- <el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">-->
<!-- <div class="count-info-div" v-html="trackCountData.p1CountStr"></div>-->
<!-- </el-col>-->
<!-- <el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">-->
<!-- <div class="count-info-div" v-html="trackCountData.p2CountStr"></div>-->
<!-- </el-col>-->
<!-- <el-col :span="6" style="padding: 5px;">-->
<!-- <div class="count-info-div" v-html="trackCountData.p3CountStr"></div>-->
<!-- </el-col>-->
<!-- </el-row>-->
</div>
</el-main>
</el-container>
<el-container class="detail-container">
<el-header style="height:20px;padding: 0px;margin-bottom: 10px;">
<el-row>
<el-col>
{{$t('api_test.home_page.api_details_card.this_week_add')}}
<el-link type="info" @click="redirectPage('thisWeekCount')" target="_blank" style="color: #000000">{{trackCountData.thisWeekAddedCount}}
</el-link>
{{$t('api_test.home_page.unit_of_measurement')}}
</el-col>
</el-row>
</el-header>
<el-main style="padding: 5px;margin-top: 10px">
<el-container>
<el-aside width="60%" class="count-number-show" style="margin-bottom: 0px;margin-top: 0px">
<el-container>
<el-aside width="30%">
{{$t('api_test.home_page.detail_card.rate.completion')+":"}}
</el-aside>
<el-main style="padding: 0px 0px 0px 0px; line-height: 100px; text-align: center;">
<span class="count-number">
{{trackCountData.reviewRage}}
</span>
</el-main>
</el-container>
</el-aside>
<el-main style="padding: 5px">
<el-card class="no-shadow-card" body-style="padding-left:5px;padding-right:5px">
<main>
<el-row>
<el-col>
<span class="default-property">
{{$t('api_test.home_page.detail_card.running')}}
{{"\xa0\xa0"}}
<el-link type="info" @click="redirectPage('Underway')" target="_blank" style="color: #000000">
{{trackCountData.prepareCount}}
</el-link>
</span>
</el-col>
<el-col style="margin-top: 5px;">
<span class="default-property">
{{$t('api_test.home_page.detail_card.not_started')}}
{{"\xa0\xa0"}}
<el-link type="info" @click="redirectPage('Prepare')" target="_blank" style="color: #000000">
{{trackCountData.passCount}}
</el-link>
</span>
</el-col>
<el-col style="margin-top: 5px;">
<span class="main-property">
{{$t('api_test.home_page.detail_card.finished')}}
{{"\xa0\xa0"}}
<el-link type="info" @click="redirectPage('Completed')" target="_blank" style="color: #000000">
{{trackCountData.unPassCount}}
</el-link>
</span>
</el-col>
</el-row>
</main>
</el-card>
</el-main>
</el-container>
</el-main>
</el-container>
</el-card>
</template>
<script>
export default {
name: "CaseCountCard",
props:{
trackCountData: {},
},
data() {
return {
result: {
}
}
},
methods: {
redirectPage(clickType){
this.$emit("redirectPage","api","api",clickType);
}
}
}
</script>
<style scoped>
.el-aside {
line-height: 100px;
text-align: center;
}
.count-number{
font-family:'ArialMT', 'Arial', sans-serif;
font-size:33px;
color: var(--count_number);
}
.main-number-show {
width: 100px;
height: 100px;
border-style: solid;
border-width: 7px;
border-color: var(--count_number_shallow);
border-radius:50%;
}
.count-number-show{
margin:20px auto;
}
.detail-container{
margin-top: 30px
}
.no-shadow-card{
-webkit-box-shadow: 0 0px 0px 0 rgba(0,0,0,.1);
box-shadow: 0 0px 0px 0 rgba(0,0,0,.1);
}
.default-property{
font-size: 12px
}
.main-property{
color: #F39021;
font-size: 12px
}
.el-card /deep/ .el-card__header {
border-bottom: 0px solid #EBEEF5;
}
.count-info-div{
margin: 3px;
}
.count-info-div >>>p{
font-size: 10px;
}
</style>

View File

@ -0,0 +1,191 @@
<template>
<el-card class="table-card" v-loading="result.loading" body-style="padding:10px;">
<div slot="header" >
<span class="title">
用例数量统计
</span>
</div>
<el-container>
<el-aside width="120px">
<div class="main-number-show">
<span class="count-number">
{{caseCountData}}
</span>
<span style="color: #6C317C;">
{{$t('api_test.home_page.unit_of_measurement')}}
</span>
</div>
</el-aside>
<el-main style="padding-left: 0px;padding-right: 0px;">
<div style="width: 200px;margin:0 auto">
<el-row align="center" class="hidden-lg-and-down">
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="1"></div>
</el-col>
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="2"></div>
</el-col>
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="3"></div>
</el-col>
<el-col :span="6" style="padding: 5px;">
<div class="count-info-div" v-html="4"></div>
</el-col>
</el-row>
<el-row align="right" style="margin-left: 20px" class="hidden-xl-only">
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="5"></div>
</el-col>
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="6"></div>
</el-col>
<el-col :span="6" style="padding: 5px;border-right-style: solid;border-right-width: 1px;border-right-color: #ECEEF4;">
<div class="count-info-div" v-html="7"></div>
</el-col>
<el-col :span="6" style="padding: 5px;">
<div class="count-info-div" v-html="8"></div>
</el-col>
</el-row>
</div>
</el-main>
</el-container>
<el-container class="detail-container">
<el-header style="height:20px;padding: 0px;margin-bottom: 10px;">
<el-row>
<el-col>
{{$t('api_test.home_page.api_details_card.this_week_add')}}
<el-link type="info" @click="redirectPage('thisWeekCount')" target="_blank" style="color: #000000">{{caseCountData}}
</el-link>
{{$t('api_test.home_page.unit_of_measurement')}}
</el-col>
</el-row>
</el-header>
<el-main style="padding: 5px;margin-top: 10px">
<el-container>
<el-aside width="60%" class="count-number-show" style="margin-bottom: 0px;margin-top: 0px">
<el-container>
<el-aside width="30%">
{{$t('api_test.home_page.detail_card.rate.completion')+":"}}
</el-aside>
<el-main style="padding: 0px 0px 0px 0px; line-height: 100px; text-align: center;">
<span class="count-number">
{{caseCountData}}
</span>
</el-main>
</el-container>
</el-aside>
<el-main style="padding: 5px">
<el-card class="no-shadow-card" body-style="padding-left:5px;padding-right:5px">
<main>
<el-row>
<el-col>
<span class="default-property">
{{$t('api_test.home_page.detail_card.running')}}
{{"\xa0\xa0"}}
<el-link type="info" @click="redirectPage('Underway')" target="_blank" style="color: #000000">
{{caseCountData}}
</el-link>
</span>
</el-col>
<el-col style="margin-top: 5px;">
<span class="default-property">
{{$t('api_test.home_page.detail_card.not_started')}}
{{"\xa0\xa0"}}
<el-link type="info" @click="redirectPage('Prepare')" target="_blank" style="color: #000000">
{{caseCountData}}
</el-link>
</span>
</el-col>
<el-col style="margin-top: 5px;">
<span class="main-property">
{{$t('api_test.home_page.detail_card.finished')}}
{{"\xa0\xa0"}}
<el-link type="info" @click="redirectPage('Completed')" target="_blank" style="color: #000000">
{{caseCountData}}
</el-link>
</span>
</el-col>
</el-row>
</main>
</el-card>
</el-main>
</el-container>
</el-main>
</el-container>
</el-card>
</template>
<script>
export default {
name: "RelevanceCaseCard",
props:{
caseCountData:{},
},
data() {
return {
result: {
}
}
},
methods: {
redirectPage(clickType){
this.$emit("redirectPage","api","api",clickType);
}
}
}
</script>
<style scoped>
.el-aside {
line-height: 100px;
text-align: center;
}
.count-number{
font-family:'ArialMT', 'Arial', sans-serif;
font-size:33px;
color: var(--count_number);
}
.main-number-show {
width: 100px;
height: 100px;
border-style: solid;
border-width: 7px;
border-color: var(--count_number_shallow);
border-radius:50%;
}
.count-number-show{
margin:20px auto;
}
.detail-container{
margin-top: 30px
}
.no-shadow-card{
-webkit-box-shadow: 0 0px 0px 0 rgba(0,0,0,.1);
box-shadow: 0 0px 0px 0 rgba(0,0,0,.1);
}
.default-property{
font-size: 12px
}
.main-property{
color: #F39021;
font-size: 12px
}
.el-card /deep/ .el-card__header {
border-bottom: 0px solid #EBEEF5;
}
.count-info-div{
margin: 3px;
}
.count-info-div >>>p{
font-size: 10px;
}
</style>