综述: 优化品牌数据分析页面功能并更新菜单导航

- 修改主菜单导航链接,将"连锁单位业绩排行榜"更新为"品牌业绩排行榜",更准确地反映页面功能定位。
- 在品牌分销全景分析页面中新增时间筛选功能模块,支持快速选择预设时间范围(今日、昨日、近7天、近30天)和自定义日期范围查询,提升数据分析的灵活性。
- 在品牌爆款商品榜页面中同样新增时间筛选功能,保持界面风格一致性,用户可根据不同时间维度查看商品销售数据。
- 删除原有的连锁单位业绩排行榜文件,替换为新的品牌业绩排行榜页面。
This commit is contained in:
linbin 2025-10-08 17:22:58 +08:00
parent 1d6e0fd9ac
commit 5b8ffac16c
4 changed files with 559 additions and 103 deletions

View File

@ -513,9 +513,9 @@
</span> </span>
</div> </div>
<div class="submenu"> <div class="submenu">
<a href="#" class="submenu-link" onclick="loadContent('./品牌管理/数据分析/连锁单位业绩排行榜.html', this);" style="padding-left: 70px;"> <a href="#" class="submenu-link" onclick="loadContent('./品牌管理/数据分析/品牌业绩排行榜.html', this);" style="padding-left: 70px;">
<span class="submenu-icon"></span> <span class="submenu-icon"></span>
连锁单位业绩排行榜 品牌业绩排行榜
</a> </a>
<a href="#" class="submenu-link" onclick="loadContent('./品牌管理/数据分析/品牌爆款商品榜.html', this);" style="padding-left: 70px;"> <a href="#" class="submenu-link" onclick="loadContent('./品牌管理/数据分析/品牌爆款商品榜.html', this);" style="padding-left: 70px;">
<span class="submenu-icon"></span> <span class="submenu-icon"></span>

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>连锁单位业绩排行榜 - 品牌数据中心</title> <title>xx品牌业绩排行榜 - 品牌数据中心</title>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
<style> <style>
* { * {
@ -228,29 +228,155 @@
background: #f8d7da; background: #f8d7da;
color: #721c24; color: #721c24;
} }
.time-filter-section {
background: white;
padding: 20px 24px;
margin-bottom: 16px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.time-filter-container {
display: flex;
align-items: center;
gap: 20px;
flex-wrap: wrap;
}
.filter-label {
font-size: 14px;
color: #666;
font-weight: 500;
white-space: nowrap;
}
.filter-buttons {
display: flex;
gap: 8px;
align-items: center;
}
.filter-btn {
padding: 8px 16px;
border: 1px solid #d9d9d9;
background: white;
color: #666;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
outline: none;
}
.filter-btn:hover {
border-color: #1890ff;
color: #1890ff;
}
.filter-btn.active {
background: #1890ff;
color: white;
border-color: #1890ff;
}
.custom-btn {
border-style: dashed;
}
.custom-date-range {
display: flex;
align-items: center;
gap: 8px;
margin-left: auto;
}
.date-input {
padding: 8px 12px;
border: 1px solid #d9d9d9;
border-radius: 6px;
font-size: 14px;
outline: none;
}
.date-input:focus {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.date-separator {
color: #999;
font-size: 14px;
}
.query-btn {
padding: 8px 16px;
background: #1890ff;
color: white;
border: none;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
outline: none;
}
.query-btn:hover {
background: #40a9ff;
}
@media (max-width: 768px) {
.time-filter-container {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.custom-date-range {
margin-left: 0;
width: 100%;
}
}
</style> </style>
</head> </head>
<body> <body>
<div class="container"> <div class="container">
<div class="page-header"> <div class="page-header">
<h1 class="page-title">📊 连锁单位业绩排行榜</h1> <h1 class="page-title">📊 xx品牌业绩排行榜</h1>
<p class="page-subtitle">多维度对比连锁市场/店铺经营表现 · 数据更新时间2024-01-15 10:30</p> </div>
<div class="time-filter-section">
<div class="time-filter-container">
<div class="filter-label">时间范围:</div>
<div class="filter-buttons">
<button class="filter-btn active" data-range="1">近1天</button>
<button class="filter-btn" data-range="7">近7天</button>
<button class="filter-btn" data-range="30">近30天</button>
<button class="filter-btn custom-btn" data-range="custom">自定义</button>
</div>
<div class="custom-date-range" style="display: none;">
<input type="date" class="date-input" id="startDate">
<span class="date-separator"></span>
<input type="date" class="date-input" id="endDate">
<button class="query-btn" id="customQuery">查询</button>
</div>
</div>
</div> </div>
<div class="stats-section"> <div class="stats-section">
<div class="stats-grid"> <div class="stats-grid">
<div class="stat-item"> <div class="stat-item">
<h3>连锁单位总数</h3> <h3>品牌单位总数</h3>
<div class="value">28</div> <div class="value">28</div>
<div class="label">家连锁市场/店铺</div> <div class="label">家连锁市场/店铺</div>
</div> </div>
<div class="stat-item"> <div class="stat-item">
<h3>本月总销售额</h3> <h3>总销售额</h3>
<div class="value">¥856万</div> <div class="value">¥856万</div>
<div class="label">环比上月 +23.5%</div> <div class="label">环比上月 +23.5%</div>
</div> </div>
<div class="stat-item"> <div class="stat-item">
<h3>本月总订单量</h3> <h3>总订单量</h3>
<div class="value">12,847</div> <div class="value">12,847</div>
<div class="label">环比上月 +18.2%</div> <div class="label">环比上月 +18.2%</div>
</div> </div>
@ -274,7 +400,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥128.5万</span> <span class="ranking-value">¥128.5万</span>
<span class="trend-badge trend-up">↑ 32%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -285,7 +410,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥115.2万</span> <span class="ranking-value">¥115.2万</span>
<span class="trend-badge trend-up">↑ 28%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -296,7 +420,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥98.7万</span> <span class="ranking-value">¥98.7万</span>
<span class="trend-badge trend-up">↑ 15%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -307,7 +430,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥87.3万</span> <span class="ranking-value">¥87.3万</span>
<span class="trend-badge trend-up">↑ 22%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -318,7 +440,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥76.8万</span> <span class="ranking-value">¥76.8万</span>
<span class="trend-badge trend-up">↑ 18%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -329,7 +450,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥65.4万</span> <span class="ranking-value">¥65.4万</span>
<span class="trend-badge trend-up">↑ 12%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -340,7 +460,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥58.9万</span> <span class="ranking-value">¥58.9万</span>
<span class="trend-badge trend-up">↑ 25%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -351,7 +470,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥52.3万</span> <span class="ranking-value">¥52.3万</span>
<span class="trend-badge trend-down">↓ 5%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -362,7 +480,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥48.6万</span> <span class="ranking-value">¥48.6万</span>
<span class="trend-badge trend-up">↑ 8%</span>
</div> </div>
</li> </li>
<li class="ranking-item"> <li class="ranking-item">
@ -373,7 +490,6 @@
</div> </div>
<div> <div>
<span class="ranking-value">¥42.1万</span> <span class="ranking-value">¥42.1万</span>
<span class="trend-badge trend-up">↑ 10%</span>
</div> </div>
</li> </li>
</ul> </ul>
@ -390,15 +506,67 @@
<h2>👥 客户量TOP10排行榜</h2> <h2>👥 客户量TOP10排行榜</h2>
<div class="chart-container" id="customerChart"></div> <div class="chart-container" id="customerChart"></div>
</div> </div>
<div class="chart-card">
<h2>📈 增长率TOP10排行榜</h2>
<div class="chart-container" id="growthChart"></div>
</div>
</div> </div>
</div> </div>
<script> <script>
// 时间筛选功能
const filterButtons = document.querySelectorAll('.filter-btn');
const customDateRange = document.querySelector('.custom-date-range');
const customQueryBtn = document.getElementById('customQuery');
// 切换按钮状态
filterButtons.forEach(btn => {
btn.addEventListener('click', function() {
// 移除所有按钮的active状态
filterButtons.forEach(b => b.classList.remove('active'));
// 给当前按钮添加active状态
this.classList.add('active');
const range = this.getAttribute('data-range');
if (range === 'custom') {
customDateRange.style.display = 'flex';
} else {
customDateRange.style.display = 'none';
// 这里可以根据选择的日期范围加载数据
loadDataByRange(range);
}
});
});
// 自定义日期查询
customQueryBtn.addEventListener('click', function() {
const startDate = document.getElementById('startDate').value;
const endDate = document.getElementById('endDate').value;
if (!startDate || !endDate) {
alert('请选择开始和结束日期');
return;
}
if (new Date(startDate) > new Date(endDate)) {
alert('开始日期不能晚于结束日期');
return;
}
// 这里可以根据自定义日期范围加载数据
loadCustomData(startDate, endDate);
});
// 根据预设范围加载数据
function loadDataByRange(range) {
console.log('加载近' + range + '天数据');
// 这里可以添加数据加载逻辑
// 例如:更新统计数据、图表数据等
}
// 加载自定义日期范围数据
function loadCustomData(startDate, endDate) {
console.log('加载自定义日期数据:', startDate, '至', endDate);
// 这里可以添加数据加载逻辑
}
// 订单量排行榜 // 订单量排行榜
const orderChart = echarts.init(document.getElementById('orderChart')); const orderChart = echarts.init(document.getElementById('orderChart'));
const orderOption = { const orderOption = {
@ -487,63 +655,10 @@
}; };
customerChart.setOption(customerOption); customerChart.setOption(customerOption);
// 增长率排行榜
const growthChart = echarts.init(document.getElementById('growthChart'));
const growthOption = {
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' }
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
name: '环比增长率',
axisLabel: {
formatter: '{value}%'
}
},
yAxis: {
type: 'category',
data: ['石景山(万达)', '西城(金融街)', '大兴(亦庄)', '顺义(空港)', '丰台(科技园)',
'东城(国贸)', '通州(副中心)', '海淀(中关村)', '朝阳(望京)', '昌平(天通苑)'],
axisLabel: {
fontSize: 12
}
},
series: [{
name: '增长率',
type: 'bar',
data: [12, 15, 18, 22, 25, 28, 32, 35, 38, 45],
itemStyle: {
color: function(params) {
const colors = [
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: '#4facfe' },
{ offset: 1, color: '#00f2fe' }
])
];
return colors[0];
}
},
label: {
show: true,
position: 'right',
formatter: '{c}%'
}
}]
};
growthChart.setOption(growthOption);
// 响应式 // 响应式
window.addEventListener('resize', function() { window.addEventListener('resize', function() {
orderChart.resize(); orderChart.resize();
customerChart.resize(); customerChart.resize();
growthChart.resize();
}); });
</script> </script>
</body> </body>

