1 Commits
SAP ... develop

Author SHA1 Message Date
aaa3994305 feat: 态势感知看板全量 mock 适配(page1+page2+page3 共 48 接口)
- 新增 src/mock/{page1,page2,page3,registry}.ts,按 URL 路由 13+10+25 个接口
- request.ts 在 proxyService 顶部加 mock 短路,命中直接返回本地假数据
- .env.development 新增 VITE_USE_MOCK='true',生产环境不设即默认关闭
- 业务代码(API、视图)零改动
2026-06-29 20:27:15 +08:00
6 changed files with 1061 additions and 1 deletions

View File

@@ -41,3 +41,6 @@ VITE_BASE_URL=/
VITE_AI_API_HOST = 'http://222.20.126.208:8087'
# 治理平台地址
VITE_GOVERNANCE_HOST = 'http://222.20.126.217:10010/governancePortal'
# 启用 mock 模式(内网不可达时使用本地假数据)
VITE_USE_MOCK = 'true'

203
src/mock/page1.ts Normal file
View File

@@ -0,0 +1,203 @@
/**
* 态势感知看板 - Tab1 (全球开源风险态势感知监控中心) Mock 数据
*
* 数据结构根据 src/views/Jyh/security/components/*.vue 反推所得。
* 返回完整的 axios 响应对象(不加密明文),与 request.ts 的 $Decrypt 逻辑兼容。
*/
import type { AxiosResponse } from 'axios';
const sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
const randomDelay = () => sleep(200 + Math.floor(Math.random() * 300));
function mockResp<T>(data: T, code = 200, msg = 'success'): AxiosResponse<{ code: number; msg: string; data: T }> {
return {
data: { code, msg, data },
status: 200,
statusText: 'OK',
headers: {},
config: {} as any
};
}
// 1. 顶部统计概览 - 4 个数字
export async function overviewData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp({
enterprise: 12480,
university: 326,
activity: 1879,
project: 56420
});
}
// 2. 实时情报检测 (alerts)
export async function mapAlerts(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ title: '高危漏洞通告', desc: 'Apache Log4j2 远程代码执行漏洞 (CVE-2024-XXXX) 复现' },
{ title: '僵尸网络活动', desc: 'Mirai 变种正在扫描 IoT 设备端口 23/2323' },
{ title: 'APT 组织活动', desc: 'OceanLotus 组织针对金融行业的钓鱼攻击激增' },
{ title: '勒索软件预警', desc: 'LockBit 3.0 新变种正在利用 Confluence 漏洞传播' },
{ title: '供应链风险', desc: 'PyPI 仓库发现伪装成流行库的恶意包' }
]);
}
// 3. 世界地图数据
export async function mapData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'China', value: 100 },
{ name: 'United States', value: 88 },
{ name: 'Russia', value: 72 },
{ name: 'India', value: 65 },
{ name: 'Germany', value: 58 },
{ name: 'United Kingdom', value: 52 },
{ name: 'Brazil', value: 45 },
{ name: 'Japan', value: 42 },
{ name: 'France', value: 38 },
{ name: 'Canada', value: 35 },
{ name: 'Australia', value: 28 },
{ name: 'South Korea', value: 25 }
]);
}
// 4. 漏洞类型分布 Top 5
export async function vulnStats(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'XSS 跨站脚本', value: 2840 },
{ name: 'SQL 注入', value: 2156 },
{ name: '权限绕过', value: 1832 },
{ name: '信息泄露', value: 1521 },
{ name: '远程代码执行', value: 1245 }
]);
}
// 5. 威胁情报地域排行
export async function regionStats(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '中国大陆', score: 98.5 },
{ name: '美国', score: 92.3 },
{ name: '俄罗斯', score: 87.1 },
{ name: '德国', score: 76.4 },
{ name: '英国', score: 71.2 },
{ name: '印度', score: 68.9 },
{ name: '巴西', score: 62.5 },
{ name: '日本', score: 58.7 },
{ name: '韩国', score: 54.3 },
{ name: '法国', score: 49.8 }
]);
}
// 6. 行业分布饼图
export async function industryDistribution(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '互联网/科技', value: 32 },
{ name: '金融', value: 21 },
{ name: '政府/事业单位', value: 15 },
{ name: '教育科研', value: 12 },
{ name: '医疗健康', value: 9 },
{ name: '制造业', value: 7 },
{ name: '其他', value: 4 }
]);
}
// 7. 高危组件 Top 10
export async function highRiskComponent(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'log4j-core', cvss: 10.0, vulnCount: 18, usage: '2.1M+', desc: 'Apache Log4j 核心库,远程代码执行高危' },
{ name: 'spring-core', cvss: 9.8, vulnCount: 24, usage: '4.5M+', desc: 'Spring 框架核心,权限绕过风险' },
{ name: 'openssl', cvss: 9.1, vulnCount: 32, usage: '1.8M+', desc: 'OpenSSL 加密库,心脏滴血类漏洞' },
{ name: 'struts2-core', cvss: 9.8, vulnCount: 15, usage: '380K+', desc: 'Apache Struts2 框架OGNL 注入' },
{ name: 'fastjson', cvss: 9.5, vulnCount: 12, usage: '920K+', desc: '阿里 JSON 库,反序列化漏洞' },
{ name: 'shiro-core', cvss: 9.0, vulnCount: 8, usage: '650K+', desc: 'Apache Shiro 安全框架,认证绕过' },
{ name: 'druid', cvss: 8.5, vulnCount: 6, usage: '1.2M+', desc: 'Druid 数据库连接池,配置不当风险' },
{ name: 'jquery', cvss: 7.5, vulnCount: 22, usage: '8.4M+', desc: 'jQuery 旧版本 XSS 漏洞' },
{ name: 'tomcat-embed-core', cvss: 8.1, vulnCount: 14, usage: '2.7M+', desc: '嵌入式 Tomcat安全默认配置' },
{ name: 'snakeyaml', cvss: 8.5, vulnCount: 5, usage: '1.5M+', desc: 'YAML 解析库,反序列化风险' }
]);
}
// 8. 情报流
export async function feedList(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ type: '漏洞', content: 'CVE-2024-38063: Windows TCP/IP 远程代码执行漏洞披露,影响所有 Windows 11/10 系统' },
{ type: '威胁', content: '新型勒索软件 Akira 针对中型企业发起攻击,已发现 200+ 受害组织' },
{ type: '漏洞', content: 'GitLab 紧急发布安全更新,修复多个高危权限提升漏洞' },
{ type: '预警', content: 'Node.js 18.x 系列将停止官方支持,建议升级到 20.x LTS' },
{ type: '漏洞', content: 'OpenSSH regreSSHion 漏洞 (CVE-2024-6387) 影响广泛,需立即修补' },
{ type: '威胁', content: '国家级 APT 组织 Lazarus 利用 DeFi 协议漏洞窃取加密货币' },
{ type: '事件', content: '某知名 CDN 服务商遭遇大规模 DDoS 攻击,峰值达 5.6 Tbps' }
]);
}
// 9 & 10. CVE 月度趋势 - 全球 / 区域
function genTrend(months = 12) {
const cveCount: number[] = [];
const acceleration: number[] = [];
let base = 1800;
for (let i = 0; i < months; i++) {
base += Math.floor(Math.random() * 200) - 50;
cveCount.push(base);
acceleration.push(Math.floor(Math.random() * 40) - 20);
}
return { cveCount, acceleration };
}
export async function cveDataGlobal(): Promise<AxiosResponse> {
await randomDelay();
return mockResp(genTrend());
}
export async function cveDataRegional(): Promise<AxiosResponse> {
await randomDelay();
return mockResp(genTrend());
}
// 11. 漏洞语言分布堆叠图
export async function languageTrend(): Promise<AxiosResponse> {
await randomDelay();
const years = ['2022', '2023', '2024'];
const langs = ['JavaScript', 'Python', 'Java', 'C++', 'Go', 'PHP'];
const data: { name: string; year: string; data: number }[] = [];
langs.forEach((lang) => {
years.forEach((year) => {
data.push({ name: lang, year, data: Math.floor(Math.random() * 800) + 200 });
});
});
return mockResp(data);
}
// 12. 漏洞等级分布 (按季度)
export async function vulnerabilitySeverity(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ quarter: '2024Q1', highRisk: 1245, mediumRisk: 3560, lowRisk: 8920 },
{ quarter: '2024Q2', highRisk: 1380, mediumRisk: 3920, lowRisk: 9450 },
{ quarter: '2024Q3', highRisk: 1520, mediumRisk: 4180, lowRisk: 10240 },
{ quarter: '2024Q4', highRisk: 1690, mediumRisk: 4520, lowRisk: 11100 }
]);
}
// 13. 编程语言安全态势散点图
export async function scatterData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ x: 85, y: 92, size: 80, name: 'JavaScript' },
{ x: 78, y: 88, size: 65, name: 'Python' },
{ x: 72, y: 85, size: 55, name: 'Java' },
{ x: 65, y: 78, size: 45, name: 'C++' },
{ x: 60, y: 82, size: 35, name: 'Go' },
{ x: 55, y: 70, size: 30, name: 'PHP' },
{ x: 80, y: 75, size: 50, name: 'TypeScript' },
{ x: 50, y: 68, size: 25, name: 'Ruby' },
{ x: 45, y: 72, size: 28, name: 'Rust' },
{ x: 70, y: 65, size: 38, name: 'C#' },
{ x: 40, y: 60, size: 20, name: 'Swift' },
{ x: 35, y: 55, size: 18, name: 'Kotlin' }
]);
}

