diff --git a/src/api/auth/menu.ts b/src/api/auth/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..a83c59245b206f4745194bf3c80b62db1c4ea609 --- /dev/null +++ b/src/api/auth/menu.ts @@ -0,0 +1,38 @@ +import request from '@/utils/request' +// import { ResMenuTree, MenuQuery, SaveMenu } from '@/model/system/MenuTree' + +/** + * 获取所有菜单 + * @param data + * @returns + */ +export function getTreeMenu(data: any): Promise { + return request.get('/api/auth/module/list', data) +} +/** + * 新增菜单 + * @param data + * @returns + */ +export function addMenu(data: any): Promise { + const params = data // 解决eslint提示 禁止对函数参数再赋值 + if (params.parentId == null) params.parentId = 0 + return request.post('/api/auth/module', params) +} +/** + * 修改菜单 + * @param data + * @returns + */ +export function updateMenu(data: any): Promise { + const params = data // 解决eslint提示 禁止对函数参数再赋值 + if (params.parentId == null) params.parentId = 0 + return request.put(`/api/auth/module/${params.id}`, params) +} +/** + * 删除菜单 + * @param id + */ +export function removeMenu(id: number): Promise { + return request.delete(`/api/auth/module/${id}`) +} diff --git a/src/hooks/auth/menu.ts b/src/hooks/auth/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..92792cecafa8d57eb7a9982f966198abfa179d6e --- /dev/null +++ b/src/hooks/auth/menu.ts @@ -0,0 +1,20 @@ +import { getTreeMenu } from '@/api/auth/menu' +import { useEffect, useState } from 'react' + +export function useMenuTreeTable() { + const [tableData, setTableData] = useState([]) + const [loading, setLoading] = useState(false) + const tableParams = { + name: '', + code: '', + } + + useEffect(() => { + setLoading(true) + const fetchData = async() => { + const result = await getTreeMenu(tableParams) + } + }, []) + + return { loading, tableData, setTableData } +} diff --git a/src/layouts/Content/index.tsx b/src/layouts/Content/index.tsx index 69f505f55599e25d39b233d4b030144b0623e24e..ac69e40c80754d76348b606eb88abce2d8860633 100644 --- a/src/layouts/Content/index.tsx +++ b/src/layouts/Content/index.tsx @@ -1,35 +1,41 @@ import { FC } from 'react' import { Redirect, Switch, withRouter, Route } from 'react-router-dom' -import routes from '@/router' +import setRouter from '@/router' import { Layout } from 'antd' import { RouteComponentProps } from 'react-router' import { IRoute } from '@/interface/router' +import { useStore } from '@/store' const { Content } = Layout -const menus: IRoute[] = [] - -function getRouters(menu: any) { - menu.forEach((item: any) => { - if (!item.children) { - menus.push(item) - } else { - getRouters(item.children) - } +const AppContent: FC = () => { + const { userStore } = useStore() + const { menu } = userStore + const asyncRoutes = setRouter(menu) + const menus: IRoute[] = [] + const filterRouters = ((routes: any) => { + routes.forEach((route:IRoute) => { + if (!route.children) { + if (route.component) { + menus.push(route) + } + } else { + filterRouters(route.children) + } + }) }) + filterRouters(asyncRoutes) + return ( + + + + {menus.map((route: IRoute) => ( + + ))} + + + + ) } -getRouters(routes) - -const AppContent: FC = () => ( - - - - {menus.map((route: IRoute) => ( - - ))} - - - -) export default withRouter(AppContent) diff --git a/src/layouts/Header/index.tsx b/src/layouts/Header/index.tsx index d863b67cf4eebd74968cebabc3f94d4a9fcf7f84..549465713e819651d8b29346b90acf312ebc5603 100644 --- a/src/layouts/Header/index.tsx +++ b/src/layouts/Header/index.tsx @@ -6,7 +6,6 @@ import Hamburger from '@/components/Hamburger' import headImg from '@/assets/images/default-head-02.png' import BreadCrumb from '@/components/BreadCrumb' import { useStore } from '@/store' -import useUserInfo from '@/hooks/user' const { Header } = Layout @@ -16,9 +15,9 @@ type Props = { const AppHeader: FC = () => { const history = useHistory() const { userStore } = useStore() - const { userData } = useUserInfo() - console.log(userStore) - console.log(userData) + const { userInfo } = userStore + // console.log(userInfo) + // console.log(userStore) const onDropMenu = (e: any) => { if (e.key === 'logout') { @@ -55,7 +54,7 @@ const AppHeader: FC = () => {
- {userData?.activeUsers?.nickName} + {userInfo.nickName}
{/*
*/}
diff --git a/src/layouts/Sider/Menu/index.tsx b/src/layouts/Sider/Menu/index.tsx index f65370771884ca221487fd71a56d9947e47f1119..5c6f6f4f2e5f1073d914f7bf43fcc51293fdc4ea 100644 --- a/src/layouts/Sider/Menu/index.tsx +++ b/src/layouts/Sider/Menu/index.tsx @@ -6,13 +6,11 @@ import { IRoute, MenuInfo } from '@/interface/router' import Icon from '@/components/Icon' import { useStore } from '@/store' import { observer } from 'mobx-react' -import { addRoutes } from '@/router/addRoutes' -import useUserInfo from '@/hooks/user' +import setRouter from '@/router' const SiderMenu: FC = () => { - const { appStore } = useStore() - const { userData } = useUserInfo() - const { menu } = userData + const { appStore, userStore } = useStore() + const { menu } = userStore let openMenu: Array = [] let openKey: Array = [] @@ -38,7 +36,7 @@ const SiderMenu: FC = () => { return pre }, []) } - const asyncRoutes = addRoutes(menu) + const asyncRoutes = setRouter(menu) const menuTree = getMenuTree(asyncRoutes) const selectBreadcrumb = (currentKey: string, pathname: string) => { diff --git a/src/layouts/index.scss b/src/layouts/index.scss index 3783ed6fab264aeda3f08c120866022376549df4..490f3d11a4b8e122701b7aa99c346d1e7b17cd1e 100644 --- a/src/layouts/index.scss +++ b/src/layouts/index.scss @@ -21,45 +21,50 @@ } } } -.app-sider{ - .app-logo { - background:#2b2f3a; - height: 64px; - line-height: 64px; - overflow: hidden; - .app-logo-img{ - width: 60px; - margin-left: 25px; - animation: app-logo-spin infinite 10s linear; - } - @keyframes app-logo-spin { - from { - transform: rotate(0deg); +.sider-box { + height: 100vh; + overflow: auto; + .app-sider{ + height: 100%; + .app-logo { + background:#2b2f3a; + height: 64px; + line-height: 64px; + overflow: hidden; + .app-logo-img{ + width: 60px; + margin-left: 25px; + animation: app-logo-spin infinite 10s linear; + } + @keyframes app-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } } - to { - transform: rotate(360deg); + h1{ + display: inline-block; + color:#fff; + font-size: 18px; + text-align: center; + font-weight: normal; } } - h1{ - display: inline-block; + .logo-wrap{ color:#fff; font-size: 18px; - text-align: center; - font-weight: normal; } - } - .logo-wrap{ - color:#fff; - font-size: 18px; - } - .app-logo-on{ - overflow: hidden; - text-align: center; - .title{ - display:none; - } - .app-logo-img{ - margin-left: 0; + .app-logo-on{ + overflow: hidden; + text-align: center; + .title{ + display:none; + } + .app-logo-img{ + margin-left: 0; + } } } } diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx index 80058d6292a4f9692cae417a12fc2c3c6740a689..a97a362764e70f2e3ef7176deb9124f0f547abac 100644 --- a/src/layouts/index.tsx +++ b/src/layouts/index.tsx @@ -1,20 +1,37 @@ -import { FC } from 'react' +import { FC, useEffect } from 'react' import { RouteComponentProps } from 'react-router' import { Layout } from 'antd' +import useUserInfo from '@/hooks/user' +import { useStore } from '@/store' +import { observer } from 'mobx-react' import AppSider from './Sider' import AppHeader from './Header' import AppContent from './Content' import './index.scss' -const AppLayout: FC = () => ( - - - - - +const AppLayout: FC = () => { + // 登录后me接口信息存入mobx-userStroe + const { userData } = useUserInfo() + const { userStore } = useStore() + const setUserStore = () => { + userStore.getUserData(userData) + } + useEffect(() => { + setUserStore() + }, [userData]) + + return ( + +
+ +
+ + + +
-
-) + ) +} -export default AppLayout +export default observer(AppLayout) diff --git a/src/router/addRoutes.ts b/src/router/addRoutes.ts deleted file mode 100644 index 1a9f4b6b58cfaf99906e371561d26aeaa534c1b8..0000000000000000000000000000000000000000 --- a/src/router/addRoutes.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { IRoute } from '@/interface/router' -import asyncRoutes from './asyncRoutes' - -function formatRoutes(menus: any): Array { - const ret: IRoute[] = [] - if (!menus?.length) { - return [] - } - - menus.forEach((menu) => { - const { name, code, path, iconClass } = menu - const temp: IRoute = { - title: name, - path, - name: code, - icon: iconClass, - key: code, - component: asyncRoutes[code], - } - if (menu?.children?.length) { - temp.children = [] - temp.children.push(...formatRoutes(menu.children)) - } - ret.push(temp) - }) - return ret -} - -export function addRoutes(menus: any[]) { - const routes = formatRoutes(menus) - return routes -} diff --git a/src/router/asyncRoutes.ts b/src/router/asyncRoutes.ts index 0218fca838b20ed0e16809ad16bc989dd0263ced..b7aebf25f6160e8a505f40eea756fd93e51c8758 100644 --- a/src/router/asyncRoutes.ts +++ b/src/router/asyncRoutes.ts @@ -3,5 +3,7 @@ import { lazy } from 'react' export default { // 根据后端返回数据code字段映射组件 overview: lazy(() => import('@/views/dashboard')), - orderProfile: lazy(() => import('@/views/shop/decoration')), + shopOverview: lazy(() => import('@/views/shop/overview')), + shopDecoration: lazy(() => import('@/views/shop/decoration')), + // authMenu: lazy(() => import('@/views/auth/menu')), } diff --git a/src/router/index.ts b/src/router/index.ts index d627f511432be30d6a163295a7f1653d58c5bc73..fec13dc94b3d39429b33dfd252f2b2179bef6e68 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,44 +1,11 @@ import { IRoute } from '@/interface/router' import { lazy } from 'react' +import asyncRoutes from './asyncRoutes' const router: Array = [ { - path: '/overview', - title: '概况', - name: 'overview', - exact: true, - icon: 'DashboardOutlined', - key: 'overview', - component: lazy(() => import(/* webpackChunkName: "Home" */ '@/views/dashboard')), - }, - { - path: '/shop', - title: '店铺', - name: 'shop', - exact: true, - key: 'shop', - icon: 'FileUnknownOutlined', - component: lazy(() => import('@/layouts/index')), - children: [ - { - title: '店铺概况', - path: '/shop/overview', - name: 'overview', - icon: 'FileTextOutlined', - component: lazy(() => import(/* webpackChunkName: "overview" */ '@/views/shop/overview')), - }, - { - title: '店铺装修', - path: '/shop/decoration', - name: 'decoration', - icon: 'FileTextOutlined', - component: lazy(() => import(/* webpackChunkName: "decoration" */ '@/views/shop/decoration')), - }, - ], - }, - { - path: '/error/404', title: '错误页面', + path: '/error/404', name: 'Error', icon: 'FileUnknownOutlined', hidden: true, @@ -54,4 +21,40 @@ const router: Array = [ }, ] -export default router +const formatRoutes = (menus: any): Array => { + const routes: IRoute[] = [] + if (!menus?.length) { + return [] + } + + menus.forEach((menu) => { + const { name, code, path, iconClass } = menu + const route: IRoute = { + title: name, + path, + name: code, + icon: iconClass, + key: code, + component: asyncRoutes[code], + } + if (menu?.children?.length) { + route.children = [] + route.children.push(...formatRoutes(menu.children)) + } + routes.push(route) + }) + return routes +} +const setRouter = (menus?:any): Array => { + let userRouter: IRoute[] = [] + if (menus?.length) { + const asyncRouter = formatRoutes(menus) + asyncRouter.push(...router) + userRouter = asyncRouter + } else { + userRouter = router + } + return userRouter +} + +export default setRouter diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index b85c5fa6e9bb52fb995e5340aa612aff1a4d763b..93159ad1a22c079f9c81a81a82f92f6dae476d7b 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -15,7 +15,7 @@ class User { @observable menu = [] - @observable userInfo = {} + @observable userInfo: any = {} // 暂时解决类型报错,待定义类型 @observable phone = '' @@ -29,7 +29,7 @@ class User { sessionStorage.setItem('refreshToken', refreshToken) - await this.getUserInfo() + // await this.getUserInfo() return Promise.resolve(response) } catch (e) { @@ -50,6 +50,12 @@ class User { } } + @action getUserData = (userData) => { + const { menu, activeUsers } = cloneDeep(userData) + this.menu = menu + this.userInfo = activeUsers + } + @action logout = () => { removeToken() this.menu = [] diff --git a/src/utils/request.ts b/src/utils/request.ts index 6c5cf68a7cd4edd18067adf24541669336dc4d54..1bcc0ce120d1b0da3f831323d96596acb947eced 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -30,6 +30,10 @@ service.interceptors.response.use( if (data.code !== 200) { message.error(data.message) + if (data.code === 416) { + // token失效 跳转login + window.location.href = '/login' + } return Promise.reject(data) } if (!data) {