/* * @Author: code4eat awesomedema@gmail.com * @Date: 2024-07-17 10:36:43 * @LastEditors: code4eat awesomedema@gmail.com * @LastEditTime: 2024-07-18 16:41:08 * @FilePath: /BudgetManaSystem/src/authWrapper.tsx * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ // src/components/AuthWrapper.tsx import React, { useEffect, useState } from 'react'; import { history, useModel } from 'umi'; import type { IRoute } from 'umi'; import { Outlet } from '@umijs/max'; // 权限检查函数 function checkAccess(menu: IRoute[], pathname: string): boolean { for (const item of menu) { if (item.path === pathname) { return true; } if (item.children) { const hasAccess = checkAccess(item.children, pathname); if (hasAccess) { return true; } } } return false; } function removePrefix(input: string, prefix: string): string { if (input.startsWith(prefix)) { return input.slice(prefix.length); } return input; } // 权限包装组件 const AuthWrapper: React.FC = (props) => { const { initialState } = useModel('@@initialState'); const [loading, setLoading] = useState(true); const [dataLoaded, setDataLoaded] = useState(false); useEffect(() => { if (!dataLoaded) { const menu = initialState?.memuData ?? []; if (menu.length > 0) { setDataLoaded(true); const { pathname } = history.location; const hasAccess = checkAccess(menu, removePrefix(pathname, '/budgetManaSystem')); // console.log({ hasAccess, menu, pathname }); if (!hasAccess) { history.push('/noAccess'); } setLoading(false); } } }, [initialState,dataLoaded]); return loading ? <>loading... : ; }; export default AuthWrapper; export { checkAccess };