SkuPopup.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <goods-sku-popup :value="value" @input="onChangeValue" border-radius="20" :custom-action="findGoodsInfo"
  3. :mode="skuMode" :defaultPrice="goods.price" :defaultStock="goods.stock" :maskCloseAble="true"
  4. @open="openSkuPopup" @close="closeSkuPopup" @add-cart="addCart" @buy-now="buyNow" />
  5. </template>
  6. <script>
  7. import { setCartTotalNum } from '@/utils/app'
  8. import * as CartApi from '@/api/cart'
  9. import * as GoodsApi from '@/api/goods'
  10. import GoodsSkuPopup from '@/components/goods-sku-popup'
  11. let goodsInfo;
  12. export default {
  13. components: {
  14. GoodsSkuPopup
  15. },
  16. model: {
  17. prop: 'value',
  18. event: 'input'
  19. },
  20. props: {
  21. // true 组件显示 false 组件隐藏
  22. value: {
  23. Type: Boolean,
  24. default: false
  25. },
  26. // 模式 1:都显示 2:只显示购物车 3:只显示立即购买
  27. skuMode: {
  28. type: Number,
  29. default: 1
  30. },
  31. // 商品详情信息
  32. goods: {
  33. type: Object,
  34. default: {}
  35. }
  36. },
  37. data() {
  38. return {}
  39. },
  40. created() {
  41. const app = this
  42. const { goods } = app
  43. goodsInfo = {
  44. _id: goods.goodsId,
  45. name: goods.name,
  46. goods_thumb: goods.logo,
  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. /**
  57. * 获取商品信息
  58. * 这里可以看到每次打开SKU都会去重新请求商品信息,为的是每次打开SKU组件可以实时看到剩余库存
  59. */
  60. findGoodsInfo() {
  61. return new Promise((resolve, reject) => {
  62. resolve(goodsInfo)
  63. })
  64. },
  65. // 整理商品SKU列表
  66. getSkuList() {
  67. const app = this
  68. const { goods: { name, logo, skuList } } = app
  69. const skuData = []
  70. if (skuList) {
  71. skuList.forEach(item => {
  72. skuData.push({
  73. _id: item.id,
  74. sku_id: item.skuId,
  75. goods_id: item.goodsId,
  76. name: name,
  77. image: item.logo ? item.logo : logo,
  78. price: item.price,
  79. stock: item.stock,
  80. spec_value_ids: item.specIds,
  81. sku_name_arr: app.getSkuNameArr(item.specIds)
  82. })
  83. })
  84. }
  85. return skuData
  86. },
  87. // 获取sku记录的规格值列表
  88. getSkuNameArr(specValueIds) {
  89. const app = this
  90. const defaultData = ['默认']
  91. const skuNameArr = []
  92. if (specValueIds != "" && specValueIds.length > 0) {
  93. specValueIds.forEach((valueId, specId) => {
  94. const specValueName = app.getSpecValueName(valueId, specId)
  95. skuNameArr.push(specValueName)
  96. })
  97. }
  98. const result = skuNameArr.length ? skuNameArr : defaultData
  99. return result
  100. },
  101. // 获取指定的规格值名称
  102. getSpecValueName(valueId, specId) {
  103. const app = this
  104. const { goods: { specList } } = app
  105. if (specList.length > 0) {
  106. const res = specList[specId].valueList.find(specValue => {
  107. return specValue.specValueId == valueId
  108. })
  109. if (res) {
  110. return res.specValue
  111. } else {
  112. return ""
  113. }
  114. } else {
  115. return ""
  116. }
  117. },
  118. // 整理规格数据
  119. getSpecList() {
  120. const { goods: { specList } } = this;
  121. const defaultData = [{ name: '默认', list: [{ name: '默认' }] }];
  122. const specData = [];
  123. if (specList.length > 0) {
  124. specList.forEach(group => {
  125. const children = [];
  126. group.valueList.forEach(specValue => {
  127. children.push({ name: specValue.specValue });
  128. })
  129. specData.push({
  130. name: group.name,
  131. list: children
  132. })
  133. })
  134. }
  135. return specData.length > 0 ? specData : defaultData
  136. },
  137. // sku组件 开始-----------------------------------------------------------
  138. openSkuPopup() {
  139. // console.log("监听 - 打开sku组件")
  140. },
  141. closeSkuPopup() {
  142. // console.log("监听 - 关闭sku组件")
  143. },
  144. // 加入购物车按钮
  145. addCart(selectShop) {
  146. const app = this
  147. console.log(selectShop)
  148. const { goods_id, sku_id, buy_num } = selectShop
  149. CartApi.save(goods_id, '+', sku_id, buy_num)
  150. .then(result => {
  151. // 隐藏当前弹窗
  152. app.onChangeValue(false)
  153. // 购物车商品总数量
  154. const cartTotal = result.data.cartTotal
  155. // 缓存购物车数量
  156. setCartTotalNum(cartTotal)
  157. // 传递给父级
  158. app.$emit('addCart', cartTotal)
  159. })
  160. },
  161. // 立即购买
  162. buyNow(selectShop) {
  163. // 跳转到订单结算页
  164. this.$navTo('pages/settlement/goods', {
  165. mode: 'buyNow',
  166. goodsId: selectShop.goods_id,
  167. skuId: selectShop.sku_id,
  168. buyNum: selectShop.buy_num
  169. })
  170. // 隐藏当前弹窗
  171. this.onChangeValue(false)
  172. }
  173. }
  174. }
  175. </script>
  176. <style lang="scss" scoped>
  177. </style>