Files
fe_supplier_frontend/src/models/breadcrumb.ts

137 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-07-01 14:18:23 +08:00
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;