diff --git a/src/layout/head/Head.tsx b/src/layout/head/Head.tsx index fe2c06c..43a3cdd 100644 --- a/src/layout/head/Head.tsx +++ b/src/layout/head/Head.tsx @@ -7,6 +7,7 @@ import {useContext, useEffect, useState} from "react"; import {get, put} from "../../util/AjaxUtils.ts"; import {GlobalContext, GlobalDataActionType, GlobalDispatchContext} from "../../context/GlobalContext.ts"; import UserEdit from "../../route/user/UserEdit.tsx"; +import PasswordChange from "../../route/password/PasswordChange.tsx"; export default function Head() { const globalContext = useContext(GlobalContext); @@ -15,6 +16,7 @@ export default function Head() { const [modal, modalHolder] = Modal.useModal(); const [loading, setLoading] = useState(false); const [isSelfModalOpen, setIsSelfModalOpen] = useState(false); + const [isPasswordModalOpen, setIsPasswordModalOpen] = useState(false); useEffect(() => { get({ @@ -58,6 +60,9 @@ export default function Head() { 修改密码 ), + onClick: () => { + setIsPasswordModalOpen(true); + } }, { key: 'logout', @@ -108,7 +113,7 @@ export default function Head() { }} > { modal.confirm({ - title: 'Confirm', + title: '提示', content: '确定保存吗?', okText: '确认', cancelText: '取消', @@ -133,7 +138,43 @@ export default function Head() { setLoading(false); } }) - console.log(data); + } + }); + }}/> + + { + setIsPasswordModalOpen(false) + }} > + { + modal.confirm({ + title: '提示', + content: '确定修改吗?', + okText: '确认', + cancelText: '取消', + okButtonProps: { + style: { + backgroundColor: 'var(--color-primary)' + } + }, + onOk: () => { + put({ + messageApi, + url: '/api/user/update-password', + body: data, + onBefore() { + setLoading(true); + }, + onSuccess() { + setIsPasswordModalOpen(false); + messageApi.success('修改成功,重新登录生效'); + }, + onFinally() { + setLoading(false); + } + }) } }); }}/> diff --git a/src/route/password/PasswordChange.tsx b/src/route/password/PasswordChange.tsx new file mode 100644 index 0000000..c65886a --- /dev/null +++ b/src/route/password/PasswordChange.tsx @@ -0,0 +1,70 @@ +import {Button, Flex, Form, Input} from "antd"; +import {useEffect} from "react"; + +type FormFieldType = { + oldPassword: string; + newPassword: string; + confirmNewPassword: string; +} + +export interface IPasswordChangeProps { + handleConfirm(data: FormFieldType): void; +} + +export default function PasswordChange(props: IPasswordChangeProps) { + + const [form] = Form.useForm(); + + useEffect(() => { + form.setFieldsValue({ + oldPassword: '', + newPassword: '', + confirmNewPassword: '', + }) + }, []) + + return ( +
{ + props.handleConfirm(data); + }} + > + + + + + + + ({ + validator(_, value) { + if (!value || getFieldValue('newPassword') === value) { + return Promise.resolve(); + } + return Promise.reject(new Error('密码需要一致')); + } + })]} + > + + + + + + + +
+ ) +} \ No newline at end of file