Files

170 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

2025-11-17 14:11:46 +08:00
import { config, cdnBase } from '../../config/index';
/** 获取首页数据 */
function mockFetchHome() {
const { delay } = require('../_utils/delay');
const { genSwiperImageList } = require('../../model/swiper');
return delay().then(() => {
return {
swiper: genSwiperImageList(),
tabList: [
{
text: '热门商品',
key: 'hot',
},
{
text: '精选推荐',
key: 0,
},
{
text: '夏日防晒',
key: 1,
},
{
text: '二胎大作战',
key: 2,
},
{
text: '人气榜',
key: 3,
},
{
text: '好评榜',
key: 4,
},
{
text: 'RTX 30',
key: 5,
},
{
text: '手机也疯狂',
key: 6,
},
],
activityImg: `${cdnBase}/activity/banner.png`,
};
});
}
/** 获取首页数据 */
export function fetchHome() {
if (config.useMock) {
return mockFetchHome();
}
return new Promise((resolve, reject) => {
// 并行请求轮播图和分类数据
const bannerRequest = new Promise((resolve, reject) => {
wx.request({
url: `${config.apiBase}/banners`,
method: 'GET',
success: (res) => {
if (res.statusCode === 200 && res.data.code === 200) {
resolve(res.data.data || []);
} else {
console.error('获取轮播图失败:', res.data);
resolve([]); // 失败时返回空数组,不阻断整个流程
}
},
fail: (err) => {
console.error('轮播图请求失败:', err);
resolve([]); // 失败时返回空数组
}
});
});
const categoryRequest = new Promise((resolve, reject) => {
wx.request({
url: `${config.apiBase}/products/categories`,
method: 'GET',
success: (res) => {
if (res.statusCode === 200 && res.data.code === 200) {
resolve(res.data.data || []);
} else {
console.error('获取分类失败:', res.data);
resolve([]); // 失败时返回空数组
}
},
fail: (err) => {
console.error('分类请求失败:', err);
resolve([]); // 失败时返回空数组
}
});
});
// 获取推荐商品
const recommendRequest = new Promise((resolve) => {
wx.request({
url: `${config.apiBase}/products/recommend`,
method: 'GET',
success: (res) => {
if (res.statusCode === 200 && res.data.code === 200) {
console.log('推荐商品数据:', res.data.data);
resolve(res.data.data || []);
} else {
console.error('获取推荐商品失败:', res.data);
resolve([]);
}
},
fail: (err) => {
console.error('推荐商品请求失败:', err);
resolve([]);
}
});
});
// 获取热门商品
const hotRequest = new Promise((resolve) => {
wx.request({
url: `${config.apiBase}/products/hot`,
method: 'GET',
success: (res) => {
if (res.statusCode === 200 && res.data.code === 200) {
console.log('热门商品数据:', res.data.data);
resolve(res.data.data || []);
} else {
console.error('获取热门商品失败:', res.data);
resolve([]);
}
},
fail: (err) => {
console.error('热门商品请求失败:', err);
resolve([]);
}
});
});
// 等待所有请求都完成
Promise.all([bannerRequest, categoryRequest, recommendRequest, hotRequest])
.then(([banners, categories, recommendProducts, hotProducts]) => {
// 转换轮播图数据格式 - TDesign轮播图组件需要字符串数组
const swiper = banners.map(banner => banner.image);
console.log('轮播图数据:', swiper);
// 转换分类数据为tabList格式在前面添加热门商品tab
const tabList = [
{
text: '热门商品',
key: 'hot',
},
...categories.map((category, index) => ({
text: category.name,
key: category.id || index,
}))
];
resolve({
swiper,
tabList,
recommendProducts,
hotProducts,
activityImg: `${cdnBase}/activity/banner.png`,
});
})
.catch((error) => {
console.error('获取首页数据失败:', error);
reject(error);
});
});
}