| import React, { useState,useEffect } from 'react'; | |
| import { useNavigate, useLocation } from 'react-router-dom'; | |
| import { getUserInfo, updatePassword } from '../../api/personal'; | |
| import './personalSubpage.css'; | |
| const Setting = ({ onLogout }) => { | |
| const navigate = useNavigate(); | |
| const location = useLocation(); | |
| const [userInfo, setUserInfo] = useState(null); | |
| const [loading, setLoading] = useState(false); | |
| const [error, setError] = useState(null); | |
| const [success, setSuccess] = useState(null); | |
| const [passwordForm, setPasswordForm] = useState({ | |
| oldPassword: '', | |
| newPassword: '', | |
| confirmPassword: '' | |
| }); | |
| // 获取用户信息 | |
| useEffect(() => { | |
| const fetchUserInfo = async () => { | |
| try { | |
| const info = await getUserInfo(); | |
| setUserInfo(info); | |
| } catch (err) { | |
| console.error('获取用户信息失败:', err); | |
| } | |
| }; | |
| fetchUserInfo(); | |
| }, []); | |
| const handleBack = () => { | |
| navigate('/personal', { | |
| state: { | |
| fromSubpage: true, | |
| dashboardTab: location.state?.dashboardTab | |
| }, | |
| replace: true | |
| }); | |
| }; | |
| const handlePasswordChange = (e) => { | |
| const { name, value } = e.target; | |
| setPasswordForm(prev => ({ | |
| ...prev, | |
| [name]: value | |
| })); | |
| }; | |
| const handlePasswordSubmit = async (e) => { | |
| e.preventDefault(); | |
| setError(null); | |
| setSuccess(null); | |
| // 验证表单 | |
| if (!passwordForm.oldPassword || !passwordForm.newPassword || !passwordForm.confirmPassword) { | |
| setError('请填写所有密码字段'); | |
| return; | |
| } | |
| if (passwordForm.newPassword !== passwordForm.confirmPassword) { | |
| setError('新密码与确认密码不一致'); | |
| return; | |
| } | |
| if (passwordForm.newPassword.length < 6) { | |
| setError('新密码长度至少为6位'); | |
| return; | |
| } | |
| try { | |
| setLoading(true); | |
| await updatePassword(passwordForm.oldPassword, passwordForm.newPassword); | |
| setSuccess('密码修改成功'); | |
| setPasswordForm({ | |
| oldPassword: '', | |
| newPassword: '', | |
| confirmPassword: '' | |
| }); | |
| } catch (err) { | |
| setError(err.message || '修改密码失败'); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| return ( | |
| <div className="subpage-container"> | |
| <button className="back-button" onClick={handleBack}> | |
| 返回个人中心 | |
| </button> | |
| <h2 className="page-title">个人设置</h2> | |
| <div className="setting-section"> | |
| <div className="user-info-card"> | |
| <h3>账户信息</h3> | |
| <div className="info-item"> | |
| <label>用户名:</label> | |
| <span>{userInfo?.username || '加载中...'}</span> | |
| </div> | |
| <p className="info-note">用户名不可更改</p> | |
| </div> | |
| <div className="password-form-card"> | |
| <h3>修改密码</h3> | |
| <form onSubmit={handlePasswordSubmit}> | |
| <div className="form-group"> | |
| <label htmlFor="oldPassword">原密码:</label> | |
| <input | |
| type="password" | |
| id="oldPassword" | |
| name="oldPassword" | |
| value={passwordForm.oldPassword} | |
| onChange={handlePasswordChange} | |
| required | |
| /> | |
| </div> | |
| <div className="form-group"> | |
| <label htmlFor="newPassword">新密码:</label> | |
| <input | |
| type="password" | |
| id="newPassword" | |
| name="newPassword" | |
| value={passwordForm.newPassword} | |
| onChange={handlePasswordChange} | |
| required | |
| minLength="6" | |
| /> | |
| </div> | |
| <div className="form-group"> | |
| <label htmlFor="confirmPassword">确认新密码:</label> | |
| <input | |
| type="password" | |
| id="confirmPassword" | |
| name="confirmPassword" | |
| value={passwordForm.confirmPassword} | |
| onChange={handlePasswordChange} | |
| required | |
| minLength="6" | |
| /> | |
| </div> | |
| {error && <div className="error-message">{error}</div>} | |
| {success && <div className="success-message">{success}</div>} | |
| <button | |
| type="submit" | |
| className="submit-button" | |
| disabled={loading} | |
| > | |
| {loading ? '处理中...' : '修改密码'} | |
| </button> | |
| </form> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default Setting; |