ylj20011123 fcab7c2e8c update
2025-10-15 11:13:52 +08:00

409 lines
7.8 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="ranking-container" :class="'theme-' + themeType">
<!-- 现代化选项卡 -->
<view class="ranking-tabs">
<view class="tab-item" @tap="selectTab(1000)" :class="{ 'active': nowRank == 1000 }">
<view class="tab-icon">🏪</view>
<text class="tab-text">商超</text>
</view>
<view class="tab-item" @tap="selectTab(2000)" :class="{ 'active': nowRank == 2000 }">
<view class="tab-icon">🍽</view>
<text class="tab-text">餐饮</text>
</view>
<view class="tab-item" @tap="selectTab(3000)" :class="{ 'active': nowRank == 3000 }">
<view class="tab-icon">🍿</view>
<text class="tab-text">小吃</text>
</view>
</view>
<!-- 排行榜内容 -->
<view class="ranking-content" v-if="wechatPushSalesList && wechatPushSalesList[nowRank]">
<view class="ranking-item" v-for="(item, index) in wechatPushSalesList[nowRank]" :key="index"
:class="'rank-' + (index + 1)">
<!-- 排名徽章 -->
<view class="rank-badge" :class="'rank-' + (index + 1)">
<view v-if="index < 3" class="medal-icon">
{{ index === 0 ? '🥇' : index === 1 ? '🥈' : '🥉' }}
</view>
<text v-else class="rank-number">{{ index + 1 }}</text>
</view>
<!-- 商品信息 -->
<view class="item-content">
<view class="item-name">{{ item.COMMODITY_NAME || item.Commodity_Name }}</view>
<view class="item-stats">
<view class="stat-item">
<text class="stat-label">销售额</text>
<text class="stat-value sales-amount">¥{{ $util.fmoney(item.TOTALPRICE || item.TotalPrice)
}}</text>
</view>
<view class="stat-divider">|</view>
<view class="stat-item">
<text class="stat-label">销量</text>
<text class="stat-value sales-count">{{ item.SELLCOUNT || item.SellCount }}</text>
</view>
</view>
</view>
</view>
</view>
<!-- 空状态 -->
<view v-else class="empty-state">
<view class="empty-icon">📊</view>
<text class="empty-text">暂无排行数据</text>
</view>
</view>
</template>
<script>
export default {
props: ['wechatPushSalesList', 'provinceCode'],
data: () => {
return {
nowRank: 1000
}
},
computed: {
// 根据省份代码映射主题类型
themeType() {
const themeMap = {
'330200': 'ningbo', // 宁波
'340000': 'anhui', // 安徽
'500000': 'chongqing', // 重庆
'510000': 'sichuan', // 四川
'520000': 'guizhou', // 贵州
'530000': 'yunnan', // 云南
'630000': 'qinghai', // 青海
'734100': 'hainan' // 海南
}
return themeMap[this.provinceCode] || 'yunnan'
}
},
methods: {
selectTab(index) {
this.nowRank = index
}
},
onLoad() {
}
}
</script>
<style lang="scss" scoped>
// 主题色 mixin
@mixin theme-colors($primary, $secondary) {
.tab-item.active {
background: linear-gradient(135deg, $primary, $secondary) !important;
box-shadow: 0 4rpx 12rpx rgba($primary, 0.3) !important;
}
.tab-item:hover {
background: rgba($primary, 0.1);
}
.stat-value.sales-amount {
color: $primary;
}
.ranking-item::before {
background: linear-gradient(180deg, $primary, $secondary);
}
.ranking-item:hover::before {
opacity: 1;
}
.rank-badge:not(.rank-1):not(.rank-2):not(.rank-3) {
background: linear-gradient(135deg, $primary, $secondary);
}
}
.ranking-container {
margin: 20rpx 0;
}
/* 现代化选项卡 */
.ranking-tabs {
display: flex;
background: #f8f9fa;
border-radius: 12rpx;
padding: 6rpx;
margin: 0 20rpx 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
border: 1rpx solid #f0f0f0;
}
.tab-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 16rpx 8rpx;
border-radius: 8rpx;
transition: all 0.3s ease;
cursor: pointer;
&.active {
transform: translateY(-2rpx);
.tab-text {
color: #fff !important;
font-weight: 600;
}
.tab-icon {
transform: scale(1.1);
}
}
}
.tab-icon {
font-size: 32rpx;
margin-bottom: 8rpx;
transition: transform 0.3s ease;
}
.tab-text {
font-size: 24rpx;
color: #666;
transition: all 0.3s ease;
font-weight: 500;
}
/* 排行榜内容 */
.ranking-content {
padding: 0 20rpx;
}
.ranking-item {
display: flex;
align-items: center;
background: #fff;
border-radius: 16rpx;
padding: 20rpx 24rpx;
margin-bottom: 16rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
border: 1rpx solid #f5f5f5;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4rpx;
background: linear-gradient(180deg, #27B25F, #4CCC7F);
opacity: 0;
transition: opacity 0.3s ease;
}
&:hover {
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.1);
transform: translateY(-2rpx);
&::before {
opacity: 1;
}
}
// 前三名特殊样式
&.rank-1 {
background: linear-gradient(135deg, #fffbf0, #fff);
&::before {
background: linear-gradient(180deg, #ffb300, #ffd700);
opacity: 1;
}
}
&.rank-2 {
background: linear-gradient(135deg, #f0f0f0, #fff);
&::before {
background: linear-gradient(180deg, #c0c0c0, #e8e8e8);
opacity: 1;
}
}
&.rank-3 {
background: linear-gradient(135deg, #f5f1eb, #fff);
&::before {
background: linear-gradient(180deg, #a0714d, #cd853f);
opacity: 1;
}
}
}
/* 排名徽章 */
.rank-badge {
width: 60rpx;
height: 60rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 24rpx;
font-weight: 700;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.15);
&.rank-1,
&.rank-2,
&.rank-3 {
background: transparent;
box-shadow: none;
}
.medal-icon {
font-size: 36rpx;
animation: pulse 2s infinite;
}
.rank-number {
color: #fff;
font-size: 24rpx;
font-weight: 700;
}
}
.rank-badge:not(.rank-1):not(.rank-2):not(.rank-3) {
background: linear-gradient(135deg, #8c9eff, #a5b4fc);
}
@keyframes pulse {
0%,
100% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
}
/* 商品信息 */
.item-content {
flex: 1;
display: flex;
flex-direction: column;
}
.item-name {
font-size: 28rpx;
color: #333;
font-weight: 600;
margin-bottom: 12rpx;
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.item-stats {
display: flex;
align-items: center;
}
.stat-item {
display: flex;
align-items: center;
min-width: 0;
flex: 1;
}
.stat-label {
font-size: 24rpx;
color: #6c757d;
margin-right: 8rpx;
line-height: 40rpx;
font-weight: 500;
white-space: nowrap;
}
.stat-value {
font-size: 24rpx;
font-weight: 600;
line-height: 40rpx;
// font-family: 'DIN Alternate', 'Bahnschrift', monospace;
white-space: nowrap;
&.sales-amount {
color: #27B25F; // 默认云南主题色,会被主题色覆盖
}
&.sales-count {
color: #666;
}
}
.stat-divider {
margin: 0 16rpx;
color: #e0e0e0;
font-size: 20rpx;
}
/* 空状态 */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 80rpx 20rpx;
color: #999;
}
.empty-icon {
font-size: 80rpx;
margin-bottom: 20rpx;
opacity: 0.6;
}
.empty-text {
font-size: 28rpx;
color: #999;
}
/* 主题色应用 - 根据传入的省份代码动态应用主题 */
.ranking-container.theme-ningbo {
@include theme-colors(#1890FF, #69C0FF);
}
.ranking-container.theme-anhui {
@include theme-colors(#748ED6, #91A7E3);
}
.ranking-container.theme-chongqing {
@include theme-colors(#FA541C, #FF7A45);
}
.ranking-container.theme-sichuan {
@include theme-colors(#FA8C16, #FFA940);
}
.ranking-container.theme-guizhou {
@include theme-colors(#52C41A, #73D13D);
}
.ranking-container.theme-yunnan {
@include theme-colors(#27B25F, #4CCC7F);
}
.ranking-container.theme-qinghai {
@include theme-colors(#13C2C2, #36CFC9);
}
.ranking-container.theme-hainan {
@include theme-colors(#E91E63, #F06292);
}
</style>