const storage = require('../../utils/storage') const util = require('../../utils/util') const themeMod = require('../../utils/theme') const iconsMod = require('../../utils/icons') Page({ data: { theme: { primary: '#FF6B35', primaryLight: '#FF8C5A', primaryBg: '#FFF3ED', primaryRgb: '255,107,53' }, themeStyle: themeMod.BASE_VARS, totalDuration: 0, totalDurationText: '', totalSessions: 0, maxDuration: 0, maxDurationText: '', currentYear: new Date().getFullYear(), currentMonth: new Date().getMonth() + 1, monthRecords: [], historyList: [], showDayDetail: false, dayDetail: {}, icons: iconsMod.build() }, onLoad() { themeMod.applyThemeToPage(this) this._firstShow = true }, onShow() { themeMod.applyThemeToPage(this) try { const tb = this.getTabBar() if (tb) tb.setData({ selected: 1 }) } catch (e) {} if (this._firstShow) { this._firstShow = false this.refresh() return } this.refresh() }, onPullDownRefresh() { this.refresh() wx.stopPullDownRefresh() }, refresh() { storage.validateStreak() const stats = storage.getTotalStats() const monthKey = `${this.data.currentYear}-${String(this.data.currentMonth).padStart(2, '0')}` const records = storage.getRecordsByMonth(monthKey) // Each month is already sorted newest-first in storage. To get top 30 most recent, // walk months in reverse chrono order and concat — O(months*30) instead of O(n log n). const byMonth = storage.getRecords() const monthKeys = Object.keys(byMonth).sort().reverse() const historyList = [] for (const mk of monthKeys) { for (const r of byMonth[mk]) { historyList.push(r) if (historyList.length >= 30) break } if (historyList.length >= 30) break } const theme = themeMod.getCurrentTheme() this.setData({ theme, icons: iconsMod.build(theme), totalDuration: stats.totalDuration, totalDurationText: util.formatDuration(stats.totalDuration), totalSessions: stats.totalSessions, maxDuration: stats.maxDuration, maxDurationText: util.formatDuration(stats.maxDuration), monthRecords: records, historyList }) }, onPrevMonth() { let { currentYear, currentMonth } = this.data if (currentMonth === 1) { currentYear-- currentMonth = 12 } else { currentMonth-- } this.setData({ currentYear, currentMonth }) this.refresh() }, onNextMonth() { let { currentYear, currentMonth } = this.data if (currentMonth === 12) { currentYear++ currentMonth = 1 } else { currentMonth++ } this.setData({ currentYear, currentMonth }) this.refresh() }, onDayTap(e) { const { year, month, day } = e.detail const dateStr = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}` const allRecords = Object.values(storage.getRecords()).flat() const sessions = allRecords.filter(r => r.date === dateStr) const totalDur = sessions.reduce((sum, r) => sum + r.duration, 0) const calories = Math.round(totalDur * 0.068) this.setData({ showDayDetail: true, dayDetail: { date: dateStr, sessions: sessions.length, duration: totalDur, durationText: util.formatDuration(totalDur), calories } }) }, onCloseDayDetail() { this.setData({ showDayDetail: false }) }, onLongPressDelete(e) { this.onDeleteRecord(e) }, onDeleteRecord(e) { const id = e.currentTarget.dataset.id if (!id && id !== 0) { wx.showToast({ title: '记录数据异常', icon: 'none', duration: 1200 }) return } wx.showModal({ title: '删除记录', content: '确定要删除这条训练记录吗?', success: (res) => { if (res.confirm) { storage.deleteRecord(id) this.refresh() wx.showToast({ title: '已删除', icon: 'none', duration: 1200 }) } } }) } })