Explorar el Código

资源库统计 平台运行总览

于添 hace 5 meses
padre
commit
c72515dcb5

+ 211 - 61
src/api/statisticalAnalysis/platformStatusOverview.js

@@ -1,5 +1,6 @@
 // 平台状态总览相关接口
-import { moduleRequest } from '@/utils/request'
+import {moduleRequest} from '@/utils/request'
+import ForEach from "lodash-es/forEach";
 
 const request = moduleRequest(`/api/webapp/`)
 
@@ -131,76 +132,225 @@ const mockData = {
 }
 
 // 获取平台统计数据
-export const getPlatformStats = () => {
-	// 模拟异步请求
-	return new Promise((resolve) => {
-		setTimeout(() => {
-			resolve(mockData.platformStats)
-		}, 300)
-	})
+export const getPlatformStats = async (params) => {
+	// // 模拟异步请求
+	// return new Promise((resolve) => {
+	// 	setTimeout(() => {
+	// 		resolve(mockData.platformStats)
+	// 	}, 300)
+	// })
+
+	let systemStatus = await request('platformStatusOverview/systemStatus', params, 'get')
+	console.log('010', systemStatus)
+
+	// 平台统计数据
+	let json = {
+		code: 200,
+		message: '获取成功',
+		data: {
+			totalCourses: systemStatus.COURSE_TOTAL,
+			openedCourses: systemStatus.COURSE_OPEN_TOTAL,
+			totalTeachers: systemStatus.TEACHER_TOTAL,
+			totalStudents: systemStatus.STUDENT_TOTAL
+		}
+	}
+
+	return json
 }
 
 // 获取热门课程列表
-export const getHotCourses = () => {
-	return new Promise((resolve) => {
-		setTimeout(() => {
-			resolve(mockData.hotCourses)
-		}, 300)
+export const getHotCourses = async (params) => {
+	// return new Promise((resolve) => {
+	// 	setTimeout(() => {
+	// 		resolve(mockData.hotCourses)
+	// 	}, 300)
+	// })
+
+	let popularCourses = await request('platformStatusOverview/popularCourses', params, 'get')
+	console.log('011', popularCourses)
+	let data = []
+	// COLLECT_COUNT:1
+	// COURSE_ID:"1955176675276976130"
+	// COURSE_NAME:"机电实训楼"
+	// TEACHER_NAME:"王五"
+	// VIEW_COUNT:289
+	ForEach(popularCourses.popularCourses, (item) => {
+		data.push({
+			id: item.COURSE_ID,
+			rank: 1,
+			name: item.COURSE_NAME,
+			teacher: item.TEACHER_NAME,
+			visits: item.VIEW_COUNT,
+			references: item.COLLECT_COUNT
+		})
 	})
-}
 
+
+// 热门课程数据
+// 	hotCourses: {
+// 		code: 200,
+// 			message: '获取成功',
+// 			data: [
+// 			{
+// 				id: 1,
+// 				rank: 1,
+// 				name: 'Python数据分析',
+// 				teacher: '王老师',
+// 				visits: '2,345',
+// 				references: 56
+// 			},
+	// 平台统计数据
+	let json = {
+		code: 200,
+		message: '获取成功',
+		data
+	}
+
+	return json
+}
+function timestampToYYYYMMDD(timestamp) {
+	let date
+	if(timestamp == undefined){
+		date = new Date();
+		return date.toISOString().split('T')[0];
+	}
+	 date = new Date(timestamp);
+	return date.toISOString().split('T')[0];
+}
 // 获取开课信息列表
-export const getCourseInfo = (params = {}) => {
-	const { current = 1, size = 10 } = params
-
-	return new Promise((resolve) => {
-		setTimeout(() => {
-			const response = {
-				...mockData.courseInfo,
-				data: {
-					...mockData.courseInfo.data,
-					current,
-					size
-				}
-			}
-			resolve(response)
-		}, 300)
+export const getCourseInfo = async (params = {}) => {
+	const {current = 1, size = 10} = params
+
+	// return new Promise((resolve) => {
+	// 	setTimeout(() => {
+	// 		const response = {
+	// 			...mockData.courseInfo,
+	// 			data: {
+	// 				...mockData.courseInfo.data,
+	// 				current,
+	// 				size
+	// 			}
+	// 		}
+	// 		resolve(response)
+	// 	}, 300)
+	// })
+	let allCourses = await request('platformStatusOverview/allCourses', params, 'get')
+	console.log('022', allCourses)
+	let records = []
+	ForEach(allCourses.allCourses, (item) => {
+		records.push({
+			id: item.COURSE_ID,
+			name: item.COURSE_NAME,
+			teacher: item.TEACHER_NAME,
+			startDate: timestampToYYYYMMDD(item.START_TIME),
+			studentCount: item.STUDENT_COUNT,
+			visits: item.VIEW_COUNT,
+		})
 	})
+	let json = {
+		code: 200,
+		message: '获取成功',
+		data : {
+			records,
+			total: 5,
+			current: 1,
+			size: 10
+		},
+
+	}
+
+	return json
+	// data: {
+	// 	records: [
+	// 		{
+	// 			id: 1,
+	// 			name: 'Python数据分析',
+	// 			teacher: '王老师',
+	// 			startDate: '2024-03-01',
+	// 			studentCount: 320,
+	// 			visits: '2,345'
+	// 		},
+	// 	],
+	// 		total: 5,
+	// 		current: 1,
+	// 		size: 10
+	// }
+
+
+
+	// {
+	// 	"TEACHER_ID": "1935565895337304066",
+	// 	"TEACHER_NAME": "王五",
+	// 	"VIEW_COUNT": 34,
+	// 	"COURSE_ID": "1954728193252552705",
+	// 	"STUDENT_COUNT": 0,
+	// 	"ID": "1954819544520286208",
+	// 	"COURSE_NAME": "农业课"
+	// }
+
+
 }
 
 // 获取课程访问统计
-export const getCourseVisitStats = (params) => {
-	const { courseName } = params
-
-	return new Promise((resolve) => {
-		setTimeout(() => {
-			// 生成近7天的日期
-			const days = []
-			const today = new Date()
-			for (let i = 6; i >= 0; i--) {
-				const date = new Date(today)
-				date.setDate(date.getDate() - i)
-				const month = (date.getMonth() + 1).toString().padStart(2, '0')
-				const day = date.getDate().toString().padStart(2, '0')
-				days.push(`${month}-${day}`)
-			}
+export const getCourseVisitStats = async (params) => {
+	const {courseId} = params
 
-			// 生成模拟访问数据
-			const baseVisits = [120, 156, 178, 210, 234, 245, 267]
-			const visitData = baseVisits.map((base) => {
-				const randomFactor = 0.8 + Math.random() * 0.4
-				return Math.round(base * randomFactor)
-			})
-
-			const response = {
-				...mockData.courseVisitStats,
-				data: {
-					courseName,
-					visitData,
-					dateRange: days
-				}
-			}
-			resolve(response)
-		}, 300)
+	// return new Promise((resolve) => {
+	// 	setTimeout(() => {
+	// 		// 生成近7天的日期
+	// 		const days = []
+	// 		const today = new Date()
+	// 		for (let i = 6; i >= 0; i--) {
+	// 			const date = new Date(today)
+	// 			date.setDate(date.getDate() - i)
+	// 			const month = (date.getMonth() + 1).toString().padStart(2, '0')
+	// 			const day = date.getDate().toString().padStart(2, '0')
+	// 			days.push(`${month}-${day}`)
+	// 		}
+	//
+	// 		// 生成模拟访问数据
+	// 		const baseVisits = [120, 156, 178, 210, 234, 245, 267]
+	// 		const visitData = baseVisits.map((base) => {
+	// 			const randomFactor = 0.8 + Math.random() * 0.4
+	// 			return Math.round(base * randomFactor)
+	// 		})
+	//
+	// 		const response = {
+	// 			...mockData.courseVisitStats,
+	// 			data: {
+	// 				courseId,
+	// 				visitData,
+	// 				dateRange: days
+	// 			}
+	// 		}
+	// 		resolve(response)
+	// 	}, 300)
+	// })
+	let courseVisitTrend = await request('platformStatusOverview/courseVisitTrend', params, 'get')
+	console.log('033', courseVisitTrend)
+	const days = []
+	const today = new Date()
+	for (let i = 6; i >= 0; i--) {
+		const date = new Date(today)
+		date.setDate(date.getDate() - i)
+		const month = (date.getMonth() + 1).toString().padStart(2, '0')
+		const day = date.getDate().toString().padStart(2, '0')
+		days.push(`${month}-${day}`)
+	}
+	let visitData = []
+	ForEach(courseVisitTrend.visitTrend, (item) => {
+		visitData.push(item.visitCount)
 	})
+	let json = {
+		code: 200,
+		message: '获取成功',
+		data : {
+			courseId,
+			visitData,
+			dateRange: days
+		},
+
+	}
+
+	return json
 }

+ 121 - 65
src/api/statisticalAnalysis/statisticalAnalysisResourceLibrary.js

@@ -1,4 +1,4 @@
-import { moduleRequest } from '@/utils/request'
+import {moduleRequest} from '@/utils/request'
 import Mock from 'mockjs'
 import ForEach from "lodash-es/forEach";
 
@@ -117,7 +117,7 @@ const generateMockData = (filters = {}) => {
 	const formatCounts = generateFormatCounts()
 
 	return {
-		filterResponse : getFilterData(),
+		filterResponse: getFilterData(),
 		// 摘要数据
 		summaryData: {
 			code: 200,
@@ -243,17 +243,17 @@ export const getSummaryData = async (params = {}) => {
 	// 	}, Mock.mock('@integer(200, 500)')) // 随机延迟
 	// })
 
-	let res =  await request('/resourceStatistic/totalStatistic', params, 'get')
-	console.log('什么呢1233',res)
+	let res = await request('/resourceStatistic/totalStatistic', params, 'get')
+	console.log('什么呢1233', res)
 	let json = {
-		code : 200,
-		data : {
-			totalResources : res.RESOURCE_TOTAL,
-			totalStorage : `${kbToTb(res.storageSize)}TB`,
-			totalCapacity : `${kbToTb(res.totalStorageSize)}TB`,
-			usageRate : `${((parseFloat(res.storageSize) / res.totalStorageSize) * 100).toFixed(0)}%`,
-			totalViews : res.WATCH_TOTAL,
-			totalFavorites : res.COLLECT_TOTAL
+		code: 200,
+		data: {
+			totalResources: res.RESOURCE_TOTAL,
+			totalStorage: `${kbToTb(res.storageSize)}TB`,
+			totalCapacity: `${kbToTb(res.totalStorageSize)}TB`,
+			usageRate: `${((parseFloat(res.storageSize) / res.totalStorageSize) * 100).toFixed(0)}%`,
+			totalViews: res.WATCH_TOTAL,
+			totalFavorites: res.COLLECT_TOTAL
 		}
 	}
 	// {
@@ -264,17 +264,18 @@ export const getSummaryData = async (params = {}) => {
 	// 	"storageSize": 1726487824,
 	// 	"totalStorageSize": 21474836480
 	// }
-		// totalResources: '0',
-		// totalStorage: '0 TB',
-		// totalCapacity: '10 TB',
-		// usageRate: '0%',
-		// totalViews: '0',
-		// totalFavorites: '0'
+	// totalResources: '0',
+	// totalStorage: '0 TB',
+	// totalCapacity: '10 TB',
+	// usageRate: '0%',
+	// totalViews: '0',
+	// totalFavorites: '0'
 	// 真实接口调用:
 	// return request('/resource-library/summary', params, 'get')
-	console.log('什么呢',json)
+	console.log('什么呢', json)
 	return json
 }
+
 function kbToTb(kb) {
 	const tb = kb / 1073741824;
 	return parseFloat(tb.toFixed(2));
@@ -283,13 +284,13 @@ function kbToTb(kb) {
 export const getFilterData = async (params = {}) => {
 	let colleges = await request('resourceStatistic/selectOrgList', params, 'get')
 	colleges.unshift({
-		id : 'all',
-		name : '全部院系'
+		id: 'all',
+		name: '全部院系'
 	})
-	console.log("什么呢sss",colleges)
+	console.log("什么呢sss", colleges)
 	let json = {
 		code: 200,
-		data : colleges
+		data: colleges
 	}
 
 	return json
@@ -297,7 +298,7 @@ export const getFilterData = async (params = {}) => {
 
 export const getResourceTypeData = async (params = {}) => {
 	let resourceTypeStatistic = await request('resourceStatistic/resourceTypeStatistic', params, 'get')
-	console.log('左面的',resourceTypeStatistic)
+	console.log('左面的', resourceTypeStatistic)
 	let types = []
 	let typeCounts = []
 	ForEach(resourceTypeStatistic, (item) => {
@@ -309,10 +310,10 @@ export const getResourceTypeData = async (params = {}) => {
 	// 	typeCounts: typeCounts,
 	let json = {
 		code: 200,
-		data : {
+		data: {
 			types,
 			typeCounts,
-			typeStorage : []
+			typeStorage: []
 		}
 	}
 	return json
@@ -327,7 +328,7 @@ export const getResourceTypeData = async (params = {}) => {
 
 }
 
-export const getDepartmentData = async(params = {}) => {
+export const getDepartmentData = async (params = {}) => {
 	let collegeStatistic = await request('resourceStatistic/collegeStatistic', params, 'get')
 	let departments = []
 	let departmentCounts = []
@@ -337,10 +338,10 @@ export const getDepartmentData = async(params = {}) => {
 	})
 	let json = {
 		code: 200,
-		data : {
+		data: {
 			departments,
 			departmentCounts,
-			departmentStorage : []
+			departmentStorage: []
 		}
 	}
 	return json
@@ -358,7 +359,7 @@ export const getDepartmentData = async(params = {}) => {
 	// return request('/resource-library/department-distribution', params, 'get')
 }
 
-export const getVisibilityData = async(params = {}) => {
+export const getVisibilityData = async (params = {}) => {
 	// return new Promise((resolve) => {
 	// 	setTimeout(() => {
 	// 		const mockData = generateMockData(params)
@@ -366,7 +367,7 @@ export const getVisibilityData = async(params = {}) => {
 	// 	}, Mock.mock('@integer(200, 500)'))
 	// })
 	let resourcePublicStatistic = await request('resourceStatistic/resourcePublicStatistic', params, 'get')
-	let visibility = ['非公开','公开']
+	let visibility = ['非公开', '公开']
 	let visibilityCounts = []
 	ForEach(resourcePublicStatistic, (item) => {
 		visibilityCounts.push(item.num)
@@ -378,26 +379,26 @@ export const getVisibilityData = async(params = {}) => {
 	let hotStatistic = await request('resourceStatistic/hotStatistic', params, 'get')
 	ForEach(hotStatistic, (item) => {
 		//1推荐  2热门  3推荐和热门
-		if(item.type == 1){
+		if (item.type == 1) {
 			hotness.push('推荐')
 		}
-		if(item.type == 2){
+		if (item.type == 2) {
 			hotness.push('热门')
 		}
-		if(item.type == 3){
+		if (item.type == 3) {
 			hotness.push('推荐和热门')
 		}
 		hotnessCounts.push(item.num)
 	})
 
 
-	console.log('接口看看',hotStatistic)
-	let recommendedCounts = [12,13]
+	console.log('接口看看', hotStatistic)
+	let recommendedCounts = [12, 13]
 
 
 	let json = {
 		code: 200,
-		data : {
+		data: {
 			visibility,
 			visibilityCounts,
 			hotness,
@@ -426,12 +427,10 @@ export const getVisibilityData = async(params = {}) => {
 	// }
 
 
-
-
 	// return request('/resource-library/visibility-analysis', params, 'get')
 }
 
-export const getFormatData = async(params = {}) => {
+export const getFormatData = async (params = {}) => {
 	// return new Promise((resolve) => {
 	// 	setTimeout(() => {
 	// 		const mockData = generateMockData(params)
@@ -446,7 +445,7 @@ export const getFormatData = async(params = {}) => {
 		formatCounts.push(item.num)
 	})
 	let storageStatistic = await request('resourceStatistic/storageStatistic', params, 'get')
-	console.log('内存',storageStatistic)
+	console.log('内存', storageStatistic)
 	let formatAvgSize = []
 	ForEach(storageStatistic, (item) => {
 		formatAvgSize.push(item.extendName)
@@ -454,21 +453,21 @@ export const getFormatData = async(params = {}) => {
 
 	let json = {
 		code: 200,
-		data : {
+		data: {
 			formats,
 			formatCounts,
 			formatStorage: storageStatistic.map((item) => {
 					let size = (item.FILESIZE) * parseFloat(1).toFixed(2)
-					console.log("asdasd",item.FILESIZE)
-					return `${(item.FILESIZE/1000/1000).toFixed(2)}`
-			}
+					console.log("asdasd", item.FILESIZE)
+					return `${(item.FILESIZE / 1000 / 1000).toFixed(2)}`
+				}
 			),
 			formatAvgSize: storageStatistic.map((format, index) => {
-			// 根据文件类型设置合理的平均大小
-			const size = format.avgSize
-			// if (size > 1000) return `${(size / 1000).toFixed(1)}MB`
-			return `${(size/1000/1000).toFixed(2)}MB`
-		})
+				// 根据文件类型设置合理的平均大小
+				const size = format.avgSize
+				// if (size > 1000) return `${(size / 1000).toFixed(1)}MB`
+				return `${(size / 1000 / 1000).toFixed(2)}MB`
+			})
 		}
 	}
 	return json
@@ -504,26 +503,50 @@ export const getFormatData = async(params = {}) => {
 	// },
 
 
-
 	// return request('/resource-library/format-distribution', params, 'get')
 }
 
-export const getEngagementData = async(params = {}) => {
+export const getEngagementData = async (params = {}) => {
 	// return new Promise((resolve) => {
 	// 	setTimeout(() => {
 	// 		const mockData = generateMockData(params)
 	// 		resolve(mockData.engagementData)
 	// 	}, Mock.mock('@integer(200, 500)'))
 	// })
-	let totalStatistic = await request('resourceStatistic/totalStatistic', params, 'get')
-	console.log('001 ',totalStatistic)
+	let selectResourceUse = await request('resourceStatistic/selectResourceUse', params, 'get')
+	let selectResourceCans = await request('resourceStatistic/selectResourceCans', params, 'get')
+	console.log('001 ', selectResourceUse)
+	console.log('003 ', selectResourceCans)
+	let engagement = []
+	let engagementCounts = []
+	let typeViewCounts = []
+	ForEach(selectResourceUse, (item) => {
+		//1、资源观看 2资源收藏 3资源分享
+		if (item.type == 1) {
+			engagement.push('资源观看')
+			engagementCounts.push(item.num)
+		}
+		if (item.type == 2) {
+			engagement.push('资源收藏')
+			engagementCounts.push(item.num)
+		}
+		if (item.type == 3) {
+			engagement.push('资源分享')
+			engagementCounts.push(item.num)
+		}
+	})
+	ForEach(selectResourceCans, (item) => {
+		//1、资源观看 2资源收藏 3资源分享
+		typeViewCounts.push(item.num)
+	})
+
+
 	let json = {
 		code: 200,
-		data : {
-			engagement: ['观看', '收藏', '分享'],
-						engagementCounts: [
-							//船锚
-					],
+		data: {
+			engagement,
+			engagementCounts,
+			typeViewCounts
 		}
 	}
 	return json
@@ -544,12 +567,45 @@ export const getEngagementData = async(params = {}) => {
 
 }
 
-export const getTrendData = (params = {}) => {
-	return new Promise((resolve) => {
-		setTimeout(() => {
-			const mockData = generateMockData(params)
-			resolve(mockData.trendData)
-		}, Mock.mock('@integer(200, 500)'))
+export const getTrendData = async (params = {}) => {
+	// return new Promise((resolve) => {
+	// 	setTimeout(() => {
+	// 		const mockData = generateMockData(params)
+	// 		resolve(mockData.trendData)
+	// 	}, Mock.mock('@integer(200, 500)'))
+	// })
+	let selectResourceUpload = await request('resourceStatistic/selectResourceUpload', params, 'get')
+	console.log('002 ',selectResourceUpload)
+	let engagement = []
+	let trendLabels = []
+	let uploadTrend = []
+	let viewTrend = []
+	ForEach(selectResourceUpload, (item) => {
+		//1、资源观看 2资源收藏 3资源分享
+		trendLabels.push(item.createMonth)
+		uploadTrend.push(item.uploadNum)
+		viewTrend.push(item.seeNum)
 	})
+
+
+
+	let json = {
+		code: 200,
+		data : {
+			trendLabels,
+			uploadTrend,
+			viewTrend
+		}
+	}
+	return json
+	// 时间趋势数据
+	// trendData: {
+	// 	code: 200,
+	// 		data: {
+	// 		trendLabels: months,
+	// 			uploadTrend: months.map(() => Math.floor((adjustedTotalResources / 12) * (0.6 + Math.random() * 0.8))), // 月均上传量有波动
+	// 			viewTrend: months.map(() => Math.floor((adjustedViews / 12) * (0.7 + Math.random() * 0.6))) // 月均观看量有波动
+	// 	}
+	// }
 	// return request('/resource-library/trend-analysis', params, 'get')
 }

+ 7 - 4
src/views/statisticalAnalysis/platformStatusOverview/index.vue

@@ -153,7 +153,8 @@
 			key: 'action',
 			align: 'center',
 			customRender: ({ record }) => {
-				return h('button', { class: 'btn-view', onClick: () => showVisitModal(record.name) }, '查看')
+				console.log("分析呢",record)
+				return h('button', { class: 'btn-view', onClick: () => showVisitModal(record.id) }, '查看')
 			}
 		}
 	]
@@ -194,6 +195,7 @@
 	const loadCourseInfo = async (params = {}) => {
 		try {
 			const response = await getCourseInfo(params)
+			console.log("888",response)
 			courseInfoData.value = response.data.records
 			courseInfoPagination.total = response.data.total
 			courseInfoPagination.current = response.data.current
@@ -213,12 +215,13 @@
 	}
 
 	// 显示访问统计弹窗
-	const showVisitModal = async (courseName) => {
-		modalTitle.value = `${courseName} - 近7天访问统计`
+	const showVisitModal = async (courseId) => {
+		modalTitle.value = `${courseId} - 近7天访问统计`
 		visitModalVisible.value = true
 
 		try {
-			const response = await getCourseVisitStats({ courseName })
+			const response = await getCourseVisitStats({ courseId })
+			console.log('如家七天',response)
 			nextTick(() => {
 				initVisitChart(response.data)
 			})

+ 1 - 1
src/views/statisticalAnalysis/statisticalAnalysisResourceLibrary/index.vue

@@ -334,7 +334,7 @@
 					series: [
 						{
 							type: 'pie',
-							radius: ['40%', '70%'],
+							radius: ['40%', '60%'],
 							data: chartData.value.types.map((name, index) => ({
 								value: chartData.value.typeCounts[index],
 								name