Bladeren bron

学生端专属路由页面添加

canghailong 7 maanden geleden
bovenliggende
commit
9bce26d3f1

+ 118 - 69
src/router/student.js

@@ -1,79 +1,128 @@
 const forum = [
 	{
 		path: '/',
-		redirect: '/portal/resourceCenter'
-	},
-	{
-		path: '/student/classCentre',
-		hide: true,
-		component: () => import('@/views/student/classCentre/index.vue'),
-		meta: {
-			title: '课程中心详情'
-		}
-	},
-	{
-		path: '/student/paper',
-		name: 'studentPaper',
-		component: () => import('@/views/student/paper/index.vue'),
-		meta: {
-			title: '学生试卷'
-		}
-	},
-	{
-		path: '/student/questionError',
-		name: 'questionError',
-		component: () => import('@/views/student/question-error/index.vue'),
-		meta: {
-			title: '错题本'
-		}
-	},
-	{
-		path: '/student/do',
-		name: 'studentDo',
-		component: () => import('@/views/student/exam/paper/do.vue'),
-		meta: {
-			title: '试卷答题' //从学生试卷列表进入
-		}
-	},
-	{
-		path: '/student/read',
-		name: 'studentRead',
-		component: () => import('@/views/student/exam/paper/read.vue'),
-		meta: {
-			title: '试卷查看' //学生端,老师端都可用
-		}
-	},
-	{
-		path: '/exm/question',
-		name: 'exmQuestion',
-		component: () => import('@/views/exm/question/index.vue'),
-		meta: {
-			title: '题目列表'
-		}
-	},
-	{
-		path: '/exm/exampaper',
-		name: 'exmExampaper',
-		component: () => import('@/views/exm/exampaper/index.vue'),
-		meta: {
-			title: '试卷列表'
-		}
-	},
-	{
-		path: '/exm/questionnaireManagement',
-		name: 'exmQuestionnaireManagement',
-		component: () => import('@/views/exm/questionnaireManagement/index.vue'),
+		redirect: '/student/resourceCenter',
 		meta: {
-			title: '问卷管理'
+			title: '资源中心'
 		}
 	},
 	{
-		path: '/exm/examinationManagement',
-		name: 'exmExaminationManagement',
-		component: () => import('@/views/exm/examinationManagement/index.vue'),
-		meta: {
-			title: '考试管理'
-		}
+		path: '/student',
+		component: () => import('@/views/portal/index.vue'),
+		children: [
+			{
+				path: '/userInfo',
+				component: () => import('@/views/student/user/index.vue'),
+				meta: {
+					title: '个人中心'
+				}
+			},
+			{
+				path: '/inSsiteMessage',
+				component: () => import('@/views/student/In-site-message/index.vue'),
+				meta: {
+					title: '站内信'
+				}
+			},
+			{
+				path: '/classNotice',
+				component: () => import('@/views/student/classNotice/index.vue'),
+				meta: {
+					title: '课程公告'
+				}
+			},
+			{
+				path: '/learningFootprint',
+				component: () => import('@/views/student/learningFootprint/index.vue'),
+				meta: {
+					title: '学习足迹'
+				}
+			},
+			{
+				path: '/passwordRetrieve',
+				component: () => import('@/views/student/password/index.vue'),
+				meta: {
+					title: '密码找回'
+				}
+			},
+			{
+				path: 'resourceCenter',
+				component: () => import('@/views/resourceCenter/index.vue'),
+				meta: {
+					title: '资源中心'
+				}
+			},
+			{
+				path: 'resourceDetails',
+				component: () => import('@/views/resourceDetails/index.vue'),
+				meta: {
+					title: '资源中心详情'
+				}
+			},
+			{
+				path: 'courseCenter',
+				component: () => import('@/views/courseCenter/index.vue'),
+				meta: {
+					title: '课程中心'
+				}
+			},
+			{
+				path: 'classCentre',
+				hide: true,
+				component: () => import('@/views/student/classCentre/index.vue'),
+				meta: {
+					title: '课程中心详情'
+				}
+			},
+			{
+				path: 'paper',
+				name: 'studentPaper',
+				component: () => import('@/views/student/paper/index.vue'),
+				meta: {
+					title: '学生试卷'
+				}
+			},
+			{
+				path: 'questionError',
+				name: 'questionError',
+				component: () => import('@/views/student/question-error/index.vue'),
+				meta: {
+					title: '错题本'
+				}
+			},
+			{
+				path: 'do',
+				name: 'studentDo',
+				component: () => import('@/views/student/exam/paper/do.vue'),
+				meta: {
+					title: '试卷答题' //从学生试卷列表进入
+				}
+			},
+			{
+				path: 'read',
+				name: 'studentRead',
+				component: () => import('@/views/student/exam/paper/read.vue'),
+				meta: {
+					title: '试卷查看' //学生端,老师端都可用
+				}
+			},
+			{
+				path: 'exampaper',
+				name: 'exmExampaper',
+				component: () => import('@/views/exm/exampaper/index.vue'),
+				meta: {
+					title: '试卷列表'
+				}
+			},
+			{
+				path: 'questionnaireManagement',
+				name: 'exmQuestionnaireManagement',
+				component: () => import('@/views/exm/questionnaireManagement/index.vue'),
+				meta: {
+					title: '问卷管理'
+				}
+			}
+		]
 	}
 ]
 export default forum

