Compare commits

...

10 Commits

6 changed files with 232 additions and 47 deletions

4
.gitignore vendored
View File

@@ -41,3 +41,7 @@ components.d.ts
component.md component.md
./deploy.js ./deploy.js
# 本地工具配置目录
.obsidian/
.claudian/

View File

@@ -81,7 +81,8 @@ const dataSubMenus = [
]; ];
const handleLogin = (type) => { const handleLogin = (type) => {
emitEvent('login', {type, triggerType: '主动注册'}); // emitEvent('login', {type, triggerType: '主动注册'});
window.open('http://222.20.126.217:2133/login', '_blank');
}; };
</script> </script>

View File

@@ -58,7 +58,7 @@ const fetchStats = async() => {
const { developer, community, company, project } = businessData.data; const { developer, community, company, project } = businessData.data;
// 格式化数据显示 // 格式化数据显示
whDeveloper.value = `${formatNumber(developer)}+`; whDeveloper.value = `${formatNumber(developer)}+`;
whCommunity.value = formatNumber(community); whCommunity.value = formatNumber(community);
whCompany.value = `${formatNumber(company)}+`; whCompany.value = `${formatNumber(company)}+`;
whProject.value = `${formatNumber(project)}+`; whProject.value = `${formatNumber(project)}+`;

View File

@@ -311,12 +311,23 @@ import * as echarts from 'echarts';
import { usePageResize } from '@/utils/hooks/usePageResize'; import { usePageResize } from '@/utils/hooks/usePageResize';
import StatsBar from './components/StatsBar.vue'; import StatsBar from './components/StatsBar.vue';
import HarmonyEcoCharts from './components/HarmonyEcoCharts.vue'; import HarmonyEcoCharts from './components/HarmonyEcoCharts.vue';
import { wuhanGithubProjectsPage3, cityProjectPage3, chinaExcellentProjectsPage3, excellentProjectsPage3, talentPage3 } from '@/api/jyh/situation'; import { wuhanGithubProjectsPage3, cityProjectPage3, chinaExcellentProjectsPage3, excellentProjectsPage3, talentPage3,
developerNamesPage3, communityRankChartPage3, wuhanCommunitiesPage3, ClubPage3, policyPage3, campusPage3, mirrorsPage3 } from '@/api/jyh/situation';
const { widthType } = usePageResize(); const { widthType } = usePageResize();
const githubProjects = ref([]); const githubProjects = ref([]);
const activeTab = ref(0);
const excellentProjects = ref([]);
const chinaExcellentProjects = ref([]);
const developerNames = ref([]);
const wuhanCommunities = ref([]);
// 武汉优质开源项目备用数据 // 武汉优质开源项目备用数据
const setgithubProjectsdata = () => { const setgithubProjectsdata = () => {
githubProjects.value = [ githubProjects.value = [
@@ -451,11 +462,33 @@ const fetchTalentData = async() => {
} }
}; };
const activeTab = ref(0); // 城市社区数量排行备用数据
const setCommunityRankDefaultData = () => {
chartData.value.communityRank.xAxis = ['北京', '深圳', '上海', '杭州', '广州', '成都', '南京', '武汉'];
chartData.value.communityRank.data = [69, 35, 31, 25, 18, 15, 12, 12];
isEmpty.value.communityRank = false;
};
const excellentProjects = ref([]); // 获取武汉社区数量排行数据
const fetchCommunityRankData = async() => {
const chinaExcellentProjects = ref([]); try {
const response = await communityRankChartPage3();
const communitydata = response.data;
if (communitydata?.code === 200 && communitydata?.data) {
// 更新图表数据
chartData.value.communityRank.xAxis = communitydata.data.map(item => item.name);
chartData.value.communityRank.data = communitydata.data.map(item => item.value);
// 设置非空状态
isEmpty.value.communityRank = false;
} else {
console.error('获取城市社区数量排行数据失败:', communitydata?.msg || '未知错误');
setCommunityRankDefaultData();
}
} catch (error) {
console.error('请求城市社区数量排行数据时发生错误:', error);
setCommunityRankDefaultData();
}
};
// 2024武汉优秀开源项目备用数据 // 2024武汉优秀开源项目备用数据
const chinaExcellentProjectsdata = () => { const chinaExcellentProjectsdata = () => {
@@ -561,27 +594,166 @@ const fetchexcellentProjects = async() => {
} }
}; };
const wuhanCommunities = ref([ // 武汉明星开发者贡献榜备用数据
{ name: '黄鹤开源社区', type: '核心生态', slogan: '国家级、城市级开源社区平台,武汉开源生态的核心枢纽' }, const setDeveloperNamesDefaultData = () => {
{ name: '深度社区 (Deepin)', type: '操作系统', slogan: '全球最大桌面操作系统社区之一,全球用户超过 750 万' }, developerNames.value = ['白纯骢', '陆红旭', '慕冬亮', '张继德', '蒋周奇', '张天雄', '阮文俊', '李奇', '陈鹏轩', '杨帆'];
{ };
name: '极狐社区 (GitLab China)',
type: 'DevOps',
slogan: '全球第二大开源托管平台 GitLab 在汉设立的中国发行版及开发者社区'
},
{ name: '开源鸿蒙社区 (OpenHarmony)', type: '万物互联', slogan: '国家级生态创新中心,设有全国首个分委会' },
{ name: 'PostgreSQL 中文社区', type: '数据库', slogan: '全球四大开源数据库之一的运营中心设在武汉' },
{ name: '武汉大学开源社区', type: '学术社团', slogan: '老牌社团,涉及 Linux、嵌入式、深度学习等方向' },
{ name: '武汉大学 OpenHarmony 俱乐部', type: '万物互联', slogan: '专注于华为开源鸿蒙生态' },
{ name: '华中科技大学开源社团', type: '学术社团', slogan: '常年组织 LUG (Linux User Group) 及黑客松活动' },
{ name: '武汉理工大学开源联盟', type: '学术社团', slogan: '聚焦计算机科学与软件工程方向' },
{ name: '华中师范大学', type: '兴趣小组', slogan: '开源技术兴趣小组' },
{ name: '中南民族大学', type: '兴趣小组', slogan: '开源技术兴趣小组' },
{ name: '湖北大学', type: '兴趣小组', slogan: '开源技术兴趣小组' }
]);
// 开发者名单 // 获取武汉明星开发者贡献榜数据
const developerNames = ['白纯骢', '陆红旭', '慕冬亮', '张继德', '蒋周奇', '张天雄', '阮文俊', '李奇', '陈鹏轩', '杨帆']; const fetchDeveloperNamesData = async() => {
try {
const response = await developerNamesPage3();
const developerdata = response.data;
if (developerdata?.code === 200 && developerdata?.data) {
// 更新开发者名单 - 后端返回字段为 name
developerNames.value = developerdata.data.map(item => item.name);
// 设置非空状态
isEmpty.value.developer = false;
} else {
console.error('获取武汉明星开发者贡献榜数据失败:', developerdata?.msg || '未知错误');
setDeveloperNamesDefaultData();
}
} catch (error) {
console.error('请求武汉明星开发者贡献榜数据时发生错误:', error);
setDeveloperNamesDefaultData();
}
};
// 武汉知名开源社区备用数据
const setwuhanCommunitiesdata = () => {
wuhanCommunities.value = [
{ name: '黄鹤开源社区', type: '核心生态', slogan: '国家级、城市级开源社区平台,武汉开源生态的核心枢纽' },
{ name: '深度社区 (Deepin)', type: '操作系统', slogan: '全球最大桌面操作系统社区之一,全球用户超过 750 万' },
{
name: '极狐社区 (GitLab China)',
type: 'DevOps',
slogan: '全球第二大开源托管平台 GitLab 在汉设立的中国发行版及开发者社区'
},
{ name: '开源鸿蒙社区 (OpenHarmony)', type: '万物互联', slogan: '国家级生态创新中心,设有全国首个分委会' },
{ name: 'PostgreSQL 中文社区', type: '数据库', slogan: '全球四大开源数据库之一的运营中心设在武汉' },
{ name: '武汉大学开源社区', type: '学术社团', slogan: '老牌社团,涉及 Linux、嵌入式、深度学习等方向' },
{ name: '武汉大学 OpenHarmony 俱乐部', type: '万物互联', slogan: '专注于华为开源鸿蒙生态' },
{ name: '华中科技大学开源社团', type: '学术社团', slogan: '常年组织 LUG (Linux User Group) 及黑客松活动' },
{ name: '武汉理工大学开源联盟', type: '学术社团', slogan: '聚焦计算机科学与软件工程方向' },
{ name: '华中师范大学', type: '兴趣小组', slogan: '开源技术兴趣小组' },
{ name: '中南民族大学', type: '兴趣小组', slogan: '开源技术兴趣小组' },
{ name: '湖北大学', type: '兴趣小组', slogan: '开源技术兴趣小组' }
];
};
const fetchwuhanCommunities = async() => {
try {
const response = await wuhanCommunitiesPage3();
const communitydata = response.data;
if (communitydata?.code === 200 && communitydata?.data) {
wuhanCommunities.value = communitydata.data;
} else {
console.error('获取武汉知名开源社区数据失败:', communitydata?.msg || '未知错误');
setwuhanCommunitiesdata();
}
} catch (error) {
console.error('请求武汉知名开源社区数据时发生错误:', error);
setwuhanCommunitiesdata();
}
};
// 重点城市高校开源社团数量备用数据
const setClubdata = () => {
chartData.value.club.xAxis = ['成都', '北京', '上海', '武汉', '重庆', '深圳', '苏州', '杭州', '合肥', '青岛'];
chartData.value.club.data = [10, 7, 5, 4, 3, 2, 2, 2, 2, 2];
isEmpty.value.club = false;
};
const fetchclubData = async() => {
try {
const response = await ClubPage3();
const clubdata = response.data;
if (clubdata?.code === 200 && clubdata?.data) {
chartData.value.club.xAxis = clubdata.data.map(item => item.name);
chartData.value.club.data = clubdata.data.map(item => item.number);
isEmpty.value.club = false;
} else {
console.error('获取重点城市高校开源社团数量数据失败:', clubdata?.msg || '未知错误');
setClubdata();
}
} catch (error) {
console.error('请求重点城市高校开源社团数量数据时发生错误:', error);
setClubdata();
}
};
// 各省市开源相关政策发布数量备用数据
const setPolicydata = () => {
chartData.value.policy.xAxis = ['江苏', '北京', '浙江', '广东', '上海', '湖北', '天津', '陕西', '河南', '云南'];
chartData.value.policy.data = [11, 7, 3, 3, 3, 2, 2, 2, 2, 2];
isEmpty.value.policy = false;
};
const fetchpolicyData = async() => {
try {
const response = await policyPage3();
const policydata = response.data;
if (policydata?.code === 200 && policydata?.data) {
chartData.value.policy.xAxis = policydata.data.map(item => item.name);
chartData.value.policy.data = policydata.data.map(item => item.number);
isEmpty.value.policy = false;
} else {
console.error('获取各省市开源相关政策发布数量数据失败:', policydata?.msg || '未知错误');
setPolicydata();
}
} catch (error) {
console.error('请求各省市开源相关政策发布数量数据时发生错误:', error);
setPolicydata();
}
};
// 开放原子校园行·城市活动场次备用数据
const setcampusdata = () => {
chartData.value.campus.xAxis = ['南京', '武汉', '北京', '长沙', '成都', '上海', '天津', '深圳', '济南', '广州'];
chartData.value.campus.data = [20, 16, 16, 16, 11, 10, 8, 8, 7, 6];
isEmpty.value.campus = false;
};
const fetchcampusData = async() => {
try {
const response = await campusPage3();
const campusdata = response.data;
if (campusdata?.code === 200 && campusdata?.data) {
chartData.value.campus.xAxis = campusdata.data.map(item => item.name);
chartData.value.campus.data = campusdata.data.map(item => item.number);
isEmpty.value.campus = false;
} else {
console.error('获取开放原子校园行·城市活动场次数据失败:', campusdata?.msg || '未知错误');
setcampusdata();
}
} catch (error) {
console.error('请求开放原子校园行·城市活动场次数据时发生错误:', error);
setcampusdata();
}
};
// 全国重点城市开源镜像站/节点数量对比备用数据
const setmirrorsdata = () => {
chartData.value.mirrors.xAxis = ['上海', '北京', '西安', '重庆', '济南', '南京', '武汉', '合肥', '香港', '长春', '成都', '深圳', '兰州', '哈尔滨', '南阳', '杭州'];
chartData.value.mirrors.data = [4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
isEmpty.value.mirrors = false;
};
const fetchmirrorsData = async() => {
try {
const response = await mirrorsPage3();
const mirrorsdata = response.data;
if (mirrorsdata?.code === 200 && mirrorsdata?.data) {
chartData.value.mirrors.xAxis = mirrorsdata.data.map(item => item.name);
chartData.value.mirrors.data = mirrorsdata.data.map(item => item.number);
isEmpty.value.mirrors = false;
} else {
console.error('获取全国重点城市开源镜像站/节点数量对比数据失败:', mirrorsdata?.msg || '未知错误');
setmirrorsdata();
}
} catch (error) {
console.error('请求全国重点城市开源镜像站/节点数量对比数据时发生错误:', error);
setmirrorsdata();
}
};
// 图表数据 // 图表数据
const chartData = ref({ const chartData = ref({
@@ -598,20 +770,20 @@ const chartData = ref({
data: [95, 92, 88, 76, 72] data: [95, 92, 88, 76, 72]
}, },
club: { club: {
xAxis: ['成都', '北京', '上海', '武汉', '重庆', '深圳', '苏州', '杭州', '合肥', '青岛'], xAxis: [],
data: [10, 7, 5, 4, 3, 2, 2, 2, 2, 2] data: []
}, },
policy: { policy: {
xAxis: ['江苏', '北京', '浙江', '广东', '上海', '湖北', '天津', '陕西', '河南', '云南'], xAxis: [],
data: [11, 7, 3, 3, 3, 2, 2, 2, 2, 2] data: []
}, },
campus: { campus: {
xAxis: ['南京', '武汉', '北京', '长沙', '成都', '上海', '天津', '深圳', '济南', '广州'], xAxis: [],
data: [20, 16, 16, 16, 11, 10, 8, 8, 7, 6] data: []
}, },
mirrors: { mirrors: {
xAxis: ['上海', '北京', '西安', '重庆', '济南', '南京', '武汉', '合肥', '香港', '长春', '成都', '深圳', '兰州', '哈尔滨', '南阳', '杭州'], xAxis: [],
data: [4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] data: []
} }
}); });
@@ -776,12 +948,14 @@ const initCommunityRankChart = () => {
grid: { left: '3%', right: '4%', bottom: '15px', top: '22%', containLabel: true }, grid: { left: '3%', right: '4%', bottom: '15px', top: '22%', containLabel: true },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ['北京', '深圳', '上海', '杭州', '广州', '成都', '南京', '武汉'], data: chartData.value.communityRank.xAxis,
axisLabel: { color: '#666' } axisLabel: { color: '#666' }
}, },
yAxis: { type: 'value', name: '单位:个', nameTextStyle: { color: '#999' } }, yAxis: { type: 'value', name: '单位:个', nameTextStyle: { color: '#999' }},
series: [{ series: [{
type: 'bar', data: [69, 35, 31, 25, 18, 15, 12, 12], barWidth: '40%', type: 'bar',
data: chartData.value.communityRank.data,
barWidth: '40%',
itemStyle: { borderRadius: [4, 4, 0, 0], color: '#3b82f6' } itemStyle: { borderRadius: [4, 4, 0, 0], color: '#3b82f6' }
}] }]
}); });
@@ -795,8 +969,8 @@ const initClubChart = () => {
myChart.setOption({ myChart.setOption({
tooltip: { trigger: 'axis', valueFormatter: (value: any) => value + ' 个' }, tooltip: { trigger: 'axis', valueFormatter: (value: any) => value + ' 个' },
grid: commonGrid, grid: commonGrid,
xAxis: { type: 'category', data: chartData.value.club.xAxis, axisLabel: { color: '#666' } }, xAxis: { type: 'category', data: chartData.value.club.xAxis, axisLabel: { color: '#666' }},
yAxis: { type: 'value', name: '单位:个', splitLine: { lineStyle: { type: 'dashed', color: '#eee' } } }, yAxis: { type: 'value', name: '单位:个', splitLine: { lineStyle: { type: 'dashed', color: '#eee' }}},
series: [{ series: [{
type: 'line', data: chartData.value.club.data, smooth: true, symbolSize: 8, type: 'line', data: chartData.value.club.data, smooth: true, symbolSize: 8,
lineStyle: { width: 3, color: '#F59E0B' }, lineStyle: { width: 3, color: '#F59E0B' },
@@ -897,11 +1071,18 @@ watch(widthType, () => {
}); });
onMounted(async() => { onMounted(async() => {
await fetchGithubProjects(); await fetchGithubProjects(); // 获取武汉优质开源项目榜数据
await fetchCityProjectData(); // 获取城市项目数据 await fetchCityProjectData(); // 获取城市项目数据
await fetchTalentData(); // 获取城市人才数据 await fetchTalentData(); // 获取城市人才数据
await fetchDeveloperNamesData(); // 获取武汉明星开发者贡献榜数据
await fetchchinaExcellentProjects(); // 获取2024中国优秀开源项目数据 await fetchchinaExcellentProjects(); // 获取2024中国优秀开源项目数据
await fetchexcellentProjects(); // 获取2025武汉优秀开源项目数据 await fetchexcellentProjects(); // 获取2025武汉优秀开源项目数据
await fetchCommunityRankData(); // 获取城市社区数量排行数据
await fetchwuhanCommunities(); // 获取武汉知名开源社区数据
await fetchclubData(); // 获取重点城市高校开源社团数量数据
await fetchpolicyData(); // 获取各省市开源相关政策发布数量数据
await fetchcampusData(); // 获取开放原子校园行·城市活动场次数据
await fetchmirrorsData(); // 获取全国重点城市开源镜像站/节点数量对比数据
init(); // 再初始化图表 init(); // 再初始化图表
}); });

View File

@@ -740,8 +740,7 @@ const getRankClass = (rank: number) => {
}; };
const getRankText = (rank: number) => { const getRankText = (rank: number) => {
if (rank <= 3) return rank.toString(); return rank.toString();
return rank.toString().padStart(2, '0');
}; };
const getScoreClass = (score: number) => { const getScoreClass = (score: number) => {

View File

@@ -36,10 +36,10 @@ import { overviewDataPage1 } from '@/api/jyh/situation';
// 定义响应式数据对象,初始值为 0 或 null // 定义响应式数据对象,初始值为 0 或 null
const stats = reactive({ const stats = reactive({
enterprise: 0, enterprise: 8000,
university: 0, university: 600,
activity: 0, activity: 10000,
project: 0 project: 4
}); });
// 加载状态(可选,用于显示 skeleton 或 loading // 加载状态(可选,用于显示 skeleton 或 loading