feat(教师表单): 重构课程选择逻辑为级联选择
将课程选择改为优先选择,驱动年级和班级的级联选择 更新API返回数据结构以支持新的级联逻辑
Showing
2 changed files
with
40 additions
and
20 deletions
| 1 | /* | 1 | /* |
| 2 | * @Date: 2025-06-23 11:46:21 | 2 | * @Date: 2025-06-23 11:46:21 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-11-07 17:16:04 | 4 | + * @LastEditTime: 2025-11-10 10:56:17 |
| 5 | * @FilePath: /mlaj/src/api/teacher.js | 5 | * @FilePath: /mlaj/src/api/teacher.js |
| 6 | * @Description: 文件描述 | 6 | * @Description: 文件描述 |
| 7 | */ | 7 | */ |
| ... | @@ -31,7 +31,7 @@ export const getTeacherGradeClassListAPI = (params) => fn(fetch.get(Api.TEACHER_ | ... | @@ -31,7 +31,7 @@ export const getTeacherGradeClassListAPI = (params) => fn(fetch.get(Api.TEACHER_ |
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | * 获取老师查询作业参数 | 33 | * 获取老师查询作业参数 |
| 34 | - * @returns {Object} data { grade_list [{id, grade_name}], class_list [{id, class_name}], group_list [{id, title, schedule_list[{id, title}]}], task_type, task_frequency } | 34 | + * @returns {Object} data { group_list [{id, title, schedule_list[{id, title}], team_list[{id, team_name, subteam_list[{id, subteam_name}]}]}], task_type, task_frequency } |
| 35 | */ | 35 | */ |
| 36 | export const getTeacherFindSettingsAPI = (params) => fn(fetch.get(Api.TEACHER_FIND_SETTINGS, params)) | 36 | export const getTeacherFindSettingsAPI = (params) => fn(fetch.get(Api.TEACHER_FIND_SETTINGS, params)) |
| 37 | 37 | ... | ... |
| ... | @@ -133,6 +133,15 @@ | ... | @@ -133,6 +133,15 @@ |
| 133 | 133 | ||
| 134 | <!-- 选择项目 --> | 134 | <!-- 选择项目 --> |
| 135 | <div class="mb-6"> | 135 | <div class="mb-6"> |
| 136 | + <!-- 优先选择课程,驱动后续年级与班级级联 --> | ||
| 137 | + <div class="select-row"> | ||
| 138 | + <div class="select-item"> | ||
| 139 | + <van-icon name="friends-o" class="select-icon" /> | ||
| 140 | + <span class="select-label">所在课程:</span> | ||
| 141 | + <span class="select-value" @click="showCoursePicker = true">{{ formData.course || '请选择课程' }}</span> | ||
| 142 | + <van-icon name="arrow" class="arrow-icon" @click="showCoursePicker = true" /> | ||
| 143 | + </div> | ||
| 144 | + </div> | ||
| 136 | <div class="select-row"> | 145 | <div class="select-row"> |
| 137 | <div class="select-item"> | 146 | <div class="select-item"> |
| 138 | <van-icon name="friends-o" class="select-icon" /> | 147 | <van-icon name="friends-o" class="select-icon" /> |
| ... | @@ -149,15 +158,8 @@ | ... | @@ -149,15 +158,8 @@ |
| 149 | <van-icon name="arrow" class="arrow-icon" @click="showClassPicker = true" /> | 158 | <van-icon name="arrow" class="arrow-icon" @click="showClassPicker = true" /> |
| 150 | </div> | 159 | </div> |
| 151 | </div> | 160 | </div> |
| 152 | - <div class="select-row"> | 161 | + <!-- 仅在完成班级选择后,允许进行课程章节选择 --> |
| 153 | - <div class="select-item"> | 162 | + <div class="select-row" v-if="formData.class_id && courseChapters[formData.course]?.length"> |
| 154 | - <van-icon name="friends-o" class="select-icon" /> | ||
| 155 | - <span class="select-label">所在课程:</span> | ||
| 156 | - <span class="select-value" @click="showCoursePicker = true">{{ formData.course || '请选择课程' }}</span> | ||
| 157 | - <van-icon name="arrow" class="arrow-icon" @click="showCoursePicker = true" /> | ||
| 158 | - </div> | ||
| 159 | - </div> | ||
| 160 | - <div class="select-row" v-if="courseChapters[formData.course]?.length"> | ||
| 161 | <div class="select-item"> | 163 | <div class="select-item"> |
| 162 | <van-icon name="bookmark-o" class="select-icon" /> | 164 | <van-icon name="bookmark-o" class="select-icon" /> |
| 163 | <span class="select-label">课程章节:</span> | 165 | <span class="select-label">课程章节:</span> |
| ... | @@ -672,6 +674,19 @@ const onEndTimeConfirm = () => { | ... | @@ -672,6 +674,19 @@ const onEndTimeConfirm = () => { |
| 672 | const onCourseSelect = (course) => { | 674 | const onCourseSelect = (course) => { |
| 673 | formData.value.course = course.name; | 675 | formData.value.course = course.name; |
| 674 | formData.value.lesson_id = course.id; | 676 | formData.value.lesson_id = course.id; |
| 677 | + // 重置级联选择 | ||
| 678 | + formData.value.grade = ''; | ||
| 679 | + formData.value.grade_id = ''; | ||
| 680 | + formData.value.class_name = ''; | ||
| 681 | + formData.value.class_id = ''; | ||
| 682 | + // 根据课程派生年级列表 | ||
| 683 | + grades.value = (course.team_list || []).map(team => ({ | ||
| 684 | + name: team.team_name, | ||
| 685 | + id: String(team.id), | ||
| 686 | + subteam_list: team.subteam_list || [] | ||
| 687 | + })); | ||
| 688 | + // 清空班级列表,待年级选择后填充 | ||
| 689 | + classes.value = []; | ||
| 675 | // 清空之前选择的章节 | 690 | // 清空之前选择的章节 |
| 676 | selectedChapters.value = []; | 691 | selectedChapters.value = []; |
| 677 | // 根据选择的课程更新章节数据 | 692 | // 根据选择的课程更新章节数据 |
| ... | @@ -812,6 +827,14 @@ const confirmChapterSelection = () => { | ... | @@ -812,6 +827,14 @@ const confirmChapterSelection = () => { |
| 812 | const onGradeSelect = (grade) => { | 827 | const onGradeSelect = (grade) => { |
| 813 | formData.value.grade = grade.name; | 828 | formData.value.grade = grade.name; |
| 814 | formData.value.grade_id = grade.id; | 829 | formData.value.grade_id = grade.id; |
| 830 | + // 根据年级派生班级列表 | ||
| 831 | + classes.value = (grade.subteam_list || []).map(sub => ({ | ||
| 832 | + name: sub.subteam_name, | ||
| 833 | + id: String(sub.id) | ||
| 834 | + })); | ||
| 835 | + // 清空已选择的班级,等待用户确认 | ||
| 836 | + formData.value.class_name = ''; | ||
| 837 | + formData.value.class_id = ''; | ||
| 815 | showGradePicker.value = false; | 838 | showGradePicker.value = false; |
| 816 | gradeSearchValue.value = ''; | 839 | gradeSearchValue.value = ''; |
| 817 | }; | 840 | }; |
| ... | @@ -957,18 +980,15 @@ onMounted(async () => { | ... | @@ -957,18 +980,15 @@ onMounted(async () => { |
| 957 | })); | 980 | })); |
| 958 | } | 981 | } |
| 959 | 982 | ||
| 960 | - grades.value = data.grade_list.map(grade => ({ | 983 | + // 年级与班级不再从顶层返回,改为根据所选课程派生 |
| 961 | - name: grade.grade_name, | 984 | + grades.value = []; |
| 962 | - id: String(grade.id) | 985 | + classes.value = []; |
| 963 | - })); | 986 | + // 课程包含章节与年级树 |
| 964 | - classes.value = data.class_list.map(classItem => ({ | ||
| 965 | - name: classItem.class_name, | ||
| 966 | - id: String(classItem.id) | ||
| 967 | - })); | ||
| 968 | courses.value = data.group_list.map(course => ({ | 987 | courses.value = data.group_list.map(course => ({ |
| 969 | name: course.title, | 988 | name: course.title, |
| 970 | id: String(course.id), | 989 | id: String(course.id), |
| 971 | - schedule_list: course.schedule_list | 990 | + schedule_list: course.schedule_list || [], |
| 991 | + team_list: course.team_list || [] | ||
| 972 | })); | 992 | })); |
| 973 | data.group_list.forEach(course => { | 993 | data.group_list.forEach(course => { |
| 974 | courseChapters.value[course.title] = course.schedule_list.map(chapter => ({ | 994 | courseChapters.value[course.title] = course.schedule_list.map(chapter => ({ | ... | ... |
-
Please register or login to post a comment