+ 1 - 93
src/router/whiteList.js

@@ -6,42 +6,6 @@ const constRouters = [
 	{
 		path: '/callback'
 	},
-	{
-		path: '/portal',
-		component: () => import('@/views/portal/index.vue')
-	},
-	{
-		path: '/portal/resourceCenter',
-		component: () => import('@/views/resourceCenter/index.vue')
-	},
-	{
-		path: '/portal/resourceDetails',
-		component: () => import('@/views/resourceDetails/index.vue')
-	},
-	{
-		path: '/portal/personalResources',
-		component: () => import('@/views/myResources/personalResources/index.vue')
-	},
-	{
-		path: '/portal/resourceManagement',
-		component: () => import('@/views/myResources/resourceManagement/index.vue')
-	},
-	{
-		path: '/portal/courseCenter',
-		component: () => import('@/views/courseCenter/index.vue')
-	},
-	{
-		path: '/portal/courseDetails',
-		component: () => import('@/views/courseDetails/index.vue')
-	},
-	{
-		path: '/portal/courseAdd',
-		component: () => import('@/views/courseAdd/index.vue')
-	},
-	{
-		path: '/portal/courseManagement',
-		component: () => import('@/views/courseManagement/index.vue')
-	},
 	{
 		path: '/other',
 		name: 'other',
@@ -78,54 +42,6 @@ const constRouters = [
 		},
 		props: true
 	},
-	{
-		path: '/student/paper/',
-		name: 'studentPaper',
-		component: () => import('@/views/student/paper/index.vue'),
-		meta: {
-			title: '学生试卷'
-		}
-	},
-	{
-		path: '/student/edit/',
-		name: 'studentEdit',
-		component: () => import('@/views/student/exam/paper/edit.vue'),
-		meta: {
-			title: '试卷批改'
-		}
-	},
-	{
-		path: '/student/record/',
-		name: 'studentRecord',
-		component: () => import('@/views/student/record/index.vue'),
-		meta: {
-			title: '学生试卷'
-		}
-	},
-	{
-		path: '/student/questionError/',
-		name: 'QuestionErrorIndex',
-		component: () => import('@/views/student/question-error/index.vue'),
-		meta: {
-			title: '错题本'
-		}
-	},
-	{
-		path: '/student/do/',
-		name: 'studentDo',
-		component: () => import('@/views/student/exam/paper/do.vue'),
-		meta: {
-			title: '试卷答题'
-		}
-	},
-	{
-		path: '/student/read/',
-		name: 'studentRead',
-		component: () => import('@/views/student/exam/paper/read.vue'),
-		meta: {
-			title: '试卷查看'
-		}
-	},
 	{
 		path: '/slogin',
 		component: () => import('@/views/slogin/login.vue')
@@ -133,15 +49,7 @@ const constRouters = [
 	{
 		path: '/tlogin',
 		component: () => import('@/views/tlogin/login.vue')
-	},
-	{
-		path: '/classManagement',
-		component: () => import('@/views/classManagement/index.vue')
-	},
-	{
-		path: '/announcementManagement',
-		component: () => import('@/views/announcementManagement/index.vue')
-	},
+	}
 ]
 /**
  * 路由白名单(数组形式)

+ 8 - 1
src/views/courseCenter/components/ResourceList.vue

@@ -96,6 +96,8 @@
 	import tool from '@/utils/tool'
 	import EventBus from '@/utils/EventBus'
 	import sysConfig from '@/config/index'
+	import { useRouter, useRoute } from 'vue-router'
+	const router = useRouter()
 
 	const queryData = ref({})
 	const total = ref(0)
@@ -122,7 +124,12 @@
 	}
 
 	const handleItem = (item) => {
-		EventBus.emit('openCourseDetails', { id: item.courseId })
+		router.push({
+			path: '/student/classCentre',
+			query:{
+				id: item.courseId
+			}
+		})
 	}
 
 	const onSearch = (value) => {

+ 3 - 40
src/views/courseCenter/index.vue

@@ -1,14 +1,7 @@
 <template>
-	<div style="overflow-y: auto">
-		<a-layout>
-			<Header @onChangeCurrent="onChangeCurrent" />
-			<div style="width: 71%; margin-left: 10%">
-				<div style="height: 20px"></div>
-				<ResourceList />
-			</div>
-		</a-layout>
-		<Footer />
-	</div>
+	<a-card>
+		<ResourceList />
+	</a-card>
 </template>
 
 <script setup>
@@ -16,38 +9,8 @@
 	import Footer from '@/views/portal/components/Footer.vue'
 	import ResourceList from './components/ResourceList.vue'
 	import { useRouter, useRoute } from 'vue-router'
-
-	import EventBus from '@/utils/EventBus'
-
 	const router = useRouter()
-	const indexType = ref('resourceCenter')
-	const onChangeCurrent = (current) => {
-		indexType.value = current
-
-		router.push({
-			path: '/' + current
-		})
-	}
 
-	const handlerItemCorrelation = (item) => {
-		// emit('handlerItemSidebar', item)
-	}
-	const handleOpenCourseDetails = (item) => {
-		console.log('看看呢', item)
-		router.push({
-			path: '/portal/courseDetails',
-			query: {
-				id: item.id
-			}
-		})
-	}
-	onMounted(() => {
-		// setTimeout(() => {
-		// 	images.value = 'http://192.168.1.245:10005/education/2025/7/2/1940361083973906434.jpg'
-		// }, 10000)
-	})
-	EventBus.off('openCourseDetails', handleOpenCourseDetails)
-	EventBus.on('openCourseDetails', handleOpenCourseDetails)
 </script>
 
 <style scoped>

+ 8 - 10
src/views/portal/components/Header.vue

@@ -4,15 +4,13 @@
 	管理员 -->
 	<div v-if="userInfo.eduIdentity == 2" class="fcbc">
 		<div class="headerBtn">
-			<div style="width: 120px; background-color: brown"></div>
 			<a-menu v-model:selectedKeys="current" mode="horizontal">
-				<a-menu-item key="portal/resourceCenter">资源中心</a-menu-item>
-				<a-menu-item key="portal/courseCenter">课程中心</a-menu-item>
-				<a-menu-item key="portal/resourceManagement">课程详情</a-menu-item>
+				<a-menu-item key="student/resourceCenter">资源中心</a-menu-item>
+				<a-menu-item key="student/courseCenter">课程中心</a-menu-item>
 				<a-sub-menu key="myList">
 					<template #title>我的</template>
 					<a-menu-item key="student/paper">我的考试</a-menu-item>
-					<a-menu-item key="portal/courseManagement">我的作业</a-menu-item>
+					<a-menu-item key="student/courseManagement">我的作业</a-menu-item>
 					<a-menu-item key="exm/questionnaireManagement">调查问卷</a-menu-item>
 					<a-menu-item key="exm/questionnaireManagement">课程收藏</a-menu-item>
 				</a-sub-menu>
@@ -28,13 +26,13 @@
 				</div>
 				<template #overlay>
 					<a-menu>
-						<a-menu-item key="1" @click="jump('/')">个人中心</a-menu-item>
+						<a-menu-item key="1" @click="jump('/userInfo')">个人中心</a-menu-item>
 						<a-menu-item key="2" @click="jump('/forum')">论坛</a-menu-item>
-						<a-menu-item key="3" @click="jump('/')">站内信</a-menu-item>
-						<a-menu-item key="4" @click="jump('/')">课程公告</a-menu-item>
-						<a-menu-item key="5" @click="jump('/')">学习足迹</a-menu-item>
+						<a-menu-item key="3" @click="jump('/inSsiteMessage')">站内信</a-menu-item>
+						<a-menu-item key="4" @click="jump('/classNotice')">课程公告</a-menu-item>
+						<a-menu-item key="5" @click="jump('/learningFootprint')">学习足迹</a-menu-item>
 						<a-menu-item key="6" @click="jump('/slogin')">登录</a-menu-item>
-						<a-menu-item key="7" @click="jump('/')">密码找回</a-menu-item>
+						<a-menu-item key="7" @click="jump('/passwordRetrieve')">密码找回</a-menu-item>
 						<a-menu-item key="8" @click="outLogin()">退出登陆</a-menu-item>
 					</a-menu>
 				</template>

+ 12 - 45
src/views/portal/index.vue

@@ -1,13 +1,12 @@
 <template>
 	<div style="overflow-y: auto">
-		<!-- <img :src="images" style="width: 100%; height: 100%" /> -->
 		<a-layout>
 			<Header @onChangeCurrent="onChangeCurrent" />
-			<div style="width: 71%; margin-left: 10%">
-				<!-- <BreadCrumb />
-				<ResourceCenter /> -->
-				<!-- <ResourceDetails v-if="indexType == 'resourceDetails'" ref="ResourceDetailsRef" /> -->
-			</div>
+			<a-layout-content class="main-content-wrapper">
+				<div class="flc">
+					<router-view v-slot="{ Component }" :key="route.fullPath" style="width: 1200px"></router-view>
+				</div>
+			</a-layout-content>
 		</a-layout>
 		<Footer />
 	</div>
@@ -15,56 +14,24 @@
 
 <script setup>
 	import Header from './components/Header.vue'
-	import BreadCrumb from './components/BreadCrumb.vue'
 	import Footer from './components/Footer.vue'
-	import ResourceCenter from '@/views/resourceCenter/index.vue'
-	import EventBus from '@/utils/EventBus'
 	import { useRouter, useRoute } from 'vue-router'
+	const route = useRoute()
 	const router = useRouter()
-
-	const indexType = ref('resourceCenter')
-
-	const images = ref('')
 	const ResourceDetailsRef = ref(null)
 	const onChangeCurrent = (current) => {
-		indexType.value = current
-
 		router.push({
 			path: '/' + current
 		})
 	}
-
-	const handlerItemSidebar = (item) => {
-		// emit('handlerItemSidebar', item)
-	}
-
-	const handleOpenResourceDetails = (item) => {
-		// emit('handlerItemSidebar', item)
-		// indexType.value = 'resourceDetails'
-		// nextTick(() => {
-		// 	console.log('看看呢', ResourceDetailsRef.value, item) /
-		// 		// if (ResourceDetailsRef.value) {
-		// 		// 	ResourceDetailsRef.value.setData(item)
-		// 		// }
-		// })
-		console.log('看看呢', item)
-		router.push({
-			path: '/portal/resourceDetails',
-			query: {
-				id: item.id
-			}
-		})
-	}
-	onMounted(() => {
-		// setTimeout(() => {
-		// 	images.value = 'http://192.168.1.245:10005/education/2025/7/2/1940361083973906434.jpg'
-		// }, 10000)
-	})
 </script>
 
 <style scoped>
-	.content {
-		/* padding-left: 10%;
-		padding-right: 30%; */
+	.flc {
+		display: flex;
+		justify-content: center;
+	}
+	.main-content-wrapper {
+		min-height: calc(100vh - 130px);
 	}
 </style>

+ 0 - 13
src/views/resourceCenter/components/ComplexChoices.vue

@@ -238,7 +238,6 @@
 		} else {
 			selectedDeptBigs.value = selectedDeptBigsList.value[e]
 		}
