<template> <view v-if="!isLoading && detail && goods" class="container" :style="appThemeStyle"> <!-- 背景区块 --> <view class="bg-layer"></view> <!-- 商品信息 --> <view class="goods-info" @click="onTargetGoods()"> <view class="goods-image"> <view v-if="detail.active_type != ActiveTypeEnum.NORMAL.value" class="label"> <text>{{ ActiveTypeEnum[detail.active_type].name2 }}</text> </view> <image class="image" :src="goods.goods_image"></image> </view> <view class="goods-detail"> <view class="goods-name"> <text class="twoline-hide">{{ goods.goods_name }}</text> </view> <view class="goods-price"> <text class="f-26 col-m">¥</text> <text class="m-price">{{ goods.groupon_price }}</text> <text class="line-price">¥{{ goods.original_price }}</text> </view> <view class="goods-tag"> <text class="tag-item">{{ detail.people }}人团</text> <text v-if="goods.diff_price != '0.00'" class="tag-item">拼团省{{ goods.diff_price }}元</text> </view> </view> </view> <!-- 拼团成员 --> <view class="main"> <!-- 拼团状态 (成功、失败) --> <view v-if="detail.status == TaskStatusEnum.FAIL.value" class="main_status main_status__fail"> <text class="status-icon iconfont icon-shibai"></text> <text>超过有效时间,拼团失败</text> </view> <view v-if="detail.status == TaskStatusEnum.SUCCESS.value" class="main_status main_status__success"> <text class="status-icon iconfont icon-success"></text> <text>拼团已成功</text> </view> <!-- 参团用户 --> <view class="main-user"> <view v-for="(item, index) in detail.users" :key="item.id" class="user-item"> <avatar-image :url="item.userInfo.avatar_url" :width="100" /> <view v-if="item.is_leader" class="user-role"><text class="role-name">团长</text></view> </view> <!-- 虚位以待 --> <view v-for="(val, idx) in detail.people - detail.joined_people" :key="idx" class="user-item user-item__wait"> <text class="iconfont icon-wenhao"></text> </view> </view> <!-- 拼单状态:拼团中 --> <view v-if="detail.status == TaskStatusEnum.NORMAL.value" class="main_tiem"> <text>还差</text> <text class="main_timer_color">{{ detail.people - detail.joined_people }}</text> <text>个名额,</text> <!-- 倒计时 --> <count-down :date="detail.end_time" separator="colon" theme="custom" customBgColor="#FE5246" /> <text>后结束</text> </view> <!-- 操作按钮 --> <block v-if="detail.status == TaskStatusEnum.NORMAL.value"> <view v-if="!detail.is_join" class="button" @click="onShowSkuPopup()">立即参团</view> <!-- 分享给朋友 --> <button v-else open-type="share" class="button btn-normal" @click="handleShareBtn()"> <view class="btn-item btn-item__main"><text>立即分享</text></view> </button> </block> <view v-else class="button" @click="onTargetGoods()">去开团</view> </view> <!-- 拼团须知 --> <view class="notice" @click="handleShowRules()"> <text class="f-30">拼团须知</text> <text class="t-brief">{{ setting.ruleBrief }}</text> <text class="icon-arrow"></text> </view> <!-- 商品SKU弹窗 --> <SkuPopup v-model="showSkuPopup" :skuMode="skuMode" :goods="goods" :buyMode="1" :taskId="detail.task_id" :stepPeople="detail.people" /> <!-- 拼团规则弹窗 --> <u-modal v-model="showRules" title="拼团规则"> <scroll-view style="height: 610rpx; touch-action: none;" :scroll-y="true"> <view class="pops-content"> <text>{{ setting.ruleDetail }}</text> </view> </scroll-view> </u-modal> <!-- 商品推荐 --> <recommended /> </view> </template> <script> import WxofficialMixin from '@/core/mixins/wxofficial' import { getCurrentPage, buildUrL } from '@/core/app' import AvatarImage from '@/components/avatar-image' import CountDown from '@/components/countdown' import Recommended from '@/components/recommended' import SkuPopup from '../goods/components/SkuPopup' import { ActiveTypeEnum, ActiveStatusEnum, TaskStatusEnum } from '@/common/enum/groupon' import * as TaskApi from '@/api/groupon/task' import StoreModel from '@/common/model/Store' import GrouponSettingModel from '@/common/model/groupon/Setting' export default { components: { AvatarImage, SkuPopup, CountDown, Recommended }, mixins: [WxofficialMixin], data() { return { // 正在加载 isLoading: true, // 枚举类 ActiveTypeEnum, ActiveStatusEnum, TaskStatusEnum, // 显示拼团规则 showRules: false, // 显示/隐藏SKU弹窗 showSkuPopup: false, // 按钮模式 1:都显示 2:只显示购物车 3:只显示立即购买 skuMode: 3, // 当前拼单ID taskId: null, // 拼单详情 detail: null, // 拼团商品 goods: null, // 拼团设置 setting: {} } }, /** * 生命周期函数--监听页面加载 */ onLoad({ taskId }) { // 记录拼单ID this.taskId = taskId // 获取拼团设置 this.getSetting() // 获取拼单详情 this.getTaskDetail() }, methods: { // 获取拼团设置 getSetting() { GrouponSettingModel.data().then(setting => (this.setting = setting)) }, // 获取拼单详情 getTaskDetail() { const { taskId } = this this.isLoading = true TaskApi.detail(taskId) .then(result => { this.detail = result.data.detail this.goods = result.data.goods // 设置微信公众号链接分享卡片内容 this.setWxofficialShareData() }) .finally(() => (this.isLoading = false)) }, // 跳转到拼团商品详情 onTargetGoods() { const { goods } = this this.$navTo('pages/groupon/goods/index', { grouponGoodsId: goods.groupon_goods_id }) }, // 点击分享按钮 handleShareBtn() { // #ifndef MP this.handleCopyLink() // #endif }, // 复制当前页面链接 handleCopyLink() { const app = this app.getShareUrl().then(shareUrl => { // 复制到剪贴板 uni.setClipboardData({ data: shareUrl, success: () => app.$toast('复制链接成功,快去发送给朋友吧'), fail: ({ errMsg }) => app.$toast('复制失败 ' + errMsg) }) }) }, // 获取分享链接 (H5外链) getShareUrl() { const { path, query } = getCurrentPage() return new Promise((resolve, reject) => { // 获取h5站点地址 StoreModel.h5Url().then(baseUrl => { // 生成完整的分享链接 const shareUrl = buildUrL(baseUrl, path, query) resolve(shareUrl) }) }) }, // 显示拼团规则 handleShowRules() { this.showRules = true }, // 显示/隐藏SKU弹窗 onShowSkuPopup() { this.showSkuPopup = !this.showSkuPopup }, // 设置微信公众号链接分享卡片内容 setWxofficialShareData() { const { detail, goods } = this this.updateShareCardData({ title: goods.goods_name, desc: goods.selling_point, imgUrl: goods.goods_image }) }, }, /** * 分享当前页面 */ onShareAppMessage() { // 构建页面参数 const app = this const params = app.$getShareUrlParams({ taskId: app.taskId }) return { title: app.goods.goods_name, path: `/pages/groupon/task/index?${params}` } }, /** * 分享到朋友圈 */ onShareTimeline() { // 构建页面参数 const app = this const params = app.$getShareUrlParams({ taskId: app.taskId }) return { title: app.goods.goods_name, path: `/pages/groupon/task/index?${params}` } }, } </script> <style lang="scss" scoped> .container { position: relative; overflow: hidden; } // 箭头图标 .icon-arrow { display: inline-block; width: 0; height: 0; border-width: 10rpx; border-style: solid; border-color: transparent transparent transparent #ccc; } // 背景区块 .bg-layer { position: absolute; top: 0; width: 100%; z-index: 0; height: 250rpx; text-align: center; line-height: 100rpx; &::after { width: 140%; height: 250rpx; position: absolute; left: -20%; top: 0; z-index: -1; content: ''; border-radius: 0 0 50% 50%; background-image: linear-gradient(180deg, #ff5644, #fd7524); } } // 商品信息 .goods-info { position: relative; margin: auto; margin-top: 30rpx; padding: 28rpx; padding-bottom: 22rpx; width: 92%; background: #fff; border-radius: 10rpx; box-sizing: border-box; box-shadow: 0px 5px 12px rgba(226, 226, 226, 0.62); display: flex; .goods-image { position: relative; margin-right: 30rpx; .label { position: absolute; top: 0; left: 0; z-index: 1; background: linear-gradient(to right, #ffa600, #f5b914); color: #fff; font-size: 24rpx; padding: 6rpx 8rpx; border-radius: 8rpx; } .image { display: block; width: 240rpx; height: 240rpx; border-radius: 10rpx; } } .goods-detail { background: #fff; .goods-name { display: block; font-size: 28rpx; line-height: 1.5; } .goods-price { margin: 20rpx 0; color: #eb5841; .m-price { display: inline-block; font-size: 40rpx; } .line-price { display: inline-block; margin: 10rpx; font-size: 24rpx; color: #8e8e8e; text-decoration: line-through; } } .goods-tag { margin-bottom: -10rpx; .tag-item { display: inline-block; padding: 4rpx 12rpx; font-size: 24rpx; line-height: 36rpx; border-radius: 5rpx; color: #fa3534; background: #fef0f0; margin-right: 10rpx; margin-bottom: 10rpx; box-sizing: border-box; } } } &:after { display: block; clear: both; content: ''; visibility: hidden; height: 0; } } // 拼团成员 .main { position: relative; margin: auto; margin-top: 30rpx; padding: 50rpx 20rpx; background: #fff; box-sizing: border-box; .main-user { display: flex; flex-wrap: wrap; justify-content: center; margin: 0 auto; width: 600rpx; margin-bottom: 30rpx; .user-item { width: 100rpx; height: 100rpx; margin: 0 25rpx 25rpx 0; position: relative; box-sizing: border-box; &:nth-child(5n + 0) { margin-right: 0; } .user-role { width: 100%; text-align: center; height: 40rpx; position: absolute; left: 0; bottom: -1rpx; .role-name { background: #eb5841; border-radius: 15rpx; display: inline-block; line-height: 1.4; font-size: 24rpx; color: #fff; width: 78rpx; } } &.user-item__wait { border-radius: 50%; background: #f8f8f8; border: 1rpx dashed #dbdbdb; display: flex; justify-content: center; align-items: center; text { color: #dbdbdb; font-size: 38rpx; } } } } .button { display: block; margin-top: 40rpx; width: 550rpx; line-height: 84rpx; font-size: 28rpx; background-image: linear-gradient(90deg, #fe5246, #fb265a); border: none; box-shadow: 0px 3px 8px rgba(255, 8, 15, 0.25); text-align: center; margin: 0 auto; color: #fff; border-radius: 40rpx; animation: btn_anim 0.9s linear infinite; transform-origin: center; } } // 按钮动画 @keyframes btn_anim { 0% { -webkit-transform: scale(1); transform: scale(1); } 40% { -webkit-transform: scale(1.05); transform: scale(1.05); } } /* 拼团状态 */ .main_status { margin-bottom: 40rpx; font-size: 35rpx; text-align: center; .status-icon { margin-right: 15rpx; } } .main_status__fail { color: $main-bg; } .main_status__success { color: #08b625; } /* 倒计时 */ .main_tiem { margin-bottom: 50rpx; font-size: 30rpx; text-align: center; display: flex; justify-content: center; .main_timer_color { color: #fc8434; margin: 0 6rpx; } } // 拼团须知 .notice { display: flex; margin: auto; margin-top: 30rpx; padding: 35rpx 20rpx; background: #fff; border-radius: 10rpx; box-sizing: border-box; justify-content: space-between; align-items: center; .t-brief { font-size: 26rpx; color: #a6a6a6; } } // 拼团规则 (弹窗) .pops-content { padding: 30rpx 48rpx; font-size: 28rpx; line-height: 44rpx; text-align: left; color: #606266; min-height: 320rpx; max-height: 640rpx; box-sizing: border-box; } </style>