|
|
@@ -12,19 +12,19 @@
|
|
|
<div class="filter-controls">
|
|
|
<div class="filter-group">
|
|
|
<label>选择课程</label>
|
|
|
- <a-select v-model:value="filters.courseId" placeholder="全部课程" @change="updateStats" :loading="loading">
|
|
|
- <a-select-option v-for="option in courseOptions" :key="option.value" :value="option.value">
|
|
|
- {{ option.label }}
|
|
|
+ <a-select v-model:value="filters.courseId" placeholder="全部课程" @change="updateStats" :loading="loading" allowClear>
|
|
|
+ <a-select-option v-for="option in courseOptions" :key="option.courseId" :value="option.courseId">
|
|
|
+ {{ option.courseName }}
|
|
|
</a-select-option>
|
|
|
</a-select>
|
|
|
</div>
|
|
|
<div class="filter-group">
|
|
|
<label>时间范围</label>
|
|
|
<a-select v-model:value="filters.timeRange" @change="updateStats">
|
|
|
- <a-select-option :value="7">最近7天</a-select-option>
|
|
|
- <a-select-option :value="30">最近30天</a-select-option>
|
|
|
- <a-select-option :value="90">最近90天</a-select-option>
|
|
|
- <a-select-option :value="365">最近一年</a-select-option>
|
|
|
+ <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>
|
|
|
</div>
|
|
|
<div class="filter-group">
|
|
|
@@ -37,21 +37,21 @@
|
|
|
<div class="stats-grid">
|
|
|
<div class="stat-card">
|
|
|
<h3>📖 文档观看统计</h3>
|
|
|
- <div class="stat-number">{{ stats.totalDocViewers.toLocaleString() }}</div>
|
|
|
+ <div class="stat-number">{{ stats.allUserCount }}</div>
|
|
|
<div class="stat-label">总观看人数</div>
|
|
|
- <div class="stat-number">{{ stats.completedDocViewers.toLocaleString() }}</div>
|
|
|
+ <div class="stat-number">{{ stats.alreadyUserCount }}</div>
|
|
|
<div class="stat-label">完成观看人数</div>
|
|
|
- <div class="completion-rate">{{ stats.docCompletionRate }}%</div>
|
|
|
+ <div class="completion-rate">{{ stats.finishRate }}%</div>
|
|
|
<div class="stat-label">完成率</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="stat-card">
|
|
|
<h3>🚪 文档跳出分析</h3>
|
|
|
- <div class="stat-number">{{ stats.totalDocExits.toLocaleString() }}</div>
|
|
|
+ <div class="stat-number">{{ stats.allHourCount }}</div>
|
|
|
<div class="stat-label">总跳出次数</div>
|
|
|
- <div class="stat-number">{{ stats.docExitRate }}%</div>
|
|
|
+ <div class="stat-number">{{ stats.allHourCount }}%</div>
|
|
|
<div class="stat-label">跳出率</div>
|
|
|
- <div class="stat-number">{{ stats.avgDocExitTime }}</div>
|
|
|
+ <div class="stat-number">{{ stats.jumpAvgTime }}</div>
|
|
|
<div class="stat-label">平均跳出时间</div>
|
|
|
</div>
|
|
|
|
|
|
@@ -129,6 +129,7 @@
|
|
|
import {
|
|
|
getCourseOptions,
|
|
|
getTeachingStats,
|
|
|
+ documentJumpStatistic,
|
|
|
getWeeklyStats,
|
|
|
getDailyVisits,
|
|
|
getDiscussionData,
|
|
|
@@ -138,7 +139,7 @@
|
|
|
// 响应式数据
|
|
|
const filters = reactive({
|
|
|
courseId: '',
|
|
|
- timeRange: 30
|
|
|
+ timeRange: 1
|
|
|
})
|
|
|
|
|
|
const stats = reactive({
|
|
|
@@ -429,9 +430,14 @@
|
|
|
try {
|
|
|
const response = await getTeachingStats({
|
|
|
courseId: filters.courseId,
|
|
|
- timeRange: filters.timeRange
|
|
|
+ type: filters.timeRange
|
|
|
})
|
|
|
- Object.assign(stats, response)
|
|
|
+ const statistic = await documentJumpStatistic({
|
|
|
+ courseId: filters.courseId,
|
|
|
+ type: filters.timeRange
|
|
|
+ })
|
|
|
+
|
|
|
+ Object.assign(stats, response, statistic)
|
|
|
} catch (error) {
|
|
|
console.error('获取统计数据失败:', error)
|
|
|
}
|
|
|
@@ -453,10 +459,11 @@
|
|
|
const loadDailyVisits = async () => {
|
|
|
try {
|
|
|
const response = await getDailyVisits({
|
|
|
- timeRange: filters.timeRange
|
|
|
+ type: filters.timeRange,
|
|
|
+ courseId:filters.courseId
|
|
|
})
|
|
|
- chartData.dates = response.dates
|
|
|
- chartData.visits = response.visits
|
|
|
+ chartData.dates = response.map(r=>r.TIME)
|
|
|
+ chartData.visits = response.map(r=>r.num)
|
|
|
updateChartData()
|
|
|
} catch (error) {
|
|
|
console.error('获取每日访问数据失败:', error)
|