cart.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. const num = list.reduce((t, e) => {
  18. return e.size.reduce((tt, ee, ii) => {
  19. return tt + e.cart[ii]
  20. }, t)
  21. }, 0)
  22. if (num) {
  23. uni.setTabBarBadge({ index: 1, text: num + '' })
  24. } else {
  25. uni.removeTabBarBadge({ index: 1 })
  26. }
  27. document.cookie = `CART=${zip(JSON.stringify(list))}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/;`
  28. }
  29. let cartinfo = []
  30. try{
  31. cartinfo = document.cookie.split(';').findIndex((e) => e.match('CART')) == -1 ? [] :
  32. JSON.parse(unzip(document.cookie.split(';')[document.cookie.split(';').findIndex((e) => e.match('CART'))].split('=')[1]))
  33. }catch(e){
  34. cartinfo = []
  35. }
  36. if (cartinfo.length) {
  37. console.log(cartinfo)
  38. setTimeout(() => {
  39. uni.setTabBarBadge({
  40. index: 1,
  41. text: cartinfo.reduce((t, e) => {
  42. return e.size.reduce((tt, ee, ii) => {
  43. return tt + e.cart[ii]
  44. }, t)
  45. }, 0) + ''
  46. })
  47. })
  48. }
  49. export default {
  50. namespaced: true,
  51. state: {
  52. list: cartinfo
  53. },
  54. getters: {
  55. shopcarNum: state => { // 计算购车商品数量
  56. return state.list.reduce((t, e) => {
  57. return e.size.reduce((tt, ee, ii) => {
  58. return tt + e.cart[ii]
  59. }, t)
  60. }, 0)
  61. },
  62. choosedNum: state => { // 计算购车已选商品数量
  63. return state.list.reduce((t, e) => {
  64. return e.size.reduce((tt, ee, ii) => {
  65. return tt + (e.sizeChoosed[ii] ? e.cart[ii] : 0)
  66. }, t)
  67. }, 0)
  68. },
  69. choosedPrice: state => { // 计算购车已选商品价值
  70. return state.list.reduce((t, e) => {
  71. return e.size.reduce((tt, ee, ii) => {
  72. return tt + (e.sizeChoosed[ii] ? e.cart[ii] * e.money : 0)
  73. }, t)
  74. }, 0)
  75. },
  76. // choosedList: state => { // 获取购物车已选中的商品列表
  77. // const list = deepClone(state.list)
  78. // for(let i = list.length - 1; i >= 0; i --) {
  79. // if (!list[i].choosed) {
  80. // list.splice(i, 1)
  81. // } else {
  82. // list[i].typeList.forEach(ee => {
  83. // Object.keys(ee.choosed).forEach(eee => {
  84. // if (!ee.choosed[eee]) {
  85. // delete ee.size[eee]
  86. // delete ee.choosed[eee]
  87. // }
  88. // })
  89. // })
  90. // }
  91. // }
  92. // return list
  93. // },
  94. choosedAll: state => { // 计算购车是否为全选状态
  95. const list = deepClone(state.list)
  96. list.forEach(goodItem => {
  97. for(let i = goodItem.cart.length - 1; i >= 0; i --) {
  98. if (goodItem.cart[i] === 0) {
  99. goodItem.cart.splice(i, 1)
  100. goodItem.size.splice(i, 1)
  101. goodItem.size_id.splice(i, 1)
  102. goodItem.sizeChoosed.splice(i, 1)
  103. }
  104. }
  105. })
  106. return list.every(e => {
  107. return e.sizeChoosed.every(ee => ee)
  108. })
  109. }
  110. },
  111. mutations: {
  112. ADD(state, payload, ) { // 添加商品到购物车 (已存在合并,不存在添加)
  113. const index = state.list.findIndex(e => e.attr_id === payload.attr_id) // 检查添加商品是否存在于购物车中
  114. if(index === -1) {
  115. state.list.push(payload)
  116. } else {
  117. Object.assign(state.list[index], payload)
  118. }
  119. setTimeout(() => storage(state.list), 123)
  120. // const old = console.log(state.list[0].cart[0])
  121. // this.commit('cart/COUNTCHANGE', { value: old + 1, index: 0, sizeIndex: 0, del: true })
  122. // this.commit('cart/COUNTCHANGE', { value: old, index: 0, sizeIndex: 0, del: true })
  123. },
  124. DELETE(state, payload) {
  125. state.list.splice(payload, 1)
  126. storage(state.list)
  127. },
  128. CLEAR(state) { // 清空购物车
  129. state.list = []
  130. storage(state.list)
  131. },
  132. CLEAREMPTYITEM(state) {
  133. for(let i = state.list.length - 1; i >= 0; i --) {
  134. if (state.list[i].cart.reduce((t, e) => t + e, 0) === 0) { // 当某个尺码数量变为 0 时,进行一波操作,删除这件商品的这个类型或者商品
  135. state.list.splice(i, 1)
  136. }
  137. }
  138. storage(state.list)
  139. },
  140. COUNTCHANGE(state, payload) { // 修改购物商品数量相关操作
  141. Vue.set(state.list[payload.index].cart, payload.sizeIndex, payload.value)
  142. if (payload.del && payload.value === 0 && state.list[payload.index].cart.reduce((t, e) => t + e, 0) === 0) { // 当某个尺码数量变为 0 时,进行一波操作,删除这件商品的这个类型或者商品
  143. state.list.splice(payload.index, 1)
  144. }
  145. storage(state.list)
  146. },
  147. CHOOSEDCHANGE(state, payload) { // 修改选择状态相关操作
  148. if (payload.length === 3) { // 点击 选择/取消 商品类型, 选择/取消 该商品商品类型,同时和 选择/取消 商品联动
  149. state.list[payload[1]].sizeChoosed[payload[2]] = payload[0]
  150. state.list[payload[1]].choosed = state.list[payload[1]].sizeChoosed.some((e, i) => e && state.list[payload[1]].cart[i])
  151. } else if (payload.length === 2) { // 点击 选择/取消 商品, 选择/取消 该商品所有的类型
  152. state.list[payload[1]].choosed = payload[0]
  153. state.list[payload[1]].sizeChoosed = Array(state.list[payload[1]].sizeChoosed.length).fill(payload[0])
  154. } else { // 点击 取消/全选
  155. state.list.forEach((e, i) => {
  156. e.choosed = payload[0]
  157. e.sizeChoosed = Array(e.size.length).fill(payload[0])
  158. })
  159. }
  160. state.list = JSON.parse(JSON.stringify(state.list))
  161. storage(state.list)
  162. }
  163. }
  164. }