feat(排行榜): 添加助力榜功能并替换点击事件为tap
实现助力榜功能,包括mock数据、显示逻辑和格式化方法 将click事件统一替换为tap事件以兼容移动端
Showing
3 changed files
with
130 additions
and
19 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 | } | ... | ... |
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment