新框架page1事件热度布局完成
Signed-off-by: changyunju <2743319061@qq.com>
This commit is contained in:
		
							parent
							
								
									60031902a2
								
							
						
					
					
						commit
						9a61a4e33f
					
				
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 54 KiB  | 
| 
						 | 
					@ -1,20 +1,202 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="event-hot">
 | 
					    <div class="panel-container event-hot">
 | 
				
			||||||
        <img src="../../assets/images/evenhot.png" alt="" style="margin-top: -6px;">
 | 
					        <!-- 1. 标题行 -->
 | 
				
			||||||
 | 
					        <div class="header-title">
 | 
				
			||||||
 | 
					            <img src="../../assets/images/evenhot.png" alt="" style="margin-top: -6px;">
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <!-- 2. 控件行 -->
 | 
				
			||||||
 | 
					        <div class="header-controls">
 | 
				
			||||||
 | 
					            <div class="chart-tabs">
 | 
				
			||||||
 | 
					                <button :class="{ active: activeChartTab === 'trend' }" @click="activeChartTab = 'trend'">时序热度图</button>
 | 
				
			||||||
 | 
					                <button :class="{ active: activeChartTab === 'cumulative' }" @click="activeChartTab = 'cumulative'">累计热度图</button>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <button class="details-btn" @click="showDetails">查看详情</button>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <!-- 3. ECharts 容器 -->
 | 
				
			||||||
 | 
					        <div ref="hotspotChart" class="chart-container"></div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
