xiangqinxiaochengxu/miniprogram/pages/home/home.js
2026-04-17 10:49:14 +08:00

155 lines
4.6 KiB
JavaScript

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: '我知道了'
})
}
})