@ -0,0 +1,339 @@ |
||||
<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> |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 588 B |
After Width: | Height: | Size: 577 B |
After Width: | Height: | Size: 329 B |
After Width: | Height: | Size: 695 B |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 160 B |
After Width: | Height: | Size: 655 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 626 KiB |
After Width: | Height: | Size: 786 B |