Browse Source

修复商品排序和加载逻辑:1.实现默认排序规则 2.修复sold_out商品加载错误 3.修复下滑加载售空商品问题 4.修复下拉刷新改变商品顺序 5.修复需要下拉刷新才能加载售空商品

pull/11/head
徐飞洋 2 months ago
parent
commit
ce3d0eb6c1
  1. 103
      TEST_PLAN.md
  2. 76
      pages/index/index.js

103
TEST_PLAN.md

@ -0,0 +1,103 @@
# 修复功能测试计划
## 1. 测试默认排序规则
**测试目的**:验证商品是否按照要求的默认排序规则显示
**测试步骤**:
1. 打开小程序首页
2. 观察商品列表顺序
3. 确认排序规则:
- 已发布商品(published)在已售罄商品(sold_out)之前
- 同一状态内,预订数量(reservedCount)高的在前
- 预订数量相同时,价格低的在前
- 价格相同时,创建时间晚的在前
**预期结果**:商品按照上述规则正确排序
## 2. 测试sold_out商品加载逻辑
**测试目的**:验证只有当数据库中找不到published商品时才加载sold_out商品
**测试步骤**:
1. 打开小程序首页
2. 检查初始加载的商品是否都是published状态
3. 向下滑动页面,直到加载更多商品
4. 确认在所有published商品加载完毕后,才开始加载sold_out商品
**预期结果**:
- 初始加载的商品都是published状态
- 当published商品加载完毕后,自动开始加载sold_out商品
## 3. 测试sold_out商品加载功能
**测试目的**:验证sold_out商品能够正常加载
**测试步骤**:
1. 打开小程序首页
2. 向下滑动页面,直到加载sold_out商品
3. 检查是否有sold_out状态的商品显示
**预期结果**:sold_out商品能够正常显示在列表中
## 4. 测试下滑到底部加载功能
**测试目的**:验证下滑到底部能够加载更多商品,包括sold_out商品
**测试步骤**:
1. 打开小程序首页
2. 连续向下滑动页面,直到到达列表底部
3. 观察是否自动加载更多商品
4. 继续滑动,直到加载sold_out商品
**预期结果**:
- 下滑到底部时自动加载更多商品
- published商品加载完毕后,自动加载sold_out商品
## 5. 测试下拉刷新功能
**测试目的**:验证下拉刷新不会改变已加载商品的顺序
**测试步骤**:
1. 打开小程序首页
2. 观察初始商品顺序,记住前几个商品
3. 下拉页面进行刷新
4. 刷新完成后,观察商品顺序是否变化
**预期结果**:下拉刷新后,已加载商品的顺序保持不变,新商品添加在列表底部
## 6. 测试分类和搜索功能
**测试目的**:验证分类和搜索功能下,排序和加载逻辑依然正常
**测试步骤**:
1. 选择一个分类(如"粉壳")
2. 观察商品排序是否正确
3. 向下滑动加载更多商品,验证是否正常加载sold_out商品
4. 进行搜索,重复步骤2和3
**预期结果**:分类和搜索功能下,所有排序和加载逻辑都正常工作
## 7. 测试缓存功能
**测试目的**:验证缓存机制不会影响排序和加载逻辑
**测试步骤**:
1. 打开小程序首页,加载商品
2. 关闭小程序
3. 重新打开小程序
4. 观察商品是否从缓存加载,排序是否正确
**预期结果**:缓存加载的商品保持正确的排序顺序
## 测试环境要求
- WeChat Developer Tools最新版本
- 测试用手机(推荐)或模拟器
- 稳定的网络连接
## 测试注意事项
1. 记录测试过程中的任何异常情况
2. 如果发现问题,尝试重现并记录详细步骤
3. 测试完成后,汇总测试结果

76
pages/index/index.js

