220 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Vue
		
	
	
		
		
			
		
	
	
			220 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Vue
		
	
	
|  | <template> | ||
|  | 	<mescroll-body ref="mescrollRef" @init="mescrollInit" :up="upOption" @down="downCallback" @up="upCallback"> | ||
|  | 		<view class="goods-seckill"> | ||
|  | 			<view class="banner"> | ||
|  | 				<ad-swipers :pid="20" height="340rpx"></ad-swipers> | ||
|  | 			</view> | ||
|  | 			<view class="time-list"> | ||
|  | 				<scroll-view style="height: 120rpx; white-space: nowrap;" :scroll-into-view="'item-' + (active - 2)" | ||
|  | 					scroll-x="true" scroll-with-animation="true"> | ||
|  | 					<view v-for="(item, index) in seckillTime" :key="index" :id="'item-' + index" | ||
|  | 						class="time-item flex-col row-center col-center" :class="{active: index == active}" | ||
|  | 						@tap="exchangeTime(index)"> | ||
|  | 						<view :class="'xl bold time'">{{ item.start_time }}</view> | ||
|  | 						<view :class="'sm br60 state ' + ( item.status === 2 ? 'muted': '' )"> | ||
|  | 							{{ item.tips }} | ||
|  | 						</view> | ||
|  | 					</view> | ||
|  | 				</scroll-view> | ||
|  | 			</view> | ||
|  | 			<view class="goods-list"> | ||
|  | 				<router-link v-for="(item, index) in seckillGoods" :key="index" | ||
|  | 					:to="{path: '/pages/goods_details/goods_details', query: {id: item.goods_id}}"> | ||
|  | 					<view class="goods-item flex bg-white"> | ||
|  | 						<u-image width="180rpx" height="180rpx" border-radius="10rpx" :src="item.goods_image" /> | ||
|  | 						<view class="goods-info m-l-20"> | ||
|  | 							<view style="width: 490rpx" class="goods-name line-2 m-b-10">{{item.goods_name}}</view> | ||
|  | 							<label class="sale-info xs primary br60"> | ||
|  | 								已抢{{item.seckill_total}}件 | ||
|  | 							</label> | ||
|  | 							<view class="info-footer flex row-between m-t-5"> | ||
|  | 								<view class="price"> | ||
|  | 									<price-format class="m-r-10" :price="item.seckill_price" | ||
|  | 										:color="colorConfig.primary" :first-ize="34" :second-ize="26" | ||
|  | 										:subscript-ize="26" /> | ||
|  | 									<price-format class="line-through" :price="item.goods_min_price" | ||
|  | 										:color="colorConfig.muted" :first-ize="24" :second-ize="24" | ||
|  | 										:subscript-ize="24" /> | ||
|  | 								</view> | ||
|  | 								<button :class="'br60 white ' + (currentStatus == 2? ' bg-gray' : currentStatus == 1 | ||
|  | 									? 'primary-btn' : 'border-btn' )" size="sm"> | ||
|  | 									{{currentStatus == 2? '已结束': currentStatus == 1 ? '立即抢购' : '未开始'}}</button> | ||
|  | 							</view> | ||
|  | 						</view> | ||
|  | 					</view> | ||
|  | 				</router-link> | ||
|  | 			</view> | ||
|  | 		</view> | ||
|  | 	</mescroll-body> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | 	import { | ||
|  | 		getSeckillTime, | ||
|  | 		getSeckillGoods | ||
|  | 	} from "@/api/activity"; | ||
|  | 	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins"; | ||
|  | 	export default { | ||
|  | 		mixins: [MescrollMixin], | ||
|  | 		data() { | ||
|  | 			return { | ||
|  | 				active: 0, | ||
|  | 				upOption: { | ||
|  | 					auto: false, | ||
|  | 					empty: { | ||
|  | 						use: true, | ||
|  | 						icon: '/static/images/goods_null.png', | ||
|  | 						tip: "暂无秒杀商品~", | ||
|  | 					}, | ||
|  | 				}, | ||
|  | 				seckillTime: [], | ||
|  | 				seckillGoods: [] | ||
|  | 
 | ||
|  | 			}; | ||
|  | 		}, | ||
|  | 		methods: { | ||
|  | 			async downCallback(page) { | ||
|  | 				this.seckillGoods = [] | ||
|  | 				await this.getSeckillTimeFun() | ||
|  | 				this.mescroll.resetUpScroll(); | ||
|  | 			}, | ||
|  | 			upCallback(page) { | ||
|  | 				let pageNum = page.num; | ||
|  | 				let pageSize = page.size; | ||
|  | 				const {seckillTime, active} = this | ||
|  | 				if(!seckillTime.length) return this.mescroll.endSuccess(0,false) | ||
|  | 				let id =  seckillTime[active].id | ||
|  | 				getSeckillGoods({ | ||
|  | 					page_no: pageNum, | ||
|  | 					page_size: pageSize, | ||
|  | 					seckill_id:id | ||
|  | 				}).then(res => { | ||
|  | 					let curPageData = res.data.lists; | ||
|  | 					let hasNext = !!res.data.more; | ||
|  | 					let curPageLen = curPageData.length; | ||
|  | 					if (pageNum == 1) this.seckillGoods = []; | ||
|  | 					this.seckillGoods = this.seckillGoods.concat(curPageData); | ||
|  | 					this.mescroll.endSuccess(curPageLen, hasNext); | ||
|  | 				}).catch(() => { | ||
|  | 					this.mescroll.endErr() | ||
|  | 				}) | ||
|  | 			}, | ||
|  | 			// 获取秒杀时间段
 | ||
|  | 			getSeckillTimeFun() { | ||
|  | 				return new Promise((resolve) => { | ||
|  | 					getSeckillTime().then(({code, data}) => { | ||
|  | 						if (code == 1) { | ||
|  | 							// 抢购中
 | ||
|  | 							let index = data.findIndex(item => item.status == 1); | ||
|  | 							if (index == -1) { | ||
|  | 								// 未开始
 | ||
|  | 								index = data.findIndex(item => item.status == 0); | ||
|  | 							} | ||
|  | 							if(index == -1) { | ||
|  | 								// 全部结束选中最后一个
 | ||
|  | 								index = data.length - 1 | ||
|  | 							} | ||
|  | 							this.seckillTime = data; | ||
|  | 							this.$nextTick(function(){ | ||
|  | 								this.active = index | ||
|  | 								resolve() | ||
|  | 							}) | ||
|  | 						} | ||
|  | 					}) | ||
|  | 				}) | ||
|  | 				 | ||
|  | 			}, | ||
|  | 
 | ||
|  | 
 | ||
|  | 			// 查看其他时间段
 | ||
|  | 			exchangeTime(index) { | ||
|  | 				this.active = index | ||
|  | 				this.seckillGoods = [] | ||
|  | 				this.mescroll.resetUpScroll(); | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		computed: { | ||
|  | 			currentStatus() { | ||
|  | 				const {active, seckillTime} = this | ||
|  | 				return seckillTime[active] && seckillTime[active].status | ||
|  | 			} | ||
|  | 		} | ||
|  | 	}; | ||
|  | </script> | ||
|  | <style lang="scss"> | ||
|  | 	.bg-gray { | ||
|  | 		background-color: #CCCCCC !important; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.goods-seckill { | ||
|  | 
 | ||
|  | 		.time-list { | ||
|  | 			.time-item { | ||
|  | 				display: inline-flex; | ||
|  | 				width: 160rpx; | ||
|  | 				height: 100%; | ||
|  | 
 | ||
|  | 				&.active { | ||
|  | 					.time { | ||
|  | 						color: $-color-primary; | ||
|  | 					} | ||
|  | 
 | ||
|  | 					.state { | ||
|  | 						color: $-color-white; | ||
|  | 						background-color: $-color-primary; | ||
|  | 					} | ||
|  | 				} | ||
|  | 
 | ||
|  | 				.state { | ||
|  | 					padding: 0 10rpx; | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		.endtime-box { | ||
|  | 			height: 100rpx; | ||
|  | 
 | ||
|  | 			.line { | ||
|  | 				width: 100rpx; | ||
|  | 				height: 2rpx; | ||
|  | 				background-color: #CCC; | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		.goods-list { | ||
|  | 			.goods-item { | ||
|  | 				padding: 30rpx; | ||
|  | 
 | ||
|  | 				.goods-info { | ||
|  | 					flex: 1; | ||
|  | 					width: 470rpx; | ||
|  | 
 | ||
|  | 					.sale-info { | ||
|  | 						padding: 4rpx 16rpx; | ||
|  | 						background-color: #FFE9EB; | ||
|  | 					} | ||
|  | 
 | ||
|  | 					.info-footer { | ||
|  | 						.btn { | ||
|  | 							padding: 0 30rpx; | ||
|  | 						} | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.primary-btn { | ||
|  | 		padding: 0 30rpx; | ||
|  | 		background: linear-gradient(270deg, | ||
|  | 				rgba(255, 44, 60, 1) 0%, | ||
|  | 				rgba(249, 95, 47, 1) 100%); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.border-btn { | ||
|  | 		padding: 0 30rpx; | ||
|  | 		border: 1px solid $-color-primary; | ||
|  | 		color: $-color-primary; | ||
|  | 	} | ||
|  | </style> |