From e0995a913291761ec5e240fbd253aa8ddedec9c4 Mon Sep 17 00:00:00 2001 From: huertian Date: Sun, 5 Jan 2025 19:55:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=9B=E5=BA=A6=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E6=8E=92=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 1 + src/pages/index/index.vue | 111 +++++++++++++++++++++++++++----------- 2 files changed, 81 insertions(+), 31 deletions(-) diff --git a/components.d.ts b/components.d.ts index 18ec8fb..70efff9 100644 --- a/components.d.ts +++ b/components.d.ts @@ -27,6 +27,7 @@ declare module 'vue' { WdProgress: typeof import('wot-design-uni/components/wd-progress/wd-progress.vue')['default'] WdRadio: typeof import('wot-design-uni/components/wd-radio/wd-radio.vue')['default'] WdRadioGroup: typeof import('wot-design-uni/components/wd-radio-group/wd-radio-group.vue')['default'] + WdSortButton: typeof import('wot-design-uni/components/wd-sort-button/wd-sort-button.vue')['default'] WdStatusTip: typeof import('wot-design-uni/components/wd-status-tip/wd-status-tip.vue')['default'] WdStep: typeof import('wot-design-uni/components/wd-step/wd-step.vue')['default'] WdSteps: typeof import('wot-design-uni/components/wd-steps/wd-steps.vue')['default'] diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue index 94d4150..9486aec 100644 --- a/src/pages/index/index.vue +++ b/src/pages/index/index.vue @@ -54,6 +54,7 @@ const handleBeforeToggle: DropMenuItemBeforeToggle = ({ status, resolve }) => { const expandedCourse = ref(['lesson']) const groupedLessons = ref<{ [key: string]: LessonTask[] }>({}) +const refreshKey = ref(0) const openLessonDetail = (courseId: number) => { router.push({ @@ -97,22 +98,47 @@ const loadLessons = async () => { return } - const groupData = res.data.content - .sort((a: LessonTask, b: LessonTask) => a.id - b.id) - .reduce((acc: { [key: string]: LessonTask[] }, cur: LessonTask) => { - if (!acc[cur.courseName]) { - acc[cur.courseName] = [] - } - acc[cur.courseName].push(cur) - return acc - }, {}) + // 先按 id 排序 + let sortedContent = [...res.data.content].sort((a: LessonTask, b: LessonTask) => a.id - b.id) + // 分组 + const groupData = sortedContent.reduce((acc: { [key: string]: LessonTask[] }, cur: LessonTask) => { + if (!acc[cur.courseName]) { + acc[cur.courseName] = [] + } + acc[cur.courseName].push(cur) + return acc + }, {}) + + // 如果不是默认排序,对每个组内的课程按进度排序 + if (value.value !== 0) { + Object.keys(groupData).forEach(courseName => { + groupData[courseName].sort((a: LessonTask, b: LessonTask) => { + const progressA = calcLessonProgress(a) + const progressB = calcLessonProgress(b) + return value.value === 1 + ? progressB - progressA // 完成度高的优先(降序) + : progressA - progressB // 完成度低的优先(升序) + }) + }) + } + + console.log('分组后的课程数据:', JSON.stringify(groupData, null, 2)) groupedLessons.value = groupData - expandedCourse.value = Object.keys(groupData).filter(courseName => { - return groupData[courseName].filter((lesson: LessonTask) => - calcLessonProgress(lesson) !== 0 && calcLessonProgress(lesson) !== 100 - ).length > 0 + + const expandedGroups = Object.keys(groupData).filter(courseName => { + const courses = groupData[courseName] + const hasCompleted = courses.some(lesson => calcLessonProgress(lesson) === 100) + const hasNotStarted = courses.some(lesson => calcLessonProgress(lesson) === 0) + const hasInProgress = courses.some(lesson => { + const progress = calcLessonProgress(lesson) + return progress > 0 && progress < 100 + }) + return (hasCompleted && hasNotStarted) || hasInProgress }) + + // 更新展开的课程组 + expandedCourse.value = expandedGroups } catch (err: unknown) { if (err instanceof Error) { toast.error({ msg: err.message }) @@ -163,19 +189,35 @@ onLoad(() => { loadLessons() }) +const value = ref(0) + +// 处理排序按钮点击 +const handleChange = ({ value: newValue }: { value: number }) => { + console.log('排序值:', newValue) + value.value = newValue + loadLessons().then(() => { + // 强制重新渲染组件 + refreshKey.value++ + }) +}