diff --git a/reading-platform-frontend/src/components/course-edit/Step1BasicInfo.vue b/reading-platform-frontend/src/components/course-edit/Step1BasicInfo.vue index 5747c00..345cac2 100644 --- a/reading-platform-frontend/src/components/course-edit/Step1BasicInfo.vue +++ b/reading-platform-frontend/src/components/course-edit/Step1BasicInfo.vue @@ -74,8 +74,10 @@ @@ -156,6 +158,38 @@ const themesLoading = ref(false); const themes = ref([]); const coverImages = ref([]); +/** 核心发展目标:叶子项 + 父级领域名,用于搜索时同时匹配子项与分组 */ +const DOMAIN_TAG_OPTIONS: { group: string; value: string; label: string }[] = [ + { group: '健康', value: 'health_motor', label: '身体动作发展' }, + { group: '健康', value: 'health_hygiene', label: '生活习惯与能力' }, + { group: '语言', value: 'lang_listen', label: '倾听与表达' }, + { group: '语言', value: 'lang_read', label: '早期阅读' }, + { group: '社会', value: 'social_interact', label: '人际交往' }, + { group: '社会', value: 'social_adapt', label: '社会适应' }, + { group: '科学', value: 'science_explore', label: '科学探究' }, + { group: '科学', value: 'math_cog', label: '数学认知' }, + { group: '艺术', value: 'art_music', label: '音乐表现' }, + { group: '艺术', value: 'art_create', label: '美术创作' }, +]; + +const filterDomainTagOption = (input: string, option: any) => { + if (!input?.trim()) return true; + const q = input.trim(); + const key = option?.value ?? option?.key; + const row = DOMAIN_TAG_OPTIONS.find((o) => o.value === key); + if (row) { + return row.label.includes(q) || row.group.includes(q); + } + const label = + typeof option?.label === 'string' + ? option.label + : option?.children?.[0]?.children ?? option?.children; + if (typeof label === 'string') { + return label.includes(q); + } + return true; +}; + const formRules = { name: [ { required: true, message: '请输入课程包名称' }, diff --git a/reading-platform-frontend/src/views/admin/courses/components/Step1BasicInfo.vue b/reading-platform-frontend/src/views/admin/courses/components/Step1BasicInfo.vue index b087f7e..4ba0ace 100644 --- a/reading-platform-frontend/src/views/admin/courses/components/Step1BasicInfo.vue +++ b/reading-platform-frontend/src/views/admin/courses/components/Step1BasicInfo.vue @@ -71,8 +71,10 @@ @@ -152,6 +154,37 @@ const themesLoading = ref(false); const themes = ref([]); const coverImages = ref([]); +const DOMAIN_TAG_OPTIONS: { group: string; value: string; label: string }[] = [ + { group: '健康', value: 'health_motor', label: '身体动作发展' }, + { group: '健康', value: 'health_hygiene', label: '生活习惯与能力' }, + { group: '语言', value: 'lang_listen', label: '倾听与表达' }, + { group: '语言', value: 'lang_read', label: '早期阅读' }, + { group: '社会', value: 'social_interact', label: '人际交往' }, + { group: '社会', value: 'social_adapt', label: '社会适应' }, + { group: '科学', value: 'science_explore', label: '科学探究' }, + { group: '科学', value: 'math_cog', label: '数学认知' }, + { group: '艺术', value: 'art_music', label: '音乐表现' }, + { group: '艺术', value: 'art_create', label: '美术创作' }, +]; + +const filterDomainTagOption = (input: string, option: any) => { + if (!input?.trim()) return true; + const q = input.trim(); + const key = option?.value ?? option?.key; + const row = DOMAIN_TAG_OPTIONS.find((o) => o.value === key); + if (row) { + return row.label.includes(q) || row.group.includes(q); + } + const label = + typeof option?.label === 'string' + ? option.label + : option?.children?.[0]?.children ?? option?.children; + if (typeof label === 'string') { + return label.includes(q); + } + return true; +}; + const formData = reactive({ name: '', themeId: undefined,