Browse Source

!131 【缺陷修复】购物车提交的校验、bgStyle 样式
Merge pull request !131 from puhui999/dev

芋道源码 8 tháng trước cách đây
mục cha
commit
75d0b004dc

+ 1 - 1
pages/activity/groupon/list.vue

@@ -1,6 +1,6 @@
 <!-- 拼团活动列表 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FE832A' }" navbar="inner">
+  <s-layout :bgStyle="{ color: '#FE832A' }" navbar="inner">
     <view class="page-bg" :style="[{ marginTop: '-' + Number(statusBarHeight + 88) + 'rpx' }]" />
     <view class="list-content">
       <!-- 参团会员统计 -->

+ 1 - 1
pages/activity/seckill/list.vue

@@ -1,6 +1,6 @@
 <!-- 秒杀活动列表 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: 'rgb(245,28,19)' }" navbar="inner">
+  <s-layout :bgStyle="{ color: 'rgb(245,28,19)' }" navbar="inner">
     <!--顶部背景图-->
     <view
       class="page-bg"

+ 1 - 1
pages/coupon/list.vue

@@ -1,6 +1,6 @@
 <!-- 优惠券中心  -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#f2f2f2' }" title="优惠券">
+  <s-layout :bgStyle="{ color: '#f2f2f2' }" title="优惠券">
     <su-sticky bgColor="#fff">
       <su-tabs
         :list="tabMaps"

+ 53 - 31
pages/index/cart.vue

@@ -1,5 +1,5 @@
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#fff' }" tabbar="/pages/index/cart" title="购物车">
+  <s-layout :bgStyle="{ color: '#fff' }" tabbar="/pages/index/cart" title="购物车">
     <s-empty
       v-if="state.list.length === 0"
       icon="/static/cart-empty.png"
@@ -109,7 +109,6 @@
   import { computed, reactive } from 'vue';
   import { fen2yuan } from '@/sheep/hooks/useGoods';
   import { isEmpty } from '@/sheep/helper/utils';
-  import { DeliveryTypeEnum } from '@/sheep/util/const';
 
   const sys_navBar = sheep.$platform.navbar;
   const cart = sheep.$store('cart');
@@ -158,37 +157,60 @@
     });
   }
 
