import { Effect, Reducer } from 'umi'; export interface BreadcrumbItem { path: string; breadcrumbName: string; } export interface BreadcrumbModelState { breadcrumbs: BreadcrumbItem[]; } export interface BreadcrumbModelType { namespace: 'breadcrumb'; state: BreadcrumbModelState; effects: { updateBreadcrumbs: Effect; }; reducers: { saveBreadcrumbs: Reducer; }; } /** * 生成面包屑数据 * @param pathname 当前路径 * @param intl 国际化对象 */ const generateBreadcrumbs = (pathname: string, intl: any): BreadcrumbItem[] => { // 如果是首页,直接返回首页 if (pathname === '/' || pathname === '/index') { return [ { path: '/', breadcrumbName: intl.formatMessage({ id: 'menu.首页' }, { defaultMessage: '首页' }), }, ]; } // 构建面包屑数据 const breadcrumbs = [ { path: '/', breadcrumbName: intl.formatMessage({ id: 'menu.首页' }, { defaultMessage: '首页' }), }, ]; // 按照斜杠分割路径 const pathSegments = pathname.split('/').filter(segment => segment); let currentPath = ''; // 构建每一级的路径和对应的面包屑名称 for (let i = 0; i < pathSegments.length; i++) { const segment = pathSegments[i]; currentPath += `/${segment}`; // 尝试使用多语言配置 // 先尝试完整路径的多语言配置 let menuKey = `menu.${pathSegments.slice(0, i + 1).join('/')}`; let menuName = intl.formatMessage({ id: menuKey }, { defaultMessage: '' }); // 如果完整路径没有对应的多语言,则尝试使用当前段的多语言 if (!menuName) { menuKey = `menu.${segment}`; menuName = intl.formatMessage({ id: menuKey }, { defaultMessage: '' }); } // 如果仍然没有找到多语言配置,尝试使用特定页面的多语言配置 if (!menuName) { // 处理特殊情况,如数据统计下的子页面 if (pathSegments[0] === 'dataStatistics') { switch (segment) { case 'supplierEvaluateStatistics': menuName = intl.formatMessage({ id: 'menu.供应商评价情况统计' }, { defaultMessage: '供应商评价情况统计' }); break; case 'supplierAnnualStatistics': menuName = intl.formatMessage({ id: 'menu.供应商年审情况统计' }, { defaultMessage: '供应商年审情况统计' }); break; case 'supplierQualificationWarningStatistics': menuName = intl.formatMessage({ id: 'menu.供应商资质预警统计' }, { defaultMessage: '供应商资质预警统计' }); break; case 'supplierExitStatistics': menuName = intl.formatMessage({ id: 'menu.供应商清退情况统计' }, { defaultMessage: '供应商清退情况统计' }); break; default: menuName = segment; } } else if (pathSegments[0] === 'supplierEvaluate') { // 处理供应商评价模块 menuName = intl.formatMessage({ id: `menu.${segment}` }, { defaultMessage: segment }); } else if (pathSegments[0] === 'supplierAnnual') { // 处理供应商年审模块 menuName = intl.formatMessage({ id: `menu.${segment}` }, { defaultMessage: segment }); } else { menuName = segment; } } breadcrumbs.push({ path: currentPath, breadcrumbName: menuName || segment, }); } return breadcrumbs; }; const BreadcrumbModel: BreadcrumbModelType = { namespace: 'breadcrumb', state: { breadcrumbs: [], }, effects: { *updateBreadcrumbs({ payload }, { put }) { const { pathname, intl } = payload; console.log(pathname) const breadcrumbs = generateBreadcrumbs(pathname, intl); yield put({ type: 'saveBreadcrumbs', payload: breadcrumbs, }); }, }, reducers: { saveBreadcrumbs(state, { payload }) { return { ...state, breadcrumbs: payload, }; }, }, }; export default BreadcrumbModel;