Browse Source

商品0库存时没有提示,选择立即购买报错

zyh
Gao xiaosong 4 years ago
parent
commit
bd1c576620
  1. 367
      pages/shop/GoodsCon/index.vue

367
pages/shop/GoodsCon/index.vue

@ -2,18 +2,33 @@
<view :class="productConClass">
<view v-if="storeInfo.id">
<!-- 轮播图 -->
<product-con-swiper :img-urls="storeInfo.sliderImageArr"></product-con-swiper>
<product-con-swiper
:img-urls="storeInfo.sliderImageArr"
></product-con-swiper>
<!-- 商品信息描述 -->
<view class="wrapper">
<view class="share acea-row row-between row-bottom">
<view class="money font-color-red">
<text></text>
<text class="num">{{ attr.productSelect.price || storeInfo.price }}</text>
<text class="vip-money" v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0">{{ attr.productSelect.vipPrice || storeInfo.vipPrice }}</text>
<image src="@/static/images/vip.png" class="image" v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0" />
<text class="num">{{
attr.productSelect.price || storeInfo.price
}}</text>
<text
class="vip-money"
v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0"
>{{ attr.productSelect.vipPrice || storeInfo.vipPrice }}</text
>
<image
src="@/static/images/vip.png"
class="image"
v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0"
/>
</view>
<view class="iconfont icon-fenxiang" @click="listenerActionSheet"></view>
<view
class="iconfont icon-fenxiang"
@click="listenerActionSheet"
></view>
</view>
<view class="introduce">{{ storeInfo.storeName }}</view>
<view class="label acea-row row-between-wrapper">
@ -21,11 +36,19 @@
<text>库存:{{ storeInfo.stock }}{{ storeInfo.unitName }}</text>
<text>销量:{{ storeInfo.sales }}{{ storeInfo.unitName }}</text>
</view>
<view class="coupon acea-row row-between-wrapper" @click="couponTap" v-if="couponList.length">
<view
class="coupon acea-row row-between-wrapper"
@click="couponTap"
v-if="couponList.length"
>
<text class="hide line1">
<text>优惠券</text>
<text class="activity" v-for="(item, couponListEq) in couponList"
:key="couponListEq">{{ item.useMinPrice }}{{ item.couponPrice }}</text>
<text
class="activity"
v-for="(item, couponListEq) in couponList"
:key="couponListEq"
>{{ item.useMinPrice }}{{ item.couponPrice }}</text
>
</text>
<view class="iconfont icon-jiantou"></view>
</view>
@ -40,7 +63,10 @@
</div>
<!-- 规格 -->
<view class="attribute acea-row row-between-wrapper" @click="selecAttrTap">
<view
class="attribute acea-row row-between-wrapper"
@click="selecAttrTap"
>
<view>
<text>{{ attrTxt }}</text>
<text class="atterTxt">{{ attrValue }}</text>
@ -64,14 +90,22 @@
</view>
<view class="text">
<view class="name line1">{{ systemStore.name }}</view>
<view class="address acea-row row-middle" @click="showChang(systemStore)">
<text class="addressTxt">{{systemStore.address}}</text>
<view
class="address acea-row row-middle"
@click="showChang(systemStore)"
>
<text class="addressTxt">{{ systemStore.address }}</text>
<text class="iconfont icon-youjian"></text>
</view>
</view>
<view class="addressBox">
<a class="iconfont icon-dadianhua01 font-color-red phone" @click="telPhone(systemStore.phone)"></a>
<view class="addressTxt corlor-yshop">距离{{systemStore.distance}}千米</view>
<a
class="iconfont icon-dadianhua01 font-color-red phone"
@click="telPhone(systemStore.phone)"
></a>
<view class="addressTxt corlor-yshop"
>距离{{ systemStore.distance }}千米</view
>
</view>
</view>
</view>
@ -122,20 +156,20 @@
<view class="conter" v-html="storeInfo.description"></view>
</view>
<view style="height:100rpx;"></view>
<view style="height: 100rpx"></view>
<!-- 操作栏 -->
<view class="footer acea-row row-between-wrapper">
<!-- #ifdef MP-WEIXIN -->
<view class="item">
<button open-type="contact" class='contacButton'>
<view style="padding-bottom: 8rpx;" class="item">
<button open-type="contact" class="contacButton">
<view style="padding-bottom: 8rpx" class="item">
<view class="iconfont icon-kefu"></view>
<text>客服</text>
</view>
</button>
</view>
<!-- #endif -->
<view class="item" @click="goHome" >
<view class="item" @click="goHome">
<view class="iconfont icon-shouye-xianxing"></view>
<text>首页</text>
</view>
@ -147,15 +181,23 @@
<view class="iconfont icon-shoucang"></view>
<text>收藏</text>
</view>
<view @click="goShoppingCart()" v-if="animated" class="item animated bounceIn">
<view
@click="goShoppingCart()"
v-if="animated"
class="item animated bounceIn"
>
<view class="iconfont icon-gouwuche1">
<text class="num bg-color-red" v-if="CartCount > 0">{{CartCount}}</text>
<text class="num bg-color-red" v-if="CartCount > 0">{{
CartCount
}}</text>
</view>
<text>购物车</text>
</view>
<view @click="goShoppingCart()" class="item animated" v-if="!animated">
<view class="iconfont icon-gouwuche1">
<text class="num bg-color-red" v-if="CartCount > 0">{{CartCount}}</text>
<text class="num bg-color-red" v-if="CartCount > 0">{{
CartCount
}}</text>
</view>
<text>购物车</text>
</view>
@ -172,12 +214,23 @@
<!-- 优惠券 -->
<CouponPop v-on:changeFun="changeFun" :coupon="coupon"></CouponPop>
<!-- 商品规格弹窗 -->
<ProductWindow v-on:changeFun="changeFun" :attr="attr" :cartNum="cart_num"></ProductWindow>
<ProductWindow
v-on:changeFun="changeFun"
:attr="attr"
:cartNum="cart_num"
></ProductWindow>
<!-- 分享海报 -->
<StorePoster v-on:setPosterImageStatus="setPosterImageStatus" :posterImageStatus="posterImageStatus"
:posterData="posterData" :goodId="id"></StorePoster>
<StorePoster
v-on:setPosterImageStatus="setPosterImageStatus"
:posterImageStatus="posterImageStatus"
:posterData="posterData"
:goodId="id"
></StorePoster>
<!-- 分享弹窗 -->
<ShareInfo v-on:setShareInfoStatus="setShareInfoStatus" :shareInfoStatus="shareInfoStatus"></ShareInfo>
<ShareInfo
v-on:setShareInfoStatus="setShareInfoStatus"
:shareInfoStatus="shareInfoStatus"
></ShareInfo>
<view class="generate-posters acea-row row-middle on" v-if="posters">
<view class="item" @click="setPosterImageStatus">
@ -191,7 +244,12 @@
<view>生成海报</view>
</view>
</view>
<view class="mask" @touchmove.prevent @click="listenerActionClose" v-show="posters"></view>
<view
class="mask"
@touchmove.prevent
@click="listenerActionClose"
v-show="posters"
></view>
<view class="posterCanvasWarp">
<canvas class="posterCanvas" canvas-id="myCanvas"></canvas>
</view>
@ -200,45 +258,39 @@
</template>
<script>
// import { swiper, swiperSlide } from "vue-awesome-swiper";
// import { swiper, swiperSlide } from "vue-awesome-swiper";
import ProductConSwiper from "@/components/ProductConSwiper";
import UserEvaluation from "@/components/UserEvaluation";
import CouponPop from "@/components/CouponPop";
import ProductWindow from "@/components/ProductWindow";
import StorePoster from "@/components/StorePoster";
import ShareInfo from "@/components/ShareInfo";
import {
import ProductConSwiper from "@/components/ProductConSwiper";
import UserEvaluation from "@/components/UserEvaluation";
import CouponPop from "@/components/CouponPop";
import ProductWindow from "@/components/ProductWindow";
import StorePoster from "@/components/StorePoster";
import ShareInfo from "@/components/ShareInfo";
import {
getProductDetail,
postCartAdd,
getCartCount,
getProductCode,
} from "@/api/store";
import {
} from "@/api/store";
import {
getCoupon,
getCollectAdd,
getCollectDel,
getUserInfo,
} from "@/api/user";
import cookie from "@/utils/store/cookie";
import {
} from "@/api/user";
import cookie from "@/utils/store/cookie";
import {
isWeixin,
PosterCanvas,
handleQrCode,
handleUrlParam,
getCurrentPageUrlWithArgs
} from "@/utils";
import {
wechatEvevt
} from "@/libs/wechat";
import {
imageBase64
} from "@/api/public";
import {
mapGetters
} from "vuex";
getCurrentPageUrlWithArgs,
} from "@/utils";
import { wechatEvevt } from "@/libs/wechat";
import { imageBase64 } from "@/api/public";
import { mapGetters } from "vuex";
export default {
export default {
name: "GoodsCon",
components: {
// swiper,
@ -311,7 +363,7 @@
this.$store.commit("get_to", "goodcon");
let url = handleQrCode();
if (!url) {
url = handleUrlParam(getCurrentPageUrlWithArgs())
url = handleUrlParam(getCurrentPageUrlWithArgs());
}
this.coupons();
if (url && url.id) {
@ -341,20 +393,24 @@
return {
title: this.storeInfo.storeName,
imageUrl: this.storeInfo.image,
path: "pages/shop/GoodsCon/index?id=" + this.storeInfo.id + "&spread=" + uni.getStorageSync("uid") +
path:
"pages/shop/GoodsCon/index?id=" +
this.storeInfo.id +
"&spread=" +
uni.getStorageSync("uid") +
"&pageType=good&codeType=routine",
success(res) {
uni.showToast({
title: '分享成功'
})
title: "分享成功",
});
},
fail(res) {
uni.showToast({
title: '分享失败',
icon: 'none'
})
}
}
title: "分享失败",
icon: "none",
});
},
};
},
goHome() {
this.$yrouter.switchTab("/pages/home/index");
@ -385,7 +441,7 @@
phoneNumber: phoneNumber,
fail() {
console.log("取消拨打");
}
},
});
},
showChang: function (data) {
@ -421,7 +477,7 @@
}
uni.showLoading({
title: "加载中",
mask: true
mask: true,
});
getProductDetail(that.id, from)
.then((res) => {
@ -467,7 +523,8 @@
})
.catch((err) => {
uni.showToast({
title: err.msg || err.response.data.msg || err.response.data.message,
title:
err.msg || err.response.data.msg || err.response.data.message,
icon: "none",
duration: 2000,
});
@ -594,7 +651,6 @@
limit: 20,
};
getCoupon(q).then((res) => {
that.$set(that, "couponList", res.data || []);
that.$set(that.coupon, "list", res.data);
});
@ -615,7 +671,7 @@
//
let productSelect = this.productValue[res.value];
console.log(productSelect)
console.log(productSelect);
if (productSelect) {
this.attr.productAttr[res.indexw].index = res.indexn;
this.$set(this.attr.productSelect, "image", productSelect.image);
@ -687,14 +743,25 @@
productId: that.id,
cartNum: that.attr.productSelect.cart_num,
new: news,
uniqueId: that.attr.productSelect !== undefined ?
that.attr.productSelect.unique : "",
uniqueId:
that.attr.productSelect !== undefined
? that.attr.productSelect.unique
: "",
};
postCartAdd(q)
.then(function (res) {
that.isOpen = false;
that.attr.cartAttr = false;
if (news) {
if (!res.data) {
uni.showToast({
title:
res.msg || res.data.msg || res.data.message,
icon: "none",
duration: 2000,
});
return;
}
that.$yrouter.push({
path: "/pages/order/OrderSubmission/index",
query: {
@ -761,9 +828,9 @@
if (this.isLogin) {
getUserInfo().then((res) => {
href =
href.indexOf("?") === -1 ?
href + "?spread=" + res.data.uid :
href + "&spread=" + res.data.uid;
href.indexOf("?") === -1
? href + "?spread=" + res.data.uid
: href + "&spread=" + res.data.uid;
var configAppMessage = {
desc: data.storeInfo,
title: data.storeName,
@ -774,11 +841,8 @@
["updateAppMessageShareData", "updateTimelineShareData"],
configAppMessage
)
.then((res) => {
})
.then((res) => {})
.catch((res) => {
if (res.is_ready) {
res.wx.updateAppMessageShareData(configAppMessage);
res.wx.updateTimelineShareData(configAppMessage);
@ -796,11 +860,8 @@
["updateAppMessageShareData", "updateTimelineShareData"],
configAppMessage
)
.then((res) => {
})
.then((res) => {})
.catch((res) => {
if (res.is_ready) {
res.wx.updateAppMessageShareData(configAppMessage);
res.wx.updateTimelineShareData(configAppMessage);
@ -810,116 +871,116 @@
}
},
},
};
};
</script>
<style scoped lang="less">
.geoPage {
.geoPage {
position: fixed;
width: 100%;
height: 100%;
top: 0;
z-index: 10000;
}
}
.product-con .store-info {
.product-con .store-info {
margin-top: 0.2 * 100rpx;
background-color: #fff;
}
}
.product-con .store-info .title {
.product-con .store-info .title {
padding: 0 0.3 * 100rpx;
font-size: 0.28 * 100rpx;
color: #282828;
height: 0.8 * 100rpx;
line-height: 0.8 * 100rpx;
border-bottom: 0.01 * 100rpx solid #f5f5f5;
}
}
.product-con .store-info .info {
.product-con .store-info .info {
padding: 0 0.3 * 100rpx;
height: 1.26 * 100rpx;
}
}
.product-con .store-info .info .picTxt {
.product-con .store-info .info .picTxt {
width: 100%;
display: flex;
align-items: center;
}
}
.product-con .store-info .info .picTxt .pictrue {
.product-con .store-info .info .picTxt .pictrue {
width: 0.76 * 100rpx;
height: 0.76 * 100rpx;
margin-right: 0.2 * 100rpx;
}
}
.product-con .store-info .info .picTxt .pictrue image {
.product-con .store-info .info .picTxt .pictrue image {
width: 100%;
height: 100%;
border-radius: 0.06 * 100rpx;
}
}
.product-con .store-info .info .picTxt .text {
.product-con .store-info .info .picTxt .text {
flex: 1;
}
}
.product-con .store-info .info .picTxt .text .name {
.product-con .store-info .info .picTxt .text .name {
font-size: 0.3 * 100rpx;
color: #282828;
}
}
.product-con .store-info .info .picTxt .text .address {
.product-con .store-info .info .picTxt .text .address {
font-size: 0.24 * 100rpx;
color: #666;
margin-top: 0.03 * 100rpx;
}
}
.product-con .store-info .info .picTxt .text .address .iconfont {
.product-con .store-info .info .picTxt .text .address .iconfont {
color: #707070;
font-size: 0.18 * 100rpx;
margin-left: 0.1 * 100rpx;
}
}
.product-con .store-info .info .picTxt .addressBox {
.product-con .store-info .info .picTxt .addressBox {
display: flex;
flex-direction: column;
align-items: flex-end;
}
}
.product-con .store-info .info .picTxt .addressBox .iconfont {
.product-con .store-info .info .picTxt .addressBox .iconfont {
font-size: 0.4 * 100rpx;
}
}
.product-con .store-info .info .picTxt .addressBox .addressTxt {
.product-con .store-info .info .picTxt .addressBox .addressTxt {
font-size: 0.24 * 100rpx;
color: #eb3729;
}
}
.product-con .store-info .praise {
.product-con .store-info .praise {
font-size: 0.28 * 100rpx;
color: #808080;
}
}
.product-con .store-info .praise .iconfont {
.product-con .store-info .praise .iconfont {
font-size: 0.28 * 100rpx;
}
}
.product-con .superior {
.product-con .superior {
background-color: #fff;
margin-top: 0.2 * 100rpx;
}
}
.product-con .superior .title {
.product-con .superior .title {
height: 0.98 * 100rpx;
}
}
.product-con .superior .title image {
.product-con .superior .title image {
width: 0.3 * 100rpx;
height: 0.3 * 100rpx;
}
}
.product-con .superior .title .titleTxt {
.product-con .superior .title .titleTxt {
margin: 0 0.2 * 100rpx;
font-size: 0.3 * 100rpx;
background-image: linear-gradient(to right, #f57a37 0%, #f21b07 100%);
@ -927,67 +988,65 @@
background-image: -moz-linear-gradient(to right, #f57a37 0%, #f21b07 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.product-con .superior .slider-banner {
.product-con .superior .slider-banner {
width: 6.9 * 100rpx;
margin: 0 auto;
padding-bottom: 0.2 * 100rpx;
}
}
.product-con .superior .slider-banner .list {
.product-con .superior .slider-banner .list {
width: 100%;
padding-bottom: 0.2 * 100rpx;
}
}
.product-con .superior .slider-banner .list .item {
.product-con .superior .slider-banner .list .item {
width: 2.15 * 100rpx;
margin: 0 0.22 * 100rpx 0.3 * 100rpx 0;
font-size: 0.26 * 100rpx;
}
}
.product-con .superior .slider-banner .list .item:nth-of-type(3n) {
.product-con .superior .slider-banner .list .item:nth-of-type(3n) {
margin-right: 0;
}
}
.product-con .superior .slider-banner .list .item .pictrue {
.product-con .superior .slider-banner .list .item .pictrue {
width: 100%;
height: 2.15 * 100rpx;
}
}
.product-con .superior .slider-banner .list .item .pictrue image {
.product-con .superior .slider-banner .list .item .pictrue image {
width: 100%;
height: 100%;
border-radius: 0.06 * 100rpx;
}
}
.product-con .superior .slider-banner .list .item .name {
.product-con .superior .slider-banner .list .item .name {
color: #282828;
margin-top: 0.12 * 100rpx;
}
}
.product-con .superior .slider-banner .swiper-pagination-bullet {
.product-con .superior .slider-banner .swiper-pagination-bullet {
background-color: #999;
}
}
.product-con .superior .slider-banner .swiper-pagination-bullet-active {
.product-con .superior .slider-banner .swiper-pagination-bullet-active {
background-color: #e93323;
}
}
.mask {
.mask {
-webkit-filter: blur(2px);
-moz-filter: blur(2px);
-ms-filter: blur(2px);
filter: blur(2px);
}
}
.product-con .product-intro .conter view {
.product-con .product-intro .conter view {
width: 100% !important;
}
}
.generate-posters {
.generate-posters {
width: 100%;
height: 1.7 * 100rpx;
background-color: #fff;
@ -1004,34 +1063,34 @@
-webkit-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
-moz-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
-o-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
}
}
.generate-posters.on {
.generate-posters.on {
transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
}
}
.generate-posters .item {
.generate-posters .item {
flex: 50%;
-webkit-flex: 50%;
-ms-flex: 50%;
text-align: center;
}
}
.generate-posters .item .iconfont {
.generate-posters .item .iconfont {
font-size: 0.8 * 100rpx;
color: #5eae72;
}
}
.generate-posters .item .iconfont.icon-haibao {
.generate-posters .item .iconfont.icon-haibao {
color: #5391f1;
}
}
.noscroll {
.noscroll {
height: 100%;
overflow: hidden;
}
}
</style>

Loading…
Cancel
Save