From b87f40d077669eaceced44aadf7e02117f53671e Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期五, 06 六月 2025 15:25:50 +0800
Subject: [PATCH] 优化我的收藏,活动报名,我的活动页面,活动页面页面,新增加载更多

---
 pages/mine/myCollect/myCollect.vue |  512 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 384 insertions(+), 128 deletions(-)

diff --git a/pages/mine/myCollect/myCollect.vue b/pages/mine/myCollect/myCollect.vue
index 4b0fd27..7251419 100644
--- a/pages/mine/myCollect/myCollect.vue
+++ b/pages/mine/myCollect/myCollect.vue
@@ -10,103 +10,147 @@
 		</view>
 
 		<!-- 瑙嗛鍒楄〃 -->
-		<view class="activity-list" >
+		<view class="activity-list">
 			<view v-if="currentTab === 0">
-				<view v-if="signedActivities.length > 0">
-					<view v-for="(item, idx) in signedActivities" :key="idx" class="activity-item">
-						<!-- 灏侀潰鍖哄煙 -->
-						<block v-if="item.coverType === '鍥剧墖' || item.coverType === '瑙嗛'">
-							<image :src="getPreviewUrl(item.cover)" mode="aspectFill" class="activity-cover" />
-						</block>
-						<block v-if="item.coverType === '鏂囧瓧'">
-							<view class="activity-cover">{{ item.cover }}</view>
-						</block>
+				<scroll-view scroll-y class="activity-list" style="height: 100vh;" @scrolltolower="loadMore"
+					:lower-threshold="100">
+					<view v-if="videoCollects.length > 0">
+						<view v-for="(item, idx) in videoCollects" :key="idx" class="video-item">
+							<!-- 瑙嗛灏侀潰+鎾斁鎸夐挳 -->
+							<view class="video-cover-container">
+								<image :src="item.coverUrl" mode="aspectFill" class="video-cover" />
+								<view class="play-icon">
+									<u-icon name="play-circle-fill" size="60" color="#fff"></u-icon>
+								</view>
+								<view class="video-duration" v-if="item.duration">{{ item.duration }}</view>
+							</view>
 
-						<!-- 娲诲姩淇℃伅 -->
-						<view class="activity-info">
-							<view class="activity-title">{{ item.activityName }}</view>
-							<view class="activity-meta">
-								<text class="activity-time">{{ item.startTime }} - {{ item.endTime }}</text>
-								<text class="activity-location">{{ item.activityLocation || '鏆傛棤' }}</text>
+							<!-- 瑙嗛淇℃伅 -->
+							<view class="video-info">
+								<view class="video-title">{{ item.authorName || '鏈煡浣滆��' }}</view>
+								<view class="video-meta">
+									<text class="video-weight" v-if="item.weight > 0">
+										<u-icon name="thumb-up-fill" size="24" color="#999"></u-icon>
+										{{ item.weight }}
+									</text>
+								</view>
+							</view>
+
+							<!-- 鎿嶄綔鎸夐挳 -->
+							<view class="video-actions">
+								<button class="cancel-btn" @click.stop="handleCancelCollection(item,'video')">
+									鍙栨秷鏀惰棌
+								</button>
 							</view>
 						</view>
-
-						<!-- 鎿嶄綔鍖哄煙 -->
-						<view class="action-container">
-							<button class="cancel-btn" @click="handleCancelCollection(item)"
-								hover-class="cancel-btn-hover">
-								鍙栨秷鏀惰棌
-							</button>
-						</view>
-
 					</view>
-				</view>
+					<view v-else class="empty-tip">
+						<text>鏆傛棤鏀惰棌瑙嗛</text>
+					</view>
+					<view class="load-more">
+						<u-loadmore v-if="videoCollects.length > 0"
+							:status="loading ? 'loading' : noMore ? 'nomore' : 'loadmore'" :load-text="{
+				      loadmore: '涓婃媺鍔犺浇鏇村',
+				      loading: '姝e湪鍔犺浇',
+				      nomore: '娌℃湁鏇村浜�'
+				    }" />
+					</view>
+				</scroll-view>
+
+
+
 			</view>
 
 			<view v-if="currentTab === 1">
