137 lines
4.0 KiB
TypeScript
137 lines
4.0 KiB
TypeScript
![]() |
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<BreadcrumbModelState>;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 生成面包屑数据
|
||
|
* @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;
|