const request = require('../../utils/request') const { getCustomerServiceWechat } = require('../../utils/constants') const HOME_CACHE_KEY = 'home_cache_v1' const HOME_CACHE_TTL = 2 * 60 * 1000 Page({ data: { activities: [], announcements: [], members: [], heroAnnouncementText: '暂无公告', heroAnnouncementId: null, activeMember: null, activeMemberTagsText: '', featuredMembers: [], customerServiceWechat: getCustomerServiceWechat(), loadingHome: false }, onShow() { const app = getApp() this.setData({ customerServiceWechat: app.globalData.customerServiceWechat || getCustomerServiceWechat() }) this.loadHomeData(true) }, getCachedHomeData() { const cache = wx.getStorageSync(HOME_CACHE_KEY) if (!cache || !cache.ts || Date.now() - cache.ts > HOME_CACHE_TTL) { return null } return cache.data || null }, saveCachedHomeData(data) { wx.setStorageSync(HOME_CACHE_KEY, { ts: Date.now(), data }) }, applyHomeData(homeData) { const { activities = [], announcements = [], members = [] } = homeData || {} this.setData({ activities, announcements, members, featuredMembers: members.slice(0, 3), heroAnnouncementText: announcements.length ? announcements[0].title : '暂无公告', heroAnnouncementId: announcements.length ? announcements[0].id : null }) }, async loadHomeData(silent = false) { const cached = this.getCachedHomeData() if (cached) { this.applyHomeData(cached) if (silent) { return } } if (this.data.loadingHome) { return } this.setData({ loadingHome: true }) try { const [activities, announcements, members] = await Promise.all([ request({ url: '/activities?status=1&page_size=5' }), request({ url: '/announcements?page_size=3' }), request({ url: '/matches/candidates?source=manual' }) ]) const safeActivities = Array.isArray(activities) ? activities : [] const safeAnnouncements = Array.isArray(announcements) ? announcements : [] const safeMembers = Array.isArray(members) ? members : [] const nextData = { activities: safeActivities.map((item) => ({ ...item, remainText: this.getRemainText(item) })), announcements: safeAnnouncements, members: safeMembers.slice(0, 6).map((item) => ({ ...item, nicknameText: item.nickname || '匿名用户', cityText: item.city || '城市未知', personalityTagsText: (Array.isArray(item.personality_tags) ? item.personality_tags : []).slice(0, 3).join(' / ') || '性格待完善', introText: item.self_intro || '对方还没有填写更多公开信息', birthYearRangeText: item.birth_year_range || '年龄未知' })) } this.applyHomeData(nextData) this.saveCachedHomeData(nextData) } catch (err) { console.error('Load home data failed:', err) if (!cached) { wx.showToast({ title: '首页内容加载失败', icon: 'none' }) } } finally { this.setData({ loadingHome: false }) } }, getRemainText(item) { const maleRemain = Math.max((item.capacity_male || 0) - (item.registered_male || 0), 0) const femaleRemain = Math.max((item.capacity_female || 0) - (item.registered_female || 0), 0) return `还剩 ${maleRemain + femaleRemain} 个名额` }, goActivityDetail(e) { wx.navigateTo({ url: `/pages/activity-detail/activity-detail?id=${e.currentTarget.dataset.id}` }) }, goAnnouncement(e) { wx.navigateTo({ url: '/pages/announcement/announcement' }) }, goHeroAnnouncement() { wx.navigateTo({ url: '/pages/announcement/announcement' }) }, openMemberCard(e) { const userId = e.currentTarget.dataset.id const activeMember = this.data.members.find((item) => item.user_id === userId) || null this.setData({ activeMember, activeMemberTagsText: activeMember && activeMember.personality_tags ? activeMember.personality_tags.join(' / ') : '' }) }, closeMemberCard() { this.setData({ activeMember: null, activeMemberTagsText: '' }) }, noop() {}, goMatch() { wx.switchTab({ url: '/pages/match/match' }) }, goActivity() { wx.switchTab({ url: '/pages/activity/activity' }) }, goAnnouncementList() { wx.navigateTo({ url: '/pages/announcement/announcement' }) }, goMessageBoard() { wx.showModal({ title: '联系客服', content: `客服微信号:${this.data.customerServiceWechat || '暂未设置'}`, showCancel: false, confirmText: '我知道了' }) } })