refactor(api): 优化商品收藏接口调用并统一数据解包

- 新增 unwrap 函数统一处理响应数据解包
- 将收藏相关接口改为 async 函数,显式等待请求结果
- 统一调用 unwrap 提取响应中的 data 字段,保障数据一致性
- 确保收藏状态接口返回纯布尔值,避免类型不确定
- 收藏列表接口添加空数组和空对象默认值处理,防止异常

refactor(shop): 简化购物车和客服页面跳转逻辑

- 购物车跳转采用 navigateTo,确保非 tabBar 页面正常打开
- 客服跳转直接进入客服页面,去除复杂客服会话功能调用逻辑
This commit is contained in:
2026-06-26 22:39:17 +08:00
parent 6f83780e9c
commit 7f43897a64
2 changed files with 31 additions and 23 deletions

View File

@@ -1,27 +1,44 @@
import request from '@/utils/request' import request from '@/utils/request'
import type { ShopGoodsFavorite, ShopGoodsFavoriteParam } from './model' import type { ShopGoodsFavorite, ShopGoodsFavoriteParam } from './model'
/**
* 解包 API 响应
* request 工具默认 returnRaw=true返回完整 {code, message, data} 包装
* 此函数提取内层 data 字段,兼容 data 为 null/undefined 的情况
*/
function unwrap<T>(res: any): T {
if (res && typeof res === 'object' && 'data' in res) {
return res.data as T
}
return res as T
}
// 添加收藏 // 添加收藏
export function addShopGoodsFavorite(data: { goodsId: number }) { export async function addShopGoodsFavorite(data: { goodsId: number }) {
return request.post<boolean>('/shop/goods/favorite/add', data) const res = await request.post('/shop/goods/favorite/add', data)
return unwrap<boolean>(res)
} }
// 取消收藏 // 取消收藏
export function removeShopGoodsFavorite(data: { goodsId: number }) { export async function removeShopGoodsFavorite(data: { goodsId: number }) {
return request.post<boolean>('/shop/goods/favorite/remove', data) const res = await request.post('/shop/goods/favorite/remove', data)
return unwrap<boolean>(res)
} }
// 查询收藏状态 // 查询收藏状态(返回 booleantrue=已收藏, false=未收藏)
export function getShopGoodsFavoriteStatus(params: { goodsId: number }) { export async function getShopGoodsFavoriteStatus(params: { goodsId: number }) {
return request.get<boolean>('/shop/goods/favorite/status', params) const res = await request.get('/shop/goods/favorite/status', params)
return !!unwrap<boolean>(res) // 确保返回纯布尔值
} }
// 收藏列表 // 收藏列表
export function listShopGoodsFavorite(params: ShopGoodsFavoriteParam) { export async function listShopGoodsFavorite(params: ShopGoodsFavoriteParam) {
return request.get<ShopGoodsFavorite[]>('/shop/goods/favorite/list', params) const res = await request.get('/shop/goods/favorite/list', params)
return unwrap<ShopGoodsFavorite[]>(res) || []
} }
// 收藏列表(分页) // 收藏列表(分页)
export function pageShopGoodsFavorite(params: ShopGoodsFavoriteParam) { export async function pageShopGoodsFavorite(params: ShopGoodsFavoriteParam) {
return request.get<{ list: ShopGoodsFavorite[]; total: number }>('/shop/goods/favorite/page', params) const res = await request.get('/shop/goods/favorite/page', params)
return unwrap<{ list: ShopGoodsFavorite[]; total: number }>(res) || { list: [], total: 0 }
} }

View File

@@ -164,22 +164,13 @@ const ProductDetailPage: React.FC = () => {
} }
const handleGoCart = () => { const handleGoCart = () => {
// 购物车不是 tabBar 页面,使用 navigateTo路径与 app.config.ts 中注册的 'pages/shop/cart' 对应
Taro.navigateTo({ url: '/pages/shop/cart' }) Taro.navigateTo({ url: '/pages/shop/cart' })
} }
const handleContactService = () => { const handleContactService = () => {
// 微信小程序客服:优先尝试打开客服会话 // 直接跳转到在线客服页面(已实现完整功能:微信客服按钮 + 历史消息 + 热线 + 微信留言)
if (Taro.openCustomerServiceChat) {
Taro.openCustomerServiceChat({
extInfo: { url: '' }, // 需要在小程序后台配置客服链接
fail: () => {
// 降级:跳转到客服页面
Taro.navigateTo({ url: '/pages/user/customer-service/index' }) Taro.navigateTo({ url: '/pages/user/customer-service/index' })
},
})
} else {
Taro.navigateTo({ url: '/pages/user/customer-service/index' })
}
} }
if (!product) { if (!product) {