blob: 60dcd551c8ab3da7a821a13d20c01984f8546be1 [file] [log] [blame]
// import React, { useState, useEffect } from 'react';
// import axios from 'axios';
// const UserLevelExperience = ({ userId }) => {
// const [experienceInfo, setExperienceInfo] = useState(null);
// const [error, setError] = useState(null);
// const [isLoading, setIsLoading] = useState(false);
// const [upgradeResult, setUpgradeResult] = useState(null);
// const [hasCheckedIn, setHasCheckedIn] = useState(false);
// useEffect(() => {
// if (!userId) return;
// fetchAllLevelData();
// }, [userId]);
// useEffect(() => {
// // 自动触发升级判断
// if (
// experienceInfo &&
// experienceInfo.current_experience >= experienceInfo.next_level_experience
// ) {
// checkUpgrade();
// }
// }, [experienceInfo]);
// const fetchAllLevelData = async () => {
// try {
// setIsLoading(true);
// setError(null);
// const { data } = await axios.get('/echo/level/getExperience', {
// params: { user_id: userId },
// });
// const normalizedData = {
// ...data,
// current_level: data.current_level || data.level,
// };
// setExperienceInfo(normalizedData);
// const today = new Date().toDateString();
// const lastCheckIn = localStorage.getItem('lastCheckIn');
// setHasCheckedIn(lastCheckIn === today);
// } catch (err) {
// console.error('经验信息获取失败:', err);
// setError('获取经验信息失败');
// } finally {
// setIsLoading(false);
// }
// };
// const updateExperience = async (source, amount = 10) => {
// try {
// setIsLoading(true);
// setError(null);
// const { data } = await axios.post('/echo/level/updateExperience', {
// user_id: userId,
// experience: amount,
// source: source,
// });
// setExperienceInfo((prev) => ({
// ...prev,
// current_experience: data.current_experience,
// }));
// alert(`获得${amount}点经验值!来源:${source}`);
// if (source === 'check-in') {
// localStorage.setItem('lastCheckIn', new Date().toDateString());
// setHasCheckedIn(true);
// }
// } catch (err) {
// console.error('更新经验失败:', err);
// setError(err.response?.data?.message || '更新经验失败');
// } finally {
// setIsLoading(false);
// }
// };
// const checkUpgrade = async () => {
// try {
// setIsLoading(true);
// setError(null);
// const { data } = await axios.get('/echo/level/upgrade-check', {
// params: { user_id: userId },
// });
// if (data.can_upgrade) {
// await performUpgrade(); // 自动触发
// }
// } catch (err) {
// console.error('检查升级失败:', err);
// setError(err.response?.data?.message || '检查升级失败');
// } finally {
// setIsLoading(false);
// }
// };
// const performUpgrade = async () => {
// try {
// setIsLoading(true);
// setError(null);
// const { data } = await axios.post('/echo/level/upgrades', {
// user_id: userId,
// can_upgrade: true,
// });
// console.log('升级响应数据:', data); // 保留调试日志
// setExperienceInfo((prev) => ({
// ...prev,
// current_level: data.new_level, // 修复:使用正确的字段名
// current_experience: 0,
// next_level_experience: prev.next_level_experience * 2,
// }));
// setUpgradeResult(data);
// alert(`恭喜!您已升级到等级 ${data.new_level}!`); // 修复:使用正确的字段名
// } catch (err) {
// console.error('升级失败:', err);
// setError(err.response?.data?.message || '升级失败');
// } finally {
// setIsLoading(false);
// }
// };
// if (error) return <p className="error">{error}</p>;
// if (isLoading) return <p>加载中...</p>;
// if (!experienceInfo) return <p>加载经验信息中...</p>;
// const { current_experience, next_level_experience, current_level } = experienceInfo;
// const progressPercent = Math.min(
// 100,
// (current_experience / (next_level_experience || 1)) * 100
// ).toFixed(2);
// const expToNextLevel = Math.max(0, next_level_experience - current_experience); // 防止负数
// return (
// <div className="level-experience-section">
// {/* <h3>等级与经验</h3> */}
// <p><strong>当前等级:</strong>{current_level || '未知'}</p>
// <p><strong>当前经验:</strong>{current_experience}</p>
// <p><strong>距离下一等级还需:</strong>{expToNextLevel} 经验值</p>
// <div className="exp-bar-wrapper">
// <div className="exp-bar" style={{ width: `${progressPercent}%` }} />
// </div>
// <p className="exp-progress-text">{progressPercent}%</p>
// {upgradeResult && (
// <div className="upgrade-success">
// {/* 使用与状态一致的字段名 */}
// <p>恭喜!您已成功升级到等级 {upgradeResult.new_level}!</p>
// </div>
// )}
// <div className="level-actions">
// <button onClick={() => updateExperience('check-in', 15)} disabled={hasCheckedIn}>
// {hasCheckedIn ? '今日已签到' : '每日签到 (+15经验)'}
// </button>
// <button onClick={() => updateExperience('task', 30)}>完成任务 (+30经验)</button>
// <button onClick={() => updateExperience('upload', 50)}>上传种子 (+50经验)</button>
// {/* <button onClick={checkUpgrade}>检查升级</button> */}
// </div>
// </div>
// );
// };
// export default UserLevelExperience;
import React, { useState, useEffect } from 'react';
import axios from 'axios';
const UserLevelExperience = ({ userId }) => {
const [experienceInfo, setExperienceInfo] = useState(null);
const [error, setError] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [upgradeResult, setUpgradeResult] = useState(null);
const [hasCheckedIn, setHasCheckedIn] = useState(false);
useEffect(() => {
if (!userId) return;
fetchAllLevelData();
}, [userId]);
useEffect(() => {
// 自动触发升级判断
if (
experienceInfo &&
experienceInfo.current_experience >= experienceInfo.next_level_experience
) {
checkUpgrade();
}
}, [experienceInfo]);
const fetchAllLevelData = async () => {
try {
setIsLoading(true);
setError(null);
const { data } = await axios.get('/echo/level/getExperience', {
params: { user_id: userId },
});
const normalizedData = {
...data,
current_level: data.current_level || data.level,
};
setExperienceInfo(normalizedData);
const today = new Date().toDateString();
const lastCheckIn = localStorage.getItem('lastCheckIn');
setHasCheckedIn(lastCheckIn === today);
} catch (err) {
console.error('经验信息获取失败:', err);
setError('获取经验信息失败');
} finally {
setIsLoading(false);
}
};
const updateExperience = async (source, amount = 10) => {
try {
setIsLoading(true);
setError(null);
const { data } = await axios.post('/echo/level/updateExperience', {
user_id: userId,
experience: amount,
source: source,
});
setExperienceInfo((prev) => ({
...prev,
current_experience: data.current_experience,
}));
alert(`获得${amount}点经验值!来源:${source}`);
if (source === 'check-in') {
localStorage.setItem('lastCheckIn', new Date().toDateString());
setHasCheckedIn(true);
}
} catch (err) {
console.error('更新经验失败:', err);
setError(err.response?.data?.message || '更新经验失败');
} finally {
setIsLoading(false);
}
};
const checkUpgrade = async () => {
try {
setIsLoading(true);
setError(null);
const { data } = await axios.get('/echo/level/upgrade-check', {
params: { user_id: userId },
});
if (data.can_upgrade) {
if (window.confirm('您已满足升级条件,是否要升级?')) {
await performUpgrade();
}
} else {
// 区分是经验不足还是已达最高等级
if (data.is_max_level) {
alert('您已达到最高等级!');
} else {
alert(`还不能升级,还需要${data.next_level_experience - data.current_experience}点经验值`);
}
}
} catch (err) {
console.error('检查升级失败:', err);
setError(err.response?.data?.message || '检查升级失败');
} finally {
setIsLoading(false);
}
};
const performUpgrade = async () => {
try {
setIsLoading(true);
setError(null);
const { data } = await axios.post('/echo/level/upgrades', {
user_id: userId,
can_upgrade: true,
});
console.log('升级响应数据:', data);
// 正确处理升级结果
if (data.status === 'success') {
setExperienceInfo((prev) => ({
...prev,
current_level: data.new_level,
current_experience: 0,
next_level_experience: prev.next_level_experience * 2,
}));
setUpgradeResult(data);
alert(`恭喜!您已升级到等级 ${data.new_level}!`);
} else {
throw new Error(data.message || '升级失败');
}
} catch (err) {
console.error('升级失败:', err);
setError(err.message || '升级失败');
alert(err.message || '升级失败,请稍后再试');
} finally {
setIsLoading(false);
}
};
if (error) return <p className="error">{error}</p>;
if (isLoading) return <p>加载中...</p>;
if (!experienceInfo) return <p>加载经验信息中...</p>;
const { current_experience, next_level_experience, current_level } = experienceInfo;
const progressPercent = Math.min(
100,
(current_experience / (next_level_experience || 1)) * 100
).toFixed(2);
const expToNextLevel = Math.max(0, next_level_experience - current_experience);
return (
<div className="level-experience-section">
<h3>等级与经验</h3>
<p><strong>当前等级:</strong>{current_level || '未知'}</p>
<p><strong>当前经验:</strong>{current_experience}</p>
<p><strong>距离下一等级还需:</strong>{expToNextLevel} 经验值</p>
<div className="exp-bar-wrapper">
<div className="exp-bar" style={{ width: `${progressPercent}%` }} />
</div>
<p className="exp-progress-text">{progressPercent}%</p>
{upgradeResult && (
<div className="upgrade-success">
<p>恭喜!您已成功升级到等级 {upgradeResult.new_level}!</p>
</div>
)}
{error && (
<div className="upgrade-error">
<p>{error}</p>
</div>
)}
<div className="level-actions">
<button onClick={() => updateExperience('check-in', 15)} disabled={hasCheckedIn}>
{hasCheckedIn ? '今日已签到' : '每日签到 (+15经验)'}
</button>
<button onClick={() => updateExperience('task', 30)}>完成任务 (+30经验)</button>
<button onClick={() => updateExperience('upload', 50)}>上传种子 (+50经验)</button>
<button onClick={checkUpgrade}>检查升级</button>
</div>
</div>
);
};
export default UserLevelExperience;