瀏覽代碼

修改一些 bug

于添 5 月之前
父節點
當前提交
eabdd247ea

+ 8 - 0
src/views/resourceCenter/components/ResourceList.vue

@@ -194,9 +194,17 @@ const onSearch = (value) => {
 	currentPage.size = 12
 	getList()
 }
+const scrollToTop = () => {
+	window.scrollTo({
+		top: 0,
+		behavior: 'smooth'
+	});
+};
 const onChange = (page, pageSize) => {
 	console.log('翻页', page, pageSize)
 	getList()
+	scrollToTop()
+
 }
 
 // watch(currentPage.value.current, (newValue) => {

+ 177 - 148
src/views/statisticalAnalysis/analysisLearningBehaviors/index.vue

@@ -49,31 +49,31 @@
 			<div class="stats-grid">
 				<div class="stat-card">
 					<h3>📚 课程访问统计</h3>
-					<div class="stat-number">{{ collegeStats.totalCourses }}</div>
+					<div class="stat-number">{{ collegeStats.allCourseCount }}</div>
 					<div class="stat-label">总课程数</div>
-					<div class="stat-number">{{ collegeStats.activeCourses }}</div>
+					<div class="stat-number">{{ collegeStats.activeCourseCount }}</div>
 					<div class="stat-label">活跃课程数</div>
-					<div class="stat-number">{{ collegeStats.courseAccessRate }}%</div>
+					<div class="stat-number">{{ collegeStats.courseVisitCount }}%</div>
 					<div class="stat-label">课程访问率</div>
 				</div>
 
 				<div class="stat-card">
 					<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-number">{{ collegeStats.uniqueUsers.toLocaleString() }}</div>
+					<div class="stat-number">{{ collegeStats.userCount.toLocaleString() }}</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>
 
 				<div class="stat-card">
 					<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-number">{{ collegeStats.avgSessionTime }}min</div>
+					<div class="stat-number">{{ collegeStats.avgStayTime }}</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>
 			</div>
@@ -125,41 +125,41 @@
 			<div class="student-cards">
 				<div
 					v-for="student in filteredStudents"
-					:key="student.id"
+					:key="student.userId"
 					class="student-card"
 					:class="{ highlighted: student.highlighted }"
 				>
 					<div class="student-header">
 						<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 class="student-stats">
 							<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>
 						</div>
 					</div>
 
 					<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="stat-item">
-									<div class="stat-value">{{ course.progress }}%</div>
+									<div class="stat-value">{{ (course.finishRate)* 100 }}%</div>
 									<div class="stat-label">学习进度</div>
 								</div>
 								<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>
 								<div class="stat-item">
-									<div class="stat-value">{{ course.discussionParticipation }}</div>
+									<div class="stat-value">{{ course.answerCount }}</div>
 									<div class="stat-label">讨论参与</div>
 								</div>
 								<div class="stat-item">
-									<div class="stat-value">{{ course.questionCount }}</div>
+									<div class="stat-value">{{ course.postCount }}</div>
 									<div class="stat-label">提问次数</div>
 								</div>
 							</div>
@@ -196,7 +196,7 @@
 	const collegeList = ref([])
 
 	// 学院统计数据
