shop_item.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <view class="shop-item" @click="handleClick">
  3. <!-- 店铺头部信息 -->
  4. <view class="shop-header">
  5. <view class="shop-avatar">
  6. <image :src="item.logo" mode="aspectFill" />
  7. </view>
  8. <view class="shop-info">
  9. <view class="shop-name">{{ item.name }}</view>
  10. <view class="shop-visits">
  11. <image
  12. class="img"
  13. src="/static/seller/address.png"
  14. model="fixwidth"
  15. ></image>
  16. <text>{{ item.distance }}km</text>
  17. </view>
  18. </view>
  19. <view class="shop-arrow">
  20. <up-rate
  21. readonly
  22. :count="5"
  23. size="16"
  24. active-color="var(--red)"
  25. v-model="item.score"
  26. ></up-rate>
  27. </view>
  28. </view>
  29. <!-- 商品横向滚动列表 -->
  30. <view class="products-scroll">
  31. <up-scroll-list class="scroll-container" :indicator="false">
  32. <view class="products-list">
  33. <view
  34. v-for="product in item.goods"
  35. :key="product.id"
  36. class="product-item"
  37. @click.stop="handleProductClick(product)"
  38. >
  39. <view class="product-image">
  40. <image :src="product.picurl" mode="aspectFill" />
  41. </view>
  42. <view class="product-info">
  43. <view class="product-desc">{{ product.goodsName }}</view>
  44. <view class="product-price">¥{{ product.price }}</view>
  45. </view>
  46. </view>
  47. </view>
  48. </up-scroll-list>
  49. </view>
  50. </view>
  51. </template>
  52. <script setup>
  53. import { defineProps, defineEmits } from "vue";
  54. const props = defineProps({
  55. item: {
  56. type: Object,
  57. required: true,
  58. },
  59. });
  60. const emit = defineEmits(["click", "productClick"]);
  61. const handleClick = () => {
  62. emit("click", props.item);
  63. };
  64. const handleProductClick = (product) => {
  65. emit("productClick", product);
  66. // 跳转到商品详情页
  67. uni.navigateTo({
  68. url: `/pagesBuyer/shop/detail?id=${product.id}`,
  69. });
  70. };
  71. </script>
  72. <style lang="less" scoped>
  73. @import url("@/style.less");
  74. .shop-item {
  75. width: 100%;
  76. background: var(--light);
  77. margin-bottom: 24rpx;
  78. padding: 14rpx 30rpx;
  79. box-sizing: border-box;
  80. .shop-header {
  81. display: flex;
  82. align-items: center;
  83. margin-bottom: 30rpx;
  84. .shop-avatar {
  85. width: 66rpx;
  86. height: 66rpx;
  87. border-radius: 50%;
  88. overflow: hidden;
  89. margin-right: 10rpx;
  90. image {
  91. width: 100%;
  92. height: 100%;
  93. }
  94. }
  95. .shop-info {
  96. flex: 1;
  97. .shop-name {
  98. font-size: 28rpx;
  99. font-weight: bold;
  100. color: var(--black);
  101. margin-bottom: 8rpx;
  102. }
  103. .shop-visits {
  104. display: flex;
  105. font-size: 24rpx;
  106. color: var(--text-01);
  107. line-height: 24rpx;
  108. .img {
  109. width: 18rpx;
  110. height: 24rpx;
  111. margin-right: 8rpx;
  112. }
  113. }
  114. }
  115. .shop-arrow {
  116. .icon-right {
  117. color: var(--text-01);
  118. font-size: 24rpx;
  119. }
  120. }
  121. }
  122. .products-scroll {
  123. width: 100%;
  124. overflow-x: auto;
  125. .scroll-container {
  126. display: flex;
  127. flex-direction: row;
  128. }
  129. .products-list {
  130. display: flex;
  131. gap: 20rpx;
  132. }
  133. .product-item {
  134. width: 200rpx;
  135. .product-image {
  136. width: 100%;
  137. height: 180rpx;
  138. position: relative;
  139. image {
  140. width: 100%;
  141. height: 100%;
  142. border-radius: 16rpx;
  143. }
  144. }
  145. .product-info {
  146. padding: 14rpx 0;
  147. .product-price {
  148. font-size: 24rpx;
  149. font-weight: bold;
  150. color: var(--red);
  151. }
  152. .product-desc {
  153. font-size: 20rpx;
  154. color: var(--text-01);
  155. line-height: 1.4;
  156. .ellipsis(1);
  157. margin-bottom: 8rpx;
  158. }
  159. }
  160. }
  161. }
  162. }
  163. </style>