From ce3d0eb6c149829be6011a11b38295880c86899f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=A3=9E=E6=B4=8B?= <15778543+xufeiyang6017@user.noreply.gitee.com> Date: Thu, 8 Jan 2026 18:34:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=95=86=E5=93=81=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E5=92=8C=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91=EF=BC=9A?= =?UTF-8?q?1.=E5=AE=9E=E7=8E=B0=E9=BB=98=E8=AE=A4=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E8=A7=84=E5=88=99=202.=E4=BF=AE=E5=A4=8Dsold=5Fout=E5=95=86?= =?UTF-8?q?=E5=93=81=E5=8A=A0=E8=BD=BD=E9=94=99=E8=AF=AF=203.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=8B=E6=BB=91=E5=8A=A0=E8=BD=BD=E5=94=AE=E7=A9=BA?= =?UTF-8?q?=E5=95=86=E5=93=81=E9=97=AE=E9=A2=98=204.=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E5=88=B7=E6=96=B0=E6=94=B9=E5=8F=98=E5=95=86?= =?UTF-8?q?=E5=93=81=E9=A1=BA=E5=BA=8F=205.=E4=BF=AE=E5=A4=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E4=B8=8B=E6=8B=89=E5=88=B7=E6=96=B0=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=94=AE=E7=A9=BA=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEST_PLAN.md | 103 +++++++++++++++++++++++++++++++++++++++++++ pages/index/index.js | 76 +++++++++++++++---------------- 2 files changed, 142 insertions(+), 37 deletions(-) create mode 100644 TEST_PLAN.md diff --git a/TEST_PLAN.md b/TEST_PLAN.md new file mode 100644 index 0000000..86f9e55 --- /dev/null +++ b/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. 测试完成后,汇总测试结果 diff --git a/pages/index/index.js b/pages/index/index.js index c4e15fb..3f6b5c2 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -368,7 +368,7 @@ Page({ goods: updatedGoods }, () => { // 重新应用筛选条件,确保显示的商品收藏状态也更新 - const filteredGoods = this.applyFilters(this.data.goods, false); + const filteredGoods = this.applyFilters(this.data.goods, true); this.setData({ filteredGoods: filteredGoods, }); @@ -463,8 +463,8 @@ Page({ lastDataTimestamp: 0 }); - // 查询published和sold_out状态的商品 - const statusList = ['published', 'sold_out']; + // 先只查询published状态的商品 + const statusList = ['published']; const apiParams = { timestamp: timestamp, viewMode: 'shopping', @@ -688,7 +688,7 @@ Page({ region: product.region ? this.extractProvince(product.region) : '', grossWeight: product.grossWeight || product.weight || '', displayGrossWeight: product.grossWeight || product.weight || '', - status: product.status || 'published', + status: product.status, createdAt: product.created_at || product.createTime || null, reservedCount: product.reservedCount || product.selected || 0, reservedCountDisplay: product.reservedCount || product.selected || 0, @@ -797,7 +797,7 @@ Page({ region: product.region ? this.extractProvince(product.region) : '', grossWeight: product.grossWeight || product.weight || '', displayGrossWeight: product.grossWeight || product.weight || '', - status: product.status || 'published', + status: product.status, createdAt: product.created_at || product.createTime || null, reservedCount: product.reservedCount || product.selected || 0, reservedCountDisplay: product.reservedCount || product.selected || 0, @@ -930,7 +930,8 @@ Page({ // 加载商品数据 - 优化版带缓存,支持状态优先级 loadGoods: function (isLoadMore = false, forceRefresh = false) { - if (isLoadMore && !this.data.hasMoreData) { + // 允许继续加载的条件:1. 有更多数据;或者 2. 正在加载售空商品 + if (isLoadMore && !this.data.hasMoreData && !this.data.isQueryingSoldOut) { return } @@ -946,7 +947,7 @@ Page({ // 如果正在加载sold_out,继续加载sold_out if (isLoadMore && this.data.isQueryingSoldOut) { - this.loadSoldOutData(cacheKey, currentKeyword, currentCategory, timestamp, isLoadMore); + this.loadSoldOutData(cacheKey, currentKeyword, currentCategory, timestamp, true); return; } @@ -986,8 +987,8 @@ Page({ console.log('loadGoods - API请求参数:', apiParams); - // 查询published和sold_out状态的商品 - const statusList = ['published', 'sold_out']; + // 先只查询published状态的商品 + const statusList = ['published']; console.log('loadGoods - 查询状态列表:', statusList); API.getProductList(statusList, apiParams) @@ -1008,9 +1009,6 @@ Page({ // 只需要判断是否还有下一页,不需要检查当前页数据量是否等于pageSize const publishedHasMore = page < totalPages; - // 当published商品没有更多数据时,查询sold_out商品 - const shouldQuerySoldOut = !publishedHasMore; - // 更新缓存(加载更多时追加数据) const updatedCache = { ...this.data.categoryQueryCache }; if (isLoadMore && updatedCache[cacheKey]) { @@ -1023,33 +1021,16 @@ Page({ 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({ - hasMoreData: publishedHasMore || (shouldQuerySoldOut || this.data.isQueryingSoldOut), - isQueryingSoldOut: shouldQuerySoldOut || (!publishedHasMore && isLoadMore), + hasMoreData: publishedHasMore || true, // 当切换到加载售空商品时,保持hasMoreData为true以允许继续加载 + isQueryingSoldOut: !publishedHasMore, // 当已发布商品加载完毕时,切换到加载售空商品 publishedHasMore: publishedHasMore, - soldOutPage: soldOutPageNum, - soldOutPageSize: soldOutPageSize, categoryQueryCache: updatedCache, lastDataTimestamp: now, goodsCache: updatedCache[cacheKey] }); this.processGoodsData(res.products, isLoadMore); - - // 如果需要查询sold_out - if (this.data.isQueryingSoldOut) { - this.loadSoldOutData(cacheKey, currentKeyword, currentCategory, timestamp, isLoadMore); - } - return; } @@ -1205,7 +1186,7 @@ Page({ region: product.region ? this.extractProvince(product.region) : '', grossWeight: product.grossWeight || product.weight || '', displayGrossWeight: product.grossWeight || product.weight || '', - status: product.status || 'published', + status: product.status, createdAt: product.created_at || product.createTime || null, reservedCount: product.reservedCount || product.selected || 0, reservedCountDisplay: product.reservedCount || product.selected || 0, @@ -1234,7 +1215,7 @@ Page({ this.updateGoodsFavoriteStatus(processedGoods, false); // 应用筛选条件 - const filteredGoods = this.applyFilters(processedGoods, false); + const filteredGoods = this.applyFilters(processedGoods, true); const groupedGoods = this.groupGoodsForStaggeredLayout(filteredGoods); this.setData({ @@ -1388,7 +1369,21 @@ Page({ filtered = Array.from(uniqueGoodsMap.values()); 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 reservedCountB = b.reservedCount || 0 if (reservedCountB !== reservedCountA) return reservedCountB - reservedCountA @@ -1400,7 +1395,14 @@ Page({ const createdAtA = new Date(a.createdAt || 0).getTime() const createdAtB = new Date(b.createdAt || 0).getTime() 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); // 先对本地已加载的商品进行过滤 - const filteredGoods = this.applyFilters(this.data.goods, false); + const filteredGoods = this.applyFilters(this.data.goods, true); console.log('searchGoods - 本地过滤结果数量:', filteredGoods.length); @@ -1896,7 +1898,7 @@ Page({ goods: updatedGoodsList }, () => { // 重新应用筛选条件,确保显示的商品收藏状态也更新 - const filteredGoods = this.applyFilters(this.data.goods, false); + const filteredGoods = this.applyFilters(this.data.goods, true); this.setData({ filteredGoods: filteredGoods, });