// 目前没有逻辑
 | 
					import { ref, watch, onMounted, onUnmounted } from 'vue';
 | 
				
			||||||
 | 
					import * as echarts from 'echarts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emit = defineEmits(['showDetails']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ===================================================================
 | 
				
			||||||
 | 
					// 数据定义与处理
 | 
				
			||||||
 | 
					// ===================================================================
 | 
				
			||||||
 | 
					const activeChartTab = ref('trend');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// --- 完整/详情用数据 (Granular/Details Data) ---
 | 
				
			||||||
 | 
					const granularTrendData = [8959, 7460, 8334, 7902, 5753, 3070, 3481, 16878, 17819, 15296, 18883, 3734, 938, 101, 12];
 | 
				
			||||||
 | 
					const granularXAxisLabels = ['7.31 00h', '7.31 06h', '7.31 12h', '7.31 18h', '8.1 00h', '8.1 06h', '8.1 12h', '8.1 18h', '8.2 00h', '8.2 06h', '8.2 12h', '8.2 18h', '8.3 00h', '8.3 06h', '8.3 12h'];
 | 
				
			||||||
 | 
					const granularCumulativeData = granularTrendData.reduce((acc, val) => { acc.push((acc.length > 0 ? acc[acc.length - 1] : 0) + val); return acc; }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// --- 面板用数据 (Panel Data - Daily Summary) ---
 | 
				
			||||||
 | 
					const panelTrendData = [32655, 29182, 55732, 1051]; // Figma中的数据
 | 
				
			||||||
 | 
					const panelXAxisLabels = ['2022.7.31', '2022.8.1', '2022.8.2', '2022.8.3'];
 | 
				
			||||||
 | 
					const panelCumulativeData = panelTrendData.reduce((acc, val) => { acc.push((acc.length > 0 ? acc[acc.length - 1] : 0) + val); return acc; }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// --- 整合数据集 ---
 | 
				
			||||||
 | 
					const chartDataSets = {
 | 
				
			||||||
 | 
					    panel: {
 | 
				
			||||||
 | 
					        trend: { data: panelTrendData, xAxis: panelXAxisLabels, yAxisMax: 60000 },
 | 
				
			||||||
 | 
					        cumulative: { data: panelCumulativeData, xAxis: panelXAxisLabels, yAxisMax: 120000 }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    details: {
 | 
				
			||||||
 | 
					        trend: { data: granularTrendData, xAxis: granularXAxisLabels, yAxisMax: 20000 },
 | 
				
			||||||
 | 
					        cumulative: { data: granularCumulativeData, xAxis: granularXAxisLabels, yAxisMax: 120000 }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ===================================================================
 | 
				
			||||||
 | 
					// ECharts 逻辑
 | 
				
			||||||
 | 
					// ===================================================================
 | 
				
			||||||
 | 
					const hotspotChart = ref(null);
 | 
				
			||||||
 | 
					let myChart = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getChartOptions = (xAxisData, seriesData, yMax, rotate = 0) => ({
 | 
				
			||||||
 | 
					    tooltip: { trigger: 'axis', backgroundColor: 'rgba(0,21,41,0.8)', borderColor: '#3a95ff', textStyle: { color: '#cbeaff' } },
 | 
				
			||||||
 | 
					    grid: { left: '3%', right: '8%', bottom: '5%', top: '20%', containLabel: true },
 | 
				
			||||||
 | 
					    xAxis: {
 | 
				
			||||||
 | 
					        type: 'category',
 | 
				
			||||||
 | 
					        boundaryGap: false,
 | 
				
			||||||
 | 
					        data: xAxisData,
 | 
				
			||||||
 | 
					        axisLine: { lineStyle: { color: 'rgba(62, 115, 171, 0.5)' } },
 | 
				
			||||||
 | 
					        axisLabel: { color: '#a7c5d4', fontSize: 12, rotate: rotate },
 | 
				
			||||||
 | 
					        axisTick: { show: false }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    yAxis: {
 | 
				
			||||||
 | 
					        type: 'value',
 | 
				
			||||||
 | 
					        max: yMax,
 | 
				
			||||||
 | 
					        axisLabel: { color: '#a7c5d4', fontSize: 12 },
 | 
				
			||||||
 | 
					        splitLine: { show: true, lineStyle: { color: 'rgba(62, 115, 171, 0.2)', type: 'dashed' } }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    series: [{
 | 
				
			||||||
 | 
					        name: '热度',
 | 
				
			||||||
 | 
					        type: 'line',
 | 
				
			||||||
 | 
					        smooth: true,
 | 
				
			||||||
 | 
					        symbol: 'circle',
 | 
				
			||||||
 | 
					        symbolSize: 8,
 | 
				
			||||||
 | 
					        data: seriesData,
 | 
				
			||||||
 | 
					        label: { show: true, position: 'top', color: '#cdeeff', fontSize: 12 },
 | 
				
			||||||
 | 
					        itemStyle: { color: '#00baff', borderColor: '#041421', borderWidth: 2 },
 | 
				
			||||||
 | 
					        lineStyle: { color: '#00baff', width: 2 },
 | 
				
			||||||
 | 
					        areaStyle: {
 | 
				
			||||||
 | 
					            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
 | 
				
			||||||
 | 
					                { offset: 0, color: 'rgba(0, 186, 255, 0.4)' },
 | 
				
			||||||
 | 
					                { offset: 1, color: 'rgba(0, 186, 255, 0)' }
 | 
				
			||||||
 | 
					            ])
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }]
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 监听标签页切换,更新面板小图
 | 
				
			||||||
 | 
					watch(activeChartTab, (newTab) => {
 | 
				
			||||||
 | 
					    if (myChart) {
 | 
				
			||||||
 | 
					        const dataSet = chartDataSets.panel[newTab];
 | 
				
			||||||
 | 
					        myChart.setOption({
 | 
				
			||||||
 | 
					            xAxis: [{ data: dataSet.xAxis }],
 | 
				
			||||||
 | 
					            yAxis: { max: dataSet.yAxisMax },
 | 
				
			||||||
 | 
					            series: [{ data: dataSet.data }]
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 点击“查看详情”时,触发事件并传递完整数据
 | 
				
			||||||
 | 
					const showDetails = () => {
 | 
				
			||||||
 | 
					    const dataSet = chartDataSets.details[activeChartTab.value];
 | 
				
			||||||
 | 
					    const rotate = dataSet.xAxis.length > 5 ? 15 : 0;
 | 
				
			||||||
 | 
					    const option = getChartOptions(dataSet.xAxis, dataSet.data, dataSet.yAxisMax, rotate);
 | 
				
			||||||
 | 
					    emit('showDetails', { option });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					onMounted(() => {
 | 
				
			||||||
 | 
					    if (hotspotChart.value) {
 | 
				
			||||||
 | 
					        myChart = echarts.init(hotspotChart.value);
 | 
				
			||||||
 | 
					        // 初始化时使用面板数据
 | 
				
			||||||
 | 
					        const initialDataSet = chartDataSets.panel[activeChartTab.value];
 | 
				
			||||||
 | 
					        myChart.setOption(getChartOptions(initialDataSet.xAxis, initialDataSet.data, initialDataSet.yAxisMax));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					onUnmounted(() => {
 | 
				
			||||||
 | 
					    if (myChart) myChart.dispose();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped>
 | 
					<style scoped>
 | 
				
			||||||
.event-hot {
 | 
					/* 容器样式,无边框 */
 | 
				
			||||||
	width: 352px;
 | 
					.panel-container {
 | 
				
			||||||
	height: 296px;
 | 
					    width: 352px;
 | 
				
			||||||
	background-color: #04142166;
 | 
					    height: 276px;
 | 
				
			||||||
	border-radius: 2px;
 | 
					    background: rgba(4, 20, 33, 0.4);
 | 
				
			||||||
	box-shadow: 0px 0px 18px 0px #0A2E55 inset;
 | 
					    border-radius: 2px;
 | 
				
			||||||
	backdrop-filter: blur(4px);
 | 
					    box-shadow: 0 0 18px 0 #0A2E55 inset;
 | 
				
			||||||
 | 
					    backdrop-filter: blur(4px);
 | 
				
			||||||
 | 
					    -webkit-backdrop-filter: blur(4px);
 | 
				
			||||||
 | 
					    padding: 15px 20px;
 | 
				
			||||||
 | 
					    box-sizing: border-box;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 标题行 */
 | 
				
			||||||
 | 
					.header-title {
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    margin-bottom: 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.header-title img {
 | 
				
			||||||
 | 
					    height: 24px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 控件行 */
 | 
				
			||||||
 | 
					.header-controls {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    margin-bottom: 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chart-tabs {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    border: 1px solid #1C588F;
 | 
				
			||||||
 | 
					    border-radius: 3px;
 | 
				
			||||||
 | 
					    background-color: #031826;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chart-tabs button {
 | 
				
			||||||
 | 
					    background: none;
 | 
				
			||||||
 | 
					    border: none;
 | 
				
			||||||
 | 
					    color: #a7c5d4;
 | 
				
			||||||
 | 
					    padding: 4px 12px;
 | 
				
			||||||
 | 
					    font-size: 14px;
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					    transition: all 0.2s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chart-tabs button.active {
 | 
				
			||||||
 | 
					    background-color: #236291;
 | 
				
			||||||
 | 
					    color: white;
 | 
				
			||||||
 | 
					    border-radius: 2px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.details-btn {
 | 
				
			||||||
 | 
					    margin-left: auto;
 | 
				
			||||||
 | 
					    background: none;
 | 
				
			||||||
 | 
					    border: 1px solid #1c588f;
 | 
				
			||||||
 | 
					    color: #a7c5d4;
 | 
				
			||||||
 | 
					    padding: 4px 12px;
 | 
				
			||||||
 | 
					    font-size: 14px;
 | 
				
			||||||
 | 
					    border-radius: 3px;
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chart-container {
 | 
				
			||||||
 | 
					    flex-grow: 1;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    margin-left: -10px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user