hookehuyr

feat(排行榜): 添加助力榜功能并替换点击事件为tap

实现助力榜功能,包括mock数据、显示逻辑和格式化方法
将click事件统一替换为tap事件以兼容移动端
...@@ -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.