const { getDayInfo, getAlmanacInfo, getMonthCalendar } = require('../../utils/core/index.js'); function pad(n) { return String(n).padStart(2, '0'); } function fmt(y, m, d) { return `${y}-${pad(m)}-${pad(d)}`; } Page({ data: { statusBarHeight: 20, navBarHeight: 44, viewMode: 'day', // day | month dayInfo: {}, almanac: {}, // 月历 year: 0, month: 0, weekHeaders: ['日', '一', '二', '三', '四', '五', '六'], calendarDays: [], selectedDay: null }, onLoad() { const sys = wx.getWindowInfo ? wx.getWindowInfo() : wx.getSystemInfoSync(); const menu = wx.getMenuButtonBoundingClientRect ? wx.getMenuButtonBoundingClientRect() : null; const statusBarHeight = sys.statusBarHeight || 20; let navBarHeight = 44; if (menu && menu.top) { navBarHeight = (menu.top - statusBarHeight) * 2 + menu.height; } this.setData({ statusBarHeight, navBarHeight }); this.loadDay(new Date()); }, onPullDownRefresh() { if (this.data.viewMode === 'day') { this.loadDay(new Date()); } else { this.loadCalendar(); } wx.stopPullDownRefresh(); }, /** 加载某日的老黄历 */ loadDay(date) { const y = date.getFullYear(); const m = date.getMonth() + 1; const d = date.getDate(); const dayInfo = getDayInfo(y, m, d); const almanac = getAlmanacInfo(y, m, d); this.setData({ dayInfo, almanac, year: y, month: m }); }, /** 前一天 / 后一天 */ prevDay() { this.shiftDay(-1); }, nextDay() { this.shiftDay(1); }, shiftDay(delta) { const { dayInfo } = this.data; const date = new Date(dayInfo.solarYear, dayInfo.solarMonth - 1, dayInfo.solarDay + delta); this.loadDay(date); }, /** 回到今天 */ backToday() { this.loadDay(new Date()); }, /** 切换 日视图/月历视图 */ toggleView() { const mode = this.data.viewMode === 'day' ? 'month' : 'day'; this.setData({ viewMode: mode }); if (mode === 'month') { const { dayInfo } = this.data; this.setData({ year: dayInfo.solarYear, month: dayInfo.solarMonth }, () => this.loadCalendar()); } }, /** 月历 */ loadCalendar() { const { year, month } = this.data; const weeks = getMonthCalendar(year, month); const calendarDays = []; weeks.forEach(w => w.forEach(d => calendarDays.push(d))); this.setData({ calendarDays }); }, prevMonth() { let { year, month } = this.data; month--; if (month < 1) { month = 12; year--; } this.setData({ year, month }, () => this.loadCalendar()); }, nextMonth() { let { year, month } = this.data; month++; if (month > 12) { month = 1; year++; } this.setData({ year, month }, () => this.loadCalendar()); }, /** 月历中选中某天 → 切回日视图 */ selectDay(e) { const date = e.currentTarget.dataset.date; const [y, m, d] = date.split('-').map(Number); this.loadDay(new Date(y, m - 1, d)); this.setData({ viewMode: 'day' }); }, /** 跳详情页 */ goDetail() { const { dayInfo } = this.data; wx.navigateTo({ url: `/pages/day-detail/day-detail?date=${fmt(dayInfo.solarYear, dayInfo.solarMonth, dayInfo.solarDay)}` }); }, navTo(e) { wx.navigateTo({ url: e.currentTarget.dataset.url }); } });