155 lines
4.6 KiB
JavaScript
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: '我知道了'
|
||
|
|
})
|
||
|
|
}
|
||
|
|
})
|