فهرست منبع

【代码优化】拼团重构

卢越 11 ماه پیش
والد
کامیت
089e0197cd
3فایلهای تغییر یافته به همراه62 افزوده شده و 55 حذف شده
  1. 12 5
      pages/goods/groupon.vue
  2. 3 3
      sheep/api/promotion/combination.js
  3. 47 47
      sheep/components/s-groupon-block/s-groupon-block.vue

+ 12 - 5
pages/goods/groupon.vue

@@ -90,7 +90,7 @@
         <s-select-groupon-sku
           :show="state.showSelectSku"
           :goodsInfo="state.goodsInfo"
-		  :selectedSku="state.selectedSku"
+          :selectedSku="state.selectedSku"
           :grouponAction="state.grouponAction"
           :grouponNum="state.grouponNum"
           @buy="onBuy"
@@ -126,7 +126,12 @@
             :disabled="state.goodsInfo.stock === 0 || state.activity.status !== 0"
           >
             <view class="btn-price">{{
-              fen2yuan(state.selectedSku.price * state.selectedSku.count || state.activity.price * state.selectedSku.count || state.goodsInfo.price * state.selectedSku.count || state.goodsInfo.price)
+              fen2yuan(
+                state.selectedSku.price * state.selectedSku.count ||
+                  state.activity.price * state.selectedSku.count ||
+                  state.goodsInfo.price * state.selectedSku.count ||
+                  state.goodsInfo.price,
+              )
             }}</view>
             <view v-if="state.activity.startTime > new Date().getTime()">未开始</view>
             <view v-else-if="state.activity.endTime <= new Date().getTime()">已结束</view>
@@ -263,10 +268,12 @@
     // 加载商品信息
     const { data: spu } = await SpuApi.getSpuDetail(activity.spuId);
     state.goodsId = spu.id;
+
     // 默认显示最低价
-    activity.products.forEach((product) => {
-      state.activity.price = Math.min(spu.price, product.combinationPrice); // 设置 SPU 的最低价格
-    });
+    spu.price = activity.products.reduce((min, product) => {
+      return Math.min(min, product.combinationPrice || Infinity);
+    }, Infinity);
+
     // 价格、库存使用活动的
     spu.skus.forEach((sku) => {
       const product = activity.products.find((product) => product.skuId === sku.id);

+ 3 - 3
sheep/api/promotion/combination.js

@@ -37,7 +37,7 @@ const CombinationApi = {
       url: '/promotion/combination-activity/list-by-ids',
       method: 'GET',
       params: {
-        ids,
+        ids
       },
     });
   },
