zhengjinyi 4 years ago
parent
commit
9ade8245cc
1 changed files with 414 additions and 0 deletions
  1. 414 0
      pages/goods/list.vue

+ 414 - 0
pages/goods/list.vue

@@ -0,0 +1,414 @@
+<template>
+	<view class="container all-type-list-wrapper">
+		<product-list ref="productList" @operationConfim="hanldOperationConfim"></product-list>
+		<!--底部选择模态层弹窗组件 -->
+		<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" @tap="hideSpec">
+			<!-- 遮罩层 -->
+			<view class="mask"></view>
+			<view class="layer" @tap.stop="discard" :style="{paddingBottom :isIphoneX ? '68rpx' : '36rpx',bottom:isIphoneX ?'-332rpx' : '-294rpx'}">
+				<view class="content">
+					<view class="layer-smimg">
+						<image :src="handleData.mainImage" mode=""></image>
+					</view>
+					<view class="layer-nunbox">
+						<view class="layer-nunbox-t">
+							<view class="layer-nunbox-text">数量:</view>
+							<view class="number-box">
+								<view  class="iconfont icon-jianhao" :class="[isQuantity==true?'disabled':'']" @click="changeCountSub()"></view>
+								<input class="btn-input" type="number" v-model="number" maxlength='4'  @blur="changeNumber($event)">
+								<view  class="iconfont icon-jiahao"  :class="[isStock==true?'disabled':'']" @click="changeCountAdd()"></view>
+							</view>
+						</view>
+						<view class="layer-nunbox-b">
+							<view class="text">单价:
+								<text class="p sm">¥</text>
+								<text class="p bg">{{buyRetailPrice.toFixed(2)}}</text>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="btn">
+					<view class="button buy" @click="toConfirmation">立即购买</view>
+					<view class="button add" @click="getAddProductCart">加入购物车</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import productList from '@/components/cm-module/listTemplate/productList'
+	export default{
+		components:{
+			productList
+		},
+		data(){
+			return{
+				userID: '',
+				serverUrl: '',
+				emptyText: '',
+				lastPageType: '',
+				lastPageVal: '',
+				isIphoneX:this.$store.state.isIphoneX,
+				specClass: '',//规格弹窗css类,控制开关动画
+				handleData:{},
+				isQuantity:false,
+				isStock:false,
+				minBuyNumber:0,
+				number:0,
+				buyRetailPrice:0,
+				buyRetailPriceStep:1,
+			}
+		},
+		onLoad() {
+
+		},
+		methods:{
+			hanldOperationConfim(data){//显示选择数量确认弹窗
+				this.specClass = 'show'
+				this.handleData = data
+				this.minBuyNumber = data.minBuyNumber
+				this.buyRetailPrice = data.retailPrice
+				this.buyRetailPriceStep = data.step
+				if(this.handleData.ladderPriceFlag == '1'){
+					this.number = data.maxBuyNumber
+				}else{
+					this.number = data.minBuyNumber
+				}
+			},
+			hideSpec() {//关闭选择数量确认弹窗
+				this.specClass = 'hide';
+				setTimeout(() => {
+					this.specClass = 'none';
+				}, 200);
+			},
+			changeCountAdd(){//popup弹窗数量增加按钮
+				if(this.buyRetailPriceStep == 2){
+					this.number += this.minBuyNumber
+				}else{
+					this.number++
+				}
+				this.calculatPerice()
+			},
+			changeCountSub(){//popup弹窗数量减按钮
+				if(this.number<=this.minBuyNumber){
+					this.number= this.minBuyNumber
+					this.isQuantity =true
+					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
+					return
+				}else{
+					if(this.buyRetailPriceStep == 2){
+						this.number-=this.minBuyNumber
+					}else{
+						this.number--
+					}
+					this.calculatPerice()
+					this.isQuantity =false
+				}
+			 },
+			changeNumber(e){
+				let _value = e.detail.value;
+				if(!this.$api.isNumber(_value)){
+					this.number = this.minBuyNumber
+				}else if(_value < this.minBuyNumber){	
+					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
+					this.number = this.minBuyNumber
+				}else if( _value % this.minBuyNumber !=0 ){
+					this.$util.msg(`购买量必须为起订量的整数倍`,2000);
+					this.number = this.minBuyNumber
+				}else{
+					this.number = e.detail.value
+					this.calculatPerice()
+				}
+			},
+			calculatPerice(){//判断是否为阶梯价然后做计算价格处理
+				if(this.handleData.ladderPriceFlag == '1'){
+					this.handleData.ladderPriceList.forEach((item,index)=>{
+						if(this.number>=item.buyNum){
+							this.buyRetailPrice = item.buyPrice
+						}
+					})
+				}
+			},
+			toConfirmation(){//跳转确认订单页面
+				this.specClass = 'hide';
+				let productStp ={
+						allPrice:this.number*this.buyRetailPrice,
+						allCount:this.number,
+						productID:this.handleData.productID,
+						productCount:this.number
+				}	
+				this.$api.navigateTo(`/pages/user/order/create-order?type=prodcut&data=${JSON.stringify({data:productStp})}`)
+				setTimeout(() => {
+					this.specClass = 'none';
+				}, 200);
+			},
+			getAddProductCart(){//增加购物车成功和toast弹窗提示成功
+				this.ProductService.shoppingAddCart({productID:this.handleData.productID,userID:this.userID,productCount:this.number}).then(response => {
+					this.specClass = 'hide';
+					this.$util.msg(response.msg,1500,true,'success')
+					setTimeout(() => {this.specClass = 'none'}, 200)
+					this.$refs.productList.cartQuantity = response.data
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			discard(){
+				//丢弃
+			}
+		},
+		onShow() {
+			let pages = getCurrentPages(),thisPage = pages[pages.length - 1];
+			this.$api.getStorage().then((resolve) =>{
+				this.userID = resolve.userID
+			})
+		},
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: $sub-bg-color;
+		.all-type-list-wrapper {
+			display: flex;
+			flex-direction: column;
+		}
+	}
+	/* 加入购物模态层*/
+	@keyframes showPopup {
+		0% {
+			opacity: 0;
+		}
+		100% {
+			opacity: 1;
+		}
+	}
+	@keyframes hidePopup {
+		0% {
+			opacity: 1;
+		}
+		100% {
+			opacity: 0;
+		}
+	}
+	@keyframes showLayer {
+		0% {
+			transform: translateY(0);
+		}
+		100% {
+			transform: translateY(-100%);
+		}
+	}
+	@keyframes hideLayer {
+		0% {
+			transform: translateY(-100%);
+		}
+		100% {
+			transform: translateY(0);
+		}
+	}
+	@keyframes showAmnation {
+		0% {
+			top: -12rpx;
+			opacity: 0;
+		}
+		50% {
+			top: -60rpx;
+			opacity: 1;
+		}
+		100% {
+			top: -100rpx;
+			opacity: 0;
+		}
+	}
+	@keyframes hideAmnation {
+		0% {
+			top: -100rpx;
+			opacity: 0;
+		}
+		100% {
+			top: -12rpx;
+			opacity: 0;
+		}
+	}
+	.popup {
+		position: fixed;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+		display: none;
+		.mask{
+			position: fixed;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 21;
+			background-color: rgba(0, 0, 0, 0.6);
+		}
+		.layer {
+			position: fixed;
+			z-index: 22;
+			bottom: -294rpx;
+			width: 702rpx;
+			padding: 24rpx 24rpx 36rpx 24rpx;
+			height: 236rpx;
+			border-radius: 20rpx 20rpx 0 0;
+			background-color: #fff;
+			display: flex;
+			flex-wrap: wrap;
+			align-content: space-between;
+			.content {
+				width: 100%;
+			}
+			.btn {
+				width: 100%;
+				height: 88rpx;
+				display: flex;
+				.button {
+					width: 340rpx;
+					height: 88rpx;
+					color: #fff;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					font-size: $font-size-28;
+					border-radius: 44rpx;
+					&.buy{
+						background: $btn-confirm;
+					}
+					&.add{
+						background: rgba(239, 175, 0, 1);
+						margin-left: 20rpx;
+					}
+				}
+			}
+		}
+		
+		&.show {
+			display: block;
+			.mask{
+				animation: showPopup 0.2s linear both;
+			}
+			.layer {
+				animation: showLayer 0.2s linear both;
+			}
+		}
+		&.hide {
+			display: block;
+			.mask{
+				animation: hidePopup 0.2s linear both;
+			}
+			
+			.layer {
+				animation: hideLayer 0.2s linear both;
+			}
+		}
+		&.none {
+			display: none;
+		}
+		&.service {
+			.row {
+				margin: 30upx 0;
+				.title {
+					font-size: 30upx;
+					margin: 10upx 0;
+				}
+				.description {
+					font-size: 28upx;
+					color: #999;
+				}
+			}
+		}
+		.layer-smimg{
+			width: 114rpx;
+			height: 114rpx;
+			float: left;
+			border-radius: 10rpx;
+			margin-right: 24rpx;
+			image{
+				width: 114rpx;
+				height: 114rpx;	
+				border-radius: 10rpx;
+			}
+		}
+		.layer-nunbox{
+			justify-content: space-between;
+			align-items: center;
+			width: 536rpx;
+			height: 88rpx;
+			padding: 13rpx 0 0 0;
+			float: left;
+			.layer-nunbox-t{
+				width: 100%;
+				height:44rpx;
+				position:relative;
+				display: flex;
+				.layer-nunbox-text{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+				}
+				.number-box{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					border: 2rpx solid #e1e1e1;
+					border-radius: 30rpx;
+					height: 48rpx;
+					.iconfont{
+						font-size: $font-size-24;
+						padding:0 18rpx;
+						color: #333333;
+						text-align: center;
+						line-height: 48rpx;
+						font-weight: bold;
+						background: #FFFFFF;
+						&.icon-jianhao{
+							border-radius: 30rpx 0 0 30rpx;
+						}
+						&.icon-jiahao{
+							border-radius: 0 30rpx 30rpx 0;
+						}
+					}
+					.btn-input{
+						width: 62rpx;
+						height: 44rpx;
+						line-height: 44rpx;
+						border-radius: 4rpx;
+						text-align: center;
+						font-size: $font-size-24;
+						border-bottom: 2rpx solid #e1e1e1;
+						border-top: 2rpx solid #e1e1e1;
+						color: #333333;
+						background-color: #f7f7f7;
+					}
+				}
+				.product-step{
+					position: absolute;
+					left: 45rpx;
+					bottom: 0;
+					height: 44rpx;
+					background: #FFFFFF;
+				}
+			}
+			.layer-nunbox-b{
+				width: 100%;
+				height:44rpx;
+				margin-top: 13rpx;
+			}
+			.text{
+				line-height: 44rpx;
+				font-size: $font-size-28;
+				.p{
+					color: #FF2A2A;
+				}
+				.p:first-child{
+					margin-left: 30rpx;
+				}
+				.p.sm{
+					font-size: $font-size-24;
+				}
+			}
+		}
+	}	
+</style>