import DraggableDialog from "@/components/DraggableDialog"; import InitForm from "@/components/InitForm"; import { doFetch } from "@/utils/doFetch"; import SettingsIcon from "@mui/icons-material/Settings"; import { Box, Divider, IconButton, MenuItem, Popover, Stack, Typography, } from "@mui/material"; import { useModel, useNavigate } from "@umijs/max"; import { useRequest } from "ahooks"; import AES from "crypto-js/aes"; import Utf8 from "crypto-js/enc-utf8"; import ECB from "crypto-js/mode-ecb"; import Pkcs7 from "crypto-js/pad-pkcs7"; import dayjs from "dayjs"; import { useState } from "react"; import { message } from 'antd'; // ---------------------------------------------------------------------- const MENU_OPTIONS = [ { label: "修改密码", type: "pwd", }, { label: "个人信息", type: "info", }, ]; const columnes = [ { title: "旧密码", dataIndex: "password", key: "password", valueType: "password", colProps: { span: 24, }, formItemProps: { rules: [ { required: true, message: "此项为必填项", }, ], }, }, { title: "新密码", dataIndex: "newPassword", key: "newPassword", valueType: "password", colProps: { span: 24, }, formItemProps: { rules: [ { required: true, message: "此项为必填项", }, ], }, }, { title: "确认新密码", dataIndex: "confirmNewPassword", key: "confirmNewPassword", valueType: "password", colProps: { span: 24, }, formItemProps: { dependencies: ["newPassword"], rules: [ { required: true, message: "此项为必填项", }, ({ getFieldValue }) => ({ validator(_, value) { if (!value || getFieldValue("newPassword") === value) { return Promise.resolve(); } return Promise.reject(new Error("两次密码不一致!")); }, }), ], }, }, ]; export default function AccountPopover() { const [open, setOpen] = useState(null); const [dialogprops, setdialogprops] = useState({ open: false, }); const { initialState: { currentUser }, setInitialState, } = useModel("@@initialState"); const navigate = useNavigate(); const handleOpen = (event) => { setOpen(event.currentTarget); }; const handleClose = (path) => { setOpen(null); if (path === "/user/login") { doFetch({ url: "/system/logout", params: {} }).then((res) => { console.log(res); if (res?.code === "0000") { path && navigate(path); } }); return; } path && navigate(path); }; const handleClosed = () => { setdialogprops({ open: false, }); }; const { runAsync, loading } = useRequest(doFetch, { manual: true, onSuccess: (res, parames) => { if (res?.code == "0000") { handleClosed(); handleClose("/user/login"); message.success("操作成功"); } }, }); return ( <> <DraggableDialog handleClose={handleClosed} loading={loading} dialogprops={dialogprops} > <InitForm fields={columnes} onFinish={(val, extra) => { const { password, newPassword } = val; let timestamp = dayjs().valueOf().toString() + "acb"; let newtimestamp = AES.encrypt( timestamp, Utf8.parse("NANGAODEAESKEY--"), { mode: ECB, padding: Pkcs7, } ).toString(); let passwordsrc = AES.encrypt(password, Utf8.parse(timestamp), { mode: ECB, padding: Pkcs7, }).toString(); let newPasswordsrc = AES.encrypt( newPassword, Utf8.parse(timestamp), { mode: ECB, padding: Pkcs7, } ).toString(); let postdata = { encryptKey: newtimestamp, password: passwordsrc, newPassword: newPasswordsrc, }; runAsync({ url: "/system/updatePassword", params: postdata, }); }} ></InitForm> </DraggableDialog> <IconButton onClick={handleOpen}> <SettingsIcon></SettingsIcon> </IconButton> <Popover open={Boolean(open)} anchorEl={open} onClose={handleClose} anchorOrigin={{ vertical: "bottom", horizontal: "right" }} transformOrigin={{ vertical: "top", horizontal: "right" }} PaperProps={{ sx: { p: 0, mt: 1.5, ml: 0.75, width: 180, "& .MuiMenuItem-root": { typography: "body2", borderRadius: 0.75, }, }, }} > <Box sx={{ my: 1.5, px: 2.5 }}> <Typography variant="subtitle2" noWrap> {currentUser?.name} </Typography> <Typography variant="body2" sx={{ color: "text.secondary" }} noWrap> {currentUser?.email} </Typography> </Box> <Divider sx={{ borderStyle: "dashed" }} /> <Stack sx={{ p: 1 }}> {MENU_OPTIONS.map((option) => ( <MenuItem key={option.label} onClick={() => { if (option.type === "pwd") { setOpen(null); setdialogprops((s) => ({ ...s, open: true, title: "修改密码", })); } else { handleClose("/work/usercenter"); } }} > {option.label} </MenuItem> ))} </Stack> <Divider sx={{ borderStyle: "dashed" }} /> <MenuItem onClick={() => { handleClose("/user/login"); }} sx={{ m: 1 }} > 退出登录 </MenuItem> </Popover> </> ); }