1252 lines
34 KiB
Vue
1252 lines
34 KiB
Vue
<template>
|
||
<view class="main" v-if="isDone">
|
||
<view class="header flex flex-align-center bg-w"
|
||
:style="{ 'padding-top': statusBarHeight + wxBtnHeight + 'px' }">
|
||
<text class="iconfont icon" @tap="$navigateBack()"></text>
|
||
<v-tabs :tabs="tabs" v-show="!isFruit" lineHeight="6rpx" activeColor="#FA5151" lineColor="#FA5151"
|
||
:bold="false" :scroll="false" fontSize="30rpx" v-model="current" @change="tabsChange"></v-tabs>
|
||
<v-tabs :tabs="fruittabs" v-show="isFruit" lineHeight="6rpx" activeColor="#FA5151" lineColor="#FA5151"
|
||
:bold="false" :scroll="false" fontSize="30rpx" v-model="current" @change="tabsChange"></v-tabs>
|
||
<view class="iconfont icon" @click="showActive"></view>
|
||
</view>
|
||
<!-- 商品详情 -->
|
||
<block v-if="(isFruit && current == 0) || !isFruit">
|
||
<swiper class="swiper" :style="{ 'marginTop': statusBarHeight + 50 + 'px' }" :indicator-dots="true"
|
||
:autoplay="true">
|
||
<swiper-item v-for="(item, i) in swiperList" :key="i">
|
||
<image :src="item" mode="" class="img" @click="swiperViewPhotos(i)"></image>
|
||
</swiper-item>
|
||
</swiper>
|
||
<view class="price flex flex-between" v-if="goodsInfo.goodsType === 2">
|
||
<text class="price-text" style="color: aliceblue;">
|
||
<text class="text-xs">¥</text> {{ rangePrice }}
|
||
<!-- <text class="text-del color-b9 font26 del">¥{{goodsInfo.originalPrice}}</text> -->
|
||
</text>
|
||
<view class="flex flex-column flex-align-end">
|
||
<view class="flex flex-align-center" style="margin-bottom: 6rpx;">
|
||
<image :src="staticUrl + 'home/boutique.png'" mode="" class="icon"></image>
|
||
<text class="font38 blod " style="color: aliceblue;">精 品 推 荐</text>
|
||
</view>
|
||
<view class="flex flex-align-center color-w">
|
||
<text class="iconfont font34"></text>
|
||
<text class="font26">该商品支持配送上门</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view class="price flex flex-between" v-if="goodsInfo.goodsType === 12">
|
||
<text class="price-text" style="color: aliceblue;">
|
||
<text class="text-xs">¥</text> {{ rangePrice }}
|
||
</text>
|
||
<view class="flex flex-column flex-align-end font24 color-w">
|
||
<view class="flex flex-column align-center" v-if="time">
|
||
<text>距结束还剩</text>
|
||
<text class="text-cen">{{ time }}</text>
|
||
</view>
|
||
<text v-else>秒杀已结束</text>
|
||
</view>
|
||
</view>
|
||
<view class="new flex flex-between" v-else>
|
||
<text class="price-text" v-if="qvyu != 3">
|
||
<text class="text-xs">¥</text> {{ rangePrice }}
|
||
<!-- <text class="text-del color-b9 font26" style="margin-left: 10rpx;">¥{{goodsInfo.originalPrice}}</text> -->
|
||
</text>
|
||
<text class="blod color-red font40" v-else>
|
||
绿色积分:{{ greenText }} + ¥{{ rmbText }}
|
||
<!-- <text class="text-del color-b9 font26" style="margin-left: 10rpx;">¥{{goodsInfo.originalPrice}}</text> -->
|
||
</text>
|
||
</view>
|
||
<!-- 普通商品才可以使用优惠券 -->
|
||
<view class="flex flex-between d-list"
|
||
v-if="goodsInfo.goodsType == 1 && goodsInfo.discountList && goodsInfo.discountList.length > 0 && false"
|
||
@click="collectCoupons(goodsInfo.discountList)">
|
||
<view class="flex flex-align-center">
|
||
<block v-for="(d, i) in goodsInfo.discountList" :key="i">
|
||
<text class="d-item" v-if="i < 3">满{{ d.useStandardAmount }}减{{ d.discountAmount }}</text>
|
||
</block>
|
||
</view>
|
||
<view class="flex flex-align-center color-red">
|
||
<text class="font28">领券</text>
|
||
<text class="iconfont font34" style="margin-top: 4rpx;"></text>
|
||
</view>
|
||
</view>
|
||
<view class="wrap">
|
||
<view class="name flex flex-align-center flex-between">
|
||
<text class="line line-2">
|
||
<text class="bg-base tips" v-if="goodsInfo.goodsType === 2">精品</text>
|
||
<text class="bg-base tips" v-else-if="goodsInfo.goodsType === 11">新人大礼</text>
|
||
<text class="bg-base tips" v-else-if="goodsInfo.goodsType === 12">秒杀</text>
|
||
<text class="bg-base tips" v-else-if="goodsInfo.goodsType === 13">特价</text>
|
||
<text class="bg-base tips" v-else-if="goodsInfo.goodsType === 14">拼团</text>
|
||
<text class="bg-base tips" v-else-if="goodsInfo.goodsType === 15">积分</text>
|
||
<text class="bg-base tips" v-else-if="goodsInfo.isNewProducts === 2">新品</text>
|
||
{{ goodsInfo.titleName }}
|
||
|
||
</text>
|
||
<view class="bg" v-if="goodsInfo.xfz">
|
||
比例 {{ goodsInfo.ratio }}
|
||
</view>
|
||
<!-- <text class="line line-2" :class="{'txt':goodsInfo.goodsType === 2||goodsInfo.isNewProducts === 2}">{{goodsInfo.titleName}}</text> -->
|
||
</view>
|
||
<!-- <view class="font28 color-b9 line">{{goodsInfo.subTitle}}</view> -->
|
||
<view class="flex flex-between color-b9 font28 other">
|
||
<!-- <text>积分:{{ (parseInt((goodsInfo.bonusIntegral/100*goodsInfo.wholesalePrice)*100)/100).toFixed(2) }}</text> -->
|
||
<view class="bg" v-if="goodsInfo.xfz">
|
||
比例 {{ goodsInfo.xfz }}
|
||
</view>
|
||
<!-- <text>积分:{{ goodsInfo.bonusIntegral }}%</text> -->
|
||
<text>已售:{{ goodsInfo.totalSales }}</text>
|
||
<!-- <text v-if="dkUserFlag">附近的配送员:{{ dkUserSize }}</text> -->
|
||
<text>浏览:{{ goodsInfo.visitBrowse }}</text>
|
||
</view>
|
||
<view class="bg-w servies flex flex-align-center font28 color-b9">
|
||
<text>服务说明:</text>
|
||
<view class="flex flex-align-center">
|
||
<text v-if="goodsInfo.deliveryPlatform == 1"><text class="b red">送</text>配送上门</text>
|
||
<text v-if="goodsInfo.deliveryBusiness == 1"><text class="b blue">商</text>商家送货</text>
|
||
<text v-if="goodsInfo.deliveryExpress == 1"><text class="b green">寄</text>快递邮寄</text>
|
||
<text v-if="goodsInfo.deliveryNo == 1"><text class="b green">无</text>无实物,支付成功后自动确认收货</text>
|
||
<!-- <text><text class="b blue">正</text>正品保证</text>
|
||
<text v-if="goodsInfo.deliveryNo === 2 || goodsInfo.deliveryBusiness == 1 || goodsInfo.deliveryPlatform === 1">
|
||
<text class="b green">送</text>配送上门
|
||
</text> -->
|
||
</view>
|
||
</view>
|
||
<view class="reward" v-if="goodsInfo.goodsRewardLevelRule">
|
||
<text>大礼详情:</text>
|
||
<view class="reward-wrap">
|
||
<view class="reward-wrap-cell" v-if="goodsInfo.goodsRewardLevelRule.cardsByPlatform">
|
||
<text class="iconfont iconchoiceO icon"></text>
|
||
<text>{{ goodsInfo.goodsRewardLevelRule.cardsByPlatform.name }}¥{{
|
||
goodsInfo.goodsRewardLevelRule.cardsByPlatform.amount }}</text>
|
||
</view>
|
||
<view class="reward-wrap-cell">
|
||
<text class="iconfont iconchoiceO icon"></text>
|
||
<text>升级为{{ goodsInfo.goodsRewardLevelRule.roleManagerLevel | filterManager }}掌柜</text>
|
||
</view>
|
||
<view class="reward-wrap-cell">
|
||
<text class="iconfont iconchoiceO icon"></text>
|
||
<text>购买当前商品时自身必须为{{ goodsInfo.goodsRewardLevelRule.limitRoleManagerLevel | filterManager }}掌柜级别</text>
|
||
</view>
|
||
<view class="reward-wrap-cell">
|
||
<text class="iconfont iconchoiceO icon"></text>
|
||
<text v-if="goodsInfo.goodsRewardLevelRule.repeatBuyNumber === -1">不限制购买数量</text>
|
||
<text v-else>人均限购{{ goodsInfo.goodsRewardLevelRule.repeatBuyNumber }}件</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view class="group" v-if="goodsInfo.goodsType === 14 && groupList.length > 0">
|
||
<view class="title" @click="showSpellPopup()">
|
||
<text class="font28">正在拼单,可直接参与</text>
|
||
<text class="color-b9 font26">查看全部</text>
|
||
</view>
|
||
<block v-for="(item, i) in groupList" :key="i">
|
||
<view class="flex flex-between group-item" v-if="item.groupTrueNumber > 0">
|
||
<image :src="item.groupUserInfo.headPortrait" mode="" class="img"></image>
|
||
<text class="line font28 flex-grow"
|
||
style="width: 200rpx;">{{ item.groupUserInfo.nickname }}</text>
|
||
<text class="font26 color-b6" style="margin-left: 10rpx;">还差{{ item.groupNumber -
|
||
item.groupTrueNumber }}人拼成</text>
|
||
<button type="primary" size="mini" class="bg-base btn"
|
||
@click="addCartOrBuy(1, item)">去拼单</button>
|
||
</view>
|
||
</block>
|
||
</view>
|
||
<view class="issue bg-w" @tap="goEvaluate" v-if="!isFruit">
|
||
<view class="title flex flex-between">
|
||
<text class="font34">商品评论({{ goodsInfo.totalEvaluate }})</text>
|
||
<view class="flex flex-align-center color-red">
|
||
<text class="font28">查看全部</text>
|
||
<text class="iconfont font38"></text>
|
||
</view>
|
||
</view>
|
||
<view class="list">
|
||
<block v-if="goodsInfo.totalEvaluate > 0">
|
||
<block v-for="(item, i) in commentList" :key="i">
|
||
<view class="list-item" v-if="i < 2">
|
||
<view class="flex flex-align-center">
|
||
<image :src="filterImg(item.evaluateUserInfo.headPortrait, 1)" mode=""
|
||
class="avatar"></image>
|
||
<view class="flex-grow flex flex-column">
|
||
<text class="color-red font26">{{ item.evaluateUserInfo.nickname }}</text>
|
||
<text class="font26 color-b9">{{ item.createTime }}</text>
|
||
</view>
|
||
</view>
|
||
<text class="line line-2 font30 txt">{{ item.evaluateGoodsComment }}</text>
|
||
<view class="imgs"
|
||
v-if="item.evaluateGoodsImages && item.evaluateGoodsImages.length > 0">
|
||
<image :src="filterImg(img, 5)" mode="" class="pic"
|
||
v-for="(img, index) in item.evaluateGoodsImages" :key="index"></image>
|
||
</view>
|
||
</view>
|
||
</block>
|
||
</block>
|
||
<text v-else class="font30 color-b6">暂无评论</text>
|
||
</view>
|
||
</view>
|
||
<view class="flex flex-between store bg-w" v-if="!isFruit">
|
||
<view>
|
||
<image :src="filterImg(storeInfo.logoImage, 1)" mode="" class="img"></image>
|
||
</view>
|
||
<view class="flex flex-column" style="width: 380rpx;">
|
||
<view class="flex flex-align-center">
|
||
<text class="blod font34">{{ storeInfo.name }}</text>
|
||
</view>
|
||
<text class="font26 color-b6 line line-2">{{ storeInfo.introduce }}</text>
|
||
</view>
|
||
<text class="color-red btn font32" @tap="goStore">进店</text>
|
||
</view>
|
||
</view>
|
||
<view class="detail">
|
||
<view class="flex flex-center title">
|
||
<text class="xian">—————</text>
|
||
<text class="font26 color-b9">商品详情</text>
|
||
<text class="xian">—————</text>
|
||
</view>
|
||
<rich-text :nodes="goodsInfo.detailsTextHtml"></rich-text>
|
||
<view v-if="goodsInfo.detailsImgList">
|
||
<image style="width: 750rpx; display: block;" :src="item"
|
||
v-for="(item, i) in goodsInfo.detailsImgList" :key="i" mode="widthFix"></image>
|
||
</view>
|
||
</view>
|
||
<view class="fixed">
|
||
<uni-goods-nav :fill="true" :options="options" :buttonGroup="buttonGroup" @click="navClick"
|
||
@buttonClick="buttonClick" />
|
||
</view>
|
||
<view class="fixed-height"></view>
|
||
<uni-popup ref="popup" type="bottom">
|
||
<view class="popup bg-w">
|
||
<view class="flex">
|
||
<image :src="mainImage" mode="" class="img" @click="skuViewPhoto(mainImage)"></image>
|
||
<text class="flex-grow color-red font44 blod">¥{{ money }}</text>
|
||
<text class="iconfont font48 color-b9" @click="closePopup"></text>
|
||
</view>
|
||
<view class="flex flex-column norms">
|
||
<text class="color-b6 font30">商品规格</text>
|
||
<view class="flex flex-align-center list" v-if="skuList">
|
||
<block v-for="(sku, i) in skuList" :key="i">
|
||
<text class="list-item" :class="{ 'active': sku.select }"
|
||
v-if="sku.skuStock && sku.skuStock > 0"
|
||
@click="skuSelect(i)">{{ sku.skuName }}</text>
|
||
</block>
|
||
</view>
|
||
</view>
|
||
<view class="flex flex-between mar" v-if="qvyu != 5">
|
||
<text class="color-b6 font30">购买数量</text>
|
||
<uni-number-box :min="1" :max="numberMax" :value="number"
|
||
@change="numberChange"></uni-number-box>
|
||
</view>
|
||
<view class="flex flex-between mar" v-else>
|
||
<text class="color-b6 font30">购买数量(最多只能购买一件)</text>
|
||
<uni-number-box :min="1" :max="1" value="1" @change="numberChange"></uni-number-box>
|
||
</view>
|
||
<button type="primary" class="bg-base btn"
|
||
@click="addCartOrBuy(btnClickIndex, null)">{{ btnTxt }}</button>
|
||
</view>
|
||
</uni-popup>
|
||
<!-- 优惠明细 -->
|
||
<uni-popup ref="discountPopup" type="bottom">
|
||
<view class="discount">
|
||
<text class="font32 color-red">优惠明细</text>
|
||
<view class="d-list">
|
||
<block v-for="(item, i) in discountList" :key="i">
|
||
<view class="d-list-item" v-if="item.status === 1">
|
||
<view class="left">
|
||
<text class="font26 tip">¥</text>
|
||
<text class="font46 blod">{{ item.discountAmount }}</text>
|
||
</view>
|
||
<view class="right flex flex-column flex-grow">
|
||
<text class="font28">{{ item.titleName }}</text>
|
||
<text class="font30">满{{ item.useStandardAmount }}可用</text>
|
||
<text
|
||
class="font26">{{ item.expireTimeDay > 0 ? `有效期${item.expireTimeDay}天` : '永久有效' }}</text>
|
||
</view>
|
||
<text class="btn" v-if="item.number === 0">已领完</text>
|
||
<text class="btn" v-else
|
||
@tap.stop="onReceive(i)">{{ item.userReceiveFlag ? '立即领取' : '已领取' }}</text>
|
||
</view>
|
||
</block>
|
||
</view>
|
||
<button type="primary" class="bg-base close" @click="closePopup">关闭</button>
|
||
</view>
|
||
</uni-popup>
|
||
<!-- 拼团 -->
|
||
<uni-popup ref="spellPopup" type="center">
|
||
<view class="spell">
|
||
<text class="title">正在拼单</text>
|
||
<scroll-view scroll-y="true" style="height: 600rpx;" @scrolltolower="getGroupList()">
|
||
<block v-for="(item, i) in groupList" :key="i">
|
||
<view class="flex flex-between spell-item" v-if="item.groupTrueNumber > 0">
|
||
<image :src="item.groupUserInfo.headPortrait" mode="" class="img"></image>
|
||
<text class="line font28 flex-grow"
|
||
style="width: 200rpx;">{{ item.groupUserInfo.nickname }}</text>
|
||
<text class="font26 color-b6" style="margin-left: 10rpx;">还差{{ item.groupNumber -
|
||
item.groupTrueNumber }}人拼成</text>
|
||
<button type="primary" size="mini" class="bg-base btn"
|
||
@click="addCartOrBuy(1, item)">去拼单</button>
|
||
</view>
|
||
</block>
|
||
</scroll-view>
|
||
</view>
|
||
</uni-popup>
|
||
</block>
|
||
<block v-if="isFruit && current == 1">
|
||
<view :style="{height: tabHeight + 'px'}"></view>
|
||
<FruitManage ref="FruitManage" />
|
||
</block>
|
||
<block v-if="isFruit && current == 2">
|
||
<view :style="{height: tabHeight + 'px'}"></view>
|
||
<FruitAward ref="FruitAward"></FruitAward>
|
||
</block>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import {
|
||
mapState
|
||
} from "vuex"
|
||
import {
|
||
config
|
||
} from '@/config/config.js';
|
||
import url from "@/common/http/url.js"
|
||
import publics from "@/common/utils/public.js"
|
||
import {
|
||
sendRequestJson
|
||
} from "@/common/http/api.js"
|
||
import uniGoodsNav from './components/uni-goods-nav/uni-goods-nav.vue'
|
||
import vTabs from "@/components/v-tabs/v-tabs.vue"
|
||
import uniPopup from "@/components/uni-popup/uni-popup.vue"
|
||
import uniNumberBox from "@/components/uni-number-box/uni-number-box.vue"
|
||
import FruitManage from '@/pages/home/fruitCard.vue'
|
||
import FruitAward from '@/pages/home/award.vue'
|
||
let timer = null
|
||
export default {
|
||
components: {
|
||
vTabs,
|
||
uniGoodsNav,
|
||
uniPopup,
|
||
uniNumberBox,
|
||
FruitManage,
|
||
FruitAward
|
||
},
|
||
data() {
|
||
return {
|
||
isFruit: false,
|
||
staticUrl: this.$staticUrl,
|
||
isDone: false,
|
||
statusBarHeight: getApp().statusBarHeight,
|
||
current: 0,
|
||
tabs: ["商品", "评论", "详情"],
|
||
fruittabs: ["购买", "领取", "奖励"],
|
||
options: [{
|
||
text: "店铺",
|
||
icon: "\ue616",
|
||
iconColor: "#333333"
|
||
},
|
||
// { text: "客服", icon: "\ue608", iconColor: "#333333" },
|
||
{
|
||
text: "收藏",
|
||
icon: "\ue615",
|
||
iconColor: "#333333"
|
||
}
|
||
],
|
||
buttonGroup: [{
|
||
text: "立即购买",
|
||
color: "#fff",
|
||
backgroundColor: "#F44646"
|
||
}],
|
||
btnTxt: "立即购买",
|
||
btnClickIndex: null,
|
||
myAddressData: {},
|
||
id: "",
|
||
swiperList: [],
|
||
commentList: [],
|
||
skuList: [],
|
||
skuObj: {},
|
||
mainImage: "",
|
||
money: "",
|
||
goodsInfo: {},
|
||
storeInfo: {},
|
||
isCollection: false, // 收藏
|
||
distanceStoreFlag: false, // 是否支持配送上门
|
||
dkUserFlag: false, // 附近是否有代理
|
||
dkUserSize: 0, // 附近代理人数
|
||
detailTop: 0, // 详情距离顶部的距离
|
||
issueTop: 0, // 评论距离顶部的距离
|
||
storeType: 0,
|
||
number: 1,
|
||
numberMax: 99,
|
||
discountList: [],
|
||
rangePrice: "",
|
||
time: null,
|
||
groupList: [],
|
||
wxBtnHeight: 0,
|
||
isInit: true,
|
||
qvyu: null,
|
||
greenText: null,
|
||
rmbText: null,
|
||
dpi: uni.getStorageSync('dpi'),
|
||
tabHeight: 0
|
||
}
|
||
},
|
||
computed: {
|
||
...mapState(["userInfo"])
|
||
},
|
||
filters: {
|
||
filterManager(val) {
|
||
switch (val) {
|
||
case 0:
|
||
return "不是";
|
||
case 1:
|
||
return "初级";
|
||
case 2:
|
||
return "中级";
|
||
case 3:
|
||
return "高级";
|
||
default:
|
||
return "其他";
|
||
}
|
||
}
|
||
},
|
||
onReachBottom() {
|
||
console.log('6666');
|
||
if (this.isFruit) {
|
||
if (this.current == 1) this.$refs.FruitManage.loadMore()
|
||
else if (this.current == 2) this.$refs.FruitAward.loadMore()
|
||
}
|
||
},
|
||
onLoad(opt) {
|
||
this.qvyu = opt.qvyu || null;
|
||
this.greenText = opt.greenText || null;
|
||
this.rmbText = opt.rmbText || null;
|
||
this.tabHeight = uni.getStorageSync('system').statusBarHeight + 100 / this.dpi
|
||
// #ifdef MP-WEIXIN
|
||
this.wxBtnHeight = wx.getMenuButtonBoundingClientRect().height
|
||
this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight
|
||
// #endif
|
||
let addressData = publics.getMyaddressLngLat()
|
||
if (addressData) {
|
||
this.myAddressData = JSON.parse(addressData)
|
||
} else {
|
||
// this.$msg("请先设置您当前的位置")
|
||
// this.openMap()
|
||
}
|
||
let id = opt.id
|
||
this.id = id
|
||
if (id == 642) {
|
||
this.isFruit = true
|
||
}
|
||
if (id) {
|
||
this.getCommentList()
|
||
} else {
|
||
this.$msg("查找不到该商品信息,可能该商品已下架");
|
||
this.$navigateBack(1, 1000);
|
||
}
|
||
this.getScrollTop()
|
||
},
|
||
onShow() {
|
||
// 初始化底部按钮
|
||
this.buttonGroup = [{
|
||
text: "立即购买",
|
||
color: "#fff",
|
||
backgroundColor: "#F44646"
|
||
}]
|
||
this.getGoodsDetail()
|
||
},
|
||
onHide() {
|
||
this.clear()
|
||
},
|
||
onUnload() {
|
||
this.clear()
|
||
},
|
||
onPageScroll(e) {
|
||
if (!this.isFruit) {
|
||
if (e.scrollTop > 0 && e.scrollTop < this.issueTop) {
|
||
this.current = 0
|
||
}
|
||
if (e.scrollTop > this.issueTop && e.scrollTop < this.detailTop) {
|
||
this.current = 1
|
||
}
|
||
if (e.scrollTop > this.detailTop) {
|
||
this.current = 2
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
filterImg(img, type) {
|
||
return publics.filterImgUrl(img, type)
|
||
},
|
||
getScrollTop() {
|
||
let _this = this
|
||
setTimeout(() => {
|
||
_this.$getRect(".detail").then(res => {
|
||
if (res) {
|
||
_this.detailTop = res.top - 60
|
||
}
|
||
})
|
||
_this.$getRect(".issue").then(res => {
|
||
if (res) {
|
||
_this.issueTop = res.top - 60
|
||
}
|
||
})
|
||
}, 500)
|
||
},
|
||
getGoodsDetail() {
|
||
let params = {
|
||
goodsId: this.id,
|
||
lng: this.myAddressData.longitude || "0", //经度
|
||
lat: this.myAddressData.latitude || "0" //纬度
|
||
}
|
||
this.$http("GET", url.goods.goodsDetail, params).then(res => {
|
||
this.goodsInfo = res.data
|
||
this.storeInfo = res.data.storeInfo
|
||
this.swiperList = this.goodsInfo.topImgList
|
||
this.skuList = this.goodsInfo.skuList
|
||
this.mainImage = this.goodsInfo.mainImage
|
||
this.isDone = true
|
||
// 是否收藏
|
||
this.isCollection = res.data.isCollection
|
||
if (this.isCollection) {
|
||
this.options[1].icon = "\ue614"
|
||
}
|
||
// 是否具备进货资格(当前商品为精品商品,并且自己为配送员, 并且开启精品商品进货)
|
||
if (res.data.goodsType === 2 && this.userInfo.distributorIsOpen === 1 && res.data
|
||
.boutiqueBuyingStatus === 1) {
|
||
// this.btnTxt = "进货"
|
||
this.buttonGroup.push({
|
||
text: "进货",
|
||
color: "#fff",
|
||
backgroundColor: "#764de8"
|
||
})
|
||
}
|
||
// 幅度价格
|
||
this.rangePrice = this.goodsInfo.wholesalePrice
|
||
if (res.data.skuList) {
|
||
let skuList = res.data.skuList
|
||
if (skuList.length > 1) {
|
||
let maxArray = skuList.sort((a, b) => {
|
||
return b.skuPrice - a.skuPrice
|
||
})
|
||
let maxPrice = maxArray[0].skuPrice
|
||
let minPrice = maxArray[maxArray.length - 1].skuPrice
|
||
this.rangePrice = minPrice + '-' + maxPrice
|
||
}
|
||
}
|
||
this.money = this.rangePrice
|
||
if (res.data.goodsType === 12 && res.data.homeGoodsSeckill) {
|
||
//this.countDown(res.data.homeGoodsSeckill.dueDateTime)
|
||
this.time = this.countTime(res.data.homeGoodsSeckill.dueDateTime);
|
||
}
|
||
if (res.data.goodsType === 14) {
|
||
this.btnTxt = "发起拼单"
|
||
this.buttonGroup[0].text = this.btnTxt
|
||
// this.buttonGroup.push({text: this.btnTxt, color: "#fff", backgroundColor: "#764de8"})
|
||
this.getGroupList()
|
||
}
|
||
this.skuSelect(0)
|
||
}).catch((err) => {
|
||
console.log('err*********', err)
|
||
this.$msg(err.msg)
|
||
this.$navigateBack(1, 1000);
|
||
})
|
||
},
|
||
countTime(dueDateTime) {
|
||
let timeReplace = dueDateTime.replace(/\.|\-/g, '/')
|
||
|
||
let startTime = new Date(); // 开始时间
|
||
let endTime = new Date(timeReplace); // 结束时间
|
||
let usedTime = endTime - startTime; // 相差的毫秒数
|
||
let days = Math.floor(usedTime / (24 * 3600 * 1000)); // 计算出天数
|
||
let leavel = usedTime % (24 * 3600 * 1000); // 计算天数后剩余的时间
|
||
let hours = Math.floor(leavel / (3600 * 1000)); // 计算剩余的小时数
|
||
let leavel2 = leavel % (3600 * 1000); // 计算剩余小时后剩余的毫秒数
|
||
let minutes = Math.floor(leavel2 / (60 * 1000)); // 计算剩余的分钟数
|
||
|
||
let timer = days + '天' + hours + '时' + minutes + '分';
|
||
return timer;
|
||
},
|
||
countDown(time) {
|
||
if (timer) {
|
||
this.clear()
|
||
}
|
||
timer = setInterval(() => {
|
||
let timeReplace = time.replace(/\.|\-/g, '/')
|
||
let oldTime = new Date(timeReplace).getTime()
|
||
let newTime = new Date().getTime()
|
||
let leftTime = parseInt(oldTime - newTime)
|
||
if (leftTime >= 0) {
|
||
let h = Math.floor(leftTime / 1000 / 60 / 60 % 24);
|
||
let m = Math.floor(leftTime / 1000 / 60 % 60);
|
||
let s = Math.floor(leftTime / 1000 % 60);
|
||
|
||
function checkTime(i) {
|
||
if (i < 10) {
|
||
i = "0" + i;
|
||
}
|
||
return i;
|
||
}
|
||
h = checkTime(h)
|
||
m = checkTime(m)
|
||
s = checkTime(s)
|
||
this.time = `${h}:${m}:${s}`
|
||
} else {
|
||
this.clear()
|
||
}
|
||
}, 1000)
|
||
},
|
||
clear() {
|
||
if (timer) {
|
||
clearInterval(timer)
|
||
timer = null
|
||
this.time = null
|
||
}
|
||
},
|
||
getCommentList() {
|
||
this.$http("GET", url.goods.getEvaluateList, {
|
||
goodsId: this.id,
|
||
pageNum: 0
|
||
}).then(res => {
|
||
let list = res.data.data
|
||
list.map(v => {
|
||
if (v.sysStaticResources) {
|
||
v.evaluateGoodsImages = []
|
||
v.evaluateDistributionImages = []
|
||
v.sysStaticResources.forEach(k => {
|
||
if (k.type === 20) {
|
||
v.evaluateGoodsImages.push(k.ossUrl)
|
||
}
|
||
if (k.type === 21) {
|
||
v.evaluateDistributionImages.push(k.ossUrl)
|
||
}
|
||
})
|
||
}
|
||
})
|
||
this.commentList = list
|
||
})
|
||
},
|
||
getGroupList() {
|
||
this.$http("GET", url.goods.getGroupById, {
|
||
goodsId: this.id,
|
||
pageNum: this.groupList.length
|
||
}).then(res => {
|
||
this.groupList = this.groupList.concat(res.data)
|
||
})
|
||
},
|
||
openMap() {
|
||
var _this = this;
|
||
uni.chooseLocation({
|
||
keyword: "",
|
||
success: function(res) {
|
||
publics.setMyaddressLngLat(JSON.stringify(res));
|
||
//设置地址
|
||
_this.myAddressData = res;
|
||
}
|
||
});
|
||
},
|
||
navClick(e) {
|
||
if (e.index === 0) {
|
||
this.goStore()
|
||
}
|
||
// else if (e.index === 1) {
|
||
// this.$navigateTo("../interaction/im-chat?type=3&&id=" + this.storeInfo.imAccount)
|
||
// }
|
||
else {
|
||
this.isCollection = !this.isCollection
|
||
this.options[1].icon = this.isCollection ? "\ue614" : "\ue615"
|
||
this.$http("POST", url.goods.collectionGoods, {
|
||
goodsId: this.id
|
||
}).catch(() => {
|
||
this.isCollection = false
|
||
this.options[1].icon = this.isCollection ? "\ue614" : "\ue615"
|
||
})
|
||
}
|
||
},
|
||
buttonClick(e) {
|
||
this.btnClickIndex = e.index
|
||
this.btnTxt = this.buttonGroup[e.index].text
|
||
if (this.goodsInfo.skuList) {
|
||
// if (this.goodsInfo.skuList.length === 1) { // 如果sku只有一个,那么默认选中
|
||
// this.skuSelect(0)
|
||
// }
|
||
this.$refs.popup.open()
|
||
} else {
|
||
this.addCartOrBuy(0, null)
|
||
}
|
||
|
||
},
|
||
// 立即购买 / 进货 / 发起拼单
|
||
addCartOrBuy(index, row) {
|
||
if (index === 1 && this.goodsInfo.goodsType === 14 && row && row.groupUserInfo.imAccount === this.userInfo
|
||
.imAccount) { // 点击自己发起的拼单
|
||
return this.$msg("不能拼自己发起的拼单")
|
||
}
|
||
if (this.goodsInfo.goodsType === 12 && !this.time) { // 如果是限时秒杀商品并且已结束
|
||
return this.$msg("该商品秒杀已结束")
|
||
}
|
||
if (this.userInfo.userStoreId === this.goodsInfo.userStoreId) {
|
||
return this.$msg("不能购买自己店铺的商品!");
|
||
}
|
||
if (JSON.stringify(this.skuObj) === "{}") {
|
||
return this.$msg("请选择商品规格");
|
||
}
|
||
if (this.skuObj.skuStock < 1) {
|
||
return this.$msg("库存不足!");
|
||
}
|
||
let params = {
|
||
goodsId: this.id,
|
||
number: this.number,
|
||
goodsSkuId: this.skuObj.id,
|
||
orderType: index === 0 ? this.goodsInfo.goodsType : 3, // 订单类型 1-普通 2-精品 3-进货
|
||
groupParentId: 0 //默认拼团id为0,防止传null后台报错
|
||
}
|
||
if (this.goodsInfo.goodsType === 14) {
|
||
params.orderType = this.goodsInfo.goodsType
|
||
params.groupParentId = row ? row.id : 0
|
||
}
|
||
sendRequestJson("GET", url.order.getOrderInfo, params).then(res => {
|
||
let data = res.data
|
||
data.orderType = params.orderType
|
||
uni.setStorageSync("commitOrderData", data)
|
||
this.$navigateTo("/pages/order/createOrder")
|
||
})
|
||
},
|
||
showActive() {
|
||
let _this = this
|
||
uni.showActionSheet({
|
||
itemList: ['举报'],
|
||
success: function(res) {
|
||
if (res.tapIndex === 0) {
|
||
_this.$navigateTo("/pages/report/index?type=4&configType=3&id=" + _this.id)
|
||
}
|
||
}
|
||
});
|
||
},
|
||
swiperViewPhotos(i) {
|
||
let _this = this
|
||
uni.previewImage({
|
||
current: i,
|
||
urls: _this.swiperList
|
||
})
|
||
},
|
||
skuViewPhoto(url) {
|
||
uni.previewImage({
|
||
current: url,
|
||
urls: [url]
|
||
})
|
||
},
|
||
showSpellPopup() {
|
||
this.$refs.spellPopup.open()
|
||
},
|
||
closePopup() {
|
||
this.$refs.popup.close()
|
||
this.$refs.discountPopup.close()
|
||
},
|
||
numberChange(val) {
|
||
console.log(val)
|
||
// if (val > 1 && this.isInit) return this.$msg('最多只能购买一件');
|
||
// this.isInit = true
|
||
this.number = val
|
||
},
|
||
skuSelect(i) {
|
||
this.skuList.map(v => {
|
||
v.select = false
|
||
})
|
||
this.skuList[i].select = true
|
||
this.skuObj = this.skuList[i]
|
||
// if (this.skuObj.id == config.binLangSkuId) {
|
||
// this.numberMax = config.binLangMax
|
||
// } else {
|
||
this.numberMax = this.skuList[i].skuStock
|
||
// }
|
||
this.mainImage = this.skuList[i].mainImage
|
||
this.money = this.skuList[i].skuPrice
|
||
},
|
||
collectCoupons(list) {
|
||
this.discountList = list
|
||
this.$refs.discountPopup.open()
|
||
},
|
||
onReceive(index) {
|
||
if (!this.discountList[index].userReceiveFlag) return
|
||
let discountId = this.discountList[index].id
|
||
this.$http("POST", url.user.receiveDiscount, {
|
||
discountId: discountId
|
||
}).then(res => {
|
||
this.$msg("恭喜,抢到了")
|
||
this.discountList[index].userReceiveFlag = false
|
||
if (this.discountList[index].number !== -1) {
|
||
this.discountList[index].number--
|
||
}
|
||
this.goodsInfo.discountList = this.discountList
|
||
})
|
||
},
|
||
tabsChange(i) {
|
||
this.current = i
|
||
if (!this.isFruit) {
|
||
if (i === 0) {
|
||
uni.pageScrollTo({
|
||
scrollTop: 0
|
||
})
|
||
} else if (i === 1) {
|
||
uni.pageScrollTo({
|
||
scrollTop: this.issueTop
|
||
})
|
||
} else {
|
||
uni.pageScrollTo({
|
||
scrollTop: this.detailTop
|
||
})
|
||
}
|
||
}
|
||
},
|
||
goEvaluate() {
|
||
let data = {
|
||
id: this.id,
|
||
all: this.goodsInfo.totalEvaluate,
|
||
good: this.goodsInfo.evaluateGood,
|
||
secondary: this.goodsInfo.evaluateSecondary,
|
||
difference: this.goodsInfo.evaluateDifference
|
||
}
|
||
this.$navigateTo("evaluate?data=" + JSON.stringify(data))
|
||
},
|
||
goStore() {
|
||
this.$navigateTo("store?id=" + this.goodsInfo.userStoreId)
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
@import "@/font.css";
|
||
|
||
.color-red {
|
||
color: #E40000;
|
||
}
|
||
|
||
.price-text {
|
||
font-family: 'Product-Sans-Bold';
|
||
padding-left: 10rpx;
|
||
padding-bottom: 10rpx;
|
||
align-items: center !important;
|
||
font-size: 70upx;
|
||
color: #E40000;
|
||
}
|
||
|
||
.bg {
|
||
padding: 0 10rpx;
|
||
background-color: rgba(255, 59, 71, 0.2);
|
||
color: #E40000;
|
||
}
|
||
|
||
.main {
|
||
background-color: #f4f5f6;
|
||
}
|
||
|
||
.header {
|
||
padding: 0rpx 30rpx;
|
||
height: 100rpx;
|
||
position: fixed;
|
||
justify-content: space-between;
|
||
top: 0;
|
||
left: 0;
|
||
right: 0;
|
||
z-index: 99;
|
||
|
||
.icon {
|
||
font-size: 50rpx;
|
||
width: 100rpx;
|
||
margin-bottom: -10rpx;
|
||
text-align: center;
|
||
}
|
||
}
|
||
|
||
.swiper {
|
||
// margin-top: 100rpx;
|
||
width: 750rpx;
|
||
height: 700rpx;
|
||
|
||
.img {
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
}
|
||
|
||
.price {
|
||
background-color: #E40000;
|
||
padding: 20rpx 20rpx;
|
||
margin-bottom: 10rpx;
|
||
|
||
.del {
|
||
margin-left: 10rpx;
|
||
}
|
||
|
||
.icon {
|
||
width: 56rpx;
|
||
height: 56rpx;
|
||
margin-right: 10rpx;
|
||
}
|
||
}
|
||
|
||
.new {
|
||
padding: 0rpx 20rpx;
|
||
}
|
||
|
||
.d-list {
|
||
padding: 0 20rpx;
|
||
|
||
.d-item {
|
||
font-size: 24rpx;
|
||
color: #E40000;
|
||
background-color: rgba($color: #E40000, $alpha: .3);
|
||
border-radius: 6rpx;
|
||
margin-right: 10rpx;
|
||
padding: 4rpx 10rpx;
|
||
}
|
||
}
|
||
|
||
.wrap {
|
||
margin: 0 20rpx;
|
||
|
||
.name {
|
||
position: relative;
|
||
margin-bottom: 10rpx;
|
||
|
||
.tips {
|
||
color: white;
|
||
font-weight: normal;
|
||
border-radius: 8rpx;
|
||
font-size: 26rpx;
|
||
padding: 0 10rpx;
|
||
margin-right: 6rpx;
|
||
// display: inline-block;
|
||
// position: absolute;
|
||
// left: 0;
|
||
// top: 12rpx;
|
||
}
|
||
|
||
// .txt{
|
||
// text-indent: 2.2em;
|
||
// }
|
||
}
|
||
|
||
.other {
|
||
margin-bottom: 10rpx;
|
||
}
|
||
|
||
.servies {
|
||
padding: 26rpx 20rpx;
|
||
border-radius: 16rpx;
|
||
margin-bottom: 20rpx;
|
||
|
||
.b {
|
||
width: 34rpx;
|
||
height: 34rpx;
|
||
font-size: 24rpx;
|
||
color: white;
|
||
text-align: center;
|
||
line-height: 34rpx;
|
||
display: inline-block;
|
||
border-radius: 50%;
|
||
margin-left: 20rpx;
|
||
margin-right: 6rpx;
|
||
}
|
||
|
||
.blue {
|
||
background-color: #007AFF;
|
||
}
|
||
|
||
.red {
|
||
background-color: #ff342a;
|
||
}
|
||
|
||
.green {
|
||
background-color: #00a743;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
.reward {
|
||
background-color: white;
|
||
padding: 26rpx 20rpx;
|
||
border-radius: 16rpx;
|
||
margin-bottom: 20rpx;
|
||
color: #999999;
|
||
font-size: 28rpx;
|
||
|
||
&-wrap {
|
||
&-cell {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-top: 10rpx;
|
||
|
||
.icon {
|
||
font-size: 36rpx;
|
||
margin-right: 10rpx;
|
||
color: #E40000;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.group {
|
||
background-color: white;
|
||
padding: 20rpx 20rpx 0;
|
||
margin-bottom: 20rpx;
|
||
border-radius: 20rpx;
|
||
|
||
.title {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
padding-bottom: 20rpx;
|
||
}
|
||
|
||
&-item {
|
||
border-top: 2rpx solid #EEEEEE;
|
||
padding: 20rpx 0;
|
||
|
||
.img {
|
||
width: 80rpx;
|
||
height: 80rpx;
|
||
border-radius: 50%;
|
||
margin-right: 10rpx;
|
||
}
|
||
|
||
.btn {
|
||
margin: 0;
|
||
margin-left: 10rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.issue {
|
||
padding: 20rpx;
|
||
border-radius: 16rpx;
|
||
|
||
.list {
|
||
|
||
// margin-top: 30rpx;
|
||
&-item {
|
||
padding-bottom: 20rpx;
|
||
border-bottom: 2rpx solid #eee;
|
||
margin-top: 30rpx;
|
||
|
||
.avatar {
|
||
width: 110rpx;
|
||
height: 110rpx;
|
||
border-radius: 50%;
|
||
margin-right: 20rpx;
|
||
}
|
||
|
||
.txt {
|
||
margin-top: 20rpx;
|
||
color: #666;
|
||
line-height: 48rpx;
|
||
}
|
||
|
||
.imgs {
|
||
display: flex;
|
||
align-items: center;
|
||
flex-wrap: wrap;
|
||
margin-top: 10rpx;
|
||
|
||
.pic {
|
||
width: 160rpx;
|
||
height: 160rpx;
|
||
margin-right: 10rpx;
|
||
margin-bottom: 10rpx;
|
||
border-radius: 10rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
&-item:last-child {
|
||
border: none;
|
||
}
|
||
}
|
||
}
|
||
|
||
.store {
|
||
margin-top: 20rpx;
|
||
padding: 20rpx;
|
||
border-radius: 16rpx;
|
||
|
||
.img {
|
||
width: 120rpx;
|
||
height: 120rpx;
|
||
margin-right: 20rpx;
|
||
border-radius: 20rpx;
|
||
display: block;
|
||
}
|
||
|
||
.tips {
|
||
color: white;
|
||
font-size: 24rpx;
|
||
border-radius: 30rpx;
|
||
padding: 0 10rpx;
|
||
font-weight: normal;
|
||
margin-left: 10rpx;
|
||
transform: scale(0.9);
|
||
display: inline-block;
|
||
}
|
||
|
||
.btn {
|
||
border: 2rpx solid #E40000;
|
||
border-radius: 30rpx;
|
||
padding: 0 20rpx;
|
||
margin-left: 20rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.detail {
|
||
margin-bottom: 100rpx;
|
||
|
||
.title {
|
||
margin: 20rpx;
|
||
|
||
.xian {
|
||
font-size: 28rpx;
|
||
color: #cccccc;
|
||
margin: 0 20rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.fixed {
|
||
position: fixed;
|
||
bottom: 0;
|
||
left: 0;
|
||
right: 0;
|
||
}
|
||
|
||
.fixed-height {
|
||
height: 1px;
|
||
}
|
||
|
||
.popup {
|
||
padding: 20rpx 30rpx;
|
||
|
||
.img {
|
||
width: 160rpx;
|
||
height: 160rpx;
|
||
margin-right: 20rpx;
|
||
border-radius: 10rpx;
|
||
}
|
||
|
||
.norms {
|
||
margin-top: 20rpx;
|
||
padding-top: 20rpx;
|
||
border-top: 2rpx solid #f6f4f8;
|
||
border-bottom: 2rpx solid #f6f4f8;
|
||
|
||
.list {
|
||
flex-wrap: wrap;
|
||
margin-top: 20rpx;
|
||
|
||
&-item {
|
||
color: #555555;
|
||
background-color: #F5F5F5;
|
||
font-size: 28rpx;
|
||
padding: 10rpx 20rpx;
|
||
border-radius: 10rpx;
|
||
margin-right: 20rpx;
|
||
margin-bottom: 20rpx;
|
||
}
|
||
|
||
.active {
|
||
color: #E40000;
|
||
background-color: rgba(#E40000, .3);
|
||
}
|
||
}
|
||
}
|
||
|
||
.mar {
|
||
margin: 20rpx 0 50rpx;
|
||
}
|
||
|
||
.btn {
|
||
border-radius: 50rpx;
|
||
}
|
||
}
|
||
|
||
.discount {
|
||
padding: 20rpx;
|
||
border-radius: 20rpx 20rpx 0 0;
|
||
background-color: white;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
flex-direction: column;
|
||
|
||
.d-list {
|
||
margin-top: 50rpx;
|
||
|
||
&-item {
|
||
width: 650rpx;
|
||
background-color: rgba($color: #E40000, $alpha: .3);
|
||
border-radius: 20rpx;
|
||
padding: 30rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 20rpx;
|
||
color: #E40000;
|
||
|
||
.left {
|
||
display: flex;
|
||
align-items: flex-end;
|
||
margin-right: 20rpx;
|
||
|
||
.tip {
|
||
margin-bottom: 10rpx;
|
||
margin-right: 6rpx;
|
||
display: inline-block;
|
||
}
|
||
}
|
||
|
||
.btn {
|
||
margin-right: 10rpx;
|
||
font-size: 34rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.close {
|
||
width: 710rpx;
|
||
margin-top: 50rpx;
|
||
border-radius: 50rpx;
|
||
}
|
||
}
|
||
|
||
.spell {
|
||
// width: 90%;
|
||
width: 100%;
|
||
background-color: white;
|
||
border-radius: 20rpx;
|
||
|
||
.title {
|
||
width: 100%;
|
||
text-align: center;
|
||
border-bottom: 2rpx solid #EEEEEE;
|
||
padding: 30rpx 0;
|
||
font-size: 32rpx;
|
||
color: #444444;
|
||
display: block;
|
||
}
|
||
|
||
&-item {
|
||
padding: 20rpx;
|
||
|
||
.img {
|
||
width: 80rpx;
|
||
height: 80rpx;
|
||
border-radius: 50%;
|
||
margin-right: 10rpx;
|
||
}
|
||
|
||
.btn {
|
||
margin: 0;
|
||
margin-left: 10rpx;
|
||
}
|
||
}
|
||
}
|
||
</style> |