Browse Source

fix(app): 购物车结算

EvilDragon 4 months ago
parent
commit
a822e6c345

+ 2 - 2
packages/app/env/.env.development

@@ -5,14 +5,14 @@ VITE_DELETE_CONSOLE = false
 # 是否开启sourcemap
 VITE_SHOW_SOURCEMAP = true
 
-VITE_SERVER_BASEURL = 'https://www.zhuchaohui.com'
+# VITE_SERVER_BASEURL = 'https://www.zhuchaohui.com'
 # VITE_SERVER_BASEURL = 'http://39.106.91.179:48080'
 # VITE_SERVER_BASEURL = 'http://192.168.2.34:48080'
 # 王超
 # VITE_SERVER_BASEURL = 'http://192.168.2.39:48080'
 # VITE_SERVER_BASEURL = 'http://192.168.0.157:48080'
 # 刘岁成
-# VITE_SERVER_BASEURL = 'http://192.168.2.38:48080'
+VITE_SERVER_BASEURL = 'http://192.168.2.38:48080'
 # 赵要军
 # VITE_SERVER_BASEURL = 'http://192.168.2.41:48080'
 # 姚逊涛

+ 2 - 1
packages/app/pages.config.ts

@@ -57,9 +57,10 @@ export default defineUniPages({
         name: '确认订单',
         path: '/pages/home/mall/confirm-order/index',
         query:
-          'data={"isShoppingCart":0,"userId":287,"list":[{"orderNo":"241028151736FX00004","productId":"6719ed0ae4b09baa6eb01481","points":0,"nums":1}],"couponList":[],"totalsPoints":0,"totalsCouponPoints":0,"totalsCurrPoints":0}',
+          'data={"isShoppingCart":1,"userId":287,"list":[{"orderNo":"241030170642FX00009","productId":"67131ee4e4b06312aac7e0e9","productName":null,"points":123,"nums":1,"orderImgUrl":"https://image.zhuchaohui.com/zhucaohui/8e5ed57d8a1c8826c9cadb01d2ee39f584c6af1c0269f82c72d60c5461b5f790.png"},{"orderNo":"241030170642FX00010","productId":"67208f37d5c1cec120ffcaae","productName":null,"points":30,"nums":3,"orderImgUrl":"https://image.zhuchaohui.com/zhucaohui/8a4db4e05845032124460e1eeda0a9f2419dd1014947e3f26652da1fa1cc4b54.jpeg"}],"couponList":[],"totalsPoints":213,"totalsCouponPoints":0,"totalsCurrPoints":0}',
       },
       { name: '商品兑换成功', path: '/pages/home/mall/purchased/success/index' },
+      { name: '购物车', path: '/pages/home/mall/shopping-cart/index' },
     ],
   },
 })

+ 2 - 1
packages/app/src/core/libs/requests.ts

@@ -150,7 +150,7 @@ export const createUserAuthInfo = (
   }>,
 ) => httpPost<any>('/app-api/member/user-auth-info/create', data)
 /**
- * 获取设计师审核
+ * 获取设计师审核信息
  */
 export const getUserAuthInfo = () => httpPost('/app-api/member/user-auth-info/get')
 export const getCircles = (query: { tagName?: string; circleType?: string; stylistId?: string }) =>
@@ -376,6 +376,7 @@ export const getProductItemBuy = (query: { userId: number }) =>
       favourableStatus: number
       count: number
       createTime: any
+      userId: number
     }>[]
     total: number
   }>('/app-api/member/product-item-buy/select', query)

+ 5 - 1
packages/app/src/pages.json

