You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
10 KiB
432 lines
10 KiB
4 months ago
|
<template>
|
||
|
<!-- 商品属性规格弹窗 -->
|
||
|
<view>
|
||
|
<view class="product-window">
|
||
|
<view class="textpic">
|
||
|
<image class="pictrue" :src="attr.productSelect.image"></image>
|
||
|
<view class="text">
|
||
|
<text class="name line1" v-if="attr.productSelect.store_name && attr.productSelect.store_name.length>=15">{{ type == 'setMeal'?title : attr.productSelect.store_name.slice(0,15)}}...</text>
|
||
|
<text class="name line1" v-else>{{type == 'setMeal'?title : attr.productSelect.store_name?attr.productSelect.store_name.slice(0,15):''}}</text>
|
||
|
<view class="money font-color">
|
||
|
<view class="top">
|
||
|
<text class="lable" v-if="type != 'points'">¥</text>
|
||
|
<text class="num">{{ attr.productSelect.price }}</text>
|
||
|
<text v-if="type == 'points'" class="num">积分</text>
|
||
|
<text class='vip-money' v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'member'">¥{{attr.productSelect.vip_price}}</text>
|
||
|
<image class="vipImg" v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'member'" src="@/static/images/vip.png" mode=""></image>
|
||
|
<view class="icon" v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'level'">
|
||
|
<image class="level" :src="imgHost + '/statics/images/level.png'"></image>
|
||
|
<text class="levelName">{{storeInfo.level_name}}</text>
|
||
|
</view>
|
||
|
</view>
|
||
|
<text class="stock" v-if='isShow'>库存: {{ attr.productSelect.stock }}</text>
|
||
|
<text class='stock' v-if="limitNum">{{type == 'seckill' ? '限量' : type == 'points'?'剩余':'库存'}}: {{attr.productSelect.quota}}</text>
|
||
|
<slot name="bottom" :attr="attr"></slot>
|
||
|
</view>
|
||
|
</view>
|
||
|
<image class="close" @click="closeAttr" :src="imgHost + '/statics/images/close.png'"></image>
|
||
|
</view>
|
||
|
<view class="rollTop">
|
||
|
<scroll-view :style="'width:100%; max-height: 600rpx; display: flex; flex-direction: column;'" :scroll-y="true">
|
||
|
<view class="productWinList">
|
||
|
<view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
|
||
|
<text class="title">{{ item.attr_name }}</text>
|
||
|
<view class="listn">
|
||
|
<text class="itemn" :class="item.index === itemn.attr ? 'on' : ''"
|
||
|
v-for="(itemn, indexn) in item.attr_value" @click="tapAttr(indexw, indexn)"
|
||
|
:key="indexn">
|
||
|
{{ itemn.attr }}
|
||
|
</text>
|
||
|
</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
<view class="cart" v-if="type != 'setMeal'">
|
||
|
<text class="title">数量</text>
|
||
|
<view class="carnum">
|
||
|
<text class="item reduce"
|
||
|
:class="attr.productSelect.cart_num <= 1 ? 'on' : ''" v-if="attr.productSelect.cart_num <= 1">
|
||
|
-
|
||
|
</text>
|
||
|
<text class="item reduce"
|
||
|
:class="attr.productSelect.cart_num <= 1 ? 'on' : ''" @click="CartNumDes" v-else>
|
||
|
-
|
||
|
</text>
|
||
|
<view class='item'>
|
||
|
<input class="num" type="number" v-model="attr.productSelect.cart_num"
|
||
|
data-name="productSelect.cart_num"
|
||
|
@input="bindCode(attr.productSelect.cart_num)"></input>
|
||
|
</view>
|
||
|
<text v-if="iSplus" class="item plus" :class="
|
||
|
attr.productSelect.cart_num >= attr.productSelect.stock
|
||
|
? 'on'
|
||
|
: ''
|
||
|
" @click="CartNumAdd">
|
||
|
+
|
||
|
</text>
|
||
|
<text v-else class='item plus'
|
||
|
:class='(attr.productSelect.cart_num >= attr.productSelect.quota) || (attr.productSelect.cart_num >= attr.productSelect.product_stock) || (attr.productSelect.cart_num >= attr.productSelect.num) || (type=="seckill" && attr.productSelect.cart_num >= attr.productSelect.once_num)? "on":""'
|
||
|
@click='CartNumAdd'>+</text>
|
||
|
</view>
|
||
|
</view>
|
||
|
</scroll-view>
|
||
|
</view>
|
||
|
<view class="bntCon">
|
||
|
<text class="joinBnt bg-color" v-if="iScart && attr.productSelect.stock>0" @click="goCat">确定</text>
|
||
|
<text class="joinBnt on" v-else-if="iScart && !attr.productSelect.stock">已售罄</text>
|
||
|
</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import { HTTP_REQUEST_URL } from '@/config/app';
|
||
|
export default {
|
||
|
props: {
|
||
|
cusPreviewImg: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
title: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
attr: {
|
||
|
type: Object,
|
||
|
default: () => {}
|
||
|
},
|
||
|
storeInfo: {
|
||
|
type: Object,
|
||
|
default: () => {}
|
||
|
},
|
||
|
limitNum: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
isShow: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
iSbnt: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
iSplus: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
iScart: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
is_vip: {
|
||
|
type: Number,
|
||
|
value: 0
|
||
|
},
|
||
|
type: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
imgHost: HTTP_REQUEST_URL,
|
||
|
};
|
||
|
},
|
||
|
mounted() {},
|
||
|
methods: {
|
||
|
goCat: function() {
|
||
|
this.$emit('goCat');
|
||
|
},
|
||
|
/**
|
||
|
* 购物车手动输入数量
|
||
|
*
|
||
|
*/
|
||
|
bindCode: function(e) {
|
||
|
this.$emit('iptCartNum', this.attr.productSelect.cart_num);
|
||
|
},
|
||
|
closeAttr: function() {
|
||
|
this.$emit('closeScrollview');
|
||
|
},
|
||
|
CartNumDes: function() {
|
||
|
this.$emit('ChangeCartNum', false);
|
||
|
},
|
||
|
CartNumAdd: function() {
|
||
|
this.$emit('ChangeCartNum', true);
|
||
|
},
|
||
|
tapAttr: function(indexw, indexn) {
|
||
|
let that = this;
|
||
|
that.$emit("attrVal", {
|
||
|
indexw: indexw,
|
||
|
indexn: indexn
|
||
|
});
|
||
|
this.$set(this.attr.productAttr[indexw], 'index', this.attr.productAttr[indexw].attr_values[indexn]);
|
||
|
let value = that
|
||
|
.getCheckedValue()
|
||
|
.join(",");
|
||
|
that.$emit("ChangeAttr", value);
|
||
|
|
||
|
},
|
||
|
//获取被选中属性;
|
||
|
getCheckedValue: function() {
|
||
|
let productAttr = this.attr.productAttr;
|
||
|
let value = [];
|
||
|
for (let i = 0; i < productAttr.length; i++) {
|
||
|
for (let j = 0; j < productAttr[i].attr_values.length; j++) {
|
||
|
if (productAttr[i].index === productAttr[i].attr_values[j]) {
|
||
|
value.push(productAttr[i].attr_values[j]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style scoped lang="scss">
|
||
|
.bg-color{
|
||
|
background-color: #e93323 !important;
|
||
|
}
|
||
|
.vip-money {
|
||
|
color: #282828;
|
||
|
font-size: 28rpx;
|
||
|
font-weight: 700;
|
||
|
margin-left: 6rpx;
|
||
|
}
|
||
|
|
||
|
.vipImg {
|
||
|
width: 56rpx;
|
||
|
height: 20rpx;
|
||
|
margin-left: 6rpx;
|
||
|
}
|
||
|
|
||
|
.bntCon{
|
||
|
flex-direction: row;
|
||
|
justify-content: center;
|
||
|
margin-bottom: 20rpx;
|
||
|
}
|
||
|
|
||
|
.rollTop{
|
||
|
margin-top: 30rpx;
|
||
|
}
|
||
|
|
||
|
.product-window.join {
|
||
|
padding-bottom: 30rpx;
|
||
|
}
|
||
|
|
||
|
.product-window.joinCart {
|
||
|
padding-bottom: 30rpx;
|
||
|
z-index: 10000;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic {
|
||
|
padding: 0 130rpx 0 30rpx;
|
||
|
margin-top: 29rpx;
|
||
|
position: relative;
|
||
|
display: flex;
|
||
|
flex-direction: row;
|
||
|
justify-content: space-between;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .pictrue {
|
||
|
width: 150rpx;
|
||
|
height: 150rpx;
|
||
|
border-radius: 10rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .text {
|
||
|
width: 410rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .text .name{
|
||
|
font-size: 32rpx;
|
||
|
color: #202020;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .text .money {
|
||
|
margin-top: 34rpx;
|
||
|
.top{
|
||
|
display: flex;
|
||
|
flex-direction: row;
|
||
|
align-items: center;
|
||
|
.lable{
|
||
|
color: #e93323;
|
||
|
font-size: 24rpx;
|
||
|
}
|
||
|
}
|
||
|
.icon{
|
||
|
display: flex;
|
||
|
background: #FF9500;
|
||
|
border-radius: 18rpx;
|
||
|
flex-direction: row;
|
||
|
justify-content: center;
|
||
|
align-items: center;
|
||
|
margin-left: 10rpx;
|
||
|
padding: 2rpx 5rpx;
|
||
|
.levelName{
|
||
|
font-size: 16rpx;
|
||
|
font-weight: normal;
|
||
|
color: #fff;
|
||
|
}
|
||
|
.level{
|
||
|
width: 25rpx;
|
||
|
height: 25rpx;
|
||
|
margin-left: 4rpx;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .text .money .num {
|
||
|
font-size: 36rpx;
|
||
|
color: #e93323;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .text .money .stock {
|
||
|
color: #999;
|
||
|
margin-left: 6rpx;
|
||
|
font-size: 28rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .textpic .close{
|
||
|
position: absolute;
|
||
|
right: 30rpx;
|
||
|
width: 30rpx;
|
||
|
height: 30rpx;
|
||
|
}
|
||
|
|
||
|
.item{
|
||
|
background-color: transparent;
|
||
|
}
|
||
|
|
||
|
.product-window .productWinList .item~.item {
|
||
|
margin-top: 36rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .productWinList .item .title {
|
||
|
font-size: 30rpx;
|
||
|
color: #999;
|
||
|
padding: 0 30rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .productWinList .item .listn {
|
||
|
padding: 0 30rpx 0 16rpx;
|
||
|
flex-direction: row;
|
||
|
align-items: center;
|
||
|
flex-wrap: wrap;
|
||
|
}
|
||
|
|
||
|
.product-window .productWinList .item .listn .itemn {
|
||
|
border: 1px solid #F2F2F2;
|
||
|
font-size: 26rpx;
|
||
|
color: #282828;
|
||
|
padding: 7rpx 33rpx;
|
||
|
border-radius: 25rpx;
|
||
|
margin: 20rpx 0 0 14rpx;
|
||
|
background-color: #F2F2F2;
|
||
|
}
|
||
|
|
||
|
.product-window .productWinList .item .listn .itemn.on {
|
||
|
color: #e93323;
|
||
|
background: rgba(233, 51, 35, 0.1);
|
||
|
border-color: #e93323;
|
||
|
}
|
||
|
|
||
|
.product-window .productWinList .item .listn .itemn.limit {
|
||
|
color: #999;
|
||
|
text-decoration: line-through;
|
||
|
}
|
||
|
|
||
|
.product-window .cart {
|
||
|
margin-top: 36rpx;
|
||
|
padding: 0 30rpx;
|
||
|
flex-direction: row;
|
||
|
justify-content: space-between;
|
||
|
align-items: center;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .title {
|
||
|
font-size: 30rpx;
|
||
|
color: #999;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum {
|
||
|
height: 54rpx;
|
||
|
margin-top: 24rpx;
|
||
|
flex-direction: row;
|
||
|
justify-content: flex-start;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .iconfont {
|
||
|
font-size: 25rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .item {
|
||
|
width: 84rpx;
|
||
|
text-align: center;
|
||
|
height: 100%;
|
||
|
line-height: 54rpx;
|
||
|
color: #282828;
|
||
|
font-size: 45rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .reduce {
|
||
|
border-right: 0;
|
||
|
border-radius: 6rpx 0 0 6rpx;
|
||
|
line-height: 48rpx;
|
||
|
font-size: 60rpx;
|
||
|
flex-direction: row;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
margin-right: 10rpx;
|
||
|
background-color: transparent;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .reduce.on {
|
||
|
color: #DEDEDE;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .plus {
|
||
|
border-left: 0;
|
||
|
border-radius: 0 6rpx 6rpx 0;
|
||
|
line-height: 46rpx;
|
||
|
flex-direction: row;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
font-size: 50rpx;
|
||
|
margin-left: 10rpx;
|
||
|
background-color: transparent;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .plus.on {
|
||
|
color: #dedede;
|
||
|
}
|
||
|
|
||
|
.product-window .cart .carnum .num {
|
||
|
background: rgba(242, 242, 242, 1);
|
||
|
color: #282828;
|
||
|
font-size: 28rpx;
|
||
|
flex-direction: row;
|
||
|
align-items: center;
|
||
|
width: 84rpx;
|
||
|
height: 54rpx;
|
||
|
text-align: center;
|
||
|
line-height: 54rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .joinBnt {
|
||
|
font-size: 30rpx;
|
||
|
width: 620rpx;
|
||
|
height: 86rpx;
|
||
|
border-radius: 50rpx;
|
||
|
text-align: center;
|
||
|
line-height: 86rpx;
|
||
|
color: #fff;
|
||
|
margin-top: 21rpx;
|
||
|
}
|
||
|
|
||
|
.product-window .joinBnt.on {
|
||
|
background-color: #bbb;
|
||
|
color: #fff;
|
||
|
}
|
||
|
</style>
|