266 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Vue
		
	
	
		
		
			
		
	
	
			266 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Vue
		
	
	
|  | <template> | |||
|  | 	<view class="integral-mall"> | |||
|  | 
 | |||
|  | 		<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :up="upOption"> | |||
|  | 			<view class="header bg-primary flex row-between white"> | |||
|  | 				<router-link to="/bundle/pages/integral_sign/integral_sign"> | |||
|  | 					<view class="user-integral flex"> | |||
|  | 						<u-icon class="m-r-16" :name="require('@/bundle/static/icon_integral.png')" :size="44"></u-icon> | |||
|  | 						我的积分:<text class="xxl bold">{{ integral }}</text> | |||
|  | 					</view> | |||
|  | 				</router-link> | |||
|  | 				<router-link to="/bundle/pages/exchange_order/exchange_order"> | |||
|  | 					兑换订单 <u-icon name="arrow-right"></u-icon> | |||
|  | 				</router-link> | |||
|  | 			</view> | |||
|  | 			<view class="main"> | |||
|  | 				<view class="sort-bar flex bg-white"> | |||
|  | 					<view class="sort-bar-item flex-2 flex row-center" v-for="(item, index) in sortConfig" :key="index" | |||
|  | 						@tap="handleSort(item)"> | |||
|  | 						<text :class="item.value ? 'primary' : ''">{{ item.name }}</text> | |||
|  | 						<view class="arrow-icon flex-col col-center row-center" v-if="!item.setValue"> | |||
|  | 							<u-icon name="arrow-up-fill" | |||
|  | 								:color="item.value == 'asc' ? colorConfig.primary : colorConfig.normal"></u-icon> | |||
|  | 							<u-icon name="arrow-down-fill" | |||
|  | 								:color="item.value == 'desc' ? colorConfig.primary : colorConfig.normal"></u-icon> | |||
|  | 						</view> | |||
|  | 					</view> | |||
|  | 					<view class="flex-1 flex row-center" @tap="changeGoodsType"> | |||
|  | 						<image class="icon-sm" | |||
|  | 							:src="goodsType === 'one' ? '/static/images/icon_double.png' : '/static/images/icon_one.png'"> | |||
|  | 						</image> | |||
|  | 					</view> | |||
|  | 				</view> | |||
|  | 				<view class="goods-lists" :class="{ | |||
|  | 					'goods-lists--one': goodsType === 'one' | |||
|  | 				}"> | |||
|  | 					<view class="goods-item" v-for="(item, index) in goodsLists" :key="index"> | |||
|  | 						<router-link :to="`/bundle/pages/integral_goods_details/integral_goods_details?id=${item.id}`"> | |||
|  | 							<view class="goods-item-info"> | |||
|  | 								<view class="goods-image"> | |||
|  | 									<view class="image-wrap"> | |||
|  | 										<u-image :src="item.image" width="100%" height="100%"></u-image> | |||
|  | 									</view> | |||
|  | 								</view> | |||
|  | 								<view class="goods-info"> | |||
|  | 									<view class="goods-name line-2"> | |||
|  | 										{{ item.name }} | |||
|  | 									</view> | |||
|  | 									<view class="goods-price primary m-t-10"> | |||
|  | 										<price-format :color="colorConfig.primary" :show-subscript="false" | |||
|  | 											:first-size="36" :second-size="24" :price="item.need_integral" /> | |||
|  | 										<text class="xs">积分</text> | |||
|  | 										<block v-if="item.exchange_way === 2"> | |||
|  | 											<text>+</text> | |||
|  | 											<price-format :color="colorConfig.primary" :show-subscript="false" | |||
|  | 												:first-size="36" :second-size="24" :price="item.need_money" /> | |||
|  | 											<text class="xs">元</text> | |||
|  | 										</block> | |||
|  | 									</view> | |||
|  | 								</view> | |||
|  | 							</view> | |||
|  | 						</router-link> | |||
|  | 					</view> | |||
|  | 				</view> | |||
|  | 			</view> | |||
|  | 
 | |||
