product.vue 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <script lang="ts" setup>
  2. import { addBlack } from '@designer-hub/assets/src/assets/svgs'
  3. import { useRouter } from '../../../../core/utils/router'
  4. import { PropType } from 'vue'
  5. import { requestToast } from '../../../../core/utils/common'
  6. import { createProductItemBuy } from '../../../../core/libs/requests'
  7. import { useUserStore } from '../../../../store'
  8. import { storeToRefs } from 'pinia'
  9. const props = defineProps({
  10. options: {
  11. type: Object as PropType<any>,
  12. default: () => {},
  13. },
  14. })
  15. const emits = defineEmits<{ change: [] }>()
  16. const userStore = useUserStore()
  17. const { userInfo } = storeToRefs(userStore)
  18. const router = useRouter()
  19. const handleAddToCart = async () => {
  20. await requestToast(
  21. () =>
  22. createProductItemBuy({
  23. doList: [
  24. {
  25. userId: userInfo.value.userId,
  26. productId: props.options?.productId || '',
  27. points: props.options?.points,
  28. nums: 1,
  29. },
  30. ],
  31. }),
  32. { success: true, successTitle: '加入购物车成功' },
  33. )
  34. emits('change')
  35. }
  36. </script>
  37. <template>
  38. <div
  39. class="w-full flex flex-col gap-2.5"
  40. @click="router.push(`/pages/home/mall/detail/index?id=${options.productId}`)"
  41. >
  42. <div class="bg-[#f6f6f6] rounded-2xl w-full aspect-square overflow-hidden">
  43. <wd-img
  44. width="100%"
  45. height="100%"
  46. :src="options.productCoverImgUrl"
  47. mode="aspectFill"
  48. custom-class="aspect-square"
  49. ></wd-img>
  50. </div>
  51. <div class="flex">
  52. <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-normal">
  53. <!-- 阿芙佳朵 -->
  54. {{ options.prodcutName }}
  55. </div>
  56. <div class="flex-1"></div>
  57. <div
  58. class="w-[26px] text-black/30 text-xs font-normal font-['PingFang_SC'] line-through leading-normal"
  59. >
  60. <!-- ¥60 -->
  61. ¥{{ options.productPrice }}
  62. </div>
  63. </div>
  64. <div class="flex items-center mb-6">
  65. <div class="flex items-end gap-1">
  66. <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-5.5">
  67. <!-- 1000 -->
  68. {{ options.points }}
  69. </div>
  70. <div class="text-black/60 text-sm font-normal font-['PingFang_SC']">积分</div>
  71. </div>
  72. <div class="flex-1"></div>
  73. <div class="" @click.stop="handleAddToCart">
  74. <wd-img width="32" height="32" :src="addBlack"></wd-img>
  75. </div>
  76. </div>
  77. </div>
  78. </template>