feact: 个人中心模块开发
parent
1ed2ce6800
commit
bef3a5cc59
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 130 KiB |
@ -0,0 +1,14 @@
|
|||||||
|
export const account_center: { [key: string]: string } = {
|
||||||
|
'account.account_center.table.list.id': 'ID',
|
||||||
|
'account.account_center.table.list.account': '登录账号',
|
||||||
|
'account.account_center.table.list.originalPassword': '原密码',
|
||||||
|
'account.account_center.table.list.newPassword': '新密码',
|
||||||
|
'account.account_center.table.list.confirmPassword': '确认密码',
|
||||||
|
'account.account_center.table.rule.required.account': '登录账号为必填项',
|
||||||
|
'account.account_center.table.rule.required.originalPassword': '原登录密码为必填项',
|
||||||
|
'account.account_center.table.rule.required.newPassword': '新登录密码为必填项',
|
||||||
|
'account.account_center.table.rule.required.confirmPassword': '确认登录密码为必填项',
|
||||||
|
'account.account_center.table.list.editor': '修改',
|
||||||
|
'account.account_center.table.list.UpdateAccountForm': '修改账号',
|
||||||
|
'account.account_center.table.list.UpdatePasswordForm': '修改密码',
|
||||||
|
};
|
@ -0,0 +1,24 @@
|
|||||||
|
.infoBox {
|
||||||
|
margin-left: 78px;
|
||||||
|
padding-top: 5px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
height: 90px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.infoBoxRight {
|
||||||
|
margin-left: 65px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
height: 90px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.spanStyle {
|
||||||
|
display: inline-block;
|
||||||
|
width: 68px;
|
||||||
|
color: #666;
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
import { putProjectUpdateProject } from '@/services/project/Project';
|
||||||
|
import {
|
||||||
|
ModalForm,
|
||||||
|
ProForm,
|
||||||
|
ProFormText,
|
||||||
|
} from '@ant-design/pro-components';
|
||||||
|
import { FormattedMessage, useIntl } from '@umijs/max';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
import { proFormSmallItemStyleProps, proFormSmallModelWidth } from '../../../../../config/defaultForm';
|
||||||
|
import React from 'react';
|
||||||
|
export type FormValueType = {
|
||||||
|
target?: string;
|
||||||
|
template?: string;
|
||||||
|
type?: string;
|
||||||
|
time?: string;
|
||||||
|
frequency?: string;
|
||||||
|
} & Partial<API.Project>;
|
||||||
|
|
||||||
|
export type UpdateFormProps = {
|
||||||
|
updateModalOpen: boolean;
|
||||||
|
handleModal: () => void;
|
||||||
|
values: Partial<API.Project>;
|
||||||
|
reload: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const UpdateAccountForm: React.FC<UpdateFormProps> = (props) => {
|
||||||
|
const intl = useIntl();
|
||||||
|
const [form] = Form.useForm<API.Project>();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalForm<API.Project>
|
||||||
|
width={proFormSmallModelWidth}
|
||||||
|
title={intl.formatMessage({
|
||||||
|
id: 'account.account_center.table.list.UpdateAccountForm',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}
|
||||||
|
open={props.updateModalOpen}
|
||||||
|
form={form}
|
||||||
|
autoFocusFirstInput
|
||||||
|
modalProps={{
|
||||||
|
destroyOnClose: true,
|
||||||
|
onCancel: () => props.handleModal(),
|
||||||
|
}}
|
||||||
|
submitTimeout={2000}
|
||||||
|
onFinish={async (values) => {
|
||||||
|
putProjectUpdateProject(values)
|
||||||
|
.then(() => {
|
||||||
|
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
|
||||||
|
props.reload();
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
|
||||||
|
});
|
||||||
|
|
||||||
|
props.handleModal();
|
||||||
|
return true;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ProForm.Group>
|
||||||
|
<ProFormText
|
||||||
|
width={proFormSmallItemStyleProps.width}
|
||||||
|
name="name"
|
||||||
|
label={<FormattedMessage id="account.account_center.table.list.account" defaultMessage="$$$" />}
|
||||||
|
placeholder={`${intl.formatMessage({
|
||||||
|
id: 'common.please_input',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}${intl.formatMessage({
|
||||||
|
id: 'account.account_center.table.list.account',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}`}
|
||||||
|
required={true}
|
||||||
|
initialValue={props.values.name}
|
||||||
|
disabled={false}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: (
|
||||||
|
<FormattedMessage
|
||||||
|
id="account.account_center.table.rule.required.account"
|
||||||
|
defaultMessage="account is required"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</ProForm.Group>
|
||||||
|
</ModalForm>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default UpdateAccountForm;
|
@ -0,0 +1,144 @@
|
|||||||
|
import { putProjectUpdateProject } from '@/services/project/Project';
|
||||||
|
import {
|
||||||
|
ModalForm,
|
||||||
|
ProForm,
|
||||||
|
ProFormText,
|
||||||
|
} from '@ant-design/pro-components';
|
||||||
|
import { FormattedMessage, useIntl } from '@umijs/max';
|
||||||
|
import { Form, message } from 'antd';
|
||||||
|
import { proFormSmallItemStyleProps, proFormSmallModelWidth } from '../../../../../config/defaultForm';
|
||||||
|
import React from 'react';
|
||||||
|
export type FormValueType = {
|
||||||
|
target?: string;
|
||||||
|
template?: string;
|
||||||
|
type?: string;
|
||||||
|
time?: string;
|
||||||
|
frequency?: string;
|
||||||
|
} & Partial<API.Project>;
|
||||||
|
|
||||||
|
export type UpdateFormProps = {
|
||||||
|
updateModalOpen: boolean;
|
||||||
|
handleModal: () => void;
|
||||||
|
values: Partial<API.Project>;
|
||||||
|
reload: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const UpdatePasswordForm: React.FC<UpdateFormProps> = (props) => {
|
||||||
|
const intl = useIntl();
|
||||||
|
const [form] = Form.useForm<API.Project>();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalForm<API.Project>
|
||||||
|
width={proFormSmallModelWidth}
|
||||||
|
title={intl.formatMessage({
|
||||||
|
id: 'account.account_center.table.list.UpdatePasswordForm',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}
|
||||||
|
open={props.updateModalOpen}
|
||||||
|
form={form}
|
||||||
|
autoFocusFirstInput
|
||||||
|
modalProps={{
|
||||||
|
destroyOnClose: true,
|
||||||
|
onCancel: () => props.handleModal(),
|
||||||
|
}}
|
||||||
|
submitTimeout={2000}
|
||||||
|
onFinish={async (values) => {
|
||||||
|
putProjectUpdateProject(values)
|
||||||
|
.then(() => {
|
||||||
|
message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
|
||||||
|
props.reload();
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }));
|
||||||
|
});
|
||||||
|
|
||||||
|
props.handleModal();
|
||||||
|
return true;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ProForm.Group>
|
||||||
|
<ProFormText
|
||||||
|
width={proFormSmallItemStyleProps.width}
|
||||||
|
name="name"
|
||||||
|
label={<FormattedMessage id="account.account_center.table.list.originalPassword" defaultMessage="$$$" />}
|
||||||
|
placeholder={`${intl.formatMessage({
|
||||||
|
id: 'common.please_input',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}${intl.formatMessage({
|
||||||
|
id: 'account.account_center.table.list.originalPassword',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}`}
|
||||||
|
required={true}
|
||||||
|
initialValue={props.values.name}
|
||||||
|
disabled={false}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: (
|
||||||
|
<FormattedMessage
|
||||||
|
id="account.account_center.table.rule.required.originalPassword"
|
||||||
|
defaultMessage="name is required"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<ProFormText
|
||||||
|
width={proFormSmallItemStyleProps.width}
|
||||||
|
name="name"
|
||||||
|
label={<FormattedMessage id="account.account_center.table.list.newPassword" defaultMessage="$$$" />}
|
||||||
|
placeholder={`${intl.formatMessage({
|
||||||
|
id: 'common.please_input',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}${intl.formatMessage({
|
||||||
|
id: 'account.account_center.table.list.newPassword',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}`}
|
||||||
|
required={true}
|
||||||
|
initialValue={props.values.name}
|
||||||
|
disabled={false}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: (
|
||||||
|
<FormattedMessage
|
||||||
|
id="account.account_center.table.rule.required.newPassword"
|
||||||
|
defaultMessage="name is required"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<ProFormText
|
||||||
|
width={proFormSmallItemStyleProps.width}
|
||||||
|
name="name"
|
||||||
|
label={<FormattedMessage id="account.account_center.table.list.confirmPassword" defaultMessage="$$$" />}
|
||||||
|
placeholder={`${intl.formatMessage({
|
||||||
|
id: 'common.please_input',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}${intl.formatMessage({
|
||||||
|
id: 'account.account_center.table.list.confirmPassword',
|
||||||
|
defaultMessage: '$$$',
|
||||||
|
})}`}
|
||||||
|
required={true}
|
||||||
|
initialValue={props.values.name}
|
||||||
|
disabled={false}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: (
|
||||||
|
<FormattedMessage
|
||||||
|
id="account.account_center.table.rule.required.confirmPassword"
|
||||||
|
defaultMessage="name is required"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</ProForm.Group>
|
||||||
|
</ModalForm>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default UpdatePasswordForm;
|
@ -0,0 +1,167 @@
|
|||||||
|
import { PageContainer, ProCard } from '@ant-design/pro-components';
|
||||||
|
import React, { useEffect, useRef, useState } from 'react';
|
||||||
|
|
||||||
|
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
|
||||||
|
import { Button, message, Upload } from 'antd';
|
||||||
|
import type { UploadChangeParam } from 'antd/es/upload';
|
||||||
|
import type { RcFile, UploadFile, UploadProps } from 'antd/es/upload/interface';
|
||||||
|
import type { ActionType } from '@ant-design/pro-components';
|
||||||
|
// svg 转组件
|
||||||
|
import { ReactComponent as AvatarSvg } from '../../../../public/icons/avatar.svg';
|
||||||
|
import styles from "./center.less";
|
||||||
|
import UpdateAccountForm from './components/UpdateAccountForm';
|
||||||
|
import UpdatePasswordForm from './components/UpdatePasswordForm';
|
||||||
|
import { FormattedMessage } from '@umijs/max';
|
||||||
|
|
||||||
|
const getBase64 = (img: RcFile, callback: (url: string) => void) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.addEventListener('load', () => callback(reader.result as string));
|
||||||
|
reader.readAsDataURL(img);
|
||||||
|
};
|
||||||
|
|
||||||
|
const beforeUpload = (file: RcFile) => {
|
||||||
|
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
|
||||||
|
if (!isJpgOrPng) {
|
||||||
|
message.error('You can only upload JPG/PNG file!');
|
||||||
|
}
|
||||||
|
const isLt2M = file.size / 1024 / 1024 < 2;
|
||||||
|
if (!isLt2M) {
|
||||||
|
message.error('Image must smaller than 2MB!');
|
||||||
|
}
|
||||||
|
return isJpgOrPng && isLt2M;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @个人中心
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const AccountCenter: React.FC = () => {
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [imageUrl, setImageUrl] = useState<string>();
|
||||||
|
const actionRef = useRef<ActionType>();
|
||||||
|
const [updateAccountModalOpen, setUpdateAccountModalOpen] = useState<boolean>(false);
|
||||||
|
const [updatePasswordModalOpen, setUpdatePasswordModalOpen] = useState<boolean>(false);
|
||||||
|
const [currentRow, setCurrentRow] = useState<API.Project>();
|
||||||
|
|
||||||
|
const handleUpdateAccountModal = () => {
|
||||||
|
if (updateAccountModalOpen) {
|
||||||
|
setUpdateAccountModalOpen(false);
|
||||||
|
setCurrentRow(undefined);
|
||||||
|
} else {
|
||||||
|
setUpdateAccountModalOpen(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleUpdatePasswordModal = () => {
|
||||||
|
if (updatePasswordModalOpen) {
|
||||||
|
setUpdatePasswordModalOpen(false);
|
||||||
|
setCurrentRow(undefined);
|
||||||
|
} else {
|
||||||
|
setUpdatePasswordModalOpen(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleChange: UploadProps['onChange'] = (info: UploadChangeParam<UploadFile>) => {
|
||||||
|
if (info.file.status === 'uploading') {
|
||||||
|
setLoading(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (info.file.status === 'done') {
|
||||||
|
// Get this url from response in real world.
|
||||||
|
getBase64(info.file.originFileObj as RcFile, (url) => {
|
||||||
|
setLoading(false);
|
||||||
|
setImageUrl(url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
console.log(info);
|
||||||
|
};
|
||||||
|
|
||||||
|
const uploadButton = (
|
||||||
|
<div style={{ width: 100,height: 100, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
|
||||||
|
{loading ? <LoadingOutlined /> : <AvatarSvg />}
|
||||||
|
{/* <div style={{ marginTop: 8 }}>Upload</div> */}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PageContainer>
|
||||||
|
<ProCard
|
||||||
|
style={{ background: 'white' }}
|
||||||
|
bodyStyle={{
|
||||||
|
padding: 40,
|
||||||
|
margin: 0,
|
||||||
|
display: 'flex'
|
||||||
|
}}
|
||||||
|
gutter={24}
|
||||||
|
wrap
|
||||||
|
ghost
|
||||||
|
>
|
||||||
|
<Upload
|
||||||
|
name="avatar"
|
||||||
|
// listType="picture-card"
|
||||||
|
// className="avatar-uploader"
|
||||||
|
showUploadList={false}
|
||||||
|
maxCount={1}
|
||||||
|
action="https://run.mocky.io/v3/435e224c-44fb-4773-9faf-380c5e6a2188"
|
||||||
|
beforeUpload={beforeUpload}
|
||||||
|
onChange={handleChange}
|
||||||
|
>
|
||||||
|
{imageUrl ? <img src={imageUrl} alt="avatar" style={{ width: 100,height: 100 }} /> : uploadButton}
|
||||||
|
</Upload>
|
||||||
|
<div className={styles.infoBox}>
|
||||||
|
<div>
|
||||||
|
<span className={styles.spanStyle}>用户名:</span>王立强
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span className={styles.spanStyle}>账号ID:</span>awtk-55975980
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span className={styles.spanStyle}>注册时间:</span>2012-10-16 23:55:35
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.infoBoxRight}>
|
||||||
|
<div>
|
||||||
|
<span className={styles.spanStyle}>登录账号:</span>wangliqun
|
||||||
|
<Button
|
||||||
|
type="link"
|
||||||
|
color="#154DDD"
|
||||||
|
onClick={() => {
|
||||||
|
setUpdateAccountModalOpen(true);
|
||||||
|
setCurrentRow({});
|
||||||
|
}}>
|
||||||
|
<FormattedMessage id="account.account_center.table.list.editor" defaultMessage="editor" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span className={styles.spanStyle}>登录密码:</span>wangliqun
|
||||||
|
<Button
|
||||||
|
type="link"
|
||||||
|
color="#154DDD"
|
||||||
|
onClick={() => {
|
||||||
|
setUpdatePasswordModalOpen(true);
|
||||||
|
setCurrentRow({});
|
||||||
|
}}>
|
||||||
|
<FormattedMessage id="account.account_center.table.list.editor" defaultMessage="editor" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ProCard>
|
||||||
|
<UpdateAccountForm
|
||||||
|
updateModalOpen={updateAccountModalOpen}
|
||||||
|
values={currentRow || {}}
|
||||||
|
handleModal={handleUpdateAccountModal}
|
||||||
|
reload={actionRef.current?.reload}
|
||||||
|
/>
|
||||||
|
<UpdatePasswordForm
|
||||||
|
updateModalOpen={updatePasswordModalOpen}
|
||||||
|
values={currentRow || {}}
|
||||||
|
handleModal={handleUpdatePasswordModal}
|
||||||
|
reload={actionRef.current?.reload}
|
||||||
|
/>
|
||||||
|
</PageContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AccountCenter;
|
Loading…
Reference in New Issue