Unverified Commit d15923c9 authored by 陈小聪's avatar 陈小聪 Committed by GitHub

Use Umi Permission Routing (#3587)

Use Umi Permission Routing
parent 4ff141ad
...@@ -19,7 +19,6 @@ export default [ ...@@ -19,7 +19,6 @@ export default [
path: '/', path: '/',
component: '../layouts/BasicLayout', component: '../layouts/BasicLayout',
Routes: ['src/pages/Authorized'], Routes: ['src/pages/Authorized'],
authority: ['admin', 'user'],
routes: [ routes: [
// dashboard // dashboard
{ path: '/', redirect: '/dashboard/analysis' }, { path: '/', redirect: '/dashboard/analysis' },
......
...@@ -4,14 +4,11 @@ import DocumentTitle from 'react-document-title'; ...@@ -4,14 +4,11 @@ import DocumentTitle from 'react-document-title';
import { connect } from 'dva'; import { connect } from 'dva';
import { ContainerQuery } from 'react-container-query'; import { ContainerQuery } from 'react-container-query';
import classNames from 'classnames'; import classNames from 'classnames';
import pathToRegexp from 'path-to-regexp';
import Media from 'react-media'; import Media from 'react-media';
import Authorized from '@/utils/Authorized';
import logo from '../assets/logo.svg'; import logo from '../assets/logo.svg';
import Footer from './Footer'; import Footer from './Footer';
import Header from './Header'; import Header from './Header';
import Context from './MenuContext'; import Context from './MenuContext';
import Exception403 from '../pages/Exception/403';
import PageLoading from '@/components/PageLoading'; import PageLoading from '@/components/PageLoading';
import SiderMenu from '@/components/SiderMenu'; import SiderMenu from '@/components/SiderMenu';
import getPageTitle from '@/utils/getPageTitle'; import getPageTitle from '@/utils/getPageTitle';
...@@ -73,29 +70,6 @@ class BasicLayout extends React.Component { ...@@ -73,29 +70,6 @@ class BasicLayout extends React.Component {
}; };
} }
getRouteAuthority = (pathname, routeData) => {
const routes = routeData.slice(); // clone
const getAuthority = (routeDatas, path) => {
let authorities;
routeDatas.forEach(route => {
// check partial route
if (pathToRegexp(`${route.path}(.*)`).test(path)) {
if (route.authority) {
authorities = route.authority;
}
// is exact route?
if (!pathToRegexp(route.path).test(path) && route.routes) {
authorities = getAuthority(route.routes, path);
}
}
});
return authorities;
};
return getAuthority(routes, pathname);
};
getLayoutStyle = () => { getLayoutStyle = () => {
const { fixSiderbar, isMobile, collapsed, layout } = this.props; const { fixSiderbar, isMobile, collapsed, layout } = this.props;
if (fixSiderbar && layout !== 'topmenu' && !isMobile) { if (fixSiderbar && layout !== 'topmenu' && !isMobile) {
...@@ -132,12 +106,10 @@ class BasicLayout extends React.Component { ...@@ -132,12 +106,10 @@ class BasicLayout extends React.Component {
isMobile, isMobile,
menuData, menuData,
breadcrumbNameMap, breadcrumbNameMap,
route: { routes },
fixedHeader, fixedHeader,
} = this.props; } = this.props;
const isTop = PropsLayout === 'topmenu'; const isTop = PropsLayout === 'topmenu';
const routerConfig = this.getRouteAuthority(pathname, routes);
const contentStyle = !fixedHeader ? { paddingTop: 0 } : {}; const contentStyle = !fixedHeader ? { paddingTop: 0 } : {};
const layout = ( const layout = (
<Layout> <Layout>
...@@ -165,9 +137,7 @@ class BasicLayout extends React.Component { ...@@ -165,9 +137,7 @@ class BasicLayout extends React.Component {
{...this.props} {...this.props}
/> />
<Content className={styles.content} style={contentStyle}> <Content className={styles.content} style={contentStyle}>
<Authorized authority={routerConfig} noMatch={<Exception403 />}> {children}
{children}
</Authorized>
</Content> </Content>
<Footer /> <Footer />
</Layout> </Layout>
......
...@@ -97,6 +97,7 @@ export default { ...@@ -97,6 +97,7 @@ export default {
state: { state: {
menuData: [], menuData: [],
routerData: [],
breadcrumbNameMap: {}, breadcrumbNameMap: {},
}, },
...@@ -107,7 +108,7 @@ export default { ...@@ -107,7 +108,7 @@ export default {
const breadcrumbNameMap = memoizeOneGetBreadcrumbNameMap(menuData); const breadcrumbNameMap = memoizeOneGetBreadcrumbNameMap(menuData);
yield put({ yield put({
type: 'save', type: 'save',
payload: { menuData, breadcrumbNameMap }, payload: { menuData, breadcrumbNameMap, routerData: routes },
}); });
}, },
}, },
......
import React from 'react'; import React from 'react';
import RenderAuthorized from '@/components/Authorized';
import { getAuthority } from '@/utils/authority';
import Redirect from 'umi/redirect'; import Redirect from 'umi/redirect';
import pathToRegexp from 'path-to-regexp';
import { connect } from 'dva';
import Authorized from '@/utils/Authorized';
const Authority = getAuthority(); function AuthComponent({ children, location, routerData, status }) {
const Authorized = RenderAuthorized(Authority); const isLogin = status === 'ok';
export default ({ children }) => ( const getRouteAuthority = (pathname, routeData) => {
<Authorized authority={children.props.route.authority} noMatch={<Redirect to="/user/login" />}> const routes = routeData.slice(); // clone
{children}
</Authorized> const getAuthority = (routeDatas, path) => {
); let authorities;
routeDatas.forEach(route => {
// check partial route
if (pathToRegexp(`${route.path}(.*)`).test(path)) {
if (route.authority) {
authorities = route.authority;
}
// is exact route?
if (!pathToRegexp(route.path).test(path) && route.routes) {
authorities = getAuthority(route.routes, path);
}
}
});
return authorities;
};
return getAuthority(routes, pathname);
};
return (
<Authorized
authority={getRouteAuthority(location.pathname, routerData)}
noMatch={isLogin ? <Redirect to="/exception/403" /> : <Redirect to="/user/login" />}
>
{children}
</Authorized>
);
}
export default connect(({ menu: menuModel, login: loginModel }) => ({
routerData: menuModel.routerData,
status: loginModel.status,
}))(AuthComponent);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment