index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <goods-sku-popup :value="visible" @input="onChangeValue" border-radius="20" :localdata="localdata" :mode="2" :maskCloseAble="true"
  3. @add-cart="addCart" @buy-now="buyNow" buyNowText="立即购买" />
  4. </template>
  5. <script>
  6. import { setCartTotalNum } from '@/core/app'
  7. import { SpecTypeEnum } from '@/common/enum/goods'
  8. import * as CartApi from '@/api/cart'
  9. import * as GoodsApi from '@/api/goods'
  10. import GoodsSkuPopup from '@/components/goods-sku-popup'
  11. export default {
  12. components: {
  13. GoodsSkuPopup
  14. },
  15. props: {
  16. // 购物车按钮样式 1 2 3
  17. btnStyle: {
  18. type: Number,
  19. default: 1
  20. },
  21. },
  22. data() {
  23. return {
  24. // 是否显示
  25. visible: false,
  26. // 主商品信息
  27. goods: {},
  28. // SKU商品信息
  29. localdata: {}
  30. }
  31. },
  32. methods: {
  33. // 加入购物车事件
  34. async handle(goods) {
  35. this.goods = goods
  36. if (goods.spec_type == SpecTypeEnum.SINGLE.value) {
  37. this.singleEvent()
  38. }
  39. if (goods.spec_type == SpecTypeEnum.MULTI.value) {
  40. this.multiEvent()
  41. }
  42. },
  43. // 单规格商品事件
  44. singleEvent() {
  45. const { goods } = this
  46. this.addCart({
  47. goods_id: goods.goods_id,
  48. goods_sku_id: '0',
  49. buy_num: 1
  50. })
  51. },
  52. // 多规格商品事件
  53. async multiEvent() {
  54. const app = this
  55. const { goods } = app
  56. // 获取商品的规格信息
  57. const { data: { specData } } = await GoodsApi.specData(goods.goods_id)
  58. goods.skuList = specData.skuList
  59. goods.specList = specData.specList
  60. // 整理SKU商品信息
  61. app.localdata = {
  62. _id: goods.goods_id,
  63. name: goods.goods_name,
  64. goods_thumb: goods.goods_image,
  65. sku_list: app.getSkuList(),
  66. spec_list: app.getSpecList()
  67. }
  68. this.visible = true
  69. },
  70. // 监听组件显示隐藏
  71. onChangeValue(val) {
  72. this.visible = val
  73. },
  74. // 整理商品SKU列表 (多规格)
  75. getSkuList() {
  76. const app = this
  77. const { goods: { goods_name, goods_image, skuList } } = app
  78. const skuData = []
  79. skuList.forEach(item => {
  80. skuData.push({
  81. _id: item.id,
  82. goods_sku_id: item.goods_sku_id,
  83. goods_id: item.goods_id,
  84. goods_name: goods_name,
  85. image: item.image_url ? item.image_url : goods_image,
  86. price: item.goods_price * 100,
  87. stock: item.stock_num,
  88. spec_value_ids: item.spec_value_ids,
  89. sku_name_arr: app.getSkuNameArr(item.spec_value_ids)
  90. })
  91. })
  92. return skuData
  93. },
  94. // 获取sku记录的规格值列表
  95. getSkuNameArr(specValueIds) {
  96. const app = this
  97. const defaultData = ['默认']
  98. const skuNameArr = []
  99. if (specValueIds) {
  100. specValueIds.forEach((valueId, groupIndex) => {
  101. const specValueName = app.getSpecValueName(valueId, groupIndex)
  102. skuNameArr.push(specValueName)
  103. })
  104. }
  105. return skuNameArr.length ? skuNameArr : defaultData
  106. },
  107. // 获取指定的规格值名称
  108. getSpecValueName(valueId, groupIndex) {
  109. const app = this
  110. const { goods: { specList } } = app
  111. const res = specList[groupIndex].valueList.find(specValue => {
  112. return specValue.spec_value_id == valueId
  113. })
  114. return res.spec_value
  115. },
  116. // 整理规格数据 (多规格)
  117. getSpecList() {
  118. const { goods: { specList } } = this
  119. const defaultData = [{ name: '默认', list: [{ name: '默认' }] }]
  120. const specData = []
  121. specList.forEach(group => {
  122. const children = []
  123. group.valueList.forEach(specValue => {
  124. children.push({ name: specValue.spec_value })
  125. })
  126. specData.push({
  127. name: group.spec_name,
  128. list: children
  129. })
  130. })
  131. return specData.length ? specData : defaultData
  132. },
  133. // 加入购物车按钮
  134. addCart(selectShop) {
  135. const app = this
  136. const { goods_id, goods_sku_id, buy_num } = selectShop
  137. CartApi.add(goods_id, goods_sku_id, buy_num)
  138. .then(result => {
  139. // 显示成功
  140. app.$toast(result.message, 1000, false)
  141. // 隐藏当前弹窗
  142. app.onChangeValue(false)
  143. // 购物车商品总数量
  144. const cartTotal = result.data.cartTotal
  145. // 缓存购物车数量
  146. setCartTotalNum(cartTotal)
  147. // 传递给父级
  148. app.$emit('addCart', cartTotal)
  149. })
  150. }
  151. }
  152. }
  153. </script>
  154. <style lang="scss" scoped>
  155. .add-cart {
  156. font-size: 38rpx;
  157. padding: 0 20rpx;
  158. color: #fa2209;
  159. }
  160. </style>