-		console.log('handleSelectedDept', e)
 		selectedDeptSmails.value = []
 		if (selectedDeptBigs.value.length > 0) {
 			Big.value.setClean(-1)
@@ -253,7 +252,6 @@
 		} else {
 			selectedDeptSmails.value = selectedDeptSmailsList.value[e - 1]
 		}
-		console.log('handleSelectedCourses', e, selectedDeptSmails.value)
 		if (selectedDeptSmails.value.length > 0) {
 			Smail.value.setClean(-1)
 		}
@@ -277,7 +275,6 @@
 		} else {
 			selectedTypes.value = selectedTypesBigList.value[e]
 		}
-		console.log('handleTypeChangeBig', e, selectedTypes.value)
 		if (selectedTypes.value.length > 0) {
 			Type.value.setClean(-1)
 		}
@@ -288,7 +285,6 @@
 		updateSelectedTags()
 	}
 	const handleTypeChange = (e) => {
-		console.log('handleTypeChange', ' e ', e, selectedTypes.value)
 		// selectedFormat.value = undefined // 选择课程类型时,重置课件格式
 		// updateSelectedTags()
 		updateSelectedTags()
@@ -311,9 +307,6 @@
 		// 	...(selectedType.value !== '全部' ? { key: 'Type', list: [selectedType.value] } : []),
 		// 	...(selectedFormat.value !== '全部' ? { key: 'Format', list: [selectedFormat.value] } : [])
 		// ]
-		console.log('筛选条件第一个', selectedDept.value, selectedDepts.value)
-		console.log('筛选条件第二个', selectedDeptBig.value, selectedDeptBigs.value)
-		console.log('筛选条件第三个', selectedDeptSmail.value, selectedDeptSmails.value)
 		if (
 			selectedDept.value !== undefined &&
 			selectedDept.value !== '' &&
@@ -350,7 +343,6 @@
 				queryData['collegeTwoId'] = selectedDeptBigs.value[selectedDeptBig.value].id
 			}
 		}