@@ -58,9 +58,9 @@ const CombinationApi = {
   // 获得我的拼团记录分页
   getCombinationRecordPage: (params) => {
     return request({
-      url: '/promotion/combination-record/page',
+      url: "/promotion/combination-record/page",
       method: 'GET',
-      params,
+      params
     });
   },
 

+ 47 - 47
sheep/components/s-groupon-block/s-groupon-block.vue

@@ -23,7 +23,7 @@
           :subTitleColor="data.fields.introduction.color"
           :topRadius="data.borderRadiusTop"
           :bottomRadius="data.borderRadiusBottom"
-          @click="sheep.$router.go('/pages/goods/index', { id: item.id })"
+          @click="sheep.$router.go('/pages/goods/groupon', { id: item.activityId })"
         >
           <!-- 购买按钮 -->
           <template v-slot:cart>
@@ -35,7 +35,40 @@
       </view>
     </view>
 
-    <!-- 布局2. 双列(每一列:上图,下内容)-->
+    <!-- 布局2. 单列小图(左图,右内容) -->
+    <view
+      v-if="layoutType === LayoutTypeEnum.ONE_COL_SMALL_IMG && state.spuList.length"
+      class="goods-lg-box"
+    >
+      <view
+        class="goods-box"
+        :style="[{ marginBottom: data.space + 'px' }]"
+        v-for="item in state.spuList"
+        :key="item.id"
+      >
+        <s-goods-column
+          class="goods-card"
+          size="lg"
+          :goodsFields="data.fields"
+          :data="item"
+          :tagStyle="data.badge"
+          :titleColor="data.fields.name?.color"
+          :subTitleColor="data.fields.introduction.color"
+          :topRadius="data.borderRadiusTop"
+          :bottomRadius="data.borderRadiusBottom"
+          @tap="sheep.$router.go('/pages/goods/groupon', { id: item.activityId })"
+        >
+          <!-- 购买按钮 -->
+          <template v-slot:cart>
+            <button class="ss-reset-button cart-btn" :style="[buyStyle]">
+              {{ btnBuy.type === 'text' ? btnBuy.text : '' }}
+            </button>
+          </template>
+        </s-goods-column>
+      </view>
+    </view>
+
+    <!-- 布局3. 双列(每一列:上图,下内容)-->
     <view
       v-if="layoutType === LayoutTypeEnum.TWO_COL && state.spuList.length"
       class="goods-md-wrap ss-flex ss-flex-wrap ss-col-top"
@@ -58,7 +91,7 @@
             :topRadius="data.borderRadiusTop"
             :bottomRadius="data.borderRadiusBottom"
             :titleWidth="330 - marginLeft - marginRight"
-            @click="sheep.$router.go('/pages/goods/index', { id: item.id })"
+            @click="sheep.$router.go('/pages/goods/groupon', { id: item.activityId })"
             @getHeight="calculateGoodsColumn($event, 'left')"
           >
             <!-- 购买按钮 -->
@@ -88,7 +121,7 @@
             :topRadius="data.borderRadiusTop"
             :bottomRadius="data.borderRadiusBottom"
             :titleWidth="330 - marginLeft - marginRight"
-            @click="sheep.$router.go('/pages/goods/index', { id: item.id })"
+            @click="sheep.$router.go('/pages/goods/groupon', { id: item.activityId })"
             @getHeight="calculateGoodsColumn($event, 'right')"
           >
             <!-- 购买按钮 -->
@@ -101,39 +134,6 @@
         </view>
       </view>
     </view>
-
-    <!-- 布局3. 单列小图(左图,右内容) -->
-    <view
-      v-if="layoutType === LayoutTypeEnum.ONE_COL_SMALL_IMG && state.spuList.length"
-      class="goods-lg-box"
-    >
-      <view
-        class="goods-box"
-        :style="[{ marginBottom: data.space + 'px' }]"
-        v-for="item in state.spuList"
-        :key="item.id"
-      >
-        <s-goods-column
-          class="goods-card"
-          size="lg"
-          :goodsFields="data.fields"
-          :data="item"
-          :tagStyle="data.badge"
-          :titleColor="data.fields.name?.color"
-          :subTitleColor="data.fields.introduction.color"
-          :topRadius="data.borderRadiusTop"
-          :bottomRadius="data.borderRadiusBottom"
-          @tap="sheep.$router.go('/pages/goods/index', { id: item.id })"
-        >
-          <!-- 购买按钮 -->
-          <template v-slot:cart>
-            <button class="ss-reset-button cart-btn" :style="[buyStyle]">
-              {{ btnBuy.type === 'text' ? btnBuy.text : '' }}
-            </button>
-          </template>
-        </s-goods-column>
-      </view>
-    </view>
   </view>
 </template>
 
@@ -257,16 +257,16 @@
 
     // 循环活动列表
     activityList.forEach((activity) => {
-      // 获取活动商品的最低价格
-      activity.products.forEach((product) => {
-        const combinationPrice = product.combinationPrice || Infinity;
-
-        // 找到对应的 spu 并更新价格
-        const spu = state.spuList.find((spu) => activity.spuId === spu.id);
-        if (spu) {
-          spu.price = Math.min(combinationPrice, spu.price || Infinity);
-        }
-      });
+      // 提取活动价格
+      const combinationPrice = activity.combinationPrice || Infinity;
+      // 查找对应的 spu 并更新价格
+      const spu = state.spuList.find((spu) => activity.spuId === spu.id);
+      if (spu) {
+        // 赋值最低价格
+        spu.price = Math.min(combinationPrice, spu.price);
+        // 赋值活动ID,为了点击跳转详情页
+        spu.activityId = activity.id;
+      }
     });
 
     // 只有双列布局时需要