| | |
| | | banners: [], |
| | | // 赛事列表 |
| | | activities: [], |
| | | // 最新新闻列表 |
| | | latestNews: [], |
| | | // 加载状态 |
| | | loading: true, |
| | | // 是否还有更多数据 |
| | |
| | | // 筛选条件 |
| | | filterStatus: 'all', // all, upcoming, ongoing, ended |
| | | // 轮播图当前索引 |
| | | currentBannerIndex: 0 |
| | | currentBannerIndex: 0, |
| | | // 分享相关数据 |
| | | shareActivityId: null, |
| | | shareActivityName: null |
| | | }, |
| | | |
| | | onLoad(options) { |
| | | console.log('首页加载') |
| | | this.loadBanners() |
| | | this.loadActivities() |
| | | }, |
| | | |
| | | onShow() { |
| | | console.log('首页显示') |
| | | // 统一系统导航栏标题 |
| | | try { wx.setNavigationBarTitle({ title: '蓉易创' }) } catch (e) {} |
| | | try { wx.setNavigationBarTitle({ title: '蓉e创' }) } catch (e) {} |
| | | // 检查登录状态 |
| | | if (!app.globalData.token) { |
| | | app.login() |
| | |
| | | if (typeof this.getTabBar === 'function' && this.getTabBar()) { |
| | | this.getTabBar().init(); |
| | | } |
| | | // 加载数据 |
| | | this.loadBanners() |
| | | this.loadLatestNews() |
| | | this.loadActivities() |
| | | }, |
| | | |
| | | onPullDownRefresh() { |
| | |
| | | |
| | | Promise.all([ |
| | | this.loadBanners(), |
| | | this.loadLatestNews(), |
| | | this.loadActivities() |
| | | ]).finally(() => { |
| | | wx.stopPullDownRefresh() |
| | |
| | | type: 'image', |
| | | url: banner.coverImage.fullUrl, |
| | | thumbUrl: banner.coverImage.fullThumbUrl |
| | | }) |
| | | }); |
| | | } |
| | | |
| | | return { |
| | |
| | | }) |
| | | }, |
| | | |
| | | // 加载最新新闻(只加载前3条) |
| | | loadLatestNews() { |
| | | return app.graphqlRequest(` |
| | | query getPublishedNewsList($page: Int!, $size: Int!) { |
| | | publishedNewsList(page: $page, size: $size) { |
| | | content { |
| | | id |
| | | title |
| | | summary |
| | | coverImage |
| | | author |
| | | viewCount |
| | | createTime |
| | | } |
| | | totalElements |
| | | page |
| | | size |
| | | } |
| | | } |
| | | `, { |
| | | page: 1, |
| | | size: 3 |
| | | }).then(data => { |
| | | if (data.publishedNewsList) { |
| | | // 格式化时间显示 |
| | | const latestNews = data.publishedNewsList.content.map(news => { |
| | | if (news.createTime) { |
| | | news.createTime = utils.formatDate(news.createTime, 'YYYY-MM-DD HH:mm:ss'); |
| | | } |
| | | return news; |
| | | }); |
| | | |
| | | this.setData({ |
| | | latestNews: latestNews |
| | | }) |
| | | } |
| | | }).catch(err => { |
| | | console.error('加载最新新闻失败:', err) |
| | | }) |
| | | }, |
| | | |
| | | // 加载赛事列表 |
| | | loadActivities() { |
| | | loadActivities(isLoadMore = false) { |
| | | this.setData({ loading: true }) |
| | | |
| | | const { currentPage, pageSize, searchKeyword, filterStatus } = this.data |
| | |
| | | // 名称搜索条件 |
| | | const nameFilter = searchKeyword || "" |
| | | |
| | | // 状态筛选条件:将前端的筛选状态转换为后端的state参数 |
| | | let stateFilter = null |
| | | if (filterStatus !== 'all') { |
| | | // 根据filterStatus映射到对应的state值 |
| | | const stateMapping = { |
| | | 'upcoming': 1, // 即将开始 -> 发布状态 |
| | | 'ongoing': 1, // 进行中 -> 发布状态 |
| | | 'ended': 2 // 已结束 -> 关闭状态 |
| | | } |
| | | stateFilter = stateMapping[filterStatus] |
| | | } |
| | | |
| | | return app.graphqlRequest(` |
| | | query getActivities($page: Int!, $size: Int!, $name: String) { |
| | | activities(page: $page, size: $size, name: $name) { |
| | | query getActivities($page: Int!, $size: Int!, $name: String, $state: Int) { |
| | | activities(page: $page, size: $size, name: $name, state: $state) { |
| | | content { |
| | | id |
| | | name |
| | |
| | | `, { |
| | | page: currentPage, |
| | | size: pageSize, |
| | | name: nameFilter |
| | | name: nameFilter, |
| | | state: 1 |
| | | }).then(data => { |
| | | if (data.activities) { |
| | | let newActivities = data.activities.content |
| | |
| | | } catch (e) {} |
| | | |
| | | // 为每个活动添加名称文字 |
| | | newActivities = newActivities.map(activity => ({ |
| | | ...activity, |
| | | nameText: (activity.name || '活动').substring(0, 2) |
| | | })) |
| | | // newActivities = newActivities.map(activity => ({ |
| | | // ...activity, |
| | | // nameText: (activity.name || '活动').substring(0, 2) |
| | | // })) |
| | | |
| | | // 根据筛选状态过滤活动 |
| | | if (filterStatus !== 'all') { |
| | | newActivities = newActivities.filter(activity => activity.state === filterStatus) |
| | | } |
| | | |
| | | // 合并数据 |
| | | const mergedActivities = currentPage === 1 |
| | | ? newActivities |
| | | : [...this.data.activities, ...newActivities] |
| | | // 合并数据:只有在真正的加载更多时才追加,其他情况都是全量替换 |
| | | const mergedActivities = isLoadMore && this.data.activities.length > 0 |
| | | ? [...this.data.activities, ...newActivities] |
| | | : newActivities |
| | | |
| | | this.setData({ |
| | | activities: mergedActivities, |
| | |
| | | this.setData({ |
| | | currentPage: this.data.currentPage + 1 |
| | | }) |
| | | this.loadActivities() |
| | | this.loadActivities(true) // 传入true表示这是加载更多 |
| | | }, |
| | | |
| | | // 轮播图切换 |
| | |
| | | utils.navigateTo('/pages/activity/detail', { id: activityId }) |
| | | }, |
| | | |
| | | // 点击赛事卡片 |
| | | onActivityTap(e) { |
| | | const index = e.currentTarget.dataset.index |
| | | const activity = this.data.activities[index] |
| | | if (activity) { |
| | | this.goToActivityDetail(activity.id) |
| | | // 跳转到新闻详情 |
| | | goToNewsDetail(e) { |
| | | const newsId = e.currentTarget.dataset.id |
| | | if (newsId) { |
| | | wx.navigateTo({ |
| | | url: `/pages/news/detail?id=${newsId}` |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | // 跳转到新闻列表 |
| | | goToNewsList() { |
| | | wx.navigateTo({ |
| | | url: '/pages/news/list' |
| | | }) |
| | | }, |
| | | |
| | | // 格式化日期 |
| | |
| | | const v = utils.formatDate(date, 'YYYY-MM-DD') |
| | | return v && typeof v === 'string' && v.trim() ? v : '—' |
| | | }, |
| | | |
| | | // 点击“详情”按钮(与卡片点击一致) |
| | | onDetailTap(e) { |
| | | const id = e.currentTarget.dataset.id |
| | | if (id) { |
| | | this.goToActivityDetail(id) |
| | | onTest(e){ |
| | | const activityId = e.currentTarget.dataset.id |
| | | const xid = e.currentTarget.dataset.xid; |
| | | const idx = e.currentTarget.dataset.idx; |
| | | |
| | | // 简化的调试信息 |
| | | console.log('点击活动详情 - ID:', activityId, '名称:', xid, '索引:', idx) |
| | | |
| | | if (activityId) { |
| | | this.goToActivityDetail(activityId) |
| | | } |
| | | }, |
| | | // 点击"详情"按钮(与卡片点击一致) |
| | | onActivityDetailTap(e) { |
| | | const activityId = e.currentTarget.dataset.id |
| | | const xid = e.currentTarget.dataset.xid; |
| | | const idx = e.currentTarget.dataset.idx; |
| | | |
| | | // 简化的调试信息 |
| | | console.log('点击活动详情 - ID:', activityId, '名称:', xid, '索引:', idx) |
| | | |
| | | if (activityId) { |
| | | this.goToActivityDetail(activityId) |
| | | } |
| | | }, |
| | | |
| | |
| | | return now <= signupDeadline && |
| | | activity.state === 'SIGNUP' && |
| | | activity.playerCount < activity.playerMax |
| | | }, |
| | | |
| | | // 分享单个比赛 |
| | | onShareActivity(e) { |
| | | const { id, name } = e.currentTarget.dataset |
| | | |
| | | // 显示分享选项 |
| | | wx.showActionSheet({ |
| | | itemList: ['分享给朋友', '生成分享海报'], |
| | | success: (res) => { |
| | | if (res.tapIndex === 0) { |
| | | // 分享给朋友 |
| | | this.shareToFriend(id, name) |
| | | } else if (res.tapIndex === 1) { |
| | | // 生成分享海报 |
| | | this.generateSharePoster(id, name) |
| | | } |
| | | }, |
| | | fail: (res) => { |
| | | console.log('用户取消分享') |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | // 分享给朋友 |
| | | shareToFriend(activityId, activityName) { |
| | | wx.showShareMenu({ |
| | | withShareTicket: true, |
| | | menus: ['shareAppMessage', 'shareTimeline'] |
| | | }) |
| | | |
| | | // 设置当前要分享的活动信息 |
| | | this.setData({ |
| | | shareActivityId: activityId, |
| | | shareActivityName: activityName |
| | | }) |
| | | |
| | | // 触发分享 |
| | | wx.updateShareMenu({ |
| | | withShareTicket: true, |
| | | isUpdatableMessage: true, |
| | | activityId: 'share_activity_' + activityId, |
| | | templateInfo: { |
| | | parameterList: [{ |
| | | name: 'activity_name', |
| | | value: activityName |
| | | }] |
| | | } |
| | | }) |
| | | |
| | | wx.showToast({ |
| | | title: '请点击右上角分享', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }) |
| | | }, |
| | | |
| | | // 生成分享海报 |
| | | generateSharePoster(activityId, activityName) { |
| | | wx.showLoading({ |
| | | title: '生成海报中...' |
| | | }) |
| | | |
| | | // 这里可以调用后端API生成分享海报 |
| | | // 或者使用canvas在前端生成 |
| | | setTimeout(() => { |
| | | wx.hideLoading() |
| | | wx.showToast({ |
| | | title: '海报生成功能开发中', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }) |
| | | }, 1500) |
| | | }, |
| | | |
| | | // 页面分享功能 - 分享给朋友 |
| | | onShareAppMessage(res) { |
| | | console.log('分享给朋友', res) |
| | | |
| | | // 如果是从比赛卡片分享 |
| | | if (this.data.shareActivityId && this.data.shareActivityName) { |
| | | const shareData = { |
| | | title: `${this.data.shareActivityName} - 蓉e创比赛平台`, |
| | | path: `/pages/activity/detail?id=${this.data.shareActivityId}`, |
| | | imageUrl: '', // 可以设置分享图片 |
| | | success: (res) => { |
| | | console.log('分享成功', res) |
| | | }, |
| | | fail: (res) => { |
| | | console.log('分享失败', res) |
| | | } |
| | | } |
| | | return shareData |
| | | } |
| | | |
| | | // 默认分享 |
| | | return { |
| | | title: '蓉e创比赛平台', |
| | | path: '/pages/index/index', |
| | | imageUrl: '', |
| | | success: (res) => { |
| | | console.log('分享成功', res) |
| | | }, |
| | | fail: (res) => { |
| | | console.log('分享失败', res) |
| | | } |
| | | } |
| | | }, |
| | | |
| | | // 页面分享功能 - 分享到朋友圈 |
| | | onShareTimeline() { |
| | | return { |
| | | title: '蓉e创比赛平台', |
| | | query: '', |
| | | imageUrl: '' |
| | | } |
| | | } |
| | | }) |