zhouxiantao
8 days ago 03193b2a27a2c23e10f3a2f298de9c1142116780
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/**
 * @author 韩天尊
 * @time 2024-01-15
 * @version 1.0.0
 * @description 个人中心页面组件
 */
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAppContext } from '../context/AppContext';
import { pointsAPI } from '../services/api';
import './ProfilePage.css';
 
const ProfilePage: React.FC = () => {
    const { state, logout, loadAdminInfo } = useAppContext();
    const navigate = useNavigate();
    const [showLogoutDialog, setShowLogoutDialog] = useState(false);
    const [statsData, setStatsData] = useState({
        totalServiceHours: 0,
        monthServiceHours: 0,
        totalActivities: 0
    });
 
    // 加载积分概览数据
    useEffect(() => {
        const loadOverview = async () => {
            try {
                const response = await pointsAPI.getOverview();
                if (response.code === 0) {
                    const data = response.data as any;
                    setStatsData({
                        totalServiceHours: data.totalServiceHours || 0,
                        monthServiceHours: data.monthServiceHours || 0,
                        totalActivities: data.totalActivities || 0
                    });
                }
            } catch (error) {
                console.error('获取积分概览失败:', error);
            }
        };
        
        loadOverview();
    }, []);
 
    // 模拟数据(保留用于社区信息)
    const mockData = {
        community: '金牛奥翔社区',
        isVerified: false
    };
 
    const handleVolunteerRegister = () => {
        // 跳转到志愿者注册页面
        navigate('/volunteer-register');
    };
 
    const handleMyRegistrations = () => {
        // 跳转到我的报名页面
        navigate('/my-registrations');
    };
 
    const handleMyPoints = () => {
        // 跳转到我的积分页面
        navigate('/points-query');
    };
 
    const handleMyMessages = () => {
        // 跳转到我的消息页面
        navigate('/message-list');
    };
 
    const handleSwitchToAdmin = async () => {
        try {
            // 获取用户手机号
            const phone = state.user?.phone;
            if (!phone) {
                console.error('用户手机号不存在');
                return;
            }
            
            // 调用接口获取管理员信息并缓存
            await loadAdminInfo(phone);
            
            // 跳转到管理端首页
            navigate('/admin');
        } catch (error) {
            console.error('获取管理员信息失败:', error);
            // 即使获取管理员信息失败,也跳转到管理端首页
            navigate('/admin');
        }
    };
 
    const handleLogout = () => {
        // 显示退出登录确认框
        setShowLogoutDialog(true);
    };
 
    const confirmLogout = async () => {
        try {
            // 调用退出登录方法
            await logout();
            // 跳转到登录页面
            navigate('/login');
        } catch (error) {
            console.error('退出登录失败:', error);
            // 即使API调用失败,也要清除本地状态并跳转
            navigate('/login');
        } finally {
            setShowLogoutDialog(false);
        }
    };
 
    const cancelLogout = () => {
        setShowLogoutDialog(false);
    };
 
    return (
        <div className="page">
            {/* 顶部用户信息 */}
            <div className="page-header profile-page-header">
                {/* 按钮和认证行 */}
                <div className="user-top-row">
                    {/* 左侧空白 */}
                    <div className="user-left-space"></div>
                    
                    {/* 右侧按钮和认证 */}
                    <div className="user-actions">
                        {/* 成为志愿者按钮 */}
                        <button 
                            className="volunteer-register-btn" 
                            onClick={handleVolunteerRegister}
                        >
                            <i className="fas fa-user-plus"></i>
                            <span>成为志愿者</span>
                        </button>
                        
                        {/* 已认证图标 */}
                        <div className={`verified-badge ${mockData.isVerified ? '' : 'hidden'}`}>
                            <i className="fas fa-check-circle"></i>
                            <span>已认证</span>
                        </div>
                    </div>
                </div>
                
                {/* 姓名信息在正下方 */}
                <div className="user-text-info">
                    <div className="user-name">{state.user?.name || '未登录'}</div>
                </div>
            </div>
            
            {/* 服务时长统计卡片 */}
            <div className="service-stats-card">
                <div className="stats-header">
                    <i className="fas fa-clock icon-clock"></i>
                    <span>服务统计</span>
                </div>
                <div className="stats-content">
                    <div className="stats-item">
                        <div className="stats-label">累计服务时长</div>
                        <div className="stats-value">{statsData.totalServiceHours}</div>
                        <div className="stats-unit">小时</div>
                    </div>
                    <div className="stats-item">
                        <div className="stats-label">本月服务时长</div>
                        <div className="stats-value">{statsData.monthServiceHours}</div>
                        <div className="stats-unit">小时</div>
                    </div>
                    <div className="stats-item">
                        <div className="stats-label">参与活动次数</div>
                        <div className="stats-value">{statsData.totalActivities}</div>
                        <div className="stats-unit">次</div>
                    </div>
                </div>
            </div>
            
            {/* 快捷操作卡片 */}
            <div className="activity-list">
                <div className="function-row">
                    <div className="function-btn function-btn-flex" onClick={handleMyRegistrations}>
                        <i className="fas fa-clipboard-list icon-clipboard"></i>
                        <span>我的报名</span>
                    </div>
                    <div className="function-btn function-btn-flex" onClick={handleMyPoints}>
                        <i className="fas fa-coins icon-coins"></i>
                        <span>我的积分</span>
                    </div>
                    <div className="function-btn function-btn-flex" onClick={handleMyMessages} style={{ display: 'none' }}>
                        <i className="fas fa-comment-dots icon-comment"></i>
                        <span>我的消息</span>
                    </div>
                </div>
                <div className="function-row-left">
                    {/* 只有管理员才显示切换管理端按钮 */}
                    {state.user?.isAdmin && (
                        <div className="function-btn function-btn-width" onClick={handleSwitchToAdmin}>
                            <i className="fas fa-user-shield icon-shield"></i>
                            <span>切换管理端</span>
                        </div>
                    )}
                    <div className="function-btn function-btn-width" onClick={handleLogout}>
                        <i className="fas fa-sign-out-alt icon-signout"></i>
                        <span>退出登录</span>
                    </div>
                </div>
            </div>
 
            {/* 自定义退出登录确认对话框 */}
            {showLogoutDialog && (
                <div className="logout-dialog-overlay" onClick={cancelLogout}>
                    <div className="logout-dialog" onClick={(e) => e.stopPropagation()}>
                        <div className="logout-dialog-header">
                            <div className="logout-dialog-icon">
                                <i className="fas fa-sign-out-alt"></i>
                            </div>
                            <h3 className="logout-dialog-title">退出登录</h3>
                        </div>
                        <div className="logout-dialog-content">
                            <p>确定要退出登录吗?</p>
                            <p className="logout-dialog-subtitle">退出后需要重新登录才能使用系统</p>
                        </div>
                        <div className="logout-dialog-actions">
                            <button 
                                className="logout-dialog-btn logout-dialog-btn-cancel" 
                                onClick={cancelLogout}
                            >
                                取消
                            </button>
                            <button 
                                className="logout-dialog-btn logout-dialog-btn-confirm" 
                                onClick={confirmLogout}
                            >
                                确认退出
                            </button>
                        </div>
                    </div>
                </div>
            )}
        </div>
    );
};
 
export default ProfilePage;