From 7e540664e25865fcd2804f32cd7f5dfbd412d01a Mon Sep 17 00:00:00 2001 From: QDKF Date: Tue, 16 Sep 2025 19:28:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=8F=AD=E7=BA=A7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=90=9C=E7=B4=A2=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=AD=A6=E5=91=98=E5=BA=93=E6=95=B0=E6=8D=AE=EF=BC=8C=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=A0=E9=99=A4=EF=BC=8C=E5=88=86=E9=A1=B5=E5=99=A8?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=E9=AB=98=E5=BA=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/teacher/ClassManagement.vue | 126 +-- src/views/teacher/AdminDashboard.vue | 15 +- src/views/teacher/message/MessageCenter.vue | 127 +++- src/views/teacher/student/StudentLibrary.vue | 762 ++++++++++++++----- 4 files changed, 748 insertions(+), 282 deletions(-) diff --git a/src/components/teacher/ClassManagement.vue b/src/components/teacher/ClassManagement.vue index 56ea6a8..01c8b4f 100644 --- a/src/components/teacher/ClassManagement.vue +++ b/src/components/teacher/ClassManagement.vue @@ -42,10 +42,12 @@
- 全部学员{{ totalStudents }}人 + 全部学员{{ totalStudents }}人 + 搜索结果{{ filteredData.length }}人(共{{ totalStudents }}人)
- 全部学员 + 全部学员 + 搜索结果{{ filteredData.length }}人
添加学员 - - 统计分析 + 统计分析 导入 @@ -66,15 +67,19 @@ 导出 - - + + 搜索 + + 清空 +
- @@ -335,8 +340,8 @@ interface FormData { className: string[] // 修改为数组类型支持多选 } -const totalStudents = ref(1333) -const inviteCode = ref('56685222') +const totalStudents = ref(0) +const inviteCode = ref('') const currentInviteClassId = ref(null) // 当前邀请码对应的班级ID const message = useMessage() @@ -439,6 +444,29 @@ const selectedStudents = computed(() => { return data.value.filter(student => selectedRowKeys.value.includes(student.id)) }) +// 计算属性:过滤后的学员数据(用于搜索) +const filteredData = computed(() => { + if (!searchKeyword.value.trim()) { + return data.value + } + + const keyword = searchKeyword.value.trim().toLowerCase() + return data.value.filter(student => + student.studentName.toLowerCase().includes(keyword) || + student.accountNumber.toLowerCase().includes(keyword) || + student.loginName.toLowerCase().includes(keyword) || + student.college.toLowerCase().includes(keyword) || + student.className.toLowerCase().includes(keyword) + ) +}) + +// 计算属性:分页后的数据 +const paginatedData = computed(() => { + const start = (pagination.value.page - 1) * pagination.value.pageSize + const end = start + pagination.value.pageSize + return filteredData.value.slice(start, end) +}) + // 计算属性:统一数据源生成的各种选项 // 部门选项(用于页面顶部筛选) @@ -618,14 +646,15 @@ const pagination = ref({ pageSize: 10, showSizePicker: true, pageSizes: [10, 20, 50], + itemCount: computed(() => filteredData.value.length), // 使用过滤后的数据长度 onChange: (page: number) => { pagination.value.page = page - loadData(props.classId) + // 前端分页不需要重新加载数据 }, onUpdatePageSize: (pageSize: number) => { pagination.value.pageSize = pageSize pagination.value.page = 1 - loadData(props.classId) + // 前端分页不需要重新加载数据 } }) @@ -1190,6 +1219,24 @@ const handleTemplateDownload = (type?: string) => { // TODO: 实现模板下载逻辑 } +// 搜索处理 +const handleSearch = () => { + // 搜索是实时的,通过计算属性filteredData自动过滤 + // 重置到第一页 + pagination.value.page = 1 +} + +// 监听搜索关键词变化,重置分页 +watch(searchKeyword, () => { + pagination.value.page = 1 +}) + +// 清空搜索 +const clearSearch = () => { + searchKeyword.value = '' + pagination.value.page = 1 +} + // 监听班级ID变化,重新加载数据 watch( () => props.classId, @@ -1197,6 +1244,9 @@ watch( if (newClassId !== oldClassId) { // 同步更新选择器的状态(不触发选择器的watch) selectedDepartment.value = newClassId ? String(newClassId) : '' + // 切换班级时清空搜索 + searchKeyword.value = '' + pagination.value.page = 1 loadData(newClassId) } }, @@ -1212,6 +1262,9 @@ watch( // 如果当前props.classId存在且与选择器值一致,说明是props驱动的变化,不需要重复加载 const currentPropsClassId = props.classId ? String(props.classId) : '' if (newDepartmentId !== oldDepartmentId && newDepartmentId !== currentPropsClassId) { + // 切换班级时清空搜索 + searchKeyword.value = '' + pagination.value.page = 1 const targetClassId = newDepartmentId || null loadData(targetClassId) } @@ -1482,57 +1535,6 @@ defineExpose({ gap: 8px; } -.batch-delete-content { - text-align: center; -} - -.batch-delete-content p { - margin: 8px 0; - font-size: 14px; -} - -.selected-students { - margin: 16px 0; - max-height: 200px; - overflow-y: auto; -} - -.student-list { - display: flex; - flex-direction: column; - gap: 8px; - padding: 12px; - background-color: #f8f9fa; - border-radius: 6px; - border: 1px solid #e9ecef; -} - -.student-item { - display: flex; - align-items: center; - gap: 8px; - padding: 6px 12px; - background-color: white; - border-radius: 4px; - border: 1px solid #dee2e6; -} - -.student-name { - font-weight: 500; - color: #333; -} - -.student-account { - color: #666; - font-size: 12px; -} - -.batch-warning { - color: #ff4d4f; - font-weight: 500; - margin-top: 16px; -} - .batch-delete-content { text-align: center; padding: 20px 0; diff --git a/src/views/teacher/AdminDashboard.vue b/src/views/teacher/AdminDashboard.vue index 7ee9ef6..20308fd 100644 --- a/src/views/teacher/AdminDashboard.vue +++ b/src/views/teacher/AdminDashboard.vue @@ -133,7 +133,7 @@ diff --git a/src/views/teacher/student/StudentLibrary.vue b/src/views/teacher/student/StudentLibrary.vue index e7fb1f9..99fc095 100644 --- a/src/views/teacher/student/StudentLibrary.vue +++ b/src/views/teacher/student/StudentLibrary.vue @@ -1,5 +1,5 @@