Browse Source

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

Xiao_123 4 months ago
parent
commit
de35955e2f

+ 15 - 5
src/components/FormUI/su-number-box/su-number-box.vue

@@ -1,12 +1,14 @@
 <template>
 <template>
   <view class="d-flex align-center">
   <view class="d-flex align-center">
     <v-btn
     <v-btn
+      v-if="showMinus"
       icon="mdi-minus" 
       icon="mdi-minus" 
       size="x-small" 
       size="x-small" 
       :disabled="inputValue <= min || disabled" 
       :disabled="inputValue <= min || disabled" 
       @click="_calcValue('minus')"
       @click="_calcValue('minus')"
     ></v-btn>
     ></v-btn>
     <input
     <input
+      v-if="showNumber"
       :disabled="disabled"
       :disabled="disabled"
       @focus="_onFocus"
       @focus="_onFocus"
       @blur="_onBlur"
       @blur="_onBlur"
@@ -16,12 +18,12 @@
       :style="{ color }"
       :style="{ color }"
     />
     />
     <v-btn
     <v-btn
+      v-if="showPlus"
       icon="mdi-plus" 
       icon="mdi-plus" 
       size="x-small" 
       size="x-small" 
       :disabled="inputValue >= max || disabled" 
       :disabled="inputValue >= max || disabled" 
       @click="_calcValue('plus')"
       @click="_calcValue('plus')"
     ></v-btn>
     ></v-btn>
-    <div class="ml-3" style="color: #b7b7b7; font-size: 14px;">库存:{{ totalStock }}</div>
   </view>
   </view>
 </template>
 </template>
 <script>
 <script>
@@ -61,10 +63,6 @@
         type: Number,
         type: Number,
         default: 100,
         default: 100,
       },
       },
-      totalStock: {
-        type: Number,
-        default: 0,
-      },
       step: {
       step: {
         type: Number,
         type: Number,
         default: 1,
         default: 1,
@@ -81,6 +79,18 @@
         type: Boolean,
         type: Boolean,
         default: false,
         default: false,
       },
       },
