From be80b22a4a0fcd33e1b17ebdb86eba91cc7de4d2 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期三, 02 七月 2025 18:59:06 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 pages/commodity-square/commoditySquare.vue |  474 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 236 insertions(+), 238 deletions(-)

diff --git a/pages/commodity-square/commoditySquare.vue b/pages/commodity-square/commoditySquare.vue
index d7c7fad..7bbfbd0 100644
--- a/pages/commodity-square/commoditySquare.vue
+++ b/pages/commodity-square/commoditySquare.vue
@@ -1,85 +1,97 @@
 <template>
-	<view class="container">
-		<input type="text" v-show="false" v-model="flushDom" />
+	<view class="container" :style="{paddingTop:buttonHeight+'px'}">
+		<input type="text" value="flushDom" v-if="false" />
+		<top-bar selectedTitleIndex="shop" textColor="black" @changeTab="topBarChange" class="topBar"></top-bar>
 		<view class="search">
-			<u-search class="nav-search" @blur='searchGoods' placeholder="鎼滅储鍟嗗搧" :show-action="false"></u-search>
+			<u-search class="nav-search" @blur='searchGoods' v-model="searchInfo" placeholder="鎼滅储鍟嗗搧"
+				:show-action="false"></u-search>
 		</view>
-		<view class="commoditySquare">
-			<view class="left" style="width: 310rpx;">
-				<view class="commoditySquareItem" v-for="(item,index) in goodsList1"
-					@click="goToGoodsInfo('goodsList1',item.id)">
-					<!-- <video :src="item.goodsVideo" v-if="item.goodsVideo " v-show="item.show" :initial-time="0"
-						:controls="false" object-fit="contain" :show-play-btn="false" :show-center-play-btn="false"
-						@loadedmetadata="getvideoInfo($event,'goodsList1',index)" :ref="'video'+item.id"
-						:style="{width:item.width,height:item.height}"></video> -->
-					<image :src="item.thumbnail" 
-						mode="aspectFill" class="goodsImg">
-					</image>
-					<view class="goodsInfo">
-						<view class="goodsName">{{item.goodsName}}</view>
-						<view class="priceInfo">
-							<view class="goodsPrice">锟{item.price}}</view>
-							<view class="">宸插敭: {{item.buyCount}}</view>
-						</view>
-					</view>
-				</view>
-			</view>
-			<view class="right" style="width: 310rpx;">
-				<view class="commoditySquareItem" v-for="(item,index) in goodsList2"
-					@click="goToGoodsInfo('goodsList2',item.id)">
-<!-- 					<video :src="item.goodsVideo" v-if="item.goodsVideo " v-show="item.show" :initial-time="0"
-						:controls="false" object-fit="contain" :show-play-btn="false" :show-center-play-btn="false"
-						@loadedmetadata="getvideoInfo($event,'goodsList2',index)" :ref="'video'+item.id"
-						:style="{width:item.width,height:item.height}"></video> -->
-					<image :src="item.thumbnail" 
-						mode="aspectFill" class="goodsImg">
-					</image>
-					<view class="goodsInfo">
-						<view class="goodsName">{{item.goodsName}}</view>
-						<view class="priceInfo">
-							<view class="goodsPrice">锟{item.price}}</view>
-							<view class="">宸插敭: {{item.buyCount}}</view>
-						</view>
-					</view>
-				</view>
-			</view>
-
-
-			<view class="openShowLeft" @click="showDrawer('showLeft')" v-if="!showLeft">
-				<uni-icons type="right" size="30"></uni-icons>
-			</view>
-			<uni-drawer ref="showLeft" mode="left" width="120" height="94vh" @change="change($event,'showLeft')"
-				:cus-style="true" class="navigationLeft">
-				<scroll-view class="typeNavigation" :scroll-y="true" show-scrollbar="false">
+		<view style="display: flex;padding: 32rpx;box-sizing: border-box;height: 100%;">
+			<view class="navigatorMenue">
+				<scroll-view class="typeNavigation" :scroll-y="true" :show-scrollbar="false">
 					<view class="typeNavigationItem" :class="{typeNavigationItemCheck:currentCategort ==item.id}"
 						@click="chooseCategory(item.id)" v-for="item in categoryList" :key="item.id">
 						{{item.name}}
 					</view>
 				</scroll-view>
