From 6935ad15d06210b24b3877f9874184c0210f2ca7 Mon Sep 17 00:00:00 2001 From: jqtmviyu Date: Thu, 8 May 2025 11:02:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20:sparkles:=20=E8=B4=AD=E7=89=A9?= =?UTF-8?q?=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vk-data-input-number-box.d.ts | 52 ++ src/pages.json | 6 + src/pages/cart/cart.vue | 10 +- src/pages/cart/components/cartMain.vue | 489 ++++++++++++++++++ src/pages/cart/goodsCart.vue | 7 + src/pages/goods/goods.vue | 6 +- src/pages/login/login.vue | 4 +- src/services/cart.ts | 55 +- src/utils/debounce-throttle.ts | 23 + 9 files changed, 640 insertions(+), 12 deletions(-) create mode 100644 src/components/vk-data-input-number-box/vk-data-input-number-box.d.ts create mode 100644 src/pages/cart/components/cartMain.vue create mode 100644 src/pages/cart/goodsCart.vue create mode 100644 src/utils/debounce-throttle.ts diff --git a/src/components/vk-data-input-number-box/vk-data-input-number-box.d.ts b/src/components/vk-data-input-number-box/vk-data-input-number-box.d.ts new file mode 100644 index 0000000..34c0455 --- /dev/null +++ b/src/components/vk-data-input-number-box/vk-data-input-number-box.d.ts @@ -0,0 +1,52 @@ +import { Component } from '@uni-helper/uni-app-types' + +/** 步进器 */ +export type InputNumberBox = Component + +/** 步进器实例 */ +export type InputNumberBoxInstance = InstanceType + +/** 步进器属性 */ +export type InputNumberBoxProps = { + /** 输入框初始值(默认1) */ + modelValue: number + /** 用户可输入的最小值(默认0) */ + min: number + /** 用户可输入的最大值(默认99999) */ + max: number + /** 步长,每次加或减的值(默认1) */ + step: number + /** 是否禁用操作,包括输入框,加减按钮 */ + disabled: boolean + /** 输入框宽度,单位rpx(默认80) */ + inputWidth: string | number + /** 输入框和按钮的高度,单位rpx(默认50) */ + inputHeight: string | number + /** 输入框和按钮的背景颜色(默认#F2F3F5) */ + bgColor: string + /** 步进器标识符 */ + index: string + /** 输入框内容发生变化时触发 */ + change: (event: InputNumberBoxEvent) => void + /** 输入框失去焦点时触发 */ + blur: (event: InputNumberBoxEvent) => void + /** 点击增加按钮时触发 */ + plus: (event: InputNumberBoxEvent) => void + /** 点击减少按钮时触发 */ + minus: (event: InputNumberBoxEvent) => void +} + +/** 步进器事件对象 */ +export type InputNumberBoxEvent = { + /** 输入框当前值 */ + value: number + /** 步进器标识符 */ + index: string +} + +/** 全局组件类型声明 */ +declare module 'vue' { + export interface GlobalComponents { + 'vk-data-input-number-box': InputNumberBox + } +} diff --git a/src/pages.json b/src/pages.json index 4416cd0..dcad009 100644 --- a/src/pages.json +++ b/src/pages.json @@ -35,6 +35,12 @@ "navigationBarTitleText": "购物车" } }, + { + "path": "pages/cart/goodsCart", + "style": { + "navigationBarTitleText": "购物车" + } + }, { "path": "pages/my/my", "style": { diff --git a/src/pages/cart/cart.vue b/src/pages/cart/cart.vue index 9e22b13..ba6e210 100644 --- a/src/pages/cart/cart.vue +++ b/src/pages/cart/cart.vue @@ -1,7 +1,7 @@ + + - - - - diff --git a/src/pages/cart/components/cartMain.vue b/src/pages/cart/components/cartMain.vue new file mode 100644 index 0000000..26b0bd5 --- /dev/null +++ b/src/pages/cart/components/cartMain.vue @@ -0,0 +1,489 @@ + + + + + diff --git a/src/pages/cart/goodsCart.vue b/src/pages/cart/goodsCart.vue new file mode 100644 index 0000000..ba6e210 --- /dev/null +++ b/src/pages/cart/goodsCart.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/pages/goods/goods.vue b/src/pages/goods/goods.vue index 5d6001b..b10b326 100644 --- a/src/pages/goods/goods.vue +++ b/src/pages/goods/goods.vue @@ -100,7 +100,7 @@ - + 购物车 @@ -144,7 +144,7 @@ import type { SkuPopupInstance, SkuPopupLocaldata, } from '@/components/vk-data-goods-sku-popup/vk-data-goods-sku-popup' -import { postMemberCart } from '@/services/cart' +import { postMemberCartAPI } from '@/services/cart' // 获取屏幕边界到安全区域距离 const { safeAreaInsets } = uni.getSystemInfoSync() @@ -256,7 +256,7 @@ const showSkuPopup = (mode: SkuMode) => { // 加入购物车 const handlerAddCart = async (e: SkuPopupEvent) => { - const res = await postMemberCart({ + const res = await postMemberCartAPI({ skuId: e._id, count: e.buy_num, }) diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue index cad565c..45b3d66 100644 --- a/src/pages/login/login.vue +++ b/src/pages/login/login.vue @@ -84,9 +84,7 @@ const loginSucess = (profile: LoginResult) => { icon: 'none', }) setTimeout(() => { - uni.switchTab({ - url: '/pages/my/my', - }) + uni.navigateBack() }, 500) } diff --git a/src/services/cart.ts b/src/services/cart.ts index 7f45be5..0aaa43b 100644 --- a/src/services/cart.ts +++ b/src/services/cart.ts @@ -1,9 +1,62 @@ +import type { CartItem } from '@/types/cart' import { http } from '@/utils/http' -export const postMemberCart = (data: { skuId: string; count: number }) => { +/** + * 加入购物车 + */ +export const postMemberCartAPI = (data: { skuId: string; count: number }) => { return http({ url: '/member/cart', method: 'POST', data, }) } + +/** + * 获取购物车列表 + */ +export const getMemberCartAPI = () => { + return http({ + url: '/member/cart', + method: 'GET', + }) +} + +/** + * 删除购物车商品 + */ +export const deleteMemberCartAPI = (data: { ids: string[] }) => { + return http({ + url: '/member/cart', + method: 'DELETE', + data, + }) +} + +/** + * 修改购物车商品数量 + */ +type PutMemberCartAPIParams = { + /** 是否选中 */ + selected?: boolean + /** 商品数量 */ + count?: number +} +export const putMemberCartAPI = (skuId: string, data: PutMemberCartAPIParams) => { + return http({ + url: `/member/cart/${skuId}`, + method: 'PUT', + data, + }) +} + +/** + * 修改购物车商品全选状态 + */ +export const putMemberCartSelectedAPI = (data: { selected: boolean }) => { + return http({ + url: '/member/cart/selected', + method: 'PUT', + data, + }) +} diff --git a/src/utils/debounce-throttle.ts b/src/utils/debounce-throttle.ts new file mode 100644 index 0000000..bc84fb9 --- /dev/null +++ b/src/utils/debounce-throttle.ts @@ -0,0 +1,23 @@ +// 防抖函数 +export const debounce = (fn: Function, delay: number) => { + let timer: number | null = null + return function (...args: any[]) { + if (timer) clearTimeout(timer) + timer = setTimeout(() => { + fn(...args) + timer = null + }, delay) + } +} + +// 节流函数 +export const throttle = (fn: Function, delay: number) => { + let timer: number | null = null + return function (...args: any[]) { + if (timer) return + timer = setTimeout(() => { + fn(...args) + timer = null + }, delay) + } +}