View File

@ -47,6 +47,115 @@
font-size: 14px; font-size: 14px;
color: #666; color: #666;
} }
.time-filter-section {
background: white;
padding: 20px 24px;
margin-bottom: 16px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.time-filter-container {
display: flex;
align-items: center;
gap: 20px;
flex-wrap: wrap;
}
.filter-label {
font-size: 14px;
color: #666;
font-weight: 500;
white-space: nowrap;
}
.filter-buttons {
display: flex;
gap: 8px;
align-items: center;
}
.filter-btn {
padding: 8px 16px;
border: 1px solid #d9d9d9;
background: white;
color: #666;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
outline: none;
}
.filter-btn:hover {
border-color: #1890ff;
color: #1890ff;
}
.filter-btn.active {
background: #1890ff;
color: white;
border-color: #1890ff;
}
.custom-btn {
border-style: dashed;
}
.custom-date-range {
display: flex;
align-items: center;
gap: 8px;
margin-left: auto;
}
.date-input {
padding: 8px 12px;
border: 1px solid #d9d9d9;
border-radius: 6px;
font-size: 14px;
outline: none;
}
.date-input:focus {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.date-separator {
color: #999;
font-size: 14px;
}
.query-btn {
padding: 8px 16px;
background: #1890ff;
color: white;
border: none;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
outline: none;
}
.query-btn:hover {
background: #40a9ff;
}
@media (max-width: 768px) {
.time-filter-container {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.custom-date-range {
margin-left: 0;
width: 100%;
}
}
.section-title { .section-title {
color: #262626; color: #262626;
@ -323,7 +432,25 @@
<div class="container"> <div class="container">
<div class="page-header"> <div class="page-header">
<h1 class="page-title">🎯 品牌分销全景分析</h1> <h1 class="page-title">🎯 品牌分销全景分析</h1>
<p class="page-subtitle">全方位监控分销推广效果与分销商效能 · 数据更新时间2024-01-15 10:30</p> <p class="page-subtitle">全方位监控分销推广效果与分销商效能</p>
</div>
<div class="time-filter-section">
<div class="time-filter-container">
<div class="filter-label">时间范围:</div>
<div class="filter-buttons">
<button class="filter-btn active" data-range="1">近1天</button>
<button class="filter-btn" data-range="7">近7天</button>
<button class="filter-btn" data-range="30">近30天</button>
<button class="filter-btn custom-btn" data-range="custom">自定义</button>
</div>
<div class="custom-date-range" style="display: none;">
<input type="date" class="date-input" id="startDate">
<span class="date-separator"></span>
<input type="date" class="date-input" id="endDate">
<button class="query-btn" id="customQuery">查询</button>
</div>
</div>
</div> </div>
<h2 class="section-title">📊 分销商团队数据</h2> <h2 class="section-title">📊 分销商团队数据</h2>
@ -359,13 +486,7 @@
<div class="icon">🔥</div> <div class="icon">🔥</div>
<h3>活跃分销商</h3> <h3>活跃分销商</h3>
<div class="value">892</div> <div class="value">892</div>
<div class="sub-value">活跃率 71.5% <span class="trend up">+5.2%</span></div> <div class="sub-value">活跃率 71.5%</div>
</div>
<div class="stat-item">
<div class="icon">📈</div>
<h3>本月流失分销商</h3>
<div class="value">23</div>
<div class="sub-value">流失率 1.8% <span class="trend down">-0.3%</span></div>
</div> </div>
</div> </div>
</div> </div>
@ -614,6 +735,63 @@
</div> </div>
<script> <script>
// 时间筛选功能
const filterButtons = document.querySelectorAll('.filter-btn');
const customDateRange = document.querySelector('.custom-date-range');
const customQueryBtn = document.getElementById('customQuery');
// 切换按钮状态
filterButtons.forEach(btn => {
btn.addEventListener('click', function() {
// 移除所有按钮的active状态
filterButtons.forEach(b => b.classList.remove('active'));
// 给当前按钮添加active状态
this.classList.add('active');
const range = this.getAttribute('data-range');
if (range === 'custom') {
customDateRange.style.display = 'flex';
} else {
customDateRange.style.display = 'none';
// 这里可以根据选择的日期范围加载数据
loadDataByRange(range);
}
});
});
// 自定义日期查询
customQueryBtn.addEventListener('click', function() {
const startDate = document.getElementById('startDate').value;
const endDate = document.getElementById('endDate').value;
if (!startDate || !endDate) {
alert('请选择开始和结束日期');
return;
}
if (new Date(startDate) > new Date(endDate)) {
alert('开始日期不能晚于结束日期');
return;
}
// 这里可以根据自定义日期范围加载数据
loadCustomData(startDate, endDate);
});
// 根据预设范围加载数据
function loadDataByRange(range) {
console.log('加载近' + range + '天数据');
// 这里可以添加数据加载逻辑
// 例如:更新统计数据、图表数据等
}
// 加载自定义日期范围数据
function loadCustomData(startDate, endDate) {
console.log('加载自定义日期数据:', startDate, '至', endDate);
// 这里可以添加数据加载逻辑
}
// 分销商等级分布饼图 // 分销商等级分布饼图
const levelChart = echarts.init(document.getElementById('levelChart')); const levelChart = echarts.init(document.getElementById('levelChart'));
const levelOption = { const levelOption = {
@ -664,7 +842,7 @@
trigger: 'axis' trigger: 'axis'
}, },
legend: { legend: {
data: ['新增分销商', '流失分销商'], data: ['新增分销商'],
top: 10 top: 10
}, },
grid: { grid: {
@ -695,19 +873,6 @@
{ offset: 1, color: 'rgba(92, 184, 92, 0.05)' } { offset: 1, color: 'rgba(92, 184, 92, 0.05)' }
]) ])
} }
},
{
name: '流失分销商',
type: 'line',
smooth: true,
data: [15, 18, 22, 19, 25, 23],
itemStyle: { color: '#d9534f' },
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: 'rgba(217, 83, 79, 0.3)' },
{ offset: 1, color: 'rgba(217, 83, 79, 0.05)' }
])
}
} }
] ]
}; };