-	const collegeStats = reactive({
+	const collegeStats = ref({
 		totalCourses: 156,
 		activeCourses: 142,
 		courseAccessRate: 91.0,
@@ -205,7 +205,16 @@
 		avgLoginPerUser: 3.85,
 		totalOnlineTime: 2456,
 		avgSessionTime: 45.2,
-		peakOnlineUsers: 234
+		peakOnlineUsers: 234,
+		activeCourseCount : 0,
+		allCourseCount : 0,
+		courseVisitCount : 0,
+		allLoginCount : 0,
+		avgLoginCount: 0,
+		userCount :0,
+		avgStayTime:'',
+		peakWatchUserCount : 0,
+		userAllStayTime : ''
 	})
 
 	// 图表引用
@@ -218,8 +227,8 @@
 	const collegeColumns = [
 		{
 			title: '学院名称',
-			dataIndex: 'name',
-			key: 'name'
+			dataIndex: 'collegeIdName',
+			key: 'collegeIdName'
 		},
 		{
 			title: '课程数量',
@@ -228,37 +237,37 @@
 		},
 		{
 			title: '总访问量',
-			dataIndex: 'totalVisits',
-			key: 'totalVisits'
+			dataIndex: 'watchCount',
+			key: 'watchCount'
 		},
 		{
 			title: '平均完成率',
-			dataIndex: 'avgCompletionRate',
-			key: 'avgCompletionRate',
+			dataIndex: 'completeRate',
+			key: 'completeRate',
 			customRender: ({ text }) => `${text}%`
 		},
 		{
 			title: '作业提交率',
-			dataIndex: 'assignmentSubmissionRate',
-			key: 'assignmentSubmissionRate',
+			dataIndex: 'homeworkFinishRate',
+			key: 'homeworkFinishRate',
 			customRender: ({ text }) => `${text}%`
 		},
-		{
-			title: '退课率',
-			dataIndex: 'dropoutRate',
-			key: 'dropoutRate',
-			customRender: ({ text }) => `${text}%`
-		}
+		// {
+		// 	title: '退课率',
+		// 	dataIndex: 'homeworkFinishRate',
+		// 	key: 'homeworkFinishRate',
+		// 	customRender: ({ text }) => `${text}%`
+		// }
 	]
 
 	// 学院表格数据
 	const collegeTableData = ref([
 		{
-			id: 1,
-			name: '计算机学院',
+			collegeId: 1,
+			collegeIdName: '计算机学院',
 			courseCount: 45,
 			totalVisits: 5234,
-			avgCompletionRate: 78.5,
+			completeRate: 78.5,
 			assignmentSubmissionRate: 85.2,
 			dropoutRate: 10.2
 		},
@@ -296,96 +305,96 @@
 
 	// 学员数据
 	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
+		// 		}
+		// 	]
+		// }
 	])
 
 	// 过滤后的学员数据
@@ -397,8 +406,8 @@
 		const searchTerm = studentSearch.value.trim().toLowerCase()
 		return studentsData.value
 			.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
 			})
 			.map((student) => ({ ...student, highlighted: true }))
@@ -414,23 +423,35 @@
 			})
 		}
 	}
