hookehuyr

feat(教师表单): 重构课程选择逻辑为级联选择

将课程选择改为优先选择,驱动年级和班级的级联选择
更新API返回数据结构以支持新的级联逻辑
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 => ({
......