SkuPopup.vue 4.7 KB

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