|  | 		</mescroll-body> | |||
|  | 	</view> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | 	import { | |||
|  | 		getIntegralGoods | |||
|  | 	} from '@/api/activity' | |||
|  | 	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins"; | |||
|  | 	import {trottle} from '@/utils/tools' | |||
|  | 	export default { | |||
|  | 		mixins: [MescrollMixin], | |||
|  | 		data() { | |||
|  | 			return { | |||
|  | 				sortConfig: [{ | |||
|  | 						name: '最新', | |||
|  | 						type: 'sort_by_new', | |||
|  | 						value: 'desc', | |||
|  | 						setValue: 'desc' | |||
|  | 					}, | |||
|  | 					{ | |||
|  | 						name: '积分', | |||
|  | 						type: 'sort_by_integral', | |||
|  | 						value: '' | |||
|  | 					}, | |||
|  | 					{ | |||
|  | 						name: '兑换量', | |||
|  | 						type: 'sort_by_sales', | |||
|  | 						value: '', | |||
|  | 						setValue: 'desc' | |||
|  | 					} | |||
|  | 				], | |||
|  | 				goodsType: 'double', | |||
|  | 				upOption: { | |||
|  | 					noMoreSize: 2, | |||
|  | 					auto: false, | |||
|  | 					empty: { | |||
|  | 						icon: '/static/images/goods_null.png', | |||
|  | 						tip: "暂无商品", | |||
|  | 					} | |||
|  | 				}, | |||
|  | 				goodsLists: [], | |||
|  | 				integral: '' | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		methods: { | |||
|  | 			changeGoodsType() { | |||
|  | 				this.goodsType = this.goodsType === 'one' ? 'double' : 'one' | |||
|  | 			}, | |||
|  | 			handleSort(current) { | |||
|  | 				this.sortConfig.forEach((item) => { | |||
|  | 					if(current.type != item.type) { | |||
|  | 						item.value = '' | |||
|  | 						return | |||
|  | 					} | |||
|  | 					if(item.setValue) { | |||
|  | 						item.value = item.setValue | |||
|  | 						return  | |||
|  | 					} | |||
|  | 					if(item.value == 'asc') { | |||
|  | 						item.value = 'desc' | |||
|  | 					}else{ | |||
|  | 						item.value ='asc' | |||
|  | 					} | |||
|  | 				}) | |||
|  | 				 | |||
|  | 			}, | |||
|  | 			upCallback(page) { | |||
|  | 				const pageNum = page.num; // 页码, 默认从1开始
 | |||
|  | 				const pageSize = page.size; // 页长, 默认每页10条
 | |||
|  | 				const sort = this.sortConfig.find((item) => item.value) || {} | |||
|  | 				getIntegralGoods({ | |||
|  | 					[sort.type]: sort.value, | |||
|  | 					page_no: pageNum, | |||
|  | 					page_size: pageSize | |||
|  | 				}).then(res => { | |||
|  | 					if (res.code == 1) { | |||
|  | 						const { | |||
|  | 							goods, | |||
|  | 							integral | |||
|  | 						} = res.data | |||
|  | 						this.integral = integral | |||
|  | 						let curPageData = goods.lists; | |||
|  | 						let curPageLen = curPageData.length; | |||
|  | 						let hasNext = !!goods.more; | |||
|  | 						if (pageNum == 1) this.goodsLists = []; | |||
|  | 						this.goodsLists = this.goodsLists.concat(curPageData); | |||
|  | 						this.mescroll.endSuccess(curPageLen, hasNext); | |||
|  | 					}else{ | |||
|  | 						this.mescroll.endErr(); | |||
|  | 					} | |||
|  | 				}).catch(() => { | |||
|  | 					this.mescroll.endErr(); | |||
|  | 				}) | |||
|  | 			}, | |||
|  | 		}, | |||
|  | 		watch: { | |||
|  | 			sortConfig: { | |||
|  | 				handler(val) { | |||
|  | 					this.goodsLists = [] | |||
|  | 					this.mescroll.resetUpScroll() | |||
|  | 				}, | |||
|  | 				deep: true | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		onLoad() { | |||
|  | 			this.handleSort = trottle(this.handleSort, 500, this); | |||
|  | 		} | |||
|  | 
 | |||
|  | 	} | |||
|  | </script> | |||
|  | 
 | |||
|  | <style lang="scss"> | |||
|  | 	page { | |||
|  | 		padding: 0; | |||
|  | 	} | |||
|  | 	$goods-margin: 8rpx; | |||
|  | 
 | |||
|  | 	.integral-mall { | |||
|  | 		.header { | |||
|  | 			padding: 22rpx 24rpx; | |||
|  | 		} | |||
|  | 
 | |||
|  | 		.main { | |||
|  | 			.sort-bar { | |||
|  | 				height: 80rpx; | |||
|  | 
 | |||
|  | 				.sort-bar-item { | |||
|  | 					height: 100%; | |||
|  | 				} | |||
|  | 
 | |||
|  | 				.arrow-icon { | |||
|  | 					transform: scale(0.4); | |||
|  | 				} | |||
|  | 			} | |||
|  | 
 | |||
|  | 			.goods-lists { | |||
|  | 				padding: 20rpx 20rpx 0; | |||
|  | 				margin: -$goods-margin; | |||
|  | 				display: flex; | |||
|  | 				flex-wrap: wrap; | |||
|  | 				.goods-item { | |||
|  | 
 | |||
|  | 					width: 50%; | |||
|  | 
 | |||
|  | 					.goods-item-info { | |||
|  | 						margin: $goods-margin; | |||
|  | 						border-radius: 14rpx; | |||
|  | 						background: #fff; | |||
|  | 						overflow: hidden; | |||
|  | 
 | |||
|  | 						.goods-image { | |||
|  | 							flex: none; | |||
|  | 							position: relative; | |||
|  | 							height: 0; | |||
|  | 							padding-top: 100%; | |||
|  | 
 | |||
|  | 							.image-wrap { | |||
|  | 								position: absolute; | |||
|  | 								top: 0; | |||
|  | 								left: 0; | |||
|  | 								right: 0; | |||
|  | 								bottom: 0; | |||
|  | 							} | |||
|  | 						} | |||
|  | 
 | |||
|  | 						.goods-info { | |||
|  | 							padding: 14rpx; | |||
|  | 
 | |||
|  | 							.goods-name { | |||
|  | 								line-height: 40rpx; | |||
|  | 								height: 80rpx; | |||
|  | 							} | |||
|  | 						} | |||
|  | 					} | |||
|  | 				} | |||
|  | 
 | |||
|  | 				&--one { | |||
|  | 					.goods-item { | |||
|  | 						width: 100%; | |||
|  | 
 | |||
|  | 						.goods-item-info { | |||
|  | 							display: flex; | |||
|  | 
 | |||
|  | 							.goods-image { | |||
|  | 								width: 200rpx; | |||
|  | 								padding-top: 200rpx; | |||
|  | 							} | |||
|  | 
 | |||
|  | 							.goods-info { | |||
|  | 								padding: 24rpx 20rpx; | |||
|  | 							} | |||
|  | 						} | |||
|  | 					} | |||
|  | 				} | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | </style> |