From bf25fcfc923cbe379eb57866fbde1e0473277d6c Mon Sep 17 00:00:00 2001 From: d266377 Date: Thu, 29 Jan 2026 11:20:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=81=E5=8A=BF=E6=84=9F=E7=9F=A5=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0-=E5=BC=80=E6=BA=90=E7=94=9F=E6=80=81=E4=B8=8E?= =?UTF-8?q?=E8=B4=A1=E7=8C=AE=E4=BB=B7=E5=80=BC=E5=85=A8=E6=99=AF-?= =?UTF-8?q?=E5=85=A8=E7=90=83=E5=BC=80=E6=BA=90=E4=BC=81=E4=B8=9A=E8=B4=A1?= =?UTF-8?q?=E7=8C=AE=E6=A6=9Ctop30=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Jyh/ecosystem/index.vue | 158 +++++++++++++++++++++--------- 1 file changed, 113 insertions(+), 45 deletions(-) diff --git a/src/views/Jyh/ecosystem/index.vue b/src/views/Jyh/ecosystem/index.vue index bb0a4a0..7cb7323 100644 --- a/src/views/Jyh/ecosystem/index.vue +++ b/src/views/Jyh/ecosystem/index.vue @@ -225,52 +225,119 @@ import VitalityWaveChart from './components/VitalityWaveChart.vue' import StatsGlass from './components/StatsGlass.vue' import StarDevelopersChart from './components/StarDevelopersChart.vue' import { usePageResize } from '@/utils/hooks/usePageResize'; -import { projectHeatMapPage2 } from '@/api/jyh/situation'; +import { projectHeatMapPage2, rawEnterpriseDataPage2 } from '@/api/jyh/situation'; // 页面尺寸响应式 const { widthType } = usePageResize(); +// 定义企业数据结构 +interface EnterpriseDataItem { + country: string; + devs: number; + name: string; + openrank: number; + repos: number; +} + // 1. 全球开源企业贡献榜数据(来自 EnterpriseContributionRanking.vue) -const rawEnterpriseData = [ - { name: 'Microsoft', openrank: 177654.43, repos: 9211, devs: 14954, country: 'USA' }, - { name: 'Huawei', openrank: 108690.66, repos: 11407, devs: 16413, country: 'China' }, - { name: 'Google', openrank: 64156.6, repos: 3426, devs: 64115, country: 'USA' }, - { name: 'Amazon', openrank: 54776.3, repos: 7850, devs: 35802, country: 'USA' }, - { name: 'Meta', openrank: 34811.3, repos: 1410, devs: 31912, country: 'USA' }, - { name: 'RedHat', openrank: 28004.37, repos: 736, devs: 3626, country: 'USA' }, - { name: 'Mozilla', openrank: 27085.14, repos: 1792, devs: 17242, country: 'USA' }, - { name: 'Alibaba', openrank: 24744.15, repos: 5570, devs: 18661, country: 'China' }, - { name: 'IBM', openrank: 21165.28, repos: 626, devs: 5658, country: 'USA' }, - { name: 'Elastic', openrank: 21472.45, repos: 2437, devs: 17735, country: 'USA' }, - { name: 'Nabu Casa', openrank: 18499.45, repos: 101, devs: 27413, country: 'USA' }, - { name: 'Grafana Labs', openrank: 18237.03, repos: 756, devs: 10925, country: 'USA' }, - { name: 'Ant Group', openrank: 17916.45, repos: 1251, devs: 13760, country: 'China' }, - { name: 'DataDog', openrank: 17795.41, repos: 935, devs: 5401, country: 'USA' }, - { name: 'Intel', openrank: 17725.74, repos: 1046, devs: 6142, country: 'USA' }, - { name: 'HashiCorp', openrank: 17229.81, repos: 745, devs: 17068, country: 'USA' }, - { name: 'Hugging Face', openrank: 16909.25, repos: 277, devs: 15021, country: 'USA' }, - { name: 'NVIDIA', openrank: 16082.9, repos: 850, devs: 12362, country: 'USA' }, - { name: 'Baidu', openrank: 15695.3, repos: 408, devs: 9386, country: 'China' }, - { name: 'VMWare', openrank: 14627.44, repos: 634, devs: 11794, country: 'USA' }, - { name: 'Odoo', openrank: 12959.59, repos: 27, devs: 2678, country: 'Belgium' }, - { name: 'Dio Academia', openrank: 11231.13, repos: 169, devs: 24070, country: 'Portugal' }, - { name: 'Oracle', openrank: 10799.13, repos: 528, devs: 37959, country: 'USA' }, - { name: 'Yandex', openrank: 10025.79, repos: 283, devs: 10112, country: 'Germany' }, - { name: 'NextCloud', openrank: 10029.67, repos: 229, devs: 39516, country: 'Russia' }, - { name: 'ByteDance', openrank: 8310.37, repos: 652, devs: 5989, country: 'China' }, - { name: 'WordPress', openrank: 8267.62, repos: 176, devs: 777, country: 'USA' }, - { name: 'Vercel', openrank: 8214.69, repos: 170, devs: 13420, country: 'USA' }, - { name: 'LangChain', openrank: 8108.64, repos: 135, devs: 10099, country: 'USA' }, - { name: 'ConsenSys', openrank: 8071.43, repos: 640, devs: 4686, country: 'USA' } -]; +const rawEnterpriseData = ref([]); +const enterpriseLoading = ref(true); + +// 从API获取企业数据 +const fetchEnterpriseData = async () => { + try { + enterpriseLoading.value = true; + const response = await rawEnterpriseDataPage2(); + + if (response.code === 0 && response.data) { + rawEnterpriseData.value = response.data; + } else { + console.error('获取企业数据失败:', response.msg || '未知错误'); + // 设置默认数据 + rawEnterpriseData.value = [ + { name: 'Microsoft', openrank: 177654.43, repos: 9211, devs: 14954, country: 'USA' }, + { name: 'Huawei', openrank: 108690.66, repos: 11407, devs: 16413, country: 'China' }, + { name: 'Google', openrank: 64156.6, repos: 3426, devs: 64115, country: 'USA' }, + { name: 'Amazon', openrank: 54776.3, repos: 7850, devs: 35802, country: 'USA' }, + { name: 'Meta', openrank: 34811.3, repos: 1410, devs: 31912, country: 'USA' }, + { name: 'RedHat', openrank: 28004.37, repos: 736, devs: 3626, country: 'USA' }, + { name: 'Mozilla', openrank: 27085.14, repos: 1792, devs: 17242, country: 'USA' }, + { name: 'Alibaba', openrank: 24744.15, repos: 5570, devs: 18661, country: 'China' }, + { name: 'IBM', openrank: 21165.28, repos: 626, devs: 5658, country: 'USA' }, + { name: 'Elastic', openrank: 21472.45, repos: 2437, devs: 17735, country: 'USA' }, + { name: 'Nabu Casa', openrank: 18499.45, repos: 101, devs: 27413, country: 'USA' }, + { name: 'Grafana Labs', openrank: 18237.03, repos: 756, devs: 10925, country: 'USA' }, + { name: 'Ant Group', openrank: 17916.45, repos: 1251, devs: 13760, country: 'China' }, + { name: 'DataDog', openrank: 17795.41, repos: 935, devs: 5401, country: 'USA' }, + { name: 'Intel', openrank: 17725.74, repos: 1046, devs: 6142, country: 'USA' }, + { name: 'HashiCorp', openrank: 17229.81, repos: 745, devs: 17068, country: 'USA' }, + { name: 'Hugging Face', openrank: 16909.25, repos: 277, devs: 15021, country: 'USA' }, + { name: 'NVIDIA', openrank: 16082.9, repos: 850, devs: 12362, country: 'USA' }, + { name: 'Baidu', openrank: 15695.3, repos: 408, devs: 9386, country: 'China' }, + { name: 'VMWare', openrank: 14627.44, repos: 634, devs: 11794, country: 'USA' }, + { name: 'Odoo', openrank: 12959.59, repos: 27, devs: 2678, country: 'Belgium' }, + { name: 'Dio Academia', openrank: 11231.13, repos: 169, devs: 24070, country: 'Portugal' }, + { name: 'Oracle', openrank: 10799.13, repos: 528, devs: 37959, country: 'USA' }, + { name: 'Yandex', openrank: 10025.79, repos: 283, devs: 10112, country: 'Germany' }, + { name: 'NextCloud', openrank: 10029.67, repos: 229, devs: 39516, country: 'Russia' }, + { name: 'ByteDance', openrank: 8310.37, repos: 652, devs: 5989, country: 'China' }, + { name: 'WordPress', openrank: 8267.62, repos: 176, devs: 777, country: 'USA' }, + { name: 'Vercel', openrank: 8214.69, repos: 170, devs: 13420, country: 'USA' }, + { name: 'LangChain', openrank: 8108.64, repos: 135, devs: 10099, country: 'USA' }, + { name: 'ConsenSys', openrank: 8071.43, repos: 640, devs: 4686, country: 'USA' } + ]; + } + } catch (error) { + console.error('获取企业数据异常:', error); + // 设置默认数据 + rawEnterpriseData.value = [ + { name: 'Microsoft', openrank: 177654.43, repos: 9211, devs: 14954, country: 'USA' }, + { name: 'Huawei', openrank: 108690.66, repos: 11407, devs: 16413, country: 'China' }, + { name: 'Google', openrank: 64156.6, repos: 3426, devs: 64115, country: 'USA' }, + { name: 'Amazon', openrank: 54776.3, repos: 7850, devs: 35802, country: 'USA' }, + { name: 'Meta', openrank: 34811.3, repos: 1410, devs: 31912, country: 'USA' }, + { name: 'RedHat', openrank: 28004.37, repos: 736, devs: 3626, country: 'USA' }, + { name: 'Mozilla', openrank: 27085.14, repos: 1792, devs: 17242, country: 'USA' }, + { name: 'Alibaba', openrank: 24744.15, repos: 5570, devs: 18661, country: 'China' }, + { name: 'IBM', openrank: 21165.28, repos: 626, devs: 5658, country: 'USA' }, + { name: 'Elastic', openrank: 21472.45, repos: 2437, devs: 17735, country: 'USA' }, + { name: 'Nabu Casa', openrank: 18499.45, repos: 101, devs: 27413, country: 'USA' }, + { name: 'Grafana Labs', openrank: 18237.03, repos: 756, devs: 10925, country: 'USA' }, + { name: 'Ant Group', openrank: 17916.45, repos: 1251, devs: 13760, country: 'China' }, + { name: 'DataDog', openrank: 17795.41, repos: 935, devs: 5401, country: 'USA' }, + { name: 'Intel', openrank: 17725.74, repos: 1046, devs: 6142, country: 'USA' }, + { name: 'HashiCorp', openrank: 17229.81, repos: 745, devs: 17068, country: 'USA' }, + { name: 'Hugging Face', openrank: 16909.25, repos: 277, devs: 15021, country: 'USA' }, + { name: 'NVIDIA', openrank: 16082.9, repos: 850, devs: 12362, country: 'USA' }, + { name: 'Baidu', openrank: 15695.3, repos: 408, devs: 9386, country: 'China' }, + { name: 'VMWare', openrank: 14627.44, repos: 634, devs: 11794, country: 'USA' }, + { name: 'Odoo', openrank: 12959.59, repos: 27, devs: 2678, country: 'Belgium' }, + { name: 'Dio Academia', openrank: 11231.13, repos: 169, devs: 24070, country: 'Portugal' }, + { name: 'Oracle', openrank: 10799.13, repos: 528, devs: 37959, country: 'USA' }, + { name: 'Yandex', openrank: 10025.79, repos: 283, devs: 10112, country: 'Germany' }, + { name: 'NextCloud', openrank: 10029.67, repos: 229, devs: 39516, country: 'Russia' }, + { name: 'ByteDance', openrank: 8310.37, repos: 652, devs: 5989, country: 'China' }, + { name: 'WordPress', openrank: 8267.62, repos: 176, devs: 777, country: 'USA' }, + { name: 'Vercel', openrank: 8214.69, repos: 170, devs: 13420, country: 'USA' }, + { name: 'LangChain', openrank: 8108.64, repos: 135, devs: 10099, country: 'USA' }, + { name: 'ConsenSys', openrank: 8071.43, repos: 640, devs: 4686, country: 'USA' } + ]; + } finally { + enterpriseLoading.value = false; + } +}; // 计算综合得分并排序 -const calculateEnterpriseScore = () => { - const maxOpenrank = Math.max(...rawEnterpriseData.map(d => d.openrank)); - const maxRepos = Math.max(...rawEnterpriseData.map(d => d.repos)); - const maxDevs = Math.max(...rawEnterpriseData.map(d => d.devs)); +const calculateEnterpriseScore = (data: EnterpriseDataItem[]) => { + if (!data || data.length === 0) { + return []; + } + + const maxOpenrank = Math.max(...data.map(d => d.openrank)); + const maxRepos = Math.max(...data.map(d => d.repos)); + const maxDevs = Math.max(...data.map(d => d.devs)); - const scored = rawEnterpriseData.map(item => { + const scored = data.map(item => { const openrankScore = Math.sqrt(item.openrank / maxOpenrank) * 100; const reposScore = Math.sqrt(item.repos / maxRepos) * 100; const devsScore = Math.sqrt(item.devs / maxDevs) * 100; @@ -298,12 +365,12 @@ const calculateEnterpriseScore = () => { }); }; -const allEnterprises = calculateEnterpriseScore(); +const allEnterprises = computed(() => calculateEnterpriseScore(rawEnterpriseData.value)); const enterpriseFilter = ref<'all' | 'China' | 'USA'>('all'); // 计算各国企业数量 -const chinaCount = computed(() => allEnterprises.filter(item => item.country === 'China').length); -const usaCount = computed(() => allEnterprises.filter(item => item.country === 'USA').length); +const chinaCount = computed(() => allEnterprises.value.filter(item => item.country === 'China').length); +const usaCount = computed(() => allEnterprises.value.filter(item => item.country === 'USA').length); // 切换筛选并重启滚动 const changeEnterpriseFilter = (filter: 'all' | 'China' | 'USA') => { @@ -332,9 +399,9 @@ const totalRepos = computed(() => { // 根据筛选条件过滤企业数据 const excellentProjects = computed(() => { if (enterpriseFilter.value === 'all') { - return allEnterprises; + return allEnterprises.value; } - const filtered = allEnterprises.filter(item => item.country === enterpriseFilter.value); + const filtered = allEnterprises.value.filter(item => item.country === enterpriseFilter.value); // 重新计算排名 return filtered.map((item, index) => ({ ...item, @@ -1248,9 +1315,10 @@ const initCharts = () => { nextTick(() => initHeatmapChart()); }; -// 获取热力图数据并初始化图表 +// 获取企业数据和热力图数据并初始化图表 onMounted(async () => { - await fetchHeatmapData(); // 等待数据获取完成 + await fetchEnterpriseData(); // 等待企业数据获取完成 + await fetchHeatmapData(); // 等待热力图数据获取完成 nextTick(() => initHeatmapChart()); // 数据加载完成后初始化图表 });