Files
dvcp_v2_webapp/project/qujing/app/AppLearningStatistics/AppLearningStatistics.vue
2023-05-11 13:57:09 +08:00

444 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<ai-list class="AppLearningStatistics">
<template slot="title">
<ai-title title="学习统计" isShowBottomBorder isShowArea :hideLevel="user.info.areaList.length - 1" v-model="areaId" :instance="instance" @change="onChange()"></ai-title>
</template>
<template slot="content">
<ai-card title="关键数据">
<template #right>
<el-radio-group v-model="search1.dateRange" size="small" @change="search1.date = [], getStatisticsKeyData()">
<el-radio-button label="0">今天</el-radio-button>
<el-radio-button label="1">本周</el-radio-button>
<el-radio-button label="2">本月</el-radio-button>
</el-radio-group>
<el-date-picker
style="width: 240px"
v-model="search1.date"
value-format="yyyy-MM-dd"
@change="search1.dateRange = '', getStatisticsKeyData()"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
size="small">
</el-date-picker>
</template>
<template #content>
<div class="statistic ">
<div class="statistic-item">
<h2>课程数量</h2>
<div class="bottom">
<div class="bottom-item">
<h3>{{ statisticsKeyData['视频课程'] }}</h3>
<p>视频课程</p>
</div>
<div class="bottom-item">
<h3>{{ statisticsKeyData['图文课程'] }}</h3>
<p>图文课程</p>
</div>
</div>
</div>
<div class="statistic-item">
<h2>课程学习人数</h2>
<div class="bottom">
<div class="bottom-item">
<h3>{{ statisticsKeyData['课程学习人数'] }}</h3>
</div>
</div>
</div>
<div class="statistic-item">
<h2>课程累积学习时长</h2>
<div class="bottom">
<div class="bottom-item">
<h3>{{ statisticsKeyData['课程累积学习时长'] || 0 }}</h3>
</div>
</div>
</div>
<div class="statistic-item">
<h2>考试人次</h2>
<div class="bottom">
<div class="bottom-item">
<h3>{{ statisticsKeyData['学富五车'] }}</h3>
<p>学富五车</p>
</div>
<div class="bottom-item">
<h3>{{ statisticsKeyData['才高八斗'] }}</h3>
<p>才高八斗</p>
</div>
<div class="bottom-item">
<h3>{{ statisticsKeyData['合格'] }}</h3>
<p>合格</p>
</div>
<div class="bottom-item">
<h3>{{ statisticsKeyData['不合格'] }}</h3>
<p>不合格</p>
</div>
</div>
</div>
<div class="statistic-item">
<h2>获得证书人数</h2>
<div class="bottom">
<div class="bottom-item">
<h3>{{ statisticsKeyData['获得证书人数'] }}</h3>
<ai-download
:instance="instance"
url="/app/appcertificateinfo/exportUserInfo"
:params="{
...search1,
areaId
}"
fileName="证书统计">
<el-button icon="iconfont iconExported">导出</el-button>
</ai-download>
</div>
</div>
</div>
</div>
</template>
</ai-card>
<div class="middle">
<ai-card class="rank-card" title="热度榜单">
<template #title>
<div class="rank-title">
<h2>热度榜单</h2>
<el-radio-group v-model="type" size="small" @change="search2.date = [], getStatisticsHot()">
<el-radio-button :label="0">课程</el-radio-button>
<el-radio-button :label="1">考试</el-radio-button>
</el-radio-group>
</div>
</template>
<template #right>
<el-radio-group v-model="search2.dateRange" size="small" @change="search2.date = [], getStatisticsHot()">
<el-radio-button label="0" >今天</el-radio-button>
<el-radio-button label="1">本周</el-radio-button>
<el-radio-button label="2">本月</el-radio-button>
</el-radio-group>
<el-date-picker
style="width: 240px"
v-model="search2.date"
value-format="yyyy-MM-dd"
@change="search2.dateRange = '', getStatisticsHot()"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
size="small">
</el-date-picker>
</template>
<template #content>
<ai-table
v-if="type === 0"
:tableData="tableData1"
:col-configs="colConfigs1"
:isShowPagination="false"
style="margin-top: 6px;"
@getList="getStatisticsHot">
</ai-table>
<ai-table
v-else
:tableData="tableData2"
:isShowPagination="false"
:col-configs="colConfigs2"
style="margin-top: 6px;"
@getList="getStatisticsHot">
</ai-table>
</template>
</ai-card>
<ai-card class="resident" title="居民统计">
<template #right>
<el-radio-group v-model="search4.dateRange" size="small" @change="search4.date = [], getStatisticsUse()">
<el-radio-button label="0" >今天</el-radio-button>
<el-radio-button label="1">本周</el-radio-button>
<el-radio-button label="2">本月</el-radio-button>
</el-radio-group>
<el-date-picker
style="width: 240px"
v-model="search4.date"
value-format="yyyy-MM-dd"
@change="search4.dateRange = '', getStatisticsUse()"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
size="small">
</el-date-picker>
</template>
<template #content>
<div class="chart" style="width: 100%; height: 340px"></div>
</template>
</ai-card>
</div>
</template>
</ai-list>
</template>
<script>
import { mapState } from 'vuex'
import * as echarts from 'echarts'
export default {
name: 'AppLearningStatistics',
label: '学习统计',
props: {
instance: Function,
dict: Object
},
data () {
return {
date: '',
today: '',
search1: {
title: '',
areaId: '',
dateRange: '1',
date: []
},
search2: {
areaId: '',
dateRange: '1',
date: []
},
search3: {
areaId: '',
dateRange: '1',
date: []
},
search4: {
areaId: '',
dateRange: '1',
date: []
},
type: 0,
colConfigs1: [
{ type: 'index', label: '排名', align: 'left' },
{ prop: 'name', label: '课程名称', align: 'center' },
{ prop: 'number', label: '学习人数', align: 'center' }
],
colConfigs2: [
{ type: 'index', label: '排名', align: 'left' },
{ prop: 'name', label: '考试名称', align: 'center' },
{ prop: 'number', label: '考试人次', align: 'center' }
],
tableData1: [],
tableData2: [],
statisticsKeyData: {},
statisticsUse: {},
areaId: ''
}
},
computed: {
...mapState(['user'])
},
created () {
this.areaId = this.user.info.areaId
this.getStatisticsKeyData()
this.getStatisticsHot()
this.getStatisticsUse()
},
methods: {
onChange () {
this.getStatisticsKeyData()
this.getStatisticsHot()
this.getStatisticsUse()
},
getStatisticsKeyData () {
this.instance.post(`/app/appexaminationinfo/statisticsKeyData`, null, {
params: {
...this.search1,
beginDate: this.search1.date ? this.search1.date[0] : '',
endDate: this.search1.date ? this.search1.date[1] : '',
areaId: this.areaId
}
}).then(res => {
if (res.code == 0) {
this.statisticsKeyData = res.data
}
})
},
getStatisticsUse () {
this.instance.post(`/app/appwechatuserqujing/statisticsUse`, null, {
params: {
...this.search4,
beginDate: this.search4.date ? this.search4.date[0] : '',
endDate: this.search4.date ? this.search4.date[1] : '',
areaId: this.areaId
}
}).then(res => {
if (res.code == 0) {
res.data.length && this.initPieChart(res.data[0])
}
})
},
getStatisticsHot () {
this.instance.post(`/app/appexaminationinfo/statisticsHot`, null, {
params: {
...this.search2,
size: 20,
areaId: this.areaId,
type: this.type,
beginDate: this.search2.date ? this.search2.date[0] : '',
endDate: this.search2.date ? this.search2.date[1] : '',
}
}).then(res => {
if (res.code == 0) {
if (this.type === 0) {
this.tableData1 = res.data
} else {
this.tableData2 = res.data
}
}
})
},
initPieChart (data) {
let chart = echarts.init(document.querySelector('.chart'))
const option = {
tooltip: {},
color: ['#2896FF', '#09DBFE', '#61FDB9', '#FFBB69', '#8429FF', '#ea7ccc'],
legend: {
show: true
},
series: [
{
type: 'pie',
radius: '50%',
data: Object.keys(data).map(v => {
return {
value: data[v],
name: v
}
}),
label : {
normal : {
formatter: '{b}{c}',
textStyle : {
fontWeight : 'normal',
fontSize : 15
}
}
}
}
]
}
chart.setOption(option)
}
}
}
</script>
<style lang="scss" scoped>
.AppLearningStatistics {
.right-search {
display: flex;
align-items: center;
div {
display: flex;
align-items: center;
}
span {
margin-right: 10px;
font-size: 14px;
color: #686868;
}
div:first-child {
margin-right: 20px;
}
}
.middle {
display: flex;
.rank-card {
flex: 1;
}
.resident {
width: 660px;
margin-left: 20px;
}
}
.rank-title {
display: flex;
align-items: center;
h2 {
margin-right: 32px;
color: #222;
font-size: 16px;
font-weight: 700;
}
}
:deep(.ai-list__content--right .ai-list__content--right-wrapper ) {
padding: 0!important;
background: transparent!important;
border-radius: 0!important;
box-shadow: none!important;
}
.statistic {
display: flex;
justify-content: space-between;
.statistic-item {
text-align: center;
line-height: 1;
h2 {
color: #333;
font-weight: 600;
font-size: 16px;
}
h3 {
font-size: 22px;
color: #FFA322;
}
p {
margin-top: 10px;
word-break: keep-all;
color: #777;
font-size: 14px;
}
.bottom {
display: flex;
align-items: center;
justify-content: center;
margin: 30px 0 10px;
.bottom-item {
flex: 1;
margin-right: 30px;
&:last-child {
margin-right: 0;
}
}
}
}
}
:deep( .ai-list__content--right ){
flex: 1;
min-width: 0;
margin-left: 1px;
box-shadow: none;
.ai-list__content--right-wrapper {
width: 100%;
}
}
}
</style>