import { injectPage ,onLoginReady } from '@jdmini/api' import request from '../../utils/request' Page(injectPage({})({ data: { userInfo: null, isLogin: false, activeRooms: [], recentRecords: [], navbarHeight: 0, showGuide: false, guideSteps: [ { selector: '.guide-create-btn', title: '创建房间', description: '点击这里可以创建一个新的牌局房间,邀请好友一起玩', position: 'bottom', padding: 12, borderRadius: 16 }, { selector: '.guide-join-btn', title: '加入房间', description: '输入房间号或使用扫码功能,快速加入好友的牌局', position: 'bottom', padding: 12, borderRadius: 16 }, { selector: '.guide-scan-btn', title: '扫码进入', description: '扫描房间二维码,即可立即进入牌局,非常方便!', position: 'bottom', padding: 8, borderRadius: 12 } ] }, onLoad() { console.log('首页加载') // 计算导航栏高度 const windowInfo = wx.getWindowInfo() const menuButtonInfo = wx.getMenuButtonBoundingClientRect() const statusBarHeight = windowInfo.statusBarHeight const menuButtonTop = menuButtonInfo.top const navbarHeight = menuButtonInfo.bottom + (menuButtonTop - statusBarHeight) this.setData({ navbarHeight }) // 加载用户信息(如果已登录) // this.loadUserInfo() }, onShow() { // 每次显示页面时刷新用户信息和数据 onLoginReady(()=>{ this.loadUserInfo() }) }, onReady() { // 页面渲染完成后,检查是否需要显示引导 this.checkAndShowGuide() }, // 检查并显示新用户引导 checkAndShowGuide() { try { const hasShownGuide = wx.getStorageSync('hasShownGuide') if (!hasShownGuide) { // 延迟显示引导,等待页面完全渲染 setTimeout(() => { this.setData({ showGuide: true }) }, 500) } } catch (error) { console.error('检查引导状态失败:', error) } }, // 引导完成回调 onGuideComplete() { this.setData({ showGuide: false }) // 标记已显示过引导 try { wx.setStorageSync('hasShownGuide', true) } catch (error) { console.error('保存引导状态失败:', error) } }, // 加载用户信息 async loadUserInfo() { const app = getApp() const userInfo = app.getUserInfo() console.log(userInfo) if (userInfo) { // 已登录,从后端获取最新用户信息 try { const data = await request.get('/auth/profile') // 更新本地缓存 app.setUserInfo(data) // 显示最新数据 this.setData({ userInfo: data, isLogin: true }) this.loadActiveRooms() } catch (error) { console.error('获取用户信息失败:', error) // 如果获取失败,使用本地缓存数据 this.setData({ userInfo, isLogin: true }) this.loadActiveRooms() } } else { // 未登录,显示登录按钮 this.setData({ userInfo: null, isLogin: false, activeRooms: [] }) } }, // 检查是否登录,未登录则跳转 checkLoginAndNavigate() { if (!this.data.isLogin) { wx.navigateTo({ url: '/pages/login/login' }) return false } return true }, // 格式化时间 formatTime(timestamp) { const date = new Date(timestamp * 1000) const now = new Date() const diff = now - date // 小于1分钟 if (diff < 60000) { return '刚刚' } // 小于1小时 if (diff < 3600000) { return `${Math.floor(diff / 60000)}分钟前` } // 小于24小时 if (diff < 86400000) { return `${Math.floor(diff / 3600000)}小时前` } // 小于7天 if (diff < 604800000) { return `${Math.floor(diff / 86400000)}天前` } // 格式化为 月-日 时:分 const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') const hour = String(date.getHours()).padStart(2, '0') const minute = String(date.getMinutes()).padStart(2, '0') return `${month}-${day} ${hour}:${minute}` }, // 加载进行中的房间 async loadActiveRooms() { if (!this.data.isLogin) return try { const data = await request.get('/rooms/my-sessions', { status: 'active', pageSize: 5 }) // 处理房间数据,添加格式化的时间 const rooms = (data.list || []).map(room => ({ ...room, create_time: this.formatTime(room.created_at) })) this.setData({ activeRooms: rooms }) } catch (error) { console.error('加载房间失败:', error) } }, // 进入个人资料页(登录/修改信息) goToProfile() { wx.navigateTo({ url: '/pages/login/login' }) }, // 处理登录(保留兼容) async handleLogin() { this.goToProfile() }, // 创建房间 createRoom() { if (!this.checkLoginAndNavigate()) { return } wx.navigateTo({ url: '/pages/game/create/create' }) }, // 扫码进入房间 scanCode() { if (!this.checkLoginAndNavigate()) { return } wx.scanCode({ onlyFromCamera: false, scanType: ['wxCode','qrCode'], success: (res) => { console.log('扫码结果:', res) // 解析二维码内容 const result = res.path || res.result // 检查是否是有效的路径(兼容带/和不带/的路径) if (result.includes('pages/game/join/join?scene')) { // 提取邀请码 //const match = result.split("%3D") // console.log(match) const match = result.match(/\%3D([A-Z0-9]+)/) if (match && match[1]) { const inviteCode = match[1] // 跳转到加入页面 wx.navigateTo({ url: `/pages/game/join/join?code=${inviteCode}` }) } else { wx.showToast({ title: '无效的二维码', icon: 'none' }) } } else { wx.showToast({ title: '不是有效的房间二维码', icon: 'none' }) } }, fail: (err) => { console.error('扫码失败:', err) if (err.errMsg !== 'scanCode:fail cancel') { wx.showToast({ title: '扫码失败', icon: 'none' }) } } }) }, // 加入房间 joinRoom() { if (!this.checkLoginAndNavigate()) { return } wx.navigateTo({ url: '/pages/game/join/join' }) }, // 进入房间详情 goToRoom(e) { const id = e.currentTarget.dataset.id wx.navigateTo({ url: `/pages/game/detail/detail?id=${id}` }) } }))