143 lines
4.1 KiB
TypeScript
Raw Normal View History

import React, { useState } from 'react';
import { Form, Input, Button, message, Card, Typography } from 'antd';
import { LockOutlined } from '@ant-design/icons';
import { request, useModel } from '@umijs/max';
import { isEmpty } from 'lodash';
const { Title } = Typography;
const ResetPassword: React.FC = () => {
const [form] = Form.useForm();
const [loading, setLoading] = useState(false);
const [messageApi, contextHolder] = message.useMessage();
const { initialState, setInitialState } = useModel('@@initialState');
// 提交重置密码请求
const handleResetPassword = async () => {
try {
debugger;
const values = form.getFieldsValue();
if (initialState?.currentUser?.id == null) {
messageApi.error('用户信息不存在,请重新登录');
return;
}
// 检查两次密码是否一致
if (values.newPassword !== values.confirmPassword) {
messageApi.error('两次输入的密码不一致');
return;
}
if (isEmpty(values.newPassword)) {
messageApi.error('请输入新密码');
return;
}
setLoading(true);
// 发送重置密码请求
const res = await request<ApiResponse.SuccessItem<string>>(`/lms/User/ResetPassword/${initialState?.currentUser?.id}`, {
method: 'POST',
data: {
"newPassword": values.newPassword,
}
});
if (res.code !== 1) {
throw new Error(res.message);
}
messageApi.success('密码重置成功');
form.resetFields();
} catch (error: any) {
messageApi.error(error.message || '密码重置失败');
} finally {
setLoading(false);
}
};
return (
<Card
bordered={false}
style={{
borderRadius: '8px',
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.05)',
margin: "20px"
}}
>
{contextHolder}
<div style={{ textAlign: 'center', marginBottom: '20px' }}>
<LockOutlined style={{ fontSize: '28px', color: '#1890ff', marginBottom: '12px' }} />
<Title level={4} style={{ margin: 0 }}></Title>
</div>
<Form
form={form}
layout="vertical"
name="resetPassword"
size="large"
onFinish={handleResetPassword}
>
<Form.Item
name="newPassword"
rules={[
{ required: true, message: '请输入新密码' },
{
pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?.&.])[A-Za-z\d@$!%*?.&]{8,}$/,
message: '密码必须至少8位包含大小写字母、数字和特殊字符'
}
]}
>
<Input.Password
prefix={<LockOutlined style={{ color: '#d9d9d9' }} />}
placeholder="请输入新密码"
style={{
height: '45px',
borderRadius: '4px',
}}
/>
</Form.Item>
<Form.Item
name="confirmPassword"
dependencies={['newPassword']}
rules={[
{ required: true, message: '请再次输入新密码' },
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('newPassword') === value) {
return Promise.resolve();
}
return Promise.reject(new Error('两次输入的密码不一致'));
},
})
]}
>
<Input.Password
prefix={<LockOutlined style={{ color: '#d9d9d9' }} />}
placeholder="请再次输入新密码"
style={{
height: '45px',
borderRadius: '4px',
}}
/>
</Form.Item>
<Form.Item style={{ marginTop: '24px', marginBottom: '0' }}>
<Button
type="primary"
htmlType="submit"
loading={loading}
style={{
width: '100%',
height: '45px',
borderRadius: '4px',
}}
>
</Button>
</Form.Item>
</Form>
</Card>
);
};
export default ResetPassword;