hookehuyr

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

将课程选择改为优先选择,驱动年级和班级的级联选择
更新API返回数据结构以支持新的级联逻辑
/*
* @Date: 2025-06-23 11:46:21
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-11-07 17:16:04
* @LastEditTime: 2025-11-10 10:56:17
* @FilePath: /mlaj/src/api/teacher.js
* @Description: 文件描述
*/
......@@ -31,7 +31,7 @@ export const getTeacherGradeClassListAPI = (params) => fn(fetch.get(Api.TEACHER_
/**
* 获取老师查询作业参数
* @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 }
* @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 }
*/
export const getTeacherFindSettingsAPI = (params) => fn(fetch.get(Api.TEACHER_FIND_SETTINGS, params))
......
......@@ -133,6 +133,15 @@
<!-- 选择项目 -->
<div class="mb-6">
<!-- 优先选择课程,驱动后续年级与班级级联 -->
<div class="select-row">
<div class="select-item">
<van-icon name="friends-o" class="select-icon" />
<span class="select-label">所在课程:</span>
<span class="select-value" @click="showCoursePicker = true">{{ formData.course || '请选择课程' }}</span>
<van-icon name="arrow" class="arrow-icon" @click="showCoursePicker = true" />
</div>
</div>
<div class="select-row">
<div class="select-item">
<van-icon name="friends-o" class="select-icon" />
......@@ -149,15 +158,8 @@
<van-icon name="arrow" class="arrow-icon" @click="showClassPicker = true" />
</div>
</div>
<div class="select-row">
<div class="select-item">
<van-icon name="friends-o" class="select-icon" />
<span class="select-label">所在课程:</span>
<span class="select-value" @click="showCoursePicker = true">{{ formData.course || '请选择课程' }}</span>
<van-icon name="arrow" class="arrow-icon" @click="showCoursePicker = true" />
</div>
</div>
<div class="select-row" v-if="courseChapters[formData.course]?.length">
<!-- 仅在完成班级选择后,允许进行课程章节选择 -->
<div class="select-row" v-if="formData.class_id && courseChapters[formData.course]?.length">
<div class="select-item">
<van-icon name="bookmark-o" class="select-icon" />
<span class="select-label">课程章节:</span>
......@@ -672,6 +674,19 @@ const onEndTimeConfirm = () => {
const onCourseSelect = (course) => {
formData.value.course = course.name;
formData.value.lesson_id = course.id;
// 重置级联选择
formData.value.grade = '';
formData.value.grade_id = '';
formData.value.class_name = '';
formData.value.class_id = '';
// 根据课程派生年级列表
grades.value = (course.team_list || []).map(team => ({
name: team.team_name,
id: String(team.id),
subteam_list: team.subteam_list || []
}));
// 清空班级列表,待年级选择后填充
classes.value = [];
// 清空之前选择的章节
selectedChapters.value = [];
// 根据选择的课程更新章节数据
......@@ -812,6 +827,14 @@ const confirmChapterSelection = () => {
const onGradeSelect = (grade) => {
formData.value.grade = grade.name;
formData.value.grade_id = grade.id;
// 根据年级派生班级列表
classes.value = (grade.subteam_list || []).map(sub => ({
name: sub.subteam_name,
id: String(sub.id)
}));
// 清空已选择的班级,等待用户确认
formData.value.class_name = '';
formData.value.class_id = '';
showGradePicker.value = false;
gradeSearchValue.value = '';
};
......@@ -957,18 +980,15 @@ onMounted(async () => {
}));
}
grades.value = data.grade_list.map(grade => ({
name: grade.grade_name,
id: String(grade.id)
}));
classes.value = data.class_list.map(classItem => ({
name: classItem.class_name,
id: String(classItem.id)
}));
// 年级与班级不再从顶层返回,改为根据所选课程派生
grades.value = [];
classes.value = [];
// 课程包含章节与年级树
courses.value = data.group_list.map(course => ({
name: course.title,
id: String(course.id),
schedule_list: course.schedule_list
schedule_list: course.schedule_list || [],
team_list: course.team_list || []
}));
data.group_list.forEach(course => {
courseChapters.value[course.title] = course.schedule_list.map(chapter => ({
......