diff --git a/src/views/Jyh/security/components/VulnerabilityLanguageChart.vue b/src/views/Jyh/security/components/VulnerabilityLanguageChart.vue new file mode 100644 index 0000000..d04a597 --- /dev/null +++ b/src/views/Jyh/security/components/VulnerabilityLanguageChart.vue @@ -0,0 +1,263 @@ + + + + + \ No newline at end of file diff --git a/src/views/Jyh/security/index.vue b/src/views/Jyh/security/index.vue index 5d8c5ba..d1a2626 100644 --- a/src/views/Jyh/security/index.vue +++ b/src/views/Jyh/security/index.vue @@ -46,18 +46,13 @@ + - -
-

漏洞语言分布

-
-
-
-
-
+ +
@@ -89,6 +84,7 @@ import IndustryDistribution from './components/IndustryDistribution.vue'; import HighRiskComponentRank from './components/HighRiskComponentRank.vue'; import IntelligenceFeed from './components/IntelligenceFeed.vue'; import CveTrendChart from './components/CveTrendChart.vue'; +import VulnerabilityLanguageChart from './components/VulnerabilityLanguageChart.vue'; import StatsGlass from '@/views/Jyh/security/StatsGlass.vue'; // 页面尺寸响应式 @@ -183,84 +179,7 @@ const chartData = ref({ { name: 'Go', data: [60, 65, 70, 72, 75] } ] }, - // 编程语言使用趋势数据 - languageTrend: { - years: ['2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024'], - series: [ - { - name: 'JavaScript', - type: 'established', - color: '#FAC858', - data: [65, 64, 69, 70, 69, 65, 61, 61] - }, - { - name: 'Python', - type: 'established', - color: '#5470C6', - data: [32, 41, 49, 55, 52, 53, 54, 60] - }, - { - name: 'HTML/CSS', - type: 'established', - color: '#91CC75', - data: [60, 55, 61, 61, 60, 54, 52, 52] - }, - { - name: 'SQL', - type: 'established', - color: '#9254DE', - data: [42, 47, 56, 56, 54, 49, 52, 50] - }, - { - name: 'Java', - type: 'established', - color: '#EE6666', - data: [47, 51, 50, 54, 49, 48, 49, 49] - }, - { - name: 'TypeScript', - type: 'emerging', - color: '#73C0DE', - data: [12, 17, 25, 28, 29, 34, 34, 50] - }, - { - name: 'Shell', - type: 'established', - color: '#52C41A', - data: [29, 29, 40, 39, 37, 34, 34, 41] - }, - { - name: 'C++', - type: 'established', - color: '#FF6E00', - data: [17, 18, 20, 27, 23, 25, 25, 21] - }, - { - name: 'C#', - type: 'established', - color: '#722ED1', - data: [20, 22, 24, 22, 21, 23, 21, 19] - }, - { - name: 'Go', - type: 'emerging', - color: '#00DDFF', - data: [8, 12, 18, 19, 17, 19, 17, 14] - }, - { - name: 'PHP', - type: 'declining', - color: '#F5222D', - data: [30, 26, 29, 27, 32, 20, 18, 15] - }, - { - name: 'Rust', - type: 'emerging', - color: '#FC8452', - data: [2, 2, 5, 7, 6, 9, 10, 10] - } - ] - }, + // 漏洞占比数据 vulnerabilitySeverity: { @@ -559,76 +478,7 @@ const initDeveloperChart = () => { }); }; -// 初始化编程语言使用趋势堆叠面积图 -const initLanguageTrendChart = () => { - const el = document.getElementById('languageTrendChart'); - if (!el) return; - if (chartInstances.value.languageTrendChart) { - chartInstances.value.languageTrendChart.dispose(); - } - - const myChart = echarts.init(el); - chartInstances.value.languageTrendChart = myChart; - - // 准备堆叠面积图数据 - const series = chartData.value.languageTrend.series.map(item => ({ - name: item.name, - type: 'line', - stack: '总量', - areaStyle: { - color: item.color - }, - lineStyle: { - width: 1, - color: item.color - }, - symbol: 'none', - data: item.data - })); - - myChart.setOption({ - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'cross', - label: { - backgroundColor: '#6a7985' - } - }, - formatter: (params: any) => { - let res = `
${params[0].name}年
`; - params.forEach((p: any) => { - res += `
${p.seriesName}: ${p.value}%
`; - }); - return res; - } - }, - legend: { - top: 0, - textStyle: { fontSize: 12 }, - data: chartData.value.languageTrend.series.map(item => item.name) - }, - grid: { left: '3%', right: '4%', bottom: '3%', top: '15%', containLabel: true }, - xAxis: [ - { - type: 'category', - boundaryGap: false, - data: chartData.value.languageTrend.years, - axisLabel: { fontSize: 12 } - } - ], - yAxis: [ - { - type: 'value', - name: '使用率(%)', - nameTextStyle: { fontSize: 12 }, - axisLabel: { fontSize: 12 } - } - ], - series: series - }); -}; // 初始化高危漏洞占比图表 const initVulnerabilitySeverityChart = () => { @@ -830,7 +680,7 @@ const initCharts = () => { - languageTrend: chartData.value.languageTrend.series.every(s => s.data.every(d => d === 0)), + vulnerabilitySeverity: chartData.value.vulnerabilitySeverity.series.every(s => s.data.every(d => d === 0)), scatterData: chartData.value.scatterData.length === 0 }; @@ -844,7 +694,7 @@ const initCharts = () => { - if (!isEmpty.value.languageTrend) nextTick(() => initLanguageTrendChart()); + if (!isEmpty.value.vulnerabilitySeverity) nextTick(() => initVulnerabilitySeverityChart()); if (!isEmpty.value.scatterData) nextTick(() => initScatterChart()); };