112 lines
4.0 KiB
JavaScript
112 lines
4.0 KiB
JavaScript
|
|
import request from '../../../utils/request';
|
|
|
|
Page({
|
|
data: {
|
|
userLevel: 0,
|
|
userLevelTag: '',
|
|
currentExp: 0,
|
|
maxExp: 1000,
|
|
maxExp: 1000,
|
|
nextLevelExp: 1000,
|
|
showLevelsPopup: false,
|
|
allLevels: [],
|
|
|
|
badges: [
|
|
{ id: 1, name: '初级播种者', desc: '成功种植第一棵植物', iconName: 'flower', color: '#4CAF50', unlocked: true },
|
|
{ id: 2, name: '勤劳园丁', desc: '总养护次数达到10次', iconName: 'tools', color: '#2196F3', unlocked: true },
|
|
{ id: 3, name: '植物专家', desc: '成功识别50种植物', iconName: 'scan', color: '#9C27B0', unlocked: false, progress: '12/50' },
|
|
{ id: 4, name: '全勤奖', desc: '连续30天打卡', iconName: 'calendar', color: '#FF9800', unlocked: false, progress: '5/30' },
|
|
{ id: 5, name: '分享大师', desc: '发布10条动态', iconName: 'share', color: '#E91E63', unlocked: false, progress: '3/10' },
|
|
{ id: 6, name: '收藏家', desc: '收藏20个植物百科', iconName: 'star', color: '#FFC107', unlocked: false, progress: '8/20' }
|
|
]
|
|
},
|
|
|
|
onLoad() {
|
|
this.fetchData();
|
|
},
|
|
|
|
async fetchData() {
|
|
wx.showLoading({ title: '加载中...' });
|
|
try {
|
|
const [levelRes, profileRes] = await Promise.all([
|
|
request.get('/config/level/list'),
|
|
request.get('/profile/detail')
|
|
]);
|
|
this.processData(levelRes, profileRes);
|
|
} catch (e) {
|
|
console.error('Fetch badges data failed', e);
|
|
wx.showToast({ title: '加载失败', icon: 'none' });
|
|
} finally {
|
|
wx.hideLoading();
|
|
}
|
|
},
|
|
|
|
processData(levelsData, profile) {
|
|
const levelList = levelsData && levelsData.list ? levelsData.list : [];
|
|
levelList.sort((a, b) => a.minSunlight - b.minSunlight); // Ensure sorted by threshold
|
|
|
|
const totalSunlight = profile.totalSunlight || 0;
|
|
|
|
// Find current level: highest level where minSunlight <= totalSunlight
|
|
let currentLevelConfig = null;
|
|
for (let i = levelList.length - 1; i >= 0; i--) {
|
|
if (totalSunlight >= levelList[i].minSunlight) {
|
|
currentLevelConfig = levelList[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Check if no level matched (e.g. 0 sunlight but level 1 starts at 0? Logic handles it if sorted)
|
|
if (!currentLevelConfig && levelList.length > 0) {
|
|
// Fallback to absolute lowest or specific logic
|
|
// Assuming level 1 starts at 0, it should be caught.
|
|
currentLevelConfig = levelList[0];
|
|
}
|
|
|
|
const currentLevelVal = currentLevelConfig ? currentLevelConfig.level : 0;
|
|
|
|
// Find next level
|
|
const nextLevelConfig = levelList.find(l => l.minSunlight > totalSunlight);
|
|
|
|
let maxExp = 0;
|
|
let nextPerk = '';
|
|
|
|
if (nextLevelConfig) {
|
|
maxExp = nextLevelConfig.minSunlight;
|
|
nextPerk = nextLevelConfig.perks;
|
|
} else {
|
|
// Max level
|
|
maxExp = totalSunlight > 0 ? totalSunlight : 100;
|
|
nextPerk = '已达到最高等级';
|
|
}
|
|
|
|
// Sanity
|
|
if (maxExp < totalSunlight) maxExp = totalSunlight;
|
|
|
|
const tag = currentLevelConfig ? `Lv.${currentLevelVal} ${currentLevelConfig.title}` : 'Lv.0 园艺新手';
|
|
|
|
this.setData({
|
|
userLevel: currentLevelVal,
|
|
userLevelTag: tag,
|
|
currentExp: totalSunlight,
|
|
maxExp: maxExp,
|
|
nextLevelExp: Math.max(0, maxExp - totalSunlight),
|
|
nextPerk: nextPerk,
|
|
allLevels: levelList // Save for popup
|
|
});
|
|
},
|
|
|
|
showLevelList() {
|
|
wx.navigateTo({
|
|
url: `/pages/profile/badges/level-detail/index?sunlight=${this.data.currentExp}`
|
|
});
|
|
},
|
|
|
|
openBadgeWall() {
|
|
wx.navigateTo({
|
|
url: '/pages/profile/badges/badge-wall/index'
|
|
});
|
|
},
|
|
});
|