/** * 商品相关API服务 * 模拟后台接口,便于未来替换为真实API */ import { MOCK_PRODUCTS, MOCK_ASSETS } from '@/mock/mockData.js' // 模拟网络延迟 const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)) /** * 获取商品详情 * @param {string} productId 商品ID * @returns {Promise} 商品详情数据 */ export const getProductDetail = async (productId) => { await delay(600) // 模拟网络延迟 console.log('模拟API: 获取商品详情', productId) try { // 从模拟数据中查找商品 const product = MOCK_PRODUCTS.data.products.find(p => p.id === productId) if (!product) { return { success: false, message: '商品不存在', data: null } } // 构建商品详情数据 const productDetail = { id: product.id, name: product.name, price: Math.floor(Math.random() * 1000) + 200, // 模拟价格 200-1200 points: Math.floor(Math.random() * 500) + 100, // 模拟积分 100-600 mainImage: MOCK_ASSETS.products[product.assetId] || '', packageImage: MOCK_ASSETS.products[product.assetId] || '', // 包装图片 qualityImage: MOCK_ASSETS.products[product.assetId] || '', // 品质图片 qualityDescription: '采用高温制曲、二次投料,一年为一个生产周期,具有独特的酿造工艺。', // 商品特点字段 - 从酒谷商品主数据表获取 material: '水、高粱、小麦', alcohol: '53%vol.', origin: '贵州省仁怀市茅台镇', type: '酱香型白酒', capacity: '500ml', storage: '干燥、通风、阴凉的环境条件下存储', company: '贵州茅台酒股份有限公司' } return { success: true, message: '商品详情获取成功', data: productDetail } } catch (error) { console.error('获取商品详情失败:', error) return { success: false, message: '商品详情获取失败', data: null } } } /** * 获取商品图片 * @param {string} productId 商品ID * @param {number} imageType 图片分类 (2=商品详情图片) * @returns {Promise} 商品图片数据 */ export const getProductImages = async (productId, imageType = 2) => { await delay(400) // 模拟网络延迟 console.log('模拟API: 获取商品图片', { productId, imageType }) try { // 模拟图片数据 - 根据图片分类==2获取 const mockImages = [ { id: `${productId}_img_001`, url: 'https://images.unsplash.com/photo-1470337458703-46ad1756a187?w=750&h=600&fit=crop', type: imageType, sort: 1 }, { id: `${productId}_img_002`, url: 'https://images.unsplash.com/photo-1569529465841-dfecdab7503b?w=750&h=600&fit=crop', type: imageType, sort: 2 }, { id: `${productId}_img_003`, url: 'https://images.unsplash.com/photo-1584464491033-06628f3a6b7b?w=750&h=600&fit=crop', type: imageType, sort: 3 }, { id: `${productId}_img_004`, url: 'https://images.unsplash.com/photo-1607622750671-6cd5a99ec572?w=750&h=600&fit=crop', type: imageType, sort: 4 }, { id: `${productId}_img_005`, url: 'https://images.unsplash.com/photo-1596040977107-3c27c6e95ac3?w=750&h=600&fit=crop', type: imageType, sort: 5 }, { id: `${productId}_img_006`, url: 'https://images.unsplash.com/photo-1558346648-9757f2fa4c64?w=750&h=600&fit=crop', type: imageType, sort: 6 } ] // 根据图片分类筛选 const filteredImages = mockImages.filter(img => img.type === imageType) return { success: true, message: '商品图片获取成功', data: { images: filteredImages, total: filteredImages.length } } } catch (error) { console.error('获取商品图片失败:', error) return { success: false, message: '商品图片获取失败', data: { images: [], total: 0 } } } } /** * 搜索商品 * @param {string} keyword 搜索关键词 * @param {number} page 页码 * @param {number} pageSize 每页数量 * @returns {Promise} 搜索结果 */ export const searchProducts = async (keyword, page = 1, pageSize = 20) => { await delay(500) // 模拟网络延迟 console.log('模拟API: 搜索商品', { keyword, page, pageSize }) try { // 从模拟数据中搜索商品 const allProducts = MOCK_PRODUCTS.data.products const filteredProducts = allProducts.filter(product => product.name.toLowerCase().includes(keyword.toLowerCase()) ) // 分页处理 const startIndex = (page - 1) * pageSize const endIndex = startIndex + pageSize const paginatedProducts = filteredProducts.slice(startIndex, endIndex) // 添加图片URL const productsWithImages = paginatedProducts.map(product => ({ ...product, imageUrl: MOCK_ASSETS.products[product.assetId] || '', price: Math.floor(Math.random() * 1000) + 200, // 模拟价格 points: Math.floor(Math.random() * 500) + 100 // 模拟积分 })) return { success: true, message: '商品搜索成功', data: { products: productsWithImages, total: filteredProducts.length, page, pageSize, totalPages: Math.ceil(filteredProducts.length / pageSize) } } } catch (error) { console.error('搜索商品失败:', error) return { success: false, message: '商品搜索失败', data: { products: [], total: 0, page, pageSize, totalPages: 0 } } } } /** * 获取商品分类 * @param {string} categoryId 分类ID (可选) * @returns {Promise} 分类数据 */ export const getCategories = async (categoryId = null) => { await delay(300) // 模拟网络延迟 console.log('模拟API: 获取商品分类', { categoryId }) try { // 这里应该调用真实的分类API // 暂时返回模拟数据 const categories = [ { id: 'category_jiugu', name: '酒谷酒', description: '自主品牌酒谷系列', imageUrl: 'https://images.unsplash.com/photo-1470337458703-46ad1756a187?w=300&h=200&fit=crop' }, { id: 'category_maotai', name: '茅台酒', description: '茅台系列白酒', imageUrl: 'https://images.unsplash.com/photo-1569529465841-dfecdab7503b?w=300&h=200&fit=crop' }, { id: 'category_wine', name: '红酒', description: '进口和国产红酒', imageUrl: 'https://images.unsplash.com/photo-1584464491033-06628f3a6b7b?w=300&h=200&fit=crop' } ] const result = categoryId ? categories.find(c => c.id === categoryId) : categories return { success: true, message: '分类获取成功', data: result } } catch (error) { console.error('获取分类失败:', error) return { success: false, message: '分类获取失败', data: null } } } /** * 错误处理 * @param {Error} error 错误对象 */ export const handleProductError = (error) => { console.error('商品API错误:', error) // 根据错误类型显示不同的提示 if (error.message.includes('网络')) { uni.showToast({ title: '网络连接失败,请检查网络设置', icon: 'none', duration: 3000 }) } else if (error.message.includes('超时')) { uni.showToast({ title: '请求超时,请稍后重试', icon: 'none', duration: 2000 }) } else { uni.showToast({ title: '操作失败,请稍后重试', icon: 'none', duration: 2000 }) } }