-				<!-- 宸茬粨鏉熸椿鍔ㄥ垪琛� -->
-				<view v-if="endedActivities.length > 0">
-					<view v-for="(item, idx) in endedActivities" :key="idx" class="activity-item">
-						<!-- 灏侀潰鍖哄煙 -->
-						<block v-if="item.coverType === '鍥剧墖' || item.coverType === '瑙嗛'">
-							<image :src="getPreviewUrl(item.cover)" mode="aspectFill" class="activity-cover" />
-						</block>
-						<block v-if="item.coverType === '鏂囧瓧'">
-							<view class="activity-cover">{{ item.cover }}</view>
-						</block>
+				<scroll-view scroll-y class="activity-list" style="height: 100vh;" @scrolltolower="loadMore"
+					:lower-threshold="100">
+					<view v-if="goodsCollects.length > 0">
+						<view v-for="(item, idx) in goodsCollects" :key="idx" class="activity-item">
+							<!-- 灏侀潰鍖哄煙 -->
+							<block>
+								<image :src="item.original" mode="aspectFill" class="activity-cover" />
+							</block>
 
-						<!-- 娲诲姩淇℃伅 -->
-						<view class="activity-info">
-							<view class="activity-title">{{ item.activityName }}</view>
-							<view class="activity-meta">
-								<text class="activity-time">{{ item.startTime }} - {{ item.endTime }}</text>
-								<text class="activity-location">{{ item.activityLocation || '鏆傛棤' }}</text>
+							<!-- 娲诲姩淇℃伅 -->
+							<view class="activity-info">
+								<view class="activity-title">{{ item.goodsName }}</view>
+								<view class="activity-meta">
+									<text class="activity-time">浠锋牸:{{ item.price }}鍏�</text>
+									<text class="activity-location">{{ item.storeName || '鏆傛棤' }}</text>
+								</view>
 							</view>
-						</view>
 
-						<!-- 鎿嶄綔鍖哄煙 -->
-						<view class="action-container">
-							<button class="cancel-btn" @click="handleCancelCollection(item)"
-								hover-class="cancel-btn-hover">
-								鍙栨秷鏀惰棌
-							</button>
-						</view>
+							<!-- 鎿嶄綔鍖哄煙 -->
+							<view class="action-container">
+								<button class="cancel-btn" @click="handleCancelCollection(item,'goods')"
+									hover-class="cancel-btn-hover">
+									鍙栨秷鏀惰棌
+								</button>
+							</view>
 
+						</view>
 					</view>
-				</view>
+					<view v-else class="empty-tip">
+
+						<text>鏆傛棤鏀惰棌鍟嗗搧</text>
+					</view>
+					<view class="load-more">
+						<u-loadmore v-if="goodsCollects.length > 0"
+							:status="loading ? 'loading' : noMore ? 'nomore' : 'loadmore'" :load-text="{
+				      loadmore: '涓婃媺鍔犺浇鏇村',
+				      loading: '姝e湪鍔犺浇',
+				      nomore: '娌℃湁鏇村浜�'
+				    }" />
+					</view>
+				</scroll-view>
 			</view>
 
 			<view v-if="currentTab === 2">
