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.
480 lines
11 KiB
480 lines
11 KiB
3 years ago
|
<template>
|
||
|
<view class="container">
|
||
|
<view class="tui-bg__box">
|
||
|
<image :src="`${$VUE_APP_RESOURCES_URL}/images/bg_seckill.png`" class="tui-bg__img" mode="widthFix" :style="{ opacity: opacity }"></image>
|
||
|
</view>
|
||
|
<view class="tui-header__bg">
|
||
|
<image :src="`${$VUE_APP_RESOURCES_URL}/images/bg_seckill.png`" class="tui-bg__img" mode="widthFix"></image>
|
||
|
<scroll-view class="tui-time-slot" scroll-x>
|
||
|
<view class="tui-time__list" :class="{ 'tui-flex__between': timeList.length < 6 }">
|
||
|
<view class="tui-time__item" :class="[timeList.length < 6 ? 'tui-flex__1' : 'tui-width__min', index == active ? 'tui-time__active' : '']" v-for="(item, index) in timeList" :key="index" @tap="setTime(index)">
|
||
|
<view class="tui-time">{{ item.time }}</view>
|
||
|
<view class="tui-status">{{ item.state }}</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
</scroll-view>
|
||
|
</view>
|
||
|
<view class="tui-body">
|
||
|
<block v-for="(item, index) in timeList" :key="index">
|
||
|
<view class="tui-status__box" v-if="active == index">
|
||
|
<view class="tui-full__width" v-if="item.status == 0">
|
||
|
<tui-divider gradual width="80%" backgroundColor="#fff" :height="34">
|
||
|
<view class="tui-divider__status">
|
||
|
<image :src="`${$VUE_APP_RESOURCES_URL}/images/img_seckill.png`" mode="widthFix"></image>
|
||
|
<text class="tui-color__red">{{ item.time }}</text>
|
||
|
<text>{{ item.state }}</text>
|
||
|
</view>
|
||
|
</tui-divider>
|
||
|
</view>
|
||
|
<view class="tui-full__width" v-if="item.status == 2">
|
||
|
<tui-divider gradual width="80%" backgroundColor="#fff" :height="34">
|
||
|
<view class="tui-divider__status">
|
||
|
<image :src="`${$VUE_APP_RESOURCES_URL}/images/img_seckill.png`" mode="widthFix"></image>
|
||
|
<text class="tui-color__red">{{ item.time }}</text>
|
||
|
<text>{{ item.state }}</text>
|
||
|
</view>
|
||
|
</tui-divider>
|
||
|
</view>
|
||
|
<view class="tui-countdown__box" v-if="item.status == 1 || item.status == 2">
|
||
|
<text>距离{{ item.status == 1 ? '结束还剩' : '开始还有' }}</text>
|
||
|
<count-down :isDay="true" :tipText="'倒计时 '" :dayText="' 天 '" :hourText="' 时 '" :minuteText="' 分 '" :secondText="' 秒'" :datatime="item.stop"></count-down>
|
||
|
</view>
|
||
|
</view>
|
||
|
</block>
|
||
|
|
||
|
<view class="tui-list__goods">
|
||
|
<view class="tui-goods__left">
|
||
|
<block v-for="(item, index) in seckillList" :key="index">
|
||
|
<t-goods-item v-if="index % 2 == 0" :item="item" :timeList="timeList" :active="active" :isList="false" @goDetail="goDetail"></t-goods-item>
|
||
|
</block>
|
||
|
</view>
|
||
|
<view class="tui-goods__right">
|
||
|
<block v-for="(item, index) in seckillList" :key="index">
|
||
|
<t-goods-item v-if="index % 2 !== 0" :item="item" :timeList="timeList" :active="active" :isList="false" @goDetail="goDetail"></t-goods-item>
|
||
|
</block>
|
||
|
</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
</template>
|
||
|
<script>
|
||
|
import { getSeckillConfig, getSeckillList } from '@/api/activity'
|
||
|
import CountDown from '@/components/CountDown'
|
||
|
|
||
|
// import { Tab, Tabs } from "vant-weapp";
|
||
|
import Loading from '@/components/Loading'
|
||
|
|
||
|
export default {
|
||
|
name: 'GoodsSeckill',
|
||
|
components: {
|
||
|
CountDown,
|
||
|
},
|
||
|
props: {},
|
||
|
data: function() {
|
||
|
return {
|
||
|
headerImg: '',
|
||
|
timeList: [],
|
||
|
sticky: false,
|
||
|
loading: false,
|
||
|
datatime: 0,
|
||
|
active: 0,
|
||
|
seckillList: [],
|
||
|
status: false, //砍价列表是否获取完成 false 未完成 true 完成
|
||
|
loadingList: false, //当前接口是否请求完成 false 完成 true 未完成
|
||
|
page: 1, //页码
|
||
|
limit: 5, //数量
|
||
|
title: [],
|
||
|
opacity: 1,
|
||
|
}
|
||
|
},
|
||
|
mounted: function() {
|
||
|
this.mountedStart()
|
||
|
},
|
||
|
onReachBottom() {
|
||
|
!this.loadingList && this.getSeckillList()
|
||
|
},
|
||
|
filters: {
|
||
|
getStatusText(status) {
|
||
|
let text = ['活动已结束', '正在疯抢', '即将开抢'][status - 1]
|
||
|
return text
|
||
|
},
|
||
|
},
|
||
|
methods: {
|
||
|
changeTime: function(index) {
|
||
|
this.active = index
|
||
|
this.getSeckillList()
|
||
|
},
|
||
|
mountedStart: function() {
|
||
|
var that = this
|
||
|
uni.showLoading()
|
||
|
getSeckillConfig().then(res => {
|
||
|
that.$set(that, 'headerImg', res.data.lovely)
|
||
|
that.$set(that, 'timeList', res.data.seckillTime)
|
||
|
that.$set(that, 'active', res.data.seckillTimeIndex)
|
||
|
|
||
|
let title = []
|
||
|
title = res.data.seckillTime.map((item, index) => {
|
||
|
return {
|
||
|
name: 'div',
|
||
|
attrs: {
|
||
|
class: 'timeItem',
|
||
|
},
|
||
|
children: [
|
||
|
{
|
||
|
name: 'div',
|
||
|
attrs: {
|
||
|
class: 'time',
|
||
|
},
|
||
|
children: [
|
||
|
{
|
||
|
type: 'text',
|
||
|
text: item.time,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
name: 'div',
|
||
|
attrs: {
|
||
|
class: 'state',
|
||
|
},
|
||
|
children: [
|
||
|
{
|
||
|
type: 'text',
|
||
|
text: item.state,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
}
|
||
|
})
|
||
|
that.$set(that, 'title', title)
|
||
|
that.datatime = that.timeList[that.active].stop
|
||
|
that.getSeckillList()
|
||
|
that.$nextTick(function() {
|
||
|
that.sticky = true
|
||
|
uni.hideLoading()
|
||
|
})
|
||
|
})
|
||
|
},
|
||
|
setTime: function(index) {
|
||
|
var that = this
|
||
|
that.page = 1
|
||
|
that.loadingList = false
|
||
|
that.status = false
|
||
|
that.active = index
|
||
|
that.datatime = that.timeList[that.active].stop
|
||
|
this.seckillList = []
|
||
|
that.getSeckillList()
|
||
|
},
|
||
|
getSeckillList: function() {
|
||
|
var that = this
|
||
|
if (that.loadingList) return
|
||
|
if (that.status) return
|
||
|
var time = that.timeList[that.active].id
|
||
|
getSeckillList(time, {
|
||
|
page: that.page,
|
||
|
limit: that.limit,
|
||
|
}).then(res => {
|
||
|
that.status = res.data.length < that.limit
|
||
|
that.seckillList.push.apply(that.seckillList, res.data)
|
||
|
that.page++
|
||
|
uni.hideLoading()
|
||
|
})
|
||
|
},
|
||
|
goDetail: function(item) {
|
||
|
var that = this
|
||
|
var time = that.timeList[that.active].stop
|
||
|
this.$yrouter.push({
|
||
|
path: '/pages/activity/SeckillDetails/index',
|
||
|
query: {
|
||
|
id: item.id,
|
||
|
time,
|
||
|
status: that.timeList[that.active].status,
|
||
|
},
|
||
|
})
|
||
|
},
|
||
|
onPageScroll(e) {
|
||
|
let scrollTop = e.scrollTop
|
||
|
if (scrollTop <= 2) {
|
||
|
this.opacity = 1
|
||
|
} else {
|
||
|
if (this.opacity <= 0) return
|
||
|
this.opacity = 1 - scrollTop / 40
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
</script>
|
||
|
<style scoped lang="less">
|
||
|
.tui-bg__box {
|
||
|
width: 100%;
|
||
|
height: 210rpx;
|
||
|
position: fixed;
|
||
|
left: 0;
|
||
|
top: 0;
|
||
|
z-index: 1;
|
||
|
}
|
||
|
|
||
|
.tui-header__bg {
|
||
|
width: 100%;
|
||
|
height: 120rpx;
|
||
|
position: fixed;
|
||
|
left: 0;
|
||
|
top: 0;
|
||
|
z-index: 3;
|
||
|
overflow: hidden;
|
||
|
}
|
||
|
|
||
|
.tui-bg__img {
|
||
|
width: 100%;
|
||
|
height: 210rpx;
|
||
|
display: block;
|
||
|
transition: opacity 0.1s linear;
|
||
|
}
|
||
|
|
||
|
.tui-body {
|
||
|
width: 100%;
|
||
|
position: relative;
|
||
|
margin-top: 120rpx;
|
||
|
z-index: 2;
|
||
|
padding: 0 25rpx;
|
||
|
box-sizing: border-box;
|
||
|
}
|
||
|
|
||
|
.tui-time-slot {
|
||
|
width: 100%;
|
||
|
height: 120rpx;
|
||
|
position: absolute;
|
||
|
left: 0;
|
||
|
top: 0;
|
||
|
}
|
||
|
|
||
|
.tui-time__list {
|
||
|
min-width: 100%;
|
||
|
height: 120rpx;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
}
|
||
|
|
||
|
.tui-flex__between {
|
||
|
justify-content: space-between;
|
||
|
}
|
||
|
|
||
|
.tui-time__item {
|
||
|
flex-shrink: 0;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
flex-direction: column;
|
||
|
justify-content: center;
|
||
|
color: #ffb2b2;
|
||
|
}
|
||
|
|
||
|
.tui-flex__1 {
|
||
|
flex: 1 !important;
|
||
|
}
|
||
|
|
||
|
.tui-width__min {
|
||
|
min-width: 150rpx;
|
||
|
}
|
||
|
|
||
|
.tui-time {
|
||
|
font-size: 32rpx;
|
||
|
line-height: 32rpx;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
|
||
|
.tui-status {
|
||
|
font-size: 24rpx;
|
||
|
line-height: 24rpx;
|
||
|
font-weight: 500;
|
||
|
padding-top: 16rpx;
|
||
|
}
|
||
|
|
||
|
.tui-time__active .tui-time {
|
||
|
color: #fff;
|
||
|
font-size: 36rpx;
|
||
|
line-height: 36rpx;
|
||
|
}
|
||
|
|
||
|
.tui-time__active .tui-status {
|
||
|
color: #fff;
|
||
|
font-size: 28rpx;
|
||
|
line-height: 28rpx;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
|
||
|
.tui-status__box {
|
||
|
width: 100%;
|
||
|
height: 146rpx;
|
||
|
background: #fff;
|
||
|
border-radius: 20rpx;
|
||
|
box-shadow: 0 3rpx 20rpx rgba(183, 183, 183, 0.1);
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.tui-full__width {
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
.tui-divider__status {
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
font-size: 28rpx;
|
||
|
color: #333;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
|
||
|
.tui-divider__status image {
|
||
|
width: 30rpx;
|
||
|
height: 30rpx;
|
||
|
margin-right: 10rpx;
|
||
|
flex-shrink: 0;
|
||
|
}
|
||
|
|
||
|
.tui-color__red {
|
||
|
color: #eb0909;
|
||
|
padding-right: 6rpx;
|
||
|
font-size: 32rpx;
|
||
|
font-weight: 500;
|
||
|
}
|
||
|
|
||
|
.tui-countdown__box {
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
color: #333;
|
||
|
font-size: 24rpx;
|
||
|
font-weight: 400;
|
||
|
margin-top: 16rpx;
|
||
|
}
|
||
|
|
||
|
.tui-countdown__box text {
|
||
|
padding-right: 12rpx;
|
||
|
}
|
||
|
|
||
|
/*======商品列表 start=======*/
|
||
|
.tui-list__goods {
|
||
|
width: 100%;
|
||
|
display: flex;
|
||
|
justify-content: space-between;
|
||
|
flex-wrap: wrap;
|
||
|
margin-top: 20rpx;
|
||
|
padding-bottom: 30rpx;
|
||
|
}
|
||
|
|
||
|
.tui-goods__left,
|
||
|
.tui-goods__right {
|
||
|
width: 49%;
|
||
|
}
|
||
|
|
||
|
.tui-full__width {
|
||
|
width: 100% !important;
|
||
|
}
|
||
|
|
||
|
/*======商品列表 end=======*/
|
||
|
|
||
|
.tui-goods__item {
|
||
|
width: 100%;
|
||
|
padding: 20rpx 20rpx 36rpx;
|
||
|
box-sizing: border-box;
|
||
|
border-radius: 12rpx;
|
||
|
background-color: #fff;
|
||
|
margin-bottom: 4%;
|
||
|
position: relative;
|
||
|
}
|
||
|
.tui-full__item {
|
||
|
display: flex;
|
||
|
margin-bottom: 20rpx !important;
|
||
|
padding: 20rpx !important;
|
||
|
}
|
||
|
.tui-img__newguest {
|
||
|
position: absolute;
|
||
|
width: 96rpx;
|
||
|
height: 32rpx;
|
||
|
left: 0;
|
||
|
top: 8rpx;
|
||
|
}
|
||
|
.tui-image__box {
|
||
|
width: 100%;
|
||
|
height: 300rpx;
|
||
|
}
|
||
|
.tui-full__imgbox {
|
||
|
width: 240rpx !important;
|
||
|
height: 240rpx !important;
|
||
|
margin-right: 20rpx;
|
||
|
}
|
||
|
.tui-goods__img {
|
||
|
max-width: 100%;
|
||
|
max-height: 300rpx;
|
||
|
display: block;
|
||
|
border-radius: 8rpx;
|
||
|
}
|
||
|
.tui-full__img {
|
||
|
max-height: 240rpx !important;
|
||
|
}
|
||
|
.tui-goods__content {
|
||
|
width: 100%;
|
||
|
padding-top: 16rpx;
|
||
|
}
|
||
|
.tui-full__content {
|
||
|
height: 240rpx;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
justify-content: space-between;
|
||
|
padding-top: 0 !important;
|
||
|
}
|
||
|
.tui-goods__title {
|
||
|
font-size: 26rpx;
|
||
|
font-weight: 400;
|
||
|
color: #333;
|
||
|
word-break: break-all;
|
||
|
overflow: hidden;
|
||
|
text-overflow: ellipsis;
|
||
|
display: -webkit-box;
|
||
|
-webkit-box-orient: vertical;
|
||
|
-webkit-line-clamp: 2;
|
||
|
margin-bottom: 20rpx;
|
||
|
}
|
||
|
.tui-tag__box {
|
||
|
display: flex;
|
||
|
padding-top: 25rpx;
|
||
|
padding-bottom: 25rpx;
|
||
|
}
|
||
|
.tui-box__bottom {
|
||
|
width: 100%;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
justify-content: space-between;
|
||
|
}
|
||
|
.tui-price__box {
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
}
|
||
|
.tui-price {
|
||
|
display: flex;
|
||
|
align-items: flex-end;
|
||
|
color: #eb0909;
|
||
|
}
|
||
|
.tui-price__small {
|
||
|
font-size: 24rpx;
|
||
|
line-height: 24rpx;
|
||
|
}
|
||
|
.tui-price__large {
|
||
|
font-size: 34rpx;
|
||
|
line-height: 32rpx;
|
||
|
font-weight: 600;
|
||
|
}
|
||
|
.tui-price__original {
|
||
|
font-size: 24rpx;
|
||
|
line-height: 24rpx;
|
||
|
text-decoration: line-through;
|
||
|
color: #999;
|
||
|
padding-top: 10rpx;
|
||
|
}
|
||
|
</style>
|