forked from zhongyuanhaiju/uniapp
308 lines
7.9 KiB
JavaScript
308 lines
7.9 KiB
JavaScript
export default {
|
||
data() {
|
||
return {
|
||
hour: '00',
|
||
minute: '00',
|
||
second: '00',
|
||
ident: false,
|
||
showEmpty: false,
|
||
//分享建立上下级所需id
|
||
memberId: 0,
|
||
mpShareData: null, //小程序分享数据
|
||
mescroll: null,
|
||
timeList: [], //时间列表
|
||
seckillId: null, //选中的时间块
|
||
seckillIndex: null, //选中时间块的index
|
||
dataList: [], //选中时间块的商品列表
|
||
index: null, //当前正在抢购的index,
|
||
timer: null,
|
||
noStartList: [],
|
||
show: false,
|
||
bgColor: ''
|
||
};
|
||
},
|
||
onLoad(option) {
|
||
this.$util.getMemberId().then(resolve => {
|
||
this.memberId = resolve;
|
||
});
|
||
//小程序分享接收source_member
|
||
if (option.source_member) {
|
||
uni.setStorageSync('source_member', option.source_member);
|
||
}
|
||
// 小程序扫码进入,接收source_member
|
||
if (option.scene) {
|
||
var sceneParams = decodeURIComponent(option.scene);
|
||
sceneParams = sceneParams.split('&');
|
||
if (sceneParams.length) {
|
||
sceneParams.forEach(item => {
|
||
if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1];
|
||
if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]);
|
||
if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1);
|
||
});
|
||
}
|
||
}
|
||
},
|
||
async onShow() {
|
||
setTimeout(() => {
|
||
if (this.addonIsExist && !this.addonIsExist.seckill) {
|
||
this.$util.showToast({
|
||
title: '商家未开启秒杀',
|
||
mask: true,
|
||
duration: 2000
|
||
});
|
||
setTimeout(() => {
|
||
this.$util.redirectTo('/pages/index/index');
|
||
}, 2000);
|
||
return;
|
||
}
|
||
}, 1000);
|
||
|
||
//记录分享关系
|
||
if (uni.getStorageSync('token') && uni.getStorageSync('source_member')) {
|
||
this.$util.onSourceMember(uni.getStorageSync('source_member'));
|
||
}
|
||
|
||
//小程序分享
|
||
// #ifdef MP-WEIXIN
|
||
this.$util.getMpShare().then(res => {
|
||
this.mpShareData = res;
|
||
});
|
||
// #endif
|
||
|
||
await this.getZoneConfig();
|
||
this.getTimeList();
|
||
},
|
||
watch: {
|
||
seckillId(newName, oldName) {
|
||
if (newName && oldName && newName != oldName) {
|
||
this.mescroll.resetUpScroll(false);
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
// 活动页面配置
|
||
async getZoneConfig() {
|
||
let res = await this.$api.sendRequest({
|
||
url: '/api/config/promotionZoneConfig',
|
||
data: {
|
||
name: 'seckill'
|
||
},
|
||
async: false
|
||
});
|
||
let data = res.data;
|
||
if (data) {
|
||
this.bgColor = data.bg_color;
|
||
}
|
||
},
|
||
goodsImg(imgStr) {
|
||
let imgs = imgStr.split(',');
|
||
return imgs[0] ? this.$util.img(imgs[0], {
|
||
size: 'mid'
|
||
}) : this.$util.getDefaultImage().goods;
|
||
},
|
||
//时间转换
|
||
transformSeckillTime(time) {
|
||
time = parseFloat(time);
|
||
var hour = parseInt(time / 3600);
|
||
var minute = parseInt((time % 3600) / 60);
|
||
var second = parseInt(time % 60);
|
||
|
||
if (hour < 10) hour = '0' + hour;
|
||
if (minute < 10) minute = '0' + minute;
|
||
if (second < 10) second = '0' + second;
|
||
|
||
return hour + ':' + minute;
|
||
},
|
||
isEnd(isShow) {
|
||
if (!isShow) return;
|
||
this.$util.showToast({
|
||
title: "限时秒杀活动已结束",
|
||
});
|
||
},
|
||
getTimeList() {
|
||
this.$api.sendRequest({
|
||
url: '/seckill/api/seckill/lists',
|
||
success: res => {
|
||
let data = res.data;
|
||
if (!data) return;
|
||
let time = new Date(res.timestamp * 1000);
|
||
let newTimes = time.getHours() * 60 * 60 + time.getMinutes() * 60 + time.getSeconds();
|
||
var tempList = Object.values(data.list);
|
||
tempList.forEach((v, k) => {
|
||
if (v.seckill_start_time <= newTimes && newTimes < v.seckill_end_time) {
|
||
v.isNow = true;
|
||
} else {
|
||
v.isNow = false;
|
||
}
|
||
|
||
tempList[k]['startTimeMachine'] = this.$util.countDown(v
|
||
.seckill_start_time - newTimes);
|
||
tempList[k]['endTimeMachine'] = this.$util.countDown(v.seckill_end_time -
|
||
newTimes);
|
||
if (v.type == 'tomorrow') tempList[k]['startTimeMachine'] = this.$util
|
||
.countDown(86400 - newTimes + v.seckill_start_time);
|
||
|
||
});
|
||
this.timeList = tempList;
|
||
if (tempList.length) {
|
||
this.seckillId = this.timeList[0]['id'];
|
||
this.seckillIndex = 0;
|
||
this.show = true;
|
||
}
|
||
var self = this;
|
||
setInterval(function() {
|
||
self.getExpirationTime();
|
||
}, 1000);
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
}
|
||
});
|
||
},
|
||
getData(mescroll) {
|
||
|
||
this.mescroll = mescroll;
|
||
this.$api.sendRequest({
|
||
url: '/seckill/api/seckillgoods/page',
|
||
data: {
|
||
page_size: mescroll.size,
|
||
page: mescroll.num,
|
||
seckill_time_id: this.seckillId
|
||
},
|
||
success: res => {
|
||
|
||
let newArr = []
|
||
let msg = res.message;
|
||
if (res.code == 0 && res.data) {
|
||
newArr = res.data.list;
|
||
} else {
|
||
this.$util.showToast({
|
||
title: msg
|
||
})
|
||
}
|
||
mescroll.endSuccess(newArr.length);
|
||
//设置列表数据
|
||
if (mescroll.num == 1) this.dataList = []; //如果是第一页需手动制空列表
|
||
this.dataList = this.dataList.concat(newArr); //追加新数据
|
||
|
||
if (this.dataList.length == 0) this.showEmpty = true;
|
||
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
},
|
||
fail() {
|
||
//联网失败的回调
|
||
mescroll.endErr();
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
}
|
||
});
|
||
},
|
||
getExpirationTime() {
|
||
var timeListData = this.timeList,
|
||
currDate = new Date(),
|
||
dateStr = currDate.toLocaleDateString(),
|
||
expirationTime,
|
||
nowTime,
|
||
obj;
|
||
|
||
for (let i in timeListData) {
|
||
if (timeListData[i].isNow) {
|
||
this.ident = true;
|
||
nowTime = Date.parse(currDate);
|
||
expirationTime = Date.parse(dateStr) + parseInt(timeListData[i].seckill_end_time) * 1000;
|
||
let endSeconds = (expirationTime - nowTime) / 1000;
|
||
obj = this.$util.countDown(endSeconds);
|
||
this.hour = obj.h;
|
||
this.minute = obj.i;
|
||
this.second = obj.s;
|
||
if (endSeconds == 0) {
|
||
let next = parseInt(i) + 1;
|
||
if (next < timeListData.length) this.seckillIndex = next;
|
||
this.timeList[i].isNow = false;
|
||
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
this.ident = false;
|
||
},
|
||
ontabtap(e, f) {
|
||
if (f != this.seckillIndex) this.dataList = [];
|
||
this.seckillId = e;
|
||
this.seckillIndex = f;
|
||
},
|
||
//跳转到详情页
|
||
toGoodsDetail(item) {
|
||
if (this.timeList[this.seckillIndex].type == 'tomorrow') {
|
||
this.$util.showToast({
|
||
title: "秒杀活动还未开启,敬请期待!",
|
||
});
|
||
|
||
return false;
|
||
}
|
||
|
||
this.$api.sendRequest({
|
||
url: '/api/config/time',
|
||
data: {},
|
||
success: res => {
|
||
let time = new Date(res.timestamp * 1000);
|
||
let newTimes = time.getHours() * 60 * 60 + time.getMinutes() * 60 + time.getSeconds();
|
||
if (this.timeList[this.seckillIndex].seckill_start_time <= newTimes && newTimes < this
|
||
.timeList[this.seckillIndex].seckill_end_time) {
|
||
this.timeList[this.seckillIndex].isNow = true;
|
||
} else {
|
||
this.timeList[this.seckillIndex].isNow = false;
|
||
}
|
||
|
||
this.$forceUpdate();
|
||
|
||
if (!this.timeList[this.seckillIndex].isNow) {
|
||
this.$util.showToast({
|
||
title: "秒杀活动即将开启,敬请期待!",
|
||
});
|
||
return;
|
||
}
|
||
this.$util.redirectTo('/pages_promotion/seckill/detail', {
|
||
seckill_id: item.id
|
||
});
|
||
|
||
}
|
||
});
|
||
},
|
||
imageError(index) {
|
||
this.dataList[index].goods_image = this.$util.getDefaultImage().goods;
|
||
this.$forceUpdate();
|
||
},
|
||
goodsTag(data) {
|
||
return data.label_name || '';
|
||
}
|
||
},
|
||
//分享给好友
|
||
onShareAppMessage(res) {
|
||
return this.mpShareData.appMessage;
|
||
// var title = '一大波的秒杀福利就要开始了,真的不来看看嘛';
|
||
// var path = '/pages_promotion/seckill/list';
|
||
// return {
|
||
// title: title,
|
||
// path: path,
|
||
// success: res => {},
|
||
// fail: res => {}
|
||
// };
|
||
},
|
||
//分享到朋友圈
|
||
onShareTimeline() {
|
||
return this.mpShareData.timeLine;
|
||
},
|
||
onReady() {
|
||
setTimeout(() => {
|
||
const query = uni.createSelectorQuery().in(this);
|
||
query
|
||
.select('.time-wrap')
|
||
.boundingClientRect(data => {
|
||
if (data) this.timeTop = data.top;
|
||
})
|
||
.exec();
|
||
}, 500);
|
||
},
|
||
onHide() {
|
||
clearInterval(this.timer);
|
||
}
|
||
};
|