You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
yanzong_qianduan/pages/activity/seckill.vue

556 lines
12 KiB

<template>
<view class="seckill">
<view>
<u-navbar title="限时秒杀" back-icon-color="#fff" :border-bottom="false" title-color="#fff"
:background="background"></u-navbar>
</view>
<view class="title" :style="{backgroundImage:'url('+backgroundImg+')'}" style="background-size: 100% 100%;" >
<image src="/static/seckill/topHeader.png" mode="" class="bgImg"></image>
<view class="limitTitle">
<image src="/static/seckill/limit.png" mode="" class="img"></image>
</view>
<view class="time" v-if="tabbar.length">
<view class="timeItem" v-for="(item,index) in tabbar" :key="index" @click="handleTab(index)" >
<view class="num" :class="[index==curTabIndex ? 'numselected' : '']">
{{item.active_time}}
</view>
<view class="desc" :class="[index==curTabIndex ? 'descselected' : '']">
{{item.status_text}}
</view>
</view>
</view>
</view>
<view class="main">
<view class="over" v-if="tabbar.length">
<view class="info">
距秒杀<text
class="m-r-10">{{ tabbar[curTabIndex].status == ActiveStatusEnum.STATE_BEGIN.value ? '结束' : '开始' }}</text>还剩
<count-down style='display: inline-block;' :date="tabbar[curTabIndex].count_down_time"
separator="colon" theme="custom" />
</view>
</view>
<view class="goodsList">
<view class="goodItem" v-for="(item,index) in goodsList" :key="index"
@click="handleTargetGoods(item.goods_id)">
<view class="itemImg">
<image :src="item.goods_image" mode="widthFix" class="goodsImg"></image>
</view>
<view class="goodsInfo">
<view class="name">
{{item.goods_name}}
</view>
<view class="sellNum">
爆卖{{item.sales_actual}}件
</view>
<view class="info">
<view class="price">
¥{{item.original_price}}
</view>
<view class="delPrice">
<view class="delText">
直降{{item.original_price-item.seckill_price_min}}元
</view>
</view>
<view class="update">
即将调整
</view>
</view>
<view class="line">
<image src="/static/seckill/line.png" mode=""></image>
</view>
<view class="btn" v-if="tabbar.length">
<view class="killPrice">
秒杀价¥<text>{{item.seckill_price_min}}</text>
</view>
<view class="buyNow">
马上抢
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import WxofficialMixin from '@/core/mixins/wxofficial'
import CountDown from '@/components/countdown'
import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins'
import {
hex2rgba
} from '@/utils/color'
import {
getEmptyPaginateObj,
getMoreListData
} from '@/core/app'
import {
ActiveStatusEnum
} from '@/common/enum/sharp'
import * as Api from '@/api/activity'
const pageSize = 15
export default {
components: {
CountDown
},
mixins: [MescrollMixin, WxofficialMixin],
data() {
return {
// 是否正在加载中
isLoading: true,
// 当前tab索引
curTabIndex: 0,
// 上拉加载配置
upOption: {
// 首次自动执行
auto: false,
// 每页数据的数量; 默认10
page: {
size: pageSize
},
// 数量要大于3条才显示无更多数据
noMoreSize: 3,
},
// 枚举类
ActiveStatusEnum,
// 秒杀活动场次
tabbar: [],
// 秒杀商品列表
goodsList: [],
background: {
background: 'url(https://www.royaum.com.cn/static/rank/rank1.png) center top no-repeat',
backgroundSize: '100% auto',
},
backgroundImg:'',
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.getCarouselList()
// 加载页面数据
this.onRefreshPage()
// 设置微信公众号链接分享卡片内容
this.setWxofficialShareData()
},
methods: {
// 获取背景图
getCarouselList() {
const app = this;
Api.getImage({
type: 2
})
.then(result => {
app.backgroundImg = result.data.imgurl
})
.finally(() => app.isLoading = false)
},
// 加载页面数据
onRefreshPage() {
const app = this
return new Promise((resolve, reject) => {
Api.data()
.then(result => {
app.tabbar = result.data.tabbar;
app.goodsList = result.data.goodsList.data
if(app.goodsList && app.goodsList.length > 0){
app.goodsList.map(a=>{
a.original_price = Number(a.original_price)
a.seckill_price_max = Number(a.seckill_price_max)
a.seckill_price_min = Number(a.seckill_price_min)
})
}
app.curTabIndex = 0
if (!app.goodsList.length) {
app.mescroll.showEmpty()
}
resolve()
})
.catch(reject)
})
},
/**
* 获取商品列表
* @param {Number} pageNo 页码
*/
getListData(pageNo = 1) {
const app = this
const activeTimeId = app.getCurTabbarId()
let pamars = {
// store_id: 10001,
activeTimeId: activeTimeId,
}
console.log(activeTimeId)
return new Promise((resolve, reject) => {
Api.sharplist(pamars)
.then(result => {
// 合并新数据
let newList = result.data.list
app.goodsList = getMoreListData(newList, app.goodsList, pageNo)
resolve(newList)
})
.catch(reject)
})
},
// 下拉刷新的回调
downCallback() {
this.onRefreshPage()
.finally(() => this.mescroll.endSuccess())
},
/**
* 上拉加载的回调
* 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10
* @param {Object} page
*/
upCallback(page) {
const app = this
// 设置列表数据
app.getListData(page.num)
.then(list => {
const curPageLen = list.data.length
const totalSize = list.data.total
app.mescroll.endBySize(curPageLen, totalSize)
})
.catch(() => app.mescroll.endErr())
},
// 点击切换标签(会场场次)
handleTab(index) {
const app = this
console.log(this)
app.curTabIndex = index
app.goodsList = app.getListData()
// // 刷新列表数据
// app.goodsList = getEmptyPaginateObj()
// app.mescroll.resetUpScroll()
},
// 获取当前选择的会场
getCurTabbar() {
return this.tabbar[this.curTabIndex]
},
// 获取当前会场场次ID
getCurTabbarId() {
const curTabbar = this.getCurTabbar()
console.log(curTabbar)
return curTabbar ? curTabbar.active_time_id : 0
},
// 跳转到秒杀商品详情
handleTargetGoods(sharpGoodsId) {
let count_down_time = new Date(this.tabbar[this.curTabIndex].count_down_time.replace(/-/g, '/')).getTime()-new Date().getTime()
uni.navigateTo({
url: '/pages/goods/detail?goodsId=' + sharpGoodsId+"&isSeckill="+true+'&isBuy='+count_down_time+'&seckillText='+(this.tabbar[this.curTabIndex].status == this.ActiveStatusEnum.STATE_BEGIN.value ? '结束' : '开始' )
})
},
// 设置微信公众号链接分享卡片内容
setWxofficialShareData() {
this.updateShareCardData({
title: '整点秒杀会场'
})
},
},
/**
* 分享当前页面
*/
onShareAppMessage() {
// 构建页面参数
const params = this.$getShareUrlParams()
return {
title: '整点秒杀会场',
path: `/pages/sharp/index?${params}`
}
},
/**
* 分享到朋友圈
* 本接口为 Beta 版本,暂只在 Android 平台支持,详见分享到朋友圈 (Beta)
* https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share-timeline.html
*/
onShareTimeline() {
// 构建页面参数
const params = this.$getShareUrlParams()
return {
title: '整点秒杀会场',
path: `/pages/sharp/index?${params}`
}
},
}
</script>
<style lang="scss" scoped>
.seckill {
width: 100%;
height: 100%;
}
.active{
background-color: #A9A9A9;
}
.title {
width: 100%;
height: 500rpx;
position: relative;
.bgImg {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
.limitTitle {
display: flex;
justify-content: center;
z-index: 20;
.img {
margin-top: 20rpx;
width: 302rpx;
height: 82rpx;
z-index: 20;
}
}
.time {
display: flex;
align-items: center;
width: 100%;
//justify-content: space-around;
z-index: 30;
overflow: auto;
bottom: 0;
position: absolute;
.timeItem {
margin-bottom: 25rpx;
padding: 0 0 0 20rpx;
.num {
width: 150rpx;
font-size: 40rpx;
font-weight: 500;
color: #C3C3C3;
line-height: 33rpx;
text-shadow: 0px 0px 11px #FB3A22;
text-align: center;
margin-top: 10rpx;
}
.numselected{
color:#ffffff;
}
.desc {
width: 150rpx;
height: 40rpx;
//background: #FFFFFF;
border-radius: 62rpx 62rpx 62rpx 62rpx;
opacity: 1;
font-size: 28rpx;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #C3C3C3;
line-height: 40rpx;
margin-top: 10rpx;
text-align: center;
}
.descselected{
color:#FB3D27;
background: #FFFFFF;
}
}
}
}
.main {
width: 100%;
height: 100%;
background: #F4F6FA;
border-radius: 0rpx 0rpx 0rpx 0rpx;
opacity: 1;
padding-top: 34rpx;
.over {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 28rpx;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #3C3C3C;
.info {
line-height: 40rpx;
margin-right: 18rpx;
}
.com {
width: 54rpx;
height: 48rpx;
background: #252525;
border-radius: 4rpx 4rpx 4rpx 4rpx;
opacity: 1;
font-size: 32rpx;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 48rpx;
text-align: center;
}
.hou {
margin-right: 4rpx;
}
.min {
margin: 0 4rpx;
}
.sec {
margin-left: 4rpx;
}
}
}
.goodsList {
overflow: hidden;
.goodItem {
width: 686rpx;
height: 342rpx;
background: #FFFFFF;
border-radius: 8rpx;
opacity: 1;
display: flex;
padding: 48rpx 32rpx 36rpx 0;
margin: 0 auto;
margin-top: 22rpx;
.itemImg {
width: 258rpx;
height: 258rpx;
margin-right: 10rpx;
.goodsImg {
width: 100%;
height: 100%;
}
}
.goodsInfo {
.name {
height: 44rpx;
font-size: 32rpx;
font-weight: 400;
color: #0E0E0E;
line-height: 44rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 350rpx;
}
.sellNum {
font-size: 32rpx;
font-weight: 400;
color: #A9A9A9;
line-height: 44rpx;
margin-left: 10rpx;
margin-bottom: 8rpx;
}
.info {
display: flex;
.price {
height: 40rpx;
font-size: 28rpx;
font-weight: 400;
color: #979797;
line-height: 40rpx;
}
.delPrice {
width: 132rpx;
height: 48rpx;
font-size: 20rpx;
font-weight: 400;
color: #FB402B;
line-height: 23rpx;
background-image: url('https://www.royaum.com.cn/static/seckill/bottom.png');
background-size: 100% 100%;
margin: 0 12rpx 0 14rpx;
.delText {
width: 132rpx;
text-align: center;
margin-top: 8rpx;
}
}
.update {
width: 112rpx;
height: 40rpx;
font-size: 28rpx;
font-weight: 400;
color: #979797;
line-height: 40rpx;
}
}
.line {
width: 302rpx;
height: 30rpx;
margin-left: 22rpx;
image {
width: 100%;
height: 100%;
}
}
.btn {
margin-top: 14rpx;
width: 390rpx;
height: 70rpx;
border-radius: 96rpx;
opacity: 1;
text-align: center;
line-height: 70rpx;
display: flex;
justify-content: space-between;
background-image: url('https://www.royaum.com.cn/static/seckill/btnBg.png');
background-size: 100% 100%;
.killPrice {
font-size: 20rpx;
font-weight: 500;
color: #FF423D;
margin-left: 26rpx;
text{
font-size: 34rpx;
}
}
.buyNow {
width: 120rpx;
font-size: 28rpx;
font-weight: 500;
text-align: center;
color: #FFFFFF;
margin-right: 14rpx;
}
}
}
}
}
</style>