@@ -68,11 +68,15 @@
       {
         "name": "确认订单",
         "path": "/pages/home/mall/confirm-order/index",
-        "query": "data={\"isShoppingCart\":0,\"userId\":287,\"list\":[{\"orderNo\":\"241028151736FX00004\",\"productId\":\"6719ed0ae4b09baa6eb01481\",\"points\":0,\"nums\":1}],\"couponList\":[],\"totalsPoints\":0,\"totalsCouponPoints\":0,\"totalsCurrPoints\":0}"
+        "query": "data={\"isShoppingCart\":1,\"userId\":287,\"list\":[{\"orderNo\":\"241030170642FX00009\",\"productId\":\"67131ee4e4b06312aac7e0e9\",\"productName\":null,\"points\":123,\"nums\":1,\"orderImgUrl\":\"https://image.zhuchaohui.com/zhucaohui/8e5ed57d8a1c8826c9cadb01d2ee39f584c6af1c0269f82c72d60c5461b5f790.png\"},{\"orderNo\":\"241030170642FX00010\",\"productId\":\"67208f37d5c1cec120ffcaae\",\"productName\":null,\"points\":30,\"nums\":3,\"orderImgUrl\":\"https://image.zhuchaohui.com/zhucaohui/8a4db4e05845032124460e1eeda0a9f2419dd1014947e3f26652da1fa1cc4b54.jpeg\"}],\"couponList\":[],\"totalsPoints\":213,\"totalsCouponPoints\":0,\"totalsCurrPoints\":0}"
       },
       {
         "name": "商品兑换成功",
         "path": "/pages/home/mall/purchased/success/index"
+      },
+      {
+        "name": "购物车",
+        "path": "/pages/home/mall/shopping-cart/index"
       }
     ]
   },

+ 2 - 2
packages/app/src/pages/home/mall/confirm-order/index.vue

