index.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <route lang="json5">
  2. {
  3. style: {
  4. navigationBarTitleText: '品质商城',
  5. navigationBarBackgroundColor: '#fff',
  6. },
  7. }
  8. </route>
  9. <script setup lang="ts">
  10. import TiltedButton from '@/components/tilted-button.vue'
  11. import Product from './components/product.vue'
  12. import { shoppingBag } from '@designer-hub/assets/src/assets/svgs/index'
  13. import { useRouter } from '../../../core/utils/router'
  14. import {
  15. getBanners,
  16. getProductCategories,
  17. getProductItemBuy,
  18. getProducts,
  19. } from '../../../core/libs/requests'
  20. import PageHelper from '@/components/page-helper.vue'
  21. import { BannerMode } from '../../../core/libs/models'
  22. import Banner from '../components/banner.vue'
  23. import BottomAppBar from '@/components/bottom-app-bar.vue'
  24. import { useUserStore } from '../../../store'
  25. import { storeToRefs } from 'pinia'
  26. const router = useRouter()
  27. const userStore = useUserStore()
  28. const { userInfo } = storeToRefs(userStore)
  29. const { data: productCategories, run: setProductCategories } = useRequest(
  30. () => getProductCategories(),
  31. { initialData: [] },
  32. )
  33. const { data: banners, run: setBanners } = useRequest(() => getBanners({ mode: BannerMode.Mall }), {
  34. initialData: [],
  35. })
  36. const { data: carts, run: setCarts } = useRequest(
  37. () => getProductItemBuy({ userId: userInfo.value.userId }),
  38. { initialData: { list: [], total: 0 } },
  39. )
  40. const current = ref<number>(0)
  41. const swiperList = computed(() => banners.value.map((it) => it.bannerImgUrl))
  42. const categories = computed(() => productCategories.value.find(({ id }) => id === 1)?.children)
  43. const category = ref()
  44. const query = computed(() => ({
  45. oneCategory: category.value?.parentId,
  46. secondCategory: category.value?.id,
  47. }))
  48. const handleChange = async () => {
  49. setCarts()
  50. }
  51. onMounted(async () => {
  52. await setProductCategories()
  53. await setBanners()
  54. await setCarts()
  55. category.value = categories.value[0]
  56. })
  57. </script>
  58. <template>
  59. <view class="bg-white flex-grow flex flex-col px-3.5 py-5.5 gap-5.5">
  60. <Banner :mode="BannerMode.Mall"></Banner>
  61. <div class="w-full inline-flex gap-2">
  62. <!-- <div><wd-button type="primary" size="small">GELATO专区</wd-button></div> -->
  63. <template v-for="(it, i) in categories" :key="i">
  64. <div>
  65. <wd-button
  66. :type="it.id === category?.id ? 'primary' : 'default'"
  67. :plain="it.id !== category?.id"
  68. size="small"
  69. @click="category = it"
  70. >
  71. {{ it.name }}
  72. </wd-button>
  73. </div>
  74. </template>
  75. </div>
  76. <PageHelper
  77. v-if="category"
  78. v-slot="{ data }"
  79. class="flex-grow flex flex-col"
  80. :request="getProducts"
  81. :query="query"
  82. >
  83. <!-- <wd-skeleton
  84. :row-col="[[{ width: 100, height: 100 }, , { width: 100, height: 100 }]]"
  85. :loading="true"
  86. > -->
  87. <div class="grid grid-cols-2 gap-2.5">
  88. <template v-for="(it, i) of data" :key="i">
  89. <Product :options="it" @change="handleChange"></Product>
  90. </template>
  91. </div>
  92. <!-- </wd-skeleton> -->
  93. </PageHelper>
  94. <BottomAppBar fixed>
  95. <div class="h-16 bg-white flex items-center justify-between px-3.5">
  96. <!-- <div> -->
  97. <!-- <wd-button type="text" size="small"> -->
  98. <wd-img :round="false" width="32" height="32" :src="shoppingBag"></wd-img>
  99. <!-- </wd-button> -->
  100. <!-- </div> -->
  101. <div @click="router.push('/pages/home/mall/shopping-cart/index')">
  102. <TiltedButton custom-class="text-center! items-center" size="large">
  103. <span
  104. class="h-[22px] text-white text-base font-normal font-['PingFang_SC'] leading-tight"
  105. >
  106. 购物车
  107. </span>
  108. <span class="h-[22px] text-white text-sm font-normal font-['PingFang_SC']">
  109. <template v-if="carts.total">(已选{{ carts.total }}件)</template>
  110. </span>
  111. </TiltedButton>
  112. </div>
  113. </div>
  114. </BottomAppBar>
  115. </view>
  116. </template>
  117. <style scoped lang="scss"></style>