<template> <view class="container"> <!-- 搜索 --> <u-search @search="toSearch" :show-action="false" shape="round" placeholder="搜索您想要的内容" v-model="searchForm.keyword"></u-search> <!-- tabs --> <view style="padding-top: 20rpx;display: flex;"> <u-tabs style="flex: 1;" :list="tabsList" :is-scroll="true" font-size="24" :bold="false" inactive-color="#000000" active-color="#000000" :bar-style="{'background-color': '#2979ff'}" :gutter="30" height="45" v-model="currentTab" @change="changeTab"></u-tabs> <!-- <u-icon name="list" style="flex: 0 0 auto;padding-left: 20rpx;"></u-icon> --> </view> <!-- 列表 --> <view class="course-list"> <view v-for="(course,index) in filterCourses" :key="course.id" @click="toPage(course)"> <view class="course-item"> <view class="course-item-image"> <image class="course-image" :src="course.cover" mode="aspectFit"></image> </view> <view class="course-item-content"> <view class="course-title"> <text>{{ course.courseName }}</text> <image style="width: 25rpx;height: 25rpx;padding-left: 20rpx;" :src="course.hasFavi ? `${FILE_URL}/edu-icon/favi-icon.png` : `${FILE_URL}/edu-icon/no-favi-icon.png`" @click.stop="collectCourse(course.id, index, course.hasFavi)"> </image> </view> <view class="course-type">{{ course.courseType }}</view> <view class="course-teacher"> <u-icon name="account" size="28"></u-icon> {{ course.name }} </view> <view class="course-date"> <u-icon name="clock" size="28"></u-icon> {{ getDateWeek(course.courseDate) }} </view> <view class="course-price" v-if=" (course.viewMode === '3') || (isMember && course.viewMode==='2')"> ¥{{ isMember ? course.priceMember : course.price }}元 </view> <view v-else style="height: 30rpx;width: 100%;"></view> <button :class="['button', getButtonClass(course)]">{{ getButtonText(course) }}</button> </view> </view> <u-line /> </view> </view> <view style="margin: 20rpx 0;"> <u-loadmore :status="loadMoreStatus" @loadmore="loadmore" :load-text="loadText" /> <!-- <uni-load-more :status="loadMoreStatus" :load-text="loadText" @loadmore="loadmore"></uni-load-more> --> </view> </view> </template> <script setup> import { ref, onMounted, watch, } from 'vue'; import { onReachBottom } from '@dcloudio/uni-app' import { loadCourseCate, loadCourseList, courseFavi, courseCancelFavi } from "@/api/edu.js" import { useCourseStore } from "@/store/courseStore.js" import { useAuthStore } from '@/store/authStore.js'; import configService from '@/utils/baseurl.js' const FILE_URL = configService.FILE_URL; const courseStore = useCourseStore(); const authStore = useAuthStore(); const isMember = ref(false); const tabsList = ref([]); const currentTab = ref(courseStore.currentTab); const searchForm = ref({ keyword: "", pageNumber: 1, pageSize: 10, }) const pageNumber = ref(1) const pageSize = ref(20) const total = ref(0) const loadMoreStatus = ref('loadmore') const courseMember = { 1: "免费", 2: "会员免费", 3: "付费", } const loadText = { loadmore: '点击或上拉加载更多', loading: '努力加载中', nomore: '实在没有了' } // 展示的课程 const filterCourses = ref([]); const courses = ref([{ id: 1, courseName: "前端开发基础前端开发基础前端开发基础", courseType: "精英训练营", name: "张老师", courseDate: "2023-10-01", imgUrl: "https://tse3-mm.cn.bing.net/th/id/OIP-C.YKoZzgmubNBxQ8j-mmoTKAHaEK?rs=1&pid=ImgDetMain", price: 99.00, hasBuy: false, hasFavi: true, viewMode: "免费" // 新增字段,标识课程的付费类型 }, ]); // 按钮的文字 function getButtonText(course) { const currentDate = new Date(); const classDate = new Date(course.courseDate); if (course.viewMode === '1') { return "免费"; } if (course.viewMode === '2') { if (isMember.value) return "会员免费"; if (!course.hasBuy && !isMember.value) return "会员免费"; if (course.hasBuy) { return currentDate < classDate ? "点击查看" : "点击查看回放"; } } if (course.viewMode === '3') { if (!course.hasBuy) return "点击购买"; return currentDate < classDate ? "点击查看" : "点击查看回放"; } return "error"; // 默认返回 } // 按钮的样式 function getButtonClass(course) { if (courseMember[course.viewMode] === '免费') return 'free'; if (courseMember[course.viewMode] === '会员免费') { if (isMember.value) return 'member-free'; return course.hasBuy ? (new Date() < new Date(course.courseDate) ? 'purchased' : 'replay') : 'member-free'; } if (courseMember[course.viewMode] === '付费') { return course.hasBuy ? (new Date() < new Date(course.courseDate) ? 'purchased' : 'replay') : 'purchase'; } return 'error'; } // 日期格式:xxxx年xx月xx日(星期x) function getDateWeek(val) { const date = new Date(val); const daysOfWeek = ['日', '一', '二', '三', '四', '五', '六']; const year = date.getFullYear(); const month = date.getMonth() + 1; // 注意:月份从0开始 const day = date.getDate(); const dayOfWeek = daysOfWeek[date.getUTCDay()]; // const result = `${year}年${month}月${day}日(星期${dayOfWeek})` return `${year}年${month}月${day}日(星期${dayOfWeek})` } // 切换搜索框下面的tab function changeTab(index) { currentTab.value = index; courseStore.setCurrentTab(index) if (index === 0) { filterCourses.value = courses.value return } filterCourses.value = courses.value.filter(item => item.courseType == tabsList.value[index].name) } function toSearch(e) { pageNumber.value = 1 search(e) } // 搜索 function search(e) { searchForm.value.keyword = e searchForm.value.pageNumber = pageNumber.value searchForm.value.pageSize = pageSize.value courses.value = pageNumber.value == 1 ? [] : courses.value loadMoreStatus.value = 'loading' loadCourseList(searchForm.value).then(res => { if (res?.data) { total.value = res.count; courses.value = [...courses.value, ...res.data]; const i = currentTab.value if (i == 0) { filterCourses.value = [...courses.value]; } else { filterCourses.value = courses.value.filter(item => item.courseType == tabsList.value[i].name) } loadMoreStatus.value = total.value === courses.value.length ? 'nomore' : 'loadmore'; pageNumber.value++; } }) } // 收藏 async function collectCourse(id, index, hasFavi) { try { let res; if (hasFavi) { res = await courseCancelFavi({ id }) } else { res = await courseFavi({ id }) } if (res.code == 0) { courses.value[index].hasFavi = !courses.value[index].hasFavi } } catch (err) { courses.value[index].hasFavi = courses.value[index].hasFavi } } // 初始化 function init() { loadCourseCate().then(res => { if (res?.data) { tabsList.value = [{ code: '', name: '全部' }, ...res.data] } }) pageNumber.value = 1; search(""); // 初始化页面,获取数据 // filterCourses.value = courses.value } function toPage(course) { uni.navigateTo({ url: `/pages/goOnEdu/course/courseDetail/courseDetail?id=${course.id}&title=${course.courseName}` }); } function loadmore() { if (courses.value.length === total.value) { return; } search(searchForm.value.keyword); } onMounted(() => { isMember.value = authStore.userInfo.isMember === 1 ? true : false // console.log(authStore.userInfo.isMember) init(); watch(currentTab, (newValue) => { courseStore.setCurrentTab(newValue); // 如果需要在切换时更新 Pinia 状态 }); }); onReachBottom(() => { loadmore() }) </script> <style lang="scss" scoped> .container { // padding: 20px; } .title { font-size: 48rpx; margin-bottom: 30rpx; } .course-item { margin: 20rpx 0; display: flex; overflow: hidden; .course-item-image { width: 200rpx; height: 260rpx; flex: 0 0 auto; margin-right: 20rpx; .course-image { width: 100%; height: 100%; } } .course-item-content { flex: 1; position: relative; view { margin-bottom: 15rpx; } .course-title { font-weight: bold; margin-right: 10px; font-size: 28rpx; color: #000; } .course-type, .course-teacher, .course-date, .course-price { font-size: 30rpx; color: #000; } .course-price { color: #fe0000; letter-spacing: 2rpx; } .button::after { content: none; /* 移除内容 */ } .button { position: absolute; right: 0; bottom: 0; min-width: 80px; padding: 0 40rpx; white-space: nowrap; height: 45rpx; line-height: 45rpx; font-size: 22rpx; /* padding: 0; */ border-radius: 50rpx; color: white; border: none; } .free { background-color: #006af4; } .purchase { background-color: #fe0000; } .member-free { background-color: transparent; background-image: url('http://www.gzrea.org.cn:8543/icon/wxmp/bg-label.png'); background-size: cover; background-repeat: no-repeat; color: #000; height: initial; padding: 6rpx 0 3rpx; border-radius: 0; } .replay { background-color: #006af4; } .purchased { background-color: #006af4; } } } </style>