View File

@ -48,6 +48,115 @@
color: #666; color: #666;
} }
.time-filter-section {
background: white;
padding: 20px 24px;
margin-bottom: 16px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.time-filter-container {
display: flex;
align-items: center;
gap: 20px;
flex-wrap: wrap;
}
.filter-label {
font-size: 14px;
color: #666;
font-weight: 500;
white-space: nowrap;
}
.filter-buttons {
display: flex;
gap: 8px;
align-items: center;
}
.filter-btn {
padding: 8px 16px;
border: 1px solid #d9d9d9;
background: white;
color: #666;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
outline: none;
}
.filter-btn:hover {
border-color: #1890ff;
color: #1890ff;
}
.filter-btn.active {
background: #1890ff;
color: white;
border-color: #1890ff;
}
.custom-btn {
border-style: dashed;
}
.custom-date-range {
display: flex;
align-items: center;
gap: 8px;
margin-left: auto;
}
.date-input {
padding: 8px 12px;
border: 1px solid #d9d9d9;
border-radius: 6px;
font-size: 14px;
outline: none;
}
.date-input:focus {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.date-separator {
color: #999;
font-size: 14px;
}
.query-btn {
padding: 8px 16px;
background: #1890ff;
color: white;
border: none;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
outline: none;
}
.query-btn:hover {
background: #40a9ff;
}
@media (max-width: 768px) {
.time-filter-container {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.custom-date-range {
margin-left: 0;
width: 100%;
}
}
.stats-section { .stats-section {
background: white; background: white;
padding: 24px; padding: 24px;
@ -319,7 +428,25 @@
<div class="container"> <div class="container">
<div class="page-header"> <div class="page-header">
<h1 class="page-title">🔥 品牌爆款商品榜</h1> <h1 class="page-title">🔥 品牌爆款商品榜</h1>
<p class="page-subtitle">跨所有连锁单位的商品表现排行 · 数据更新时间2024-01-15 10:30</p> <p class="page-subtitle">跨所有连锁单位的商品表现排行</p>
</div>
<div class="time-filter-section">
<div class="time-filter-container">
<div class="filter-label">时间范围:</div>
<div class="filter-buttons">
<button class="filter-btn active" data-range="1">近1天</button>
<button class="filter-btn" data-range="7">近7天</button>
<button class="filter-btn" data-range="30">近30天</button>
<button class="filter-btn custom-btn" data-range="custom">自定义</button>
</div>
<div class="custom-date-range" style="display: none;">
<input type="date" class="date-input" id="startDate">
<span class="date-separator"></span>
<input type="date" class="date-input" id="endDate">
<button class="query-btn" id="customQuery">查询</button>
</div>
</div>
</div> </div>
<div class="stats-section"> <div class="stats-section">
@ -765,13 +892,62 @@
ratingChart.resize(); ratingChart.resize();
}); });
// 筛选标签交互 // 时间筛选功能
document.querySelectorAll('.filter-tag').forEach(tag => { const filterButtons = document.querySelectorAll('.filter-btn');
tag.addEventListener('click', function() { const customDateRange = document.querySelector('.custom-date-range');
document.querySelectorAll('.filter-tag').forEach(t => t.classList.remove('active')); const customQueryBtn = document.getElementById('customQuery');
// 切换按钮状态
filterButtons.forEach(btn => {
btn.addEventListener('click', function() {
// 移除所有按钮的active状态
filterButtons.forEach(b => b.classList.remove('active'));
// 给当前按钮添加active状态
this.classList.add('active'); this.classList.add('active');
const range = this.getAttribute('data-range');
if (range === 'custom') {
customDateRange.style.display = 'flex';
} else {
customDateRange.style.display = 'none';
// 这里可以根据选择的日期范围加载数据
loadDataByRange(range);
}
}); });
}); });
// 自定义日期查询
customQueryBtn.addEventListener('click', function() {
const startDate = document.getElementById('startDate').value;
const endDate = document.getElementById('endDate').value;
if (!startDate || !endDate) {
alert('请选择开始和结束日期');
return;
}
if (new Date(startDate) > new Date(endDate)) {
alert('开始日期不能晚于结束日期');
return;
}
// 这里可以根据自定义日期范围加载数据
loadCustomData(startDate, endDate);
});
// 根据预设范围加载数据
function loadDataByRange(range) {
console.log('加载近' + range + '天数据');
// 这里可以添加数据加载逻辑
// 例如:更新统计数据、图表数据等
}
// 加载自定义日期范围数据
function loadCustomData(startDate, endDate) {
console.log('加载自定义日期数据:', startDate, '至', endDate);
// 这里可以添加数据加载逻辑
}
</script> </script>
</body> </body>
</html> </html>