-			</uni-drawer>
+
+			</view>
+			<view class="goodsInfos">
+				<scroll-view :scroll-y="true" :show-scrollbar="false">
+
+					<view class="goodsItem" v-for="item in goodsList" :key="item.id"
+						@click.prevent="goToGoodsInfo(item.id)"
+						style="display: flex;align-items: flex-start;justify-content: flex-start;margin: 10rpx 0;
+						box-sizing: border-box; ">
+						<view class="pic" style="position: relative;">
+							<image :src="item.thumbnail" mode="aspectFill"
+								style="height: 150rpx;width: 150rpx;border-radius: 24rpx;">
+							</image>
+							<text style="background-color: #f92e20;color: #fff;
+								font-weight: bold;border-radius: 12rpx;padding: 5rpx;
+								margin-right: 15rpx;position: absolute;top: 0;left: 0;" v-if="item.salesModel==='PRESALE'">棰勫敭</text>
+						</view>
+						<view class="goodsContent" style="display: flex;align-items: flex-start;justify-content: space-between;
+							margin-left: 10rpx;flex-direction: column;width: 100%;">
+							<view class="goodsName">
+								<text>{{item.goodsName}}</text>
+							</view>
+				
+							<view
+								style="display: flex; justify-content: space-between;align-items:center; 100%;margin-top: 32rpx;width: 100%;">
+								<view class="goodsPrice">锟{item.price}}</view>
+								<view class="addCard" style="display: flex; align-items: center;">
+									<view style="padding: 20rpx 0 20rpx 20rpx;" v-show="item.cardNum && item.cardNum>0"
+										@click.stop="miousCardNum($event,item.id)">
+										<uni-icons type="minus" size="30" color="#96a6bc"></uni-icons>
+									</view>
+									<input v-show="item.cardNum&&item.cardNum>0" @click.stop="" :maxlength="2" type="number"
+										confirm-type="numeric" style="width: 50rpx;text-align: center;"
+										v-model="item.cardNum" :disabled="true" />
+									<view style="padding: 20rpx 20rpx 20rpx 0;"
+										@click.stop="addCardNum($event,item.id)">
+										<uni-icons type="plus" size="30" color="#e06c75"></uni-icons>
+										<!-- <text class="iconfont" style="size: 1.5em;">&#xe7b1;</text> -->
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+			</view>
 		</view>
-		<view style="display: flex;align-items: center;justify-content: center;margin-top: 20rpx;" v-if="canLoadMore">
-			娌℃湁鏇村鏁版嵁浜�.................</view>
-		<custom-tabbar bgColor="#ffffff" selected="shop"></custom-tabbar>
+
 	</view>
 </template>
 
 <script>
+	import TopBar from "@/components/TopBar.vue";
 	import {
 		getCategoryList,
 		getGoodsList
 	} from "@/api/goods.js";
 	import {
+		addCard,
+		getCarts,
+		deleteSkuItem
+	} from '@/api/trade.js'
+	import {
 		getSTSToken
 	} from '@/api/common.js'
