Browse Source

允许查看已下架商品详情:移除sold_out状态限制

pull/6/head
徐飞洋 2 months ago
parent
commit
74dd03c93a
  1. 5
      pages/buyer/index.js
  2. 4
      pages/favorites/index.js
  3. 17
      pages/favorites/index.wxml
  4. 4
      pages/index/index.js
  5. 1
      pages/index/index.wxml
  6. 5
      pages/index/index.wxss
  7. 20
      utils/api.js

5
pages/buyer/index.js

@ -672,7 +672,7 @@ Page({
// ✅ 修改:添加分页参数 // ✅ 修改:添加分页参数
const { pageSize } = this.data; const { pageSize } = this.data;
API.getProductList('published', { API.getProductList(['published', 'sold_out'], {
viewMode: 'shopping', viewMode: 'shopping',
page: 1, // 第一页 page: 1, // 第一页
pageSize: pageSize // 使用配置的页面大小 pageSize: pageSize // 使用配置的页面大小
@ -831,7 +831,7 @@ Page({
} }
console.log('准备调用API.getProductList,无论是否登录都尝试获取公开商品'); console.log('准备调用API.getProductList,无论是否登录都尝试获取公开商品');
return API.getProductList('published', { return API.getProductList(['published', 'sold_out'], {
timestamp: timestamp, timestamp: timestamp,
viewMode: 'shopping', viewMode: 'shopping',
page: currentPage, page: currentPage,
@ -1731,6 +1731,7 @@ Page({
} }
const goodsItem = e.currentTarget.dataset.item; const goodsItem = e.currentTarget.dataset.item;
// 跳转到商品详情页面,并传递商品数据,使用encodeURIComponent编码JSON字符串 // 跳转到商品详情页面,并传递商品数据,使用encodeURIComponent编码JSON字符串
wx.navigateTo({ wx.navigateTo({
url: '/pages/goods-detail/goods-detail?goodsData=' + encodeURIComponent(JSON.stringify(goodsItem)) url: '/pages/goods-detail/goods-detail?goodsData=' + encodeURIComponent(JSON.stringify(goodsItem))

4
pages/favorites/index.js

@ -205,7 +205,7 @@ Page({
} }
// 首先获取所有商品列表,确保包含联系人信息 // 首先获取所有商品列表,确保包含联系人信息
API.getProductList('published', { API.getProductList(['published', 'sold_out'], {
page: 1, page: 1,
pageSize: 100 // 获取足够多的商品,确保包含所有收藏商品 pageSize: 100 // 获取足够多的商品,确保包含所有收藏商品
}).then(productListRes => { }).then(productListRes => {
@ -402,7 +402,7 @@ Page({
// 调用API.getProductList获取完整的商品列表,确保包含联系人信息 // 调用API.getProductList获取完整的商品列表,确保包含联系人信息
wx.showLoading({ title: '加载中' }); wx.showLoading({ title: '加载中' });
API.getProductList('published', { API.getProductList(['published', 'sold_out'], {
page: 1, page: 1,
pageSize: 100 // 获取足够多的商品,确保包含当前商品 pageSize: 100 // 获取足够多的商品,确保包含当前商品
}).then(productListRes => { }).then(productListRes => {

17
pages/favorites/index.wxml

@ -15,7 +15,7 @@
<!-- 收藏列表 --> <!-- 收藏列表 -->
<view wx:else class="goods-list" style="width: 100%; display: flex; flex-direction: column; align-items: flex-start;"> <view wx:else class="goods-list" style="width: 100%; display: flex; flex-direction: column; align-items: flex-start;">
<view wx:for="{{favoritesList}}" wx:key="productId" class="card" style="width: 100%; margin-top: 0; margin-bottom: 20rpx;"> <view wx:for="{{favoritesList}}" wx:key="productId" class="card" style="width: 100%; margin-top: 0; margin-bottom: 20rpx; height: 272rpx; display: block; box-sizing: border-box">
<!-- 图片和信息2:3比例并排显示,整体高度固定 --> <!-- 图片和信息2:3比例并排显示,整体高度固定 -->
<view style="display: flex; width: 100%; height: 200rpx; border-radius: 8rpx; overflow: hidden; background-color: #f5f5f5;"> <view style="display: flex; width: 100%; height: 200rpx; border-radius: 8rpx; overflow: hidden; background-color: #f5f5f5;">
<!-- 左侧图片区域 40%宽度(2/5),高度固定 --> <!-- 左侧图片区域 40%宽度(2/5),高度固定 -->
@ -37,7 +37,7 @@
data-item-id="{{index}}"> data-item-id="{{index}}">
<block wx:for="{{item.Product.imageUrls}}" wx:for-item="img" wx:for-index="idx" wx:key="idx"> <block wx:for="{{item.Product.imageUrls}}" wx:for-item="img" wx:for-index="idx" wx:key="idx">
<swiper-item> <swiper-item>
<image src="{{img}}" mode="aspectFill" style="width: 100%; height: 100%;" bindtap="previewImage" data-urls="{{item.Product.imageUrls}}" data-index="{{idx}}"></image> <image src="{{img}}" mode="aspectFill" style="width: 268rpx; height: 210rpx; display: inline-block; box-sizing: border-box" bindtap="previewImage" data-urls="{{item.Product.imageUrls}}" data-index="{{idx}}"></image>
</swiper-item> </swiper-item>
</block> </block>
</swiper> </swiper>
@ -51,28 +51,29 @@
<!-- 右侧信息区域 60%宽度(3/5),相应调整 --> <!-- 右侧信息区域 60%宽度(3/5),相应调整 -->
<view style="width: 60%; display: flex; flex-direction: column; background-color: white; border-left: 1rpx solid #f0f0f0;"> <view style="width: 60%; display: flex; flex-direction: column; background-color: white; border-left: 1rpx solid #f0f0f0;">
<!-- 上半部分商品信息区域(60%高度),可点击查看详情 --> <!-- 上半部分商品信息区域(60%高度),可点击查看详情 -->
<view style="flex: 0.6; padding: 0rpx 15rpx 15rpx 15rpx; cursor: pointer;" bindtap="goToGoodsDetail" data-item="{{item}}"> <view style="padding: 0rpx 15rpx 15rpx 15rpx; cursor: pointer; width: 391rpx; height: 150rpx; display: block; box-sizing: border-box" bindtap="goToGoodsDetail" data-item="{{item}}">
<view> <view style="width: 362rpx; height: 133rpx; display: block; box-sizing: border-box">
<view style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 10rpx;"> <view style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 10rpx;">
<view style="display: flex; align-items: center; flex: 1;"> <view style="display: flex; align-items: center; flex: 1;">
<view style="display: inline-block; margin-right: 10rpx; font-size: 18rpx; color: #fff; background: rgba(218, 165, 32, 0.8); padding: 4rpx 10rpx; border-radius: 15rpx; vertical-align: middle; backdrop-filter: blur(10rpx); border: 1rpx solid rgba(255, 255, 255, 0.3); box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15), inset 0 1rpx 0 rgba(255, 255, 255, 0.5); text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.2); font-weight: bold; margin-top: -0.1rpx;">{{item.Product.supplyStatus || '暂无状态'}}</view> <view wx:if="{{item.Product.status === 'sold_out'}}" style="display: inline-block; margin-right: 10rpx; font-size: 18rpx; color: #fff; background: linear-gradient(135deg, #8c8c8c 0%, #a6a6a6 100%); padding: 4rpx 10rpx; border-radius: 15rpx; vertical-align: middle; backdrop-filter: blur(10rpx); border: 1rpx solid rgba(255, 255, 255, 0.3); box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15), inset 0 1rpx 0 rgba(255, 255, 255, 0.5); text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.2); font-weight: bold; margin-top: -0.1rpx;">已下架</view>
<view wx:elif="{{item.Product.supplyStatus}}" style="display: inline-block; margin-right: 10rpx; font-size: 18rpx; color: #fff; background: rgba(218, 165, 32, 0.8); padding: 4rpx 10rpx; border-radius: 15rpx; vertical-align: middle; backdrop-filter: blur(10rpx); border: 1rpx solid rgba(255, 255, 255, 0.3); box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15), inset 0 1rpx 0 rgba(255, 255, 255, 0.5); text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.2); font-weight: bold; margin-top: -0.1rpx;">{{item.Product.supplyStatus}}</view>
<text style="font-size: 36rpx; font-weight: bold;">{{item.Product.productName || '未命名商品'}}</text> <text style="font-size: 36rpx; font-weight: bold;">{{item.Product.productName || '未命名商品'}}</text>
<span style="vertical-align: middle; font-size: 12rpx; color: white; background: linear-gradient(135deg, #4a90e2 0%, #2b66f0 50%, #1a4bbd 100%); padding: 4rpx 10rpx; clip-path: polygon(50% 0%, 70% 10%, 100% 30%, 100% 70%, 70% 90%, 50% 100%, 30% 90%, 0% 70%, 0% 30%, 30% 10%); margin-left: 8rpx; box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.3), inset 0 1rpx 2rpx rgba(255, 255, 255, 0.5); text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.5); font-weight: bold; margin-top: -20rpx;">V</span> <span style="vertical-align: middle; font-size: 12rpx; color: white; background: linear-gradient(135deg, #4a90e2 0%, #2b66f0 50%, #1a4bbd 100%); padding: 4rpx 10rpx; clip-path: polygon(50% 0%, 70% 10%, 100% 30%, 100% 70%, 70% 90%, 50% 100%, 30% 90%, 0% 70%, 0% 30%, 30% 10%); margin-left: 8rpx; box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.3), inset 0 1rpx 2rpx rgba(255, 255, 255, 0.5); text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.5); font-weight: bold; margin-top: -20rpx;">V</span>
</view> </view>
</view> </view>
<view style="font-size: 28rpx; color: #888; margin-top: 30rpx;"> <view style="font-size: 28rpx; color: #888; margin-top: 30rpx; width: 362rpx; height: 70rpx; display: block; box-sizing: border-box">
{{(item.Product.spec && item.Product.spec !== '无') ? item.Product.spec : (item.Product.specification && item.Product.specification !== '无') ? item.Product.specification : '无'}} | {{item.Product.yolk || '无'}} | {{item.Product.minOrder || item.Product.quantity || 1}}件 {{(item.Product.spec && item.Product.spec !== '无') ? item.Product.spec : (item.Product.specification && item.Product.specification !== '无') ? item.Product.specification : '无'}} | {{item.Product.yolk || '无'}} | {{item.Product.minOrder || item.Product.quantity || 1}}件
</view> </view>
</view> </view>
</view> </view>
<!-- 下半部分按钮区域(40%高度) --> <!-- 下半部分按钮区域(40%高度) -->
<view style="flex: 0.4; display: flex; justify-content: space-between; align-items: center; padding: 0 20rpx;"> <view style="display: flex; justify-content: space-between; align-items: center; padding: 0 20rpx; height: 79rpx; box-sizing: border-box; width: 391rpx">
<!-- 价格显示 --> <!-- 价格显示 -->
<text style="color: #52c41a; font-size: 28rpx; font-weight: bold;">¥{{item.Product.price || 0}}</text> <text style="color: #52c41a; font-size: 28rpx; font-weight: bold;">¥{{item.Product.price || 0}}</text>
<!-- 取消收藏按钮 --> <!-- 取消收藏按钮 -->
<button <button
style="font-size: 24rpx; font-weight: bold; width: 150rpx; height: 60rpx; border-radius: 24rpx; display: flex; justify-content: center; align-items: center; padding: 0; border: none; margin: 0; transition: all 0.3s ease; position: relative; overflow: hidden; color: #FF6B6B; background: rgba(255, 107, 107, 0.15); backdrop-filter: blur(12rpx); -webkit-backdrop-filter: blur(12rpx); border: 1rpx solid rgba(255, 255, 255, 0.3); box-shadow: 0 8rpx 32rpx rgba(31, 38, 135, 0.2), 0 4rpx 16rpx rgba(0, 0, 0, 0.1), inset 0 2rpx 4rpx rgba(255, 255, 255, 0.7), inset 0 -2rpx 4rpx rgba(0, 0, 0, 0.1);" style="font-size: 24rpx; font-weight: bold; width: 149rpx; height: 58rpx; border-radius: 24rpx; display: flex; justify-content: center; align-items: center; padding: 0; border: none; margin: 0; transition: all 0.3s ease; position: relative; overflow: hidden; color: #FF6B6B; background: rgba(255, 107, 107, 0.15); backdrop-filter: blur(12rpx); -webkit-backdrop-filter: blur(12rpx); box-shadow: 0 8rpx 32rpx rgba(31, 38, 135, 0.2), 0 4rpx 16rpx rgba(0, 0, 0, 0.1), inset 0 2rpx 4rpx rgba(255, 255, 255, 0.7), inset 0 -2rpx 4rpx rgba(0, 0, 0, 0.1); box-sizing: border-box; left: 6rpx; top: -11rpx"
bindtap="cancelFavorite" bindtap="cancelFavorite"
data-productid="{{item.productId}}" data-productid="{{item.productId}}"
> >

4
pages/index/index.js

@ -411,7 +411,7 @@ Page({
lastDataTimestamp: 0 lastDataTimestamp: 0
}); });
API.getProductList('published', { API.getProductList(['published', 'sold_out'], {
timestamp: timestamp, timestamp: timestamp,
viewMode: 'shopping', viewMode: 'shopping',
page: 1, page: 1,
@ -869,7 +869,7 @@ Page({
const timestamp = new Date().getTime(); const timestamp = new Date().getTime();
const page = isLoadMore ? this.data.page : 1 const page = isLoadMore ? this.data.page : 1
API.getProductList('published', { API.getProductList(['published', 'sold_out'], {
timestamp: timestamp, timestamp: timestamp,
viewMode: 'shopping', viewMode: 'shopping',
page: page, page: page,

1
pages/index/index.wxml

@ -179,6 +179,7 @@
style="height: 270rpx; display: block; box-sizing: border-box; width: 337rpx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; z-index: 1;"></image> style="height: 270rpx; display: block; box-sizing: border-box; width: 337rpx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; z-index: 1;"></image>
<view wx:if="{{item.supplyStatus === '预售'}}" class="promo-tag presale">预售</view> <view wx:if="{{item.supplyStatus === '预售'}}" class="promo-tag presale">预售</view>
<view wx:if="{{item.supplyStatus === '现货'}}" class="promo-tag in-stock">现货</view> <view wx:if="{{item.supplyStatus === '现货'}}" class="promo-tag in-stock">现货</view>
<view wx:if="{{item.status === 'sold_out'}}" class="promo-tag sold-out">已下架</view>
</view> </view>
<view class="product-info" style="height: 190rpx; display: flex; box-sizing: border-box"> <view class="product-info" style="height: 190rpx; display: flex; box-sizing: border-box">
<view class="product-title" style="height: 38rpx; display: -webkit-box; box-sizing: border-box">{{item.name}}</view> <view class="product-title" style="height: 38rpx; display: -webkit-box; box-sizing: border-box">{{item.name}}</view>

5
pages/index/index.wxss

@ -1390,6 +1390,11 @@ video.product-media {
box-shadow: 0 2rpx 8rpx rgba(255, 0, 0, 0.3); box-shadow: 0 2rpx 8rpx rgba(255, 0, 0, 0.3);
} }
.promo-tag.sold-out {
background: linear-gradient(135deg, #8c8c8c 0%, #a6a6a6 100%);
box-shadow: 0 2rpx 8rpx rgba(140, 140, 140, 0.3);
}
/* 商品信息区域 */ /* 商品信息区域 */
.product-info { .product-info {
padding: 16rpx; padding: 16rpx;

20
utils/api.js

@ -1451,7 +1451,21 @@ module.exports = {
// 获取商品列表 - 支持未登录用户查看公开商品 // 获取商品列表 - 支持未登录用户查看公开商品
getProductList: function (status = 'published', options = {}) { getProductList: function (status = 'published', options = {}) {
const openid = wx.getStorageSync('openid'); const openid = wx.getStorageSync('openid');
console.log('API.getProductList - openid:', openid ? '存在' : '不存在', 'status:', status);
// 处理status参数,支持字符串或数组格式
let statusList = [];
if (Array.isArray(status)) {
// 如果传入的是数组,直接使用
statusList = status;
} else if (typeof status === 'string' && status.includes(',')) {
// 如果是逗号分隔的字符串,转换为数组
statusList = status.split(',').map(s => s.trim());
} else {
// 单个状态值,转换为数组
statusList = [status];
}
console.log('API.getProductList - openid:', openid ? '存在' : '不存在', 'statusList:', statusList);
// 不再因为没有openid而拒绝请求,允许未登录用户查看公开商品 // 不再因为没有openid而拒绝请求,允许未登录用户查看公开商品
@ -1461,7 +1475,7 @@ module.exports = {
// 添加时间戳参数防止请求缓存 // 添加时间戳参数防止请求缓存
const requestData = { const requestData = {
status: status, status: statusList, // 传递状态数组
// 不设置默认的viewMode,让调用方根据需要设置 // 不设置默认的viewMode,让调用方根据需要设置
_t: options.timestamp || new Date().getTime(), // 添加时间戳参数防止缓存 _t: options.timestamp || new Date().getTime(), // 添加时间戳参数防止缓存
// 始终包含分页参数 // 始终包含分页参数
@ -1488,7 +1502,7 @@ module.exports = {
} }
console.log('API.getProductList - 分页参数:', { page: page, pageSize: pageSize }); console.log('API.getProductList - 分页参数:', { page: page, pageSize: pageSize });
console.log('API.getProductList - 查询状态:', statusList);
console.log('API.getProductList - 请求数据:', requestData); console.log('API.getProductList - 请求数据:', requestData);
return request('/api/product/list', 'POST', requestData).then(data => { return request('/api/product/list', 'POST', requestData).then(data => {

Loading…
Cancel
Save