@@ -38,7 +38,7 @@ const handlePay = async () => {
     { success: true, successTitle: '兑换成功' },
   )
   if (code === 0) {
-    router.push('/pages/home/mall/purchased/success/index')
+    router.replace('/pages/home/mall/purchased/success/index')
   }
 }
 onLoad(async (query: { data: string }) => {
@@ -89,7 +89,7 @@ onLoad(async (query: { data: string }) => {
       <div class="h-[63px] bg-white backdrop-blur-[20px] flex px-3.5 items-center justify-between">
         <div class="flex">
           <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">
-            {{ data.totalsCurrPoints }}
+            {{ data.totalsCurrPoints || data.totalsPoints - data.totalsCouponPoints }}
           </div>
           <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
             积分

+ 2 - 2
packages/app/src/pages/home/mall/purchased/success/index.vue

@@ -14,10 +14,10 @@ import { useRouter } from '../../../../../core/utils/router'
 const userStore = useUserStore()
 const router = useRouter()
 const handle2Orders = () => {
-  router.push('/pages/mine/orders/index')
+  router.replace('/pages/mine/orders/index')
 }
 const handle2Mall = () => {
-  router.push('/pages/home/mall/index')
+  router.replace('/pages/home/mall/index')
 }
 </script>
 <template>

+ 54 - 6
packages/app/src/pages/home/mall/shopping-cart/index.vue

@@ -13,18 +13,35 @@ import Product from '../components/product.vue'
 import { shoppingBag } from '@designer-hub/assets/src/assets/svgs/index'
 import InvertedTrapezoidButton from '@/components/inverted-trapezoid-button.vue'
 import TrapeziumButton from '@/components/trapezium-button.vue'
-import { deleteProductItemBuy, getProductItemBuy } from '../../../../core/libs/requests'
+import {
+  deleteProductItemBuy,
+  getProductItemBuy,
+  productPlacing,
+} from '../../../../core/libs/requests'
 import PageHelper from '@/components/page-helper.vue'
 import BottomAppBar from '@/components/bottom-app-bar.vue'
 import { useUserStore } from '../../../../store'
+import { useRouter } from '../../../../core/utils/router'
 import { storeToRefs } from 'pinia'
 import { requestToast } from '../../../../core/utils/common'
 import type { ComponentExposed } from 'vue-component-type-helpers'
 
 const pageHelperRef = ref<ComponentExposed<typeof PageHelper>>()
 const userStore = useUserStore()
+const router = useRouter()
 const { userInfo } = storeToRefs(userStore)
 const a = ref(1)
+const selected = ref([])
+const points = computed(() =>
+  selected.value.reduce((acc, item) => acc + item.points * item.nums, 0),
+)
+const handleSelect = (product) => {
+  if (selected.value.map((it) => it.productId).includes(product.productId)) {
+    selected.value = selected.value.filter(({ productId }) => productId !== product.productId)
+  } else {
+    selected.value = [...selected.value, product]
+  }
+}
 const handleDelete = async (product: any) => {
   await requestToast(
     () =>
@@ -45,6 +62,30 @@ const handleDelete = async (product: any) => {
   )
   await pageHelperRef.value?.refresh()
 }
+const handlePlaceOrder = async () => {
+  if (!selected.value.length) {
+    uni.showToast({ title: '请选择商品', icon: 'none' })
+    return ''
+  }
+  const { code, data: res } = await requestToast(() =>
+    productPlacing({
+      isShoppingCart: 1,
+      userId: userInfo.value.userId,
+      list: selected.value.map(({ productId, prodcutName, productCoverImgUrl, nums, points }) => ({
+        productId,
+        productName: prodcutName,
+        orderImgUrl: productCoverImgUrl,
+        nums,
+        points,
+      })),
+      couponList: [],
+    }),
+  )
+  if (code === 0) {
+    // router.push(`/pages/home/mall/confirm-order`)
+    router.push(`/pages/home/mall/confirm-order/index?data=${JSON.stringify(res)}`)
+  }
+}
 </script>
 
 <template>
@@ -57,11 +98,15 @@ const handleDelete = async (product: any) => {
     >
       <template #default="{ source }">
         <div class="flex-grow flex flex-col gap-8">
+          <!-- {{ selected }} -->
           <template v-for="(it, i) in source.list" :key="i">
             <wd-swipe-action>
               <div class="flex gap-3">
-                <div class="flex items-center">
-                  <div class="w-4 h-4 rounded-full border border-black/60 border-solid"></div>
+                <div class="flex items-center" @click="handleSelect(it)">
+                  <div
+                    class="w-4 h-4 rounded-full border border-black/60 border-solid"
+                    :class="`${selected.map((it) => it.productId).includes(it.productId) ? 'bg-black' : ''}`"
+                  ></div>
                 </div>
                 <div class="w-[110px] h-[110px] bg-[#f6f6f6] rounded-2xl">
                   <wd-img width="100%" height="100%" :src="it.productCoverImgUrl"></wd-img>
@@ -84,7 +129,8 @@ const handleDelete = async (product: any) => {
                       积分
                     </div>
                     <div class="flex-1"></div>
-                    <wd-input-number v-model="it.nums" />
+                    {{ it.nums }}
+                    <!-- <wd-input-number v-model="it.nums" /> -->
                   </div>
                 </div>
               </div>
@@ -106,10 +152,12 @@ const handleDelete = async (product: any) => {
     <BottomAppBar fixed border>
       <div class="h-[63px] bg-white backdrop-blur-[20px] flex px-3.5 items-center justify-between">
         <div class="flex items-end gap-1.25">
-          <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-6">0</div>
+          <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-6">
+            {{ points }}
+          </div>
           <div class="text-black text-base font-normal font-['PingFang_SC'] leading-5">积分</div>
         </div>
-        <div class="">
+        <div class="" @click="handlePlaceOrder">
           <TiltedButton size="large">
             <div
               class="w-[49px] h-[22px] text-white text-base font-normal font-['PingFang_SC'] leading-tight"

+ 8 - 0
packages/app/src/pages/mine/authentication/index.vue

@@ -14,6 +14,7 @@ import SectionHeading from '@/components/section-heading.vue'
 import {
   createUserAuthInfo,
   getByDictType,
+  getUserAuthInfo,
   validateReferrerCode,
 } from '../../../core/libs/requests'
 import { DictType } from '../../../core/models/moment'
@@ -32,6 +33,9 @@ const { userInfo, isDesigner } = storeToRefs(userStore)
 const { error } = useToast()
 const formData = ref<any>({})
 const formInited = ref(false)
+const { data: userAuthInfo, run: setUserAuthInfo } = useRequest(() => getUserAuthInfo(), {
+  initialData: {},
+})
 const schema = ref({
   channelSource: {
     type: 'Select',
@@ -106,6 +110,10 @@ const handleSubmit = async () => {
   }
 }
 onMounted(async () => {
+  await setUserAuthInfo()
+  if (userAuthInfo.value) {
+    console.log(userAuthInfo.value)
+  }
   const { data } = await getByDictType('member_channel_source')
   const { data: res } = await getByDictType(DictType.memberSpatialExpertiseType)
   console.log(res)