-		console.log('selectedDeptSmail', selectedDeptSmail.value, selectedDeptSmails.value)
 		if (
 			selectedDeptSmail.value !== undefined &&
 			selectedDeptSmail.value !== '' &&
@@ -437,7 +429,6 @@
 		// 	selectedTags.value.push(...[selectedFormat.value])
 		// 	selectedTagKeys.value.push('Format')
 		// }
-		console.log('筛选条件', selectedTags.value, selectedTagKeys.value)
 
 		EventBus.emit('upLoadList', queryData)
 	}
@@ -485,7 +476,6 @@
 			Dept.value.setClean(-1)
 			selectedDept.value = -1
 		}
-		console.log('要删除的东西', tag)
 
 		updateSelectedTags()
 	}
@@ -522,7 +512,6 @@
 		selectedDeptBig.value = -1
 		Dept.value.setClean(-1)
 		selectedDept.value = -1
-		// console.log('要删除的东西', tag)
 
 		updateSelectedTags()
 	}
@@ -553,7 +542,6 @@
 				}
 			})
 			spinningSelectedDepts.value = false
-			console.log('看看最小的', selectedDeptSmailsList.value)
 			// Dept.value.setClean(0)
 			// handleSelectedDept(0)
 			// handleSelectedCourses(0)
@@ -582,7 +570,6 @@
 		// selectedDepts.value.unshift({ name: '全部' })
 		// selectedDeptBigsList.value.unshift({ name: '全部' })
 		// selectedDeptSmailsList.value.unshift({ name: '全部' })
-		// console.log('看看呢', selectedDepts.value)
 		// updateSelectedTags()
 	}
 

+ 0 - 1
src/views/resourceCenter/components/Correlation.vue