261
src/mock/page2.ts Normal file
View File

@@ -0,0 +1,261 @@
/**
* 态势感知看板 - Tab2 (开源生态与贡献价值全景) Mock 数据
*
* 数据结构根据 src/views/Jyh/ecosystem/index.vue 与 components/*.vue 反推所得。
*/
import type { AxiosResponse } from 'axios';
const sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
const randomDelay = () => sleep(200 + Math.floor(Math.random() * 300));
function mockResp<T>(data: T, code = 200, msg = 'success'): AxiosResponse<{ code: number; msg: string; data: T }> {
return {
data: { code, msg, data },
status: 200,
statusText: 'OK',
headers: {},
config: {} as any
};
}
// 1. 顶部统计概览
export async function overviewData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp({
developer: 2000000, // 200 万
project: 3000000, // 300 万
company: 500,
valuation: 280000000000 // 2800 亿
});
}
// 2. 全球开源企业贡献榜 Top 30
export async function rawEnterpriseData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ 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' }
]);
}
// 3. 基础设施覆盖率
export async function infrastructure(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '镜像站规模', value: 85 },
{ name: '代码托管平台规模', value: 90 },
{ name: '构建平台活跃度', value: 40 }
]);
}
// 4. 高校开源社团
export async function universityClubs(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ university: '上海交通大学', club: 'SJTU-LUG (Linux User Group)' },
{ university: '上海交通大学', club: '开放原子开源俱乐部' },
{ university: '复旦大学', club: 'Fudan LUG' },
{ university: '复旦大学', club: '开放原子开源俱乐部' },
{ university: '浙江大学', club: 'ZJU-LUG' },
{ university: '浙江大学', club: 'AAA (Azure Availability Association)' },
{ university: '浙江大学', club: '开放原子开源俱乐部' },
{ university: '南京大学', club: 'NJU-LUG' },
{ university: '南京大学', club: 'eScience 协会' },
{ university: '南京大学', club: '开放原子开源俱乐部' },
{ university: '中国科学技术大学', club: 'USTC-LUG' },
{ university: '中国科学技术大学', club: 'VLAB' },
{ university: '同济大学', club: 'Tongji LUG' },
{ university: '同济大学', club: '开放原子开源俱乐部' },
{ university: '华东师范大学', club: 'ECNU LUG' },
{ university: '清华大学', club: 'TUNA (清华大学学生网络与开源软件协会)' },
{ university: '清华大学', club: '开放原子开源俱乐部' },
{ university: '北京大学', club: 'PKU-LUG' },
{ university: '北京大学', club: '开源软件协会' },
{ university: '中国人民大学', club: 'RUC 开源社' },
{ university: '北京航空航天大学', club: 'BUAA-LUG' },
{ university: '北京理工大学', club: 'BIT-LUG' },
{ university: '南开大学', club: 'NKU-LUG' },
{ university: '天津大学', club: 'TJU-LUG' },
{ university: '中山大学', club: 'SYSU-LUG' },
{ university: '华南理工大学', club: 'SCUT-LUG' },
{ university: '暨南大学', club: 'JNU-LUG' },
{ university: '深圳大学', club: 'SZU-LUG' },
{ university: '华南师范大学', club: 'SCNU-LUG' },
{ university: '华中科技大学', club: 'HUST-LUG' },
{ university: '华中科技大学', club: '开放原子开源俱乐部' },
{ university: '武汉大学', club: 'WHU-LUG' },
{ university: '武汉大学', club: '珞珈码农社' },
{ university: '中南大学', club: 'CSU-LUG' },
{ university: '山东大学', club: 'SDU-LUG' },
{ university: '厦门大学', club: 'XMU-LUG' }
]);
}
// 5. 社区治理健康度对比
export async function communityHealth(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ indicators: 'PR 合并率', github: 82, gitcode: 68 },
{ indicators: 'Issue 响应时间', github: 88, gitcode: 75 },
{ indicators: 'CI/CD 使用率', github: 78, gitcode: 55 },
{ indicators: '平均代码质量得分', github: 85, gitcode: 72 },
{ indicators: '安全审计频率', github: 75, gitcode: 60 },
{ indicators: '贡献者多样性', github: 80, gitcode: 65 }
]);
}
// 6. 语言与技术竞争 (组件按 name 字段过滤)
export async function languageTech(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'JavaScript', value: 61, growth: 0 },
{ name: 'Python', value: 57, growth: 0 },
{ name: 'HTML/CSS', value: 52, growth: 1.96 },
{ name: 'Java', value: 49, growth: 6.52 },
{ name: 'SQL', value: 47, growth: -2.08 },
{ name: 'Shell', value: 36, growth: 0 },
{ name: 'TypeScript', value: 42, growth: 13.51 },
{ name: 'C++', value: 25, growth: 0 },
{ name: 'C#', value: 21, growth: -4.55 },
{ name: 'Go', value: 20, growth: 11.11 },
{ name: 'Kotlin', value: 18, growth: 28.57 },
{ name: 'C', value: 18, growth: 0 }
]);
}
// 7. 明星开发者 Top 18
export async function excellentDeveloper(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '稚晖', description: 'TOP 1', org: 'Shanghai', followers: 82738, avatar: 'https://github.com/peng-zhihui.png' },
{ name: 'Crypto Michael', description: 'TOP 2', org: 'Beijing, China', followers: 37622, avatar: 'https://github.com/michaelliao.png' },
{ name: '代码家', description: 'TOP 3', org: 'Beijing, China', followers: 24743, avatar: 'https://github.com/daimajia.png' },
{ name: 'Jackson Tian', description: 'TOP 4', org: 'Hangzhou, China', followers: 21267, avatar: 'https://github.com/JacksonTian.png' },
{ name: '云风', description: 'TOP 5', org: 'China', followers: 21192, avatar: 'https://github.com/cloudwu.png' },
{ name: 'Fengda Huang', description: 'TOP 6', org: 'Shanghai / Hangzhou', followers: 20229, avatar: 'https://github.com/phodal.png' },
{ name: '程序员鱼皮', description: 'TOP 7', org: 'Shanghai', followers: 18461, avatar: 'https://github.com/liyupi.png' },
{ name: 'Trinea', description: 'TOP 8', org: 'HangZhou', followers: 17019, avatar: 'https://github.com/Trinea.png' },
{ name: 'lifesinger', description: 'TOP 9', org: 'Hangzhou, China', followers: 15894, avatar: 'https://github.com/lifesinger.png' },
{ name: 'stormzhang', description: 'TOP 10', org: 'Shanghai, China', followers: 15889, avatar: 'https://github.com/stormzhang.png' },
{ name: 'Wenli Zhang', description: 'TOP 11', org: 'Shanghai, China', followers: 15680, avatar: 'https://github.com/Ovilia.png' },
{ name: 'Wei Wang', description: 'TOP 12', org: 'Yokohama / China', followers: 15532, avatar: 'https://github.com/onevcat.png' },
{ name: 'astaxie', description: 'TOP 13', org: 'Shanghai, China', followers: 15022, avatar: 'https://github.com/astaxie.png' },
{ name: '司徒正美', description: 'TOP 14', org: 'China', followers: 14742, avatar: 'https://github.com/RubyLouvre.png' },
{ name: '云谦', description: 'TOP 15', org: 'HangZhou, China', followers: 14466, avatar: 'https://github.com/sorrycc.png' },
{ name: 'cangdu', description: 'TOP 16', org: 'Shanghai, China', followers: 13728, avatar: 'https://github.com/bailicangdu.png' },
{ name: 'Huang Haiguang', description: 'TOP 17', org: 'Qingdao, China', followers: 13422, avatar: 'https://github.com/fengdu78.png' },
{ name: '花裤衩', description: 'TOP 18', org: 'Shanghai, China', followers: 13236, avatar: 'https://github.com/PanJiaChen.png' }
]);
}
// 8. 开发者活力波形图
export async function vitalityData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ timeData: '2014', total: 20 },
{ timeData: '2015', total: 50 },
{ timeData: '2016', total: 100 },
{ timeData: '2017', total: 200 },
{ timeData: '2018', total: 300 },
{ timeData: '2019', total: 400 },
{ timeData: '2020', total: 600 },
{ timeData: '2021', total: 800 },
{ timeData: '2022', total: 1000 },
{ timeData: '2023', total: 1200 },
{ timeData: '2024', total: 1350 }
]);
}
// 9. 开源项目热力图
export async function projectHeatmap(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ openrank: 67538.71, repo: 29433, developer: 1409, project: 'OpenHarmony', org: 'Huawei' },
{ openrank: 55000, repo: 15000, developer: 6000, project: 'Linux', org: 'Linux Foundation' },
{ openrank: 60000, repo: 8000, developer: 7000, project: 'Android', org: 'Google' },
{ openrank: 52000, repo: 20000, developer: 5500, project: 'Chromium', org: 'Google' },
{ openrank: 38000, repo: 16000, developer: 4500, project: 'TensorFlow', org: 'Google' },
{ openrank: 42000, repo: 13000, developer: 5000, project: 'React', org: 'Meta' },
{ openrank: 45417.67, repo: 18000, developer: 8629, project: 'Azure', org: 'Microsoft' },
{ openrank: 35000, repo: 22000, developer: 5000, project: 'Kubernetes', org: 'CNCF' },
{ openrank: 21844.62, repo: 12340, developer: 57, project: 'LLM', org: '发芽工具' },
{ openrank: 25241.13, repo: 8000, developer: 83, project: 'NixOS', org: '-' },
{ openrank: 22961.09, repo: 4500, developer: 9377, project: 'openEuler', org: 'Huawei' },
{ openrank: 17795.41, repo: 2792, developer: 975, project: 'DataDog', org: 'DataDog' },
{ openrank: 25598.21, repo: 2082, developer: 282, project: '.Net', org: '操作系统' },
{ openrank: 7405.46, repo: 9639, developer: 3, project: 'Expensify', org: 'Expensify' },
{ openrank: 8862.2, repo: 4625, developer: 120, project: 'PaddlePaddle', org: 'Baidu' },
{ openrank: 12959.59, repo: 2363, developer: 1, project: 'Odoo', org: 'Odoo' },
{ openrank: 12326.76, repo: 881, developer: 179, project: 'Rust', org: 'Rust Foundation' },
{ openrank: 6778.7, repo: 400, developer: 479, project: 'CloudHarmony', org: '企业应用' }
]);
}
// 10. 中国开源人才密度地图
export async function talentMapData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '北京市', density: 141.15, total: 231.47 },
{ name: '上海市', density: 269.83, total: 169.99 },
{ name: '浙江省', density: 8.94, total: 90.98 },
{ name: '广东省', density: 7.5, total: 149.76 },
{ name: '台湾省', density: 32.75, total: 117.88 },
{ name: '四川省', density: 1.01, total: 48.7 },
{ name: '江苏省', density: 5.25, total: 56.28 },
{ name: '湖北省', density: 1.84, total: 34.09 },
{ name: '福建省', density: 1.39, total: 16.79 },
{ name: '陕西省', density: 1.04, total: 21.38 },
{ name: '重庆市', density: 1.61, total: 13.24 },
{ name: '山东省', density: 1.02, total: 16.02 },
{ name: '湖南省', density: 0.68, total: 14.25 },
{ name: '安徽省', density: 0.93, total: 12.92 },
{ name: '辽宁省', density: 0.77, total: 11.37 },
{ name: '云南省', density: 0.1, total: 3.68 },
{ name: '天津市', density: 7.79, total: 9.34 },
{ name: '河南省', density: 0.55, total: 9.07 },
{ name: '吉林省', density: 0.15, total: 2.7 },
{ name: '江西省', density: 0.25, total: 4.17 },
{ name: '广西壮族自治区', density: 0.14, total: 3.15 },
{ name: '黑龙江省', density: 0.11, total: 5.13 },
{ name: '澳门特别行政区', density: 737.5, total: 2.36 },
{ name: '河北省', density: 0.26, total: 4.74 },
{ name: '山西省', density: 0.25, total: 3.78 },
{ name: '贵州省', density: 0.11, total: 1.93 },
{ name: '内蒙古自治区', density: 0.01, total: 0.96 },
{ name: '香港特别行政区', density: 1797.7, total: 197.75 },
{ name: '新疆维吾尔自治区', density: 0.01, total: 0.77 },
{ name: '甘肃省', density: 0.04, total: 1.46 },
{ name: '海南省', density: 0.36, total: 1.25 },
{ name: '宁夏回族自治区', density: 0, total: 0.5 },
{ name: '西藏自治区', density: 0, total: 0.3 },
{ name: '青海省', density: 0, total: 0.4 }
]);
}

