feat: ✨ 商品详情页 sku 模块 和 加入购物车
This commit is contained in:
parent
e597bea065
commit
9308a1df85
@ -82,13 +82,13 @@ export type SkuPopupProps = {
|
|||||||
selectArr?: string[]
|
selectArr?: string[]
|
||||||
|
|
||||||
/** 打开弹出层 */
|
/** 打开弹出层 */
|
||||||
onOpen: () => void
|
open: () => void
|
||||||
/** 关闭弹出层 */
|
/** 关闭弹出层 */
|
||||||
onClose: () => void
|
close: () => void
|
||||||
/** 点击加入购物车时(需选择完SKU才会触发)*/
|
/** 点击加入购物车时(需选择完SKU才会触发)*/
|
||||||
onAddCart: (event: SkuPopupEvent) => void
|
cart: (event: SkuPopupEvent) => void
|
||||||
/** 点击立即购买时(需选择完SKU才会触发)*/
|
/** 点击立即购买时(需选择完SKU才会触发)*/
|
||||||
onBuyNow: (event: SkuPopupEvent) => void
|
buy: (event: SkuPopupEvent) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 商品信息本地数据源 */
|
/** 商品信息本地数据源 */
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
<view class="action">
|
<view class="action">
|
||||||
<view class="item arrow">
|
<view class="item arrow">
|
||||||
<text class="label">选择</text>
|
<text class="label">选择</text>
|
||||||
<text class="text ellipsis" @tap="isShowSkuPopup = true"> 请选择商品规格 </text>
|
<text class="text ellipsis" @tap="isShowSkuPopup = true"> {{ selectedSku }} </text>
|
||||||
</view>
|
</view>
|
||||||
<view class="item arrow" @tap="showPopup('address')">
|
<view class="item arrow" @tap="showPopup('address')">
|
||||||
<text class="label">送至</text>
|
<text class="label">送至</text>
|
||||||
@ -105,8 +105,8 @@
|
|||||||
</navigator>
|
</navigator>
|
||||||
</view>
|
</view>
|
||||||
<view class="buttons">
|
<view class="buttons">
|
||||||
<view class="addcart"> 加入购物车 </view>
|
<view class="addcart" @tap="showSkuPopup(SkuMode.AddCart)"> 加入购物车 </view>
|
||||||
<view class="buynow"> 立即购买 </view>
|
<view class="buynow" @tap="showSkuPopup(SkuMode.BuyNow)"> 立即购买 </view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
@ -118,10 +118,15 @@
|
|||||||
|
|
||||||
<!-- SKU 商品规格弹出层 -->
|
<!-- SKU 商品规格弹出层 -->
|
||||||
<vk-data-goods-sku-popup
|
<vk-data-goods-sku-popup
|
||||||
ref="skuPopup"
|
ref="skuPopupRef"
|
||||||
|
buyNowBackgroundColor="#27ba9b"
|
||||||
|
addCartBackgroundColor="#ffa868"
|
||||||
|
:mode="skuMode"
|
||||||
:modelValue="isShowSkuPopup"
|
:modelValue="isShowSkuPopup"
|
||||||
:localdata="localdata"
|
:localdata="localdata"
|
||||||
@onClose="isShowSkuPopup = false"
|
@close="isShowSkuPopup = false"
|
||||||
|
@cart="handlerAddCart"
|
||||||
|
@buy="handlerBuyNow"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
@ -130,11 +135,16 @@
|
|||||||
import { getGoodsAPI } from '@/services/goods'
|
import { getGoodsAPI } from '@/services/goods'
|
||||||
import type { GoodsResult } from '@/types/goods'
|
import type { GoodsResult } from '@/types/goods'
|
||||||
import { onLoad } from '@dcloudio/uni-app'
|
import { onLoad } from '@dcloudio/uni-app'
|
||||||
import { ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import ServicePanel from './components/ServicePanel.vue'
|
import ServicePanel from './components/ServicePanel.vue'
|
||||||
import AddressPanel from './components/AddressPanel.vue'
|
import AddressPanel from './components/AddressPanel.vue'
|
||||||
import PageSkeleton from './components/PageSkeleton.vue'
|
import PageSkeleton from './components/PageSkeleton.vue'
|
||||||
import type { SkuPopupLocaldata } from '@/components/vk-data-goods-sku-popup/vk-data-goods-sku-popup'
|
import type {
|
||||||
|
SkuPopupEvent,
|
||||||
|
SkuPopupInstance,
|
||||||
|
SkuPopupLocaldata,
|
||||||
|
} from '@/components/vk-data-goods-sku-popup/vk-data-goods-sku-popup'
|
||||||
|
import { postMemberCart } from '@/services/cart'
|
||||||
|
|
||||||
// 获取屏幕边界到安全区域距离
|
// 获取屏幕边界到安全区域距离
|
||||||
const { safeAreaInsets } = uni.getSystemInfoSync()
|
const { safeAreaInsets } = uni.getSystemInfoSync()
|
||||||
@ -221,7 +231,48 @@ onLoad(async () => {
|
|||||||
|
|
||||||
// SKU 商品规格弹出层
|
// SKU 商品规格弹出层
|
||||||
const isShowSkuPopup = ref(false)
|
const isShowSkuPopup = ref(false)
|
||||||
const localdata = ref<SkuPopupLocaldata>({} as SkuPopupLocaldata)
|
// SKU 商品规格弹出层实例
|
||||||
|
const skuPopupRef = ref<SkuPopupInstance>()
|
||||||
|
// SKU 商品规格弹出层数据
|
||||||
|
const localdata = ref({} as SkuPopupLocaldata)
|
||||||
|
// SKU 商品规格弹出层模式
|
||||||
|
enum SkuMode {
|
||||||
|
Both = 1,
|
||||||
|
AddCart = 2,
|
||||||
|
BuyNow = 3,
|
||||||
|
}
|
||||||
|
const skuMode = ref(SkuMode.Both)
|
||||||
|
|
||||||
|
// 选中的 SKU
|
||||||
|
const selectedSku = computed(() => {
|
||||||
|
return skuPopupRef.value?.selectArr?.join(' ').trim() || '请选择商品规格'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 点击商品页面的 购物车/立即购买 按钮弹出 SKU 商品规格弹出层
|
||||||
|
const showSkuPopup = (mode: SkuMode) => {
|
||||||
|
skuMode.value = mode
|
||||||
|
isShowSkuPopup.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加入购物车
|
||||||
|
const handlerAddCart = async (e: SkuPopupEvent) => {
|
||||||
|
const res = await postMemberCart({
|
||||||
|
skuId: e._id,
|
||||||
|
count: e.buy_num,
|
||||||
|
})
|
||||||
|
if (res.code == '1') {
|
||||||
|
await uni.showToast({
|
||||||
|
icon: 'success',
|
||||||
|
title: '添加成功',
|
||||||
|
})
|
||||||
|
isShowSkuPopup.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 立即购买
|
||||||
|
const handlerBuyNow = () => {
|
||||||
|
console.log('立即购买')
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
9
src/services/cart.ts
Normal file
9
src/services/cart.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { http } from '@/utils/http'
|
||||||
|
|
||||||
|
export const postMemberCart = (data: { skuId: string; count: number }) => {
|
||||||
|
return http({
|
||||||
|
url: '/member/cart',
|
||||||
|
method: 'POST',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
25
src/types/cart.d.ts
vendored
Normal file
25
src/types/cart.d.ts
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/** 购物车类型 */
|
||||||
|
export type CartItem = {
|
||||||
|
/** 商品 ID */
|
||||||
|
id: string
|
||||||
|
/** SKU ID */
|
||||||
|
skuId: string
|
||||||
|
/** 商品名称 */
|
||||||
|
name: string
|
||||||
|
/** 图片 */
|
||||||
|
picture: string
|
||||||
|
/** 数量 */
|
||||||
|
count: number
|
||||||
|
/** 加入时价格 */
|
||||||
|
price: number
|
||||||
|
/** 当前的价格 */
|
||||||
|
nowPrice: number
|
||||||
|
/** 库存 */
|
||||||
|
stock: number
|
||||||
|
/** 是否选中 */
|
||||||
|
selected: boolean
|
||||||
|
/** 属性文字 */
|
||||||
|
attrsText: string
|
||||||
|
/** 是否为有效商品 */
|
||||||
|
isEffective: boolean
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user