From 148d6d255831149a6e29c830edb401b53c16b7ec Mon Sep 17 00:00:00 2001 From: Default User Date: Mon, 22 Dec 2025 14:05:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0sourceType=E5=92=8CsupplyStat?= =?UTF-8?q?us=E5=AD=97=E6=AE=B5=E6=94=AF=E6=8C=81=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=BA=A7=E5=93=81=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E5=89=8D=E7=AB=AF=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/buyer/index.js | 104 +++++++++++++++------------ pages/buyer/index.wxml | 7 +- pages/favorites/index.js | 17 ++++- pages/favorites/index.wxml | 9 +-- pages/goods-detail/goods-detail.js | 55 +++++++++++++- pages/goods-detail/goods-detail.wxml | 15 ++-- pages/goods-detail/goods-detail.wxss | 38 ++++++++-- project.private.config.json | 2 +- server-example/server-mysql.js | 16 ++++- utils/api.js | 13 +++- 10 files changed, 208 insertions(+), 68 deletions(-) diff --git a/pages/buyer/index.js b/pages/buyer/index.js index 4096fd6..dfce519 100644 --- a/pages/buyer/index.js +++ b/pages/buyer/index.js @@ -840,53 +840,63 @@ Page({ const reservedGoodsIds = wx.getStorageSync('reservedGoodsIds') || [] // 将服务器返回的商品数据转换为本地需要的格式 - const newGoods = pagedProducts.map(product => { - // 处理grossWeight为null或无效的情况,返回空字符串以支持文字输入 - const grossWeightValue = product.grossWeight !== null && product.grossWeight !== undefined ? product.grossWeight : ''; - - // 确保商品ID的一致性 - const productIdStr = String(product.productId || product.id); - - // 增强的预约人数计算逻辑 - const selectedValue = product.selected; - const reservedCountValue = product.reservedCount; - const reservationCountValue = product.reservationCount; - - const finalReservationCount = selectedValue !== undefined && selectedValue !== null ? selectedValue : - (reservedCountValue !== undefined && reservedCountValue !== null ? reservedCountValue : - (reservationCountValue || 0)); - - return { - id: productIdStr, - productId: productIdStr, - name: product.productName, - price: product.price, - minOrder: product.quantity, - yolk: product.yolk, - spec: (product.spec && product.spec !== '无') ? product.spec : (product.specification && product.specification !== '无') ? product.specification : '', - specification: (product.spec && product.spec !== '无') ? product.spec : (product.specification && product.specification !== '无') ? product.specification : '', - region: product.region || '', // 【新增】添加地区字段 - grossWeight: grossWeightValue, - displayGrossWeight: formatGrossWeight(grossWeightValue, product.weight), - seller: product.seller && (product.seller.name || product.seller.nickName) ? (product.seller.name || product.seller.nickName) : '未知卖家', - status: product.status || 'published', - imageUrls: product.imageUrls || [], - createdAt: product.created_at || product.createTime || null, - reservedCount: finalReservationCount, - product_contact: product.product_contact || '', // 【新增】添加联系人字段 - contact_phone: product.contact_phone || '', // 【新增】添加联系人电话字段 - debugInfo: { - originalSelected: selectedValue, - originalReservedCount: reservedCountValue, - originalReservationCount: reservationCountValue - }, - isReserved: reservedGoodsIds.some(id => - String(id) === productIdStr || - String(id) === String(product.id) - ), - isFavorite: false, // 初始化收藏状态为false - currentImageIndex: 0 - }; + const newGoods = pagedProducts.map(product => { + // 处理grossWeight为null或无效的情况,返回空字符串以支持文字输入 + const grossWeightValue = product.grossWeight !== null && product.grossWeight !== undefined ? product.grossWeight : ''; + + // 确保商品ID的一致性 + const productIdStr = String(product.productId || product.id); + + // 增强的预约人数计算逻辑 + const selectedValue = product.selected; + const reservedCountValue = product.reservedCount; + const reservationCountValue = product.reservationCount; + + const finalReservationCount = selectedValue !== undefined && selectedValue !== null ? selectedValue : + (reservedCountValue !== undefined && reservedCountValue !== null ? reservedCountValue : + (reservationCountValue || 0)); + + // 转换supplyStatus字段值 + let supplyStatusValue = product.supplyStatus || ''; + if (['平台货源', '三方认证'].includes(supplyStatusValue)) { + supplyStatusValue = '现货'; + } else if (supplyStatusValue === '三方未认证') { + supplyStatusValue = '预售'; + } + + return { + id: productIdStr, + productId: productIdStr, + name: product.productName, + price: product.price, + minOrder: product.quantity, + yolk: product.yolk, + spec: (product.spec && product.spec !== '无') ? product.spec : (product.specification && product.specification !== '无') ? product.specification : '', + specification: (product.spec && product.spec !== '无') ? product.spec : (product.specification && product.specification !== '无') ? product.specification : '', + region: product.region || '', // 【新增】添加地区字段 + grossWeight: grossWeightValue, + displayGrossWeight: formatGrossWeight(grossWeightValue, product.weight), + seller: product.seller && (product.seller.name || product.seller.nickName) ? (product.seller.name || product.seller.nickName) : '未知卖家', + status: product.status || 'published', + imageUrls: product.imageUrls || [], + createdAt: product.created_at || product.createTime || null, + reservedCount: finalReservationCount, + product_contact: product.product_contact || '', // 【新增】添加联系人字段 + contact_phone: product.contact_phone || '', // 【新增】添加联系人电话字段 + supplyStatus: supplyStatusValue, // 添加supplyStatus字段并进行转换 + sourceType: product.sourceType || '', // 新增sourceType字段 + debugInfo: { + originalSelected: selectedValue, + originalReservedCount: reservedCountValue, + originalReservationCount: reservationCountValue + }, + isReserved: reservedGoodsIds.some(id => + String(id) === productIdStr || + String(id) === String(product.id) + ), + isFavorite: false, // 初始化收藏状态为false + currentImageIndex: 0 + }; }); // 过滤掉hidden状态的商品 diff --git a/pages/buyer/index.wxml b/pages/buyer/index.wxml index 7ec3b49..8dfe355 100644 --- a/pages/buyer/index.wxml +++ b/pages/buyer/index.wxml @@ -55,9 +55,10 @@ - 金标蛋 - {{item.name}} - + {{item.supplyStatus || '暂无状态'}} + {{item.name}} + V + {{item.specification || '无'}} | {{item.yolk || '无'}} | {{item.minOrder || item.quantity || 1}}件 diff --git a/pages/favorites/index.js b/pages/favorites/index.js index 71c1e62..d80201c 100644 --- a/pages/favorites/index.js +++ b/pages/favorites/index.js @@ -160,7 +160,22 @@ Page({ console.log('获取收藏列表成功:', res); // 检查API返回是否成功 if (res && res.code === 200 && res.data) { - const favorites = res.data.favorites || []; + let favorites = res.data.favorites || []; + + // 转换supplyStatus字段值 + favorites = favorites.map(item => { + if (item.Product && item.Product.supplyStatus) { + // 将supplyStatus由"平台货源"、"三方认证"、"三方未认证"修改为"预售"、"现货" + // 平台货源和三方认证转为现货,三方未认证转为预售 + if (['平台货源', '三方认证'].includes(item.Product.supplyStatus)) { + item.Product.supplyStatus = "现货"; + } else if (item.Product.supplyStatus === '三方未认证') { + item.Product.supplyStatus = "预售"; + } + } + return item; + }); + this.setData({ favoritesList: favorites, hasFavorites: favorites.length > 0, diff --git a/pages/favorites/index.wxml b/pages/favorites/index.wxml index b3e1c7e..93a77a3 100644 --- a/pages/favorites/index.wxml +++ b/pages/favorites/index.wxml @@ -53,10 +53,11 @@ - - 金标蛋 - {{item.Product.productName || '未命名商品'}} - + + {{item.Product.supplyStatus || '暂无状态'}} + {{item.Product.productName || '未命名商品'}} + V + {{(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}}件 diff --git a/pages/goods-detail/goods-detail.js b/pages/goods-detail/goods-detail.js index e1fadf8..1db5793 100644 --- a/pages/goods-detail/goods-detail.js +++ b/pages/goods-detail/goods-detail.js @@ -1,6 +1,16 @@ // pages/goods-detail/goods-detail.js const API = require('../../utils/api.js') +// 根据sourceType获取对应的颜色 +function getSourceTypeColor(sourceType) { + const colorMap = { + '三方认证': '#4d9dff', + '三方未认证': '#ff4d4f', + '平台货源': '#2ad21f' + }; + return colorMap[sourceType] || '#4d9dff'; +} + // 格式化毛重显示的辅助函数 function formatGrossWeight(grossWeight, weight) { console.log('===== formatGrossWeight 函数调用 ====='); @@ -24,6 +34,36 @@ function formatGrossWeight(grossWeight, weight) { return ""; } +// 提取地区中的省份信息 +function extractProvince(region) { + if (!region || typeof region !== 'string') { + return region; + } + + // 查找各种省份格式的位置 + const provinceEndIndex = region.indexOf('省'); + const autonomousRegionEndIndex = region.indexOf('自治区'); + const municipalityEndIndex = region.indexOf('市'); // 用于直辖市,如北京市、上海市 + const specialRegionEndIndex = region.indexOf('特别行政区'); // 用于香港、澳门 + + if (provinceEndIndex !== -1) { + // 包含"省"字,提取到"省"字结束 + return region.substring(0, provinceEndIndex + 1); + } else if (autonomousRegionEndIndex !== -1) { + // 包含"自治区",提取到"自治区"结束 + return region.substring(0, autonomousRegionEndIndex + 3); + } else if (specialRegionEndIndex !== -1) { + // 包含"特别行政区",提取到"特别行政区"结束 + return region.substring(0, specialRegionEndIndex + 5); + } else if (municipalityEndIndex === 2) { + // 直辖市(如北京市、上海市),市字在第2个字符位置 + return region.substring(0, municipalityEndIndex + 1); + } + + // 如果没有找到匹配的格式,返回原字符串 + return region; +} + Page({ data: { goodsDetail: {}, // 当前商品详情 @@ -128,6 +168,14 @@ Page({ // 处理grossWeight为null或无效的情况,返回空字符串以支持文字输入 const grossWeightValue = product.grossWeight !== null && product.grossWeight !== undefined ? product.grossWeight : ''; + // 转换supplyStatus字段值 + let supplyStatusValue = product.supplyStatus || ''; + // 将"平台货源"、"三方认证"、"三方未认证"修改为"预售"、"现货" + if (supplyStatusValue === '平台货源' || supplyStatusValue === '三方认证') { + supplyStatusValue = '现货'; + } else if (supplyStatusValue === '三方未认证') { + supplyStatusValue = '预售'; + } // 转换商品数据格式 const formattedGoods = { id: productIdStr, @@ -137,7 +185,7 @@ Page({ minOrder: product.minOrder || product.quantity, yolk: product.yolk, spec: product.spec || product.specification, - region: product.region, + region: extractProvince(product.region), contact_phone: product.contact_phone || product.contactPhone, product_contact: product.product_contact || product.contactName, imageUrls: product.imageUrls || product.images || [], @@ -146,7 +194,10 @@ Page({ reservedCount: finalReservationCount, created_at: product.created_at || product.createdAt, updated_at: product.updated_at || product.updatedAt, - status: product.status + status: product.status, + supplyStatus: supplyStatusValue, + sourceType: product.sourceType || '', + sourceTypeColor: getSourceTypeColor(product.sourceType) }; this.setData({ diff --git a/pages/goods-detail/goods-detail.wxml b/pages/goods-detail/goods-detail.wxml index 9c3aa63..ba5bf06 100644 --- a/pages/goods-detail/goods-detail.wxml +++ b/pages/goods-detail/goods-detail.wxml @@ -30,11 +30,18 @@ - - - {{goodsDetail.name}} + + + + {{goodsDetail.supplyStatus || '暂无状态'}} + {{goodsDetail.name}} + V + + + {{goodsDetail.sourceType || '暂无'}} + - + 价格: {{goodsDetail.price}} diff --git a/pages/goods-detail/goods-detail.wxss b/pages/goods-detail/goods-detail.wxss index cdf13cf..eee8ecc 100644 --- a/pages/goods-detail/goods-detail.wxss +++ b/pages/goods-detail/goods-detail.wxss @@ -136,30 +136,60 @@ .goods-price { display: flex; - align-items: baseline; + align-items: center; margin-bottom: 4px; } .price-symbol { - font-size: 15px; + font-size: 18px; color: #666; margin-right: 4px; font-weight: 500; + display: inline-flex; + align-items: center; + justify-content: center; } .price-value { - font-size: 28px; + font-size: 24px; color: #ff4d4f; font-weight: 700; letter-spacing: -0.5px; + display: inline-flex; + align-items: center; + justify-content: center; } .price-value::before { content: '¥'; - font-size: 20px; + font-size: 24px; margin-right: 2px; } +.source-type-badge { + font-size: 24rpx; + color: #ffffff; + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(12rpx); + -webkit-backdrop-filter: blur(12rpx); + border: 1rpx solid rgba(255, 255, 255, 0.25); + padding: 4rpx 12rpx; + border-radius: 8rpx; + font-weight: bold; + box-shadow: 0 6rpx 16rpx rgba(0, 0, 0, 0.12), inset 0 1rpx 0 rgba(255, 255, 255, 0.3); + text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.2); + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + justify-content: center; + margin-top: -22rpx; +} + +.source-type-badge:active { + transform: scale(0.98); + box-shadow: 0 3rpx 8rpx rgba(0, 0, 0, 0.15), inset 0 1rpx 0 rgba(255, 255, 255, 0.3); +} + /* 商品详细信息网格 */ .info-grid { background-color: #ffffff; diff --git a/project.private.config.json b/project.private.config.json index 3c2198f..e5742ca 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -1,6 +1,6 @@ { "libVersion": "3.10.3", - "projectname": "miniprogram-x27", + "projectname": "xxx", "setting": { "urlCheck": false, "coverView": true, diff --git a/server-example/server-mysql.js b/server-example/server-mysql.js index b679e69..3a6d6e8 100644 --- a/server-example/server-mysql.js +++ b/server-example/server-mysql.js @@ -675,6 +675,17 @@ User.init({ defaultValue: Sequelize.NOW, onUpdate: Sequelize.NOW }, + // 新增字段 + sourceType: { + type: DataTypes.STRING(50), + allowNull: true, + comment: '货源类型' + }, + supplyStatus: { + type: DataTypes.STRING(50), + allowNull: true, + comment: '供应状态' + }, }, { sequelize, @@ -1709,7 +1720,9 @@ app.post('/api/product/list', async (req, res) => { ], attributes: { include: [ - 'region' // 【新增】确保返回地区字段 + 'region', // 【新增】确保返回地区字段 + 'sourceType', // 【新增】确保返回货源类型字段 + 'supplyStatus' // 【新增】确保返回供应状态字段 ] }, order: [['created_at', 'DESC']], @@ -3536,6 +3549,7 @@ app.post('/api/products/detail', async (req, res) => { // 查询商品详情 - 排除hidden状态商品,直接使用Product表中的reservedCount字段 const product = await Product.findOne({ + attributes: ['productId', 'productName', 'price', 'quantity', 'grossWeight', 'imageUrls', 'created_at', 'specification', 'yolk', 'sourceType', 'supplyStatus'], where: { productId, status: { [Sequelize.Op.not]: 'hidden' } diff --git a/utils/api.js b/utils/api.js index 466a843..5dbd0e0 100644 --- a/utils/api.js +++ b/utils/api.js @@ -3392,7 +3392,18 @@ module.exports = { // 获取产品详情 getProductDetail: function ({ productId }) { console.log('API.getProductDetail - productId:', productId); - return request('/api/products/detail', 'POST', { productId: productId }); + return request('/api/products/detail', 'POST', { productId: productId }).then(data => { + console.log('商品详情API响应:', data); + if (data && data.data) { + console.log('商品详情字段检查:'); + console.log('- 是否包含sourceType:', 'sourceType' in data.data); + console.log('- 是否包含supplyStatus:', 'supplyStatus' in data.data); + console.log('- sourceType值:', data.data.sourceType); + console.log('- supplyStatus值:', data.data.supplyStatus); + console.log('- 完整字段:', Object.keys(data.data)); + } + return data; + }); }, // 预约商品