From 09f6157991e7ea7b96ed6861208e03ba6a7af4e1 Mon Sep 17 00:00:00 2001 From: woody Date: Thu, 31 Jul 2025 17:59:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(sale):=20=E6=B7=BB=E5=8A=A0=E7=A7=92?= =?UTF-8?q?=E6=9D=80=E4=B8=93=E5=8C=BA=EF=BC=8C=E5=89=A9=E4=BD=99=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/request.js | 2 +- pages/index/index.vue | 17 +- pages/specialArea/details.vue | 299 +++++++++++++++++++++++++++++++++- pages/specialArea/list.vue | 283 +++++++++++++++++++++++++++++++- 4 files changed, 591 insertions(+), 10 deletions(-) diff --git a/config/request.js b/config/request.js index b963395..a5cfc05 100644 --- a/config/request.js +++ b/config/request.js @@ -19,7 +19,7 @@ module.exports = vm => { //#ifdef DEV_SERVER console.log('DEV_SERVER') - config.baseURL = 'http://localhost:8080' + config.baseURL = 'http://192.168.0.86:8080' //#endif //#ifdef QA_SERVER diff --git a/pages/index/index.vue b/pages/index/index.vue index ba20c73..5cebd48 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -39,6 +39,7 @@ :list="item.waresList" :title="item.specialAreaName" size="small" + :showSales="item.specialArea" > + + + + 库存剩余 + + + {{ getInventoryPercentage(goodDetail.inventory) }}% + + + + + + + + + @@ -75,7 +108,9 @@ >BV:{{ goodDetail.goodsAssAchive | numberToCurrency }} - 销量:{{ goodDetail.sales | seles }} + 销量:{{ goodDetail.sales | seles }} @@ -85,6 +120,39 @@ {{ goodDetail.waresName }} + + + + + + 库存剩余 + + + {{ getInventoryPercentage(goodDetail.inventory) }}% + + + + + + + + + {{ '急速下单即享优先发货' }} @@ -573,6 +641,45 @@ export default { // 作为返回值返回 return d + '天' + h + ':' + m + ':' + s }, + // 处理库存百分比,移除百分号并转换为数字 + getInventoryPercentage(inventory) { + if (typeof inventory === 'string') { + // 移除百分号并转换为数字 + const numStr = inventory.replace('%', '').trim() + const num = parseFloat(numStr) + return isNaN(num) ? 0 : Math.min(100, Math.max(0, num)) + } else if (typeof inventory === 'number') { + // 如果是数字,确保在0-100范围内 + return Math.min(100, Math.max(0, inventory)) + } + return 0 + }, + // 根据库存百分比返回对应的进度条样式类 + getProgressClass(inventory) { + const percentage = this.getInventoryPercentage(inventory) + if (percentage >= 80) { + return 'progress-high' + } else if (percentage >= 60) { + return 'progress-medium-high' + } else if (percentage >= 40) { + return 'progress-medium' + } else if (percentage >= 20) { + return 'progress-low' + } else { + return 'progress-critical' + } + }, + // 根据库存百分比返回百分比数字的样式类 + getPercentageClass(inventory) { + const percentage = this.getInventoryPercentage(inventory) + if (percentage <= 20) { + return 'percentage-critical' + } else if (percentage <= 30) { + return 'percentage-urgent' + } else { + return 'percentage-normal' + } + }, }, } @@ -970,4 +1077,194 @@ export default { justify-content: flex-end; margin-bottom: 10rpx; } + +/* 库存进度条样式 */ +.inventory-progress-container { + margin-top: 20rpx; + + .inventory-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12rpx; + + .inventory-label { + display: flex; + align-items: center; + font-size: 24rpx; + + .inventory-status { + color: #333; + } + } + + .inventory-percentage { + font-size: 24rpx; + font-weight: 700; + font-family: + DIN Alternate, + Arial, + sans-serif; + + &.percentage-critical { + color: #ff3742; + animation: percentageBlink 1s ease-in-out infinite; + text-shadow: 0 0 10rpx rgba(255, 55, 66, 0.3); + } + + &.percentage-urgent { + color: #ff5252; + animation: percentageGlow 2s ease-in-out infinite; + } + + &.percentage-normal { + color: #005bac; + } + } + } + + .inventory-progress-bar { + width: 100%; + height: 16rpx; + background: rgba(0, 0, 0, 0.08); + border-radius: 8rpx; + overflow: hidden; + position: relative; + box-shadow: inset 0 2rpx 4rpx rgba(0, 0, 0, 0.1); + + .inventory-progress-fill { + height: 100%; + border-radius: 8rpx; + transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + overflow: hidden; + + /* 进度条渐变色彩 */ + &.progress-critical { + background: linear-gradient( + 90deg, + #ff1744 0%, + #d50000 50%, + #ff1744 100% + ); + box-shadow: 0 0 20rpx rgba(255, 23, 68, 0.4); + animation: criticalPulse 1.5s ease-in-out infinite; + } + + &.progress-low { + background: linear-gradient( + 90deg, + #ff5722 0%, + #e64a19 50%, + #ff5722 100% + ); + box-shadow: 0 0 15rpx rgba(255, 87, 34, 0.3); + } + + &.progress-medium { + background: linear-gradient( + 90deg, + #ff9800 0%, + #f57c00 50%, + #ff9800 100% + ); + box-shadow: 0 0 10rpx rgba(255, 152, 0, 0.2); + } + + &.progress-medium-high { + background: linear-gradient( + 90deg, + #2196f3 0%, + #1976d2 50%, + #2196f3 100% + ); + box-shadow: 0 0 8rpx rgba(33, 150, 243, 0.2); + } + + &.progress-high { + background: linear-gradient( + 90deg, + #4caf50 0%, + #388e3c 25%, + #005bac 75%, + #003d82 100% + ); + box-shadow: 0 0 8rpx rgba(0, 91, 172, 0.2); + } + + /* 流动光效 */ + .progress-shine { + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient( + 90deg, + transparent 0%, + rgba(255, 255, 255, 0.8) 50%, + transparent 100% + ); + animation: shineFlow 2s ease-in-out infinite; + } + + /* 高光效果 */ + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 60%; + background: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.4) 0%, + rgba(255, 255, 255, 0.1) 50%, + transparent 100% + ); + border-radius: 8rpx 8rpx 0 0; + } + } + } +} + +/* 动画定义 */ +@keyframes percentageBlink { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.7; + } +} + +@keyframes percentageGlow { + 0%, + 100% { + text-shadow: 0 0 5rpx rgba(255, 82, 82, 0.3); + } + 50% { + text-shadow: 0 0 15rpx rgba(255, 82, 82, 0.6); + } +} + +@keyframes criticalPulse { + 0%, + 100% { + box-shadow: 0 0 20rpx rgba(255, 23, 68, 0.4); + } + 50% { + box-shadow: 0 0 30rpx rgba(255, 23, 68, 0.7); + } +} + +@keyframes shineFlow { + 0% { + left: -100%; + } + 100% { + left: 100%; + } +} diff --git a/pages/specialArea/list.vue b/pages/specialArea/list.vue index 392fd8b..7f572f3 100644 --- a/pages/specialArea/list.vue +++ b/pages/specialArea/list.vue @@ -103,8 +103,42 @@ {{ item.prefixLabelTarget.label }} - {{ item.waresName }} + {{ item.waresName }} + + + + + + 库存剩余 + + + {{ getInventoryPercentage(item.inventory) }}% + + + + + + + + + +