完善团课相关页面交互,完成团课列表页基础后端交互。(后端连接至服务器,版本为DEV分支版本)
This commit is contained in:
@@ -1,32 +1,27 @@
|
||||
import { ref, computed } from 'vue'
|
||||
import { groupCourseService } from '@/request_api/groupCourse.mock.js'
|
||||
import { getGroupCoursePage, getTypeLabels } from '@/api/groupCourse.js'
|
||||
|
||||
export function useGroupCourseList() {
|
||||
// 分页相关
|
||||
const pageNum = ref(1)
|
||||
const pageNum = ref(0)
|
||||
const pageSize = ref(10)
|
||||
const total = ref(0)
|
||||
const totalPages = ref(0)
|
||||
const loading = ref(false)
|
||||
const hasMore = ref(true)
|
||||
|
||||
// 团课列表数据
|
||||
const courseList = ref([])
|
||||
|
||||
// 搜索相关
|
||||
const searchKeyword = ref('')
|
||||
const hotKeywords = ref(['燃脂', '瑜伽', '单车', '普拉提', '高强度'])
|
||||
|
||||
// 排序相关
|
||||
const sortOptions = ref([
|
||||
{ label: '默认排序', value: 'default' },
|
||||
{ label: '价格从低到高', value: 'priceAsc' },
|
||||
{ label: '价格从高到低', value: 'priceDesc' },
|
||||
{ label: '剩余名额最多', value: 'spotsDesc' }
|
||||
{ label: '默认排序', value: 'id', order: 'asc' },
|
||||
{ label: '价格从低到高', value: 'storedValueAmount', order: 'asc' },
|
||||
{ label: '价格从高到低', value: 'storedValueAmount', order: 'desc' },
|
||||
{ label: '剩余名额最多', value: 'currentMembers', order: 'asc' }
|
||||
])
|
||||
const sortIndex = ref(0)
|
||||
|
||||
// 时间段选择相关
|
||||
const timePeriodOptions = ref([
|
||||
{ label: '全部', value: 'all' },
|
||||
{ label: '早上 (6-12 点)', value: 'morning', startHour: 6, endHour: 12 },
|
||||
@@ -35,24 +30,20 @@ export function useGroupCourseList() {
|
||||
])
|
||||
const timePeriodIndex = ref(0)
|
||||
|
||||
// 时间筛选相关
|
||||
const showTimePicker = ref(false)
|
||||
const startDate = ref('')
|
||||
const endDate = ref('')
|
||||
const timeRangeText = ref('')
|
||||
|
||||
// 筛选后的课程列表
|
||||
const filteredCourseList = computed(() => {
|
||||
let result = [...courseList.value]
|
||||
|
||||
// 关键词搜索
|
||||
if (searchKeyword.value) {
|
||||
result = result.filter(course =>
|
||||
course.courseName.includes(searchKeyword.value)
|
||||
)
|
||||
}
|
||||
|
||||
// 时间范围筛选
|
||||
if (startDate.value || endDate.value) {
|
||||
result = result.filter(course => {
|
||||
const courseDate = course.startTime.split('T')[0]
|
||||
@@ -62,7 +53,6 @@ export function useGroupCourseList() {
|
||||
})
|
||||
}
|
||||
|
||||
// 时间段筛选
|
||||
const timePeriod = timePeriodOptions.value[timePeriodIndex.value]
|
||||
if (timePeriod.value !== 'all') {
|
||||
result = result.filter(course => {
|
||||
@@ -71,20 +61,18 @@ export function useGroupCourseList() {
|
||||
})
|
||||
}
|
||||
|
||||
// 排序
|
||||
const sortType = sortOptions.value[sortIndex.value].value
|
||||
if (sortType === 'priceAsc') {
|
||||
result.sort((a, b) => (a.storedValueAmount || a.pointCardAmount) - (b.storedValueAmount || b.pointCardAmount))
|
||||
} else if (sortType === 'priceDesc') {
|
||||
result.sort((a, b) => (b.storedValueAmount || b.pointCardAmount) - (a.storedValueAmount || a.pointCardAmount))
|
||||
} else if (sortType === 'spotsDesc') {
|
||||
result.sort((a, b) => (b.maxMembers - b.currentMembers) - (a.maxMembers - a.currentMembers))
|
||||
const sortType = sortOptions.value[sortIndex.value]
|
||||
if (sortType.value !== 'id' || sortType.order !== 'asc') {
|
||||
result.sort((a, b) => {
|
||||
const valA = a[sortType.value] || 0
|
||||
const valB = b[sortType.value] || 0
|
||||
return sortType.order === 'asc' ? valA - valB : valB - valA
|
||||
})
|
||||
}
|
||||
|
||||
return result
|
||||
})
|
||||
|
||||
// 获取所有搜索参数
|
||||
const getAllSearchParams = (searchBarRef, filterSectionRef, timePeriodRef, timeRangePickerRef) => {
|
||||
const searchParams = searchBarRef?.getSearchParams?.() || { keyword: searchKeyword.value }
|
||||
const filterParams = filterSectionRef?.getFilterParams?.() || { sortType: sortOptions.value[sortIndex.value].value }
|
||||
@@ -102,27 +90,24 @@ export function useGroupCourseList() {
|
||||
return allParams
|
||||
}
|
||||
|
||||
// 搜索处理
|
||||
const handleSearch = (params) => {
|
||||
console.log('[useGroupCourseList] 搜索触发:', params)
|
||||
uni.showToast({
|
||||
title: params.keyword ? `搜索:${params.keyword}` : '请输入关键词',
|
||||
icon: 'none'
|
||||
})
|
||||
searchKeyword.value = params.keyword || ''
|
||||
pageNum.value = 0
|
||||
fetchCourseList()
|
||||
}
|
||||
|
||||
// 时间段变化处理
|
||||
const onTimePeriodChange = (option) => {
|
||||
console.log('[useGroupCourseList] 时间段选择:', option)
|
||||
}
|
||||
|
||||
// 时间范围确认处理
|
||||
const onTimeRangeConfirm = (params) => {
|
||||
console.log('[useGroupCourseList] 时间范围确认:', params)
|
||||
startDate.value = params.startDate || ''
|
||||
endDate.value = params.endDate || ''
|
||||
timeRangeText.value = params.timeRangeText
|
||||
}
|
||||
|
||||
// 预约处理
|
||||
const handleBooking = (course) => {
|
||||
console.log('[useGroupCourseList] 预约课程:', course)
|
||||
uni.showToast({
|
||||
@@ -131,7 +116,6 @@ export function useGroupCourseList() {
|
||||
})
|
||||
}
|
||||
|
||||
// 跳转详情
|
||||
const goDetail = (courseId) => {
|
||||
console.log('[useGroupCourseList] 跳转到课程详情:', courseId)
|
||||
uni.navigateTo({
|
||||
@@ -139,20 +123,33 @@ export function useGroupCourseList() {
|
||||
})
|
||||
}
|
||||
|
||||
// 获取团课列表
|
||||
const fetchCourseList = async (isLoadMore = false) => {
|
||||
if (loading.value) return
|
||||
|
||||
loading.value = true
|
||||
|
||||
try {
|
||||
const result = await groupCourseService.getList({
|
||||
pageNum: pageNum.value,
|
||||
pageSize: pageSize.value
|
||||
const sortOption = sortOptions.value[sortIndex.value]
|
||||
console.log('[useGroupCourseList] 请求参数:', {
|
||||
page: isLoadMore ? pageNum.value + 1 : pageNum.value,
|
||||
size: pageSize.value,
|
||||
sort: sortOption.value,
|
||||
order: sortOption.order,
|
||||
keyword: searchKeyword.value
|
||||
})
|
||||
|
||||
const result = await getGroupCoursePage({
|
||||
page: isLoadMore ? pageNum.value + 1 : pageNum.value,
|
||||
size: pageSize.value,
|
||||
sort: sortOption.value,
|
||||
order: sortOption.order,
|
||||
keyword: searchKeyword.value
|
||||
})
|
||||
|
||||
if (result.code === 0 && result.data) {
|
||||
const { list, total: totalCount, pageNum: currentPage, totalPages: pages } = result.data
|
||||
console.log('[useGroupCourseList] 响应结果:', JSON.stringify(result, null, 2))
|
||||
|
||||
if (result && result.content) {
|
||||
const { content: list, totalElements: totalCount, currentPage, totalPages: pages } = result
|
||||
|
||||
if (isLoadMore) {
|
||||
courseList.value = [...courseList.value, ...list]
|
||||
@@ -163,7 +160,7 @@ export function useGroupCourseList() {
|
||||
total.value = totalCount
|
||||
pageNum.value = currentPage
|
||||
totalPages.value = pages
|
||||
hasMore.value = pageNum.value < totalPages.value
|
||||
hasMore.value = currentPage < pages - 1
|
||||
|
||||
console.log('[useGroupCourseList] 团课列表获取成功:', {
|
||||
total: total.value,
|
||||
@@ -172,29 +169,41 @@ export function useGroupCourseList() {
|
||||
hasMore: hasMore.value
|
||||
})
|
||||
} else {
|
||||
console.error('[useGroupCourseList] 获取团课列表失败:', result.message)
|
||||
console.error('[useGroupCourseList] 获取团课列表失败:', {
|
||||
result: result,
|
||||
message: result?.message || '未知错误',
|
||||
code: result?.code,
|
||||
success: result?.success
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[useGroupCourseList] 获取团课列表异常:', error)
|
||||
console.error('[useGroupCourseList] 获取团课列表异常 - 错误详情:', {
|
||||
error: error,
|
||||
message: error?.message || '无错误信息',
|
||||
code: error?.code,
|
||||
statusCode: error?.statusCode,
|
||||
response: error?.response,
|
||||
stack: error?.stack
|
||||
})
|
||||
uni.showToast({
|
||||
title: `获取课程列表失败: ${error?.message || '网络错误'}`,
|
||||
icon: 'none'
|
||||
})
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 加载更多
|
||||
const loadMore = () => {
|
||||
if (!hasMore.value || loading.value) return
|
||||
pageNum.value++
|
||||
fetchCourseList(true)
|
||||
}
|
||||
|
||||
// 滚动到底部触发
|
||||
const onScrollToLower = () => {
|
||||
loadMore()
|
||||
}
|
||||
|
||||
return {
|
||||
// 状态
|
||||
pageNum,
|
||||
pageSize,
|
||||
total,
|
||||
@@ -214,7 +223,6 @@ export function useGroupCourseList() {
|
||||
timeRangeText,
|
||||
filteredCourseList,
|
||||
|
||||
// 方法
|
||||
getAllSearchParams,
|
||||
handleSearch,
|
||||
onTimePeriodChange,
|
||||
@@ -225,4 +233,4 @@ export function useGroupCourseList() {
|
||||
loadMore,
|
||||
onScrollToLower
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user