refactor(teacher/myClassPage): 重构班级页面筛选逻辑,使用API动态获取选项
将硬编码的筛选选项改为通过API动态获取 更新变量命名以更清晰表达用途 添加年级、班级和课程的联动筛选功能
Showing
1 changed file
with
88 additions
and
41 deletions
| ... | @@ -2,7 +2,7 @@ | ... | @@ -2,7 +2,7 @@ |
| 2 | * @Author: hookehuyr hookehuyr@gmail.com | 2 | * @Author: hookehuyr hookehuyr@gmail.com |
| 3 | * @Date: 2025-01-20 10:00:00 | 3 | * @Date: 2025-01-20 10:00:00 |
| 4 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 4 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 5 | - * @LastEditTime: 2025-06-20 11:47:35 | 5 | + * @LastEditTime: 2025-06-25 16:12:36 |
| 6 | * @FilePath: /mlaj/src/views/teacher/myClassPage.vue | 6 | * @FilePath: /mlaj/src/views/teacher/myClassPage.vue |
| 7 | * @Description: 我的班级页面 | 7 | * @Description: 我的班级页面 |
| 8 | --> | 8 | --> |
| ... | @@ -31,9 +31,9 @@ | ... | @@ -31,9 +31,9 @@ |
| 31 | <div> | 31 | <div> |
| 32 | <van-sticky> | 32 | <van-sticky> |
| 33 | <van-dropdown-menu active-color="#10b981" swipe-threshold="3"> | 33 | <van-dropdown-menu active-color="#10b981" swipe-threshold="3"> |
| 34 | - <van-dropdown-item v-model="gradeFilter" :options="gradeOptions" @change="handleGradeChange" /> | 34 | + <van-dropdown-item v-model="selectGradeValue" :options="gradeOption" @change="handleGradeChange" /> |
| 35 | - <van-dropdown-item v-model="classFilter" :options="classOptions" @change="handleClassChange" /> | 35 | + <van-dropdown-item v-model="selectClassValue" :options="classOption" @change="handleClassChange" /> |
| 36 | - <van-dropdown-item v-model="courseFilter" :options="courseOptions" @change="handleCourseChange" /> | 36 | + <van-dropdown-item v-model="selectCourseValue" :options="courseOption" @change="handleCourseChange" /> |
| 37 | </van-dropdown-menu> | 37 | </van-dropdown-menu> |
| 38 | </van-sticky> | 38 | </van-sticky> |
| 39 | </div> | 39 | </div> |
| ... | @@ -157,6 +157,8 @@ import { useRouter } from 'vue-router' | ... | @@ -157,6 +157,8 @@ import { useRouter } from 'vue-router' |
| 157 | import AppLayout from '@/layouts/AppLayout.vue' | 157 | import AppLayout from '@/layouts/AppLayout.vue' |
| 158 | import { useTitle } from '@vueuse/core'; | 158 | import { useTitle } from '@vueuse/core'; |
| 159 | 159 | ||
| 160 | +import { getTeacherGradeClassListAPI } from "@/api/teacher"; | ||
| 161 | + | ||
| 160 | const router = useRouter() | 162 | const router = useRouter() |
| 161 | const route = useRoute() | 163 | const route = useRoute() |
| 162 | useTitle(route.meta.title); | 164 | useTitle(route.meta.title); |
| ... | @@ -173,35 +175,18 @@ const userInfo = ref({ | ... | @@ -173,35 +175,18 @@ const userInfo = ref({ |
| 173 | }) | 175 | }) |
| 174 | 176 | ||
| 175 | // 筛选器数据 | 177 | // 筛选器数据 |
| 176 | -const gradeFilter = ref('全部年级') | 178 | +const selectGradeValue = ref(null); |
| 177 | -const classFilter = ref('全部班级') | 179 | +const selectClassValue = ref(null); |
| 178 | -const courseFilter = ref('全部课程') | 180 | +const selectCourseValue = ref(null); |
| 181 | +const gradeOption = ref([]); | ||
| 182 | +const classOption = ref([]); | ||
| 183 | +const courseOption = ref([]); | ||
| 184 | + | ||
| 179 | const sortFilter = ref('按活跃度') | 185 | const sortFilter = ref('按活跃度') |
| 180 | const searchKeyword = ref('') | 186 | const searchKeyword = ref('') |
| 181 | const showSortPopup = ref(false) | 187 | const showSortPopup = ref(false) |
| 182 | 188 | ||
| 183 | // 筛选器选项 | 189 | // 筛选器选项 |
| 184 | -const gradeOptions = ref([ | ||
| 185 | - { text: '全部年级', value: '全部年级' }, | ||
| 186 | - { text: '高一年级', value: '高一年级' }, | ||
| 187 | - { text: '高二年级', value: '高二年级' }, | ||
| 188 | - { text: '高三年级', value: '高三年级' } | ||
| 189 | -]) | ||
| 190 | - | ||
| 191 | -const classOptions = ref([ | ||
| 192 | - { text: '全部班级', value: '全部班级' }, | ||
| 193 | - { text: '高一(1)班高一(1)班', value: '高一(1)班高一(1)班' }, | ||
| 194 | - { text: '高一(2)班', value: '高一(2)班' }, | ||
| 195 | - { text: '高一(3)班', value: '高一(3)班' } | ||
| 196 | -]) | ||
| 197 | - | ||
| 198 | -const courseOptions = ref([ | ||
| 199 | - { text: '全部课程', value: '全部课程' }, | ||
| 200 | - { text: '语文', value: '语文' }, | ||
| 201 | - { text: '数学', value: '数学' }, | ||
| 202 | - { text: '英语', value: '英语' } | ||
| 203 | -]) | ||
| 204 | - | ||
| 205 | const sortOptions = ref([ | 190 | const sortOptions = ref([ |
| 206 | { text: '按活跃度', value: '按活跃度' }, | 191 | { text: '按活跃度', value: '按活跃度' }, |
| 207 | { text: '按姓名', value: '按姓名' }, | 192 | { text: '按姓名', value: '按姓名' }, |
| ... | @@ -299,11 +284,6 @@ const finished = ref(false) | ... | @@ -299,11 +284,6 @@ const finished = ref(false) |
| 299 | const filteredStudentList = computed(() => { | 284 | const filteredStudentList = computed(() => { |
| 300 | let filtered = studentList.value | 285 | let filtered = studentList.value |
| 301 | 286 | ||
| 302 | - // 按班级筛选 | ||
| 303 | - if (classFilter.value !== '全部班级') { | ||
| 304 | - filtered = filtered.filter(student => student.className === classFilter.value) | ||
| 305 | - } | ||
| 306 | - | ||
| 307 | // 按搜索关键词筛选 | 287 | // 按搜索关键词筛选 |
| 308 | if (searchKeyword.value) { | 288 | if (searchKeyword.value) { |
| 309 | filtered = filtered.filter(student => | 289 | filtered = filtered.filter(student => |
| ... | @@ -333,25 +313,49 @@ const formatPhone = (phone) => { | ... | @@ -333,25 +313,49 @@ const formatPhone = (phone) => { |
| 333 | * 处理年级筛选变化 | 313 | * 处理年级筛选变化 |
| 334 | * @param {string} value - 选中的年级 | 314 | * @param {string} value - 选中的年级 |
| 335 | */ | 315 | */ |
| 336 | -const handleGradeChange = (value) => { | 316 | +const handleGradeChange = async (val) => { |
| 337 | - console.log('年级筛选:', value) | 317 | + console.log('val', val); |
| 338 | - // 这里可以根据年级筛选更新班级选项 | 318 | + selectGradeValue.value = val; |
| 319 | + // 根据年级ID 更新过滤列表 | ||
| 320 | + getFilterList(val); | ||
| 321 | + // 重置分页参数 | ||
| 322 | + // page.value = 0 | ||
| 323 | + // checkinDataList.value = [] | ||
| 324 | + // finished.value = false | ||
| 325 | + // // 重新加载数据 | ||
| 326 | + // onLoad() | ||
| 339 | } | 327 | } |
| 340 | 328 | ||
| 341 | /** | 329 | /** |
| 342 | * 处理班级筛选变化 | 330 | * 处理班级筛选变化 |
| 343 | * @param {string} value - 选中的班级 | 331 | * @param {string} value - 选中的班级 |
| 344 | */ | 332 | */ |
| 345 | -const handleClassChange = (value) => { | 333 | +const handleClassChange = (val) => { |
| 346 | - console.log('班级筛选:', value) | 334 | + console.log('val', val); |
| 335 | + selectClassValue.value = val; | ||
| 336 | + // 根据年级ID和班级ID 更新过滤列表 | ||
| 337 | + getFilterList(selectGradeValue.value, val); | ||
| 338 | + // 重置分页参数 | ||
| 339 | + // page.value = 0 | ||
| 340 | + // checkinDataList.value = [] | ||
| 341 | + // finished.value = false | ||
| 342 | + // // 重新加载数据 | ||
| 343 | + // onLoad() | ||
| 347 | } | 344 | } |
| 348 | 345 | ||
| 349 | /** | 346 | /** |
| 350 | * 处理课程筛选变化 | 347 | * 处理课程筛选变化 |
| 351 | * @param {string} value - 选中的课程 | 348 | * @param {string} value - 选中的课程 |
| 352 | */ | 349 | */ |
| 353 | -const handleCourseChange = (value) => { | 350 | +const handleCourseChange = (val) => { |
| 354 | - console.log('课程筛选:', value) | 351 | + console.log('val', val); |
| 352 | + selectCourseValue.value = val; | ||
| 353 | + // 重置分页参数 | ||
| 354 | + // page.value = 0 | ||
| 355 | + // checkinDataList.value = [] | ||
| 356 | + // finished.value = false | ||
| 357 | + // // 重新加载数据 | ||
| 358 | + // onLoad() | ||
| 355 | } | 359 | } |
| 356 | 360 | ||
| 357 | /** | 361 | /** |
| ... | @@ -402,12 +406,55 @@ const onLoad = () => { | ... | @@ -402,12 +406,55 @@ const onLoad = () => { |
| 402 | }, 1000) | 406 | }, 1000) |
| 403 | } | 407 | } |
| 404 | 408 | ||
| 409 | +const gradeList = ref([]); | ||
| 410 | +const classList = ref([]); | ||
| 411 | +const courseList = ref([]); | ||
| 412 | + | ||
| 413 | +const getFilterList = async (grade_id=null, class_id=null) => { | ||
| 414 | + const { code, data } = await getTeacherGradeClassListAPI({ grade_id, class_id }); | ||
| 415 | + if (code) { | ||
| 416 | + // 处理数据 | ||
| 417 | + gradeOption.value = data.grade_list?.map(item => { | ||
| 418 | + return { | ||
| 419 | + text: item.grade_name, | ||
| 420 | + value: item.id, | ||
| 421 | + } | ||
| 422 | + }); | ||
| 423 | + gradeOption.value.unshift({ | ||
| 424 | + text: '全部年级', | ||
| 425 | + value: null, | ||
| 426 | + }); | ||
| 427 | + classOption.value = data.class_list?.map(item => { | ||
| 428 | + return { | ||
| 429 | + text: item.class_name, | ||
| 430 | + value: item.id, | ||
| 431 | + } | ||
| 432 | + }); | ||
| 433 | + classOption.value.unshift({ | ||
| 434 | + text: '全部班级', | ||
| 435 | + value: null, | ||
| 436 | + }); | ||
| 437 | + courseOption.value = data.group_list?.map(item => { | ||
| 438 | + return { | ||
| 439 | + text: item.title, | ||
| 440 | + value: item.id, | ||
| 441 | + } | ||
| 442 | + }); | ||
| 443 | + courseOption.value.unshift({ | ||
| 444 | + text: '全部课程', | ||
| 445 | + value: null, | ||
| 446 | + }); | ||
| 447 | + } | ||
| 448 | +} | ||
| 449 | + | ||
| 405 | /** | 450 | /** |
| 406 | * 组件挂载时初始化数据 | 451 | * 组件挂载时初始化数据 |
| 407 | */ | 452 | */ |
| 408 | -onMounted(() => { | 453 | +onMounted(async () => { |
| 409 | // 这里可以调用API获取实际数据 | 454 | // 这里可以调用API获取实际数据 |
| 410 | console.log('我的班级页面已加载') | 455 | console.log('我的班级页面已加载') |
| 456 | + // 获取老师的年级、班级、课程列表信息 | ||
| 457 | + getFilterList(); | ||
| 411 | }) | 458 | }) |
| 412 | </script> | 459 | </script> |
| 413 | 460 | ... | ... |
-
Please register or login to post a comment