Files
shihezi-admin/src/pages/System/User/components/ResetPwd.tsx
2025-11-28 17:49:29 +08:00

124 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import { Form, Modal } from 'antd';
import { useIntl } from '@umijs/max';
import { ProForm, ProFormText } from '@ant-design/pro-components';
/* *
*
* @author whiteshader@163.com
* @datetime 2023/02/06
*
* */
export type FormValueType = any & Partial<API.System.User>;
export type UpdateFormProps = {
onCancel: (flag?: boolean, formVals?: FormValueType) => void;
onSubmit: (values: FormValueType) => Promise<void>;
open: boolean;
values: Partial<API.System.User>;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const [form] = Form.useForm();
const loginPassword = Form.useWatch('password', form);
const userId = props.values.userId;
const intl = useIntl();
const handleOk = () => {
form.submit();
};
const handleCancel = () => {
props.onCancel();
};
const handleFinish = async (values: Record<string, any>) => {
props.onSubmit({ ...values, userId } as FormValueType);
};
// 密码强度校验
const validatePasswordStrength = (rule: any, value: string) => {
if (!value) {
return Promise.reject(new Error('登录密码不可为空。'));
}
if (value.length < 8) {
return Promise.reject(new Error('密码长度至少8位。'));
}
// 检查密码复杂度:至少包含大小写字母、数字、特殊字符中的三种
const hasLowerCase = /[a-z]/.test(value);
const hasUpperCase = /[A-Z]/.test(value);
const hasNumber = /[0-9]/.test(value);
const hasSpecialChar = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(value);
const complexityCount = [hasLowerCase, hasUpperCase, hasNumber, hasSpecialChar].filter(Boolean).length;
if (complexityCount < 3) {
return Promise.reject(new Error('密码需包含大小写字母、数字、特殊字符中的至少三种。'));
}
return Promise.resolve();
};
// 确认密码校验
const checkPassword = (rule: any, value: string) => {
if (!value) {
return Promise.reject(new Error('确认密码不可为空。'));
}
if (value !== loginPassword) {
return Promise.reject(new Error('两次密码输入不一致'));
}
return Promise.resolve();
};
return (
<Modal
width={640}
title={intl.formatMessage({
id: 'system.user.reset.password',
defaultMessage: '密码重置',
})}
open={props.open}
destroyOnClose
onOk={handleOk}
onCancel={handleCancel}
>
<ProForm
grid={true}
form={form}
layout="horizontal"
onFinish={handleFinish}
initialValues={{
password: '',
confirm_password: '',
}}
>
<p>{props.values.userName}</p>
<ProFormText.Password
name="password"
label="登录密码"
rules={[
{
validator: validatePasswordStrength,
},
]}
placeholder="请输入新密码"
/>
<ProFormText.Password
name="confirm_password"
label="确认密码"
rules={[
{
validator: checkPassword,
},
]}
placeholder="请再次输入密码"
/>
</ProForm>
</Modal>
);
};
export default UpdateForm;