+	const formatDateWithDays = (days = 0) => {
+		const date = new Date();
+		date.setDate(date.getDate() + days); // 设置天数偏移
+
+		const year = date.getFullYear();
+		const month = String(date.getMonth() + 1).padStart(2, '0');
+		const day = String(date.getDate()).padStart(2, '0');
 
+		return `${year}-${month}-${day}`;
+	}
 	// 更新学院数据
 	const updateCollegeData = async () => {
 		try {
-			// 获取学院统计数据
+			// 获取学院统计数据 船锚
 			const statsResponse = await getCollegeStats({
-				collegeId: collegeFilters.collegeId,
-				timeRange: collegeFilters.timeRange
+				orgId: collegeFilters.collegeId,
+				startTime : formatDateWithDays(0),
+				endTime : formatDateWithDays(collegeFilters.timeRange)
 			})
-			Object.assign(collegeStats, statsResponse)
-
+			console.log("asdasd",statsResponse.data)
+			// Object.assign(collegeStats, statsResponse.data)
+			collegeStats.value = {...collegeStats,...statsResponse.data}
 			// 获取课程详细统计
 			const detailsResponse = await getCollegeCourseDetails({
-				collegeId: collegeFilters.collegeId,
-				timeRange: collegeFilters.timeRange
+				orgId: collegeFilters.collegeId,
+				startTime : formatDateWithDays(0),
+				endTime : formatDateWithDays(collegeFilters.timeRange)
 			})
-			collegeTableData.value = detailsResponse
+			collegeTableData.value = detailsResponse.data
 
 			// 重新初始化图表
 			await initCollegeCharts()
@@ -443,13 +464,15 @@
 	const searchStudent = async () => {
 		try {
 			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,
 				highlighted: !!studentSearch.value.trim()
 			}))
-
+			console.log('看看呢',studentsData.value)
 			if (response.length === 0 && studentSearch.value.trim()) {
 				alert(`未找到包含"${studentSearch.value}"的学员`)
 			}
@@ -482,10 +505,13 @@
 
 		try {
 			const response = await getLoginTimeDistribution({
-				collegeId: collegeFilters.collegeId,
-				timeRange: collegeFilters.timeRange
+				orgId: collegeFilters.collegeId,
+				startTime : formatDateWithDays(0),
+				endTime : formatDateWithDays(1),
+				current : 1,
+				size : 24
 			})
-
+			console.log('结果呢',response)
 			const { hours, loginCounts } = response
 
 			const option = {
@@ -590,8 +616,11 @@
 
 		try {
 			const response = await getCourseHeat({
-				collegeId: collegeFilters.collegeId,
-				timeRange: collegeFilters.timeRange
+				orgId: collegeFilters.collegeId,
+				startTime : formatDateWithDays(0),
+				endTime : formatDateWithDays(1),
+				current : 1,
+				size : 8
 			})
 
 			const { courses, visits } = response
@@ -698,9 +727,9 @@
 			// 获取学院列表
 			const colleges = await getCollegeList()
 			collegeList.value = colleges
-
+			collegeFilters.collegeId = colleges.length > 0 ? colleges[0].id : undefined
 			// 获取初始学员数据
-			await searchStudent()
+			// await searchStudent()
 
 			// 获取学院数据
 			await updateCollegeData()

+ 2 - 2
src/views/statisticalAnalysis/analysisTeachingActivities/index.vue

@@ -217,8 +217,8 @@
 		},
 		{
 			title: '文档类型',
-			dataIndex: 'fileSuffix',
-			key: 'fileSuffix',
+			dataIndex: 'extendName',
+			key: 'extendName',
 			width: '100px'
 		},
 		{

+ 17 - 15
src/views/statisticalAnalysis/overviewLearningProgress/index.vue

@@ -1,6 +1,6 @@
 <template>
-	<div class="p-6 flex justify-center min-h-screen">
-		<div class="w-full mx-auto">
+	<div class="p-6 flex justify-center">
+		<div class="w-full mx-auto min-h-screen">
 			<!-- 顶部筛选区 -->
 			<div class="bg-white rounded-lg shadow-sm p-6 mb-6 h-25 flex items-center">
 				<!-- 课程ID输入 -->
@@ -14,15 +14,15 @@
 				</div>
 
 				<!-- 日期范围选择 -->
-				<div class="flex-1 mr-4">
-					<label class="block text-sm font-medium text-gray-700 mb-1">开始时间</label>
-					<a-date-picker v-model:value="startDate" class="w-full" placeholder="开始时间" />
-				</div>
+<!--				<div class="flex-1 mr-4">-->
+<!--					<label class="block text-sm font-medium text-gray-700 mb-1">开始时间</label>-->
+<!--					<a-date-picker v-model:value="startDate" class="w-full" placeholder="开始时间" />-->
+<!--				</div>-->
 
-				<div class="flex-1 mr-4">
-					<label class="block text-sm font-medium text-gray-700 mb-1">结束时间</label>
-					<a-date-picker v-model:value="endDate" class="w-full" placeholder="结束时间" />
-				</div>
+<!--				<div class="flex-1 mr-4">-->
+<!--					<label class="block text-sm font-medium text-gray-700 mb-1">结束时间</label>-->
+<!--					<a-date-picker v-model:value="endDate" class="w-full" placeholder="结束时间" />-->
+<!--				</div>-->
 
 				<!-- 操作按钮 -->
 				<div class="flex space-x-2 ml-4 mt-6">
@@ -77,7 +77,7 @@
 			<div class="bg-white rounded-lg shadow-sm p-6">
 				<div class="flex justify-between items-center mb-4">
 					<h2 class="text-xl font-bold text-gray-800">学习明细数据</h2>
-					<div class="text-sm text-gray-500">({{ formatDateRange() }})注:从查询条件时间范围落下来的</div>
+<!--					<div class="text-sm text-gray-500">({{ formatDateRange() }})注:从查询条件时间范围落下来的</div>-->
 				</div>
 
 				<a-table
@@ -111,14 +111,16 @@
 	let barChart = null
 
 	// 日期选择器
-	const startDate = ref(dayjs('2025-08-04'))
-	const endDate = ref(dayjs('2025-08-10'))
+	// const startDate = ref(dayjs('2025-08-04'))
+	// const endDate = ref(dayjs('2025-08-10'))
+	const startDate = ref(undefined)
+	const endDate = ref(undefined)
 
 	// 筛选条件
 	const filters = reactive({
 		courseId: '',
-		startTime: '2025-08-04',
-		endTime: '2025-08-10'
+		startTime: undefined,
+		endTime: undefined
 	})
 
 	// 统计卡片数据

+ 118 - 72
src/views/statisticalAnalysis/videoAnalysis/index.vue

@@ -19,15 +19,17 @@
 						</a-select-option>
 					</a-select>
 				</div>
-				<div class="filter-group">
-					<label>时间范围</label>
-					<a-select v-model:value="filters.timeRange" style="width: 100%">
-						<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>
+				<!-- 日期范围选择 -->
+				<div class="flex-1 mr-4">
+					<label class="block text-sm font-medium text-gray-700 mb-1">开始时间</label>
+					<a-date-picker v-model:value="startTime" class="w-full" placeholder="开始时间" />
+				</div>
+
+				<div class="flex-1 mr-4">
+					<label class="block text-sm font-medium text-gray-700 mb-1">结束时间</label>
+					<a-date-picker v-model:value="endTime" class="w-full" placeholder="结束时间" />
 				</div>
+
 				<div class="filter-group">
 					<a-button type="primary" @click="updateStats">查询</a-button>
 				</div>
@@ -36,49 +38,49 @@
 
 		<!-- 核心统计数据 -->
 		<div class="stats-grid">
-			<div class="stat-card">
+			<div class="stat-card" v-if="stats.countData">
 				<h3>👥 观看人数统计</h3>
-				<div class="stat-number">{{ stats.totalViewers.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.countData.alreadyWatchUserCount }}</div>
 				<div class="stat-label">总观看人数</div>
-				<div class="stat-number">{{ stats.completedViewers.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.countData.completeWatchUserCount }}</div>
 				<div class="stat-label">完成观看人数</div>
-				<div class="completion-rate">{{ stats.completionRate }}%</div>
+				<div class="completion-rate">{{ stats.countData.completeRate*100 }}%</div>
 				<div class="stat-label">完成率</div>
 			</div>
 
-			<div class="stat-card">
+			<div class="stat-card" v-if="stats.downData">
 				<h3>📥 讲义下载统计</h3>
-				<div class="stat-number">{{ stats.totalDownloads.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.downData.allDownloadCount }}</div>
 				<div class="stat-label">总下载次数</div>
-				<div class="stat-number">{{ stats.downloadRate }}%</div>
+				<div class="stat-number">{{ stats.downData.downloadRate*100 }}%</div>
 				<div class="stat-label">下载率</div>
-				<div class="stat-number">{{ stats.avgDownloads }}</div>
+				<div class="stat-number">{{ stats.downData.avgDownloadCount }}</div>
 				<div class="stat-label">人均下载次数</div>
 			</div>
 
-			<div class="stat-card">
+			<div class="stat-card" v-if="stats.jumpData">
 				<h3>⏱️ 跳出时间分析</h3>
-				<div class="stat-number">{{ stats.totalExits.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.jumpData.jumpOutCount }}</div>
 				<div class="stat-label">总跳出次数</div>
-				<div class="stat-number">{{ stats.exitRate }}%</div>
+				<div class="stat-number">{{ stats.jumpData.jumpOutRate*100 }}%</div>
 				<div class="stat-label">跳出率</div>
-				<div class="stat-number">{{ stats.avgExitTime }}</div>
+				<div class="stat-number">{{ stats.jumpData.jumpAvgTime }}</div>
 				<div class="stat-label">平均跳出时间</div>
 			</div>
 
-			<div class="stat-card">
+			<div class="stat-card" v-if="stats.interdata">
 				<h3>📝 互动数据统计</h3>
-				<div class="stat-number">{{ stats.totalNotes.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.interdata.noteCount }}</div>
 				<div class="stat-label">笔记总数</div>
-				<div class="stat-number">{{ stats.totalDiscussions.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.interdata.postCount }}</div>
 				<div class="stat-label">讨论总数</div>
-				<div class="stat-number">{{ stats.totalReplies.toLocaleString() }}</div>
+				<div class="stat-number">{{ stats.interdata.replyCount }}</div>
 				<div class="stat-label">回帖总数</div>
 			</div>
 		</div>
 
 		<!-- ECharts 图表区域 -->
-		<div class="charts-section">
+		<div class="charts-section" v-if="false">
 			<!-- 学习进度分布图 -->
 			<div class="chart-container">
 				<h3>📈 学习进度分布</h3>
@@ -112,17 +114,16 @@
 				:data-source="studentData"
 				:pagination="pagination"
 				:loading="loading"
-				:scroll="{ x: 1200 }"
 			>
 				<template #bodyCell="{ column, record }">
-					<template v-if="column.key === 'progress'">
+					<template v-if="column.key === 'finishRate'">
 						<div class="progress-container">
-							<a-progress :percent="record.progress" size="small" />
-							<span :class="{ 'low-engagement': record.progress < 50 }"> {{ record.progress }}% </span>
+							<a-progress :percent="record.finishRate * 100" size="small" />
+							<span :class="{ 'low-engagement': record.finishRate * 100 < 50 }"> {{ record.finishRate * 100 }}% </span>
 						</div>
 					</template>
-					<template v-else-if="column.key === 'exitPoints'">
-						<span v-for="point in record.exitPoints" :key="point" class="time-point">
+					<template v-else-if="column.key === 'jumpTimeContact'">
+						<span v-for="point in record.jumpTimeContactArr" :key="point" class="time-point">
 							{{ point }}
 						</span>
 					</template>
@@ -133,17 +134,25 @@
 		<!-- 视频章节详细统计 -->
 		<div class="data-table">
 			<h3>📚 视频章节详细统计</h3>
-			<a-table :columns="chapterColumns" :data-source="chapterData" :pagination="false" :loading="loading">
+			<a-table
+				:columns="chapterColumns"
+				:data-source="chapterData"
+				:pagination="chapterPagination"
+				:loading="chapterLoading"
+			>
 				<template #bodyCell="{ column, record }">
-					<template v-if="column.key === 'completionRate'">
+					<template v-if="column.key === 'completeRate'">
 						<span
-							:class="{ 'completion-rate': record.completionRate >= 70, 'low-engagement': record.completionRate < 70 }"
+							:class="{
+								'completion-rate': record.completeRate * 100 >= 70,
+								'low-engagement': record.completeRate * 100 < 70
+							}"
 						>
-							{{ record.completionRate }}%
+							{{ record.completeRate * 100 }}%
 						</span>
 					</template>
-					<template v-else-if="column.key === 'exitRate'">
-						<span :class="{ 'low-engagement': record.exitRate > 25 }"> {{ record.exitRate }}% </span>
+					<template v-else-if="column.key === 'jumpOutRate'">
+						<span :class="{ 'low-engagement': record.jumpOutRate * 100 > 25 }"> {{ record.jumpOutRate * 100 }}% </span>
 					</template>
 				</template>
 			</a-table>
@@ -152,15 +161,20 @@
 </template>
 
 <script setup>
-	import { ref, reactive, onMounted, nextTick, watch } from 'vue'
+	import { ref, reactive, onMounted, nextTick, watch, computed } from 'vue'
 	import { message } from 'ant-design-vue'
 	import * as echarts from 'echarts'
+	import { getCourseOptions } from '@/api/statisticalAnalysis/analysisTeachingActivities'
 	import { videoAnalysisApi } from '@/api/statisticalAnalysis/videoAnalysis'
+	import dayjs from 'dayjs'
 
 	// 筛选条件
+	const startTime = ref('')
+	const endTime = ref('')
 	const filters = reactive({
 		courseId: '',
-		timeRange: '30'
+		startTime: computed(() => (startTime.value ? dayjs(startTime.value).format('YYYY-MM-DD') : '')),
+		endTime: computed(() => (endTime.value ? dayjs(endTime.value).format('YYYY-MM-DD') : ''))
 	})
 
 	// 课程选项
@@ -168,7 +182,7 @@
 
 	// 加载状态
 	const loading = ref(false)
-
+	const chapterLoading = ref(false)
 	// 统计数据
 	const stats = reactive({
 		totalViewers: 2800,
@@ -193,17 +207,17 @@
 
 	// 学员数据表格列定义
 	const studentColumns = [
-		{ title: '学员ID', dataIndex: 'id', key: 'id', width: 80 },
-		{ title: '姓名', dataIndex: 'name', key: 'name', width: 100 },
-		{ title: '访问总时长', dataIndex: 'totalTime', key: 'totalTime', width: 120 },
-		{ title: '学习进度', dataIndex: 'progress', key: 'progress', width: 150 },
-		{ title: '观看次数', dataIndex: 'viewCount', key: 'viewCount', width: 100 },
-		{ title: '跳出时间点', dataIndex: 'exitPoints', key: 'exitPoints', width: 200 },
-		{ title: '快进快退次数', dataIndex: 'seekCount', key: 'seekCount', width: 120 },
+		{ title: '学员ID', dataIndex: 'userId', key: 'userId', width: 80 },
+		{ title: '姓名', dataIndex: 'stuName', key: 'stuName', width: 100 },
+		{ title: '访问总时长', dataIndex: 'allStayTime', key: 'allStayTime', width: 120 },
+		{ title: '学习进度', dataIndex: 'finishRate', key: 'finishRate', width: 150 },
+		{ title: '观看次数', dataIndex: 'watchCount', key: 'watchCount', width: 100 },
+		{ title: '跳出时间点', dataIndex: 'jumpTimeContact', key: 'jumpTimeContact', width: 200 },
+		{ title: '快进快退次数', dataIndex: 'quickOperaCount', key: 'quickOperaCount', width: 120 },
 		{ title: '笔记数', dataIndex: 'noteCount', key: 'noteCount', width: 80 },
-		{ title: '讨论数', dataIndex: 'discussionCount', key: 'discussionCount', width: 80 },
+		{ title: '讨论数', dataIndex: 'postCount', key: 'postCount', width: 80 },
 		{ title: '回帖数', dataIndex: 'replyCount', key: 'replyCount', width: 80 },
-		{ title: '最后访问', dataIndex: 'lastAccess', key: 'lastAccess', width: 150 }
+		{ title: '最后访问', dataIndex: 'lastLoginTime', key: 'lastLoginTime', width: 150 }
 	]
 
 	// 学员数据
@@ -223,19 +237,33 @@
 			fetchStudentData()
 		}
 	})
+	// 分页配置
+	const chapterPagination = reactive({
+		current: 1,
+		pageSize: 10,
+		total: 0,
+		showTotal: (total, range) => `显示 ${range[0]}-${range[1]} 条,共 ${total} 条`,
+		onChange: (page, pageSize) => {
+			chapterPagination.current = page
+			chapterPagination.pageSize = pageSize
+			fetchChapterData()
+		}
+	})
 
 	// 章节数据表格列定义
 	const chapterColumns = [
-		{ title: '章节', dataIndex: 'chapter', key: 'chapter', width: 200 },
-		{ title: '视频时长', dataIndex: 'duration', key: 'duration', width: 100 },
-		{ title: '观看人数', dataIndex: 'viewers', key: 'viewers', width: 100 },
-		{ title: '完成人数', dataIndex: 'completed', key: 'completed', width: 100 },
-		{ title: '完成率', dataIndex: 'completionRate', key: 'completionRate', width: 100 },
-		{ title: '平均观看时长', dataIndex: 'avgWatchTime', key: 'avgWatchTime', width: 120 },
-		{ title: '跳出率', dataIndex: 'exitRate', key: 'exitRate', width: 100 },
-		{ title: '下载次数', dataIndex: 'downloads', key: 'downloads', width: 100 },
-		{ title: '笔记数', dataIndex: 'notes', key: 'notes', width: 80 },
-		{ title: '讨论数', dataIndex: 'discussions', key: 'discussions', width: 80 }
+		{ title: '课程名称', dataIndex: 'courseIdName', key: 'courseIdName', width: 200 },
+		{ title: '章节名称', dataIndex: 'chapterIdName', key: 'chapterIdName', width: 200 },
+		{ title: '课时名称', dataIndex: 'hourIdName', key: 'hourIdName', width: 200 },
+		{ title: '视频时长', dataIndex: 'allStayTime', key: 'allStayTime', width: 100 },
+		{ title: '观看人数', dataIndex: 'watchUserCount', key: 'watchUserCount', width: 100 },
+		{ title: '完成人数', dataIndex: 'completeWatchUserCount', key: 'completeWatchUserCount', width: 100 },
+		{ title: '完成率', dataIndex: 'completeRate', key: 'completeRate', width: 100 },
+		{ title: '平均观看时长', dataIndex: 'avgStayTime', key: 'avgStayTime', width: 120 },
+		{ title: '跳出率', dataIndex: 'jumpOutRate', key: 'jumpOutRate', width: 100 },
+		{ title: '下载次数', dataIndex: 'downloadCount', key: 'downloadCount', width: 100 },
+		{ title: '笔记数', dataIndex: 'noteCount', key: 'noteCount', width: 80 },
+		{ title: '讨论数', dataIndex: 'postCount', key: 'postCount', width: 80 }
 	]
 
 	// 章节数据
@@ -480,7 +508,7 @@
 	// 获取课程选项
 	const fetchCourseOptions = async () => {
 		try {
-			const response = await videoAnalysisApi.getCourseOptions()
+			const response = await getCourseOptions()
 			courseOptions.value = response || []
 		} catch (error) {
 			console.error('获取课程选项失败:', error)
@@ -490,11 +518,18 @@
 	// 获取统计数据
 	const fetchVideoStats = async () => {
 		try {
-			const response = await videoAnalysisApi.getVideoStats(filters)
-			const data = response || {}
+			const countData = await videoAnalysisApi.watchUserCountProgress(filters)
+			const downData = await videoAnalysisApi.teachMaterialsDownloadCount(filters)
+			const jumpData = await videoAnalysisApi.jumpTimeAnalyse(filters)
+			const interdata = await videoAnalysisApi.interactionDataAnalyse(filters)
 
 			// 更新统计数据
-			Object.assign(stats, data)
+			Object.assign(stats, {
+				countData,
+				downData,
+				jumpData,
+				interdata
+			})
 		} catch (error) {
 			console.error('获取统计数据失败:', error)
 			message.error('获取统计数据失败')
@@ -504,14 +539,18 @@
 	// 获取学员数据
 	const fetchStudentData = async () => {
 		try {
-			const response = await videoAnalysisApi.getStudentData({
+			const response = await videoAnalysisApi.studyBehaviorDetailData({
 				...filters,
 				current: pagination.current,
 				pageSize: pagination.pageSize
 			})
-			const data = response || []
-
-			studentData.value = data
+			const data = response.records || []
+			studentData.value = data.map((r) => {
+				return {
+					...r,
+					jumpTimeContactArr: r.jumpTimeContact?.split(',')
+				}
+			})
 			pagination.total = response.total || 0
 		} catch (error) {
 			console.error('获取学员数据失败:', error)
@@ -522,8 +561,13 @@
 	// 获取章节数据
 	const fetchChapterData = async () => {
 		try {
-			const response = await videoAnalysisApi.getChapterData(filters)
-			chapterData.value = response || []
+			const response = await videoAnalysisApi.videoDetailDataAnalysis({
+				...filters,
+				current: chapterPagination.current,
+				pageSize: chapterPagination.pageSize
+			})
+			chapterData.value = response.records || []
+			chapterPagination.total = response.total || 0
 		} catch (error) {
 			console.error('获取章节数据失败:', error)
 			message.error('获取章节数据失败')
@@ -541,7 +585,7 @@
 
 			// 重新初始化图表
 			nextTick(() => {
-				initCharts()
+				// initCharts()
 			})
 		} catch (error) {
 			console.error('获取图表数据失败:', error)
@@ -552,13 +596,15 @@
 	// 更新统计数据
 	const updateStats = async () => {
 		loading.value = true
+		chapterLoading.value = true
 		try {
 			await Promise.all([fetchVideoStats(), fetchStudentData(), fetchChapterData(), fetchChartData()])
-			message.success('数据已更新!')
+			// message.success('数据已更新!')
 		} catch (error) {
 			console.error('更新数据失败:', error)
 		} finally {
 			loading.value = false
+			chapterLoading.value = false
 		}
 	}
 
@@ -577,7 +623,7 @@
 
 	// 监听筛选条件变化
 	watch(
-		() => [filters.courseId, filters.timeRange],
+		() => [filters.courseId,filters.endTime,filters.startTime],
 		() => {
 			updateStats()
 		},