snapUpDetail.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. // pages/snapUpDetail/snapUpDetail.js
  2. var http = require('../../utils/http.js');
  3. var util = require('../../utils/util.js');
  4. Page({
  5. /**
  6. * 页面的初始数据
  7. */
  8. data: {
  9. hideModal: true,
  10. seckillid: 0,
  11. seckilldet: {},
  12. countdown: "", // 秒杀倒计时
  13. countdownlist: [], // 秒杀倒计时列表
  14. clearTimer: null,
  15. originalPrice: 0,
  16. skuList: [],
  17. skuGroup: {},
  18. defaultSku: undefined,
  19. selectedProp: [],
  20. selectedPropObj: {},
  21. propKeys: [],
  22. allProperties: [],
  23. seckillPrice: 0,
  24. prodNum: 1,
  25. maxNum: 1,
  26. orderPath: '',
  27. seckillTotalStocks: 1, //秒杀活动剩余库存
  28. findSku: true,
  29. countDownListTimer: '',
  30. showBacktop: false, //回到顶部显隐
  31. content: '',
  32. },
  33. // 获取秒杀商品详情
  34. getskdet(isFirst) {
  35. const {
  36. seckillid
  37. } = this.data
  38. // 请求详情数据
  39. http.request({
  40. url: "/seckill/prod?seckillId=" + seckillid,
  41. method: "GET",
  42. callBack: (res) => {
  43. var _this = this
  44. let endTimeList = [];
  45. var objs = {}
  46. var content = util.formatHtml(res.content);
  47. objs.eTime = res.seckill.endTime
  48. objs.sTime = res.seckill.startTime
  49. objs.countType = null //1表示秒杀活动正在进行,0表示秒杀活动未开始
  50. endTimeList.push(objs)
  51. _this.setData({
  52. content: content,
  53. seckillTotalStocks: res.seckill.seckillTotalStocks,
  54. seckilldet: res,
  55. countdownlist: endTimeList,
  56. skuList: res.skuList,
  57. seckillPrice: res.seckill.seckillPrice,
  58. maxNum: res.seckill.maxNum,
  59. originalPrice: res.price
  60. })
  61. if (isFirst) _this.groupSkuProp(); // 如果是第一次进来就组装sku
  62. _this.countdown()
  63. }
  64. })
  65. },
  66. // 倒计时
  67. countdown() {
  68. // 获取当前时间,同时得到活动结束时间数组
  69. let newTime = new Date().getTime();
  70. let endTimeList = this.data.countdownlist;
  71. let countDownArr = [];
  72. // 对结束时间进行处理渲染到页面
  73. endTimeList.forEach(o => {
  74. if (newTime - util.dateToTimestamp(o.sTime) > 0) {
  75. let endTime = util.dateToTimestamp(o.eTime);
  76. let obj = null;
  77. // 如果活动未结束,对时间进行处理
  78. if (endTime - newTime > 0) {
  79. let time = (endTime - newTime) / 1000;
  80. // 获取天、时、分、秒
  81. let day = parseInt(time / (60 * 60 * 24));
  82. let hou = parseInt(time % (60 * 60 * 24) / 3600);
  83. let min = parseInt(time % (60 * 60 * 24) % 3600 / 60);
  84. let sec = parseInt(time % (60 * 60 * 24) % 3600 % 60);
  85. obj = {
  86. day: `${this.timeFormat(day)} 天`,
  87. hou: `${this.timeFormat(hou)} 时`,
  88. min: `${this.timeFormat(min)} 分`,
  89. sec: `${this.timeFormat(sec)} 秒`,
  90. type: 1 // 表示秒杀正在进行
  91. }
  92. }
  93. // 活动已结束
  94. else {
  95. obj = {
  96. day: '00',
  97. hou: '00',
  98. min: '00',
  99. sec: '00'
  100. }
  101. }
  102. countDownArr.push(obj);
  103. }
  104. // 活动未开始
  105. else {
  106. let startTime = util.dateToTimestamp(o.sTime);
  107. let time = (startTime - newTime) / 1000;
  108. let obj = null;
  109. // 获取天、时、分、秒
  110. let day = parseInt(time / (60 * 60 * 24));
  111. let hou = parseInt(time % (60 * 60 * 24) / 3600);
  112. let min = parseInt(time % (60 * 60 * 24) % 3600 / 60);
  113. let sec = parseInt(time % (60 * 60 * 24) % 3600 % 60);
  114. obj = {
  115. day: `${this.timeFormat(day)} 天`,
  116. hou: `${this.timeFormat(hou)} 时`,
  117. min: `${this.timeFormat(min)} 分`,
  118. sec: `${this.timeFormat(sec)} 秒`,
  119. type: 0 // 表示秒杀还没开始
  120. }
  121. countDownArr.push(obj);
  122. }
  123. })
  124. // 渲染,然后每隔一秒执行一次倒计时函数
  125. this.setData({
  126. countDownList: countDownArr,
  127. countDownListTimer: setTimeout(this.countdown, 1000)
  128. })
  129. },
  130. // 小于10的格式化函数
  131. timeFormat(times) {
  132. return times < 10 ? '0' + times : times;
  133. },
  134. /**
  135. * 生命周期函数--监听页面加载
  136. */
  137. onLoad: function (options) {
  138. const {
  139. seckillid
  140. } = options
  141. this.setData({
  142. seckillid
  143. })
  144. this.getskdet(true)
  145. },
  146. //根据sku的属性 分组
  147. groupSkuProp: function () {
  148. var skuList = this.data.skuList;
  149. if (skuList.length == 1 && skuList[0].properties == "") {
  150. this.setData({
  151. defaultSku: skuList[0]
  152. });
  153. return;
  154. }
  155. var skuGroup = {};
  156. var allProperties = [];
  157. var propKeys = [];
  158. for (var i = 0; i < skuList.length; i++) {
  159. var defaultSku = this.data.defaultSku;
  160. var isDefault = false;
  161. if (!defaultSku && skuList[i].seckillPrice == this.data.seckillPrice) { //找到和商品价格一样的那个SKU,作为默认选中的SKU
  162. defaultSku = skuList[i];
  163. isDefault = true;
  164. this.setData({
  165. defaultSku: defaultSku
  166. });
  167. }
  168. var properties = skuList[i].properties; //版本:公开版;颜色:金色;内存:64GB
  169. allProperties.push(properties);
  170. var propList = properties.split(";"); // ["版本:公开版","颜色:金色","内存:64GB"]
  171. var selectedPropObj = this.data.selectedPropObj;
  172. for (var j = 0; j < propList.length; j++) {
  173. var propval = propList[j].split(":"); //["版本","公开版"]
  174. var props = skuGroup[propval[0]]; //先取出 版本对应的值数组
  175. //如果当前是默认选中的sku,把对应的属性值 组装到selectedProp
  176. if (isDefault) {
  177. propKeys.push(propval[0]);
  178. selectedPropObj[propval[0]] = propval[1];
  179. }
  180. if (props == undefined) {
  181. props = []; //假设还没有版本,新建个新的空数组
  182. props.push(propval[1]); //把 "公开版" 放进空数组
  183. } else {
  184. if (!this.array_contain(props, propval[1])) { //如果数组里面没有"公开版"
  185. props.push(propval[1]); //把 "公开版" 放进数组
  186. }
  187. }
  188. skuGroup[propval[0]] = props; //最后把数据 放回版本对应的值
  189. }
  190. this.setData({
  191. selectedPropObj: selectedPropObj,
  192. propKeys: propKeys
  193. });
  194. }
  195. this.parseSelectedObjToVals();
  196. this.setData({
  197. skuGroup: skuGroup,
  198. allProperties: allProperties
  199. });
  200. },
  201. //将已选的 {key:val,key2:val2}转换成 [val,val2]
  202. parseSelectedObjToVals: function () {
  203. var selectedPropObj = this.data.selectedPropObj;
  204. var selectedProperties = "";
  205. var selectedProp = [];
  206. for (var key in selectedPropObj) {
  207. selectedProp.push(selectedPropObj[key]);
  208. selectedProperties += key + ":" + selectedPropObj[key] + ";";
  209. }
  210. selectedProperties = selectedProperties.substring(0, selectedProperties.length - 1);
  211. this.setData({
  212. selectedProp: selectedProp
  213. });
  214. var findSku = false;
  215. for (var i = 0; i < this.data.skuList.length; i++) {
  216. if (this.data.skuList[i].properties == selectedProperties) {
  217. findSku = true;
  218. this.setData({
  219. defaultSku: this.data.skuList[i]
  220. });
  221. break;
  222. }
  223. }
  224. this.setData({
  225. findSku: findSku
  226. });
  227. },
  228. //点击选择规格
  229. toChooseItem: function (e) {
  230. var ok = e.currentTarget.dataset.ok;
  231. if (ok == 0) {
  232. return;
  233. }
  234. this.setData({
  235. prodNum: 1
  236. })
  237. var val = e.currentTarget.dataset.val;
  238. var key = e.currentTarget.dataset.key;
  239. var selectedPropObj = this.data.selectedPropObj;
  240. selectedPropObj[key] = val;
  241. this.setData({
  242. selectedPropObj: selectedPropObj
  243. });
  244. this.parseSelectedObjToVals();
  245. },
  246. //判断数组是否包含某对象
  247. array_contain: function (array, obj) {
  248. for (var i = 0; i < array.length; i++) {
  249. if (array[i] == obj) //如果要求数据类型也一致,这里可使用恒等号===
  250. return true;
  251. }
  252. return false;
  253. },
  254. /**
  255. * 减数量
  256. */
  257. onCountMinus: function () {
  258. var prodNum = this.data.prodNum;
  259. if (prodNum > 1) {
  260. this.setData({
  261. prodNum: prodNum - 1
  262. });
  263. }
  264. },
  265. /**
  266. * 加数量
  267. */
  268. onCountPlus: function () {
  269. this.getskdet()
  270. var prodNum = this.data.prodNum;
  271. var seckillTotalStocks = this.data.defaultSku.seckillStocks
  272. const {
  273. maxNum
  274. } = this.data
  275. if (maxNum == -1) { // 此秒杀不限购
  276. if (seckillTotalStocks > 1 && prodNum < seckillTotalStocks) {
  277. this.setData({
  278. prodNum: prodNum + 1
  279. });
  280. } else {
  281. wx.showToast({
  282. title: '库存不足',
  283. icon: 'none',
  284. duration: 1000,
  285. mask: true,
  286. })
  287. }
  288. } else if (seckillTotalStocks > 1 && prodNum < maxNum && prodNum < seckillTotalStocks) {
  289. this.setData({
  290. prodNum: prodNum + 1
  291. });
  292. } else {
  293. wx.showToast({
  294. title: '限购' + maxNum + '件',
  295. icon: 'none',
  296. duration: 1000,
  297. mask: true,
  298. })
  299. }
  300. },
  301. // 确认秒杀商品
  302. seckillconfirm() {
  303. if (!this.data.findSku) {
  304. return;
  305. }
  306. var secKillObj = {};
  307. secKillObj.addrId = 0;
  308. secKillObj.prodCount = this.data.prodNum;
  309. secKillObj.seckillSkuId = this.data.defaultSku.seckillSkuId;
  310. wx.setStorageSync("secKillObj", secKillObj);
  311. wx.navigateTo({
  312. url: '/pages/confirmOrder/confirmOrder',
  313. })
  314. },
  315. // 零售价购买
  316. toProdDetailsPage: function (e) {
  317. console.log(this.data.seckilldet.prodId)
  318. wx.navigateTo({
  319. url: '/pages/prod/prod?prodid=' + this.data.seckilldet.prodId,
  320. })
  321. },
  322. /**
  323. * 回到顶部
  324. */
  325. backToTop: function () {
  326. this.setData({
  327. scrollTop: 0
  328. })
  329. },
  330. /**
  331. * 监听页面滚动
  332. */
  333. onPageScroll: function (e) {
  334. if (e.detail.scrollTop > 80) {
  335. this.setData({
  336. showBacktop: true
  337. })
  338. } else if (e.detail.scrollTop < 80) {
  339. this.setData({
  340. showBacktop: false
  341. })
  342. }
  343. },
  344. /**
  345. * 生命周期函数--监听页面初次渲染完成
  346. */
  347. onReady: function () {
  348. },
  349. /**
  350. * 生命周期函数--监听页面显示
  351. */
  352. onShow: function () {
  353. },
  354. /**
  355. * 生命周期函数--监听页面隐藏
  356. */
  357. onHide: function () {
  358. this.setData({
  359. hideModal: true
  360. })
  361. },
  362. /**
  363. * 生命周期函数--监听页面卸载
  364. */
  365. onUnload: function () {
  366. clearTimeout(this.data.countDownListTimer)
  367. },
  368. /**
  369. * 页面相关事件处理函数--监听用户下拉动作
  370. */
  371. onPullDownRefresh: function () {
  372. },
  373. /**
  374. * 页面上拉触底事件的处理函数
  375. */
  376. onReachBottom: function () {
  377. },
  378. /**
  379. * 用户点击右上角分享
  380. */
  381. onShareAppMessage: function () {
  382. return {
  383. title: this.data.seckilldet.prodName,
  384. imageUrl: this.data.seckilldet.pic,
  385. path: '/pages/snapUpDetail/snapUpDetail?seckillid=' + this.data.seckillid
  386. }
  387. },
  388. /**
  389. * 显示遮罩层
  390. */
  391. showModal: function () {
  392. util.checkAuthInfo(() => {
  393. var ths = this
  394. ths.setData({
  395. hideModal: false
  396. });
  397. var animation = wx.createAnimation({
  398. duration: 600, //动画的持续时间 默认400ms 数值越大,动画越慢 数值越小,动画越快
  399. timingFunction: 'ease', //动画的效果 默认值是linear
  400. })
  401. ths.animation = animation
  402. setTimeout(function () {
  403. ths.fadeIn(); //调用显示动画
  404. }, 100)
  405. }, )
  406. },
  407. /**
  408. * 隐藏遮罩层
  409. */
  410. hideModal: function () {
  411. var that = this;
  412. var animation = wx.createAnimation({
  413. duration: 800, //动画的持续时间 默认400ms 数值越大,动画越慢 数值越小,动画越快
  414. timingFunction: 'ease', //动画的效果 默认值是linear
  415. })
  416. this.animation = animation
  417. that.fadeDown(); //调用隐藏动画
  418. setTimeout(function () {
  419. that.setData({
  420. hideModal: true
  421. })
  422. }, 720) //先执行下滑动画,再隐藏模块
  423. },
  424. /**
  425. * 动画集
  426. */
  427. fadeIn: function () {
  428. this.animation.translateY(0).step()
  429. this.setData({
  430. animationData: this.animation.export() //动画实例的export方法导出动画数据传递给组件的animation属性
  431. })
  432. },
  433. fadeDown: function () {
  434. this.animation.translateY(300).step()
  435. this.setData({
  436. animationData: this.animation.export(),
  437. })
  438. },
  439. /**
  440. * 跳转到首页
  441. */
  442. toHomePage: function () {
  443. wx.switchTab({
  444. url: '/pages/index/index',
  445. })
  446. },
  447. /**
  448. * 跳转到购物车
  449. */
  450. toCartPage: function () {
  451. wx.switchTab({
  452. url: '/pages/basket/basket',
  453. })
  454. },
  455. })