491
src/mock/page3.ts Normal file
View File

@@ -0,0 +1,491 @@
/**
* 态势感知看板 - Tab3 (武汉市开源生态建设) Mock 数据
*
* 数据结构根据 src/views/Jyh/Community/{index.vue, components/*.vue} 反推所得。
* 包含 25 个 page3 接口2 个 statsBar、11 个 HarmonyEco 子图、12 个 index.vue 主图表。
*/
import type { AxiosResponse } from 'axios';
const sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
const randomDelay = () => sleep(200 + Math.floor(Math.random() * 300));
function mockResp<T>(data: T, code = 200, msg = 'success'): AxiosResponse<{ code: number; msg: string; data: T }> {
return {
data: { code, msg, data },
status: 200,
statusText: 'OK',
headers: {},
config: {} as any
};
}
// ============================================================
// A. StatsBar (顶部统计概览)
// ============================================================
// 1. 武汉开源统计
export async function statsBar(): Promise<AxiosResponse> {
await randomDelay();
return mockResp({
developer: 700000, // 70万
community: 12,
company: 150,
project: 500
});
}
// 2. 鸿蒙统计
export async function hmStatsBar(): Promise<AxiosResponse> {
await randomDelay();
return mockResp({
developer: 100, // 1000万
certificationDeveloper: 600, // 60万
wuhanCertificationDeveloper: 1, // 1万
project: 728,
company: 600
});
}
// ============================================================
// B. HarmonyEcoCharts (鸿蒙生态可视化)
// ============================================================
// 3. 鸿蒙项目城市分布
export async function hmCityData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '广东', value: 185 },
{ name: '北京', value: 95 },
{ name: '上海', value: 88 },
{ name: '江苏', value: 70 },
{ name: '浙江', value: 52 },
{ name: '湖北', value: 38 },
{ name: '四川', value: 32 },
{ name: '福建', value: 30 },
{ name: '陕西', value: 28 },
{ name: '山东', value: 24 }
]);
}
// 4. 鸿蒙开源项目 Top 10
export async function hmProjects(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'OpenHarmony', link: 'https://github.com/openharmony', stars: '14.6k+', company: '开放原子开源基金会' },
{ name: 'awesome-harmony', link: 'https://github.com/Wscats/awesome-harmony', stars: '3.1k+', company: '社区维护' },
{ name: 'ohos-rs', link: 'https://github.com/ohos-rs/ohos-rs', stars: '1.2k+', company: 'Rust鸿蒙生态' },
{ name: 'OpenHarmony (fenwii)', link: 'https://github.com/fenwii/OpenHarmony', stars: '920+', company: '分微科技' },
{ name: 'ohos-rust-demo', link: 'https://github.com/jschwe/ohos-rust-demo', stars: '380+', company: '社区/个人' },
{ name: 'kelivo', link: 'https://github.com/Chevey339/kelivo', stars: '270+', company: '社区/个人' },
{ name: 'openharmony-rs', link: 'https://github.com/openharmony-rs', stars: '220+', company: 'openharmony-rs组织' },
{ name: 'harmonyos-next-samples', link: 'https://github.com/harmonyos-next-samples', stars: '190+', company: 'NEXT生态社区' },
{ name: 'ohos-sdk', link: 'https://github.com/openharmony-rs/ohos-sdk', stars: '150+', company: 'openharmony-rs组织' },
{ name: 'arkui-rs', link: 'https://github.com/openharmony-rs/arkui-rs', stars: '120+', company: 'openharmony-rs组织' }
]);
}
// 5. 武汉鸿蒙项目 Top 10
export async function whProjects(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'docs', desc: 'OpenHarmony官方文档与指南', stars: '498', company: '中科创达' },
{ name: 'xts_acts', desc: '应用兼容性测试套件(ACTS)', stars: '293', company: '润开鸿' },
{ name: '黄鹤开源技术社区应用', desc: '基于OpenHarmony的社区APP', stars: '191', company: '坚果派' },
{ name: 'manifest', desc: '系统版本与仓库清单管理', stars: '93', company: '中科创达' },
{ name: 'communication_bluetooth', desc: '蓝牙通信子系统适配', stars: '55', company: '普华基础软件' },
{ name: 'vendor_osware', desc: '普华厂商适配层组件', stars: '31', company: '普华基础软件' },
{ name: 'device_soc_nxp', desc: 'NXP系列芯片SoC适配', stars: '15', company: '普华基础软件' },
{ name: 'device_hihope', desc: 'HiHope开发板设备适配', stars: '8', company: '润开鸿' },
{ name: 'device_soc_hisilicon', desc: '海思芯片SoC底层适配', stars: '8', company: '润开鸿' },
{ name: 'kernel_linux_patches', desc: 'Linux内核差异化补丁集', stars: '7', company: '润开鸿' }
]);
}
// 6. 鸿蒙开发者贡献榜 Top 20
export async function hmDevelopers(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'ar*******o', employer: '华为', added: 1348180, deleted: 11022, score: 1359202 },
{ name: 'gu****o', employer: '华为', added: 892199, deleted: 466304, score: 1358503 },
{ name: 'wa***i', employer: '深开鸿', added: 1074812, deleted: 216511, score: 1291323 },
{ name: 'ze****1', employer: '华为', added: 718467, deleted: 452733, score: 1171200 },
{ name: 'wa*****2', employer: '华为', added: 831282, deleted: 249505, score: 1080787 },
{ name: 'wu****g', employer: '华为', added: 648545, deleted: 336836, score: 985381 },
{ name: 'zh*****7', employer: '华为', added: 680056, deleted: 151257, score: 831313 },
{ name: 'zh******5', employer: '开鸿智谷', added: 812520, deleted: 9929, score: 822449 },
{ name: 'zh******7', employer: '华为', added: 492068, deleted: 270411, score: 762479 },
{ name: 'ta*****n', employer: '润开鸿', added: 531640, deleted: 136900, score: 668540 },
{ name: 'an*****i', employer: '华为', added: 429272, deleted: 226777, score: 656049 },
{ name: 'do***i', employer: '深开鸿', added: 502956, deleted: 139366, score: 642322 },
{ name: 'zh****7', employer: '华为', added: 479092, deleted: 159437, score: 638529 },
{ name: 'ne****g', employer: '华为', added: 67272, deleted: 569087, score: 636359 },
{ name: 'ta******1', employer: '华为', added: 630294, deleted: 1861, score: 632155 },
{ name: 'wa*****1', employer: '华为', added: 620905, deleted: 11220, score: 632125 },
{ name: 'xi****3', employer: '华为', added: 498998, deleted: 119428, score: 618426 },
{ name: 'ba****g', employer: '深开鸿', added: 498481, deleted: 46544, score: 545025 },
{ name: 'zh******1', employer: '华为', added: 378416, deleted: 144456, score: 522872 },
{ name: 'ch****0', employer: '华为', added: 498437, deleted: 17953, score: 516390 }
]);
}
// 7. 鸿蒙开发者地域分布
export async function hmDevCityData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '其他地区', value: 25.7 },
{ name: '北京', value: 17 },
{ name: '广东', value: 12 },
{ name: '河北', value: 8.3 },
{ name: '上海', value: 7.2 },
{ name: '浙江', value: 5.6 },
{ name: '山东', value: 5.1 },
{ name: '江苏', value: 4.6 },
{ name: '湖南', value: 4.3 },
{ name: '福建', value: 3.5 },
{ name: '河南', value: 3.4 },
{ name: '湖北', value: 3.3 }
]);
}
// 8. 武汉鸿蒙开发者贡献榜 Top 10
export async function whHmDevelopers(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'yang_hongliang', employer: '润开鸿', added: 168982, deleted: 84294, score: 253276 },
{ name: 'tang_lizhen', employer: '润开鸿', added: 137344, deleted: 25345, score: 162689 },
{ name: 'shilei-hihope', employer: '润开鸿', added: 28144, deleted: 1611, score: 29755 },
{ name: 'zhangtao', employer: '润开鸿', added: 22998, deleted: 0, score: 22998 },
{ name: 'zhaoox0502', employer: '普华/中科创达', added: 37126, deleted: 2235, score: 39361 },
{ name: 'lian_zhian', employer: '润开鸿', added: 17382, deleted: 1708, score: 19090 },
{ name: 'XuejianZhang', employer: '普华/中科创达', added: 17604, deleted: 344, score: 17948 },
{ name: 'zhao_haipeng', employer: '润开鸿', added: 14145, deleted: 2576, score: 16721 },
{ name: 'yanghongliang', employer: '润开鸿', added: 10016, deleted: 78, score: 10094 },
{ name: 'wangzx0705', employer: '普华/中科创达', added: 5810, deleted: 1356, score: 7166 }
]);
}
// 9. 开源企业城市分布
export async function hmEnterpriseCityData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '广东', value: 133 },
{ name: '北京', value: 72 },
{ name: '上海', value: 65 },
{ name: '江苏', value: 55 },
{ name: '浙江', value: 42 },
{ name: '湖北', value: 30 },
{ name: '四川', value: 28 },
{ name: '福建', value: 25 },
{ name: '陕西', value: 22 },
{ name: '山东', value: 20 }
]);
}
// 10. 开源企业贡献榜
export async function hmEnterprises(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '华为技术有限公司', city: '深圳', business: '鸿蒙系统核心开发与生态建设', remark: '鸿蒙发起者' },
{ name: '深圳开鸿数字产业发展有限公司', city: '深圳', business: 'OpenHarmony 数字化底座研发', remark: '核心共建单位' },
{ name: '湖南开鸿智谷数字产业发展有限公司', city: '长沙', business: '鸿蒙操作系统南北向全栈研发', remark: '拓维信息子公司' },
{ name: '江苏润开鸿数字科技有限公司', city: '南京', business: '电鸿及各行业 OpenHarmony 物联网终端', remark: '润和软件子公司' },
{ name: '软通动力信息技术(集团)股份有限公司', city: '北京', business: '鸿蒙 IT 服务与软硬一体化解决方案', remark: '核心合作伙伴' },
{ name: '广东九联开鸿科技发展有限公司', city: '惠州', business: '鸿蒙智能硬件与电力行业解决方案', remark: '九联科技子公司' },
{ name: '鼎桥通信技术有限公司', city: '成都', business: '基于鸿蒙系统的行业定制化终端', remark: '安全终端提供商' },
{ name: '中软国际有限公司', city: '北京', business: '鸿蒙应用开发与全栈服务', remark: '重要参与者' },
{ name: '泰凌微电子(上海)股份有限公司', city: '上海', business: '低功耗无线 IoT 芯片鸿蒙适配', remark: '芯片级合作伙伴' },
{ name: '深圳市汇顶科技股份有限公司', city: '深圳', business: '鸿蒙生态传感与控制芯片研发', remark: '硬件生态伙伴' }
]);
}
// 11. 武汉企业贡献榜
export async function whEnterprises(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '中软国际(武汉)', city: '武汉', business: '开源鸿蒙核心代码贡献、商业发行版研发', remark: 'OpenHarmony创始成员、A类捐赠人' },
{ name: '软通动力(武汉)', city: '武汉', business: '开源鸿蒙操作系统研发、全球化适配', remark: '白金捐赠人、生态人才培养核心方' },
{ name: '深开鸿(武汉)', city: '武汉', business: '开源鸿蒙工业互联方案研发、代码贡献', remark: '底层代码核心贡献企业' },
{ name: '华为(武汉研究所)', city: '武汉', business: '鸿蒙底层技术研发、本地生态赋能', remark: '鸿蒙生态核心技术源头' },
{ name: '烽火通信', city: '武汉', business: '鸿蒙智慧城市/光通信设备适配', remark: '武汉本地龙头、标准制定牵头方' },
{ name: '武汉虹信技术服务有限责任公司', city: '武汉', business: '鸿蒙通信设备运维、应急调度平台研发', remark: '通信领域鸿蒙适配核心企业' },
{ name: '润开鸿(武汉研发中心)', city: '武汉', business: '鸿蒙工业物联网方案、轻量化部署研发', remark: '工业互联鸿蒙应用核心方' },
{ name: '中科创达(武汉)', city: '武汉', business: '鸿蒙智能终端适配、测试工具研发', remark: '应用层适配核心企业' },
{ name: '九联科技(武汉分公司)', city: '武汉', business: '鸿蒙智能终端本地化适配、部署服务', remark: '区域终端适配落地方' },
{ name: '普华基础软件', city: '武汉', business: '鸿蒙与Linux系统兼容接口研发', remark: '基础软件兼容适配企业' }
]);
}
// 12. 中国高校鸿蒙贡献分布
export async function uniCityData(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '北邮', value: 52 },
{ name: '浙大', value: 16 },
{ name: '华科', value: 12 },
{ name: '北理工', value: 10 },
{ name: '中科大', value: 10 },
{ name: '上交大', value: 4 },
{ name: '北大', value: 3 },
{ name: '西安建大', value: 2 },
{ name: '南大', value: 2 },
{ name: '哈工大', value: 2 },
{ name: '东南大学', value: 2 },
{ name: '暨大', value: 1 },
{ name: '武理工', value: 1 },
{ name: '中山大学', value: 1 },
{ name: '北航', value: 1 },
{ name: '华南理工', value: 1 },
{ name: '人大', value: 1 },
{ name: '深大', value: 1 },
{ name: '西电', value: 1 },
{ name: '南理工', value: 1 },
{ name: '云大', value: 1 },
{ name: '广工', value: 1 },
{ name: '复旦', value: 1 },
{ name: '中南大学', value: 1 },
{ name: '清华', value: 1 },
{ name: '东北大学', value: 1 }
]);
}
// 13. 湖北高校鸿蒙贡献者 Top 12
export async function uniContributors(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ authorName: 'd00887893', project: 'arkcompiler_ets_frontend', branch: 'master', repo: 'communication_nfc', authorEmail: 're****g@whut.edu.cn', detailMessage: 'Add SDK test cases Issue: I9CRGH', additions: 664, deletions: 97, changeNum: 761, rollbackCount: 0, university: '武汉理工大学', contributionScore: 845.3 },
{ authorName: 'Jiefeng Li', project: 'openharmony', branch: 'master', repo: 'docs', authorEmail: 'ji****i@hust.edu.cn', detailMessage: 'fix typo', additions: 116, deletions: 116, changeNum: 232, rollbackCount: 0, university: '华中科技大学', contributionScore: 197.2 },
{ authorName: '"景涛"', project: 'openharmony', branch: 'master', repo: 'kernel_liteos_a', authorEmail: 'ji****3@hust.edu.cn', detailMessage: 'fix some typo errors', additions: 17, deletions: 17, changeNum: 34, rollbackCount: 0, university: '华中科技大学', contributionScore: 28.9 },
{ authorName: 'Zian', project: 'openharmony', branch: 'master', repo: 'drivers_peripheral', authorEmail: 'u2****5@hust.edu.cn', detailMessage: 'fix NULL pointer problem caused by function HdfRemoteServiceWriteInterfaceToken()', additions: 10, deletions: 9, changeNum: 19, rollbackCount: 0, university: '华中科技大学', contributionScore: 16.5 },
{ authorName: 'fly1ngpengu1ns', project: 'openharmony', branch: 'master', repo: 'drivers_hdf_core', authorEmail: 'pe****n@hust.edu.cn', detailMessage: 'fix: fix the fault handler when ctrl_hdlr is NULL', additions: 6, deletions: 5, changeNum: 11, rollbackCount: 0, university: '华中科技大学', contributionScore: 9.7 },
{ authorName: 'phd', project: 'openharmony', branch: 'master', repo: 'drivers_hdf_core', authorEmail: 'm2****8@hust.edu.cn', detailMessage: 'fix:An exception when queue is NULL', additions: 5, deletions: 5, changeNum: 10, rollbackCount: 0, university: '华中科技大学', contributionScore: 8.5 },
{ authorName: '辛哲麒', project: 'openharmony', branch: 'master', repo: 'communication_nfc', authorEmail: 'xi****i@hust.edu.cn', detailMessage: 'fix:context maybe nullptr', additions: 3, deletions: 3, changeNum: 6, rollbackCount: 0, university: '华中科技大学', contributionScore: 5.1 },
{ authorName: 'Ruibo Lu', project: 'openharmony', branch: 'master', repo: 'update_packaging_tools', authorEmail: 're****u@hust.edu.cn', detailMessage: '[fix]: fix indent in blocks_manager.py', additions: 1, deletions: 1, changeNum: 2, rollbackCount: 0, university: '华中科技大学', contributionScore: 1.7 },
{ authorName: 'Zian', project: 'openharmony', branch: 'master', repo: 'drivers_peripheral', authorEmail: 'u2****5@hust.edu.cn', detailMessage: 'fix:NULL pointer reference caused by variable hwAdapter', additions: 1, deletions: 1, changeNum: 2, rollbackCount: 0, university: '华中科技大学', contributionScore: 1.7 },
{ authorName: 'xy420', project: 'openharmony', branch: 'master', repo: 'communication_dsoftbus', authorEmail: 'ch*****g@hust.edu.cn', detailMessage: 'update tests/sdk/transmission/fuzztest/rawstreamdata_fuzzer/rawstreamdata_fuzzer.cpp', additions: 1, deletions: 1, changeNum: 2, rollbackCount: 0, university: '华中科技大学', contributionScore: 1.7 },
{ authorName: '辛哲麒', project: 'openharmony', branch: 'master', repo: 'distributeddatamgr_datamgr_service', authorEmail: 'xi****i@hust.edu.cn', detailMessage: 'update services/distributeddataservice/service/directory/src/directory_manager.cpp', additions: 1, deletions: 1, changeNum: 2, rollbackCount: 0, university: '华中科技大学', contributionScore: 1.7 }
]);
}
// ============================================================
// C. index.vue (主图表区)
// ============================================================
// 14. 武汉优质 GitHub 开源项目 Top 20
export async function wuhanGithubProjects(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'halo-dev/halo', desc: '强大易用的开源建站工具', stars: 34200 },
{ name: 'whyour/qinglong', desc: '支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台', stars: 16800 },
{ name: 'ehang-io/nps', desc: '一款轻量级、高性能、功能强大的内网穿透代理服务器', stars: 29500 },
{ name: 'cloudreve/Cloudreve', desc: '支持多家云存储的云盘系统', stars: 18700 },
{ name: 'dromara/Sa-Token', desc: '一个轻量级 Java 权限认证框架', stars: 16400 },
{ name: 'macrozheng/mall-learning', desc: 'mall学习教程架构、业务、技术要点全方位解析', stars: 12400 },
{ name: 'zerotier/ZT', desc: 'A smart Ethernet switch for planet Earth', stars: 8900 },
{ name: 'wgpsec/DBJ', desc: '大宝剑-信息收集工具', stars: 6500 },
{ name: 'dromara/lamp-cloud', desc: '微服务脚手架', stars: 4600 },
{ name: 'kekingcn/kkFileView', desc: '基于 Spring-Boot 的文件在线预览解决方案', stars: 9800 },
{ name: 'OpenTSDB/asynchbase', desc: 'A fully asynchronous HBase client, based on HBase 1.x', stars: 2100 },
{ name: 'opengoofy/hippo4j', desc: '强大的动态线程池框架', stars: 5400 },
{ name: 'axetroy/smzdm_script', desc: '什么值得买每日签到脚本', stars: 1800 },
{ name: 'mikemintang/awesome-github-wechat-weapp', desc: '微信小程序开源项目汇总', stars: 14200 },
{ name: 'Semporia/Semporia.github.io', desc: '博客', stars: 3200 },
{ name: 'JavaGuide', desc: 'Java 学习&面试指南', stars: 153000 },
{ name: 'cpython', desc: 'The Python programming language', stars: 71000 },
{ name: 'core', desc: 'Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.', stars: 52700 },
{ name: 'bevy', desc: 'A refreshingly simple data-driven game engine built in Rust', stars: 43900 },
{ name: 'linux-insides', desc: 'A book-in-progress about the Linux kernel and its insides.', stars: 31700 }
]);
}
// 15. 中国城市开源项目数量
export async function cityProject(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '北京', data: 757259 },
{ name: '上海', data: 678614 },
{ name: '深圳', data: 343417 },
{ name: '杭州', data: 315406 },
{ name: '广州', data: 177003 },
{ name: '成都', data: 168300 },
{ name: '武汉', data: 120827 },
{ name: '南京', data: 111593 },
{ name: '西安', data: 58678 },
{ name: '重庆', data: 56564 }
]);
}
// 16. 城市开源人才数量
export async function talent(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '北京', number: 2115924 },
{ name: '上海', number: 1591988 },
{ name: '广州', number: 1555240 },
{ name: '深圳', number: 1163580 },
{ name: '成都', number: 894108 },
{ name: '杭州', number: 830306 },
{ name: '武汉', number: 791335 },
{ name: '南京', number: 733581 },
{ name: '郑州', number: 553397 },
{ name: '长沙', number: 487971 }
]);
}
// 17. 城市社区数量排行
export async function communityRankChart(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '北京', value: 69 },
{ name: '深圳', value: 35 },
{ name: '上海', value: 31 },
{ name: '杭州', value: 25 },
{ name: '广州', value: 18 },
{ name: '成都', value: 15 },
{ name: '南京', value: 12 },
{ name: '武汉', value: 12 }
]);
}
// 18. 2024 武汉优秀开源项目 Top 10
export async function chinaExcellentProjects(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: 'Deepin 深度操作系统', desc: '国内领先的国产 Linux 发行版,旨在为全球用户提供美观易用、安全可靠的操作系统体验,是国产软件生态的核心。', org: '武汉深之度' },
{ name: 'Jupiter 微服务治理框架', desc: '由斗鱼研发并开源的面向治理的微服务框架,支持多数据源、多注册中心,适用于高并发场景。', org: '武汉斗鱼' },
{ name: 'RustSBI 安全引导程序', desc: '基于 Rust 语言开发的 RISC-V 指令集体系结构安全引导程序,提供更高内存安全性。', org: '华中科技大学' },
{ name: '芯片开源 EDA 研发', desc: '致力于国产电子设计自动化工具开源化,解决芯片设计环节中的关键技术难题。', org: '华中科技大学' },
{ name: 'LuoJiaSET 框架与 LuoJiaSET 样本库', desc: '专注于智能遥感影像解译,提供海量遥感样本数据集和深度学习框架。', org: '武汉大学' },
{ name: '鲲鹏安全库 (Kunpengsecl)', desc: '基于鲲鹏处理器的机密计算和受信任执行环境安全开发库,支撑云计算与隐私计算。', org: '武汉大学' },
{ name: '柚坛工具箱 (Uotan Toolbox)', desc: '针对 Android 发烧友开发的图形化综合工具箱,集成刷机、系统优化等多种功能。', org: '武昌理工学院' },
{ name: '凹语言 (Wa Language)', desc: '国内首个针对 WebAssembly 设计的通用编程语言,兼具 Web 灵活性与原生运行速度。', org: '武汉凹语言' },
{ name: 'OpenHIS 开源医疗系统', desc: '开源的医院信息系统,旨在通过标准化、模块化方式赋能基层医疗机构数字化升级。', org: '武汉新致新源' },
{ name: 'NextDenovo', desc: '高效且精确的长读长序列纠错和组装工具,主要用于基因组测序领域。', org: '武汉希望组生物科技有限公司' }
]);
}
// 19. 2025 武汉优秀开源项目 Top 10
export async function excellentProjects(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '调问DWSurvey', desc: '开源问卷表单系统', org: '极推科技' },
{ name: 'Eova', desc: '低代码开发平台', org: '武汉简码' },
{ name: 'ClickVisual', desc: '可视化日志分析告警平台', org: '武汉初心' },
{ name: 'Meta2d.js', desc: '2D图元可视化引擎', org: '乐吾乐科技' },
{ name: 'Juno', desc: '分布式微服务管理系统', org: '武汉斗鱼' },
{ name: 'Opentalent', desc: '开源人才评价系统', org: '湖北大学' },
{ name: 'Fountain', desc: '仓颉语言版 Spring 框架替代', org: '江汉大学' },
{ name: 'deepin', desc: '深度桌面操作系统', org: '深之度' },
{ name: 'RustSBI', desc: 'RISC-V 安全引导程序', org: '华中科技大学' },
{ name: 'NextDenovo', desc: '长读长序列组装工具', org: '武汉希望组' }
]);
}
// 20. 武汉明星开发者 Top 10
export async function developerNames(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '白纯骢' },
{ name: '陆红旭' },
{ name: '慕冬亮' },
{ name: '张继德' },
{ name: '蒋周奇' },
{ name: '张天雄' },
{ name: '阮文俊' },
{ name: '李奇' },
{ name: '陈鹏轩' },
{ name: '杨帆' }
]);
}
// 21. 武汉知名开源社区
export async function wuhanCommunities(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ 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: '开源技术兴趣小组' }
]);
}
// 22. 重点城市高校开源社团数量
export async function club(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '成都', number: 10 },
{ name: '北京', number: 7 },
{ name: '上海', number: 5 },
{ name: '武汉', number: 4 },
{ name: '重庆', number: 3 },
{ name: '深圳', number: 2 },
{ name: '苏州', number: 2 },
{ name: '杭州', number: 2 },
{ name: '合肥', number: 2 },
{ name: '青岛', number: 2 }
]);
}
// 23. 各省市开源相关政策数量
export async function policy(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '江苏', number: 11 },
{ name: '北京', number: 7 },
{ name: '浙江', number: 3 },
{ name: '广东', number: 3 },
{ name: '上海', number: 3 },
{ name: '湖北', number: 2 },
{ name: '天津', number: 2 },
{ name: '陕西', number: 2 },
{ name: '河南', number: 2 },
{ name: '云南', number: 2 }
]);
}
// 24. 开放原子校园行·城市活动场次
export async function campus(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '南京', number: 20 },
{ name: '武汉', number: 16 },
{ name: '北京', number: 16 },
{ name: '长沙', number: 16 },
{ name: '成都', number: 11 },
{ name: '上海', number: 10 },
{ name: '天津', number: 8 },
{ name: '深圳', number: 8 },
{ name: '济南', number: 7 },
{ name: '广州', number: 6 }
]);
}
// 25. 全国重点城市开源镜像站/节点数量对比
export async function mirrors(): Promise<AxiosResponse> {
await randomDelay();
return mockResp([
{ name: '上海', number: 4 },
{ name: '北京', number: 4 },
{ name: '西安', number: 2 },
{ name: '重庆', number: 2 },
{ name: '济南', number: 2 },
{ name: '南京', number: 2 },
{ name: '武汉', number: 1 },
{ name: '合肥', number: 1 },
{ name: '香港', number: 1 },
{ name: '长春', number: 1 },
{ name: '成都', number: 1 },
{ name: '深圳', number: 1 },
{ name: '兰州', number: 1 },
{ name: '哈尔滨', number: 1 },
{ name: '南阳', number: 1 },
{ name: '杭州', number: 1 }
]);
}

