hookehuyr

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

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