|
@@ -26,12 +26,13 @@
|
|
|
</div>
|
|
</div>
|
|
|
<div class="filter-group">
|
|
<div class="filter-group">
|
|
|
<label>时间范围</label>
|
|
<label>时间范围</label>
|
|
|
- <a-select v-model:value="filters.timeRange" @change="updateStats">
|
|
|
|
|
- <a-select-option :value="1">最近30天</a-select-option>
|
|
|
|
|
- <a-select-option :value="2">最近90天</a-select-option>
|
|
|
|
|
- <a-select-option :value="3">最近180天</a-select-option>
|
|
|
|
|
- <a-select-option :value="4">最近一年</a-select-option>
|
|
|
|
|
- </a-select>
|
|
|
|
|
|
|
+<!-- <a-select v-model:value="filters.timeRange" @change="updateStats">-->
|
|
|
|
|
+<!-- <a-select-option :value="1">最近30天</a-select-option>-->
|
|
|
|
|
+<!-- <a-select-option :value="2">最近90天</a-select-option>-->
|
|
|
|
|
+<!-- <a-select-option :value="3">最近180天</a-select-option>-->
|
|
|
|
|
+<!-- <a-select-option :value="4">最近一年</a-select-option>-->
|
|
|
|
|
+<!-- </a-select>-->
|
|
|
|
|
+ <a-range-picker class="w-full" v-model:value="times" />
|
|
|
</div>
|
|
</div>
|
|
|
<div class="filter-group">
|
|
<div class="filter-group">
|
|
|
<a-button type="primary" @click="updateStats" :loading="loading">查询</a-button>
|
|
<a-button type="primary" @click="updateStats" :loading="loading">查询</a-button>
|
|
@@ -47,7 +48,7 @@
|
|
|
<div class="stat-label">总观看人数</div>
|
|
<div class="stat-label">总观看人数</div>
|
|
|
<div class="stat-number">{{ stats.alreadyUserCount }}</div>
|
|
<div class="stat-number">{{ stats.alreadyUserCount }}</div>
|
|
|
<div class="stat-label">完成观看人数</div>
|
|
<div class="stat-label">完成观看人数</div>
|
|
|
- <div class="completion-rate">{{ stats.finishRate }}%</div>
|
|
|
|
|
|
|
+ <div class="completion-rate">{{tool.formatValue(stats.finishRate) }}</div>
|
|
|
<div class="stat-label">完成率</div>
|
|
<div class="stat-label">完成率</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -55,7 +56,7 @@
|
|
|
<h3>🚪 文档跳出分析</h3>
|
|
<h3>🚪 文档跳出分析</h3>
|
|
|
<div class="stat-number">{{ stats.allHourCount }}</div>
|
|
<div class="stat-number">{{ stats.allHourCount }}</div>
|
|
|
<div class="stat-label">总跳出次数</div>
|
|
<div class="stat-label">总跳出次数</div>
|
|
|
- <div class="stat-number">{{ stats.allHourCount }}%</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{tool.formatValue(stats.allHourCount) }}</div>
|
|
|
<div class="stat-label">跳出率</div>
|
|
<div class="stat-label">跳出率</div>
|
|
|
<div class="stat-number">{{ stats.jumpAvgTime }}</div>
|
|
<div class="stat-number">{{ stats.jumpAvgTime }}</div>
|
|
|
<div class="stat-label">平均跳出时间</div>
|
|
<div class="stat-label">平均跳出时间</div>
|
|
@@ -130,7 +131,7 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
- import { ref, reactive, onMounted, nextTick, h } from 'vue'
|
|
|
|
|
|
|
+import {ref, reactive, onMounted, nextTick, h, computed} from 'vue'
|
|
|
import * as echarts from 'echarts'
|
|
import * as echarts from 'echarts'
|
|
|
import {
|
|
import {
|
|
|
getCourseOptions,
|
|
getCourseOptions,
|
|
@@ -142,12 +143,16 @@
|
|
|
getDocumentStats
|
|
getDocumentStats
|
|
|
} from '@/api/statisticalAnalysis/analysisTeachingActivities'
|
|
} from '@/api/statisticalAnalysis/analysisTeachingActivities'
|
|
|
import tool from '@/utils/tool'
|
|
import tool from '@/utils/tool'
|
|
|
|
|
+import dayjs from "dayjs";
|
|
|
|
|
+// 课程选项
|
|
|
|
|
+const courseOptions = ref([])
|
|
|
|
|
+const times = ref([])
|
|
|
const forumType = computed(() => (tool.dictList('FORUM_TYPE')[0].value == 1 ? true : false))
|
|
const forumType = computed(() => (tool.dictList('FORUM_TYPE')[0].value == 1 ? true : false))
|
|
|
- console.log('什么呢的',tool.dictList('FORUM_TYPE')[0])
|
|
|
|
|
// 响应式数据
|
|
// 响应式数据
|
|
|
const filters = reactive({
|
|
const filters = reactive({
|
|
|
- courseId: '',
|
|
|
|
|
- timeRange: 1
|
|
|
|
|
|
|
+ courseId: undefined,
|
|
|
|
|
+ startTime: computed(() => ( times.value && times.value[0] ? dayjs(times.value[0]).format('YYYY-MM-DD') : undefined)),
|
|
|
|
|
+ endTime: computed(() => (times.value && times.value[1] ? dayjs(times.value[1]).format('YYYY-MM-DD') : undefined))
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const stats = reactive({
|
|
const stats = reactive({
|
|
@@ -165,8 +170,7 @@
|
|
|
teacherAvgPostsPerDay: 0
|
|
teacherAvgPostsPerDay: 0
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- // 课程选项
|
|
|
|
|
- const courseOptions = ref([])
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
// 图表引用
|
|
// 图表引用
|
|
|
const dailyVisitsChart = ref(null)
|
|
const dailyVisitsChart = ref(null)
|
|
@@ -306,7 +310,7 @@
|
|
|
|
|
|
|
|
const option = {
|
|
const option = {
|
|
|
title: {
|
|
title: {
|
|
|
- text: `最近${days}天访问人数趋势`,
|
|
|
|
|
|
|
+ text: `最近一个月访问人数趋势`,
|
|
|
left: 'center',
|
|
left: 'center',
|
|
|
textStyle: {
|
|
textStyle: {
|
|
|
color: '#2c3e50',
|
|
color: '#2c3e50',
|
|
@@ -432,11 +436,13 @@
|
|
|
try {
|
|
try {
|
|
|
const response = await getTeachingStats({
|
|
const response = await getTeachingStats({
|
|
|
courseId: filters.courseId,
|
|
courseId: filters.courseId,
|
|
|
- type: filters.timeRange
|
|
|
|
|
|
|
+ startTime: filters.startTime,
|
|
|
|
|
+ endTime: filters.endTime,
|
|
|
})
|
|
})
|
|
|
const statistic = await documentJumpStatistic({
|
|
const statistic = await documentJumpStatistic({
|
|
|
courseId: filters.courseId,
|
|
courseId: filters.courseId,
|
|
|
- type: filters.timeRange
|
|
|
|
|
|
|
+ startTime: filters.startTime,
|
|
|
|
|
+ endTime: filters.endTime,
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
Object.assign(stats, response, statistic)
|
|
Object.assign(stats, response, statistic)
|
|
@@ -461,7 +467,6 @@
|
|
|
const loadDailyVisits = async () => {
|
|
const loadDailyVisits = async () => {
|
|
|
try {
|
|
try {
|
|
|
const response = await getDailyVisits({
|
|
const response = await getDailyVisits({
|
|
|
- type: filters.timeRange,
|
|
|
|
|
courseId: filters.courseId
|
|
courseId: filters.courseId
|
|
|
})
|
|
})
|
|
|
chartData.dates = response.map((r) => r.TIME)
|
|
chartData.dates = response.map((r) => r.TIME)
|
|
@@ -477,6 +482,8 @@
|
|
|
try {
|
|
try {
|
|
|
const response = await getDiscussionData({
|
|
const response = await getDiscussionData({
|
|
|
courseId: filters.courseId,
|
|
courseId: filters.courseId,
|
|
|
|
|
+ startTime: filters.startTime,
|
|
|
|
|
+ endTime: filters.endTime,
|
|
|
page: discussionPagination.current,
|
|
page: discussionPagination.current,
|
|
|
pageSize: discussionPagination.pageSize
|
|
pageSize: discussionPagination.pageSize
|
|
|
})
|
|
})
|
|
@@ -494,7 +501,8 @@
|
|
|
courseId: filters.courseId,
|
|
courseId: filters.courseId,
|
|
|
page: documentPagination.current,
|
|
page: documentPagination.current,
|
|
|
pageSize: documentPagination.pageSize,
|
|
pageSize: documentPagination.pageSize,
|
|
|
- type: filters.timeRange
|
|
|
|
|
|
|
+ startTime: filters.startTime,
|
|
|
|
|
+ endTime: filters.endTime,
|
|
|
})
|
|
})
|
|
|
documentData.value = response
|
|
documentData.value = response
|
|
|
documentPagination.total = response.total
|
|
documentPagination.total = response.total
|