blob: 8622219a7e2f8a0e82644adafd69f0890d0b8db7 [file] [log] [blame]
Jiarenxiang38dcb052025-03-13 16:40:09 +08001import {
2 ClusterOutlined,
3 MailOutlined,
4 TeamOutlined,
5 UserOutlined,
6 MobileOutlined,
7 ManOutlined,
8} from '@ant-design/icons';
9import { Card, Col, Divider, List, Row } from 'antd';
10import React, { useState } from 'react';
11import styles from './Center.less';
12import BaseInfo from './components/BaseInfo';
13import ResetPassword from './components/ResetPassword';
14import AvatarCropper from './components/AvatarCropper';
15import { useRequest } from '@umijs/max';
16import { getUserInfo } from '@/services/session';
17import { PageLoading } from '@ant-design/pro-components';
18
19const operationTabList = [
20 {
21 key: 'base',
22 tab: (
23 <span>
24 基本资料
25 </span>
26 ),
27 },
28 {
29 key: 'password',
30 tab: (
31 <span>
32 重置密码
33 </span>
34 ),
35 },
36];
37
38export type tabKeyType = 'base' | 'password';
39
40const Center: React.FC = () => {
zhaoyumaof8f81842025-06-09 00:00:46 +080041
Jiarenxiang38dcb052025-03-13 16:40:09 +080042 const [tabKey, setTabKey] = useState<tabKeyType>('base');
zhaoyumaof8f81842025-06-09 00:00:46 +080043
Jiarenxiang38dcb052025-03-13 16:40:09 +080044 const [cropperModalOpen, setCropperModalOpen] = useState<boolean>(false);
zhaoyumaof8f81842025-06-09 00:00:46 +080045
Jiarenxiang38dcb052025-03-13 16:40:09 +080046 // 获取用户信息
47 const { data: userInfo, loading } = useRequest(async () => {
48 return { data: await getUserInfo()};
49 });
50 if (loading) {
51 return <div>loading...</div>;
52 }
53
54 const currentUser = userInfo?.user;
55
56 // 渲染用户信息
57 const renderUserInfo = ({
58 userName,
59 phonenumber,
60 email,
61 sex,
62 dept,
63 }: Partial<API.CurrentUser>) => {
64 return (
65 <List>
66 <List.Item>
67 <div>
68 <UserOutlined
69 style={{
70 marginRight: 8,
71 }}
72 />
73 用户名
74 </div>
75 <div>{userName}</div>
76 </List.Item>
77 <List.Item>
78 <div>
79 <ManOutlined
80 style={{
81 marginRight: 8,
82 }}
83 />
84 性别
85 </div>
86 <div>{sex === '1' ? '女' : '男'}</div>
87 </List.Item>
88 <List.Item>
89 <div>
90 <MobileOutlined
91 style={{
92 marginRight: 8,
93 }}
94 />
95 电话
96 </div>
97 <div>{phonenumber}</div>
98 </List.Item>
99 <List.Item>
100 <div>
101 <MailOutlined
102 style={{
103 marginRight: 8,
104 }}
105 />
106 邮箱
107 </div>
108 <div>{email}</div>
109 </List.Item>
110 <List.Item>
111 <div>
112 <ClusterOutlined
113 style={{
114 marginRight: 8,
115 }}
116 />
117 部门
118 </div>
119 <div>{dept?.deptName}</div>
120 </List.Item>
121 </List>
122 );
123 };
124
125 // 渲染tab切换
126 const renderChildrenByTabKey = (tabValue: tabKeyType) => {
127 if (tabValue === 'base') {
128 return <BaseInfo values={currentUser} />;
129 }
130 if (tabValue === 'password') {
131 return <ResetPassword />;
132 }
133 return null;
134 };
135
136 if (!currentUser) {
137 return <PageLoading />;
138 }
139
140 return (
141 <div>
142 <Row gutter={[16, 24]}>
143 <Col lg={8} md={24}>
144 <Card
145 title="个人信息"
146 bordered={false}
147 loading={loading}
148 >
149 {!loading && (
150 <div style={{ textAlign: "center"}}>
151 <div className={styles.avatarHolder} onClick={()=>{setCropperModalOpen(true)}}>
152 <img alt="" src={currentUser.avatar} />
153 </div>
154 {renderUserInfo(currentUser)}
155 <Divider dashed />
156 <div className={styles.team}>
157 <div className={styles.teamTitle}>角色</div>
158 <Row gutter={36}>
159 {currentUser.roles &&
160 currentUser.roles.map((item: any) => (
161 <Col key={item.roleId} lg={24} xl={12}>
162 <TeamOutlined
163 style={{
164 marginRight: 8,
165 }}
166 />
167 {item.roleName}
168 </Col>
169 ))}
170 </Row>
171 </div>
172 </div>
173 )}
174 </Card>
175 </Col>
176 <Col lg={16} md={24}>
177 <Card
178 bordered={false}
179 tabList={operationTabList}
180 activeTabKey={tabKey}
181 onTabChange={(_tabKey: string) => {
182 setTabKey(_tabKey as tabKeyType);
183 }}
184 >
185 {renderChildrenByTabKey(tabKey)}
186 </Card>
187 </Col>
188 </Row>
189 <AvatarCropper
190 onFinished={() => {
zhaoyumaof8f81842025-06-09 00:00:46 +0800191 setCropperModalOpen(false);
Jiarenxiang38dcb052025-03-13 16:40:09 +0800192 }}
193 open={cropperModalOpen}
194 data={currentUser.avatar}
195 />
196 </div>
197 );
198};
199
200export default Center;