cart.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import Vue from 'vue'
  2. import { deepClone } from '@/common/util/index.js'
  3. // 解压
  4. const unzip = b64Data => {
  5. let strData = atob(b64Data);
  6. const charData = strData.split('').map(function (x) {
  7. return x.charCodeAt(0);
  8. });
  9. const binData = new Uint8Array(charData);
  10. const data = pako.inflate(binData);
  11. strData = String.fromCharCode.apply(null, new Uint16Array(data));
  12. return decodeURIComponent(strData);
  13. }
  14. // 压缩
  15. const zip = str => btoa(pako.gzip(encodeURIComponent(str), {to: 'string'}))
  16. const storage = list => {
  17. document.cookie = `CART=${zip(JSON.stringify(list))}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/;`
  18. }
  19. let cartinfo = []
  20. try{
  21. cartinfo = document.cookie.split(';').findIndex((e) => e.match('CART')) == -1 ? [] :
  22. JSON.parse(unzip(document.cookie.split(';')[document.cookie.split(';').findIndex((e) => e.match('CART'))].split('=')[1]))
  23. }catch(e){
  24. cartinfo = []
  25. }
  26. export default {
  27. namespaced: true,
  28. state: {
  29. list: cartinfo
  30. },
  31. getters: {
  32. shopcarNum: state => { // 计算购车商品数量
  33. return state.list.reduce((t, e) => {
  34. return e.size.reduce((tt, ee, ii) => {
  35. return tt + e.cart[ii]
  36. }, t)
  37. }, 0)
  38. },
  39. choosedNum: state => { // 计算购车已选商品数量
  40. return state.list.reduce((t, e) => {
  41. return e.size.reduce((tt, ee, ii) => {
  42. return tt + (e.sizeChoosed[ii] ? e.cart[ii] : 0)
  43. }, t)
  44. }, 0)
  45. },
  46. choosedPrice: state => { // 计算购车已选商品价值
  47. return state.list.reduce((t, e) => {
  48. return e.size.reduce((tt, ee, ii) => {
  49. return tt + (e.sizeChoosed[ii] ? e.cart[ii] * e.money : 0)
  50. }, t)
  51. }, 0)
  52. },
  53. // choosedList: state => { // 获取购物车已选中的商品列表
  54. // const list = deepClone(state.list)
  55. // for(let i = list.length - 1; i >= 0; i --) {
  56. // if (!list[i].choosed) {
  57. // list.splice(i, 1)
  58. // } else {
  59. // list[i].typeList.forEach(ee => {
  60. // Object.keys(ee.choosed).forEach(eee => {
  61. // if (!ee.choosed[eee]) {
  62. // delete ee.size[eee]
  63. // delete ee.choosed[eee]
  64. // }
  65. // })
  66. // })
  67. // }
  68. // }
  69. // return list
  70. // },
  71. choosedAll: state => { // 计算购车是否为全选状态
  72. const list = deepClone(state.list)
  73. list.forEach(goodItem => {
  74. for(let i = goodItem.cart.length - 1; i >= 0; i --) {
  75. if (goodItem.cart[i] === 0) {
  76. goodItem.cart.splice(i, 1)
  77. goodItem.size.splice(i, 1)
  78. goodItem.size_id.splice(i, 1)
  79. goodItem.sizeChoosed.splice(i, 1)
  80. }
  81. }
  82. })
  83. return list.every(e => {
  84. return e.sizeChoosed.every(ee => ee)
  85. })
  86. }
  87. },
  88. mutations: {
  89. ADD(state, payload) { // 添加商品到购物车 (已存在合并,不存在添加)
  90. const index = state.list.findIndex(e => e.id === payload.id) // 检查添加商品是否存在于购物车中
  91. if(index === -1) {
  92. state.list.push(payload)
  93. } else {
  94. Object.assign(state.list[index], payload)
  95. }
  96. storage(state.list)
  97. },
  98. CLEAREMPTYITEM(state) {
  99. for(let i = state.list.length - 1; i >= 0; i --) {
  100. if (state.list[i].cart.reduce((t, e) => t + e, 0) === 0) { // 当某个尺码数量变为 0 时,进行一波操作,删除这件商品的这个类型或者商品
  101. state.list.splice(i, 1)
  102. }
  103. }
  104. storage(state.list)
  105. },
  106. COUNTCHANGE(state, payload) { // 修改购物商品数量相关操作
  107. Vue.set(state.list[payload.index].cart, payload.sizeIndex, payload.value)
  108. if (payload.del && payload.value === 0 && state.list[payload.index].cart.reduce((t, e) => t + e, 0) === 0) { // 当某个尺码数量变为 0 时,进行一波操作,删除这件商品的这个类型或者商品
  109. state.list.splice(payload.index, 1)
  110. }
  111. storage(state.list)
  112. },
  113. CHOOSEDCHANGE(state, payload) { // 修改选择状态相关操作
  114. if (payload.length === 3) { // 点击 选择/取消 商品类型, 选择/取消 该商品商品类型,同时和 选择/取消 商品联动
  115. state.list[payload[1]].sizeChoosed[payload[2]] = payload[0]
  116. state.list[payload[1]].choosed = state.list[payload[1]].sizeChoosed.some((e, i) => e && state.list[payload[1]].cart[i])
  117. } else if (payload.length === 2) { // 点击 选择/取消 商品, 选择/取消 该商品所有的类型
  118. state.list[payload[1]].choosed = payload[0]
  119. state.list[payload[1]].sizeChoosed = Array(state.list[payload[1]].sizeChoosed.length).fill(payload[0])
  120. } else { // 点击 取消/全选
  121. state.list.forEach((e, i) => {
  122. e.choosed = payload[0]
  123. e.sizeChoosed = Array(e.size.length).fill(payload[0])
  124. })
  125. }
  126. state.list = JSON.parse(JSON.stringify(state.list))
  127. storage(state.list)
  128. }
  129. }
  130. }