1 changed files with 398 additions and 0 deletions
@ -0,0 +1,398 @@ |
|||||
|
<template> |
||||
|
<div class="dashboard-container"> |
||||
|
<div class="left-view"> |
||||
|
<div class="project-select-view"> |
||||
|
<div style="width: 140px;"> |
||||
|
<p class="tag-title">回收概览</p> |
||||
|
</div> |
||||
|
<div style="margin-left: 30px;"> |
||||
|
<el-select v-model="activeProjectKey" |
||||
|
placeholder="请选择" |
||||
|
@change="projectChangeHandle" |
||||
|
> |
||||
|
<el-option |
||||
|
v-for="item in projectListData" |
||||
|
:key="item.key" |
||||
|
:label="item.name" |
||||
|
:value="item.key" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="project-collect-view"> |
||||
|
<div class="project-index-view"> |
||||
|
<div style="display: flex; |
||||
|
width: 80%; |
||||
|
text-align: center; |
||||
|
margin: 0 auto; |
||||
|
justify-content: space-between;" |
||||
|
> |
||||
|
<div> |
||||
|
<p style="text-align: center;">有效回收量</p> |
||||
|
<count-to :end-val="projectStats.completeCount" |
||||
|
style="font-size: 20px;" |
||||
|
/> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p>总浏览量</p> |
||||
|
<count-to :end-val="projectStats.viewCount" style="font-size: 20px;" /> |
||||
|
</div> |
||||
|
<div> |
||||
|
<p>回收率</p> |
||||
|
<count-to :end-val="projectStats.completeRate" style="font-size: 20px;" /> |
||||
|
% |
||||
|
</div> |
||||
|
<div> |
||||
|
<p>平均完成时间</p> |
||||
|
<span style="font-size: 20px;"> |
||||
|
{{ projectStats.avgCompleteFormatStr }} |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div> |
||||
|
<line-chart :chart-option="lineChartOptionData" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="right-view"> |
||||
|
<div style="width: 230px;"> |
||||
|
<p class="tag-title">表单提交地域分布图</p> |
||||
|
</div> |
||||
|
<div style="width: 100%;"> |
||||
|
<map-chart :chart-option="mapChartOptionData" :height="'250px'" /> |
||||
|
</div> |
||||
|
<div style="display: flex; flex-direction: row; justify-content: space-around;"> |
||||
|
<div style="width: 50%;"> |
||||
|
<div style="width: 120px;"> |
||||
|
<p class="tag-title">常用设备</p> |
||||
|
</div> |
||||
|
<div> |
||||
|
<pie-chart :chart-option="pieChartOptionData" :height="'250px'" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width: 50%;"> |
||||
|
<div style="width: 120px;"> |
||||
|
<p class="tag-title">来源渠道</p> |
||||
|
</div> |
||||
|
<div> |
||||
|
<bar-chart :chart-option="barChartOptionData" :height="'250px'" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
import PieChart from '@/components/echarts/PieChart' |
||||
|
import LineChart from '@/components/echarts/LineChart' |
||||
|
import MapChart from '@/components/echarts/MapChart' |
||||
|
import CountTo from '@/components/CountTo' |
||||
|
import BarChart from '@/components/echarts/BarChart' |
||||
|
import {timeFormat} from '@/utils/index' |
||||
|
|
||||
|
export default { |
||||
|
name: 'HomeDashboard', |
||||
|
components: { |
||||
|
CountTo, |
||||
|
MapChart, |
||||
|
PieChart, |
||||
|
BarChart, |
||||
|
LineChart |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
projectListData: null, |
||||
|
projectStats: { |
||||
|
avgCompleteTime: 0, |
||||
|
avgCompleteFormatStr: 0, |
||||
|
viewCount: 0, |
||||
|
completeCount: 0, |
||||
|
completeRate: 0 |
||||
|
}, |
||||
|
activeProjectKey: null, |
||||
|
// 回收折现图 |
||||
|
lineChartOptionData: { |
||||
|
xAxis: { |
||||
|
type: 'category', |
||||
|
boundaryGap: false, |
||||
|
axisTick: { |
||||
|
show: false |
||||
|
}, |
||||
|
data: [] |
||||
|
}, |
||||
|
tooltip: { |
||||
|
trigger: 'axis', |
||||
|
backgroundColor: 'rgba(255,255,255,0.8)', // 通过设置rgba调节背景颜色与透明度 |
||||
|
color: 'black', |
||||
|
borderWidth: '1', |
||||
|
borderColor: 'rgb(156,209,255)', |
||||
|
textStyle: { |
||||
|
color: 'black' |
||||
|
} |
||||
|
}, |
||||
|
yAxis: { |
||||
|
type: 'value', |
||||
|
minInterval: 1 |
||||
|
}, |
||||
|
grid: { |
||||
|
left: '3%', |
||||
|
right: '4%', |
||||
|
bottom: '3%', |
||||
|
containLabel: true |
||||
|
}, |
||||
|
series: [{ |
||||
|
data: [], |
||||
|
name: '回收数', |
||||
|
stack: '总量', |
||||
|
type: 'line', |
||||
|
areaStyle: {} |
||||
|
}] |
||||
|
}, |
||||
|
mapChartOptionData: { |
||||
|
tooltip: { |
||||
|
trigger: 'item', |
||||
|
backgroundColor: 'rgba(255,255,255,0.8)', // 通过设置rgba调节背景颜色与透明度 |
||||
|
color: 'black', |
||||
|
borderWidth: '1', |
||||
|
borderColor: 'rgb(156,209,255)', |
||||
|
textStyle: { |
||||
|
color: 'black' |
||||
|
} |
||||
|
}, |
||||
|
visualMap: { |
||||
|
type: 'piecewise', |
||||
|
show: false, |
||||
|
pieces: [ |
||||
|
{min: 1500}, |
||||
|
{min: 900, max: 1500}, |
||||
|
{min: 310, max: 1000}, |
||||
|
{min: 1, max: 300} |
||||
|
], |
||||
|
color: ['#E0022B', '#E09107', '#A3E00B'] |
||||
|
}, |
||||
|
toolbox: { |
||||
|
show: false, |
||||
|
orient: 'vertical', |
||||
|
left: 'right', |
||||
|
top: 'center', |
||||
|
feature: { |
||||
|
restore: {}, |
||||
|
saveAsImage: {} |
||||
|
} |
||||
|
}, |
||||
|
series: [ |
||||
|
{ |
||||
|
name: '提交数', |
||||
|
type: 'map', |
||||
|
mapType: 'china', |
||||
|
zoom: 1.2, |
||||
|
roam: false, |
||||
|
label: { |
||||
|
show: false, |
||||
|
color: 'rgb(0,0,0)' |
||||
|
}, |
||||
|
data: null |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
barChartOptionData: { |
||||
|
tooltip: { |
||||
|
trigger: 'axis', |
||||
|
backgroundColor: 'rgba(255,255,255,0.8)', // 通过设置rgba调节背景颜色与透明度 |
||||
|
color: 'black', |
||||
|
borderWidth: '1', |
||||
|
borderColor: 'rgb(156,209,255)', |
||||
|
textStyle: { |
||||
|
color: 'black' |
||||
|
}, |
||||
|
axisPointer: { |
||||
|
type: 'shadow' |
||||
|
} |
||||
|
}, |
||||
|
grid: { |
||||
|
left: '3%', |
||||
|
right: '4%', |
||||
|
bottom: '3%', |
||||
|
containLabel: true |
||||
|
}, |
||||
|
xAxis: { |
||||
|
type: 'value', |
||||
|
boundaryGap: [0, 0.01] |
||||
|
}, |
||||
|
yAxis: { |
||||
|
type: 'category', |
||||
|
data: [] |
||||
|
}, |
||||
|
series: [ |
||||
|
{ |
||||
|
barWidth: 30, |
||||
|
name: '数量', |
||||
|
type: 'bar', |
||||
|
data: [] |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
pieChartOptionData: { |
||||
|
tooltip: { |
||||
|
trigger: 'item', |
||||
|
backgroundColor: 'rgba(255,255,255,0.8)', // 通过设置rgba调节背景颜色与透明度 |
||||
|
color: 'black', |
||||
|
borderWidth: '1', |
||||
|
borderColor: 'rgb(156,209,255)', |
||||
|
textStyle: { |
||||
|
color: 'black' |
||||
|
} |
||||
|
}, |
||||
|
series: [ |
||||
|
{ |
||||
|
name: '设备类型', |
||||
|
type: 'pie', |
||||
|
radius: ['50%', '70%'], |
||||
|
avoidLabelOverlap: false, |
||||
|
label: { |
||||
|
show: false, |
||||
|
position: 'center' |
||||
|
}, |
||||
|
emphasis: { |
||||
|
label: { |
||||
|
show: true, |
||||
|
fontSize: '30', |
||||
|
fontWeight: 'bold' |
||||
|
} |
||||
|
}, |
||||
|
labelLine: { |
||||
|
show: false |
||||
|
}, |
||||
|
data: null |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
created() { |
||||
|
this.$api.get('/user/project/list', {params: {status: 2}}).then(res => { |
||||
|
this.projectListData = res.data |
||||
|
if (res.data && res.data[0]) { |
||||
|
this.activeProjectKey = res.data[0].key |
||||
|
this.projectChangeHandle() |
||||
|
} |
||||
|
}) |
||||
|
}, methods: { |
||||
|
projectChangeHandle() { |
||||
|
this.getProjectStats() |
||||
|
this.getProjectSituation() |
||||
|
this.getProjectSubmitPosition() |
||||
|
this.getProjectSubmitDevice() |
||||
|
this.getProjectSubmitSource() |
||||
|
}, |
||||
|
getProjectStats() { |
||||
|
this.$api.get('/user/project/report/stats', {params: {projectKey: this.activeProjectKey}}).then(res => { |
||||
|
this.projectStats = res.data |
||||
|
if (this.projectStats.completeCount) { |
||||
|
let rate = this.projectStats.completeCount / this.projectStats.viewCount |
||||
|
this.projectStats.completeRate = rate > 1 ? 100 : rate * 100 |
||||
|
this.projectStats.avgCompleteFormatStr = timeFormat(this.projectStats.avgCompleteTime) |
||||
|
} else { |
||||
|
this.projectStats.completeRate = 0 |
||||
|
this.projectStats.avgCompleteFormatStr = 0 |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
getProjectSituation() { |
||||
|
this.$api.get('/user/project/report/situation', {params: {projectKey: this.activeProjectKey}}).then(res => { |
||||
|
this.lineChartOptionData.xAxis.data = res.data.map(item => { |
||||
|
return item.createTime |
||||
|
}) |
||||
|
this.lineChartOptionData.series = [{ |
||||
|
data: res.data.map(item => { |
||||
|
return item.count |
||||
|
}), |
||||
|
name: '回收数', |
||||
|
stack: '总量', |
||||
|
type: 'line', |
||||
|
areaStyle: {} |
||||
|
}] |
||||
|
}) |
||||
|
}, |
||||
|
// 项目提交地址 |
||||
|
getProjectSubmitPosition() { |
||||
|
this.$api.get('/user/project/report/position', {params: {projectKey: this.activeProjectKey}}).then(res => { |
||||
|
this.mapChartOptionData.series = [ |
||||
|
{ |
||||
|
name: '提交数', |
||||
|
type: 'map', |
||||
|
mapType: 'china', |
||||
|
zoom: 1.2, |
||||
|
roam: false, |
||||
|
label: { |
||||
|
show: false, |
||||
|
color: 'rgb(0,0,0)' |
||||
|
}, |
||||
|
data: Object.keys(res.data).map(key => { |
||||
|
return {name: key.replace(/省(s?)|市(s?)|\//ig, ''), value: res.data[key]} |
||||
|
}) |
||||
|
} |
||||
|
] |
||||
|
}) |
||||
|
}, |
||||
|
getProjectSubmitSource() { |
||||
|
this.$api.get('/user/project/report/source', {params: {projectKey: this.activeProjectKey}}).then(res => { |
||||
|
this.barChartOptionData.yAxis.data = res.data.map(item => { |
||||
|
return item.browserName ? item.browserName : '其他' |
||||
|
}) |
||||
|
this.barChartOptionData.series = [ |
||||
|
{ |
||||
|
barWidth: 30, |
||||
|
name: '数量', |
||||
|
type: 'bar', |
||||
|
data: res.data.map(item => { |
||||
|
return item.count |
||||
|
}) |
||||
|
} |
||||
|
] |
||||
|
}) |
||||
|
}, |
||||
|
getProjectSubmitDevice() { |
||||
|
this.$api.get('/user/project/report/device', {params: {projectKey: this.activeProjectKey}}).then(res => { |
||||
|
this.pieChartOptionData.series[0].data = res.data.map(item => { |
||||
|
return {value: item.count, name: item.osName ? item.osName : '其他'} |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.dashboard-container { |
||||
|
min-width: 980px; |
||||
|
display: flex; |
||||
|
align-content: center; |
||||
|
margin: 35px auto; |
||||
|
flex-wrap: wrap; |
||||
|
justify-content: space-around; |
||||
|
} |
||||
|
.tag-title { |
||||
|
font-size: 20px; |
||||
|
border-bottom: 3px solid rgba(68, 68, 68, 100); |
||||
|
line-height: 25px; |
||||
|
margin: 10px; |
||||
|
} |
||||
|
.project-select-view { |
||||
|
display: flex; |
||||
|
align-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.project-collect-view { |
||||
|
width: 730px; |
||||
|
height: 500px; |
||||
|
border-radius: 10px; |
||||
|
border: 1px solid rgba(187, 187, 187, 100); |
||||
|
} |
||||
|
.right-view { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
min-width: 30%; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue