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"
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
+
-
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
+
+
+
-
-
-
-
-
-
-
- {{'直推业绩'}}
-
-
-
- {{query.startDate}}
- {{'开始日期'}}
-
-
-
+
+
+
+ {{ '直推业绩' }}
+
+
+
+ {{
+ query.startDate
+ }}
+ {{ '开始日期' }}
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 }}
+
+
+
+
+
+
+
+
+
+
+
@@ -75,7 +108,9 @@
>BV:{{ goodDetail.goodsAssAchive | numberToCurrency }}
- 销量:{{ goodDetail.sales | seles }}
+ 销量:{{ goodDetail.sales | seles }}
@@ -85,6 +120,39 @@
{{ goodDetail.waresName }}
+
+
+
+
+
+
+
+
+
+
+
{{ '急速下单即享优先发货' }}
@@ -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%;
+ }
+}