/** * Mock 注册中心 * * 所有 mock 模块在此注册,提供统一的 mockRouter 入口和开关控制。 * * 开关机制: * URL 参数 ?mock=0 → 关闭 mock,请求真实后端 * localStorage mock:enabled = 'false' → 关闭 mock * 默认 → mock 开启 * * 新增业务模块时: * 1. 在 src/mock/{module}/ 创建 seed.ts + router.ts * 2. 在此文件 import 并加入 routers 数组 */ import { platformRouter } from './platform/router' import { mdmCustomerRouter } from './mdmCustomer/router' import { forecastRouter } from './forecast' declare const window: any // ============================================================ // Mock 模块注册列表(one-time-contract 模块待实现,暂时移除) // ============================================================ const routers: Array<(url: string, method: string, data?: any) => any | null> = [ platformRouter, mdmCustomerRouter, forecastRouter, // oneTimeContractRouter, // M07-02 one-time-contract mock 模块待实现 // 新增业务模块在此注册 ] // ============================================================ // 统一入口:遍历所有注册的 router,返回第一个匹配的结果 // ============================================================ export function mockRouter(url: string, method: string, data?: any): any | null { // 只对含 crm 的请求打印日志,减少噪音 if (url.includes('crm') || url.includes('forecast')) { console.log('[mockRouter] received:', method, url) } for (const router of routers) { const result = router(url, method, data) if (result !== null) { if (url.includes('crm') || url.includes('forecast')) { console.log('[mockRouter] matched, result:', result) } return result } } if (url.includes('crm') || url.includes('forecast')) { console.warn('[mockRouter] NO MATCH for:', method, url) } return null } // ============================================================ // Mock 开关判断 // ============================================================ export function isMockEnabled(): boolean { // URL 参数优先级最高 const params = new URLSearchParams(window.location.search) if (params.get('mock') === '0') return false if (params.get('mock') === '1') return true // 其次看 localStorage 用户偏好 const stored = localStorage.getItem('mock:enabled') if (stored === 'false') return false // 默认开启 return true } // ============================================================ // Re-exports // ============================================================ export { resetAllMockData } from './storage'