-				<!-- 宸插彇娑堟椿鍔ㄥ垪琛� -->
-				<view v-if="canceledActivities.length > 0">
-					<view v-for="(item, idx) in endedActivities" :key="idx" class="activity-item">
-						<!-- 灏侀潰鍖哄煙 -->
-						<block v-if="item.coverType === '鍥剧墖' || item.coverType === '瑙嗛'">
-							<image :src="getPreviewUrl(item.cover)" mode="aspectFill" class="activity-cover" />
-						</block>
-						<block v-if="item.coverType === '鏂囧瓧'">
-							<view class="activity-cover">{{ item.cover }}</view>
-						</block>
-						<!-- 娲诲姩淇℃伅 -->
-						<view class="activity-info">
-							<view class="activity-title">{{ item.activityName }}</view>
-							<view class="activity-meta">
-								<text class="activity-time">{{ item.startTime }} - {{ item.endTime }}</text>
-								<text class="activity-location">{{ item.activityLocation || '鏆傛棤' }}</text>
+				<scroll-view scroll-y class="activity-list" style="height: 80vh;" @scrolltolower="loadMore"
+					:lower-threshold="100">
+					<view v-if="activityCollects.length > 0">
+						<view v-for="(item, idx) in activityCollects" :key="idx" class="activity-item">
+							<!-- 灏侀潰鍖哄煙 -->
+							<block v-if="item.coverType === '鍥剧墖' || item.coverType === '瑙嗛'">
+								<image :src="item.cover" mode="aspectFill" class="activity-cover" />
+							</block>
+							<block v-if="item.coverType === '鏂囧瓧'">
+								<view class="activity-cover  text-cover">{{ item.cover }}</view>
+							</block>
+							<!-- 娲诲姩淇℃伅 -->
+							<view class="activity-info">
+								<view class="activity-title">{{ item.activityName }}</view>
+								<view class="activity-meta">
+									<text class="activity-time">{{ item.startTime }}</text>
+									<text class="activity-time"> {{ item.endTime }}</text>
+									<text class="activity-location">{{ item.activityLocation || '鏆傛棤' }}</text>
+								</view>
 							</view>
+							<!-- 鎿嶄綔鍖哄煙 -->
+							<view class="action-container">
+								<button class="cancel-btn" @click="handleCancelCollection(item,'activity')"
+									hover-class="cancel-btn-hover">
+									鍙栨秷鏀惰棌
+								</button>
+							</view>
+
 						</view>
-						<!-- 鎿嶄綔鍖哄煙 -->
-						<view class="action-container">
-							<button class="cancel-btn" @click="handleCancelCollection(item)"
-								hover-class="cancel-btn-hover">
-								鍙栨秷鏀惰棌
-							</button>
-						</view>
-						
+
+
 					</view>
-
-
-				</view>
+					<view v-else class="empty-tip">
+						<text>鏆傛棤鏀惰棌娲诲姩</text>
+					</view>
+					<view class="load-more">
+						<u-loadmore v-if="activityCollects.length > 0"
+							:status="loading ? 'loading' : noMore ? 'nomore' : 'loadmore'" :load-text="{
+				      loadmore: '涓婃媺鍔犺浇鏇村',
+				      loading: '姝e湪鍔犺浇',
+				      nomore: '娌℃湁鏇村浜�'
+				    }" />
+					</view>
+					<view style="height: 150rpx"></view>
+				</scroll-view>
 
 			</view>
 
@@ -120,88 +164,300 @@
 </template>
 
 <script>
+	import ULoadmore from '@/uview-components/uview-ui/components/u-loadmore/u-loadmore.vue'
+	import UImage from '@/uview-components/uview-ui/components/u-image/u-image.vue';
 	import {
-		getMyActivityList,
-		activityCancel
-	} from '@/api/activity.js'
-	import {
-		getPreviewUrl
+		getFilePreviewUrl
 	} from '@/api/common.js'
