|
@@ -59,21 +59,21 @@
|
|
|
|
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-card">
|
|
|
<h3>👥 用户登录统计</h3>
|
|
<h3>👥 用户登录统计</h3>
|
|
|
- <div class="stat-number">{{ collegeStats.totalLogins.toLocaleString() }}</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{ collegeStats.allLoginCount.toLocaleString() }}</div>
|
|
|
<div class="stat-label">总登录人次</div>
|
|
<div class="stat-label">总登录人次</div>
|
|
|
- <div class="stat-number">{{ collegeStats.uniqueUsers.toLocaleString() }}</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{ collegeStats.userCount.toLocaleString() }}</div>
|
|
|
<div class="stat-label">独立用户数</div>
|
|
<div class="stat-label">独立用户数</div>
|
|
|
- <div class="stat-number">{{ collegeStats.avgLoginPerUser }}</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{ collegeStats.avgLoginCount }}</div>
|
|
|
<div class="stat-label">人均登录次数</div>
|
|
<div class="stat-label">人均登录次数</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-card">
|
|
|
<h3>⏰ 观看时长统计</h3>
|
|
<h3>⏰ 观看时长统计</h3>
|
|
|
- <div class="stat-number">{{ collegeStats.totalOnlineTime }}h</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{ collegeStats.userAllStayTime }}</div>
|
|
|
<div class="stat-label">总观看时长</div>
|
|
<div class="stat-label">总观看时长</div>
|
|
|
- <div class="stat-number">{{ collegeStats.avgSessionTime }}min</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{ collegeStats.avgStayTime }}</div>
|
|
|
<div class="stat-label">平均时长</div>
|
|
<div class="stat-label">平均时长</div>
|
|
|
- <div class="stat-number">{{ collegeStats.peakOnlineUsers }}</div>
|
|
|
|
|
|
|
+ <div class="stat-number">{{ collegeStats.peakWatchUserCount ? peakWatchUserCount.toLocaleString() : '0' }}</div>
|
|
|
<div class="stat-label">峰值观看人数</div>
|
|
<div class="stat-label">峰值观看人数</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -125,41 +125,41 @@
|
|
|
<div class="student-cards">
|
|
<div class="student-cards">
|
|
|
<div
|
|
<div
|
|
|
v-for="student in filteredStudents"
|
|
v-for="student in filteredStudents"
|
|
|
- :key="student.id"
|
|
|
|
|
|
|
+ :key="student.userId"
|
|
|
class="student-card"
|
|
class="student-card"
|
|
|
:class="{ highlighted: student.highlighted }"
|
|
:class="{ highlighted: student.highlighted }"
|
|
|
>
|
|
>
|
|
|
<div class="student-header">
|
|
<div class="student-header">
|
|
|
<div class="student-info">
|
|
<div class="student-info">
|
|
|
- <h4>{{ student.name }} ({{ student.studentId }})</h4>
|
|
|
|
|
- <div class="student-meta">{{ student.college }} | {{ student.major }} | {{ student.grade }}</div>
|
|
|
|
|
|
|
+ <h4>{{ student.userIdName }} ({{ student.userId }})</h4>
|
|
|
|
|
+ <div class="student-meta">{{ student.college }} | {{ student.majorIdName }} | {{ student.grade }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="student-stats">
|
|
<div class="student-stats">
|
|
|
<div class="stat-item">
|
|
<div class="stat-item">
|
|
|
- <div class="stat-value">{{ student.overallProgress }}%</div>
|
|
|
|
|
|
|
+ <div class="stat-value">{{ (student.finishRate)* 100 }}%</div>
|
|
|
<div class="stat-label">总体进度</div>
|
|
<div class="stat-label">总体进度</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="course-progress">
|
|
<div class="course-progress">
|
|
|
- <div v-for="course in student.courses" :key="course.id" class="course-item">
|
|
|
|
|
- <div class="course-name">{{ course.name }}</div>
|
|
|
|
|
|
|
+ <div v-for="course in student.courseList" :key="course.id" class="course-item">
|
|
|
|
|
+ <div class="course-name">{{ course.courseName }}</div>
|
|
|
<div class="course-stats">
|
|
<div class="course-stats">
|
|
|
<div class="stat-item">
|
|
<div class="stat-item">
|
|
|
- <div class="stat-value">{{ course.progress }}%</div>
|
|
|
|
|
|
|
+ <div class="stat-value">{{ (course.finishRate)* 100 }}%</div>
|
|
|
<div class="stat-label">学习进度</div>
|
|
<div class="stat-label">学习进度</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="stat-item">
|
|
<div class="stat-item">
|
|
|
- <div class="stat-value">{{ course.completedAssignments }}/{{ course.totalAssignments }}</div>
|
|
|
|
|
|
|
+ <div class="stat-value">{{ course.workRate }}</div>
|
|
|
<div class="stat-label">作业完成</div>
|
|
<div class="stat-label">作业完成</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="stat-item">
|
|
<div class="stat-item">
|
|
|
- <div class="stat-value">{{ course.discussionParticipation }}</div>
|
|
|
|
|
|
|
+ <div class="stat-value">{{ course.answerCount }}</div>
|
|
|
<div class="stat-label">讨论参与</div>
|
|
<div class="stat-label">讨论参与</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="stat-item">
|
|
<div class="stat-item">
|
|
|
- <div class="stat-value">{{ course.questionCount }}</div>
|
|
|
|
|
|
|
+ <div class="stat-value">{{ course.postCount }}</div>
|
|
|
<div class="stat-label">提问次数</div>
|
|
<div class="stat-label">提问次数</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -196,7 +196,7 @@
|
|
|
const collegeList = ref([])
|
|
const collegeList = ref([])
|
|
|
|
|
|
|
|
// 学院统计数据
|
|
// 学院统计数据
|
|
|
- const collegeStats = reactive({
|
|
|
|
|
|
|
+ const collegeStats = ref({
|
|
|
totalCourses: 156,
|
|
totalCourses: 156,
|
|
|
activeCourses: 142,
|
|
activeCourses: 142,
|
|
|
courseAccessRate: 91.0,
|
|
courseAccessRate: 91.0,
|
|
@@ -208,7 +208,13 @@
|
|
|
peakOnlineUsers: 234,
|
|
peakOnlineUsers: 234,
|
|
|
activeCourseCount : 0,
|
|
activeCourseCount : 0,
|
|
|
allCourseCount : 0,
|
|
allCourseCount : 0,
|
|
|
- courseVisitCount : 0
|
|
|
|
|
|
|
+ courseVisitCount : 0,
|
|
|
|
|
+ allLoginCount : 0,
|
|
|
|
|
+ avgLoginCount: 0,
|
|
|
|
|
+ userCount :0,
|
|
|
|
|
+ avgStayTime:'',
|
|
|
|
|
+ peakWatchUserCount : 0,
|
|
|
|
|
+ userAllStayTime : ''
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 图表引用
|
|
// 图表引用
|
|
@@ -299,96 +305,96 @@
|
|
|
|
|
|
|
|
// 学员数据
|
|
// 学员数据
|
|
|
const studentsData = ref([
|
|
const studentsData = ref([
|
|
|
- {
|
|
|
|
|
- id: 1,
|
|
|
|
|
- name: '张三',
|
|
|
|
|
- studentId: '2021001',
|
|
|
|
|
- college: '计算机学院',
|
|
|
|
|
- major: '计算机科学与技术',
|
|
|
|
|
- grade: '大三',
|
|
|
|
|
- overallProgress: 85.6,
|
|
|
|
|
- highlighted: false,
|
|
|
|
|
- courses: [
|
|
|
|
|
- {
|
|
|
|
|
- id: 1,
|
|
|
|
|
- name: 'JavaScript程序设计',
|
|
|
|
|
- progress: 92,
|
|
|
|
|
- completedAssignments: 8,
|
|
|
|
|
- totalAssignments: 10,
|
|
|
|
|
- discussionParticipation: 15,
|
|
|
|
|
- questionCount: 5
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 2,
|
|
|
|
|
- name: '数据结构与算法',
|
|
|
|
|
- progress: 78,
|
|
|
|
|
- completedAssignments: 6,
|
|
|
|
|
- totalAssignments: 8,
|
|
|
|
|
- discussionParticipation: 12,
|
|
|
|
|
- questionCount: 3
|
|
|
|
|
- }
|
|
|
|
|
- ]
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 2,
|
|
|
|
|
- name: '李四',
|
|
|
|
|
- studentId: '2021002',
|
|
|
|
|
- college: '商学院',
|
|
|
|
|
- major: '工商管理',
|
|
|
|
|
- grade: '大二',
|
|
|
|
|
- overallProgress: 72.3,
|
|
|
|
|
- highlighted: false,
|
|
|
|
|
- courses: [
|
|
|
|
|
- {
|
|
|
|
|
- id: 3,
|
|
|
|
|
- name: '管理学原理',
|
|
|
|
|
- progress: 85,
|
|
|
|
|
- completedAssignments: 7,
|
|
|
|
|
- totalAssignments: 9,
|
|
|
|
|
- discussionParticipation: 8,
|
|
|
|
|
- questionCount: 2
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 4,
|
|
|
|
|
- name: '市场营销学',
|
|
|
|
|
- progress: 65,
|
|
|
|
|
- completedAssignments: 4,
|
|
|
|
|
- totalAssignments: 7,
|
|
|
|
|
- discussionParticipation: 6,
|
|
|
|
|
- questionCount: 1
|
|
|
|
|
- }
|
|
|
|
|
- ]
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 3,
|
|
|
|
|
- name: '王五',
|
|
|
|
|
- studentId: '2021003',
|
|
|
|
|
- college: '艺术学院',
|
|
|
|
|
- major: '视觉传达设计',
|
|
|
|
|
- grade: '大一',
|
|
|
|
|
- overallProgress: 91.2,
|
|
|
|
|
- highlighted: false,
|
|
|
|
|
- courses: [
|
|
|
|
|
- {
|
|
|
|
|
- id: 5,
|
|
|
|
|
- name: '设计基础',
|
|
|
|
|
- progress: 95,
|
|
|
|
|
- completedAssignments: 10,
|
|
|
|
|
- totalAssignments: 10,
|
|
|
|
|
- discussionParticipation: 20,
|
|
|
|
|
- questionCount: 8
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 6,
|
|
|
|
|
- name: '色彩构成',
|
|
|
|
|
- progress: 88,
|
|
|
|
|
- completedAssignments: 8,
|
|
|
|
|
- totalAssignments: 9,
|
|
|
|
|
- discussionParticipation: 15,
|
|
|
|
|
- questionCount: 6
|
|
|
|
|
- }
|
|
|
|
|
- ]
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 1,
|
|
|
|
|
+ // name: '张三',
|
|
|
|
|
+ // studentId: '2021001',
|
|
|
|
|
+ // college: '计算机学院',
|
|
|
|
|
+ // major: '计算机科学与技术',
|
|
|
|
|
+ // grade: '大三',
|
|
|
|
|
+ // overallProgress: 85.6,
|
|
|
|
|
+ // highlighted: false,
|
|
|
|
|
+ // courses: [
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 1,
|
|
|
|
|
+ // name: 'JavaScript程序设计',
|
|
|
|
|
+ // progress: 92,
|
|
|
|
|
+ // completedAssignments: 8,
|
|
|
|
|
+ // totalAssignments: 10,
|
|
|
|
|
+ // discussionParticipation: 15,
|
|
|
|
|
+ // questionCount: 5
|
|
|
|
|
+ // },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 2,
|
|
|
|
|
+ // name: '数据结构与算法',
|
|
|
|
|
+ // progress: 78,
|
|
|
|
|
+ // completedAssignments: 6,
|
|
|
|
|
+ // totalAssignments: 8,
|
|
|
|
|
+ // discussionParticipation: 12,
|
|
|
|
|
+ // questionCount: 3
|
|
|
|
|
+ // }
|
|
|
|
|
+ // ]
|
|
|
|
|
+ // },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 2,
|
|
|
|
|
+ // name: '李四',
|
|
|
|
|
+ // studentId: '2021002',
|
|
|
|
|
+ // college: '商学院',
|
|
|
|
|
+ // major: '工商管理',
|
|
|
|
|
+ // grade: '大二',
|
|
|
|
|
+ // overallProgress: 72.3,
|
|
|
|
|
+ // highlighted: false,
|
|
|
|
|
+ // courses: [
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 3,
|
|
|
|
|
+ // name: '管理学原理',
|
|
|
|
|
+ // progress: 85,
|
|
|
|
|
+ // completedAssignments: 7,
|
|
|
|
|
+ // totalAssignments: 9,
|
|
|
|
|
+ // discussionParticipation: 8,
|
|
|
|
|
+ // questionCount: 2
|
|
|
|
|
+ // },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 4,
|
|
|
|
|
+ // name: '市场营销学',
|
|
|
|
|
+ // progress: 65,
|
|
|
|
|
+ // completedAssignments: 4,
|
|
|
|
|
+ // totalAssignments: 7,
|
|
|
|
|
+ // discussionParticipation: 6,
|
|
|
|
|
+ // questionCount: 1
|
|
|
|
|
+ // }
|
|
|
|
|
+ // ]
|
|
|
|
|
+ // },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 3,
|
|
|
|
|
+ // name: '王五',
|
|
|
|
|
+ // studentId: '2021003',
|
|
|
|
|
+ // college: '艺术学院',
|
|
|
|
|
+ // major: '视觉传达设计',
|
|
|
|
|
+ // grade: '大一',
|
|
|
|
|
+ // overallProgress: 91.2,
|
|
|
|
|
+ // highlighted: false,
|
|
|
|
|
+ // courses: [
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 5,
|
|
|
|
|
+ // name: '设计基础',
|
|
|
|
|
+ // progress: 95,
|
|
|
|
|
+ // completedAssignments: 10,
|
|
|
|
|
+ // totalAssignments: 10,
|
|
|
|
|
+ // discussionParticipation: 20,
|
|
|
|
|
+ // questionCount: 8
|
|
|
|
|
+ // },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // id: 6,
|
|
|
|
|
+ // name: '色彩构成',
|
|
|
|
|
+ // progress: 88,
|
|
|
|
|
+ // completedAssignments: 8,
|
|
|
|
|
+ // totalAssignments: 9,
|
|
|
|
|
+ // discussionParticipation: 15,
|
|
|
|
|
+ // questionCount: 6
|
|
|
|
|
+ // }
|
|
|
|
|
+ // ]
|
|
|
|
|
+ // }
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
// 过滤后的学员数据
|
|
// 过滤后的学员数据
|
|
@@ -400,8 +406,8 @@
|
|
|
const searchTerm = studentSearch.value.trim().toLowerCase()
|
|
const searchTerm = studentSearch.value.trim().toLowerCase()
|
|
|
return studentsData.value
|
|
return studentsData.value
|
|
|
.filter((student) => {
|
|
.filter((student) => {
|
|
|
- const matchName = student.name.toLowerCase().includes(searchTerm)
|
|
|
|
|
- const matchId = student.studentId.includes(searchTerm)
|
|
|
|
|
|
|
+ const matchName = student.userIdName.toLowerCase().includes(searchTerm)
|
|
|
|
|
+ const matchId = student.userId.includes(searchTerm)
|
|
|
return matchName || matchId
|
|
return matchName || matchId
|
|
|
})
|
|
})
|
|
|
.map((student) => ({ ...student, highlighted: true }))
|
|
.map((student) => ({ ...student, highlighted: true }))
|
|
@@ -436,8 +442,9 @@
|
|
|
startTime : formatDateWithDays(0),
|
|
startTime : formatDateWithDays(0),
|
|
|
endTime : formatDateWithDays(collegeFilters.timeRange)
|
|
endTime : formatDateWithDays(collegeFilters.timeRange)
|
|
|
})
|
|
})
|
|
|
- Object.assign(collegeStats, statsResponse.data)
|
|
|
|
|
-
|
|
|
|
|
|
|
+ console.log("asdasd",statsResponse.data)
|
|
|
|
|
+ // Object.assign(collegeStats, statsResponse.data)
|
|
|
|
|
+ collegeStats.value = {...collegeStats,...statsResponse.data}
|
|
|
// 获取课程详细统计
|
|
// 获取课程详细统计
|
|
|
const detailsResponse = await getCollegeCourseDetails({
|
|
const detailsResponse = await getCollegeCourseDetails({
|
|
|
orgId: collegeFilters.collegeId,
|
|
orgId: collegeFilters.collegeId,
|
|
@@ -457,13 +464,15 @@
|
|
|
const searchStudent = async () => {
|
|
const searchStudent = async () => {
|
|
|
try {
|
|
try {
|
|
|
const response = await searchStudents({
|
|
const response = await searchStudents({
|
|
|
- keyword: studentSearch.value.trim()
|
|
|
|
|
|
|
+ name: studentSearch.value.trim(),
|
|
|
|
|
+ current: 1,
|
|
|
|
|
+ size: 99
|
|
|
})
|
|
})
|
|
|
- studentsData.value = response.map((student) => ({
|
|
|
|
|
|
|
+ studentsData.value = response.data.map((student) => ({
|
|
|
...student,
|
|
...student,
|
|
|
highlighted: !!studentSearch.value.trim()
|
|
highlighted: !!studentSearch.value.trim()
|
|
|
}))
|
|
}))
|
|
|
-
|
|
|
|
|
|
|
+ console.log('看看呢',studentsData.value)
|
|
|
if (response.length === 0 && studentSearch.value.trim()) {
|
|
if (response.length === 0 && studentSearch.value.trim()) {
|
|
|
alert(`未找到包含"${studentSearch.value}"的学员`)
|
|
alert(`未找到包含"${studentSearch.value}"的学员`)
|
|
|
}
|
|
}
|