123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <template>
- <mescroll-body ref="mescrollRef" @init="mescrollInit" :up="upOption" @down="downCallback" @up="upCallback">
- <view class="goods-seckill">
- <view class="banner">
- <ad-swipers :pid="20" height="340rpx"></ad-swipers>
- </view>
- <view class="time-list">
- <scroll-view style="height: 120rpx; white-space: nowrap;" :scroll-into-view="'item-' + (active - 2)"
- scroll-x="true" scroll-with-animation="true">
- <view v-for="(item, index) in seckillTime" :key="index" :id="'item-' + index"
- class="time-item flex-col row-center col-center" :class="{active: index == active}"
- @tap="exchangeTime(index)">
- <view :class="'xl bold time'">{{ item.start_time }}</view>
- <view :class="'sm br60 state ' + ( item.status === 2 ? 'muted': '' )">
- {{ item.tips }}
- </view>
- </view>
- </scroll-view>
- </view>
- <view class="goods-list">
- <router-link v-for="(item, index) in seckillGoods" :key="index"
- :to="{path: '/pages/goods_details/goods_details', query: {id: item.goods_id}}">
- <view class="goods-item flex bg-white">
- <u-image width="180rpx" height="180rpx" border-radius="10rpx" :src="item.goods_image" />
- <view class="goods-info m-l-20">
- <view style="width: 490rpx" class="goods-name line-2 m-b-10">{{item.goods_name}}</view>
- <label class="sale-info xs primary br60">
- 已抢{{item.seckill_total}}件
- </label>
- <view class="info-footer flex row-between m-t-5">
- <view class="price">
- <price-format class="m-r-10" :price="item.seckill_price"
- :color="colorConfig.primary" :first-ize="34" :second-ize="26"
- :subscript-ize="26" />
- <price-format class="line-through" :price="item.goods_min_price"
- :color="colorConfig.muted" :first-ize="24" :second-ize="24"
- :subscript-ize="24" />
- </view>
- <button :class="'br60 white ' + (currentStatus == 2? ' bg-gray' : currentStatus == 1
- ? 'primary-btn' : 'border-btn' )" size="sm">
- {{currentStatus == 2? '已结束': currentStatus == 1 ? '立即抢购' : '未开始'}}</button>
- </view>
- </view>
- </view>
- </router-link>
- </view>
- </view>
- </mescroll-body>
- </template>
- <script>
- import {
- getSeckillTime,
- getSeckillGoods
- } from "@/api/activity";
- import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins";
- export default {
- mixins: [MescrollMixin],
- data() {
- return {
- active: 0,
- upOption: {
- auto: false,
- empty: {
- use: true,
- icon: '/static/images/goods_null.png',
- tip: "暂无秒杀商品~",
- },
- },
- seckillTime: [],
- seckillGoods: []
- };
- },
- methods: {
- async downCallback(page) {
- this.seckillGoods = []
- await this.getSeckillTimeFun()
- this.mescroll.resetUpScroll();
- },
- upCallback(page) {
- let pageNum = page.num;
- let pageSize = page.size;
- const {seckillTime, active} = this
- if(!seckillTime.length) return this.mescroll.endSuccess(0,false)
- let id = seckillTime[active].id
- getSeckillGoods({
- page_no: pageNum,
- page_size: pageSize,
- seckill_id:id
- }).then(res => {
- let curPageData = res.data.lists;
- let hasNext = !!res.data.more;
- let curPageLen = curPageData.length;
- if (pageNum == 1) this.seckillGoods = [];
- this.seckillGoods = this.seckillGoods.concat(curPageData);
- this.mescroll.endSuccess(curPageLen, hasNext);
- }).catch(() => {
- this.mescroll.endErr()
- })
- },
- // 获取秒杀时间段
- getSeckillTimeFun() {
- return new Promise((resolve) => {
- getSeckillTime().then(({code, data}) => {
- if (code == 1) {
- // 抢购中
- let index = data.findIndex(item => item.status == 1);
- if (index == -1) {
- // 未开始
- index = data.findIndex(item => item.status == 0);
- }
- if(index == -1) {
- // 全部结束选中最后一个
- index = data.length - 1
- }
- this.seckillTime = data;
- this.$nextTick(function(){
- this.active = index
- resolve()
- })
- }
- })
- })
-
- },
- // 查看其他时间段
- exchangeTime(index) {
- this.active = index
- this.seckillGoods = []
- this.mescroll.resetUpScroll();
- },
- },
- computed: {
- currentStatus() {
- const {active, seckillTime} = this
- return seckillTime[active] && seckillTime[active].status
- }
- }
- };
- </script>
- <style lang="scss">
- .bg-gray {
- background-color: #CCCCCC !important;
- }
- .goods-seckill {
- .time-list {
- .time-item {
- display: inline-flex;
- width: 160rpx;
- height: 100%;
- &.active {
- .time {
- color: $-color-primary;
- }
- .state {
- color: $-color-white;
- background-color: $-color-primary;
- }
- }
- .state {
- padding: 0 10rpx;
- }
- }
- }
- .endtime-box {
- height: 100rpx;
- .line {
- width: 100rpx;
- height: 2rpx;
- background-color: #CCC;
- }
- }
- .goods-list {
- .goods-item {
- padding: 30rpx;
- .goods-info {
- flex: 1;
- width: 470rpx;
- .sale-info {
- padding: 4rpx 16rpx;
- background-color: #FFE9EB;
- }
- .info-footer {
- .btn {
- padding: 0 30rpx;
- }
- }
- }
- }
- }
- }
- .primary-btn {
- padding: 0 30rpx;
- background: linear-gradient(270deg,
- rgba(255, 44, 60, 1) 0%,
- rgba(249, 95, 47, 1) 100%);
- }
- .border-btn {
- padding: 0 30rpx;
- border: 1px solid $-color-primary;
- color: $-color-primary;
- }
- </style>
|