+	import {
+		data
+	} from "../../components/uview-components/uview-ui/libs/mixin/mixin";
 	export default {
+		components: {
+			TopBar
+		},
 		data() {
 			return {
+				searchInfo: '',
+				//鍟嗗搧鍒楄〃
+				goodsList: [],
+				buttonHeight: 0,
 				//璁板綍涓ゅ垪楂樺害
-				listHeight1: 0,
-				listHeight2: 0,
-				//鏄惁鏄剧ず鎵撳紑宸︿晶寮圭獥
-				showLeft: false,
 				//鍟嗗搧瀵艰埅鍒嗙被
 				categoryList: [],
 				//褰撳墠閫変腑鐨勫垎绫�
@@ -96,22 +108,95 @@
 					pageSize: 12,
 					pageNumber: 1,
 					categoryId: null,
-					canFilter:true
+					canFilter: true,
+					needFilterPre:true
 				},
-				//鍟嗗搧鍙屽垪鏄剧ず
-				goodsList1: [],
-				goodsList2: [],
 			}
 		},
 		methods: {
+			addCardNum(e, id) {
+				this.goodsList.forEach(item => {
+					if (item.id === id) {
+						if (item.cardNum) {
+							item.cardNum++;
+						} else {
+							item.cardNum = 1;
+						}
+						this.flushDom = new Date().getMilliseconds();
+						console.log("閫変腑鐨勫晢鍝佷负------------------->", JSON.stringify(item))
+						const data = {
+							skuId: item.id,
+							num: item.cardNum
+						}
+						addCard(data)
+						return;
+					}
+				})
+
+			},
+			miousCardNum(e, id) {
+				for (let i = 0; i < this.goodsList.length; i++) {
+					const item = this.goodsList[i];
+					if (item.id === id) {
+						if (item.cardNum && item.cardNum > 1) {
+							item.cardNum--;
+						} else {
+							deleteSkuItem([id]);
+							item.cardNum = 0;
+							this.flushDom = new Date().getMilliseconds();
+							break; // 閫�鍑烘暣涓惊鐜�
+						}
+						this.flushDom = new Date().getMilliseconds();
+						const data = {
+							skuId: item.id,
+							num: item.cardNum
+						};
+						addCard(data);
+						break; // 閫�鍑烘暣涓惊鐜�
+					}
+				}
+				// this.goodsList.forEach(item => {
+				// 	console.log('娴嬭瘯涓轰粈涔堜笉杩涘叆寰幆1',id,JSON.stringify(item.cardNum))
+				// 	if (item.id === id) {
+				// 		console.log('娴嬭瘯涓轰粈涔堜笉杩涘叆寰幆2',id,JSON.stringify(item.cardNum))
+				// 		if (item.cardNum && item.cardNum > 1) {
+				// 			console.log('娴嬭瘯涓轰粈涔堜笉杩涘叆寰幆3',id,JSON.stringify(item.cardNum))
+				// 			item.cardNum--;
+				// 		} else {
+				// 			console.log('娴嬭瘯涓轰粈涔堜笉杩涘叆寰幆4',id,JSON.stringify(item.cardNum))
+				// 			deleteSkuItem([id])
+				// 			item.cardNum = 0;
+				// 			this.flushDom = new Date().getMilliseconds();
+				// 			return;
+				// 		}
+				// 		this.flushDom = new Date().getMilliseconds();
+				// 		console.log("閫変腑鐨勫晢鍝佷负------------------->", JSON.stringify(item))
+				// 		console.log(item.cardNum, item.id)
+				// 		const data = {
+				// 			skuId: item.id,
+				// 			num: item.cardNum
+				// 		}
+				// 		addCard(data)
+				// 		return;
+				// 	}
+				// })
+
+			},
+			topBarChange(titleObj) {
+				if (titleObj.index === 'home') {
+					uni.switchTab({
+						url: titleObj.pagePath
+					});
+				} else {
+					uni.redirectTo({
+						url: titleObj.pagePath
+					});
+				}
+			},
 			async searchGoods(keyWard) {
 				this.getGoodsParam.keyword = keyWard
 				this.getGoodsParam.pageNumber = 1
 				this.getGoodsParam.categoryId = ''
-				this.goodsList1 = []
-				this.goodsList2 = []
-				this.listHeight1 = 0;
-				this.listHeight2 = 0;
 				await this.getgoodsData();
 			},
 			confirm() {},
@@ -153,94 +238,86 @@
 				console.log(this[arrName][index].width, this[arrName][index].height)
 				this.flushDom = new Date();
 			},