92
src/mock/registry.ts Normal file
View File

@@ -0,0 +1,92 @@
/**
* Mock 路由注册表
*
* 根据请求 URL 匹配对应的 mock handler匹配命中时短路掉 axios 直接返回假数据。
* 当前覆盖 /api/v1/page1/* 13 个 + /api/v1/page2/* 10 个接口。
*/
import type { AxiosRequestConfig, AxiosResponse } from 'axios';
import * as page1 from './page1';
import * as page2 from './page2';
import * as page3 from './page3';
type MockHandler = (params?: any, data?: any) => Promise<AxiosResponse>;
/** 精确匹配优先,模糊匹配兜底(处理带 query 的 URL */
const registry: Record<string, MockHandler> = {
'/api/v1/page1/overviewData': page1.overviewData,
'/api/v1/page1/map/alerts': page1.mapAlerts,
'/api/v1/page1/map/mapData': page1.mapData,
'/api/v1/page1/map/vulnStats': page1.vulnStats,
'/api/v1/page1/map/regionStats': page1.regionStats,
'/api/v1/page1/industryDistribution': page1.industryDistribution,
'/api/v1/page1/highRiskComponent': page1.highRiskComponent,
'/api/v1/page1/feedList': page1.feedList,
'/api/v1/page1/cveData/global': page1.cveDataGlobal,
'/api/v1/page1/cveData/regional': page1.cveDataRegional,
'/api/v1/page1/languageTrend': page1.languageTrend,
'/api/v1/page1/vulnerabilitySeverity': page1.vulnerabilitySeverity,
'/api/v1/page1/scatterData': page1.scatterData,
// page2 - 开源生态与贡献价值全景
'/api/v1/page2/overviewData': page2.overviewData,
'/api/v1/page2/rawEnterpriseData': page2.rawEnterpriseData,
'/api/v1/page2/infrastructure': page2.infrastructure,
'/api/v1/page2/universityClubs': page2.universityClubs,
'/api/v1/page2/communityHealth': page2.communityHealth,
'/api/v1/page2/languageTech': page2.languageTech,
'/api/v1/page2/excellentDeveloper': page2.excellentDeveloper,
'/api/v1/page2/vitalityData': page2.vitalityData,
'/api/v1/page2/projectHeatmap': page2.projectHeatmap,
'/api/v1/page2/talentMapData': page2.talentMapData,
// page3 - 武汉市开源生态建设
'/api/v1/page3/hmStatsBar': page3.hmStatsBar,
'/api/v1/page3/statsBar': page3.statsBar,
'/api/v1/page3/hmCityData': page3.hmCityData,
'/api/v1/page3/hmProjects': page3.hmProjects,
'/api/v1/page3/whProjects': page3.whProjects,
'/api/v1/page3/hmDevelopers': page3.hmDevelopers,
'/api/v1/page3/hmDevCityData': page3.hmDevCityData,
'/api/v1/page3/whHmDevelopers': page3.whHmDevelopers,
'/api/v1/page3/hmEnterpriseCityData': page3.hmEnterpriseCityData,
'/api/v1/page3/hmEnterprises': page3.hmEnterprises,
'/api/v1/page3/whEnterprises': page3.whEnterprises,
'/api/v1/page3/uniCityData': page3.uniCityData,
'/api/v1/page3/uniContributors': page3.uniContributors,
'/api/v1/page3/wuhanGithubProjects': page3.wuhanGithubProjects,
'/api/v1/page3/cityProject': page3.cityProject,
'/api/v1/page3/talent': page3.talent,
'/api/v1/page3/communityRankChart': page3.communityRankChart,
'/api/v1/page3/chinaExcellentProjects': page3.chinaExcellentProjects,
'/api/v1/page3/excellentProjects': page3.excellentProjects,
'/api/v1/page3/developerNames': page3.developerNames,
'/api/v1/page3/wuhanCommunities': page3.wuhanCommunities,
'/api/v1/page3/club': page3.club,
'/api/v1/page3/policy': page3.policy,
'/api/v1/page3/campus': page3.campus,
'/api/v1/page3/mirrors': page3.mirrors
};
/**
* 根据请求 URL 查找 mock handler
* @returns mock 响应或 null未命中
*/
export async function getMockResponse(
url: string,
config: AxiosRequestConfig
): Promise<AxiosResponse | null> {
// 去掉 query string 和前缀 slash
const cleanUrl = url.split('?')[0].replace(/^\/+/, '');
const fullPath = '/' + cleanUrl;
// 精确匹配
const exact = registry[fullPath];
if (exact) return exact(config?.params, config?.data);
// 模糊匹配registry key 是请求 URL 的前缀)
for (const pattern in registry) {
if (fullPath === pattern || fullPath.startsWith(pattern + '/')) {
return registry[pattern](config?.params, config?.data);
}
}
return null;
}

View File

@@ -8,6 +8,9 @@ import { cutParamsInUrl, getSignUtmSource } from './index';
import { Message } from 'vue-devui/message';
import degradeInterceptor from './degradeInterceptor';
import { useAccountStore } from '@/stores/user';
import { getMockResponse } from '@/mock/registry';
const USE_MOCK = (import.meta as any).env.VITE_USE_MOCK === 'true';
const handleError = dealWarning();
@@ -131,7 +134,14 @@ const refreshToken = async () => axios.request({
withCredentials: true
});
const proxyService = (params: any, customConfigs?: CustomConfigs) => {
const proxyService = async (params: any, customConfigs?: CustomConfigs) => {
if (USE_MOCK) {
const url = typeof params === 'string' ? params : (params?.url || '');
const config = (typeof params === 'object' ? params : { url }) as AxiosRequestConfig;
const mockResp = await getMockResponse(url, config);
if (mockResp) return mockResp;
}
const account = useAccountStore();
const service = axios.create({
baseURL: params.apiType === 'devApi' ? baseDevURL : baseURL,