diff --git a/components/distribution/realPerformance.vue b/components/distribution/realPerformance.vue deleted file mode 100644 index 8c50a94..0000000 --- a/components/distribution/realPerformance.vue +++ /dev/null @@ -1,176 +0,0 @@ - - - - - \ No newline at end of file diff --git a/config/distribute.js b/config/distribute.js index 4c757b3..982c0e8 100644 --- a/config/distribute.js +++ b/config/distribute.js @@ -1,50 +1,57 @@ - const http = uni.$u.http //安置图 -export const getPlaceMent = (params) => http.get('/member/api/achieve/query-place-tree', {params}) - +export const getPlaceMent = params => + http.get('/member/api/achieve/query-place-tree', { params }) //安置图详情 -export const getTreeDetail = (data) => http.post('/member/api/achieve/query-place-tree-detail', data) +export const getTreeDetail = data => + http.post('/member/api/achieve/query-place-tree-detail', data) //安置图上方等级 -export const getAvatarInfo = (params) => http.get('/member/api/member-structure/get-avatar-info', {params}) +export const getAvatarInfo = params => + http.get('/member/api/member-structure/get-avatar-info', { params }) //安置图 -export const getDayType = (params) => http.get('/system/pub/enums/get-day-type', {params}) +export const getDayType = params => + http.get('/system/pub/enums/get-day-type', { params }) //获取安置业绩分布 -export const azAchievement = (params) => http.get('/report/api/achieve/az-achievement', {params}) +export const azAchievement = params => + http.get('/report/api/achieve/az-achievement', { params }) //获取安置业绩分布 -export const getPerformance = (params) => http.get('/member/api/achieve/query-real-performance', {params}) - -//获取真实业绩分布 -export const realPerformancePic = (params) => http.get('/member/api/achieve/query-real-performance-pic', {params}) - +export const getPerformance = params => + http.get('/member/api/achieve/query-real-performance', { params }) //获取推荐列表 -export const parentList = (params) => http.get('/member/api/member/parent-list', {params}) +export const parentList = params => + http.get('/member/api/member/parent-list', { params }) //获取平均时长 -export const getMemberRecommend = (params) => http.get('/member/api/census/get-member-recommend-time', {params}) +export const getMemberRecommend = params => + http.get('/member/api/census/get-member-recommend-time', { params }) //获取直推业绩左侧 -export const parentAchieveLeft = (data) => http.post('/member/api/achieve/parent-achieve-left', data) +export const parentAchieveLeft = data => + http.post('/member/api/achieve/parent-achieve-left', data) //获取直推业绩右侧 -export const parentAchieveRight = (data) => http.post('/member/api/achieve/parent-achieve-right',data) +export const parentAchieveRight = data => + http.post('/member/api/achieve/parent-achieve-right', data) //获取等级 -export const systemGrandeRange = (params) => http.get('/system/manage/grade/gradeRanglist', {params}) +export const systemGrandeRange = params => + http.get('/system/manage/grade/gradeRanglist', { params }) //新增业绩统计 -export const getPlaceNewAddAchieve = (params) => http.get('/member/api/achieve/place-new-add-achieve-stat', {params}) +export const getPlaceNewAddAchieve = params => + http.get('/member/api/achieve/place-new-add-achieve-stat', { params }) //获取业绩类型 -export const getYjList = (params) => http.get('/system/pub/enums/achievement-type-member', {params}) +export const getYjList = params => + http.get('/system/pub/enums/achievement-type-member', { params }) //月度业绩左右区业绩详情 -export const getAchieveDetails = (params) => http.get('/member/api/achieve/place-new-add-achieve-details', {params}) - +export const getAchieveDetails = params => + http.get('/member/api/achieve/place-new-add-achieve-details', { params }) 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" > - - - + + + - - diff --git a/pages/specialArea/details.vue b/pages/specialArea/details.vue index fbb39eb..6a496f4 100644 --- a/pages/specialArea/details.vue +++ b/pages/specialArea/details.vue @@ -45,6 +45,39 @@ {{ goodDetail.waresName }} + + + + + + 库存剩余 + + + {{ 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/index.vue b/pages/specialArea/index.vue index a6bd015..d2227d2 100644 --- a/pages/specialArea/index.vue +++ b/pages/specialArea/index.vue @@ -91,7 +91,13 @@ export default { }, ], }, - + { + label: '秒杀专区', + value: 14, + name: 'live', + isShow: true, + children: [], + }, { label: '复购专区', value: 3, @@ -123,7 +129,7 @@ export default { isShow: true, }, { - label: '直播专区', + label: '秒杀专区', value: 14, name: 'live', isShow: true, diff --git a/pages/specialArea/list.vue b/pages/specialArea/list.vue index 392fd8b..8ba0a0b 100644 --- a/pages/specialArea/list.vue +++ b/pages/specialArea/list.vue @@ -78,95 +78,133 @@ class="goodList_i" @tap="goDetails(item)" > - - - - - - - {{ item.warnMessage }} - - - - - - {{ - item.prefixLabelTarget.label - }} - {{ item.waresName }} - + - 业绩:{{ item.waresAchieve | numberToCurrency }} - - - 积分可抵扣:{{ item.deductMoney | numberToCurrency }} - - - 业绩:{{ item.waresAchieve | numberToCurrency }} - - - BV:{{ item.assAchieve | numberToCurrency }} - - - - - {{ item.vipPrice | numberToCurrency }} + class="fly" + v-show="item.preSaleStatus == 3 || item.isSale == 1" + > + + + + + + {{ item.warnMessage }} + + + + + + + + {{ item.prefixLabelTarget.label }} + {{ item.waresName }} + + + + + + + + + + + + 剩余{{ getInventoryPercentage(item.inventory) }}% + + + + + + + 业绩:{{ item.waresAchieve | numberToCurrency }} + + + 积分可抵扣:{{ item.deductMoney | numberToCurrency }} + + + 业绩:{{ item.waresAchieve | numberToCurrency }} + + + BV:{{ item.assAchieve | numberToCurrency }} + + + {{ item.vipPrice | numberToCurrency }} + + + {{ item.waresPrice | numberToCurrency }} + + + + + + - - {{ item.waresPrice | numberToCurrency }} - - - - - @@ -490,6 +528,45 @@ export default { }) } }, + // 处理库存百分比,移除百分号并转换为数字 + 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' + } + }, }, } @@ -516,6 +593,8 @@ export default { } .tabList_a { + /* 二级分类标签容器样式 */ + margin-bottom: 10rpx; } .index_btm { @@ -655,22 +734,21 @@ export default { overflow-y: auto; .goodList_i { - display: flex; + // display: flex; border-bottom: 1px solid #eee; - padding: 30rpx 0; + padding: 20rpx 0 10rpx; position: relative; .goodList_ir { - margin-left: 24rpx; flex: 1; display: flex; flex-direction: column; justify-content: space-between; - font-size: 28rpx; + font-size: 30rpx; font-family: Microsoft YaHei; font-weight: 400; color: #333333; - + margin-left: 24rpx; .goodList_ib { display: flex; align-items: center; @@ -802,4 +880,215 @@ export default { left: -4rpx; font-size: 20rpx; } + +/* 库存进度条样式 - 升级版 */ +.inventory-progress-container { + // margin-bottom: 10rpx; + display: flex; + align-items: center; + width: 100%; + .inventory-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-right: 10rpx; + // margin-bottom: 12rpx; + + .inventory-label { + display: flex; + align-items: center; + font-size: 24rpx; + + .fire-icon, + .warning-icon { + font-size: 28rpx; + margin-right: 8rpx; + animation: iconBounce 1.5s ease-in-out infinite; + } + + .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: 0; + flex: 1; + height: 18rpx; + margin-right: 10rpx; + background: rgba(0, 0, 0, 0.08); + border-radius: 12rpx; + 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 iconBounce { + 0%, + 100% { + transform: scale(1); + } + 50% { + transform: scale(1.2); + } +} + +@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%; + } +}