-  /** 校验配送方式 */
-  function validateDeliveryType(spuIds) {
-    return new Promise(async (resolve, reject) => {
-      const { data } = await SpuApi.getSpuListByIds(spuIds.join(','));
-      if (isEmpty(data)) {
-        reject('获取商品信息失败!!!');
-        return;
-      }
-      let onlyExpress = false; // 只快递
-      let onlyPickup = false; // 只自提
-      // TODO @puhui999:这里需要比对,A 商品支持自提、B 商品支持快递,这样导致 A 和 B 无法一起下单。
-      const deliveryTypes = data.map((item) => item.deliveryTypes);
-      for (const deliveryType of deliveryTypes) {
-        // 情况一:两种配送方式都支持
-        if (deliveryType.length > 1) {
-          continue;
-        }
-        // 情况二:只支持一种
-        if (deliveryType[0] === DeliveryTypeEnum.EXPRESS.type) {
-          onlyExpress = true;
-        } else if (deliveryType[0] === DeliveryTypeEnum.PICK_UP.type) {
-          onlyPickup = true;
+  /**
+   * 校验配送方式冲突
+   *
+   * @param {string[]} spuIds - 商品ID数组
+   * @returns {Promise<void>}
+   * @throws {Error} 当配送方式冲突或获取商品信息失败时抛出错误
+   */
+  async function validateDeliveryType(spuIds) {
+    // 获取商品信息
+    const { data: spuList } = await SpuApi.getSpuListByIds(spuIds.join(','));
+    if (isEmpty(spuList)) {
+      sheep.$helper.toast('未找到商品信息');
+      throw new Error('未找到商品信息');
+    }
+    // 获取所有商品的配送方式列表
+    const deliveryTypesList = spuList.map(item => item.deliveryTypes);
+    // 检查配送方式冲突
+    const hasConflict = checkDeliveryConflicts(deliveryTypesList);
+    if (hasConflict) {
+      sheep.$helper.toast('选中商品支持的配送方式冲突,不允许提交');
+      throw new Error('选中商品支持的配送方式冲突,不允许提交');
+    }
+  }
+
+  /**
+   * 检查配送方式列表中是否存在冲突
+   * @description
+   * 示例场景:
+   * A 商品支持:[快递, 自提]
+   * B 商品支持:[快递]
+   * C 商品支持:[自提]
+   *
+   * 对比结果:
+   * A 和 B:不冲突 (有交集:快递)
+   * A 和 C:不冲突 (有交集:自提)
+   * B 和 C:冲突 (无交集)
+   * @param {Array<Array<number>>} deliveryTypesList - 配送方式列表的数组
+   * @returns {boolean} 是否存在冲突
+   */
+  function checkDeliveryConflicts(deliveryTypesList) {
+    for (let i = 0; i < deliveryTypesList.length - 1; i++) {
+      const currentTypes = deliveryTypesList[i];
+      for (let j = i + 1; j < deliveryTypesList.length; j++) {
+        const nextTypes = deliveryTypesList[j];
+        // 检查是否没有交集(即冲突)
+        const hasNoIntersection = !currentTypes.some(type =>
+          nextTypes.includes(type),
+        );
+        if (hasNoIntersection) {
+          return true;
         }
       }
-      if (onlyExpress || onlyPickup) {
-        reject('选中商品存在只支持特定配送方式的情况不允许提交!!!');
-        sheep.$helper.toast('选中商品存在只支持特定配送方式的情况不允许提交!!!');
-        return;
-      }
-      resolve();
-    });
+    }
+    return false;
   }
 
   function onNumberChange(e, cartItem) {

+ 1 - 1
pages/index/category.vue

@@ -1,6 +1,6 @@
 <!-- 商品分类列表 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#fff' }" tabbar="/pages/index/category" title="分类">
+  <s-layout :bgStyle="{ color: '#fff' }" tabbar="/pages/index/category" title="分类">
     <view class="s-category">
       <view class="three-level-wrap ss-flex ss-col-top" :style="[{ height: pageHeight + 'px' }]">
         <!-- 商品分类(左) -->

+ 1 - 1
pages/index/search.vue

@@ -1,6 +1,6 @@
 <!-- 搜索界面 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FFF' }" class="set-wrap" title="搜索">
+  <s-layout :bgStyle="{ color: '#FFF' }" class="set-wrap" title="搜索">
     <view class="ss-p-x-24">
       <view class="ss-flex ss-col-center">
         <uni-search-bar

+ 1 - 1
pages/pay/result.vue

@@ -1,6 +1,6 @@
 <!-- 支付结果页面 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FFF' }" title="支付结果">
+  <s-layout :bgStyle="{ color: '#FFF' }" title="支付结果">
     <view class="pay-result-box ss-flex-col ss-row-center ss-col-center">
       <!-- 信息展示 -->
       <view class="pay-waiting ss-m-b-30" v-if="payResult === 'waiting'" />

+ 1 - 1
pages/public/faq.vue

@@ -1,6 +1,6 @@
 <!-- FAQ 常见问题 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FFF' }" class="set-wrap" title="常见问题">
+  <s-layout :bgStyle="{ color: '#FFF' }" class="set-wrap" title="常见问题">
     <uni-collapse>
       <uni-collapse-item v-for="(item, index) in state.list" :key="item">
         <template v-slot:title>

+ 1 - 1
pages/public/richtext.vue

@@ -1,6 +1,6 @@
 <!-- 文章展示 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FFF' }" :title="state.title" class="set-wrap">
+  <s-layout :bgStyle="{ color: '#FFF' }" :title="state.title" class="set-wrap">
     <view class="ss-p-30">
       <mp-html class="richtext" :content="state.content" />
     </view>

+ 1 - 1
pages/public/setting.vue

@@ -1,5 +1,5 @@
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#fff' }" class="set-wrap" title="系统设置">
+  <s-layout :bgStyle="{ color: '#fff' }" class="set-wrap" title="系统设置">
     <view class="header-box ss-flex-col ss-row-center ss-col-center">
       <image
         class="logo-img ss-m-b-46"

+ 1 - 1
pages/user/address/list.vue

@@ -1,6 +1,6 @@
 <!-- 收件地址列表 -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FFF' }" title="收货地址">
+  <s-layout :bgStyle="{ color: '#FFF' }" title="收货地址">
     <view v-if="state.list.length">
       <s-address-item
         hasBorderBottom

+ 1 - 1
pages/user/goods-log.vue

@@ -1,6 +1,6 @@
 <!-- 商品浏览记录  -->
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#f2f2f2' }" title="我的足迹">
+  <s-layout :bgStyle="{ color: '#f2f2f2' }" title="我的足迹">
     <view class="cart-box ss-flex ss-flex-col ss-row-between">
       <!-- 头部 -->
       <view class="cart-header ss-flex ss-col-center ss-row-between ss-p-x-30">

+ 1 - 1
pages/user/goods_details_store/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <s-layout :bgStyle="{ backgroundColor: '#FFF' }" title="选择自提门店">
+  <s-layout :bgStyle="{ color: '#FFF' }" title="选择自提门店">
     <view class="storeBox" ref="container">
       <view
         class="storeBox-box"

+ 3 - 4
sheep/components/s-layout/s-layout.vue

@@ -107,7 +107,7 @@
       type: Object,
       default: () => ({
         src: '',
-        backgroundColor: 'var(--ui-BG-1)',
+        color: 'var(--ui-BG-1)',
       }),
     },
     tabbar: {
@@ -153,11 +153,10 @@
   });
 
   // 背景1
-  // TODO puhui999:是不是应该还是用 color。然后后端装修那,做下调整~
   const bgMain = computed(() => {
     if (navbarMode.value === 'inner') {
       return {
-        background: `${props.bgStyle.backgroundColor} url(${sheep.$url.cdn(
+        background: `${props.bgStyle.backgroundColor || props.bgStyle.color} url(${sheep.$url.cdn(
           props.bgStyle.backgroundImage,
         )}) no-repeat top center / 100% auto`,
       };
@@ -169,7 +168,7 @@
   const bgBody = computed(() => {
     if (navbarMode.value === 'normal') {
       return {
-        background: `${props.bgStyle.backgroundColor} url(${sheep.$url.cdn(
+        background: `${props.bgStyle.backgroundColor || props.bgStyle.color} url(${sheep.$url.cdn(
           props.bgStyle.backgroundImage,
         )}) no-repeat top center / 100% auto`,
       };