consumer-app/pages/activities/myCollect.vue

318 lines
7.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="my-collect-page">
<!-- 顶部导航栏 -->
<NavHeader title="我的收藏" />
<!-- 收藏列表 -->
<scroll-view
class="collect-scroll"
scroll-y="true"
:refresher-enabled="true"
:refresher-triggered="refreshing"
@refresherrefresh="handleRefresh"
@scrolltolower="handleLoadMore"
:lower-threshold="100"
>
<view class="collect-list">
<!-- 空数据提示 -->
<view class="empty-state" v-if="!loading && collectList.length === 0">
<image
class="empty-icon"
src="/static/home/entry_icon.png"
mode="aspectFit"
></image>
<text class="empty-text">暂无收藏数据</text>
</view>
<!-- 收藏列表项 -->
<view
class="collect-item"
v-for="(item, index) in collectList"
:key="index"
@click="handleCollectClick(item)"
>
<view class="collect-image-wrapper" v-if="item.coverUrl">
<image
class="collect-image"
:src="item.coverUrl"
mode="aspectFill"
></image>
</view>
<view class="collect-content">
<view class="collect-title">{{ item.title || item.collectName || '未命名' }}</view>
<view class="collect-desc" v-if="item.info">{{ item.info }}</view>
<view class="collect-time">{{ formatTime(item.createTime) }}</view>
</view>
</view>
<!-- 加载更多提示 -->
<view class="load-more" v-if="collectList.length > 0">
<text v-if="loadingMore" class="load-more-text">加载中...</text>
<text v-else-if="!hasMore" class="load-more-text">没有更多数据了</text>
<text v-else class="load-more-text"></text>
</view>
</view>
</scroll-view>
</view>
</template>
<script>
import { getMyCollect } from "@/api/profile.js";
import NavHeader from "@/components/NavHeader/NavHeader.vue";
export default {
components: {
NavHeader
},
data() {
return {
collectList: [],
// 分页相关
pageNo: 1,
pageSize: 10,
total: 0,
hasMore: true,
loading: false,
loadingMore: false,
refreshing: false,
};
},
onLoad() {
this.loadCollectList();
},
methods: {
// 加载收藏列表
async loadCollectList(isLoadMore = false) {
// 如果正在加载或没有更多数据,则不加载
if (this.loading || this.loadingMore || (!isLoadMore && !this.hasMore)) {
return;
}
try {
if (isLoadMore) {
this.loadingMore = true;
} else {
this.loading = true;
}
const res = await getMyCollect({
pageNo: this.pageNo,
pageSize: this.pageSize,
});
if (res) {
const newList = res.list || [];
this.total = res.total || 0;
if (isLoadMore) {
// 加载更多,追加数据
this.collectList = [...this.collectList, ...newList];
} else {
// 首次加载或刷新,替换数据
this.collectList = newList;
}
// 判断是否还有更多数据
this.hasMore = this.collectList.length < this.total;
}
} catch (error) {
console.error("加载收藏列表失败:", error);
uni.showToast({
title: "加载失败,请重试",
icon: "none",
});
} finally {
this.loading = false;
this.loadingMore = false;
this.refreshing = false;
}
},
// 下拉刷新
handleRefresh() {
this.refreshing = true;
this.pageNo = 1;
this.hasMore = true;
this.loadCollectList(false);
},
// 上拉加载更多
handleLoadMore() {
if (this.hasMore && !this.loadingMore && !this.loading) {
this.pageNo += 1;
this.loadCollectList(true);
}
},
// 格式化时间
formatTime(timeStr) {
if (!timeStr) return "";
const date = new Date(timeStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}`;
},
// 收藏项点击
handleCollectClick(item) {
// 根据收藏类型跳转到对应的详情页
// collectType: 收藏的类型
// collectId: 收藏的id
if (item.collectType && item.collectId) {
// 这里可以根据 collectType 判断跳转到不同的详情页
// 例如1-活动详情2-服务详情等
if (item.collectType === 2) {
// 假设类型2是活动
uni.navigateTo({
url: `/pages/detail/activitiesDetail?id=${item.collectId}`,
});
} else {
// 其他类型可以在这里扩展
uni.showToast({
title: "暂不支持查看详情",
icon: "none",
});
}
}
},
},
};
</script>
<style lang="scss" scoped>
.my-collect-page {
height: 100vh;
background-color: #e2e8f1;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* 收藏列表 */
.collect-scroll {
flex: 1;
height: 0; // 配合 flex: 1 使用,让 scroll-view 可以滚动
}
.collect-list {
padding: 20rpx;
background-color: #e2e8f1;
/* 空数据提示 */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 200rpx 0;
min-height: 500rpx;
.empty-icon {
width: 356rpx;
height: 266rpx;
margin-bottom: 40rpx;
}
.empty-text {
font-family: PingFang-SC, PingFang-SC;
font-weight: 500;
font-size: 28rpx;
color: #999999;
}
}
/* 加载更多提示 */
.load-more {
display: flex;
justify-content: center;
align-items: center;
padding: 40rpx 0;
min-height: 80rpx;
.load-more-text {
font-family: PingFang-SC, PingFang-SC;
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
}
.collect-item {
display: flex;
background-color: #ffffff;
border-radius: 20rpx;
margin-bottom: 30rpx;
padding: 25rpx 20rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
&:active {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
}
&:last-child {
margin-bottom: 0;
}
.collect-image-wrapper {
width: 186rpx;
height: 200rpx;
flex-shrink: 0;
border: 1rpx solid #e2e8f1;
border-radius: 10rpx;
margin-right: 20rpx;
overflow: hidden;
.collect-image {
width: 100%;
height: 100%;
}
}
.collect-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
.collect-title {
font-family: PingFang-SC, PingFang-SC;
font-weight: bold;
font-size: 30rpx;
color: #1a1819;
margin-bottom: 12rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.collect-desc {
font-family: PingFang-SC, PingFang-SC;
font-weight: 500;
font-size: 22rpx;
color: #888888;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
margin-bottom: 12rpx;
}
.collect-time {
font-family: PingFang-SC, PingFang-SC;
font-weight: 400;
font-size: 22rpx;
color: #999999;
}
}
}
}
</style>