93 lines
3.9 KiB
TypeScript
93 lines
3.9 KiB
TypeScript
|
|
/**
|
|||
|
|
* 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;
|
|||
|
|
}
|