diff --git a/package1/components/planet/planet-header.vue b/package1/components/planet/planet-header.vue index 5e3314f..316777e 100644 --- a/package1/components/planet/planet-header.vue +++ b/package1/components/planet/planet-header.vue @@ -56,7 +56,7 @@ 得现金奖励 - + {{poolText}} @@ -92,12 +92,17 @@ data() { return { remain: 0, - timer: null + timer: null, + poolTimer: null, + poolBongTimer: null, + displayPoolAmount: 0, + lastPoolAmount: 0, + poolBong: false } }, computed: { poolText() { - const v = Number(this.data.poolAmount || 0) + const v = Number(this.displayPoolAmount || 0) return v.toFixed(2) }, rankText() { @@ -121,14 +126,19 @@ 'data.countdownMillis'(val) { this.remain = val || 0 this.startTimer() + }, + 'data.poolAmount'(val) { + this.animatePool(Number(val || 0)) } }, mounted() { this.remain = this.data.countdownMillis || 0 + this.animatePool(Number(this.data.poolAmount || 0), true) this.startTimer() }, beforeDestroy() { if (this.timer) clearInterval(this.timer) + this.clearPoolTimers() }, methods: { goTicketLog() { @@ -156,6 +166,47 @@ } this.remain -= 1000 }, 1000) + }, + clearPoolTimers() { + if (this.poolTimer) clearInterval(this.poolTimer) + if (this.poolBongTimer) clearTimeout(this.poolBongTimer) + this.poolTimer = null + this.poolBongTimer = null + }, + animatePool(target, initial) { + target = Number(target || 0) + this.clearPoolTimers() + this.poolBong = false + const start = initial ? 0 : Number(this.displayPoolAmount || 0) + const diff = target - start + this.lastPoolAmount = target + if (Math.abs(diff) < 0.01) { + this.displayPoolAmount = target + this.playPoolBong() + return + } + const duration = initial ? 1500 : 900 + const startTime = Date.now() + this.displayPoolAmount = start + this.poolTimer = setInterval(() => { + const progress = Math.min(1, (Date.now() - startTime) / duration) + const eased = 1 - Math.pow(1 - progress, 3) + this.displayPoolAmount = start + diff * eased + if (progress >= 1) { + clearInterval(this.poolTimer) + this.poolTimer = null + this.displayPoolAmount = target + this.playPoolBong() + } + }, 30) + }, + playPoolBong() { + this.poolBong = true + if (this.poolBongTimer) clearTimeout(this.poolBongTimer) + this.poolBongTimer = setTimeout(() => { + this.poolBong = false + this.poolBongTimer = null + }, 520) } } } @@ -548,20 +599,82 @@ .ph-pool { position: relative; text-align: center; - margin-top: 8rpx; - color: #16A779; + margin-top: 10rpx; + padding: 4rpx 22rpx 10rpx; + color: #FFF7B8; + border-radius: 999rpx; + background: + radial-gradient(circle at 50% 0%, rgba(255,255,255,0.68), transparent 34%), + linear-gradient(135deg, rgba(255,214,92,0.28), rgba(255,122,89,0.1)); + text-shadow: + 0 2rpx 0 #8A4A00, + 0 8rpx 20rpx rgba(255,145,35,0.48), + 0 0 34rpx rgba(255,224,138,0.8); + filter: drop-shadow(0 12rpx 24rpx rgba(255,145,35,0.26)); + overflow: hidden; + transform-origin: center center; + } + + .ph-pool::before { + content: ''; + position: absolute; + left: -80rpx; + top: 0; + width: 56rpx; + height: 100%; + background: linear-gradient(90deg, rgba(255,255,255,0), rgba(255,255,255,0.92), rgba(255,255,255,0)); + transform: skewX(-18deg); + animation: poolShine 1.8s ease-in-out infinite; + } + + .ph-pool::after { + content: ''; + position: absolute; + left: 24rpx; + right: 24rpx; + bottom: 6rpx; + height: 10rpx; + border-radius: 999rpx; + background: radial-gradient(circle, rgba(255,184,77,0.78), rgba(255,184,77,0)); + filter: blur(4rpx); + } + + .ph-pool.bong { + animation: poolBong .52s cubic-bezier(.2, 1.65, .32, 1); + } + + @keyframes poolShine { + 0% { transform: translateX(0) skewX(-18deg); opacity: 0; } + 24% { opacity: .95; } + 58% { opacity: .78; } + 100% { transform: translateX(410rpx) skewX(-18deg); opacity: 0; } + } + + @keyframes poolBong { + 0% { transform: scale(1); } + 42% { transform: scale(1.22) rotate(-2deg); } + 68% { transform: scale(.95) rotate(1deg); } + 100% { transform: scale(1) rotate(0); } } .ph-pool-symbol { - font-size: 38rpx; + position: relative; + z-index: 1; + font-size: 42rpx; font-weight: 900; + color: #FFE08A; } .ph-pool-num { - font-size: 92rpx; + position: relative; + z-index: 1; + font-size: 98rpx; font-weight: 900; font-family: DIN, sans-serif; letter-spacing: -2rpx; + background: linear-gradient(180deg, #FFFFFF 0%, #FFF4A8 34%, #FFB52F 76%, #F77719 100%); + -webkit-background-clip: text; + color: transparent; } .ph-pool-label { diff --git a/package1/planet/rank.vue b/package1/planet/rank.vue index 1c63338..c5e9569 100644 --- a/package1/planet/rank.vue +++ b/package1/planet/rank.vue @@ -31,13 +31,67 @@ WEALTH COORDINATES 财富坐标榜 - 已加载 {{pageNum}} / {{totalPages}} 页 - + + + + + TOP HUNTERS ARE WATCHING + 前三领奖台 + + 抢榜越高 · 越容易被盯上 + + + 每日 21:30 按校区分别结算,有券前 5 名瓜分星球券 + + 第1名 +5 + 第2名 +4 + 第3名 +3 + 第4名 +2 + 第5名 +1 + + + + + 2 + + {{podiumName(podiumSecond)}} + {{podiumSecond.ticketCount || 0}}券 + 第二名 + + + 1 + + + {{podiumName(podiumFirst)}} + {{podiumFirst.ticketCount || 0}}券 + 第一名 + + + 3 + + {{podiumName(podiumThird)}} + {{podiumThird.ticketCount || 0}}券 + 第三名 + + + 点领奖台头像即可发起追查,今天还剩 {{home.remainHunt || 0}} 次机会 + + + #{{item._displayRankNo}} @@ -60,7 +114,7 @@ - 暂无上榜居民,攒券登顶成为今日主角 + 暂无上榜居民,攒券登顶成为今日主角 {{loadMoreText}} @@ -128,6 +182,28 @@ pagedList() { return this.rankList }, + podiumList() { + return this.rankList.filter((item) => item._displayRankNo >= 1 && item._displayRankNo <= 3) + }, + podiumMap() { + const map = {} + this.podiumList.forEach((item) => { + map[item._displayRankNo] = item + }) + return map + }, + podiumFirst() { + return this.podiumMap[1] + }, + podiumSecond() { + return this.podiumMap[2] + }, + podiumThird() { + return this.podiumMap[3] + }, + normalList() { + return this.rankList.filter((item) => item._displayRankNo > 3) + }, loadMoreText() { if (this.listLoading) return '正在加载更多坐标...' if (this.noMore) return '没有更多财富坐标了' @@ -210,6 +286,11 @@ if ((this.home.remainHunt || 0) <= 0) return '次数用完' return '发起追查' }, + podiumName(item) { + if (!item) return '神秘同学' + if (item.stealth) return '隐身侠' + return item.nickname || '神秘同学' + }, onHunt(item) { if (item.self) { this.tui.toast('不能追捕自己') @@ -299,6 +380,40 @@ .rank-head { margin-top: 30rpx; display: flex; align-items: flex-end; justify-content: space-between; } .rank-title { margin-top: 6rpx; color: #12342F; font-size: 40rpx; font-weight: 900; } .rank-page-no { color: #6B817D; font-size: 23rpx; font-weight: 800; } + .podium-card { position: relative; margin-top: 22rpx; padding: 30rpx 24rpx 26rpx; border-radius: 46rpx; background: radial-gradient(circle at 50% 8%, rgba(255,184,77,0.42), transparent 36%), linear-gradient(155deg, rgba(30,27,75,0.94), rgba(36,58,84,0.9) 48%, rgba(18,52,47,0.88)); border: 2rpx solid rgba(255,255,255,0.24); box-shadow: 0 30rpx 72rpx rgba(30,27,75,0.24); overflow: hidden; } + .podium-bg-glow { position: absolute; left: 50%; top: -170rpx; width: 620rpx; height: 620rpx; transform: translateX(-50%); border-radius: 50%; background: radial-gradient(circle, rgba(255,214,92,0.38), rgba(255,122,89,0.12) 42%, transparent 68%); animation: podiumPulse 2.4s ease-in-out infinite; } + @keyframes podiumPulse { 0%,100%{ opacity:.58; transform: translateX(-50%) scale(.92); } 50%{ opacity:1; transform: translateX(-50%) scale(1.06); } } + .podium-head { position: relative; z-index: 1; display: flex; justify-content: space-between; gap: 16rpx; align-items: flex-start; } + .podium-kicker { color: rgba(255,214,92,0.86); font-size: 17rpx; font-weight: 900; letter-spacing: 2rpx; } + .podium-title { margin-top: 6rpx; color: #FFFFFF; font-size: 40rpx; font-weight: 900; text-shadow: 0 8rpx 20rpx rgba(0,0,0,0.18); } + .podium-prize { max-width: 210rpx; padding: 10rpx 16rpx; border-radius: 999rpx; background: rgba(255,255,255,0.12); color: #FFE08A; font-size: 19rpx; font-weight: 900; line-height: 1.25; text-align: center; border: 1rpx solid rgba(255,255,255,0.18); } + .reward-rule { position: relative; z-index: 1; margin-top: 20rpx; padding: 18rpx; border-radius: 28rpx; background: linear-gradient(135deg, rgba(255,224,138,0.18), rgba(255,255,255,0.1)); border: 1rpx solid rgba(255,255,255,0.18); box-shadow: inset 0 1rpx 0 rgba(255,255,255,0.18); } + .reward-main { color: #FFF4B8; font-size: 23rpx; font-weight: 900; line-height: 1.35; } + .reward-chips { margin-top: 12rpx; display: flex; flex-wrap: wrap; gap: 10rpx; } + .reward-chips text { padding: 7rpx 12rpx; border-radius: 999rpx; background: rgba(255,255,255,0.16); color: rgba(255,255,255,0.92); font-size: 19rpx; font-weight: 900; } + .podium-stage { position: relative; z-index: 1; margin-top: 28rpx; height: 430rpx; display: flex; align-items: flex-end; justify-content: center; gap: 14rpx; } + .podium-player { position: relative; width: 200rpx; display: flex; flex-direction: column; align-items: center; transition: transform .18s ease; } + .podium-player:active { transform: scale(.96); } + .podium-player.first { width: 222rpx; margin-bottom: 28rpx; } + .podium-player.second { margin-bottom: 0; } + .podium-player.third { margin-bottom: -18rpx; } + .king-aura { position: absolute; top: 22rpx; width: 190rpx; height: 190rpx; border-radius: 50%; background: radial-gradient(circle, rgba(255,214,92,0.48), transparent 68%); animation: kingAura 1.8s ease-in-out infinite; } + @keyframes kingAura { 0%,100%{ transform: scale(.88); opacity:.66; } 50%{ transform: scale(1.08); opacity:1; } } + .crown { position: relative; z-index: 3; width: 62rpx; height: 50rpx; line-height: 50rpx; border-radius: 18rpx 18rpx 10rpx 10rpx; text-align: center; color: #4A2A00; font-size: 28rpx; font-weight: 900; box-shadow: 0 12rpx 24rpx rgba(0,0,0,0.2); transform: translateY(16rpx); } + .crown.gold { background: linear-gradient(145deg, #FFF7B8, #FFB84D); } + .crown.silver { background: linear-gradient(145deg, #FFFFFF, #BFD7FF); color: #28415F; } + .crown.bronze { background: linear-gradient(145deg, #FFE0B8, #C87A35); color: #4A2500; } + .podium-avatar { position: relative; z-index: 2; width: 112rpx; height: 112rpx; border-radius: 38rpx; border: 6rpx solid rgba(255,255,255,0.88); box-shadow: 0 18rpx 36rpx rgba(0,0,0,0.22); background: rgba(255,255,255,0.22); } + .podium-avatar.champion { width: 136rpx; height: 136rpx; border-radius: 46rpx; border-color: #FFE08A; box-shadow: 0 20rpx 46rpx rgba(255,184,77,0.36); animation: championFloat 2.1s ease-in-out infinite; } + @keyframes championFloat { 0%,100%{ transform: translateY(0); } 50%{ transform: translateY(-8rpx); } } + .podium-avatar.stealth { opacity: .62; filter: grayscale(100%); } + .podium-name { margin-top: 14rpx; max-width: 178rpx; color: #FFFFFF; font-size: 24rpx; font-weight: 900; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + .champion-name { font-size: 28rpx; color: #FFF4B8; } + .podium-ticket { margin-top: 8rpx; padding: 6rpx 14rpx; border-radius: 999rpx; background: rgba(255,255,255,0.14); color: rgba(255,255,255,0.88); font-size: 20rpx; font-weight: 900; } + .podium-ticket.hot { background: linear-gradient(135deg, #FF7A59, #FFB84D); color: #FFFFFF; box-shadow: 0 10rpx 24rpx rgba(255,122,89,0.3); } + .podium-base { margin-top: 16rpx; width: 170rpx; height: 92rpx; line-height: 92rpx; border-radius: 28rpx 28rpx 12rpx 12rpx; text-align: center; color: rgba(255,255,255,0.92); font-size: 24rpx; font-weight: 900; background: linear-gradient(180deg, rgba(255,255,255,0.18), rgba(255,255,255,0.07)); border: 1rpx solid rgba(255,255,255,0.16); } + .podium-base.king { width: 198rpx; height: 126rpx; line-height: 126rpx; color: #4A2A00; font-size: 28rpx; background: linear-gradient(180deg, #FFE08A, #FFB84D); border: 0; box-shadow: inset 0 10rpx 22rpx rgba(255,255,255,0.26), 0 18rpx 36rpx rgba(255,184,77,0.22); } + .podium-tip { position: relative; z-index: 1; margin-top: 16rpx; height: 58rpx; line-height: 58rpx; border-radius: 999rpx; background: rgba(255,255,255,0.12); color: #FFE08A; font-size: 22rpx; font-weight: 900; text-align: center; border: 1rpx solid rgba(255,255,255,0.16); } .rank-list { margin-top: 18rpx; } .rank-row { margin-top: 16rpx; padding: 22rpx; border-radius: 34rpx; background: rgba(255,255,255,0.82); border: 2rpx solid rgba(255,255,255,0.94); box-shadow: 0 16rpx 36rpx rgba(53,214,166,0.1); display: flex; align-items: center; } .rank-no { min-width: 70rpx; color: #22B889; font-size: 28rpx; font-weight: 900; } diff --git a/package1/planet/ticketLog.vue b/package1/planet/ticketLog.vue index 45f8d59..8c84b61 100644 --- a/package1/planet/ticketLog.vue +++ b/package1/planet/ticketLog.vue @@ -125,7 +125,7 @@ noMore: false, raiders: [], raiderPageNumber: 1, - raiderPageSize: 5, + raiderPageSize: 10, raiderTotal: 0, raiderLoading: false, raiderNoMore: false,