feat(排行榜): 添加助力榜功能并替换点击事件为tap
实现助力榜功能,包括mock数据、显示逻辑和格式化方法 将click事件统一替换为tap事件以兼容移动端
Showing
3 changed files
with
289 additions
and
37 deletions
| ... | @@ -8,10 +8,10 @@ | ... | @@ -8,10 +8,10 @@ |
| 8 | <view class="overlay-body"> | 8 | <view class="overlay-body"> |
| 9 | <view class="overlay-content"> | 9 | <view class="overlay-content"> |
| 10 | <!-- 广告图片容器 - 支持滚动 --> | 10 | <!-- 广告图片容器 - 支持滚动 --> |
| 11 | - <scroll-view | 11 | + <scroll-view |
| 12 | - class="ad-scroll-container" | 12 | + class="ad-scroll-container" |
| 13 | scroll-y | 13 | scroll-y |
| 14 | - @click="handleAdClick" | 14 | + @tap="handleAdClick" |
| 15 | > | 15 | > |
| 16 | <image | 16 | <image |
| 17 | :src="adConfig.adImageUrl" | 17 | :src="adConfig.adImageUrl" |
| ... | @@ -22,7 +22,7 @@ | ... | @@ -22,7 +22,7 @@ |
| 22 | </scroll-view> | 22 | </scroll-view> |
| 23 | 23 | ||
| 24 | <!-- 关闭按钮 --> | 24 | <!-- 关闭按钮 --> |
| 25 | - <view class="close-button" @click="handleClose"> | 25 | + <view class="close-button" @tap="handleClose"> |
| 26 | <Close size="24" class="close-icon" /> | 26 | <Close size="24" class="close-icon" /> |
| 27 | </view> | 27 | </view> |
| 28 | </view> | 28 | </view> | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2025-01-09 00:00:00 | 2 | * @Date: 2025-01-09 00:00:00 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-09-16 11:22:44 | 4 | + * @LastEditTime: 2025-09-18 16:45:21 |
| 5 | * @FilePath: /lls_program/src/components/RankingCard.vue | 5 | * @FilePath: /lls_program/src/components/RankingCard.vue |
| 6 | * @Description: 排行榜卡片组件 | 6 | * @Description: 排行榜卡片组件 |
| 7 | --> | 7 | --> |
| ... | @@ -52,13 +52,13 @@ | ... | @@ -52,13 +52,13 @@ |
| 52 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-silver.png" class="w-5 h-5" mode="aspectFill" /> | 52 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-silver.png" class="w-5 h-5" mode="aspectFill" /> |
| 53 | </view> | 53 | </view> |
| 54 | <view class="avatar"> | 54 | <view class="avatar"> |
| 55 | - <image :src="topRanks[1]?.avatar_url || defaultAvatar" class="avatar-img" mode="aspectFill" /> | 55 | + <image :src="activeTab === 'support' ? (topRanks[1]?.logo || defaultAvatar) : (topRanks[1]?.avatar_url || defaultAvatar)" class="avatar-img" mode="aspectFill" /> |
| 56 | </view> | 56 | </view> |
| 57 | - <view class="family-name">{{ topRanks[1]?.name }}</view> | 57 | + <view class="family-name">{{ activeTab === 'support' ? topRanks[1]?.name : topRanks[1]?.name }}</view> |
| 58 | - <view class="leader-name">大家长:{{ topRanks[1]?.created_by_nickname }}</view> | 58 | + <view class="leader-name">{{ activeTab === 'support' ? `${topRanks[1]?.family_count}个家庭` : `大家长:${topRanks[1]?.created_by_nickname}` }}</view> |
| 59 | <view class="rank-number"> | 59 | <view class="rank-number"> |
| 60 | <view class="rank-num">2</view> | 60 | <view class="rank-num">2</view> |
| 61 | - <view class="steps-in-rank">{{ formatSteps(topRanks[1]?.step) }}</view> | 61 | + <view class="steps-in-rank">{{ activeTab === 'support' ? formatSupportSteps(topRanks[1]?.total_steps) : formatSteps(topRanks[1]?.step) }}</view> |
| 62 | </view> | 62 | </view> |
| 63 | </view> | 63 | </view> |
| 64 | 64 | ||
| ... | @@ -68,13 +68,13 @@ | ... | @@ -68,13 +68,13 @@ |
| 68 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-gold.png" class="w-5 h-5" mode="aspectFill" /> | 68 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-gold.png" class="w-5 h-5" mode="aspectFill" /> |
| 69 | </view> | 69 | </view> |
| 70 | <view class="avatar"> | 70 | <view class="avatar"> |
| 71 | - <image :src="topRanks[0]?.avatar_url || defaultAvatar" class="avatar-img" mode="aspectFill" /> | 71 | + <image :src="activeTab === 'support' ? (topRanks[0]?.logo || defaultAvatar) : (topRanks[0]?.avatar_url || defaultAvatar)" class="avatar-img" mode="aspectFill" /> |
| 72 | </view> | 72 | </view> |
| 73 | <view class="family-name">{{ topRanks[0]?.name }}</view> | 73 | <view class="family-name">{{ topRanks[0]?.name }}</view> |
| 74 | - <view class="leader-name">大家长:{{ topRanks[0]?.created_by_nickname }}</view> | 74 | + <view class="leader-name">{{ activeTab === 'support' ? `${topRanks[0]?.family_count}个家庭` : `大家长:${topRanks[0]?.created_by_nickname}` }}</view> |
| 75 | <view class="rank-number"> | 75 | <view class="rank-number"> |
| 76 | <view class="rank-num">1</view> | 76 | <view class="rank-num">1</view> |
| 77 | - <view class="steps-in-rank">{{ formatSteps(topRanks[0]?.step) }}</view> | 77 | + <view class="steps-in-rank">{{ activeTab === 'support' ? formatSupportSteps(topRanks[0]?.total_steps) : formatSteps(topRanks[0]?.step) }}</view> |
| 78 | </view> | 78 | </view> |
| 79 | </view> | 79 | </view> |
| 80 | 80 | ||
| ... | @@ -84,13 +84,13 @@ | ... | @@ -84,13 +84,13 @@ |
| 84 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-bronze.png" class="w-5 h-5" mode="aspectFill" /> | 84 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-bronze.png" class="w-5 h-5" mode="aspectFill" /> |
| 85 | </view> | 85 | </view> |
| 86 | <view class="avatar"> | 86 | <view class="avatar"> |
| 87 | - <image :src="topRanks[2]?.avatar_url || defaultAvatar" class="avatar-img" mode="aspectFill" /> | 87 | + <image :src="activeTab === 'support' ? (topRanks[2]?.logo || defaultAvatar) : (topRanks[2]?.avatar_url || defaultAvatar)" class="avatar-img" mode="aspectFill" /> |
| 88 | </view> | 88 | </view> |
| 89 | <view class="family-name">{{ topRanks[2]?.name }}</view> | 89 | <view class="family-name">{{ topRanks[2]?.name }}</view> |
| 90 | - <view class="leader-name">大家长:{{ topRanks[2]?.created_by_nickname }}</view> | 90 | + <view class="leader-name">{{ activeTab === 'support' ? `${topRanks[2]?.family_count}个家庭` : `大家长:${topRanks[2]?.created_by_nickname}` }}</view> |
| 91 | <view class="rank-number"> | 91 | <view class="rank-number"> |
| 92 | <view class="rank-num">3</view> | 92 | <view class="rank-num">3</view> |
| 93 | - <view class="steps-in-rank">{{ formatSteps(topRanks[2]?.step) }}</view> | 93 | + <view class="steps-in-rank">{{ activeTab === 'support' ? formatSupportSteps(topRanks[2]?.total_steps) : formatSteps(topRanks[2]?.step) }}</view> |
| 94 | </view> | 94 | </view> |
| 95 | </view> | 95 | </view> |
| 96 | </view> | 96 | </view> |
| ... | @@ -112,7 +112,7 @@ | ... | @@ -112,7 +112,7 @@ |
| 112 | </view> | 112 | </view> |
| 113 | </view> | 113 | </view> |
| 114 | <view class="my-rank-right"> | 114 | <view class="my-rank-right"> |
| 115 | - <view class="my-steps">{{ formatStepsForList(myRank.step) }}</view> | 115 | + <view class="my-steps">{{ activeTab === 'support' ? formatSupportSteps(myRank.step) : formatStepsForList(myRank.step) }}</view> |
| 116 | <view class="rank-status">{{ myRank.status }}</view> | 116 | <view class="rank-status">{{ myRank.status }}</view> |
| 117 | </view> | 117 | </view> |
| 118 | </view> | 118 | </view> |
| ... | @@ -155,6 +155,63 @@ const isContentSwitching = ref(false) | ... | @@ -155,6 +155,63 @@ const isContentSwitching = ref(false) |
| 155 | // 排行榜数据 | 155 | // 排行榜数据 |
| 156 | const leaderboardData = ref(null) | 156 | const leaderboardData = ref(null) |
| 157 | 157 | ||
| 158 | +// 助力榜mock数据 | ||
| 159 | +const supportData = ref({ | ||
| 160 | + yesterday: '2024年1月15日', | ||
| 161 | + kindergartens: [ | ||
| 162 | + { | ||
| 163 | + id: 1, | ||
| 164 | + name: '阳光幼儿园', | ||
| 165 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 166 | + family_count: 156, | ||
| 167 | + total_steps: 430000 | ||
| 168 | + }, | ||
| 169 | + { | ||
| 170 | + id: 2, | ||
| 171 | + name: '彩虹幼儿园', | ||
| 172 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 173 | + family_count: 142, | ||
| 174 | + total_steps: 380000 | ||
| 175 | + }, | ||
| 176 | + { | ||
| 177 | + id: 3, | ||
| 178 | + name: '小星星幼儿园', | ||
| 179 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 180 | + family_count: 128, | ||
| 181 | + total_steps: 320000 | ||
| 182 | + }, | ||
| 183 | + { | ||
| 184 | + id: 4, | ||
| 185 | + name: '快乐幼儿园', | ||
| 186 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 187 | + family_count: 115, | ||
| 188 | + total_steps: 280000 | ||
| 189 | + }, | ||
| 190 | + { | ||
| 191 | + id: 5, | ||
| 192 | + name: '智慧幼儿园', | ||
| 193 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 194 | + family_count: 98, | ||
| 195 | + total_steps: 250000 | ||
| 196 | + }, | ||
| 197 | + { | ||
| 198 | + id: 6, | ||
| 199 | + name: '梦想幼儿园', | ||
| 200 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 201 | + family_count: 87, | ||
| 202 | + total_steps: 220000 | ||
| 203 | + } | ||
| 204 | + ], | ||
| 205 | + current_kindergarten: { | ||
| 206 | + id: 7, | ||
| 207 | + name: '我的幼儿园', | ||
| 208 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 209 | + family_count: 45, | ||
| 210 | + total_steps: 120000, | ||
| 211 | + rank: 8 | ||
| 212 | + } | ||
| 213 | +}) | ||
| 214 | + | ||
| 158 | // 加载状态 | 215 | // 加载状态 |
| 159 | const loading = ref(false) | 216 | const loading = ref(false) |
| 160 | 217 | ||
| ... | @@ -168,10 +225,22 @@ const currentDate = ref('') | ... | @@ -168,10 +225,22 @@ const currentDate = ref('') |
| 168 | const switchTab = async (tab) => { | 225 | const switchTab = async (tab) => { |
| 169 | if (activeTab.value === tab) return | 226 | if (activeTab.value === tab) return |
| 170 | 227 | ||
| 171 | - // 助力榜暂时没有数据,显示提示 | 228 | + // 助力榜使用mock数据 |
| 172 | if (tab === 'support') { | 229 | if (tab === 'support') { |
| 173 | - // TODO: 助力榜功能待开发 | 230 | + // 开始切换动画 |
| 174 | - console.log('助力榜功能待开发') | 231 | + isContentSwitching.value = true |
| 232 | + | ||
| 233 | + // 延迟切换内容,让淡出动画先执行 | ||
| 234 | + setTimeout(() => { | ||
| 235 | + activeTab.value = tab | ||
| 236 | + // 设置助力榜的日期 | ||
| 237 | + currentDate.value = supportData.value.yesterday | ||
| 238 | + | ||
| 239 | + // 内容切换后,结束切换状态,开始淡入动画 | ||
| 240 | + setTimeout(() => { | ||
| 241 | + isContentSwitching.value = false | ||
| 242 | + }, 50) | ||
| 243 | + }, 200) | ||
| 175 | return | 244 | return |
| 176 | } | 245 | } |
| 177 | 246 | ||
| ... | @@ -288,6 +357,20 @@ const formatStepsForList = (steps) => { | ... | @@ -288,6 +357,20 @@ const formatStepsForList = (steps) => { |
| 288 | } | 357 | } |
| 289 | 358 | ||
| 290 | /** | 359 | /** |
| 360 | + * 格式化助力榜步数显示(超过10000显示为万+格式) | ||
| 361 | + * @param {number} steps - 步数 | ||
| 362 | + * @returns {string} 格式化后的步数 | ||
| 363 | + */ | ||
| 364 | +const formatSupportSteps = (steps) => { | ||
| 365 | + if (!steps) return '0' | ||
| 366 | + if (steps >= 10000) { | ||
| 367 | + const wan = Math.floor(steps / 10000) | ||
| 368 | + return `${wan}万+` | ||
| 369 | + } | ||
| 370 | + return steps.toLocaleString() | ||
| 371 | +} | ||
| 372 | + | ||
| 373 | +/** | ||
| 291 | * 处理查看更多点击事件 | 374 | * 处理查看更多点击事件 |
| 292 | */ | 375 | */ |
| 293 | const handleViewMore = () => { | 376 | const handleViewMore = () => { |
| ... | @@ -300,6 +383,15 @@ const handleViewMore = () => { | ... | @@ -300,6 +383,15 @@ const handleViewMore = () => { |
| 300 | 383 | ||
| 301 | // 计算前三名数据 | 384 | // 计算前三名数据 |
| 302 | const topRanks = computed(() => { | 385 | const topRanks = computed(() => { |
| 386 | + if (activeTab.value === 'support') { | ||
| 387 | + // 助力榜数据 | ||
| 388 | + if (!supportData.value || !supportData.value.kindergartens) { | ||
| 389 | + return [] | ||
| 390 | + } | ||
| 391 | + return supportData.value.kindergartens.slice(0, 3) | ||
| 392 | + } | ||
| 393 | + | ||
| 394 | + // 家庭排行榜数据 | ||
| 303 | if (!leaderboardData.value || !leaderboardData.value.families) { | 395 | if (!leaderboardData.value || !leaderboardData.value.families) { |
| 304 | return [] | 396 | return [] |
| 305 | } | 397 | } |
| ... | @@ -308,6 +400,25 @@ const topRanks = computed(() => { | ... | @@ -308,6 +400,25 @@ const topRanks = computed(() => { |
| 308 | 400 | ||
| 309 | // 计算我的排名信息 | 401 | // 计算我的排名信息 |
| 310 | const myRank = computed(() => { | 402 | const myRank = computed(() => { |
| 403 | + if (activeTab.value === 'support') { | ||
| 404 | + // 助力榜我的幼儿园信息 | ||
| 405 | + if (!supportData.value || !supportData.value.current_kindergarten) { | ||
| 406 | + return null | ||
| 407 | + } | ||
| 408 | + | ||
| 409 | + const currentKindergarten = supportData.value.current_kindergarten | ||
| 410 | + return { | ||
| 411 | + ...currentKindergarten, | ||
| 412 | + name: currentKindergarten.name, | ||
| 413 | + avatar_url: currentKindergarten.logo, | ||
| 414 | + step: currentKindergarten.total_steps, | ||
| 415 | + created_by_nickname: `${currentKindergarten.family_count}个家庭`, | ||
| 416 | + status: currentKindergarten.rank > 100 ? '未上榜' : '已上榜', | ||
| 417 | + isNotRanked: !currentKindergarten.rank || currentKindergarten.rank === 0 || currentKindergarten.rank > 100 | ||
| 418 | + } | ||
| 419 | + } | ||
| 420 | + | ||
| 421 | + // 家庭排行榜我的排名信息 | ||
| 311 | if (!leaderboardData.value || !leaderboardData.value.current_family) { | 422 | if (!leaderboardData.value || !leaderboardData.value.current_family) { |
| 312 | return null | 423 | return null |
| 313 | } | 424 | } | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2025-09-01 13:07:52 | 2 | * @Date: 2025-09-01 13:07:52 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-09-15 15:59:31 | 4 | + * @LastEditTime: 2025-09-18 16:56:23 |
| 5 | * @FilePath: /lls_program/src/pages/FamilyRank/index.vue | 5 | * @FilePath: /lls_program/src/pages/FamilyRank/index.vue |
| 6 | * @Description: 文件描述 | 6 | * @Description: 文件描述 |
| 7 | --> | 7 | --> |
| ... | @@ -39,8 +39,9 @@ | ... | @@ -39,8 +39,9 @@ |
| 39 | </view> | 39 | </view> |
| 40 | 40 | ||
| 41 | <!-- 排行榜日期 --> | 41 | <!-- 排行榜日期 --> |
| 42 | - <view v-if="!loading" class="rank-date"> | 42 | + <view v-if="!loading" class="rank-date relative"> |
| 43 | {{ currentDate }} | 43 | {{ currentDate }} |
| 44 | + <view v-if="activeTab === 'support'" class="absolute font-bold text-white" style="right: 95rpx;" @tap="joinOrganization">助力码</view> | ||
| 44 | </view> | 45 | </view> |
| 45 | 46 | ||
| 46 | <!-- 前三名展示 --> | 47 | <!-- 前三名展示 --> |
| ... | @@ -52,13 +53,13 @@ | ... | @@ -52,13 +53,13 @@ |
| 52 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-silver.png" class="w-5 h-5" mode="aspectFill" /> | 53 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-silver.png" class="w-5 h-5" mode="aspectFill" /> |
| 53 | </view> | 54 | </view> |
| 54 | <view class="avatar"> | 55 | <view class="avatar"> |
| 55 | - <image :src="topThreeData[1]?.avatar_url || defaultAvatar" class="avatar-img" mode="aspectFill" /> | 56 | + <image :src="activeTab === 'support' ? topThreeData[1]?.logo : (topThreeData[1]?.avatar_url || defaultAvatar)" class="avatar-img" mode="aspectFill" /> |
| 56 | </view> | 57 | </view> |
| 57 | <view class="family-name">{{ topThreeData[1]?.name }}</view> | 58 | <view class="family-name">{{ topThreeData[1]?.name }}</view> |
| 58 | - <view class="leader-name">大家长:{{ topThreeData[1]?.created_by_nickname }}</view> | 59 | + <view class="leader-name">{{ activeTab === 'support' ? `${topThreeData[1]?.family_count}个家庭` : `大家长:${topThreeData[1]?.created_by_nickname}` }}</view> |
| 59 | <view class="rank-number"> | 60 | <view class="rank-number"> |
| 60 | <view class="rank-num">2</view> | 61 | <view class="rank-num">2</view> |
| 61 | - <view class="steps-in-rank">{{ formatSteps(topThreeData[1]?.step) }}</view> | 62 | + <view class="steps-in-rank">{{ activeTab === 'support' ? formatSupportSteps(topThreeData[1]?.total_steps) : formatSteps(topThreeData[1]?.step) }}</view> |
| 62 | </view> | 63 | </view> |
| 63 | </view> | 64 | </view> |
| 64 | 65 | ||
| ... | @@ -68,13 +69,13 @@ | ... | @@ -68,13 +69,13 @@ |
| 68 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-gold.png" class="w-5 h-5" mode="aspectFill" /> | 69 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-gold.png" class="w-5 h-5" mode="aspectFill" /> |
| 69 | </view> | 70 | </view> |
| 70 | <view class="avatar"> | 71 | <view class="avatar"> |
| 71 | - <image :src="topThreeData[0]?.avatar_url || defaultAvatar" class="avatar-img" mode="aspectFill" /> | 72 | + <image :src="activeTab === 'support' ? topThreeData[0]?.logo : (topThreeData[0]?.avatar_url || defaultAvatar)" class="avatar-img" mode="aspectFill" /> |
| 72 | </view> | 73 | </view> |
| 73 | <view class="family-name">{{ topThreeData[0]?.name }}</view> | 74 | <view class="family-name">{{ topThreeData[0]?.name }}</view> |
| 74 | - <view class="leader-name">大家长:{{ topThreeData[0]?.created_by_nickname }}</view> | 75 | + <view class="leader-name">{{ activeTab === 'support' ? `${topThreeData[0]?.family_count}个家庭` : `大家长:${topThreeData[0]?.created_by_nickname}` }}</view> |
| 75 | <view class="rank-number"> | 76 | <view class="rank-number"> |
| 76 | <view class="rank-num">1</view> | 77 | <view class="rank-num">1</view> |
| 77 | - <view class="steps-in-rank">{{ formatSteps(topThreeData[0]?.step) }}</view> | 78 | + <view class="steps-in-rank">{{ activeTab === 'support' ? formatSupportSteps(topThreeData[0]?.total_steps) : formatSteps(topThreeData[0]?.step) }}</view> |
| 78 | </view> | 79 | </view> |
| 79 | </view> | 80 | </view> |
| 80 | 81 | ||
| ... | @@ -84,13 +85,13 @@ | ... | @@ -84,13 +85,13 @@ |
| 84 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-bronze.png" class="w-5 h-5" mode="aspectFill" /> | 85 | <image src="https://cdn.ipadbiz.cn/lls_prog/images/crow-bronze.png" class="w-5 h-5" mode="aspectFill" /> |
| 85 | </view> | 86 | </view> |
| 86 | <view class="avatar"> | 87 | <view class="avatar"> |
| 87 | - <image :src="topThreeData[2]?.avatar_url || defaultAvatar" class="avatar-img" mode="aspectFill" /> | 88 | + <image :src="activeTab === 'support' ? topThreeData[2]?.logo : (topThreeData[2]?.avatar_url || defaultAvatar)" class="avatar-img" mode="aspectFill" /> |
| 88 | </view> | 89 | </view> |
| 89 | <view class="family-name">{{ topThreeData[2]?.name }}</view> | 90 | <view class="family-name">{{ topThreeData[2]?.name }}</view> |
| 90 | - <view class="leader-name">大家长:{{ topThreeData[2]?.created_by_nickname }}</view> | 91 | + <view class="leader-name">{{ activeTab === 'support' ? `${topThreeData[2]?.family_count}个家庭` : `大家长:${topThreeData[2]?.created_by_nickname}` }}</view> |
| 91 | <view class="rank-number"> | 92 | <view class="rank-number"> |
| 92 | <view class="rank-num">3</view> | 93 | <view class="rank-num">3</view> |
| 93 | - <view class="steps-in-rank">{{ formatSteps(topThreeData[2]?.step) }}</view> | 94 | + <view class="steps-in-rank">{{ activeTab === 'support' ? formatSupportSteps(topThreeData[2]?.total_steps) : formatSteps(topThreeData[2]?.step) }}</view> |
| 94 | </view> | 95 | </view> |
| 95 | </view> | 96 | </view> |
| 96 | </view> | 97 | </view> |
| ... | @@ -105,15 +106,15 @@ | ... | @@ -105,15 +106,15 @@ |
| 105 | <view class="rank-info"> | 106 | <view class="rank-info"> |
| 106 | <view class="rank-num">{{ index + 4 }}</view> | 107 | <view class="rank-num">{{ index + 4 }}</view> |
| 107 | <view class="avatar-small"> | 108 | <view class="avatar-small"> |
| 108 | - <image :src="item.avatar_url || defaultAvatar" class="avatar-small-img" mode="aspectFill" /> | 109 | + <image :src="activeTab === 'support' ? item.logo : (item.avatar_url || defaultAvatar)" class="avatar-small-img" mode="aspectFill" /> |
| 109 | </view> | 110 | </view> |
| 110 | <view class="family-info"> | 111 | <view class="family-info"> |
| 111 | <view class="family-name-small">{{ item.name }}</view> | 112 | <view class="family-name-small">{{ item.name }}</view> |
| 112 | - <view class="leader-name-small">大家长:{{ item.created_by_nickname }}</view> | 113 | + <view class="leader-name-small">{{ activeTab === 'support' ? `${item.family_count}个家庭` : `大家长:${item.created_by_nickname}` }}</view> |
| 113 | </view> | 114 | </view> |
| 114 | </view> | 115 | </view> |
| 115 | <view class="steps-info"> | 116 | <view class="steps-info"> |
| 116 | - <view class="steps">{{ formatStepsForList(item.step) }}</view> | 117 | + <view class="steps">{{ activeTab === 'support' ? formatSupportSteps(item.total_steps) : formatStepsForList(item.step) }}</view> |
| 117 | </view> | 118 | </view> |
| 118 | </view> | 119 | </view> |
| 119 | </view> | 120 | </view> |
| ... | @@ -140,7 +141,7 @@ | ... | @@ -140,7 +141,7 @@ |
| 140 | </view> | 141 | </view> |
| 141 | </view> | 142 | </view> |
| 142 | <view class="my-rank-right"> | 143 | <view class="my-rank-right"> |
| 143 | - <view class="my-steps">{{ formatStepsForList(myRankInfo.step) }}</view> | 144 | + <view class="my-steps">{{ activeTab === 'support' ? formatSupportSteps(myRankInfo.step) : formatStepsForList(myRankInfo.step) }}</view> |
| 144 | <view class="rank-status">{{ myRankInfo.isNotRanked ? '未上榜' : '已上榜' }}</view> | 145 | <view class="rank-status">{{ myRankInfo.isNotRanked ? '未上榜' : '已上榜' }}</view> |
| 145 | </view> | 146 | </view> |
| 146 | </view> | 147 | </view> |
| ... | @@ -153,6 +154,7 @@ | ... | @@ -153,6 +154,7 @@ |
| 153 | 154 | ||
| 154 | <script setup> | 155 | <script setup> |
| 155 | import { ref, computed, onMounted } from 'vue' | 156 | import { ref, computed, onMounted } from 'vue' |
| 157 | +import Taro from '@tarojs/taro' | ||
| 156 | import BackToTop from '@/components/BackToTop.vue' | 158 | import BackToTop from '@/components/BackToTop.vue' |
| 157 | // 默认头像 | 159 | // 默认头像 |
| 158 | const defaultAvatar = 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg' | 160 | const defaultAvatar = 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg' |
| ... | @@ -178,6 +180,83 @@ const isContentSwitching = ref(false) | ... | @@ -178,6 +180,83 @@ const isContentSwitching = ref(false) |
| 178 | // 排行榜数据 | 180 | // 排行榜数据 |
| 179 | const leaderboardData = ref(null) | 181 | const leaderboardData = ref(null) |
| 180 | 182 | ||
| 183 | +// 助力榜mock数据 | ||
| 184 | +const supportData = ref({ | ||
| 185 | + yesterday: '2024年1月15日', | ||
| 186 | + kindergartens: [ | ||
| 187 | + { | ||
| 188 | + id: 1, | ||
| 189 | + name: '阳光幼儿园', | ||
| 190 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 191 | + family_count: 156, | ||
| 192 | + total_steps: 430000 | ||
| 193 | + }, | ||
| 194 | + { | ||
| 195 | + id: 2, | ||
| 196 | + name: '彩虹幼儿园', | ||
| 197 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 198 | + family_count: 142, | ||
| 199 | + total_steps: 380000 | ||
| 200 | + }, | ||
| 201 | + { | ||
| 202 | + id: 3, | ||
| 203 | + name: '小星星幼儿园', | ||
| 204 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 205 | + family_count: 128, | ||
| 206 | + total_steps: 320000 | ||
| 207 | + }, | ||
| 208 | + { | ||
| 209 | + id: 4, | ||
| 210 | + name: '快乐幼儿园', | ||
| 211 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 212 | + family_count: 115, | ||
| 213 | + total_steps: 280000 | ||
| 214 | + }, | ||
| 215 | + { | ||
| 216 | + id: 5, | ||
| 217 | + name: '智慧幼儿园', | ||
| 218 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 219 | + family_count: 98, | ||
| 220 | + total_steps: 250000 | ||
| 221 | + }, | ||
| 222 | + { | ||
| 223 | + id: 6, | ||
| 224 | + name: '梦想幼儿园', | ||
| 225 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 226 | + family_count: 87, | ||
| 227 | + total_steps: 220000 | ||
| 228 | + }, | ||
| 229 | + { | ||
| 230 | + id: 7, | ||
| 231 | + name: '未来幼儿园', | ||
| 232 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 233 | + family_count: 76, | ||
| 234 | + total_steps: 190000 | ||
| 235 | + }, | ||
| 236 | + { | ||
| 237 | + id: 8, | ||
| 238 | + name: '希望幼儿园', | ||
| 239 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 240 | + family_count: 65, | ||
| 241 | + total_steps: 160000 | ||
| 242 | + } | ||
| 243 | + ], | ||
| 244 | + current_kindergarten: { | ||
| 245 | + id: 9, | ||
| 246 | + name: '我的幼儿园', | ||
| 247 | + logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg', | ||
| 248 | + family_count: 45, | ||
| 249 | + total_steps: 120000, | ||
| 250 | + rank: 10 | ||
| 251 | + } | ||
| 252 | +}) | ||
| 253 | + | ||
| 254 | +const joinOrganization = () => { | ||
| 255 | + Taro.navigateTo({ | ||
| 256 | + url: '/pages/JoinOrganization/index' | ||
| 257 | + }) | ||
| 258 | +} | ||
| 259 | + | ||
| 181 | // 加载状态 | 260 | // 加载状态 |
| 182 | const loading = ref(false) | 261 | const loading = ref(false) |
| 183 | 262 | ||
| ... | @@ -191,10 +270,22 @@ const currentDate = ref('') | ... | @@ -191,10 +270,22 @@ const currentDate = ref('') |
| 191 | const switchTab = async (tab) => { | 270 | const switchTab = async (tab) => { |
| 192 | if (activeTab.value === tab) return | 271 | if (activeTab.value === tab) return |
| 193 | 272 | ||
| 194 | - // 助力榜暂时没有数据,显示提示 | 273 | + // 助力榜使用mock数据 |
| 195 | if (tab === 'support') { | 274 | if (tab === 'support') { |
| 196 | - // TODO: 助力榜功能待开发 | 275 | + // 开始切换动画 |
| 197 | - console.log('助力榜功能待开发') | 276 | + isContentSwitching.value = true |
| 277 | + | ||
| 278 | + // 延迟切换内容,让淡出动画先执行 | ||
| 279 | + setTimeout(() => { | ||
| 280 | + activeTab.value = tab | ||
| 281 | + // 设置助力榜的日期 | ||
| 282 | + currentDate.value = supportData.value.yesterday | ||
| 283 | + | ||
| 284 | + // 内容切换后,结束切换状态,开始淡入动画 | ||
| 285 | + setTimeout(() => { | ||
| 286 | + isContentSwitching.value = false | ||
| 287 | + }, 50) | ||
| 288 | + }, 200) | ||
| 198 | return | 289 | return |
| 199 | } | 290 | } |
| 200 | 291 | ||
| ... | @@ -233,6 +324,20 @@ const formatStepsForList = (steps) => { | ... | @@ -233,6 +324,20 @@ const formatStepsForList = (steps) => { |
| 233 | return steps ? steps.toLocaleString() : '0' | 324 | return steps ? steps.toLocaleString() : '0' |
| 234 | } | 325 | } |
| 235 | 326 | ||
| 327 | +/** | ||
| 328 | + * 格式化助力榜步数显示(超过10000显示为万+格式) | ||
| 329 | + * @param {number} steps - 步数 | ||
| 330 | + * @returns {string} 格式化后的步数 | ||
| 331 | + */ | ||
| 332 | +const formatSupportSteps = (steps) => { | ||
| 333 | + if (!steps) return '0' | ||
| 334 | + if (steps >= 10000) { | ||
| 335 | + const wan = Math.floor(steps / 10000) | ||
| 336 | + return `${wan}万+` | ||
| 337 | + } | ||
| 338 | + return steps.toLocaleString() | ||
| 339 | +} | ||
| 340 | + | ||
| 236 | 341 | ||
| 237 | 342 | ||
| 238 | /** | 343 | /** |
| ... | @@ -315,6 +420,15 @@ const getTabDisplayName = (region) => { | ... | @@ -315,6 +420,15 @@ const getTabDisplayName = (region) => { |
| 315 | * 计算前三名数据 | 420 | * 计算前三名数据 |
| 316 | */ | 421 | */ |
| 317 | const topThreeData = computed(() => { | 422 | const topThreeData = computed(() => { |
| 423 | + if (activeTab.value === 'support') { | ||
| 424 | + // 助力榜数据 | ||
| 425 | + if (!supportData.value || !supportData.value.kindergartens) { | ||
| 426 | + return [] | ||
| 427 | + } | ||
| 428 | + return supportData.value.kindergartens.slice(0, 3) | ||
| 429 | + } | ||
| 430 | + | ||
| 431 | + // 家庭排行榜数据 | ||
| 318 | if (!leaderboardData.value || !leaderboardData.value.families) { | 432 | if (!leaderboardData.value || !leaderboardData.value.families) { |
| 319 | return [] | 433 | return [] |
| 320 | } | 434 | } |
| ... | @@ -325,6 +439,15 @@ const topThreeData = computed(() => { | ... | @@ -325,6 +439,15 @@ const topThreeData = computed(() => { |
| 325 | * 计算其他排名数据 | 439 | * 计算其他排名数据 |
| 326 | */ | 440 | */ |
| 327 | const otherRankData = computed(() => { | 441 | const otherRankData = computed(() => { |
| 442 | + if (activeTab.value === 'support') { | ||
| 443 | + // 助力榜数据 | ||
| 444 | + if (!supportData.value || !supportData.value.kindergartens) { | ||
| 445 | + return [] | ||
| 446 | + } | ||
| 447 | + return supportData.value.kindergartens.slice(3) | ||
| 448 | + } | ||
| 449 | + | ||
| 450 | + // 家庭排行榜数据 | ||
| 328 | if (!leaderboardData.value || !leaderboardData.value.families) { | 451 | if (!leaderboardData.value || !leaderboardData.value.families) { |
| 329 | return [] | 452 | return [] |
| 330 | } | 453 | } |
| ... | @@ -335,6 +458,24 @@ const otherRankData = computed(() => { | ... | @@ -335,6 +458,24 @@ const otherRankData = computed(() => { |
| 335 | * 计算我的排名信息 | 458 | * 计算我的排名信息 |
| 336 | */ | 459 | */ |
| 337 | const myRankInfo = computed(() => { | 460 | const myRankInfo = computed(() => { |
| 461 | + if (activeTab.value === 'support') { | ||
| 462 | + // 助力榜我的幼儿园信息 | ||
| 463 | + if (!supportData.value || !supportData.value.current_kindergarten) { | ||
| 464 | + return null | ||
| 465 | + } | ||
| 466 | + | ||
| 467 | + const currentKindergarten = supportData.value.current_kindergarten | ||
| 468 | + return { | ||
| 469 | + ...currentKindergarten, | ||
| 470 | + family_name: currentKindergarten.name, | ||
| 471 | + avatar_url: currentKindergarten.logo, | ||
| 472 | + step: currentKindergarten.total_steps, | ||
| 473 | + created_by_nickname: `${currentKindergarten.family_count}个家庭`, | ||
| 474 | + isNotRanked: !currentKindergarten.rank || currentKindergarten.rank === 0 || currentKindergarten.rank > 100 | ||
| 475 | + } | ||
| 476 | + } | ||
| 477 | + | ||
| 478 | + // 家庭排行榜我的排名信息 | ||
| 338 | if (!leaderboardData.value || !leaderboardData.value.current_family) { | 479 | if (!leaderboardData.value || !leaderboardData.value.current_family) { |
| 339 | return null | 480 | return null |
| 340 | } | 481 | } | ... | ... |
-
Please register or login to post a comment