提交 4284c913 作者: 龚洪江

功能,路由权限

上级 31110e5f
import './assets/style/App.scss'; import './assets/style/App.scss';
import PrivateRouter from '~/router/privateRouter'; import PrivateRouter from '~/router/privateRouter';
import { BrowserRouter } from 'react-router-dom';
const App = () => ( const App = () => (
<> <>
<PrivateRouter /> <BrowserRouter>
<PrivateRouter />
</BrowserRouter>
</> </>
); );
......
...@@ -60,7 +60,9 @@ export function MenuView() { ...@@ -60,7 +60,9 @@ export function MenuView() {
// 组件挂载 // 组件挂载
useEffect(() => { useEffect(() => {
// 设置侧边栏数据 // 设置侧边栏数据
setItems(getItem(authRouterList())); authRouterList().then((value) => {
setItems(getItem(value));
});
// 设置当前选中的项目 // 设置当前选中的项目
setOpenKeys([getRoutePid(routerList, location.pathname).toString()]); setOpenKeys([getRoutePid(routerList, location.pathname).toString()]);
// 设置当前选中的项目的subMenu // 设置当前选中的项目的subMenu
......
...@@ -5,7 +5,7 @@ import { Button, Dropdown, MenuProps, Modal } from 'antd'; ...@@ -5,7 +5,7 @@ import { Button, Dropdown, MenuProps, Modal } from 'antd';
import Logo from '../../../assets/icon/logo_big.png'; import Logo from '../../../assets/icon/logo_big.png';
import './index.scss'; import './index.scss';
import { REMOVE_MENU, REMOVE_MENU_ID, SET_COLLAPSE } from '~/store/module/menu'; import { REMOVE_MENU, REMOVE_MENU_ID, SET_COLLAPSE } from '~/store/module/menu';
import { REMOVE_ROLE_LIST } from '~/store/module/userInfo'; import { REMOVE_ROLE_ID } from '~/store/module/userInfo';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
...@@ -42,7 +42,7 @@ export function TitleView() { ...@@ -42,7 +42,7 @@ export function TitleView() {
Cookies.remove('SHAREFLY-TOKEN'); Cookies.remove('SHAREFLY-TOKEN');
dispatch(REMOVE_MENU()); dispatch(REMOVE_MENU());
dispatch(REMOVE_MENU_ID()); dispatch(REMOVE_MENU_ID());
dispatch(REMOVE_ROLE_LIST()); dispatch(REMOVE_ROLE_ID());
}, },
}); });
}} }}
......
...@@ -6,7 +6,7 @@ import Cookies from 'js-cookie'; ...@@ -6,7 +6,7 @@ import Cookies from 'js-cookie';
import './index.scss'; import './index.scss';
import { InterReqType } from '~/api/interface'; import { InterReqType } from '~/api/interface';
import { BackEndLoginType } from '~/api/interface/commonType'; import { BackEndLoginType } from '~/api/interface/commonType';
import { CommonAPI, SystemManageAPI } from '~/api'; import { CommonAPI } from '~/api';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { SET_USERINFO } from '~/store/module/userInfo'; import { SET_USERINFO } from '~/store/module/userInfo';
import { authRouterList } from '~/router'; import { authRouterList } from '~/router';
...@@ -37,12 +37,11 @@ function LoginView() { ...@@ -37,12 +37,11 @@ function LoginView() {
Cookies.set('remember', String(values?.remember)); Cookies.set('remember', String(values?.remember));
// 存用户信息 // 存用户信息
dispatch(SET_USERINFO(res.result)); dispatch(SET_USERINFO(res.result));
SystemManageAPI.getListRoleMenuInfo({ roleId: res.result.roleInfo.id }).then(({ result }) => { localStorage.setItem('roleId', res.result.roleInfo.id.toString());
localStorage.setItem('roleObj', JSON.stringify(result)); authRouterList().then((value: any) => {
const routeList = authRouterList(); navigate({ pathname: value[0]?.children?.[0]?.path });
// 获取第一个路由
navigate({ pathname: routeList[0]?.children?.[0]?.path });
}); });
// 获取第一个路由
} else { } else {
message.error('登录失败,请检查账号信息'); message.error('登录失败,请检查账号信息');
} }
......
import { RouteObject } from 'react-router-dom'; import { RouteObject } from 'react-router-dom';
import { RouteObjectType, routerList, whiteRouterList } from '~/router/router'; import { RouteObjectType, routerList } from '~/router/router';
import { InterDataType } from '~/api/interface'; import { InterDataType } from '~/api/interface';
import { listMenuInfoType } from '~/api/interface/systemManageType'; import { listMenuInfoType } from '~/api/interface/systemManageType';
import { SystemManageAPI } from '~/api';
//菜单类型 //菜单类型
type menuType = InterDataType<listMenuInfoType>; type menuType = InterDataType<listMenuInfoType>;
// 获取用户权限路由列表 // 获取用户权限路由列表
export const authRouterList = () => { export const authRouterList = async () => {
const roleObj: menuType = JSON.parse(localStorage.getItem('roleObj') as string); if (localStorage.getItem('roleId')) {
if (roleObj) { const { result } = await SystemManageAPI.getListRoleMenuInfo({
const ids: number[] = getAllKeys([roleObj]); roleId: Number(localStorage.getItem('roleId')),
});
const ids: number[] = getAllKeys([result]);
const getRouteList = (data: RouteObjectType[]) => { const getRouteList = (data: RouteObjectType[]) => {
return data.reduce((pre: RouteObjectType[], cur) => { return data.reduce((pre: RouteObjectType[], cur) => {
if (ids.includes(cur.meta.id) || cur.meta.hidden) { if (ids.includes(cur.meta.id) || cur.meta.hidden) {
...@@ -21,9 +24,9 @@ export const authRouterList = () => { ...@@ -21,9 +24,9 @@ export const authRouterList = () => {
return pre; return pre;
}, []); }, []);
}; };
return [...getRouteList(routerList)]; return Promise.resolve([...getRouteList(routerList)]);
} }
return []; return Promise.resolve([]);
}; };
//获取全部节点 //获取全部节点
const getAllKeys = (data: menuType[]) => { const getAllKeys = (data: menuType[]) => {
...@@ -35,7 +38,5 @@ const getAllKeys = (data: menuType[]) => { ...@@ -35,7 +38,5 @@ const getAllKeys = (data: menuType[]) => {
return pre; return pre;
}, []); }, []);
}; };
// 整合路由数据
export const routes = [...authRouterList(), ...whiteRouterList];
// 路由表类型 // 路由表类型
export type routerItem = RouteObject & RouteObjectType; export type routerItem = RouteObject & RouteObjectType;
import { routes } from '~/router/index'; import { authRouterList } from '~/router/index';
import { createBrowserRouter, RouterProvider } from 'react-router-dom'; import { useNavigate, useLocation, useRoutes } from 'react-router-dom';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import { whiteRouterList } from '~/router/router';
function PrivateRouter() { function PrivateRouter() {
const [router, setRouter] = useState(createBrowserRouter(routes)); const location = useLocation();
const navigate = useNavigate();
const [router, setRouter] = useState(whiteRouterList);
// 在切换路由之前判断 // 在切换路由之前判断
const beforeEach = () => { const beforeEach = () => {
// TODO: 判断是否登录 (需要改为实时获取地址栏的路由) // TODO: 判断是否登录 (需要改为实时获取地址栏的路由)
const path = location.pathname; const path = location.pathname;
const token = Cookies.get('SHAREFLY-TOKEN'); const token = Cookies.get('SHAREFLY-TOKEN');
if (!token && path !== '/login') { if (!token && path !== '/login') {
location.replace('/login'); navigate('/login', { replace: true });
return; return;
} }
}; };
useEffect(() => { useEffect(() => {
beforeEach(); beforeEach();
setRouter(createBrowserRouter(routes)); //不同账号登录时,重新更新路由(有瑕疵) // 整合路由数据
authRouterList().then((value) => {
const routes = [...value, ...whiteRouterList];
setRouter(routes); //不同账号登录时,重新更新路由(有瑕疵)
});
}, [location.pathname]); }, [location.pathname]);
return <RouterProvider router={router} />; return useRoutes(router);
} }
export default PrivateRouter; export default PrivateRouter;
...@@ -18,6 +18,9 @@ export const userInfoSlice = createSlice({ ...@@ -18,6 +18,9 @@ export const userInfoSlice = createSlice({
state.roleId = action.payload; state.roleId = action.payload;
localStorage.setItem('roleId', action.payload); localStorage.setItem('roleId', action.payload);
}, },
REMOVE_ROLE_ID() {
localStorage.removeItem('roleId');
},
SET_ROLE_LIST(state, action) { SET_ROLE_LIST(state, action) {
state.roleList = action.payload; state.roleList = action.payload;
localStorage.setItem('roleObj', JSON.stringify(action.payload)); localStorage.setItem('roleObj', JSON.stringify(action.payload));
...@@ -28,6 +31,7 @@ export const userInfoSlice = createSlice({ ...@@ -28,6 +31,7 @@ export const userInfoSlice = createSlice({
}, },
}); });
export const { SET_USERINFO, SET_ROLE_ID, SET_ROLE_LIST, REMOVE_ROLE_LIST } = userInfoSlice.actions; export const { SET_USERINFO, SET_ROLE_ID, SET_ROLE_LIST, REMOVE_ROLE_LIST, REMOVE_ROLE_ID } =
userInfoSlice.actions;
export const UserInfo = userInfoSlice.reducer; export const UserInfo = userInfoSlice.reducer;
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论