From d7961694f92dbd8d8c16480f6518f09e4fdffeca Mon Sep 17 00:00:00 2001 From: liwentao Date: Mon, 15 Jun 2026 18:03:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9B=A2=E8=AF=BE=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gym-manage-uniapp/api/groupCourse.js | 12 +- .../components/index/RecommendCourses.vue | 68 ++-- .../recommendCourses/RecommendCourseCard.vue | 371 ++++++++++++++++++ gym-manage-uniapp/pages/course/index.vue | 57 ++- .../pages/recommendCourses/index.vue | 206 +++++----- 5 files changed, 540 insertions(+), 174 deletions(-) create mode 100644 gym-manage-uniapp/components/recommendCourses/RecommendCourseCard.vue diff --git a/gym-manage-uniapp/api/groupCourse.js b/gym-manage-uniapp/api/groupCourse.js index d4f2b8d..89c5787 100644 --- a/gym-manage-uniapp/api/groupCourse.js +++ b/gym-manage-uniapp/api/groupCourse.js @@ -91,6 +91,14 @@ export function getMemberBookings(memberId, options = {}) { return request.get(`/groupCourse/bookings/member/${memberId}`, {}, options) } +export function getActiveRecommendCourses(options = { cache: true, cacheTime: 5 * 60 * 1000 }) { + return request.get('/groupCourse/recommend/active', {}, options) +} + +export function getGroupCourseRecommendList(params = {}, options = { cache: true, cacheTime: 5 * 60 * 1000 }) { + return request.get('/groupCourse/recommend/list', params, options) +} + export default { getGroupCourseList, getGroupCoursePage, @@ -106,5 +114,7 @@ export default { getTypeLabels, bookGroupCourse, cancelBooking, - getMemberBookings + getMemberBookings, + getActiveRecommendCourses, + getGroupCourseRecommendList } \ No newline at end of file diff --git a/gym-manage-uniapp/components/index/RecommendCourses.vue b/gym-manage-uniapp/components/index/RecommendCourses.vue index 64d9d3f..a882965 100644 --- a/gym-manage-uniapp/components/index/RecommendCourses.vue +++ b/gym-manage-uniapp/components/index/RecommendCourses.vue @@ -20,7 +20,7 @@ + + diff --git a/gym-manage-uniapp/pages/course/index.vue b/gym-manage-uniapp/pages/course/index.vue index 297f288..279ac43 100644 --- a/gym-manage-uniapp/pages/course/index.vue +++ b/gym-manage-uniapp/pages/course/index.vue @@ -44,6 +44,7 @@ import RecommendCourses from '@/components/index/RecommendCourses.vue' import PageHeader from '@/components/index/PageHeader.vue' import TabBar from '@/components/TabBar.vue' import { PAGE, navigateToPage } from '@/common/constants/routes.js' +import { getActiveRecommendCourses } from '@/api/groupCourse.js' const loading = ref(true) const courseData = ref(null) @@ -53,41 +54,71 @@ function loadFromCache() { try { const cached = uni.getStorageSync('course_cache') if (cached && Date.now() - cached.time < 5 * 60 * 1000) { + console.log('[Course Page] 从缓存加载数据,缓存时间:', new Date(cached.time).toLocaleString()) courseData.value = cached.data loading.value = false return true } } catch (e) { - console.error('读取缓存失败', e) + console.error('[Course Page] 读取缓存失败', e) } + console.log('[Course Page] 缓存不存在或已过期,准备从网络加载') return false } // 从网络加载数据 async function loadFromNetwork() { loading.value = true + console.log('[Course Page] 开始从后端获取团课推荐数据...') try { - // 模拟 API 请求 - const res = await new Promise((resolve) => { - setTimeout(() => { - resolve({ code: 0, data: { list: [] } }) - }, 500) - }) + // 获取启用的团课推荐列表(按优先级从高到低排序) + console.log('[Course Page] 发起 API 请求: GET /groupCourse/recommend/active') + const res = await getActiveRecommendCourses() - if (res.code === 0) { - courseData.value = res.data + console.log('[Course Page] API 响应数据:', res) + + if (res && Array.isArray(res)) { + console.log('[Course Page] 获取到', res.length, '条团课推荐数据') + + // 取优先级最高的5个团课 + const top5Courses = res.slice(0, 5).map(recommend => ({ + id: recommend.groupCourse.id, + courseName: recommend.groupCourse.courseName, + courseType: recommend.groupCourse.courseType, + startTime: recommend.groupCourse.startTime, + endTime: recommend.groupCourse.endTime, + maxMembers: recommend.groupCourse.maxMembers, + currentMembers: recommend.groupCourse.currentMembers, + status: recommend.groupCourse.status, + coverImage: recommend.groupCourse.coverImage, + description: recommend.groupCourse.description, + recommendTitle: recommend.recommendTitle, + recommendContent: recommend.recommendContent, + recommendReason: recommend.recommendReason, + priority: recommend.priority + })) + + console.log('[Course Page] 筛选出前5个优先级最高的团课:', top5Courses) + courseData.value = { list: top5Courses } + // 更新缓存 uni.setStorageSync('course_cache', { - data: res.data, + data: courseData.value, time: Date.now() }) + console.log('[Course Page] 数据已缓存') + } else { + console.log('[Course Page] API 响应为空或格式不正确') + courseData.value = { list: [] } } } catch (err) { - console.error('加载失败', err) + console.error('[Course Page] 加载失败:', err) uni.showToast({ title: '加载失败', icon: 'none' }) + courseData.value = { list: [] } } finally { loading.value = false + console.log('[Course Page] 数据加载完成,loading:', loading.value) } } @@ -113,8 +144,8 @@ onLoad(() => { }) onShow(() => { - // 每次显示时确保加载完成 - if (loading.value && !courseData.value) { + // 每次显示时尝试刷新数据(后台静默更新) + if (!loading.value) { loadFromNetwork() } }) diff --git a/gym-manage-uniapp/pages/recommendCourses/index.vue b/gym-manage-uniapp/pages/recommendCourses/index.vue index 7850e89..951c6c8 100644 --- a/gym-manage-uniapp/pages/recommendCourses/index.vue +++ b/gym-manage-uniapp/pages/recommendCourses/index.vue @@ -8,25 +8,30 @@ - - - + + + + + + + + - + - - + - + 暂无推荐课程 @@ -38,123 +43,108 @@