// pages/interest-partner/interest-partner.js - 兴趣搭子页面(Figma设计) const api = require('../../utils/api') const config = require('../../config/index') const app = getApp() Page({ data: { statusBarHeight: 44, navBarHeight: 44, totalNavHeight: 88, // 二维码弹窗 showQrcodeModal: false, selectedPartner: null, // 当前选中的搭子对象 // 兴趣搭子列表 partnerList: [], loading: false, // 固定的6个分类(与Figma设计一致) fixedCategories: [ { name: '美食聚餐', icon: 'food-icon', desc: '同城美食 共享美味' }, { name: '旅游出行', icon: 'travel-icon', desc: '结伴出游 共度美好' }, { name: '唱歌观影', icon: 'entertainment-icon', desc: '老歌金曲 经典影视' }, { name: '舞蹈走秀', icon: 'dance-icon', desc: '展现风采 舞动人生' }, { name: '书画摄影', icon: 'art-icon', desc: '陶冶情操 记录生活之美' }, { name: '运动康养', icon: 'sports-icon', desc: '多种运动 身心健康' } ] }, onLoad() { // 计算导航栏高度 const systemInfo = wx.getSystemInfoSync() const statusBarHeight = systemInfo.statusBarHeight || 44 const menuButton = wx.getMenuButtonBoundingClientRect() const navBarHeight = menuButton.height + (menuButton.top - statusBarHeight) * 2 const totalNavHeight = statusBarHeight + navBarHeight this.setData({ statusBarHeight, navBarHeight, totalNavHeight }) // 加载兴趣搭子列表 this.loadPartnerList() }, /** * 页面显示时刷新数据 */ onShow() { // 每次显示页面时重新加载数据,确保数据是最新的 this.loadPartnerList() }, /** * 下拉刷新 */ onPullDownRefresh() { console.log('下拉刷新兴趣搭子列表') this.loadPartnerList().then(() => { wx.stopPullDownRefresh() wx.showToast({ title: '刷新成功', icon: 'success' }) }).catch(() => { wx.stopPullDownRefresh() }) }, /** * 加载兴趣搭子列表 */ async loadPartnerList() { if (this.data.loading) return this.setData({ loading: true }) try { // 添加时间戳参数,防止缓存 const timestamp = Date.now() const res = await api.interest.getList({ _t: timestamp }) console.log('[兴趣搭子] API原始响应:', JSON.stringify(res).substring(0, 500)) // 线上API返回格式:{ success: true, data: [...] } 或 { success: true, data: { list: [...] } } if (res.success && res.data) { // 兼容两种返回格式 let partnerList = Array.isArray(res.data) ? res.data : (res.data.list || []) console.log('[兴趣搭子] 解析后的列表数量:', partnerList.length) if (partnerList.length > 0) { console.log('[兴趣搭子] 第一条数据示例:', JSON.stringify(partnerList[0])) } // 处理图片URL - 根据API文档,icon和qr_code已经是完整的API路径 partnerList = partnerList.map(item => { // 处理icon字段 let iconUrl = '/images/icon-interest-default.png' // 默认图标 if (item.icon && item.icon.trim()) { if (item.icon.startsWith('http://') || item.icon.startsWith('https://')) { // 已经是完整URL iconUrl = item.icon } else if (item.icon.startsWith('/')) { // 相对路径,需要拼接域名 iconUrl = `https://ai-c.maimanji.com${item.icon}` } else { // 不以/开头,添加/再拼接 iconUrl = `https://ai-c.maimanji.com/${item.icon}` } } // 处理qr_code字段 let qrCodeUrl = '' if (item.qr_code && item.qr_code.trim()) { if (item.qr_code.startsWith('http://') || item.qr_code.startsWith('https://')) { qrCodeUrl = item.qr_code } else if (item.qr_code.startsWith('/')) { qrCodeUrl = `https://ai-c.maimanji.com${item.qr_code}` } else { qrCodeUrl = `https://ai-c.maimanji.com/${item.qr_code}` } } console.log(`[兴趣搭子] ${item.name} - 原始icon: ${item.icon}, 处理后: ${iconUrl}`) return { ...item, icon: iconUrl, qr_code: qrCodeUrl } }) console.log(`[${new Date().toLocaleTimeString()}] 兴趣搭子列表加载成功,共 ${partnerList.length} 条数据`) this.setData({ partnerList, loading: false }) // 返回Promise以支持下拉刷新 return Promise.resolve() } else { console.warn('兴趣搭子列表返回格式异常:', res) this.setData({ loading: false }) wx.showToast({ title: '加载失败', icon: 'none' }) return Promise.reject() } } catch (err) { console.error('加载兴趣搭子列表失败:', err) this.setData({ loading: false }) wx.showToast({ title: '网络错误', icon: 'none' }) return Promise.reject(err) } }, /** * 返回上一页 */ onBack() { wx.navigateBack() }, /** * 点击兴趣卡片 */ onInterestTap(e) { const { partner } = e.currentTarget.dataset if (!partner) { wx.showToast({ title: '数据加载中', icon: 'none' }) return } // 检查是否有二维码 if (!partner.qr_code || !partner.qr_code.trim()) { wx.showToast({ title: '二维码暂未配置', icon: 'none' }) return } // 二维码URL已在loadPartnerList中处理过,直接使用 this.setData({ showQrcodeModal: true, selectedPartner: partner }) }, /** * 关闭二维码弹窗 */ onCloseQrcodeModal() { this.setData({ showQrcodeModal: false, selectedPartner: null }) }, /** * 保存二维码 */ onSaveQrcode() { const { selectedPartner } = this.data if (!selectedPartner || !selectedPartner.qr_code) { wx.showToast({ title: '二维码加载中', icon: 'none' }) return } wx.showLoading({ title: '保存中...' }) // 下载图片 wx.downloadFile({ url: selectedPartner.qr_code, success: (res) => { if (res.statusCode === 200) { // 保存到相册 wx.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: () => { wx.hideLoading() wx.showToast({ title: '已保存到相册', icon: 'success' }) this.onCloseQrcodeModal() }, fail: (err) => { wx.hideLoading() if (err.errMsg.includes('auth deny')) { wx.showModal({ title: '需要授权', content: '请允许访问相册以保存二维码', confirmText: '去设置', success: (modalRes) => { if (modalRes.confirm) { wx.openSetting() } } }) } else { wx.showToast({ title: '保存失败', icon: 'none' }) } } }) } else { wx.hideLoading() wx.showToast({ title: '下载失败', icon: 'none' }) } }, fail: () => { wx.hideLoading() wx.showToast({ title: '下载失败', icon: 'none' }) } }) } })