import React, { useCallback, useEffect, useRef, useState } from 'react' import { CaretRightOutlined } from '@ant-design/icons' import styles from './index.module.scss' import SpinLoding from '@/components/SpinLoding' import { Route, Switch, useLocation } from 'react-router-dom' import AuthRoute from '@/components/AuthRoute' import classNames from 'classnames' import history from '@/utils/history' import { Button, Form, Input, Modal } from 'antd' import { Base64 } from 'js-base64' import encodeStr from '@/utils/pass' import { API_getRoleArr, passWordEditAPI } from '@/store/action/layout' import { getTokenInfo, removeTokenInfo } from '@/utils/storage' import { MessageFu } from '@/utils/message' import logoImg from '@/assets/img/logo2.png' import NotFound from '@/components/NotFound' import { RouterType, RouterTypeRow } from '@/types' import tabLeftArr, { routerSon } from './data' import MyPopconfirm from '@/components/MyPopconfirm' import { TypeZ5Role } from '../Z_system/Z5role/type' function Layout() { // 当前路径选中的左侧菜单 const location = useLocation() const [path, setPath] = useState('') useEffect(() => { const arr = location.pathname.split('/') let pathTemp = '/' if (arr[1]) pathTemp = '/' + arr[1] setPath(pathTemp) }, [location]) // 获取用户权限信息 const getUserAuthFu = useCallback(async () => { const userInfo = getTokenInfo().user // 获取权限 const getRoleRes = await API_getRoleArr(userInfo.roleId) if (getRoleRes.code === 0) { const getRoleArr: TypeZ5Role[] = getRoleRes.data || [] const isOkIdArr: number[] = [9901] getRoleArr.forEach(v1 => { if (v1.children) { v1.children.forEach(v2 => { if (v2.authority) isOkIdArr.push(v2.id) }) } }) // 是管理员 if (userInfo.isAdmin === 1) { // push角色管理 isOkIdArr.push(9900) // isOkIdArr.push(9901) } const tempArr: RouterTypeRow = [] tabLeftArr.forEach(v1 => { if (v1.son && v1.son[0]) { v1.son.forEach(v2 => { if (isOkIdArr.includes(v2.id)) { tempArr.push(v2) } }) } }) setRouterCom(tempArr) // 如果当前页面没有权限了,跳转有权限的第一个页面 const urlAll = window.location.hash const isNowPath = urlAll.replace('#', '') const pathArr = tempArr.map(v => v.pathLast || v.path) const routerSonArr = routerSon.map(v => v.path) const lastArr = [...pathArr, ...routerSonArr] let flagPush = true lastArr.forEach(v => { if (v === '/') { if (isNowPath === '/') flagPush = false } else { if (isNowPath.includes(v)) flagPush = false } }) if (flagPush) history.push(pathArr[0]) const resList = tabLeftArr.map(v => ({ ...v, son: v.son.filter(c => isOkIdArr.includes(c.id)) })) setList(resList) } }, []) useEffect(() => { getUserAuthFu() }, [getUserAuthFu]) // 左侧菜单 信息 const [list, setList] = useState([] as RouterType) // 路由信息(过滤之后的) const [RouterCom, setRouterCom] = useState([]) // useEffect(() => { // console.log(123, list); // }, [list]); // 点击跳转 const pathCutFu = useCallback((path: string) => { history.push(path) }, []) // 修改密码相关 const [open, setOpen] = useState(false) // 拿到新密码的输入框的值 const oldPasswordValue = useRef('') const checkPassWord = (rule: any, value: any = '') => { if (value !== oldPasswordValue.current) return Promise.reject('新密码不一致!') else return Promise.resolve(value) } const onFinish = async (values: any) => { // 通过校验之后发送请求 if (values.oldPassword === values.newPassword) return MessageFu.warning('新旧密码不能相同!') const regex = /^(?=.*[A-Za-z])(?=.*\d)|(?=.*[A-Za-z])(?=.*[!@#$%^&*])|(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$/ const flagPass = regex.test(values.newPassword) if (!flagPass) { return MessageFu.warning('密码要求由数字、字母或特殊字符中2种方式组成') } const obj = { oldPassword: encodeStr(Base64.encode(values.oldPassword)), newPassword: encodeStr(Base64.encode(values.newPassword)) } const res: any = await passWordEditAPI(obj) if (res.code === 0) { MessageFu.success('修改成功!') loginExit() } } // 点击退出登录 const loginExit = () => { removeTokenInfo() history.push('/login') } // 点击用户 出来 退出登录 修改密码 const [isUserBtnShow, setIsUserBtnShow] = useState(false) // path的高亮判断 const pathAcFu = useCallback( (url: string) => { let flag = false if (url === '/') { if (path.includes('/_') || path === '/') flag = true } else { if (path.includes(url)) flag = true } return flag }, [path] ) return (
{/* 左边 */}
{/* 左边主体 */}
{list.map(v => ( ))}
{/* 右边 */}
{/* 用户相关 */}
setIsUserBtnShow(false)} >
setIsUserBtnShow(true)}> {getTokenInfo().user.realName || getTokenInfo().user.userName || '匿名'}
setOpen(true)}>修改密码
{/* 右边主体 */}
{/* 二级路由页面 */}
}> {/* 左侧tab栏页面 */} {RouterCom.map(v => ( ))} {/* 非tab栏页面 */} {routerSon.map(v => ( ))}
{/* 点击修改密码打开的对话框 */} setOpen(false)} footer={ [] // 设置footer为空,去掉 取消 确定默认按钮 } >
e.target.value.replace(/\s+/g, '')} > e.target.value.replace(/\s+/g, '')} > (oldPasswordValue.current = e.target.value)} /> e.target.value.replace(/\s+/g, '')} >
) } // 使用 React.memo 来优化组件,避免组件的无效更新,类似 类组件里面的PureComponent const MemoLayout = React.memo(Layout) export default MemoLayout