blob: 7272fa31408f473c0b1757b21b15b36f156c4cd0 [file] [log] [blame]
86133aaa3f5d2025-04-20 21:33:29 +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';
BirdNETMb0f71532025-05-26 17:37:33 +080017import { getUserRateInfo } from '@/services/system/user';
86133aaa3f5d2025-04-20 21:33:29 +080018import { PageLoading } from '@ant-design/pro-components';
19
20const operationTabList = [
21 {
22 key: 'base',
23 tab: (
24 <span>
25 基本资料
26 </span>
27 ),
28 },
29 {
30 key: 'password',
31 tab: (
32 <span>
33 重置密码
34 </span>
35 ),
36 },
37];
38
39export type tabKeyType = 'base' | 'password';
40
41const Center: React.FC = () => {
BirdNETMb0f71532025-05-26 17:37:33 +080042
86133aaa3f5d2025-04-20 21:33:29 +080043 const [tabKey, setTabKey] = useState<tabKeyType>('base');
BirdNETMb0f71532025-05-26 17:37:33 +080044
86133aaa3f5d2025-04-20 21:33:29 +080045 const [cropperModalOpen, setCropperModalOpen] = useState<boolean>(false);
BirdNETMb0f71532025-05-26 17:37:33 +080046
86133aaa3f5d2025-04-20 21:33:29 +080047 // 获取用户信息
48 const { data: userInfo, loading } = useRequest(async () => {
BirdNETMb0f71532025-05-26 17:37:33 +080049 return { data: await getUserInfo() };
50 });
51
52 const { data: userRateInfo } = useRequest(async () => {
53 return { data: await getUserRateInfo() };
86133aaa3f5d2025-04-20 21:33:29 +080054 });
55 if (loading) {
56 return <div>loading...</div>;
57 }
58
BirdNETMb0f71532025-05-26 17:37:33 +080059 const currentUser = { ...userInfo?.user, ...userRateInfo?.data };
60
86133aaa3f5d2025-04-20 21:33:29 +080061
62 // 渲染用户信息
63 const renderUserInfo = ({
64 userName,
65 phonenumber,
66 email,
67 sex,
68 dept,
BirdNETMb0f71532025-05-26 17:37:33 +080069 uploadCount,
70 downloadCount,
71 rateCount,
72 score,
86133aaa3f5d2025-04-20 21:33:29 +080073 }: Partial<API.CurrentUser>) => {
74 return (
75 <List>
76 <List.Item>
77 <div>
78 <UserOutlined
79 style={{
80 marginRight: 8,
81 }}
82 />
83 用户名
84 </div>
85 <div>{userName}</div>
86 </List.Item>
87 <List.Item>
88 <div>
89 <ManOutlined
90 style={{
91 marginRight: 8,
92 }}
93 />
94 性别
95 </div>
96 <div>{sex === '1' ? '女' : '男'}</div>
97 </List.Item>
98 <List.Item>
99 <div>
100 <MobileOutlined
101 style={{
102 marginRight: 8,
103 }}
104 />
105 电话
106 </div>
107 <div>{phonenumber}</div>
108 </List.Item>
109 <List.Item>
110 <div>
111 <MailOutlined
112 style={{
113 marginRight: 8,
114 }}
115 />
116 邮箱
117 </div>
118 <div>{email}</div>
119 </List.Item>
120 <List.Item>
121 <div>
BirdNETMb0f71532025-05-26 17:37:33 +0800122 <MailOutlined
123 style={{
124 marginRight: 8,
125 }}
126 />
127 上传量
128 </div>
129 <div>{uploadCount}</div>
130 </List.Item>
131 <List.Item>
132 <div>
133 <MailOutlined
134 style={{
135 marginRight: 8,
136 }}
137 />
138 下载量
139 </div>
140 <div>{downloadCount}</div>
141 </List.Item>
142 <List.Item>
143 <div>
144 <MailOutlined
145 style={{
146 marginRight: 8,
147 }}
148 />
149 分享率
150 </div>
151 <div>{rateCount}</div>
152 </List.Item>
153 {/* <List.Item>
154 <div>
86133aaa3f5d2025-04-20 21:33:29 +0800155 <ClusterOutlined
156 style={{
157 marginRight: 8,
158 }}
159 />
160 部门
161 </div>
162 <div>{dept?.deptName}</div>
BirdNETMb0f71532025-05-26 17:37:33 +0800163 </List.Item> */}
164 <List.Item>
165 <div>
166 <MailOutlined
167 style={{
168 marginRight: 8,
169 }}
170 />
171 积分
172 </div>
173 <div>{score}</div>
86133aaa3f5d2025-04-20 21:33:29 +0800174 </List.Item>
175 </List>
176 );
177 };
178
179 // 渲染tab切换
180 const renderChildrenByTabKey = (tabValue: tabKeyType) => {
181 if (tabValue === 'base') {
182 return <BaseInfo values={currentUser} />;
183 }
184 if (tabValue === 'password') {
185 return <ResetPassword />;
186 }
187 return null;
188 };
189
190 if (!currentUser) {
191 return <PageLoading />;
192 }
193
194 return (
195 <div>
196 <Row gutter={[16, 24]}>
197 <Col lg={8} md={24}>
198 <Card
199 title="个人信息"
200 bordered={false}
201 loading={loading}
202 >
203 {!loading && (
BirdNETMb0f71532025-05-26 17:37:33 +0800204 <div style={{ textAlign: "center" }}>
205 <div className={styles.avatarHolder} onClick={() => { setCropperModalOpen(true) }}>
86133aaa3f5d2025-04-20 21:33:29 +0800206 <img alt="" src={currentUser.avatar} />
207 </div>
208 {renderUserInfo(currentUser)}
209 <Divider dashed />
BirdNETMb0f71532025-05-26 17:37:33 +0800210 {/* <div className={styles.team}>
86133aaa3f5d2025-04-20 21:33:29 +0800211 <div className={styles.teamTitle}>角色</div>
212 <Row gutter={36}>
213 {currentUser.roles &&
214 currentUser.roles.map((item: any) => (
215 <Col key={item.roleId} lg={24} xl={12}>
216 <TeamOutlined
217 style={{
218 marginRight: 8,
219 }}
220 />
221 {item.roleName}
222 </Col>
223 ))}
224 </Row>
BirdNETMb0f71532025-05-26 17:37:33 +0800225 </div> */}
86133aaa3f5d2025-04-20 21:33:29 +0800226 </div>
227 )}
228 </Card>
229 </Col>
230 <Col lg={16} md={24}>
231 <Card
232 bordered={false}
233 tabList={operationTabList}
234 activeTabKey={tabKey}
235 onTabChange={(_tabKey: string) => {
236 setTabKey(_tabKey as tabKeyType);
237 }}
238 >
239 {renderChildrenByTabKey(tabKey)}
240 </Card>
241 </Col>
242 </Row>
243 <AvatarCropper
244 onFinished={() => {
BirdNETMb0f71532025-05-26 17:37:33 +0800245 setCropperModalOpen(false);
86133aaa3f5d2025-04-20 21:33:29 +0800246 }}
247 open={cropperModalOpen}
248 data={currentUser.avatar}
249 />
250 </div>
251 );
252};
253
254export default Center;