Files
yunxinwei-uniapp/pages/bargain/goods/index.vue
2023-08-04 13:04:21 +08:00

414 lines
13 KiB
Vue
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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">
<view class="active-tag">
<text>限时砍价</text>
</view>
<!-- 砍价底价 -->
<text class="floor-price__samll"></text>
<text class="floor-price">{{ active.floor_price }}</text>
<!-- 商品原价 -->
<text class="original-price">{{ goods.goods_price_min }}</text>
</view>
<view class="block-right dis-flex">
<!-- 销量 -->
<view class="goods-sales">
<text>已砍成{{ active.active_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 v-if="active.is_end == false" class="info-item info-item_status info-item_countdown dis-flex flex-y-center">
<text class="countdown-icon iconfont icon-naozhong"></text>
<text>距离活动结束</text>
<text class="m-r-10">还剩</text>
<count-down :date="active.end_time" separator="zh" theme="text" />
</view>
<!-- 活动已结束 -->
<view v-if="active.is_end == true" class="info-item info-item_status info-item_end">
<text class="countdown-icon iconfont icon-naozhong"></text>
<text>砍价活动已结束下次记得早点来哦~</text>
</view>
</view>
<!-- 砍价玩法 -->
<view class="bargain-rules m-top20 b-f" @click="handleShowRules()">
<view class="item-title dis-flex">
<view class="block-left flex-box">
<text>砍价玩法</text>
</view>
<view class="block-right">
<text class="show-more col-9">查看规则</text>
</view>
</view>
<!-- 砍价步骤 -->
<view class="rule-simple dis-flex flex-x-around">
<view class="simple-item dis-flex flex-dir-column flex-y-center">
<view class="i-number dis-flex flex-x-center flex-y-center">
<text class="f-30">1</text>
</view>
<view class="i-text f-28">点击砍价</view>
</view>
<view class="simple-item dis-flex flex-dir-column flex-y-center">
<view class="i-number dis-flex flex-x-center flex-y-center">
<text class="f-30">2</text>
</view>
<view class="i-text f-28">找人帮砍</view>
</view>
<view class="simple-item dis-flex flex-dir-column flex-y-center">
<view class="i-number dis-flex flex-x-center flex-y-center">
<text class="f-30">3</text>
</view>
<view class="i-text f-28">砍到最低</view>
</view>
<view class="simple-item dis-flex flex-dir-column flex-y-center">
<view class="i-number dis-flex flex-x-center flex-y-center">
<text class="f-30">4</text>
</view>
<view class="i-text f-28">优惠购买</view>
</view>
</view>
</view>
<!-- 选择商品规格 -->
<view v-if="goods.spec_type == 20" class="goods-choice m-top20 b-f" @click="onShowSkuPopup()">
<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" :active="active" :goods="goods" />
<!-- 商品评价 -->
<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>
<block v-if="goods.content != ''">
<view class="goods-content__detail b-f">
<mp-html :content="goods.content" />
</view>
</block>
<empty v-else tips="亲,暂无商品描述" />
</view>
<!-- 底部选项卡 -->
<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 v-if="!isShowCustomerBtn" 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="active.is_start && !active.is_end" class="btn-item btn--main" @click="handleMainBtn(3)">
<text>{{ isPartake? '继续砍价' : '立即砍价' }}</text>
</view>
<button v-else class="btn-item btn--gray">
<text>{{ active.is_end ? '活动已结束' : '活动未开启' }}</text>
</button>
</view>
</view>
</view>
</view>
<!-- 分享菜单 -->
<share-sheet v-model="showShareSheet" :shareTitle="goods.goods_name" :shareImageUrl="goods.goods_image" :posterApiCall="posterApiCall" :posterApiParam="{ activeId }" />
<!-- 砍价规则弹窗 -->
<u-modal v-if="!isLoading" v-model="showRules" title="砍价规则">
<scroll-view style="height: 610rpx;" :scroll-y="true">
<view class="pops-content">
<text>{{ setting.rulesDesc }}</text>
</view>
</scroll-view>
</u-modal>
</view>
</template>
<script>
import { getSceneData } from '@/core/app'
import ShareSheet from '@/components/share-sheet'
import CustomerBtn from '@/components/customer-btn'
import SkuPopup from './components/SkuPopup'
import SlideImage from '../../goods/components/SlideImage'
import Comment from '../../goods/components/Comment'
// import Service from '../../goods/components/Service'
import CountDown from '@/components/countdown'
import * as GoodsApi from '@/api/goods'
import * as CartApi from '@/api/cart'
import * as ActiveApi from '@/api/bargain/active'
import SettingModel from '@/common/model/Setting'
export default {
components: {
ShareSheet,
CustomerBtn,
// Shortcut,
SlideImage,
SkuPopup,
Comment,
// Service,
CountDown
},
data() {
return {
// 正在加载
isLoading: true,
// 显示/隐藏SKU弹窗
showSkuPopup: false,
// 模式 1:都显示 2:只显示购物车 3:只显示立即购买
skuMode: 3,
// 显示/隐藏分享菜单
showShareSheet: false,
// 显示砍价规则
showRules: false,
// 获取商品海报图api方法
posterApiCall: ActiveApi.poster,
// 当前活动ID
activeId: null,
// 当前商品ID
goodsId: null,
// 活动详情
active: {},
// 商品详情
goods: {},
// 砍价设置
setting: null,
// 标记当前用户是否正在参与
isPartake: null,
// 砍价任务ID (当前用户参与的话才有值)
taskId: null,
// 购物车总数量
cartTotal: 0,
// 是否显示在线客服按钮
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.activeId = query.activeId ? parseInt(query.activeId) : parseInt(scene.aid)
this.goodsId = query.goodsId ? parseInt(query.goodsId) : parseInt(scene.gid)
},
// 刷新页面数据
onRefreshPage() {
const app = this
app.isLoading = true
Promise.all([app.getActiveDetail(), app.getGoodsDetail(), app.getCartTotal()])
.then(() => app.isLoading = false)
},
// 获取砍价活动详情
getActiveDetail() {
const app = this
return new Promise((resolve, reject) => {
ActiveApi.detail(app.activeId)
.then(result => {
app.active = result.data.active
app.setting = result.data.setting
app.isPartake = result.data.isPartake
app.taskId = result.data.taskId
resolve(result)
})
.catch(reject)
})
},
// 获取商品信息
getGoodsDetail() {
const app = this
return new Promise((resolve, reject) => {
GoodsApi.detail(app.goodsId, false)
.then(result => {
app.goods = result.data.detail
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)
})
},
/**
* 显示/隐藏SKU弹窗
*/
onShowSkuPopup() {
this.showSkuPopup = !this.showSkuPopup
},
// 显示隐藏分享菜单
onShowShareSheet() {
this.showShareSheet = !this.showShareSheet
},
// 显示砍价规则
handleShowRules() {
this.showRules = true
},
// 跳转到首页
onTargetHome(e) {
this.$navTo('pages/index/index')
},
// 跳转到购物车页
onTargetCart() {
this.$navTo('pages/cart/index')
},
// 点击主按钮
handleMainBtn() {
const app = this
// 发起新的砍价任务
if (!app.isPartake) {
return app.onShowSkuPopup()
}
// 已发起砍价则跳转到砍价任务详情页
app.$navTo('pages/bargain/task', { taskId: app.taskId })
},
},
/**
* 分享当前页面
*/
onShareAppMessage() {
// 构建页面参数
const app = this
const params = app.$getShareUrlParams({
activeId: app.activeId,
goodsId: app.goodsId
})
return {
title: app.goods.goods_name,
path: `/pages/bargain/goods/index?${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({
activeId: app.activeId,
goodsId: app.goodsId
})
return {
title: app.goods.goods_name,
path: `/pages/bargain/goods/index?${params}`
}
},
}
</script>
<style>
page {
background: #fafafa;
}
</style>
<style lang="scss" scoped>
@import "./style.scss";
</style>