+	import {
+		changeCollect,
+		getMyCollectList
+	} from '@/api/collect.js'
+	import {
+		ifError
+	} from 'assert'
 	export default {
+		components: {
+			UImage,
+			ULoadmore
+		},
 		data() {
 			return {
+				total: 0,
+				loading: false,
+				noMore: {
+					video: false,
+					goods: false,
+					activity: false
+				},
 				currentTab: 0, // 褰撳墠閫変腑鐨則ab绱㈠紩
 				tabs: ['瑙嗛', '鍟嗗搧', '娲诲姩'],
-				// 
+				//
 				videoCollects: [], // 鏀惰棌瑙嗛鍒楄〃
-				storeCollects: [], // 鏀惰棌鍟嗗搧鍒楄〃
+				goodsCollects: [], // 鏀惰棌鍟嗗搧鍒楄〃
 				activityCollects: [], // 鏀惰棌娲诲姩鍒楄〃
-				query: {
-					id: '',
-					status: '',
-					cancel: false,
+				collectForm: {
+					collectType: '',
+					refId: '',
 				},
+				query: {
+					type: 'video',
+					pageNumber: 1,
+					pageSize: 5,
+				}
 			}
 		},
-		onLoad(){
+		onLoad() {
 			this.currentTab = 0;
 			//TODO 鏈櫥褰曢渶瑕乮d锛屾祴璇曠敤鍐欐\
-			this.switchTab(this.currentTab);
+			this.getintit()
 		},
 		methods: {
-			handleCancelCollection(id) {
 
+			/**
+			 * 涓嬫媺鍒锋柊鏃�
+			 */
+			onPullDownRefresh() {
+				this.currentTab = 0;
+				this.query.pageNumber = 1; // 閲嶇疆椤电爜
+				this.noMore = false;
+				this.videoCollects = [];
+				this.goodsCollects = []; // 鏀惰棌鍟嗗搧鍒楄〃
+				this.activityCollects = []; // 鏀惰棌娲诲姩鍒楄〃// 娓呯┖鏁版嵁
+				this.getintit();
 			},
-			getPreviewUrl(params) {
-				// return getPreviewUrl(params);
-				return '';
+			loadMore() {
+				this.loading = true;
+				this.query.pageNumber += 1;
+				// 寤惰繜鎵ц璁︰I鏈夊弽搴旀椂闂�
+				setTimeout(() => {
+					this.query.pageNumber += 1;
+					this.getintit();
+				}, 300);
+			},
+			handleCancelCollection(item, type) {
+				console.log(item)
+				this.collectForm.collectType = type;
+				this.collectForm.refId = item.id;
+				changeCollect(this.collectForm).then(res => {
+					if (res.statusCode === 200) {
+						uni.showToast({
+							title: res.data.msg, // 鎻愮ず鏂囧瓧
+							icon: 'none', // 鍥炬爣绫诲瀷锛坰uccess/loading/none锛�
+							mask: true // 鏄惁鏄剧ず閫忔槑钂欏眰锛堥槻姝㈣Е鎽哥┛閫忥級
+						});
+						this.getintit();
+					}
+
+				})
+			},
+			getUrl(params) {
+				getFilePreviewUrl(params).then(res => {
+					return res.data.data
+				})
 			},
 			// 鍒囨崲tab
 			switchTab(index) {
-				
 				if (this.currentTab !== index) {
 					this.currentTab = index
+					//鍒囨崲鏃堕〉鐮佸綊0
+					this.query.pageNumber = 0;
+					// 娓呯┖鏁版嵁
+					this.videoCollects = [];
+					this.goodsCollects = []; 
+					this.activityCollects = []; 
 					// 瀹為檯椤圭洰涓彲浠ュ湪杩欓噷娣诲姞鍔犺浇鏁版嵁鐨勯�昏緫
-					if (this.currentTab === 0) {
-						//鍔犺浇瑙嗛鍒楄〃
-						this.getMyCollectionVideoList();
-					} else if (this.currentTab === 1) {
-						//鍔犺浇鍟嗗搧鍒楄〃
-						this.getMyCollectionStoreList();
-					} else if (this.currentTab === 2) {
-						//鍔犺浇娲诲姩鍒楄〃
-						this.getMyCollectActivityList();
-					}
+					this.getintit()
+				}
+			},
+			async getintit() {
+				uni.showLoading({
+					title: '鍔犺浇涓�'
+				});
+				if (this.currentTab === 0) {
+					this.query.type = 'video';
+					getMyCollectList(this.query).then(res => {
+						uni.hideLoading();
+						this.loading = false;
 
+						if (res.statusCode === 200) {
+							const newData = res.data.data
+							this.total = res.data.total || 0;
+							// 杩藉姞鎴栨浛鎹㈡暟鎹�
+							this.videoCollects = this.query.pageNumber === 1 ?
+								newData :
+								[...this.videoCollects, ...newData];
+							// 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁
+							this.noMore = newData.length < this.query.pageSize ||
+								this.videoCollects.length >= this.total;
+
+						}
+					})
+				} else if (this.currentTab === 1) {
+					this.query.type = 'goods';
+					getMyCollectList(this.query).then(res => {
+						uni.hideLoading();
+						this.loading = false;
+						if (res.statusCode === 200) {
+							const newData = res.data.data
+							this.total = res.data.total || 0;
+
+							this.goodsCollects = this.query.pageNumber === 1 ?
+								newData :
+								[...this.goodsCollects, ...newData];
+							// 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁
+							this.noMore = newData.length < this.query.pageSize ||
+								this.goodsCollects.length >= this.total;
+						}
+					})
+				} else if (this.currentTab === 2) {
+					this.query.type = 'activity';
+					getMyCollectList(this.query).then(res => {
+						uni.hideLoading();
+						this.loading = false;
+						if (res.statusCode === 200) {
+							const newData = res.data.data
+							this.total = res.data.total || 0;
+
+							this.activityCollects = this.query.pageNumber === 1 ?
+								newData :
+								[...this.activityCollects, ...newData];
+							this.noMore = newData.length < this.query.pageSize ||
+								this.activityCollects.length >= this.total;
+						}
+					})
 				}
 
-			},
-			getMyCollectionStoreList() {
-				uni.showLoading({
-					title: '鍔犺浇涓�'
-				});
-				
-				uni.hideLoading();
-			},
-			getMyCollectionVideoList() {
-				uni.showLoading({
-					title: '鍔犺浇涓�'
-				});
-				
-				uni.hideLoading();
-			},
-			getMyCollectActivityList() {
-				uni.showLoading({
-					title: '鍔犺浇涓�'
-				});
-				
-				uni.hideLoading();
-			},
+			}
 		}
 	}
 </script>
 
 <style lang="scss">
+	.text-cover {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
+		color: #fff;
+		font-size: 28rpx;
+		padding: 16rpx;
+		line-height: 1.4;
+	}
+
+	/* 瑙嗛鍒楄〃涓撶敤鏍峰紡 */
+	.video-item {
+		display: flex;
+		padding: 24rpx 0;
+		border-bottom: 1rpx solid #f5f5f5;
+		align-items: center;
+
+		&:last-child {
+			border-bottom: none;
+		}
+	}
+
+	.video-cover-container {
+		position: relative;
+		width: 240rpx;
+		height: 160rpx;
+		border-radius: 12rpx;
+		overflow: hidden;
+		margin-right: 24rpx;
+		flex-shrink: 0;
+
+		.video-cover {
+			width: 100%;
+			height: 100%;
+		}
+
+		.play-icon {
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			opacity: 0.9;
+		}
+
+		.video-duration {
+			position: absolute;
+			right: 8rpx;
+			bottom: 8rpx;
+			background: rgba(0, 0, 0, 0.6);
+			color: #fff;
+			font-size: 20rpx;
+			padding: 4rpx 12rpx;
+			border-radius: 20rpx;
+		}
+	}
+
+	.video-info {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		height: 160rpx;
+
+		.video-title {
+			font-size: 30rpx;
+			color: #333;
+			font-weight: bold;
+			display: -webkit-box;
+			-webkit-box-orient: vertical;
+			-webkit-line-clamp: 2;
+			overflow: hidden;
+		}
+
+		.video-meta {
+			display: flex;
+			justify-content: space-between;
+			font-size: 24rpx;
+			color: #999;
+
+
+
+			.video-weight {
+				display: flex;
+				align-items: center;
+			}
+		}
+	}
+
+	.video-actions {
+		margin-left: 20rpx;
+		flex-shrink: 0;
+
+		.cancel-btn {
+			background: #f5f5f5;
+			color: #666;
+			border: none;
+			font-size: 24rpx;
+			padding: 8rpx 20rpx;
+			border-radius: 20rpx;
+
+			&:active {
+				background: #eee;
+			}
+		}
+	}
+
+	.empty-tip {
+		text-align: center;
+		padding: 100rpx 0;
+
+		image {
+			width: 300rpx;
+			margin-bottom: 30rpx;
+			opacity: 0.6;
+		}
+
+		text {
+			display: block;
+			font-size: 28rpx;
+			color: #999;
+		}
+	}
+
 	.activity-container {
 		padding: 20rpx;
 		background-color: #f5f5f5;

--
Gitblit v1.8.0