@ -368,7 +368,7 @@ Page({
goods: updatedGoods goods: updatedGoods
}, () => { }, () => {
// 重新应用筛选条件,确保显示的商品收藏状态也更新 // 重新应用筛选条件,确保显示的商品收藏状态也更新
const filteredGoods = this.applyFilters(this.data.goods, false); const filteredGoods = this.applyFilters(this.data.goods, true);
this.setData({ this.setData({
filteredGoods: filteredGoods, filteredGoods: filteredGoods,
}); });
@ -463,8 +463,8 @@ Page({
lastDataTimestamp: 0 lastDataTimestamp: 0
}); });
// 查询published和sold_out状态的商品 // 先只查询published状态的商品
const statusList = ['published', 'sold_out']; const statusList = ['published'];
const apiParams = { const apiParams = {
timestamp: timestamp, timestamp: timestamp,
viewMode: 'shopping', viewMode: 'shopping',
@ -688,7 +688,7 @@ Page({
region: product.region ? this.extractProvince(product.region) : '', region: product.region ? this.extractProvince(product.region) : '',
grossWeight: product.grossWeight || product.weight || '', grossWeight: product.grossWeight || product.weight || '',
displayGrossWeight: product.grossWeight || product.weight || '', displayGrossWeight: product.grossWeight || product.weight || '',
status: product.status || 'published', status: product.status,
createdAt: product.created_at || product.createTime || null, createdAt: product.created_at || product.createTime || null,
reservedCount: product.reservedCount || product.selected || 0, reservedCount: product.reservedCount || product.selected || 0,
reservedCountDisplay: product.reservedCount || product.selected || 0, reservedCountDisplay: product.reservedCount || product.selected || 0,
@ -797,7 +797,7 @@ Page({
region: product.region ? this.extractProvince(product.region) : '', region: product.region ? this.extractProvince(product.region) : '',
grossWeight: product.grossWeight || product.weight || '', grossWeight: product.grossWeight || product.weight || '',
displayGrossWeight: product.grossWeight || product.weight || '', displayGrossWeight: product.grossWeight || product.weight || '',
status: product.status || 'published', status: product.status,
createdAt: product.created_at || product.createTime || null, createdAt: product.created_at || product.createTime || null,
reservedCount: product.reservedCount || product.selected || 0, reservedCount: product.reservedCount || product.selected || 0,
reservedCountDisplay: product.reservedCount || product.selected || 0, reservedCountDisplay: product.reservedCount || product.selected || 0,
@ -930,7 +930,8 @@ Page({
// 加载商品数据 - 优化版带缓存,支持状态优先级 // 加载商品数据 - 优化版带缓存,支持状态优先级
loadGoods: function (isLoadMore = false, forceRefresh = false) { loadGoods: function (isLoadMore = false, forceRefresh = false) {
if (isLoadMore && !this.data.hasMoreData) { // 允许继续加载的条件:1. 有更多数据;或者 2. 正在加载售空商品
if (isLoadMore && !this.data.hasMoreData && !this.data.isQueryingSoldOut) {
return return
} }
@ -946,7 +947,7 @@ Page({
// 如果正在加载sold_out,继续加载sold_out // 如果正在加载sold_out,继续加载sold_out
if (isLoadMore && this.data.isQueryingSoldOut) { if (isLoadMore && this.data.isQueryingSoldOut) {
this.loadSoldOutData(cacheKey, currentKeyword, currentCategory, timestamp, isLoadMore); this.loadSoldOutData(cacheKey, currentKeyword, currentCategory, timestamp, true);
return; return;
} }
@ -986,8 +987,8 @@ Page({
console.log('loadGoods - API请求参数:', apiParams); console.log('loadGoods - API请求参数:', apiParams);
// 查询published和sold_out状态的商品 // 先只查询published状态的商品
const statusList = ['published', 'sold_out']; const statusList = ['published'];
console.log('loadGoods - 查询状态列表:', statusList); console.log('loadGoods - 查询状态列表:', statusList);
API.getProductList(statusList, apiParams) API.getProductList(statusList, apiParams)
@ -1008,9 +1009,6 @@ Page({
// 只需要判断是否还有下一页,不需要检查当前页数据量是否等于pageSize // 只需要判断是否还有下一页,不需要检查当前页数据量是否等于pageSize
const publishedHasMore = page < totalPages; const publishedHasMore = page < totalPages;
// 当published商品没有更多数据时,查询sold_out商品
const shouldQuerySoldOut = !publishedHasMore;
// 更新缓存(加载更多时追加数据) // 更新缓存(加载更多时追加数据)
const updatedCache = { ...this.data.categoryQueryCache }; const updatedCache = { ...this.data.categoryQueryCache };
if (isLoadMore && updatedCache[cacheKey]) { if (isLoadMore && updatedCache[cacheKey]) {
@ -1023,33 +1021,16 @@ Page({
updatedCache[cacheKey] = res.products; updatedCache[cacheKey] = res.products;
} }
// 计算sold_out起始页码和每页数量
let soldOutPageNum = 1;
let soldOutPageSize = pageSize;
if (shouldQuerySoldOut || (!publishedHasMore && isLoadMore)) {
// 如果published已无更多数据,查询sold_out商品
soldOutPageNum = isLoadMore ? this.data.soldOutPage + 1 : 1;
soldOutPageSize = pageSize;
}
this.setData({ this.setData({
hasMoreData: publishedHasMore || (shouldQuerySoldOut || this.data.isQueryingSoldOut), hasMoreData: publishedHasMore || true, // 当切换到加载售空商品时,保持hasMoreData为true以允许继续加载
isQueryingSoldOut: shouldQuerySoldOut || (!publishedHasMore && isLoadMore), isQueryingSoldOut: !publishedHasMore, // 当已发布商品加载完毕时,切换到加载售空商品
publishedHasMore: publishedHasMore, publishedHasMore: publishedHasMore,
soldOutPage: soldOutPageNum,
soldOutPageSize: soldOutPageSize,
categoryQueryCache: updatedCache, categoryQueryCache: updatedCache,
lastDataTimestamp: now, lastDataTimestamp: now,
goodsCache: updatedCache[cacheKey] goodsCache: updatedCache[cacheKey]
}); });
this.processGoodsData(res.products, isLoadMore); this.processGoodsData(res.products, isLoadMore);
// 如果需要查询sold_out
if (this.data.isQueryingSoldOut) {
this.loadSoldOutData(cacheKey, currentKeyword, currentCategory, timestamp, isLoadMore);
}
return; return;
} }
@ -1205,7 +1186,7 @@ Page({
region: product.region ? this.extractProvince(product.region) : '', region: product.region ? this.extractProvince(product.region) : '',
grossWeight: product.grossWeight || product.weight || '', grossWeight: product.grossWeight || product.weight || '',
displayGrossWeight: product.grossWeight || product.weight || '', displayGrossWeight: product.grossWeight || product.weight || '',
status: product.status || 'published', status: product.status,
createdAt: product.created_at || product.createTime || null, createdAt: product.created_at || product.createTime || null,
reservedCount: product.reservedCount || product.selected || 0, reservedCount: product.reservedCount || product.selected || 0,
reservedCountDisplay: product.reservedCount || product.selected || 0, reservedCountDisplay: product.reservedCount || product.selected || 0,
@ -1234,7 +1215,7 @@ Page({
this.updateGoodsFavoriteStatus(processedGoods, false); this.updateGoodsFavoriteStatus(processedGoods, false);
// 应用筛选条件 // 应用筛选条件
const filteredGoods = this.applyFilters(processedGoods, false); const filteredGoods = this.applyFilters(processedGoods, true);
const groupedGoods = this.groupGoodsForStaggeredLayout(filteredGoods); const groupedGoods = this.groupGoodsForStaggeredLayout(filteredGoods);
this.setData({ this.setData({
@ -1388,7 +1369,21 @@ Page({
filtered = Array.from(uniqueGoodsMap.values()); filtered = Array.from(uniqueGoodsMap.values());
if (shouldSort) { if (shouldSort) {
filtered.sort((a, b) => { // First, separate items by status
const publishedItems = []
const soldOutItems = []
filtered.forEach(item => {
const status = (item.status || '').toLowerCase()
if (status === 'published') {
publishedItems.push(item)
} else if (status === 'sold_out') {
soldOutItems.push(item)
}
})
// Define the sorting function for existing criteria
const sortByExistingCriteria = (a, b) => {
const reservedCountA = a.reservedCount || 0 const reservedCountA = a.reservedCount || 0
const reservedCountB = b.reservedCount || 0 const reservedCountB = b.reservedCount || 0
if (reservedCountB !== reservedCountA) return reservedCountB - reservedCountA if (reservedCountB !== reservedCountA) return reservedCountB - reservedCountA
@ -1400,7 +1395,14 @@ Page({
const createdAtA = new Date(a.createdAt || 0).getTime() const createdAtA = new Date(a.createdAt || 0).getTime()
const createdAtB = new Date(b.createdAt || 0).getTime() const createdAtB = new Date(b.createdAt || 0).getTime()
return createdAtB - createdAtA return createdAtB - createdAtA
}) }
// Sort each group by existing criteria
publishedItems.sort(sortByExistingCriteria)
soldOutItems.sort(sortByExistingCriteria)
// Combine groups: all published first, then all sold_out
filtered = [...publishedItems, ...soldOutItems]
} }
// 统一字段长度 // 统一字段长度
@ -1544,7 +1546,7 @@ Page({
console.log('searchGoods - 本地已有商品数量:', this.data.goods.length); console.log('searchGoods - 本地已有商品数量:', this.data.goods.length);
// 先对本地已加载的商品进行过滤 // 先对本地已加载的商品进行过滤
const filteredGoods = this.applyFilters(this.data.goods, false); const filteredGoods = this.applyFilters(this.data.goods, true);
console.log('searchGoods - 本地过滤结果数量:', filteredGoods.length); console.log('searchGoods - 本地过滤结果数量:', filteredGoods.length);
@ -1896,7 +1898,7 @@ Page({
goods: updatedGoodsList goods: updatedGoodsList
}, () => { }, () => {
// 重新应用筛选条件,确保显示的商品收藏状态也更新 // 重新应用筛选条件,确保显示的商品收藏状态也更新
const filteredGoods = this.applyFilters(this.data.goods, false); const filteredGoods = this.applyFilters(this.data.goods, true);
this.setData({ this.setData({
filteredGoods: filteredGoods, filteredGoods: filteredGoods,
}); });

Loading…
Cancel
Save