-			goToGoodsInfo(arrName, id) {
-				const item = this[arrName].find(item => id === item.id);
+			goToGoodsInfo(id) {
+				const item = this.goodsList.find(item => id === item.id);
 				uni.navigateTo({
 					url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`
 				});
 			},
+			//瑙﹀簳鑾峰彇鏁版嵁
+			async loadMoreData() {
+				if (this.getGoodsParam.pageNumber < this.maxPages) {
+					this.getGoodsParam.pageNumber++;
+					await this.getgoodsData()
+				} else {
+					this.canLoadMore = true;
+				}
+
+			},
 			//鑾峰彇鍒嗙被瀵艰埅鏍�
 			async loadCategoryList() {
 				let list = await getCategoryList(0);
+				list.data.result.unshift({
+					id: 'ALL',
+					name: '鍏ㄩ儴'
+				})
 				this.categoryList = list.data.result
 			},
 			async getgoodsData() {
-				const goodsList = await getGoodsList(this.getGoodsParam);
-				// const sts = await getSTSToken();
-				// const stsUrl = sts.data.data.endpoint
-				// // 澶勭悊鏁版嵁
-				// goodsList.data.result.records.forEach(item => {
-				// 	if (item.thumbnail !== '' && item.thumbnail !== null && item.thumbnail.indexOf('http') ===
-				// 		-1) {
-				// 		item.thumbnail = stsUrl + '/' + item.thumbnail
-				// 	}
-				// 	if (item.goodsVideo !== '' && item.goodsVideo !== null && item.goodsVideo.indexOf(
-				// 			'http') === -1) {
-				// 		item.goodsVideo = stsUrl + '/' + item.goodsVideo
-				// 	}
-				// })
-				//璁$畻涓や釜鏁扮粍鐨勯暱搴� 鐢ㄤ簬瑙e喅鐎戝竷娴佷袱杈归珮搴︿笉涓�鑷撮棶棰�
-				//骞冲垎缁欎袱涓暟缁�
-				const goodsSize = goodsList.data.result.records.length;
-				let middle = Math.ceil(goodsSize / 2);
-				//鍒ゆ柇閭d釜闆嗗悎闀垮害楂� 閲嶆柊鍒嗛厤闆嗗悎鏁版嵁
-				const diffHeight = this.listHeight1 - this.listHeight2;
-				//list1闀垮害澶т簬list2
-				if (diffHeight > 0) {
-					const needCount = Math.floor(diffHeight / 300)
-					if (needCount > 6) {
-						middle = 0;
-					} else {
-						middle -= needCount;
-					}
-				} else if(diffHeight < 0) {
-					const needCount = Math.abs(Math.floor(diffHeight / 300))
-					if (needCount > 6) {
-						middle += 6
-					} else {
-						middle = needCount;
-					}
-				}
-				this.goodsList1 = [...this.goodsList1, ...goodsList.data.result.records.slice(0, middle)];
-				this.goodsList2 = [...this.goodsList2, ...goodsList.data.result.records.slice(middle)];
-				this.maxPages = goodsList.data.result.pages
+				const cardInfos = await getCarts();
+				// 澶勭悊璐墿杞︿俊鎭�
+				let cardMap = new Map();
+				cardInfos.data.result.cartList.forEach(item => {
 
-				// if(this.listHeight1===0||this.listHeight2===0)}
-				this.listHeight1 += middle * 300;
-				this.listHeight2 += (goodsSize - middle) * 300
+					item.skuList.forEach(sku => {
+						cardMap.set(sku.goodsSku.id, {
+							skuId: sku.goodsSku.id,
+							num: sku.num
+						})
+					})
+
+				})
+				//鍥炴樉璐墿杞︽暟鎹�
+				const goodsList = await getGoodsList(this.getGoodsParam);
+				goodsList.data.result.records.forEach(item => {
+					const cardItem = cardMap.get(item.id);
+					if (cardItem) {
+						item.cardNum = cardItem.num;
+					}
+				})
+				this.goodsList = goodsList.data.result.records;
+				console.log('this.goodsList----------------------->',JSON.stringify(this.goodsList))
+
 			},
 			async chooseCategory(id) {
+				this.searchInfo = '';
 				this.canLoadMore = false;
 				this.currentCategort = id
 				this.getGoodsParam.categoryId = id
 				this.getGoodsParam.keyword = ''
 				this.getGoodsParam.pageNumber = 1
-				this.goodsList1 = [];
-				this.goodsList2 = [];
-				this.listHeight1 = 0;
-				this.listHeight2 = 0;
+				this.goodsList = []
+				if (id === 'ALL') {
+					this.getGoodsParam.categoryId = '';
+				} else {
+					this.getGoodsParam.categoryId = id
+				}
 				await this.getgoodsData();
 				console.log(this.maxPages)
 			}
 		},
-		onShow() {
-			this.showDrawer('showLeft')
-		},
+
 		async onLoad() {
+			// 鑾峰彇鐘舵�佹爮楂樺害
+			const systemInfo = uni.getSystemInfoSync();
+
+			this.buttonHeight = systemInfo.statusBarHeight + 40;
+			console.log('-------------------------------->', JSON.stringify(systemInfo))
 			await this.loadCategoryList();
 			this.getGoodsParam.pageNumber = 1
 			this.getGoodsParam.categoryId = ""
 			this.getGoodsParam.keyword = ""
 			await this.getgoodsData()
-		},
-		async onReachBottom() {
-			if (this.getGoodsParam.pageNumber < this.maxPages) {
-				this.getGoodsParam.pageNumber++;
-				await this.getgoodsData()
-			} else {
-				this.canLoadMore = true;
-			}
-
 		}
 	}
 </script>
@@ -249,97 +326,37 @@
 	.container {
 		width: 750rpx;
 		padding-bottom: 64rpx;
-	}
+		height: 100vh;
+		overflow: hidden;
 
-	.commoditySquare {
-		width: 750rpx;
-		position: relative;
-		box-sizing: border-box;
-		display: flex;
-		justify-content: space-around;
-	}
-
-	.left {
-		box-sizing: border-box;
-	}
-
-	.right {
-		box-sizing: border-box;
-	}
-
-	.goodsImg {
-		width: 300rpx;
-		height: 300rpx;
-		padding-bottom: 10rpx;
-	}
-
-	.commoditySquareItem {
-		// border: 1rpx solid #b6dbba;
-		border-radius: 12rpx;
-		box-sizing: border-box;
-		padding: 0 32rpx;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-	}
-
-	.commoditySquareItem:nth-child(n+1) {
-		margin-top: 32rpx;
-	}
-
-	.openShowLeft {
-		position: fixed;
-		top: 120rpx;
-		left: 0;
-		align-items: center;
-		justify-content: flex-start;
-		background-color: #b6b6b6;
-		opacity: 0.8;
-		z-index: 999;
-		height: 70rpx;
-		width: 50rpx;
-		border-radius: 0 50% 50% 0;
-	}
-
-	.navigationLeft {
-		position: relative;
-		background-color: #fcfcfc;
-		// opacity: 0.5;
-		box-sizing: border-box;
 	}
 
 
-	.scroll-view {
-		/* #ifndef APP-NVUE */
-		width: 100%;
+	.navigatorMenue {
+		margin-left: -32rpx;
+		background-color: #f4f4f4;
 		height: 100%;
-		/* #endif */
-		flex: 1
+		width: 200rpx;
+		border-radius: 0 24rpx 24rpx 0;
 	}
 
-	// .priceInfo {
-	// 	margin-top: 10rpx;
-	// 	display: flex;
-	// 	justify-content: space-around;
-	// }
-
-	// 澶勭悊鎶藉眽鍐呭婊氬姩
-	.scroll-view-box {
-		flex: 1;
-		position: absolute;
-		top: 0;
-		right: 0;
-		bottom: 0;
-		left: 0;
+	.goodsInfos {
+		width: 500rpx;
+		margin-left: 10rpx;
 	}
 
+	.topBar {
+		position: fixed;
+		top: 20rpx;
+		left: 20rpx;
+		z-index: 1000;
+		background-color: #ffffff;
+	}
 
 	.typeNavigation {
 		box-sizing: border-box;
 		padding: 10rpx;
 		height: 100%;
-		// position: relative;
 	}
 
 	.typeNavigationItem {
@@ -347,49 +364,30 @@
 		font-size: 28rpx;
 		color: black;
 		margin-top: 10rpx;
-		border-radius: 12rpx;
-		border: 1rpx solid gray;
 	}
 
 	.typeNavigationItemCheck {
-		background-color: #42b993;
-		color: #fff;
+		color: #ef321e;
+		font-size: 32rpx;
+		font-weight: bold;
 		border: 0;
 	}
 
-	.closeShowLeft {
-		position: absolute;
-		top: 20rpx;
-		right: 0;
+	.goodsName {
+		padding: 10rpx;
+		box-sizing: border-box;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 1;
+		height: 52rpx;
+		font-weight: bold;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		text-align: start;
+		vertical-align: middle;
 	}
 
-	.nav-search {
-		padding-left: 30rpx !important;
-		padding-right: 20rpx !important;
-		// position: fixed;
-		// top: 0;
-		// width: 500rpx;
-		// z-index: 9999;
-	}
-	.goodsInfo{
-		margin-top: 10rpx;
-		box-sizing: border-box;
-		width: 100%;
-		display: flex;
-		flex-direction: column;
-	}
-	.goodsName{
-		display: flex;
-		align-items: center;
-		justify-content: center;
-	}
-	.priceInfo{
-		margin-top: 10rpx;
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-	}
-	.goodsPrice{
+	.goodsPrice {
 		color: red;
 		font-weight: bold;
 	}

--
Gitblit v1.8.0