<template> <view v-show="!isLoading" class="container" :style="appThemeStyle"> <!-- 商品图片轮播 --> <SlideImage v-if="!isLoading" :video="goods.video" :videoCover="goods.videoCover" :images="goods.goods_images" /> <!-- 商品信息 --> <view v-if="!isLoading" class="goods-info m-top20"> <!-- 价格、销量 --> <view class="info-item info-item__top dis-flex flex-x-between flex-y-end"> <view class="block-left dis-flex flex-y-center"> <!-- 商品售价 --> <text class="floor-price__samll">¥</text> <text class="floor-price">{{ goods.goods_price_min }}</text> <!-- 会员价标签 --> <view v-if="goods.is_user_grade" class="user-grade"> <text>会员价</text> </view> <!-- 划线价 --> <text v-if="goods.line_price_min > 0" class="original-price">¥{{ goods.line_price_min }}</text> </view> <view class="block-right dis-flex"> <!-- 销量 --> <view class="goods-sales"> <text>已售{{ goods.goods_sales }}件</text> </view> </view> </view> <!-- 标题、分享 --> <view class="info-item info-item__name dis-flex flex-y-center"> <view class="goods-name flex-box"> <text class="twoline-hide">{{ goods.goods_name }}</text> </view> <view class="goods-share__line"></view> <view class="goods-share"> <button class="share-btn dis-flex flex-dir-column" @click="onShowShareSheet()"> <text class="share__icon iconfont icon-fenxiang"></text> <text class="f-24">分享</text> </button> </view> </view> <!-- 商品卖点 --> <view v-if="goods.selling_point" class="info-item info-item_selling-point"> <text>{{ goods.selling_point }}</text> </view> </view> <!-- 选择商品规格 --> <view v-if="goods.spec_type == 20" class="goods-choice m-top20 b-f" @click="onShowSkuPopup(1)"> <view class="spec-list"> <view class="flex-box"> <text class="col-8">选择:</text> <text class="spec-name" v-for="(item, index) in goods.specList" :key="index">{{ item.spec_name }}</text> </view> <view class="f-26 col-9 t-r"> <text class="iconfont icon-arrow-right"></text> </view> </view> </view> <!-- 商品服务 --> <Service v-if="!isLoading" :goods-id="goodsId" /> <!-- 商品SKU弹窗 --> <SkuPopup v-if="!isLoading" v-model="showSkuPopup" :skuMode="skuMode" :goods="goods" @addCart="onAddCart" /> <!-- 商品评价 --> <Comment v-if="!isLoading" :goods-id="goodsId" :limit="2" /> <!-- 商品描述 --> <view v-if="!isLoading" class="goods-content m-top20"> <view class="item-title b-f"> <text>商品描述</text> </view> <view v-if="goods.content != ''" class="goods-content__detail b-f"> <mp-html :content="goods.content" /> </view> </view> <!-- 商品推荐 --> <recommended /> <!-- 底部选项卡 --> <view class="footer-fixed"> <view class="footer-container"> <!-- 导航图标 --> <view class="foo-item-fast"> <!-- 首页 --> <view class="fast-item fast-item--home" @click="onTargetHome"> <view class="fast-icon"> <text class="iconfont icon-shouye"></text> </view> <view class="fast-text"> <text>首页</text> </view> </view> <!-- 客服 --> <customer-btn v-if="isShowCustomerBtn"> <view class="fast-item"> <view class="fast-icon"> <text class="iconfont icon-kefu1"></text> </view> <view class="fast-text"> <text>客服</text> </view> </view> </customer-btn> <!-- 购物车 --> <view class="fast-item fast-item--cart" @click="onTargetCart"> <view v-if="cartTotal > 0" class="fast-badge fast-badge--fixed">{{ cartTotal > 99 ? '99+' : cartTotal }} </view> <view class="fast-icon"> <text class="iconfont icon-gouwuche"></text> </view> <view class="fast-text"> <text>购物车</text> </view> </view> </view> <!-- 操作按钮 --> <view class="foo-item-btn"> <view class="btn-wrapper"> <view v-if="isEnableCart" class="btn-item btn-item-deputy" @click="onShowSkuPopup(2)"> <text>加入购物车</text> </view> <view class="btn-item btn-item-main" @click="onShowSkuPopup(3)"> <text>立即购买</text> </view> </view> </view> </view> </view> <!-- 快捷导航 --> <!-- <shortcut bottom="120rpx" /> --> <!-- 分享菜单 --> <share-sheet v-model="showShareSheet" :shareTitle="goods.goods_name" :shareImageUrl="goods.goods_image" :posterApiCall="posterApiCall" :posterApiParam="{ goodsId }" /> </view> </template> <script> import WxofficialMixin from '@/core/mixins/wxofficial' import { getSceneData } from '@/core/app' import * as GoodsApi from '@/api/goods' import * as CartApi from '@/api/cart' import SettingModel from '@/common/model/Setting' import { GoodsTypeEnum } from '@/common/enum/goods' import Recommended from '@/components/recommended' import ShareSheet from '@/components/share-sheet' import CustomerBtn from '@/components/customer-btn' import SlideImage from './components/SlideImage' import SkuPopup from './components/SkuPopup' import Comment from './components/Comment' import Service from './components/Service' export default { components: { Recommended, ShareSheet, CustomerBtn, SlideImage, SkuPopup, Comment, Service }, mixins: [WxofficialMixin], data() { return { // 正在加载 isLoading: true, // 当前商品ID goodsId: null, // 商品详情 goods: {}, // 购物车总数量 cartTotal: 0, // 显示/隐藏SKU弹窗 showSkuPopup: false, // 模式 1:都显示 2:只显示购物车 3:只显示立即购买 skuMode: 1, // 显示/隐藏分享菜单 showShareSheet: false, // 获取商品海报图api方法 posterApiCall: GoodsApi.poster, // 是否支持加入购物车 isEnableCart: false, // 是否显示在线客服按钮 isShowCustomerBtn: false, } }, /** * 生命周期函数--监听页面加载 */ async onLoad(options) { // 记录query参数 this.onRecordQuery(options) // 加载页面数据 this.onRefreshPage() // 是否显示在线客服按钮 this.isShowCustomerBtn = await SettingModel.isShowCustomerBtn() }, methods: { // 记录query参数 onRecordQuery(query) { const scene = getSceneData(query) this.goodsId = query.goodsId ? parseInt(query.goodsId) : parseInt(scene.gid) }, // 刷新页面数据 onRefreshPage() { const app = this app.isLoading = true Promise.all([app.getGoodsDetail(), app.getCartTotal()]) .then(() => app.setWxofficialShareData()) .finally(() => app.isLoading = false) }, // 获取商品信息 getGoodsDetail() { const app = this return new Promise((resolve, reject) => { GoodsApi.detail(app.goodsId) .then(result => { app.goods = result.data.detail if (app.goods.goods_type == GoodsTypeEnum.PHYSICAL.value) { app.isEnableCart = true } resolve(result) }) .catch(reject) }) }, // 获取购物车总数量 getCartTotal() { const app = this return new Promise((resolve, reject) => { CartApi.total() .then(result => { app.cartTotal = result.data.cartTotal resolve(result) }) .catch(reject) }) }, // 更新购物车数量 onAddCart(total) { this.cartTotal = total }, /** * 显示/隐藏SKU弹窗 * @param {skuMode} 模式 1:都显示 2:只显示购物车 3:只显示立即购买 */ onShowSkuPopup(skuMode = 1) { const app = this if (app.isEnableCart) { app.skuMode = skuMode } else { app.skuMode = 3 } app.showSkuPopup = !app.showSkuPopup }, // 显示隐藏分享菜单 onShowShareSheet() { this.showShareSheet = !this.showShareSheet }, // 跳转到首页 onTargetHome(e) { this.$navTo('pages/index/index') }, // 跳转到购物车页 onTargetCart() { this.$navTo('pages/cart/index') }, // 设置微信公众号链接分享卡片内容 setWxofficialShareData() { const { goods } = this this.updateShareCardData({ title: goods.goods_name, desc: goods.selling_point, imgUrl: goods.goods_image }) }, }, /** * 分享当前页面 */ onShareAppMessage() { const app = this // 构建页面参数 const params = app.$getShareUrlParams({ goodsId: app.goodsId, }) return { title: app.goods.goods_name, path: `/pages/goods/detail?${params}` } }, /** * 分享到朋友圈 * 本接口为 Beta 版本,暂只在 Android 平台支持,详见分享到朋友圈 (Beta) * https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share-timeline.html */ onShareTimeline() { const app = this // 构建页面参数 const params = app.$getShareUrlParams({ goodsId: app.goodsId, }) return { title: app.goods.goods_name, path: `/pages/goods/detail?${params}` } } } </script> <style> page { background: #fafafa; } </style> <style lang="scss" scoped> @import "./detail.scss"; </style>