|  |  | 
 |  |  | import { List } from 'antd'; | 
 |  |  | import { Card, Form, message } from 'antd'; | 
 |  |  | import React from 'react'; | 
 |  |  | import { | 
 |  |  |   ProForm, | 
 |  |  |   ProFormText | 
 |  |  | } from '@ant-design/pro-components'; | 
 |  |  | import { FormattedMessage, useIntl } from '@umijs/max'; | 
 |  |  | import { useModel } from '@umijs/max'; | 
 |  |  | import Http from '@/utils/http'; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | const passwordStrength = { | 
 |  |  |   strong: <span className="strong">强</span>, | 
 |  |  |   medium: <span className="medium">中</span>, | 
 |  |  |   weak: <span className="weak">弱 Weak</span>, | 
 |  |  | const resetPwd = async (val, form, intl) => { | 
 |  |  |   const hide = message.loading(intl.formatMessage({ id: 'page.updating', defaultMessage: '正在修改' })); | 
 |  |  |   try { | 
 |  |  |     const resp = await Http.doPost('api/user/reset/pwd', val); | 
 |  |  |     if (resp.code === 200) { | 
 |  |  |       message.success(intl.formatMessage({ id: 'page.update.success', defaultMessage: '修改成功' })); | 
 |  |  |       form.resetFields(); | 
 |  |  |       return true; | 
 |  |  |     } else { | 
 |  |  |       message.error(resp.msg); | 
 |  |  |       return false; | 
 |  |  |     } | 
 |  |  |   } catch (error) { | 
 |  |  |     message.error(intl.formatMessage({ id: 'page.update.fail', defaultMessage: '修改失败请重试!' })); | 
 |  |  |     return false; | 
 |  |  |   } finally { | 
 |  |  |     hide(); | 
 |  |  |   } | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | const SecurityView = () => { | 
 |  |  |   const getData = () => [ | 
 |  |  |     { | 
 |  |  |       title: '账户密码', | 
 |  |  |       description: ( | 
 |  |  |         <> | 
 |  |  |           当前密码强度: | 
 |  |  |           {passwordStrength.strong} | 
 |  |  |         </> | 
 |  |  |       ), | 
 |  |  |       actions: [<a key="Modify">修改</a>], | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       title: '密保手机', | 
 |  |  |       description: `已绑定手机:138****8293`, | 
 |  |  |       actions: [<a key="Modify">修改</a>], | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       title: '密保问题', | 
 |  |  |       description: '未设置密保问题,密保问题可有效保护账户安全', | 
 |  |  |       actions: [<a key="Set">设置</a>], | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       title: '备用邮箱', | 
 |  |  |       description: `已绑定邮箱:ant***sign.com`, | 
 |  |  |       actions: [<a key="Modify">修改</a>], | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       title: 'MFA 设备', | 
 |  |  |       description: '未绑定 MFA 设备,绑定后,可以进行二次确认', | 
 |  |  |       actions: [<a key="bind">绑定</a>], | 
 |  |  |     }, | 
 |  |  |   ]; | 
 |  |  |   const intl = useIntl(); | 
 |  |  |   const [form] = Form.useForm(); | 
 |  |  |   const { initialState } = useModel('@@initialState'); | 
 |  |  |   const { currentUser } = initialState || {}; | 
 |  |  |  | 
 |  |  |   const data = getData(); | 
 |  |  |   const handleFinish = (values) => { | 
 |  |  |     resetPwd({ ...values, id: currentUser.id }, form, intl); | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   return ( | 
 |  |  |     <> | 
 |  |  |       <List | 
 |  |  |         itemLayout="horizontal" | 
 |  |  |         dataSource={data} | 
 |  |  |         renderItem={(item) => ( | 
 |  |  |           <List.Item actions={item.actions}> | 
 |  |  |             <List.Item.Meta title={item.title} description={item.description} /> | 
 |  |  |           </List.Item> | 
 |  |  |         )} | 
 |  |  |       /> | 
 |  |  |       <Card> | 
 |  |  |         <ProForm | 
 |  |  |           form={form} | 
 |  |  |           layout="vertical" | 
 |  |  |           onFinish={handleFinish} | 
 |  |  |           submitter={{ | 
 |  |  |             searchConfig: { | 
 |  |  |               submitText: intl.formatMessage({ id: 'personal.security.button.name', defaultMessage: '修改密码' }), | 
 |  |  |             }, | 
 |  |  |             render: (_, dom) => dom[1], | 
 |  |  |           }} | 
 |  |  |         > | 
 |  |  |           <ProFormText.Password | 
 |  |  |             width="md" | 
 |  |  |             name="oldPwd" | 
 |  |  |             label={intl.formatMessage({ id: 'personal.security.cur.pwd', defaultMessage: '当前密码' })} | 
 |  |  |             rules={[ | 
 |  |  |               { | 
 |  |  |                 required: true, | 
 |  |  |               }, | 
 |  |  |             ]} | 
 |  |  |           /> | 
 |  |  |           <ProFormText.Password | 
 |  |  |             width="md" | 
 |  |  |             name="password" | 
 |  |  |             label={intl.formatMessage({ id: 'personal.security.new.pwd', defaultMessage: '新密码' })} | 
 |  |  |             rules={[ | 
 |  |  |               { | 
 |  |  |                 required: true, | 
 |  |  |               }, | 
 |  |  |               { | 
 |  |  |                 validator(_, value) { | 
 |  |  |                   if (value.length >= 4 && value.length <= 16) { | 
 |  |  |                     return Promise.resolve(); | 
 |  |  |                   } | 
 |  |  |                   return Promise.reject(new Error(intl.formatMessage({ id: 'personal.security.new.pwd.rule.length', defaultMessage: '新密码必须是4到16个字符!' }))); | 
 |  |  |                 }, | 
 |  |  |               }, | 
 |  |  |             ]} | 
 |  |  |           /> | 
 |  |  |           <ProFormText.Password | 
 |  |  |             width="md" | 
 |  |  |             name="passwordRepeat" | 
 |  |  |             label={intl.formatMessage({ id: 'personal.security.new.pwd.confirm', defaultMessage: '确认密码' })} | 
 |  |  |             rules={[ | 
 |  |  |               { | 
 |  |  |                 required: true, | 
 |  |  |               }, | 
 |  |  |               { | 
 |  |  |                 validator(_, value) { | 
 |  |  |                   if (form.getFieldValue('password') === value) return Promise.resolve(); | 
 |  |  |                   return Promise.reject(new Error(intl.formatMessage({ id: 'personal.security.new.pwd.rule.check', defaultMessage: '两次输入的密码不相符!' }))); | 
 |  |  |                 } | 
 |  |  |               } | 
 |  |  |             ]} | 
 |  |  |           /> | 
 |  |  |         </ProForm> | 
 |  |  |       </Card> | 
 |  |  |     </> | 
 |  |  |   ); | 
 |  |  | }; |