blob: 4028e1125d9f0839f9829502f3627cb638909594 [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 // 渲染用户信息
Atopos0524d0a63ad2025-06-09 23:34:18 +080063 // @ts-ignore
86133aaa3f5d2025-04-20 21:33:29 +080064 const renderUserInfo = ({
Atopos0524d0a63ad2025-06-09 23:34:18 +080065 userName,
66 phonenumber,
67 email,
68 sex,
69 dept,
70 uploadCount,
71 downloadCount,
72 rateCount,
73 score,
74 level,
75 }: Partial<API.CurrentUser>) => {
86133aaa3f5d2025-04-20 21:33:29 +080076 return (
77 <List>
78 <List.Item>
79 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +080080 <UserOutlined style={{ marginRight: 8 }} />
86133aaa3f5d2025-04-20 21:33:29 +080081 用户名
82 </div>
83 <div>{userName}</div>
84 </List.Item>
85 <List.Item>
86 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +080087 <ManOutlined style={{ marginRight: 8 }} />
86133aaa3f5d2025-04-20 21:33:29 +080088 性别
89 </div>
90 <div>{sex === '1' ? '女' : '男'}</div>
91 </List.Item>
92 <List.Item>
93 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +080094 <MobileOutlined style={{ marginRight: 8 }} />
86133aaa3f5d2025-04-20 21:33:29 +080095 电话
96 </div>
97 <div>{phonenumber}</div>
98 </List.Item>
99 <List.Item>
100 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800101 <MailOutlined style={{ marginRight: 8 }} />
86133aaa3f5d2025-04-20 21:33:29 +0800102 邮箱
103 </div>
104 <div>{email}</div>
105 </List.Item>
106 <List.Item>
107 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800108 <MailOutlined style={{ marginRight: 8 }} />
BirdNETMb0f71532025-05-26 17:37:33 +0800109 上传量
110 </div>
111 <div>{uploadCount}</div>
112 </List.Item>
113 <List.Item>
114 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800115 <MailOutlined style={{ marginRight: 8 }} />
BirdNETMb0f71532025-05-26 17:37:33 +0800116 下载量
117 </div>
118 <div>{downloadCount}</div>
119 </List.Item>
120 <List.Item>
121 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800122 <MailOutlined style={{ marginRight: 8 }} />
BirdNETMb0f71532025-05-26 17:37:33 +0800123 分享率
124 </div>
125 <div>{rateCount}</div>
126 </List.Item>
BirdNETMb0f71532025-05-26 17:37:33 +0800127 <List.Item>
128 <div>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800129 <MailOutlined style={{ marginRight: 8 }} />
BirdNETMb0f71532025-05-26 17:37:33 +0800130 积分
131 </div>
132 <div>{score}</div>
86133aaa3f5d2025-04-20 21:33:29 +0800133 </List.Item>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800134 <List.Item>
135 <div>
136 <MailOutlined style={{ marginRight: 8 }} />
137 用户等级
138 </div>
139 <div>{level}</div>
140 </List.Item>
86133aaa3f5d2025-04-20 21:33:29 +0800141 </List>
142 );
143 };
144
Atopos0524d0a63ad2025-06-09 23:34:18 +0800145
86133aaa3f5d2025-04-20 21:33:29 +0800146 // 渲染tab切换
147 const renderChildrenByTabKey = (tabValue: tabKeyType) => {
148 if (tabValue === 'base') {
149 return <BaseInfo values={currentUser} />;
150 }
151 if (tabValue === 'password') {
152 return <ResetPassword />;
153 }
154 return null;
155 };
156
157 if (!currentUser) {
158 return <PageLoading />;
159 }
160
161 return (
162 <div>
163 <Row gutter={[16, 24]}>
164 <Col lg={8} md={24}>
165 <Card
166 title="个人信息"
167 bordered={false}
168 loading={loading}
169 >
170 {!loading && (
BirdNETMb0f71532025-05-26 17:37:33 +0800171 <div style={{ textAlign: "center" }}>
172 <div className={styles.avatarHolder} onClick={() => { setCropperModalOpen(true) }}>
86133aaa3f5d2025-04-20 21:33:29 +0800173 <img alt="" src={currentUser.avatar} />
174 </div>
Atopos0524d0a63ad2025-06-09 23:34:18 +0800175
176 `` `````````````````````````````````1
86133aaa3f5d2025-04-20 21:33:29 +0800177 {renderUserInfo(currentUser)}
178 <Divider dashed />
BirdNETMb0f71532025-05-26 17:37:33 +0800179 {/* <div className={styles.team}>
86133aaa3f5d2025-04-20 21:33:29 +0800180 <div className={styles.teamTitle}>角色</div>
181 <Row gutter={36}>
182 {currentUser.roles &&
183 currentUser.roles.map((item: any) => (
184 <Col key={item.roleId} lg={24} xl={12}>
185 <TeamOutlined
186 style={{
187 marginRight: 8,
188 }}
189 />
190 {item.roleName}
191 </Col>
192 ))}
193 </Row>
BirdNETMb0f71532025-05-26 17:37:33 +0800194 </div> */}
86133aaa3f5d2025-04-20 21:33:29 +0800195 </div>
196 )}
197 </Card>
198 </Col>
199 <Col lg={16} md={24}>
200 <Card
201 bordered={false}
202 tabList={operationTabList}
203 activeTabKey={tabKey}
204 onTabChange={(_tabKey: string) => {
205 setTabKey(_tabKey as tabKeyType);
206 }}
207 >
208 {renderChildrenByTabKey(tabKey)}
209 </Card>
210 </Col>
211 </Row>
212 <AvatarCropper
213 onFinished={() => {
BirdNETMb0f71532025-05-26 17:37:33 +0800214 setCropperModalOpen(false);
86133aaa3f5d2025-04-20 21:33:29 +0800215 }}
216 open={cropperModalOpen}
217 data={currentUser.avatar}
218 />
219 </div>
220 );
221};
222
223export default Center;