mall_client/zyhs3_uniapp/pages/home/details.vue

1252 lines
34 KiB
Vue
Raw Permalink Normal View History

2026-03-13 07:50:35 +00:00
<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()">&#xe771;</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">&#xe60b;</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">&#xe639;</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;">&#xe770;</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">&#xe770;</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">&#xe7be;</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>