blob: 5b6f730a0a0b7ccc5aeca484488903edc3020721 [file] [log] [blame]
Akane12173a7bb972025-06-01 01:05:27 +08001import React, { useState,useEffect } from 'react';
2import { useNavigate, useLocation } from 'react-router-dom';
3import { getUserInfo, updatePassword } from '../../api/personal';
Akane121765b61a72025-05-17 13:52:25 +08004import './personalSubpage.css';
5
6const Setting = ({ onLogout }) => {
7 const navigate = useNavigate();
8 const location = useLocation();
Akane12173a7bb972025-06-01 01:05:27 +08009 const [userInfo, setUserInfo] = useState(null);
10 const [loading, setLoading] = useState(false);
11 const [error, setError] = useState(null);
12 const [success, setSuccess] = useState(null);
13 const [passwordForm, setPasswordForm] = useState({
14 oldPassword: '',
15 newPassword: '',
16 confirmPassword: ''
Akane121765b61a72025-05-17 13:52:25 +080017 });
18
Akane12173a7bb972025-06-01 01:05:27 +080019 // 获取用户信息
20 useEffect(() => {
21 const fetchUserInfo = async () => {
22 try {
23 const info = await getUserInfo();
24 setUserInfo(info);
25 } catch (err) {
26 console.error('获取用户信息失败:', err);
27 }
28 };
29 fetchUserInfo();
30 }, []);
31
32 const handleBack = () => {
33 navigate('/personal', {
34 state: {
35 fromSubpage: true,
36 dashboardTab: location.state?.dashboardTab
37 },
38 replace: true
39 });
40 };
41
42 const handlePasswordChange = (e) => {
43 const { name, value } = e.target;
44 setPasswordForm(prev => ({
Akane121765b61a72025-05-17 13:52:25 +080045 ...prev,
Akane12173a7bb972025-06-01 01:05:27 +080046 [name]: value
Akane121765b61a72025-05-17 13:52:25 +080047 }));
48 };
49
Akane12173a7bb972025-06-01 01:05:27 +080050 const handlePasswordSubmit = async (e) => {
Akane121765b61a72025-05-17 13:52:25 +080051 e.preventDefault();
Akane12173a7bb972025-06-01 01:05:27 +080052 setError(null);
53 setSuccess(null);
Akane121765b61a72025-05-17 13:52:25 +080054
Akane12173a7bb972025-06-01 01:05:27 +080055 // 验证表单
56 if (!passwordForm.oldPassword || !passwordForm.newPassword || !passwordForm.confirmPassword) {
57 setError('请填写所有密码字段');
58 return;
59 }
60
61 if (passwordForm.newPassword !== passwordForm.confirmPassword) {
62 setError('新密码与确认密码不一致');
63 return;
64 }
65
66 if (passwordForm.newPassword.length < 6) {
67 setError('新密码长度至少为6位');
68 return;
69 }
70
71 try {
72 setLoading(true);
73 await updatePassword(passwordForm.oldPassword, passwordForm.newPassword);
74 setSuccess('密码修改成功');
75 setPasswordForm({
76 oldPassword: '',
77 newPassword: '',
78 confirmPassword: ''
79 });
80 } catch (err) {
81 setError(err.message || '修改密码失败');
82 } finally {
83 setLoading(false);
84 }
Akane121765b61a72025-05-17 13:52:25 +080085 };
86
87 return (
88 <div className="subpage-container">
Akane12173a7bb972025-06-01 01:05:27 +080089 <button className="back-button" onClick={handleBack}>
DREW5b1883e2025-06-07 10:41:32 +080090 返回个人中心
Akane121765b61a72025-05-17 13:52:25 +080091 </button>
92
Akane12173a7bb972025-06-01 01:05:27 +080093 <h2 className="page-title">个人设置</h2>
94
95 <div className="setting-section">
96 <div className="user-info-card">
97 <h3>账户信息</h3>
98 <div className="info-item">
99 <label>用户名:</label>
100 <span>{userInfo?.username || '加载中...'}</span>
101 </div>
102 <p className="info-note">用户名不可更改</p>
Akane121765b61a72025-05-17 13:52:25 +0800103 </div>
104
Akane12173a7bb972025-06-01 01:05:27 +0800105 <div className="password-form-card">
106 <h3>修改密码</h3>
107 <form onSubmit={handlePasswordSubmit}>
108 <div className="form-group">
109 <label htmlFor="oldPassword">原密码:</label>
110 <input
111 type="password"
112 id="oldPassword"
113 name="oldPassword"
114 value={passwordForm.oldPassword}
115 onChange={handlePasswordChange}
116 required
117 />
118 </div>
Akane121765b61a72025-05-17 13:52:25 +0800119
Akane12173a7bb972025-06-01 01:05:27 +0800120 <div className="form-group">
121 <label htmlFor="newPassword">新密码:</label>
122 <input
123 type="password"
124 id="newPassword"
125 name="newPassword"
126 value={passwordForm.newPassword}
127 onChange={handlePasswordChange}
128 required
129 minLength="6"
130 />
131 </div>
Akane121765b61a72025-05-17 13:52:25 +0800132
Akane12173a7bb972025-06-01 01:05:27 +0800133 <div className="form-group">
134 <label htmlFor="confirmPassword">确认新密码:</label>
135 <input
136 type="password"
137 id="confirmPassword"
138 name="confirmPassword"
139 value={passwordForm.confirmPassword}
140 onChange={handlePasswordChange}
141 required
142 minLength="6"
143 />
144 </div>
145
146 {error && <div className="error-message">{error}</div>}
147 {success && <div className="success-message">{success}</div>}
148
149 <button
150 type="submit"
151 className="submit-button"
152 disabled={loading}
153 >
154 {loading ? '处理中...' : '修改密码'}
155 </button>
156 </form>
Akane121765b61a72025-05-17 13:52:25 +0800157 </div>
Akane12173a7bb972025-06-01 01:05:27 +0800158 </div>
Akane121765b61a72025-05-17 13:52:25 +0800159 </div>
160 );
161};
162
163export default Setting;