240 lines
5.8 KiB
Vue
240 lines
5.8 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="performance-charts">
|
|||
|
|
<!-- 性能历史趋势图 -->
|
|||
|
|
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
|
|||
|
|
<h2 class="text-lg font-semibold mb-4">性能历史趋势</h2>
|
|||
|
|
<div v-if="!performanceHistory || performanceHistory.length === 0" class="h-64 flex items-center justify-center bg-gray-50 rounded-lg">
|
|||
|
|
<p class="text-gray-500">暂无历史数据</p>
|
|||
|
|
</div>
|
|||
|
|
<div v-else class="h-80">
|
|||
|
|
<v-chart
|
|||
|
|
class="h-full w-full"
|
|||
|
|
:option="historyChartOption"
|
|||
|
|
:loading="loading"
|
|||
|
|
autoresize
|
|||
|
|
/>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<!-- 性能指标雷达图 -->
|
|||
|
|
<div class="bg-white rounded-lg shadow-md p-6">
|
|||
|
|
<h2 class="text-lg font-semibold mb-4">性能指标雷达图</h2>
|
|||
|
|
<div v-if="!product || !product.performanceScores || product.performanceScores.length === 0" class="h-64 flex items-center justify-center bg-gray-50 rounded-lg">
|
|||
|
|
<p class="text-gray-500">暂无性能数据</p>
|
|||
|
|
</div>
|
|||
|
|
<div v-else class="h-80">
|
|||
|
|
<v-chart
|
|||
|
|
class="h-full w-full"
|
|||
|
|
:option="radarChartOption"
|
|||
|
|
:loading="loading"
|
|||
|
|
autoresize
|
|||
|
|
/>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import { ref, computed, watch } from 'vue'
|
|||
|
|
import { use } from 'echarts/core'
|
|||
|
|
import { CanvasRenderer } from 'echarts/renderers'
|
|||
|
|
import { LineChart, RadarChart } from 'echarts/charts'
|
|||
|
|
import {
|
|||
|
|
TitleComponent,
|
|||
|
|
TooltipComponent,
|
|||
|
|
LegendComponent,
|
|||
|
|
GridComponent,
|
|||
|
|
RadarComponent
|
|||
|
|
} from 'echarts/components'
|
|||
|
|
import VChart from 'vue-echarts'
|
|||
|
|
|
|||
|
|
// 注册必要的组件
|
|||
|
|
use([
|
|||
|
|
CanvasRenderer,
|
|||
|
|
LineChart,
|
|||
|
|
RadarChart,
|
|||
|
|
TitleComponent,
|
|||
|
|
TooltipComponent,
|
|||
|
|
LegendComponent,
|
|||
|
|
GridComponent,
|
|||
|
|
RadarComponent
|
|||
|
|
])
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
name: 'PerformanceCharts',
|
|||
|
|
components: {
|
|||
|
|
VChart
|
|||
|
|
},
|
|||
|
|
props: {
|
|||
|
|
product: {
|
|||
|
|
type: Object,
|
|||
|
|
required: true
|
|||
|
|
},
|
|||
|
|
performanceHistory: {
|
|||
|
|
type: Array,
|
|||
|
|
default: () => []
|
|||
|
|
},
|
|||
|
|
loading: {
|
|||
|
|
type: Boolean,
|
|||
|
|
default: false
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
setup(props) {
|
|||
|
|
// 性能历史趋势图配置
|
|||
|
|
const historyChartOption = computed(() => {
|
|||
|
|
if (!props.performanceHistory || props.performanceHistory.length === 0) {
|
|||
|
|
return {}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 准备数据
|
|||
|
|
const dates = []
|
|||
|
|
const scores = []
|
|||
|
|
|
|||
|
|
props.performanceHistory.forEach(item => {
|
|||
|
|
dates.push(new Date(item.recordDate).toLocaleDateString())
|
|||
|
|
scores.push(item.score)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
title: {
|
|||
|
|
text: `${props.product.name} 性能趋势`,
|
|||
|
|
left: 'center'
|
|||
|
|
},
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: 'axis',
|
|||
|
|
formatter: function(params) {
|
|||
|
|
return `${params[0].axisValue}<br/>性能分数: ${params[0].value}`
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
xAxis: {
|
|||
|
|
type: 'category',
|
|||
|
|
data: dates,
|
|||
|
|
axisLabel: {
|
|||
|
|
rotate: 45
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
type: 'value',
|
|||
|
|
name: '性能分数'
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: '性能分数',
|
|||
|
|
type: 'line',
|
|||
|
|
data: scores,
|
|||
|
|
smooth: true,
|
|||
|
|
symbolSize: 8,
|
|||
|
|
lineStyle: {
|
|||
|
|
width: 3,
|
|||
|
|
color: '#409EFF'
|
|||
|
|
},
|
|||
|
|
itemStyle: {
|
|||
|
|
color: '#409EFF'
|
|||
|
|
},
|
|||
|
|
areaStyle: {
|
|||
|
|
color: {
|
|||
|
|
type: 'linear',
|
|||
|
|
x: 0,
|
|||
|
|
y: 0,
|
|||
|
|
x2: 0,
|
|||
|
|
y2: 1,
|
|||
|
|
colorStops: [
|
|||
|
|
{ offset: 0, color: 'rgba(64, 158, 255, 0.5)' },
|
|||
|
|
{ offset: 1, color: 'rgba(64, 158, 255, 0.1)' }
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
grid: {
|
|||
|
|
left: '3%',
|
|||
|
|
right: '4%',
|
|||
|
|
bottom: '15%',
|
|||
|
|
containLabel: true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 性能指标雷达图配置
|
|||
|
|
const radarChartOption = computed(() => {
|
|||
|
|
if (!props.product || !props.product.performanceScores || props.product.performanceScores.length === 0) {
|
|||
|
|
return {}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 准备雷达图数据
|
|||
|
|
const indicators = []
|
|||
|
|
const values = []
|
|||
|
|
|
|||
|
|
// 定义常见的基准测试及其最大值
|
|||
|
|
const benchmarkMaxValues = {
|
|||
|
|
'Geekbench Single-Core': 3000,
|
|||
|
|
'Geekbench Multi-Core': 20000,
|
|||
|
|
'3DMark Time Spy': 20000,
|
|||
|
|
'3DMark Fire Strike': 30000,
|
|||
|
|
'AnTuTu': 1000000,
|
|||
|
|
'PCMark': 8000,
|
|||
|
|
'Cinebench R23': 30000,
|
|||
|
|
'Cinebench R20': 8000
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
props.product.performanceScores.forEach(score => {
|
|||
|
|
const benchmarkName = score.benchmarkName
|
|||
|
|
const maxValue = benchmarkMaxValues[benchmarkName] || 100
|
|||
|
|
|
|||
|
|
indicators.push({
|
|||
|
|
name: benchmarkName,
|
|||
|
|
max: maxValue
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 将分数转换为百分比(0-100)
|
|||
|
|
const percentage = Math.min(100, (score.score / maxValue) * 100)
|
|||
|
|
values.push(percentage)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
title: {
|
|||
|
|
text: `${props.product.name} 性能指标`,
|
|||
|
|
left: 'center'
|
|||
|
|
},
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: 'item'
|
|||
|
|
},
|
|||
|
|
radar: {
|
|||
|
|
indicator: indicators,
|
|||
|
|
center: ['50%', '55%'],
|
|||
|
|
radius: '70%'
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
name: '性能指标',
|
|||
|
|
type: 'radar',
|
|||
|
|
data: [
|
|||
|
|
{
|
|||
|
|
value: values,
|
|||
|
|
name: props.product.name,
|
|||
|
|
itemStyle: {
|
|||
|
|
color: '#409EFF'
|
|||
|
|
},
|
|||
|
|
areaStyle: {
|
|||
|
|
color: 'rgba(64, 158, 255, 0.3)'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
historyChartOption,
|
|||
|
|
radarChartOption
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
.performance-charts {
|
|||
|
|
width: 100%;
|
|||
|
|
}
|
|||
|
|
</style>
|