Codex Assistant
2025-11-06 308d3b3b7883a92a761dfaf4f607a9f4658213cf
wx/pages/index/index.js
@@ -21,17 +21,20 @@
    // 筛选条件
    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: '蓉e创' }) } catch (e) {}
    // 检查登录状态
    if (!app.globalData.token) {
      app.login()
@@ -40,6 +43,9 @@
    if (typeof this.getTabBar === 'function' && this.getTabBar()) {
      this.getTabBar().init();
    }
    // 加载数据
    this.loadBanners()
    this.loadActivities()
  },
  onPullDownRefresh() {
@@ -141,7 +147,7 @@
              type: 'image',
              url: banner.coverImage.fullUrl,
              thumbUrl: banner.coverImage.fullThumbUrl
            })
            });
          }
          
          return {
@@ -160,7 +166,7 @@
  },
  // 加载赛事列表
  loadActivities() {
  loadActivities(isLoadMore = false) {
    this.setData({ loading: true })
    
    const { currentPage, pageSize, searchKeyword, filterStatus } = this.data
@@ -168,9 +174,21 @@
    // 名称搜索条件
    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
@@ -199,26 +217,26 @@
    `, {
      page: currentPage,
      size: pageSize,
      name: nameFilter
      name: nameFilter,
      state: 1
    }).then(data => {
      if (data.activities) {
        let newActivities = data.activities.content
        // 调试:输出报名截止原始值
        try {
          console.log('活动原始报名截止:', newActivities.map(a => ({ id: a.id, name: a.name, signupDeadline: a.signupDeadline })))
        } 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,
@@ -238,7 +256,7 @@
    this.setData({
      currentPage: this.data.currentPage + 1
    })
    this.loadActivities()
    this.loadActivities(true) // 传入true表示这是加载更多
  },
  // 轮播图切换
@@ -323,18 +341,59 @@
    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)
    }
  },
  // 格式化日期
  formatDate(date) {
    return utils.formatDate(date, 'MM-DD HH:mm')
  },
  // 设计稿需要的 YYYY-MM-DD(强兼容:直接截取前10位,避免 JSCore 日期解析差异)
  formatDateYYYYMMDD(date) {
    if (!date && date !== 0) return '—'
    // 字符串:优先匹配 YYYY-MM-DD 直接返回,避免解析
    if (typeof date === 'string') {
      const m = date.match(/^(\d{4}-\d{2}-\d{2})/)
      if (m) return m[1]
    }
    // 数值:时间戳(秒/毫秒)兜底
    if (typeof date === 'number') {
      const ts = date > 1e12 ? date : date * 1000
      const d = new Date(ts)
      if (!isNaN(d.getTime())) {
        const y = d.getFullYear()
        const m = String(d.getMonth() + 1).padStart(2, '0')
        const day = String(d.getDate()).padStart(2, '0')
        return `${y}-${m}-${day}`
      }
    }
    // 其他情况走工具函数兜底
    const v = utils.formatDate(date, 'YYYY-MM-DD')
    return v && typeof v === 'string' && v.trim() ? v : '—'
  },
  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)
    }
  },
  // 获取状态文本
@@ -379,5 +438,164 @@
    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)
          wx.showToast({
            title: '分享成功',
            icon: 'success',
            duration: 2000
          })
          // 清除分享状态
          this.setData({
            shareActivityId: null,
            shareActivityName: null
          })
        },
        fail: (res) => {
          console.log('分享失败', res)
          wx.showToast({
            title: '分享失败',
            icon: 'none',
            duration: 2000
          })
        }
      }
      return shareData
    }
    // 默认分享整个首页
    return {
      title: '蓉e创比赛平台 - 发现精彩比赛',
      path: '/pages/index/index',
      imageUrl: '', // 可以设置默认分享图片
      success: (res) => {
        console.log('分享成功', res)
        wx.showToast({
          title: '分享成功',
          icon: 'success',
          duration: 2000
        })
      },
      fail: (res) => {
        console.log('分享失败', res)
        wx.showToast({
          title: '分享失败',
          icon: 'none',
          duration: 2000
        })
      }
    }
  },
  // 分享到朋友圈
  onShareTimeline() {
    console.log('分享到朋友圈')
    return {
      title: '蓉e创比赛平台 - 发现精彩比赛',
      query: '',
      imageUrl: '', // 可以设置分享图片
      success: (res) => {
        console.log('分享到朋友圈成功', res)
        wx.showToast({
          title: '分享成功',
          icon: 'success',
          duration: 2000
        })
      },
      fail: (res) => {
        console.log('分享到朋友圈失败', res)
        wx.showToast({
          title: '分享失败',
          icon: 'none',
          duration: 2000
        })
      }
    }
  }
})