520 lines
12 KiB
JavaScript
520 lines
12 KiB
JavaScript
const App = getApp();
|
|
|
|
// 富文本插件
|
|
import wxParse from '../../../wxParse/wxParse.js';
|
|
|
|
// 工具类
|
|
import util from '../../../utils/util.js';
|
|
|
|
// 倒计时插件
|
|
import CountDown from '../../../utils/countdown.js';
|
|
|
|
// 枚举类:秒杀活动商品状态
|
|
import ActiveStatusEnum from '../../../utils/enum/sharp/GoodsStatus.js';
|
|
|
|
// 记录规格的数组
|
|
let goodsSpecArr = [];
|
|
|
|
Page({
|
|
|
|
/**
|
|
* 页面的初始数据
|
|
*/
|
|
data: {
|
|
|
|
indicatorDots: true, // 是否显示面板指示点
|
|
autoplay: true, // 是否自动切换
|
|
interval: 3000, // 自动切换时间间隔
|
|
duration: 800, // 滑动动画时长
|
|
|
|
currentIndex: 1, // 轮播图指针
|
|
floorstatus: false, // 返回顶部
|
|
|
|
seckill_price: 0, // 商品价格
|
|
original_price: 0, // 商品原价
|
|
seckill_stock: 0, // 库存数量
|
|
|
|
goods_num: 1, // 商品数量
|
|
goods_sku_id: 0, // 规格id
|
|
cart_total_num: 0, // 购物车商品总数量
|
|
goodsMultiSpec: {}, // 多规格信息
|
|
|
|
ActiveStatusEnum, // 秒杀活动商品状态
|
|
|
|
// 分享按钮组件
|
|
share: {
|
|
show: false,
|
|
cancelWithMask: true,
|
|
cancelText: '关闭',
|
|
actions: [{
|
|
name: '生成商品海报',
|
|
className: 'action-class',
|
|
loading: false
|
|
}, {
|
|
name: '发送给朋友',
|
|
openType: 'share'
|
|
}],
|
|
// 商品海报
|
|
showPopup: false,
|
|
},
|
|
|
|
// 返回顶部
|
|
showTopWidget: false,
|
|
|
|
// 倒计时
|
|
actEndTimeList: [],
|
|
|
|
active: {}, // 秒杀活动详情
|
|
goods: {}, // 商品详情
|
|
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面加载
|
|
*/
|
|
onLoad(options) {
|
|
let _this = this,
|
|
scene = App.getSceneData(options);
|
|
// 秒杀商品id
|
|
_this.setData({
|
|
active_time_id: options.active_time_id ? options.active_time_id : scene.aid,
|
|
sharp_goods_id: options.sharp_goods_id ? options.sharp_goods_id : scene.gid,
|
|
});
|
|
// 获取秒杀商品信息
|
|
_this.getActiveDetail();
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面显示
|
|
*/
|
|
onShow(options) {
|
|
|
|
},
|
|
|
|
/**
|
|
* 获取秒杀商品信息
|
|
*/
|
|
getActiveDetail() {
|
|
let _this = this;
|
|
App._get('sharp.goods/detail', {
|
|
active_time_id: _this.data.active_time_id,
|
|
sharp_goods_id: _this.data.sharp_goods_id,
|
|
}, (result) => {
|
|
// 初始化详情数据
|
|
let data = _this._initData(result.data);
|
|
_this.setData(data);
|
|
// 执行倒计时
|
|
CountDown.onSetTimeList(_this, 'actEndTimeList');
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 初始化详情数据
|
|
*/
|
|
_initData(data) {
|
|
let _this = this;
|
|
// 商品详情
|
|
let goodsDetail = data.goods;
|
|
// 富文本转码
|
|
if (goodsDetail.content.length > 0) {
|
|
wxParse.wxParse('content', 'html', goodsDetail.content, _this, 0);
|
|
}
|
|
// 商品价格/划线价/库存
|
|
data.goods_sku_id = goodsDetail.goods_sku.spec_sku_id;
|
|
data.seckill_price = goodsDetail.goods_sku.seckill_price;
|
|
data.original_price = goodsDetail.goods_sku.original_price;
|
|
data.seckill_stock = goodsDetail.goods_sku.seckill_stock;
|
|
// 商品封面图(确认弹窗)
|
|
data.skuCoverImage = goodsDetail.goods_image;
|
|
// 多规格商品封面图(确认弹窗)
|
|
if (goodsDetail.spec_type == 20 && goodsDetail.goods_sku['image']) {
|
|
data.skuCoverImage = goodsDetail.goods_sku['image']['file_path'];
|
|
}
|
|
// 初始化商品多规格
|
|
if (goodsDetail.spec_type == 20) {
|
|
data.goodsMultiSpec = _this._initManySpecData(goodsDetail.goods_multi_spec);
|
|
}
|
|
// 记录活动到期时间
|
|
data.actEndTimeList = [{
|
|
date: data.active.active_status == ActiveStatusEnum.STATE_SOON.value ?
|
|
data.active.start_time : data.active.end_time
|
|
}];
|
|
return data;
|
|
},
|
|
|
|
/**
|
|
* 初始化商品多规格
|
|
*/
|
|
_initManySpecData(data) {
|
|
goodsSpecArr = [];
|
|
for (let i in data.spec_attr) {
|
|
for (let j in data.spec_attr[i].spec_items) {
|
|
if (j < 1) {
|
|
data.spec_attr[i].spec_items[0].checked = true;
|
|
goodsSpecArr[i] = data.spec_attr[i].spec_items[0].item_id;
|
|
}
|
|
}
|
|
}
|
|
return data;
|
|
},
|
|
|
|
/**
|
|
* 点击切换不同规格
|
|
*/
|
|
onSwitchSpec(e) {
|
|
let _this = this,
|
|
attrIdx = e.currentTarget.dataset.attrIdx,
|
|
itemIdx = e.currentTarget.dataset.itemIdx,
|
|
goodsMultiSpec = _this.data.goodsMultiSpec;
|
|
// 记录formid
|
|
App.saveFormId(e.detail.formId);
|
|
for (let i in goodsMultiSpec.spec_attr) {
|
|
for (let j in goodsMultiSpec.spec_attr[i].spec_items) {
|
|
if (attrIdx == i) {
|
|
goodsMultiSpec.spec_attr[i].spec_items[j].checked = false;
|
|
if (itemIdx == j) {
|
|
goodsMultiSpec.spec_attr[i].spec_items[itemIdx].checked = true;
|
|
goodsSpecArr[i] = goodsMultiSpec.spec_attr[i].spec_items[itemIdx].item_id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_this.setData({
|
|
goodsMultiSpec
|
|
});
|
|
// 更新商品规格信息
|
|
_this._updateSpecGoods();
|
|
},
|
|
|
|
/**
|
|
* 更新商品规格信息
|
|
*/
|
|
_updateSpecGoods() {
|
|
let _this = this,
|
|
specSkuId = goodsSpecArr.join('_');
|
|
// 查找skuItem
|
|
let spec_list = _this.data.goodsMultiSpec.spec_list,
|
|
skuItem = spec_list.find((val) => {
|
|
return val.spec_sku_id == specSkuId;
|
|
});
|
|
// 记录goods_sku_id
|
|
// 更新商品价格、划线价、库存
|
|
if (typeof skuItem === 'object') {
|
|
_this.setData({
|
|
goods_sku_id: skuItem.spec_sku_id,
|
|
seckill_price: skuItem.form.seckill_price,
|
|
original_price: skuItem.form.original_price,
|
|
seckill_stock: skuItem.form.seckill_stock,
|
|
skuCoverImage: skuItem.form.image_id > 0 ? skuItem.form.image_path : _this.data.goods.goods_image
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 设置轮播图当前指针 数字
|
|
*/
|
|
setCurrent(e) {
|
|
let _this = this;
|
|
_this.setData({
|
|
currentIndex: e.detail.current + 1
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 浏览商品图片
|
|
*/
|
|
onPreviewImages(e) {
|
|
let _this = this;
|
|
let index = e.currentTarget.dataset.index,
|
|
imageUrls = [];
|
|
_this.data.goods.image.forEach(item => {
|
|
imageUrls.push(item.file_path);
|
|
});
|
|
wx.previewImage({
|
|
current: imageUrls[index],
|
|
urls: imageUrls
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 预览Sku规格图片
|
|
*/
|
|
onPreviewSkuImage(e) {
|
|
let _this = this;
|
|
wx.previewImage({
|
|
current: _this.data.skuCoverImage,
|
|
urls: [_this.data.skuCoverImage]
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 跳转到评论
|
|
*/
|
|
onTargetToComment() {
|
|
let _this = this;
|
|
wx.navigateTo({
|
|
url: `../../goods/comment/comment?goods_id=${_this.data.goods.goods_id}`
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 返回顶部
|
|
*/
|
|
onScrollTop(t) {
|
|
let _this = this;
|
|
_this.setData({
|
|
scrollTop: 0
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 显示/隐藏 返回顶部按钮
|
|
*/
|
|
onScrollEvent(e) {
|
|
let _this = this;
|
|
_this.setData({
|
|
showTopWidget: e.detail.scrollTop > 200
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 显示分享选项
|
|
*/
|
|
onClickShare(e) {
|
|
let _this = this;
|
|
// 记录formId
|
|
App.saveFormId(e.detail.formId);
|
|
_this.setData({
|
|
'share.show': true
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 关闭分享选项
|
|
*/
|
|
onCloseShare() {
|
|
let _this = this;
|
|
_this.setData({
|
|
'share.show': false
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 点击生成商品海报
|
|
*/
|
|
onClickShareItem(e) {
|
|
let _this = this;
|
|
if (e.detail.index === 0) {
|
|
// 显示商品海报
|
|
_this._showPoster();
|
|
}
|
|
_this.onCloseShare();
|
|
},
|
|
|
|
/**
|
|
* 切换商品海报
|
|
*/
|
|
onTogglePopup() {
|
|
let _this = this;
|
|
_this.setData({
|
|
'share.showPopup': !_this.data.share.showPopup
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 显示商品海报图
|
|
*/
|
|
_showPoster() {
|
|
let _this = this;
|
|
wx.showLoading({
|
|
title: '加载中',
|
|
});
|
|
App._get('sharp.goods/poster', {
|
|
active_time_id: _this.data.active_time_id,
|
|
sharp_goods_id: _this.data.sharp_goods_id,
|
|
}, (result) => {
|
|
_this.setData(result.data, () => {
|
|
_this.onTogglePopup();
|
|
});
|
|
}, null, () => {
|
|
wx.hideLoading();
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 保存海报图片
|
|
*/
|
|
onSavePoster(e) {
|
|
let _this = this;
|
|
// 记录formId
|
|
App.saveFormId(e.detail.formId);
|
|
wx.showLoading({
|
|
title: '加载中',
|
|
});
|
|
// 下载海报图片
|
|
wx.downloadFile({
|
|
url: _this.data.qrcode,
|
|
success(res) {
|
|
wx.hideLoading();
|
|
// 图片保存到本地
|
|
wx.saveImageToPhotosAlbum({
|
|
filePath: res.tempFilePath,
|
|
success(data) {
|
|
wx.showToast({
|
|
title: '保存成功',
|
|
icon: 'success',
|
|
duration: 2000
|
|
});
|
|
// 关闭商品海报
|
|
_this.onTogglePopup();
|
|
},
|
|
fail(err) {
|
|
console.log(err.errMsg);
|
|
if (err.errMsg === 'saveImageToPhotosAlbum:fail auth deny') {
|
|
wx.showToast({
|
|
title: "请允许访问相册后重试",
|
|
icon: "none",
|
|
duration: 1000
|
|
});
|
|
setTimeout(() => {
|
|
wx.openSetting();
|
|
}, 1000);
|
|
}
|
|
},
|
|
complete(res) {
|
|
console.log('complete');
|
|
// wx.hideLoading();
|
|
}
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 增加商品数量
|
|
*/
|
|
onIncGoodsNumber(e) {
|
|
let _this = this;
|
|
App.saveFormId(e.detail.formId);
|
|
_this.setData({
|
|
goods_num: ++_this.data.goods_num
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 减少商品数量
|
|
*/
|
|
onDecGoodsNumber(e) {
|
|
let _this = this;
|
|
App.saveFormId(e.detail.formId);
|
|
if (_this.data.goods_num > 1) {
|
|
_this.setData({
|
|
goods_num: --_this.data.goods_num
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 自定义输入商品数量
|
|
*/
|
|
onInputGoodsNum(e) {
|
|
let _this = this,
|
|
iptValue = e.detail.value;
|
|
if (!util.isPositiveInteger(iptValue) && iptValue !== '') {
|
|
iptValue = 1;
|
|
}
|
|
_this.setData({
|
|
goods_num: iptValue
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 确认购买弹窗
|
|
*/
|
|
onToggleTrade(e) {
|
|
let _this = this;
|
|
if (typeof e === 'object') {
|
|
// 记录formId
|
|
e.detail.hasOwnProperty('formId') && App.saveFormId(e.detail.formId);
|
|
}
|
|
_this.setData({
|
|
showBottomPopup: !_this.data.showBottomPopup
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 确认购买
|
|
*/
|
|
onCheckout(e) {
|
|
let _this = this;
|
|
// 记录formId
|
|
App.saveFormId(e.detail.formId);
|
|
// 表单验证
|
|
if (!_this._onVerify()) {
|
|
return false;
|
|
}
|
|
// 立即购买
|
|
wx.navigateTo({
|
|
url: '../../flow/checkout?' + util.urlEncode({
|
|
order_type: 'sharp',
|
|
active_time_id: _this.data.active_time_id,
|
|
sharp_goods_id: _this.data.sharp_goods_id,
|
|
goods_sku_id: _this.data.goods_sku_id,
|
|
goods_num: _this.data.goods_num,
|
|
}),
|
|
success() {
|
|
// 关闭弹窗
|
|
_this.onToggleTrade();
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 表单验证
|
|
*/
|
|
_onVerify() {
|
|
let _this = this;
|
|
if (_this.data.goods_num === '') {
|
|
App.showError('请输入购买数量');
|
|
return false;
|
|
}
|
|
// 将购买数量转为整型,防止出错
|
|
_this.setData({
|
|
goods_num: parseInt(_this.data.goods_num)
|
|
});
|
|
if (_this.data.goods_num <= 0) {
|
|
App.showError('购买数量不能为0');
|
|
return false;
|
|
}
|
|
// 判断限购数量
|
|
return true;
|
|
},
|
|
|
|
/**
|
|
* 跳转到首页
|
|
*/
|
|
onTargetHome(e) {
|
|
// 记录formid
|
|
App.saveFormId(e.detail.formId);
|
|
wx.switchTab({
|
|
url: '../../index/index',
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 用户点击右上角分享
|
|
*/
|
|
onShareAppMessage() {
|
|
let _this = this;
|
|
// 构建页面参数
|
|
let params = App.getShareUrlParams({
|
|
active_time_id: _this.data.active_time_id,
|
|
sharp_goods_id: _this.data.sharp_goods_id,
|
|
});
|
|
return {
|
|
title: _this.data.detail.goods_name,
|
|
path: `/pages/sharp/goods/index?${params}`
|
|
};
|
|
},
|
|
|
|
}) |