+      showPlus: {
+        type: Boolean,
+        default: true,
+      },
+      showMinus: {
+        type: Boolean,
+        default: true,
+      },
+      showNumber: {
+        type: Boolean,
+        default: true,
+      },
       activity: {
       activity: {
         type: String,
         type: String,
         default: 'none',
         default: 'none',

+ 7 - 1
src/views/mall/components/details.vue

@@ -4,7 +4,10 @@
   <!-- <Navbar /> -->
   <!-- <Navbar /> -->
   <div class="default-width pb-5 mt-3 pt-3" v-if="state.goodsInfo && Object.keys(state.goodsInfo).length">
   <div class="default-width pb-5 mt-3 pt-3" v-if="state.goodsInfo && Object.keys(state.goodsInfo).length">
     <v-card class="carousel border-radius-8 white-bgc pa-5" style="width: 100%;">
     <v-card class="carousel border-radius-8 white-bgc pa-5" style="width: 100%;">
-      <v-btn variant="text" size="x-large" prepend-icon="mdi-chevron-triple-left" color="primary" @click.stop="goBack">返回</v-btn>
+      <div class="d-flex justify-space-between align-center">
+        <v-btn variant="text" size="x-large" prepend-icon="mdi-chevron-triple-left" color="primary" @click.stop="goBack">返回</v-btn>
+        <v-btn variant="text" size="x-large" prepend-icon="mdi-cart-outline" color="primary" @click.stop="goBack">购物车</v-btn>
+      </div>
       <div class="mt-1 d-flex">
       <div class="mt-1 d-flex">
         <!-- 图片展示-轮播 -->
         <!-- 图片展示-轮播 -->
         <div style="width: 400px; height: 400px;">
         <div style="width: 400px; height: 400px;">
@@ -50,6 +53,7 @@
           <selectSku
           <selectSku
             v-if="showSelectSku"
             v-if="showSelectSku"
             class="mb-7"
             class="mb-7"
+            :goodsType="goodsType"
             :goodsInfo="state.goodsInfo"
             :goodsInfo="state.goodsInfo"
             @change="onSkuChange"
             @change="onSkuChange"
             @buy="onBuy"
             @buy="onBuy"
@@ -110,6 +114,7 @@ const carouselHover = ref(false)
 const showSelectedSkuImg = ref(false)
 const showSelectedSkuImg = ref(false)
 
 
 const showPrize = ref(false)
 const showPrize = ref(false)
+const goodsType = ref(0)
 const showActivePrices = ref(false) // 下单送房券
 const showActivePrices = ref(false) // 下单送房券
 const lotteryId = ref('')
 const lotteryId = ref('')
 // 获取商品详情
 // 获取商品详情
@@ -121,6 +126,7 @@ const getData = async () => {
   obj.sliderPicUrls = obj.sliderPicUrls || []
   obj.sliderPicUrls = obj.sliderPicUrls || []
   state.skeletonLoading = false;
   state.skeletonLoading = false;
   state.goodsInfo = obj
   state.goodsInfo = obj
+  goodsType.value = obj?.type ? obj.type-0 : 0
   showSelectSku.value = true
   showSelectSku.value = true
 
 
   // 查询当前商品是否参与抽奖活动
   // 查询当前商品是否参与抽奖活动

+ 24 - 17
src/views/mall/components/details/s-select-sku.vue

@@ -24,21 +24,24 @@
         </v-chip>
         </v-chip>
       </span>
       </span>
     </div>
     </div>
-    <!-- 购买数量 -->
+    <!-- 购买数量- 库存 -->
     <div class="modal-content">
     <div class="modal-content">
-      <div>
-        <div class="buyCount mb-10">
+      <!-- 只展示库存 -->
+      <div v-if="props.goodsType === 99" class="parameterColor mb-10"><span class="l-s-10">库存</span>:{{ totalStock }}</div>
+      <div v-else class="d-flex align-center mb-10">
+        <div class="buyCount mr-3">
           <span class="parameterColor"><span class="l-s-10">数量</span>:</span>
           <span class="parameterColor"><span class="l-s-10">数量</span>:</span>
           <su-number-box
           <su-number-box
             :min="1"
             :min="1"
             :max="state.selectedSku.stock"
             :max="state.selectedSku.stock"
-            :totalStock="totalStock"
             :step="1"
             :step="1"
             ref="selectSkuRef"
             ref="selectSkuRef"
             v-model="state.selectedSku.goods_num"
             v-model="state.selectedSku.goods_num"
             @change="onNumberChange($event)"
             @change="onNumberChange($event)"
           />
           />
         </div>
         </div>
+        <!-- 数量可加减 库存 -->
+        <span style="color: #b7b7b7; font-size: 14px;">库存:{{ totalStock }}</span>
       </div>
       </div>
     </div>
     </div>
     <!-- 操作区 -->
     <!-- 操作区 -->
@@ -50,19 +53,23 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-defineOptions({name: 'wares-s-select-sku'})
-import Snackbar from '@/plugins/snackbar'
-import suNumberBox from '@/components/FormUI/su-number-box/su-number-box.vue'
-import { computed, reactive, watch, ref } from 'vue'
-import { convertProductPropertyList } from '@/views/mall/utils'
-
-const emits = defineEmits(['change', 'addCart', 'buy', 'close']);
-const props = defineProps({
-  goodsInfo: {
-    type: Object,
-    default() {},
-  },
-});
+  defineOptions({name: 'wares-s-select-sku'})
+  import Snackbar from '@/plugins/snackbar'
+  import suNumberBox from '@/components/FormUI/su-number-box/su-number-box.vue'
+  import { computed, reactive, watch, ref } from 'vue'
+  import { convertProductPropertyList } from '@/views/mall/utils'
+
+  const emits = defineEmits(['change', 'addCart', 'buy', 'close']);
+  const props = defineProps({
+    goodsInfo: {
+      type: Object,
+      default() {},
+    },
+    goodsType: {
+      type: Number,
+      default: 0,
+    },
+  });
 
 
   const totalStock = ref(props.goodsInfo?.stock-0 || 0)
   const totalStock = ref(props.goodsInfo?.stock-0 || 0)
   const state = reactive({
   const state = reactive({

+ 30 - 3
src/views/mall/home/index.vue

@@ -17,9 +17,12 @@
           </v-carousel>
           </v-carousel>
         </div>
         </div>
 
 
-        <v-tabs class="mt-10" v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa">
-          <v-tab v-for="(val, i) in tabList" :key="i" :value="val.value">{{ val.title }}</v-tab>
-        </v-tabs>
+        <div class="tabs">
+          <v-tabs class="mt-10" v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa">
+            <v-tab v-for="(val, i) in tabList" :key="i" :value="val.value">{{ val.title }}</v-tab>
+          </v-tabs>
+          <v-btn class="cart" variant="text" prepend-icon="mdi-cart-outline" color="primary" @click="handleTo('/mall/cart')">购物车</v-btn>
+        </div>
 
 
         <!-- 热门商品 -->
         <!-- 热门商品 -->
         <HotGoods v-if="tab === 0" :templateData="template" />
         <HotGoods v-if="tab === 0" :templateData="template" />
@@ -44,6 +47,7 @@ import { useMallStore } from '@/store/mall'
 import { useUserStore } from '@/store/user'
 import { useUserStore } from '@/store/user'
 import Snackbar from '@/plugins/snackbar'
 import Snackbar from '@/plugins/snackbar'
 import { useRouter } from 'vue-router'
 import { useRouter } from 'vue-router'
+import { getToken } from '@/utils/auth'
 
 
 const router = useRouter()
 const router = useRouter()
 
 
@@ -90,6 +94,8 @@ const loginSuccess = () => {
     setTimeout(() => {
     setTimeout(() => {
       returnUrl.value = ''
       returnUrl.value = ''
     }, 1000)
     }, 1000)
+  } else {
+    window.location.reload()
   }
   }
 }
 }
 
 
@@ -97,7 +103,28 @@ const loginClose = () => {
   showLogin.value = false
   showLogin.value = false
   Snackbar.warning('您已取消登录')
   Snackbar.warning('您已取消登录')
 }
 }
+
+const handleTo = (path) => {
+  if (!getToken()) {
+    Snackbar.warning('请先登录')
+    showLogin.value = true // 打开快速登录弹窗
+    returnUrl.value = path
+    return
+  }
+  router.push(path)
+}
 </script>
 </script>
 
 
 <style scoped lang="scss">
 <style scoped lang="scss">
+.tabs {
+  position: relative;
+  .cart {
+    position: absolute;
+    right: 0;
+    top: 0;
+    height: 48px;
+    line-height: 48px;
+    // color: var(--v-primary-base);
+  }
+}
 </style>
 </style>