@@ -52,7 +52,6 @@
 	const getList = () => {
 		list(currentPage)
 			.then((res) => {
-				console.log('下面列表获取', res)
 				if (res.code == 200) {
 					recommendations.value = res.data.records
 					currentPage.current = res.data.current

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

@@ -128,7 +128,6 @@
 	])
 
 	const selectTab = (key) => {
-		console.log('现在是点了tab', key)
 		if (key == 'latest') {
 			tabKey.value = 0
 		} else {
@@ -140,23 +139,18 @@
 		getList()
 	}
 	const handleItem = (item) => {
-		console.log('点了看教材的条目了', item)
-
 		EventBus.emit('openResourceDetails', { id: item.id })
 	}
 	const onSearch = (value) => {
-		console.log('搜索了', value)
 		currentPage.current = 1
 		currentPage.size = 12
 		getList()
 	}
 	const onChange = (page, pageSize) => {
-		console.log('翻页', page, pageSize)
 		getList()
 	}
 
 	// watch(currentPage.value.current, (newValue) => {
-	// 	console.log('变化了', newValue)
 	// 	// getList()
 	// })
 
@@ -164,7 +158,6 @@
 		loading.value = true
 		list({ ...currentPage, ...queryData.value })
 			.then((res) => {
-				console.log('下面列表获取', res)
 				if (res.code == 200) {
 					resources.value = res.data.records
 					total.value = res.data.total
@@ -185,7 +178,6 @@
 		loading.value = true
 		list({ ...currentPage, ...queryData.value })
 			.then((res) => {
-				// console.log('外面控制的刷新列表', res)
 				if (res.code == 200) {
 					resources.value = res.data.records
 					total.value = res.data.total

+ 0 - 1
src/views/resourceCenter/components/SidebarRecommend.vue

@@ -62,7 +62,6 @@
 	const getList = () => {
 		list(currentPage)
 			.then((res) => {
-				console.log('下面列表获取', res)
 				if (res.code == 200) {
 					recommendations.value = res.data.records
 					currentPage.current = res.data.current

+ 16 - 48
src/views/resourceCenter/index.vue

@@ -1,23 +1,18 @@
 <template>
-	<div style="overflow-y: auto">
-		<a-layout>
-			<Header @onChangeCurrent="onChangeCurrent" />
-			<div style="width: 71%; margin-left: 10%">
-				<ComplexChoices />
-				<div style="height: 20px"></div>
-				<a-row :gutter="16">
-					<a-col :span="18">
-						<ResourceList />
-					</a-col>
-					<a-col :span="6">
-						<SidebarRecommend @handlerItem="handlerItemSidebar" />
-						<Correlation @handlerItem="handlerItemCorrelation" />
-					</a-col>
-				</a-row>
-			</div>
-		</a-layout>
-		<Footer />
-	</div>
+	<a-card>
+		<div style="width: 100%;">
+			<ComplexChoices />
+			<a-row :gutter="16" class="mt-4">
+				<a-col :span="18">
+					<ResourceList />
+				</a-col>
+				<a-col :span="6">
+					<SidebarRecommend/>
+					<Correlation/>
+				</a-col>
+			</a-row>
+		</div>
+	</a-card>
 </template>
 
 <script setup>
@@ -34,42 +29,15 @@
 
 	const router = useRouter()
 	const indexType = ref('resourceCenter')
-	const onChangeCurrent = (current) => {
-		indexType.value = current
-
-		router.push({
-			path: '/' + current
-		})
-	}
-	const handlerItemSidebar = (item) => {
-		// emit('handlerItemSidebar', item)
-	}
-
-	const handlerItemCorrelation = (item) => {
-		// emit('handlerItemSidebar', item)
-	}
 	const handleOpenResourceDetails = (item) => {
-		// emit('handlerItemSidebar', item)
-		// indexType.value = 'resourceDetails'
-		// nextTick(() => {
-		// 	console.log('看看呢', ResourceDetailsRef.value, item) /
-		// 		// if (ResourceDetailsRef.value) {
-		// 		// 	ResourceDetailsRef.value.setData(item)
-		// 		// }
-		// })
-		console.log('看看呢', item)
 		router.push({
-			path: '/portal/resourceDetails',
+			path: '/student/resourceDetails',
 			query: {
 				id: item.id
 			}
 		})
 	}
-	onMounted(() => {
-		// setTimeout(() => {
-		// 	images.value = 'http://192.168.1.245:10005/education/2025/7/2/1940361083973906434.jpg'
-		// }, 10000)
-	})
+	onMounted(() => {})
 	EventBus.off('openResourceDetails', handleOpenResourceDetails)
 	EventBus.on('openResourceDetails', handleOpenResourceDetails)
 </script>

+ 9 - 51
src/views/resourceDetails/index.vue

@@ -1,20 +1,14 @@
 <template>
-	<div style="overflow-y: auto">
-		<a-layout>
-			<Header @onChangeCurrent="onChangeCurrent" />
-			<div style="width: 71%; margin-left: 10%">
-				<!-- <BreadCrumb /> -->
-				<VideoDetails :isState="isState" ref="VideoDetailsRef" @onGetPageCommentNew="onGetPageCommentNew" />
-				<TallList ref="tallList" v-show="!isState" />
-				<div style="display: flex; justify-content: flex-end; margin-top: 10px" v-if="isAudit && isState">
-					<a-button @click="handleAuditResult(3)" style="margin-right: 10px">不同意</a-button>
-					<a-button type="primary" @click="handleAuditResult(2)">同意</a-button>
-				</div>
-				<!-- <ResourceDetails v-if="indexType == 'resourceDetails'" ref="ResourceDetailsRef" /> -->
+	<a-card>
+		<div style="width: 100%">
+			<VideoDetails :isState="isState" ref="VideoDetailsRef" @onGetPageCommentNew="onGetPageCommentNew" />
+			<TallList ref="tallList" v-show="!isState" />
+			<div style="display: flex; justify-content: flex-end; margin-top: 10px" v-if="isAudit && isState">
+				<a-button @click="handleAuditResult(3)" style="margin-right: 10px">不同意</a-button>
+				<a-button type="primary" @click="handleAuditResult(2)">同意</a-button>
 			</div>
-		</a-layout>
-		<Footer />
-	</div>
+		</div>
+	</a-card>
 </template>
 
 <script setup>
@@ -37,39 +31,7 @@
 	const route = useRoute()
 	const isState = ref(route.query.state || null)
 	const isAudit = ref(route.query.audit || null)
-	//     {
-	//     "fileName": "Kettle文档",
-	//     "courseType": "0",
-	//     "courseTypeName": "必修",
-	//     "collegeAllId": "1938796923484962817,1938796975385280513,1938797957397676033",
-	//     "suffix": "doc",
-	//     "collegeTwoId": "1938796975385280513",
-	//     "verifyStatus": "2",
-	//     "collegeThreeIdName": "维修部",
-	//     "collegeThreeId": "1938797957397676033",
-	//     "collegeId": "1938796923484962817",
-	//     "resourceCreaterUserName": "超管",
-	//     "coverImage": "",
-	//     "coverImagePath": "",
-	//     "fileUrl": "upload/20250626/a37672e03659d06fa618842c9c443910.doc",
-	//     "courseIdName": "胸口碎大石2",
-	//     "id": "1938857816211292161",
-	//     "viewCount": 100,
-	//     "courseId": "1937326992873689091",
-	//     "collegeAllIdName": "汽车工程学院,汽车部门,维修部",
-	//     "FILESIZE": 1105920,
-	//     "majorId": "1",
-	//     "uploadTime": "2025-06-26 18:32:18",
-	//     "verifyStatusName": "已发布",
-	//     "resourceDesc": "大东北,是我的家乡,唢呐吹出了美美滴模样",
-	//     "collegeIdName": "汽车工程学院",
-	//     "majorIdName": "草台班子",
-	//     "collegeTwoIdName": "汽车部门",
-	//     "fileId": "1938183534250917888"
-	// }
 	const onGetPageCommentNew = (item) => {
-		// emit('handlerItemSidebar', item)
-		console.log('发消息去请求网卡罗2', item)
 		tallList.value.onGetPageCommentNew(item)
 	}
 	const handleAuditResult = (val) => {
@@ -99,8 +61,6 @@
 	}
 
 	const setData = (item) => {
-		// emit('handlerItemSidebar', item)
-
 		getData(item)
 	}
 	const getData = (item) => {
@@ -108,8 +68,6 @@
 			.then((res) => {
 				if (res.code == 200) {
 					itemData.value = res.data
-
-					// VideoDetailsRef.value.setData(res.data)
 				}
 			})
 			.catch((err) => {})

+ 127 - 0
src/views/student/In-site-message/index.vue

@@ -0,0 +1,127 @@
+<template>
+	<a-card title="站内信" :bordered="false" :bodyStyle="miniMessageBodyStyle">
+		<div class="index-message-list">
+			<a-list :data-source="messageList" size="small" :loading="miniMessageLoading">
+				<template #renderItem="{ item }">
+					<a-list-item>
+						<a-list-item-meta :description="item.createTime">
+							<template #title>
+								<a @click="messageDetail(item)">{{ item.subject }}</a>
+							</template>
+						</a-list-item-meta>
+					</a-list-item>
+				</template>
+			</a-list>
+		</div>
+		<xn-form-container title="详情" :width="700" :visible="visible" :destroy-on-close="true" @close="onClose">
+			<a-form ref="formRef" :model="formData" layout="vertical">
+				<a-form-item label="主题:" name="subject">
+					<span>{{ formData.subject }}</span>
+				</a-form-item>
+				<a-form-item label="发送时间:" name="createTime">
+					<span>{{ formData.createTime }}</span>
+				</a-form-item>
+				<a-form-item label="内容:" name="content">
+					<span>{{ formData.content }}</span>
+				</a-form-item>
+				<a-form-item label="查收情况:" name="receiveInfoList">
+					<s-table
+						ref="table"
+						:columns="columns"
+						:data="loadData"
+						:alert="false"
+						:showPagination="false"
+						bordered
+						:row-key="(record) => record.id"
+					>
+						<template #bodyCell="{ column, record }">
+							<template v-if="column.dataIndex === 'read'">
+								<span v-if="record.read" style="color: #d9d9d9">已读</span>
+								<span v-else style="color: #ff4d4f">未读</span>
+							</template>
+						</template>
+					</s-table>
+				</a-form-item>
+			</a-form>
+		</xn-form-container>
+	</a-card>
+</template>
+
+<script setup name="miniMessage">
+	import indexApi from '@/api/sys/indexApi'
+	import { onMounted } from 'vue'
+	import router from '@/router'
+	const miniMessageLoading = ref(false)
+	const messageList = ref([])
+	const miniMessageBodyStyle = ref({
+		'padding-top': '10px'
+	})
+	onMounted(() => {
+		// 进来后执行查询
+		getMessageList()
+	})
+	// 获取站内信列表
+	const getMessageList = () => {
+		miniMessageLoading.value = true
+		indexApi
+			.indexMessageList()
+			.then((data) => {
+				messageList.value = data
+			})
+			.finally(() => {
+				miniMessageLoading.value = false
+			})
+	}
+	// 跳转,用于点击更多按钮
+	const leaveFor = (url = '/') => {
+		router.replace({ path: url, query: { tab: 'userMessage' } })
+	}
+	// 点击详情
+	const messageDetail = (message) => {
+		visible.value = true
+		const param = {
+			id: message.id
+		}
+		indexApi.indexMessageDetail(param).then((data) => {
+			Object.assign(message, data)
+			formData.value = message
+			receiveInfoList.value = data.receiveInfoList
+			table.value.refresh(true)
+		})
+	}
+
+	const loadData = () => {
+		return new Promise((resolve) => {
+			resolve(receiveInfoList.value)
+		})
+	}
+	// 以下部分是抽屉的
+	const visible = ref(false)
+	const formRef = ref()
+	const receiveInfoList = ref([])
+	const formData = ref({})
+	const table = ref()
+	const columns = [
+		{
+			title: '姓名',
+			dataIndex: 'receiveUserName'
+		},
+		{
+			title: '是否已读',
+			dataIndex: 'read',
+			width: 120
+		}
+	]
+	// 关闭抽屉
+	const onClose = () => {
+		visible.value = false
+		formData.value = {}
+		receiveInfoList.value = []
+	}
+</script>
+
+<style scoped>
+	.index-message-list {
+		overflow: auto;
+	}
+</style>

+ 10 - 26
src/views/student/classCentre/index.vue

@@ -96,11 +96,7 @@
 						</a-tabs>
 					</a-card>
 				</div>
-				<div class="redressBox" @click="jumpRedressUrl">
-					<a-tooltip title="纠错" :getPopupContainer="(trigger) => trigger.parentElement">
-						<SnippetsOutlined style="font-size: 40px" />
-					</a-tooltip>
-				</div>
+				<forumBtn :forumData="forumData"></forumBtn>
 			</a-layout-content>
 		</a-layout>
 	</a-layout>
@@ -114,6 +110,7 @@
 	import note from './note.vue'
 	import askDiv from './ask.vue'
 	import VueOfficePdf from '@vue-office/pdf'
+	import forumBtn from '../forumBtn/index.vue'
 	import axios from 'axios'
 	const route = useRoute()
 	const router = useRouter()
@@ -282,18 +279,15 @@
 		}
 		return s
 	}
-	const jumpRedressUrl = () => {
+	const forumData = computed(() => {
 		let item = findNodeByKey(classTimeList.value, selectedKeys.value[0])
-		router.push({
-			path: '/forum/addForum',
-			query: {
-				postType:2,
-				id:selectedKeys.value[0],
-				title:item.name,
-				videoUrl:btoa(encodeURIComponent(videoRef.value.src))
-			}
-		})
-	}
+		return {
+			postType: 2,
+			id: selectedKeys.value[0],
+			title: item?.name,
+			videoUrl: btoa(encodeURIComponent(videoRef.value?.src))
+		}
+	})
 </script>
 <style scoped lang="less">
 	.classTitle {
@@ -309,14 +303,4 @@
 		display: flex;
 		justify-content: space-between;
 	}
-	.redressBox {
-		position: fixed;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		right: 20px;
-		bottom: 200px;
-		color: #ff4d4f;
-		cursor: pointer;
-	}
 </style>

+ 37 - 0
src/views/student/classNotice/index.vue

@@ -0,0 +1,37 @@
+<template>
+	<a-card>
+		<a-list item-layout="vertical" size="large" :pagination="pagination" :data-source="listData">
+			<template #renderItem="{ item }">
+				<a-list-item key="item.title">
+					<a-list-item-meta :description="item.description">
+						<template #title>{{ item.title }}</template>
+					</a-list-item-meta>
+					{{ item.content }}
+				</a-list-item>
+			</template>
+		</a-list>
+	</a-card>
+</template>
+<script lang="ts" setup>
+	const listData = []
+
+	for (let i = 0; i < 23; i++) {
+		listData.push({
+			title: `课程标题 ${i}`,
+			description: '课程说明',
+			content:'课程内容'
+		})
+	}
+
+	const pagination = {
+		onChange: (page) => {
+			console.log(page)
+		},
+		pageSize: 3
+	}
+</script>
+<style scoped>
+	.index-message-list {
+		overflow: auto;
+	}
+</style>

+ 38 - 0
src/views/student/forumBtn/index.vue

@@ -0,0 +1,38 @@
+<template>
+	<div class="redressBox" @click="jumpRedressUrl">
+		<a-tooltip title="纠错" v-if="props.forumData.postType==2" :getPopupContainer="(trigger) => trigger.parentElement">
+			<SnippetsOutlined style="font-size: 40px" />
+		</a-tooltip>
+		<a-tooltip title="纠错" v-if="props.forumData.postType==1" :getPopupContainer="(trigger) => trigger.parentElement">
+			<SnippetsOutlined style="font-size: 40px" />
+		</a-tooltip>
+	</div>
+</template>
+
+<script setup>
+	const props = defineProps({
+		forumData: {
+			type: Object,
+			default: () => {}
+		}
+	})
+	const jumpRedressUrl = () => {
+		router.push({
+			path: '/forum/addForum',
+			query: props.forumData
+		})
+	}
+</script>
+
+<style lang="less" scoped>
+	.redressBox {
+		position: fixed;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		right: 20px;
+		bottom: 200px;
+		color: #ff4d4f;
+		cursor: pointer;
+	}
+</style>

+ 37 - 0
src/views/student/learningFootprint/index.vue

@@ -0,0 +1,37 @@
+<template>
+	<a-card>
+		<a-list item-layout="vertical" size="large" :pagination="pagination" :data-source="listData">
+			<template #renderItem="{ item }">
+				<a-list-item key="item.title">
+					<a-list-item-meta :description="item.description">
+						<template #title>{{ item.title }}</template>
+					</a-list-item-meta>
+					{{ item.content }}
+				</a-list-item>
+			</template>
+		</a-list>
+	</a-card>
+</template>
+<script lang="ts" setup>
+	const listData = []
+
+	for (let i = 0; i < 23; i++) {
+		listData.push({
+			title: `学习足迹标题 ${i}`,
+			description: '学习足迹说明',
+			content:'学习足迹内容'
+		})
+	}
+
+	const pagination = {
+		onChange: (page) => {
+			console.log(page)
+		},
+		pageSize: 3
+	}
+</script>
+<style scoped>
+	.index-message-list {
+		overflow: auto;
+	}
+</style>

+ 57 - 0
src/views/student/password/index.vue

@@ -0,0 +1,57 @@
+<template>
+	<a-card>
+		<a-form ref="formRef" :model="formState" :rules="rules" layout="vertical">
+			<a-form-item label="旧密码:" name="password" has-feedback>
+				<a-input
+					v-model:value="formState.password"
+					placeholder="请输入原密码"
+					type="password"
+					allow-clear
+					autocomplete="off"
+				/>
+			</a-form-item>
+			<a-form-item label="新密码:" name="newPassword" has-feedback>
+				<a-input
+					v-model:value="formState.newPassword"
+					placeholder="请输入新密码"
+					type="password"
+					allow-clear
+					autocomplete="off"
+				/>
+			</a-form-item>
+		</a-form>
+		<a-button type="primary" :loading="submitLoading" @click="onSubmit">保存</a-button>
+	</a-card>
+</template>
+
+<script setup name="updatePassword">
+	import { required } from '@/utils/formRules'
+	import userCenterApi from '@/api/sys/userCenterApi'
+
+	const formRef = ref()
+	// 表单数据
+	const formState = ref({})
+	const submitLoading = ref(false)
+
+	// 默认要校验的
+	const rules = {
+		password: [required('请输入原密码')],
+		checkPassword: [required('请再次输入原密码')],
+		newPassword: [required('请输入新密码')]
+	}
+
+	// 提交数据
+	const onSubmit = async () => {
+		const values = await formRef.value.validateFields()
+		submitLoading.value = true
+		userCenterApi
+			.userUpdatePassword(values)
+			.then(() => {
+				formRef.value.resetFields()
+				visible.value = false
+			})
+			.finally(() => {
+				submitLoading.value = false
+			})
+	}
+</script>

+ 23 - 0
src/views/student/user/index.vue

@@ -0,0 +1,23 @@
+<template>
+	<a-card>
+		<a-descriptions :title="userInfo.name">
+			<a-descriptions-item label="性别">{{ userInfo.gender }}</a-descriptions-item>
+			<a-descriptions-item label="邮箱">{{ userInfo.email }}</a-descriptions-item>
+			<a-descriptions-item label="手机">{{ userInfo.phone }}</a-descriptions-item>
+			<a-descriptions-item label="生日">{{ userInfo.birthday }}</a-descriptions-item>
+			<a-descriptions-item label="学号">{{ userInfo.name }}</a-descriptions-item>
+			<a-descriptions-item label="第几届">{{ userInfo.name }}</a-descriptions-item>
+			<a-descriptions-item label="院系">{{ userInfo.name }}</a-descriptions-item>
+			<a-descriptions-item label="班级">{{ userInfo.name }}</a-descriptions-item>
+			<a-descriptions-item label="专业">{{ userInfo.name }}</a-descriptions-item>
+		</a-descriptions>
+	</a-card>
+</template>
+
+<script setup>
+	import tool from '@/utils/tool'
+	const userInfo = tool.data.get('USER_INFO')
+	console.log("🚀 ~ userInfo:", userInfo)
+</script>
+
+<style lang="less" scoped></style>