// pages/profile/profile.js const app = getApp() const { graphqlRequest, formatDate } = require('../../lib/utils') Page({ data: { userInfo: null, avatarText: '用', // 头像文字 loading: false, // 统计数据 stats: { totalRegistrations: 0, ongoingActivities: 0, completedActivities: 0, awards: 0 }, // 我的报名记录 registrations: [], registrationLoading: false, // 角色相关 userRoles: [], isJudge: false, isOrganizer: false, // 评委相关数据 judgeStats: { pendingReviews: 0, completedReviews: 0, totalReviews: 0 }, // 主办方相关数据 organizerStats: { activeActivities: 0, totalParticipants: 0, totalActivities: 0 }, // 通用菜单项 menuItems: [ { icon: '📝', iconName: 'ic-list', title: '我的报名', desc: '查看报名记录', path: '/pages/profile/registrations' }, { icon: '🏆', iconName: 'ic-award', title: '我的成绩', desc: '查看活动成绩', path: '/pages/profile/achievements' }, { icon: '⭐', iconName: 'ic-star', title: '我的收藏', desc: '收藏的活动', path: '/pages/profile/favorites' }, { icon: '📊', iconName: 'ic-chart', title: '数据统计', desc: '个人数据分析', path: '/pages/profile/statistics' }, { icon: '⚙️', iconName: 'ic-setting', title: '设置', desc: '个人设置', path: '/pages/profile/settings' } ], // 评委菜单 judgeMenuItems: [ { icon: '📋', iconName: 'ic-list', title: '待评审', desc: '待评审的作品', path: '/pages/judge/pending', badge: 0 }, { icon: '✅', iconName: 'ic-choose', title: '已评审', desc: '已完成评审', path: '/pages/judge/completed' }, { icon: '📈', iconName: 'ic-chart', title: '评审统计', desc: '评审数据统计', path: '/pages/judge/statistics' } ], // 主办方菜单 organizerMenuItems: [ { icon: '🎯', iconName: 'ic-calendar', title: '活动管理', desc: '管理我的活动', path: '/pages/organizer/activities' }, { icon: '👥', iconName: 'ic-user', title: '参赛管理', desc: '管理参赛者', path: '/pages/organizer/participants' }, { icon: '📊', iconName: 'ic-chart', title: '数据分析', desc: '活动数据分析', path: '/pages/organizer/analytics' } ] }, onLoad() { // 从全局数据获取用户信息并设置头像文字 const globalUserInfo = app.globalData.userInfo if (globalUserInfo && globalUserInfo.name) { this.setData({ avatarText: globalUserInfo.name.substring(0, 1) }) } this.loadUserInfo() this.loadUserStats() this.loadRecentRegistrations() }, onShow() { // 页面显示时刷新数据 this.loadUserInfo() this.loadUserStats() this.loadRecentRegistrations() // 初始化自定义 tabbar if (typeof this.getTabBar === 'function' && this.getTabBar()) { this.getTabBar().init() } }, onPullDownRefresh() { this.refreshData() }, // 刷新数据 async refreshData() { try { await Promise.all([ this.loadUserInfo(), this.loadUserStats(), this.loadRecentRegistrations() ]) } finally { wx.stopPullDownRefresh() } }, // 加载用户信息 async loadUserInfo() { try { this.setData({ loading: true }) const query = ` query GetUserProfile { userProfile { id name avatar phone email school major grade roles createdAt } } ` const result = await graphqlRequest(query) if (result && result.userProfile) { const userInfo = result.userProfile // 解析用户角色 const userRoles = userInfo.roles || [] const isJudge = userRoles.includes('JUDGE') const isOrganizer = userRoles.includes('ORGANIZER') // 处理头像文字 const avatarText = (userInfo.name || '用户').substring(0, 1) this.setData({ userInfo, avatarText, userRoles, isJudge, isOrganizer }) // 更新全局用户信息 app.globalData.userInfo = userInfo // 根据角色加载相应数据 if (isJudge) { this.loadJudgeStats() } if (isOrganizer) { this.loadOrganizerStats() } } } catch (error) { console.error('加载用户信息失败:', error) wx.showToast({ title: '加载失败', icon: 'error' }) } finally { this.setData({ loading: false }) } }, // 加载用户统计数据 async loadUserStats() { try { const query = ` query GetUserStats { userStats { totalRegistrations ongoingActivities completedActivities awards } } ` const result = await graphqlRequest(query) if (result && result.userStats) { this.setData({ stats: result.userStats }) } } catch (error) { console.error('加载统计数据失败:', error) } }, // 加载最近报名记录 async loadRecentRegistrations() { try { this.setData({ registrationLoading: true }) const query = ` query GetRecentRegistrations { myRegistrations(limit: 5) { id activity { id title coverImage { id name path fullUrl fullThumbUrl mediaType } startTime status } status registrationTime } } ` const result = await graphqlRequest(query) if (result && result.myRegistrations) { // 为每个活动添加标题文字 const registrations = result.myRegistrations.map(registration => ({ ...registration, activity: { ...registration.activity, titleText: (registration.activity.title || '活动').substring(0, 2) } })) this.setData({ registrations }) } } catch (error) { console.error('加载报名记录失败:', error) } finally { this.setData({ registrationLoading: false }) } }, // 加载评委统计数据 async loadJudgeStats() { try { const query = ` query GetJudgeStats { judgeStats { pendingReviews completedReviews totalReviews } } ` const result = await graphqlRequest(query) if (result && result.judgeStats) { const judgeStats = result.judgeStats this.setData({ judgeStats, 'judgeMenuItems[0].badge': judgeStats.pendingReviews }) } } catch (error) { console.error('加载评委统计失败:', error) } }, // 加载主办方统计数据 async loadOrganizerStats() { try { const query = ` query GetOrganizerStats { organizerStats { activeActivities totalParticipants totalActivities } } ` const result = await graphqlRequest(query) if (result && result.organizerStats) { this.setData({ organizerStats: result.organizerStats }) } } catch (error) { console.error('加载主办方统计失败:', error) } }, // 编辑个人信息 onEditProfile() { wx.navigateTo({ url: '/pages/profile/edit' }) }, // 菜单项点击 onMenuItemTap(e) { const { path } = e.currentTarget.dataset wx.navigateTo({ url: path }) }, // 查看报名详情 onRegistrationTap(e) { const { id } = e.currentTarget.dataset wx.navigateTo({ url: `/pages/profile/registration-detail?id=${id}` }) }, // 查看活动详情 onActivityTap(e) { const { id } = e.currentTarget.dataset wx.navigateTo({ url: `/pages/activity/detail?id=${id}` }) }, // 查看更多报名记录 onViewMoreRegistrations() { wx.navigateTo({ url: '/pages/profile/registrations' }) }, // 获取状态文本 getStatusText(status) { const statusMap = { 'PENDING': '待审核', 'APPROVED': '已通过', 'REJECTED': '已拒绝', 'CANCELLED': '已取消' } return statusMap[status] || status }, // 获取状态样式类 getStatusClass(status) { const classMap = { 'PENDING': 'status-pending', 'APPROVED': 'status-approved', 'REJECTED': 'status-rejected', 'CANCELLED': 'status-cancelled' } return classMap[status] || '' }, // 获取活动状态文本 getActivityStatusText(status) { const statusMap = { 'UPCOMING': '即将开始', 'ONGOING': '进行中', 'COMPLETED': '已结束', 'CANCELLED': '已取消' } return statusMap[status] || status }, // 格式化日期 formatDate(dateString) { return formatDate(dateString, 'MM-DD HH:mm') }, // 退出登录 onLogout() { wx.showModal({ title: '确认退出', content: '确定要退出登录吗?', success: (res) => { if (res.confirm) { this.logout() } } }) }, // 执行退出登录 async logout() { try { wx.showLoading({ title: '退出中...' }) // 清除本地存储 wx.removeStorageSync('token') wx.removeStorageSync('userInfo') // 清除全局数据 app.globalData.token = '' app.globalData.userInfo = null app.globalData.isLoggedIn = false // 跳转到登录页 wx.reLaunch({ url: '/pages/login/login' }) wx.showToast({ title: '已退出登录', icon: 'success' }) } catch (error) { console.error('退出登录失败:', error) wx.showToast({ title: '退出失败', icon: 'error' }) } finally { wx.hideLoading() } }, // 分享页面 onShareAppMessage() { return { title: '蓉易创 - 我的个人中心', path: '/pages/index/index' } } })