Files
2025-11-17 14:11:46 +08:00

277 lines
6.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable no-param-reassign */
import { getSearchResult } from '../../../services/good/fetchSearchResult';
import Toast from 'tdesign-miniprogram/toast/index';
const initFilters = {
overall: 1,
sorts: '',
};
Page({
data: {
goodsList: [],
sorts: '',
overall: 1,
show: false,
minVal: '',
maxVal: '',
minSalePriceFocus: false,
maxSalePriceFocus: false,
filter: initFilters,
hasLoaded: false,
keywords: '',
loadMoreStatus: 0,
loading: true,
},
total: 0,
pageNum: 1,
pageSize: 30,
onLoad(options) {
const { searchValue = '' } = options || {};
// 解码URL编码的搜索值确保中文字符正确显示
const decodedSearchValue = searchValue ? decodeURIComponent(searchValue) : '';
this.setData(
{
keywords: decodedSearchValue,
},
() => {
this.init(true);
},
);
},
generalQueryData(reset = false) {
const { filter, keywords, minVal, maxVal } = this.data;
const { pageNum, pageSize } = this;
const { sorts, overall } = filter;
const params = {
sort: 0, // 0 综合1 价格
pageNum: 1,
pageSize: 30,
keyword: keywords,
};
if (sorts) {
params.sort = 1;
params.sortType = sorts === 'desc' ? 1 : 0;
}
if (overall) {
params.sort = 0;
} else {
params.sort = 1;
}
params.minPrice = minVal ? minVal * 100 : 0;
params.maxPrice = maxVal ? maxVal * 100 : undefined;
if (reset) return params;
return {
...params,
pageNum: pageNum + 1,
pageSize,
};
},
async init(reset = true) {
const { loadMoreStatus, goodsList = [] } = this.data;
const params = this.generalQueryData(reset);
if (loadMoreStatus !== 0) return;
this.setData({
loadMoreStatus: 1,
loading: true,
});
try {
const result = await getSearchResult(params);
console.log('🔍 搜索结果页面收到数据:', result);
if (result && result.spuList) {
const { spuList, totalCount = 0 } = result;
if (totalCount === 0 && reset) {
this.total = totalCount;
this.setData({
emptyInfo: {
tip: '抱歉,未找到相关商品',
},
hasLoaded: true,
loadMoreStatus: 0,
loading: false,
goodsList: [],
});
return;
}
const _goodsList = reset ? spuList : goodsList.concat(spuList);
_goodsList.forEach((v) => {
v.tags = v.spuTagList ? v.spuTagList.map((u) => u.title) : (v.tags || []);
v.hideKey = { desc: true };
});
const _loadMoreStatus = _goodsList.length === totalCount ? 2 : 0;
this.pageNum = params.pageNum || 1;
this.total = totalCount;
this.setData({
goodsList: _goodsList,
loadMoreStatus: _loadMoreStatus,
});
} else {
console.error('🔍 搜索结果格式错误:', result);
this.setData({
loading: false,
emptyInfo: {
tip: '搜索结果格式错误,请稍候重试',
},
});
wx.showToast({
title: '查询失败,请稍候重试',
icon: 'none'
});
}
} catch (error) {
console.error('🔍 搜索请求失败:', error);
this.setData({
loading: false,
emptyInfo: {
tip: '网络连接失败,请检查网络后重试',
},
});
wx.showToast({
title: error.message || '网络请求失败',
icon: 'none'
});
}
this.setData({
hasLoaded: true,
loading: false,
});
},
handleCartTap() {
wx.switchTab({
url: '/pages/cart/index',
});
},
handleSubmit() {
this.setData(
{
goodsList: [],
loadMoreStatus: 0,
},
() => {
this.init(true);
},
);
},
onReachBottom() {
const { goodsList } = this.data;
const { total = 0 } = this;
if (goodsList.length === total) {
this.setData({
loadMoreStatus: 2,
});
return;
}
this.init(false);
},
handleAddCart() {
Toast({
context: this,
selector: '#t-toast',
message: '点击加购',
});
},
gotoGoodsDetail(e) {
const { index } = e.detail;
const { spuId } = this.data.goodsList[index];
wx.navigateTo({
url: `/pages/goods/details/index?spuId=${spuId}`,
});
},
handleFilterChange(e) {
const { overall, sorts } = e.detail;
const { total } = this;
const _filter = {
sorts,
overall,
};
this.setData({
filter: _filter,
sorts,
overall,
});
this.pageNum = 1;
this.setData(
{
goodsList: [],
loadMoreStatus: 0,
},
() => {
total && this.init(true);
},
);
},
showFilterPopup() {
this.setData({
show: true,
});
},
showFilterPopupClose() {
this.setData({
show: false,
});
},
onMinValAction(e) {
const { value } = e.detail;
this.setData({ minVal: value });
},
onMaxValAction(e) {
const { value } = e.detail;
this.setData({ maxVal: value });
},
reset() {
this.setData({ minVal: '', maxVal: '' });
},
confirm() {
const { minVal, maxVal } = this.data;
let message = '';
if (minVal && !maxVal) {
message = `价格最小是${minVal}`;
} else if (!minVal && maxVal) {
message = `价格范围是0-${maxVal}`;
} else if (minVal && maxVal && minVal <= maxVal) {
message = `价格范围${minVal}-${this.data.maxVal}`;
} else {
message = '请输入正确范围';
}
if (message) {
Toast({
context: this,
selector: '#t-toast',
message,
});
}
this.pageNum = 1;
this.setData(
{
show: false,
goodsList: [],
loadMoreStatus: 0,
},
() => {
// 保留价格筛选值确保传入后端API
this.init(true);
},
);
},
});