wangfukang 3 days ago
parent
commit
fe9b6f9e0f
  1. 35
      package1/components/planet/planet-adventure-entry.vue
  2. 68
      package1/components/planet/planet-daily-loop.vue
  3. 576
      package1/components/planet/planet-header.vue
  4. 326
      package1/ieBrowser/index.vue
  5. 1069
      package1/planet/index.vue
  6. 7
      package1/planet/rank.vue

35
package1/components/planet/planet-adventure-entry.vue

@ -5,8 +5,14 @@
<view class="pa-left">
<view class="pa-kicker">COLLEGE ROCKET</view>
<view class="pa-title">学院排位赛</view>
<view class="pa-sub">个人前五得现金奖励</view>
<!-- <view class="pa-cta">开始排位</view> -->
<view class="pa-sub">每天21:30开奖 · 个人前五名发现金</view>
<view class="pa-reward">
<text>第1 ¥5</text>
<text>第2 ¥4</text>
<text>第3 ¥3</text>
<text>第4 ¥2</text>
<text>第5 ¥1</text>
</view>
</view>
<view class="pa-ship">
<view class="pa-squirrel">🚀</view>
@ -18,8 +24,12 @@
<view class="pa-left">
<view class="pa-kicker">COLLEGE ROCKET</view>
<view class="pa-title">组队PK赛</view>
<view class="pa-sub">不服看看谁才是PK王</view>
<!-- <view class="pa-cta">开始PK</view> -->
<view class="pa-sub">好友组队挑战胜出赢星球券</view>
<view class="pa-reward pk">
<text>赢券奖励</text>
<text>好友PK</text>
<text>冲榜加成</text>
</view>
</view>
<view class="pa-ship">
<view class="pa-squirrel">🚀</view>
@ -35,25 +45,28 @@
</script>
<style lang="scss" scoped>
.pa-row { margin-top: 22rpx; display: flex; gap: 16rpx; position: relative; z-index: 8; }
.pa { flex: 1; min-width: 0; min-height: 160rpx; padding: 24rpx 18rpx; border-radius: 34rpx; background: radial-gradient(circle at 92% 20%, rgba(255,184,77,0.36), transparent 32%), linear-gradient(135deg, rgba(255,255,255,0.96), rgba(232,246,255,0.78)); border: 3rpx solid rgba(255,184,77,0.58); box-shadow: 0 18rpx 42rpx rgba(255,156,66,0.16), inset 0 0 0 2rpx rgba(255,255,255,0.72); display: flex; justify-content: space-between; align-items: flex-end; overflow: hidden; position: relative; }
.pa-row { margin-top: 22rpx; display: flex; flex-direction: column; gap: 16rpx; position: relative; z-index: 8; }
.pa { width: 100%; min-height: 174rpx; padding: 26rpx 150rpx 24rpx 24rpx; box-sizing: border-box; border-radius: 34rpx; background: radial-gradient(circle at 92% 20%, rgba(255,184,77,0.36), transparent 32%), linear-gradient(135deg, rgba(255,255,255,0.96), rgba(232,246,255,0.78)); border: 3rpx solid rgba(255,184,77,0.58); box-shadow: 0 18rpx 42rpx rgba(255,156,66,0.16), inset 0 0 0 2rpx rgba(255,255,255,0.72); display: flex; justify-content: space-between; align-items: center; overflow: hidden; position: relative; }
.pa:before { content: ''; position: absolute; right: -60rpx; top: -80rpx; width: 300rpx; height: 300rpx; border-radius: 50%; background: radial-gradient(circle, rgba(255,184,77,0.38), transparent 66%); }
.pa:after { content: ''; position: absolute; left: 24rpx; right: 24rpx; bottom: 12rpx; height: 10rpx; border-radius: 999rpx; background: linear-gradient(90deg, rgba(255,156,66,0.24), rgba(79,183,255,0.18)); }
.pa-pk { background: radial-gradient(circle at 90% 18%, rgba(124,58,237,0.25), transparent 34%), radial-gradient(circle at 15% 100%, rgba(56,189,248,0.20), transparent 42%), linear-gradient(135deg, rgba(255,255,255,0.98), rgba(245,239,255,0.86) 48%, rgba(232,247,255,0.76)); border-color: rgba(124,58,237,0.38); box-shadow: 0 24rpx 56rpx rgba(124,58,237,0.14), inset 0 0 0 2rpx rgba(255,255,255,0.76); }
.pa-pk:before { background: radial-gradient(circle, rgba(124,58,237,0.30), transparent 66%); }
.pa-pk:after { background: linear-gradient(90deg, rgba(124,58,237,0.22), rgba(56,189,248,0.20)); }
.pa-left { position: relative; z-index: 1; padding-right: 8rpx; }
.pa-badge { position: absolute; right: 16rpx; top: 16rpx; z-index: 2; height: 38rpx; line-height: 38rpx; padding: 0 14rpx; border-radius: 999rpx; background: linear-gradient(135deg, #FF7A59, #FFB84D); color: #FFFFFF; font-size: 18rpx; font-weight: 900; box-shadow: 0 12rpx 24rpx rgba(255,122,89,0.2); }
.pa-badge { position: absolute; right: 22rpx; top: 20rpx; z-index: 2; height: 42rpx; line-height: 42rpx; padding: 0 18rpx; border-radius: 999rpx; background: linear-gradient(135deg, #FF7A59, #FFB84D); color: #FFFFFF; font-size: 20rpx; font-weight: 900; box-shadow: 0 12rpx 24rpx rgba(255,122,89,0.2); }
.pa-pk .pa-badge { background: linear-gradient(135deg, #7C3AED, #38BDF8); box-shadow: 0 12rpx 26rpx rgba(124,58,237,0.20); }
.pa-arena { position: absolute; right: 28rpx; top: 76rpx; z-index: 2; height: 48rpx; line-height: 48rpx; padding: 0 20rpx; border-radius: 999rpx; background: linear-gradient(135deg, #7C3AED, #38BDF8); color: #FFFFFF; font-size: 21rpx; font-weight: 900; box-shadow: 0 12rpx 28rpx rgba(124,58,237,0.22); }
.pa-kicker { color: #FF9C42; font-size: 17rpx; font-weight: 900; letter-spacing: 1rpx; }
.pa-pk .pa-kicker { color: #7C3AED; }
.pa-title { margin-top: 8rpx; color: #12342F; font-size: 31rpx; font-weight: 900; white-space: nowrap; }
.pa-sub { margin-top: 8rpx; color: #6B817D; font-size: 20rpx; line-height: 1.35; max-width: 200rpx; }
.pa-title { margin-top: 8rpx; color: #12342F; font-size: 34rpx; font-weight: 900; white-space: nowrap; }
.pa-sub { margin-top: 8rpx; color: #6B817D; font-size: 22rpx; line-height: 1.35; max-width: 430rpx; font-weight: 800; }
.pa-reward { margin-top: 14rpx; display: flex; flex-wrap: nowrap; gap: 6rpx; max-width: 430rpx; white-space: nowrap; overflow: hidden; }
.pa-reward text { flex-shrink: 0; padding: 7rpx 9rpx; border-radius: 999rpx; background: rgba(255,255,255,0.78); color: #FF7A00; font-size: 18rpx; font-weight: 900; box-shadow: inset 0 1rpx 0 rgba(255,255,255,0.92); }
.pa-reward.pk text { color: #7C3AED; }
.pa-cta { margin-top: 18rpx; display: inline-flex; align-items: center; justify-content: center; height: 54rpx; padding: 0 26rpx; border-radius: 999rpx; background: linear-gradient(135deg, #35D6A6, #4FB7FF); color: #FFFFFF; font-size: 23rpx; font-weight: 900; box-shadow: 0 12rpx 24rpx rgba(53,214,166,0.18); }
.pa-ship { position: absolute; right: 16rpx; bottom: 18rpx; z-index: 1; width: 82rpx; height: 62rpx; border-radius: 32rpx 32rpx 24rpx 24rpx; background: linear-gradient(145deg, #FFFFFF, #DDF8FF 50%, #FFE5AE); box-shadow: inset -12rpx -16rpx 28rpx rgba(79,183,255,0.14), 0 18rpx 42rpx rgba(255,156,66,0.18); flex-shrink: 0; opacity: .9; }
.pa-ship { position: absolute; right: 36rpx; bottom: 28rpx; z-index: 1; width: 96rpx; height: 72rpx; border-radius: 34rpx 34rpx 26rpx 26rpx; background: linear-gradient(145deg, #FFFFFF, #DDF8FF 50%, #FFE5AE); box-shadow: inset -12rpx -16rpx 28rpx rgba(79,183,255,0.14), 0 18rpx 42rpx rgba(255,156,66,0.18); flex-shrink: 0; opacity: .92; }
.pa-pk .pa-ship { background: linear-gradient(145deg, #FFFFFF, #EEE7FF 48%, #DDF8FF); box-shadow: inset -12rpx -16rpx 28rpx rgba(124,58,237,0.12), 0 18rpx 42rpx rgba(56,189,248,0.18); }
.pa-squirrel { position: absolute; left: 20rpx; top: 14rpx; width: 40rpx; height: 32rpx; line-height: 32rpx; border-radius: 999rpx; background: #8B5A2B; color: #fff; font-size: 18rpx; font-weight: 900; text-align: center; }
.pa-squirrel { position: absolute; left: 24rpx; top: 18rpx; width: 44rpx; height: 34rpx; line-height: 34rpx; border-radius: 999rpx; background: #8B5A2B; color: #fff; font-size: 20rpx; font-weight: 900; text-align: center; }
.pa-pk .pa-squirrel { background: #5B21B6; }
.pa-flame { position: absolute; right: -12rpx; top: 22rpx; width: 28rpx; height: 18rpx; border-radius: 50%; background: linear-gradient(90deg, #FFB84D, rgba(255,184,77,0)); }
.pa-pk .pa-flame { background: linear-gradient(90deg, #38BDF8, rgba(56,189,248,0)); }

68
package1/components/planet/planet-daily-loop.vue

@ -4,7 +4,11 @@
<view class="dl-copy">
<view class="dl-kicker">JOIN DAILY</view>
<view class="dl-title">{{progressTitle}}</view>
<view class="dl-sub">完成任务可获得星球券</view>
</view>
<view class="dl-squirrel" @tap="$emit('ticketlog')">
<image class="dl-squirrel-img" src="/static/images/img/loading.gif" mode="aspectFit"></image>
<view class="dl-squirrel-tag">我的星球券 {{myTicketCount || 0}} </view>
</view>
</view>
@ -23,24 +27,29 @@
</view> -->
<view
id="guide-pool"
class="main-task"
:class="{done: taskDone('pool')}"
:class="{done: taskDone('pool'), 'guide-focus-target': guideKey === 'pool'}"
@tap="onJoin">
<view class="main-copy">
<view class="main-icon"></view>
<view>
<view class="main-title">入星球</view>
<view class="main-desc">参与今晚奖金池瓜分</view>
<view class="main-title">点这里投券参与抽奖</view>
<view class="main-desc">投1张星球券参与今晚22:00现金池开奖</view>
</view>
</view>
<view class="main-status">{{taskDone('pool') ? '已参与' : '立即参与'}}</view>
<view class="main-boost">预计提升中奖 +{{boostText}}%</view>
<view class="main-status">{{taskDone('pool') ? '继续投券' : '立即投券'}}</view>
<view class="main-boost">点一次投1张券 · 预计提升中奖率 +{{boostText}}%</view>
</view>
<view class="dl-stat">
<view class="stat-card collected">
<text>{{data.todayCollectedTickets || 0}}</text>
<text>今日收券</text>
<view
id="guide-hunt"
class="stat-card collected"
:class="{'guide-focus-target': guideKey === 'hunt'}"
@tap.stop="$emit('rank')">
<text>{{rankText}}</text>
<text>财富排名</text>
</view>
<view class="stat-card pooled">
<text>{{data.myPoolTickets || 0}}</text>
@ -61,7 +70,9 @@
export default {
props: {
data: { type: Object, default: () => ({}) },
myTicketCount: { type: Number, default: 0 }
myTicketCount: { type: Number, default: 0 },
rankNo: { type: Number, default: 0 },
guideKey: { type: String, default: '' }
},
data() {
return {
@ -90,6 +101,9 @@
progressTitle() {
return this.taskDone('pool') ? '今日已参与奖金池' : '投入星球券瓜分奖金池'
},
rankText() {
return this.rankNo > 0 ? ('No.' + this.rankNo) : '未上榜'
},
boostText() {
const current = Number(this.data.myProbability || 0)
const suggested = Number(this.data.suggestedProbability || 0)
@ -130,19 +144,34 @@
this.flyTimer = setTimeout(() => {
this.flying = false
}, 940)
},
getGuideRect(key) {
const id = key === 'pool' ? '#guide-pool' : '#guide-hunt'
return new Promise(resolve => {
uni.createSelectorQuery()
.in(this)
.select(id)
.boundingClientRect(rect => {
resolve(rect || null)
})
.exec()
})
}
}
}
</script>
<style lang="scss" scoped>
.dl { margin-top: 18rpx; padding: 28rpx; border-radius: 44rpx; background: linear-gradient(155deg, rgba(255,255,255,0.92), rgba(239,255,249,0.78)); border: 2rpx solid rgba(255,255,255,0.92); box-shadow: 0 26rpx 60rpx rgba(53,214,166,0.14); overflow: visible; position: relative; }
.dl { margin-top: -18rpx; padding: 28rpx; border-radius: 44rpx; background: linear-gradient(155deg, rgba(255,255,255,0.92), rgba(239,255,249,0.78)); border: 2rpx solid rgba(255,255,255,0.92); box-shadow: 0 26rpx 60rpx rgba(53,214,166,0.14); overflow: visible; position: relative; }
.dl:before { content: ''; position: absolute; right: -90rpx; top: -120rpx; width: 320rpx; height: 320rpx; border-radius: 50%; background: radial-gradient(circle, rgba(79,183,255,0.26), transparent 68%); }
.dl-top { position: relative; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; gap: 16rpx; }
.dl-copy { min-width: 0; flex: 1; }
.dl-kicker { color: #59CBB5; font-size: 20rpx; font-weight: 900; letter-spacing: 2rpx; }
.dl-title { margin-top: 6rpx; color: #12342F; font-size: 42rpx; font-weight: 900; }
.dl-sub { margin-top: 8rpx; color: #6B817D; font-size: 24rpx; }
.dl-sub { margin-top: 8rpx; color: #6B817D; font-size: 20rpx; }
.dl-squirrel { position: relative; width: 142rpx; height: 126rpx; flex-shrink: 0; margin-top: -8rpx; }
.dl-squirrel-img { position: absolute; right: 36rpx; top: -10rpx; width: 112rpx; height: 112rpx; border-radius: 50%; background: rgba(255,255,255,0.5); border: 3rpx solid rgba(255,255,255,0.9); box-shadow: 0 16rpx 34rpx rgba(79,183,255,0.18); }
.dl-squirrel-tag { position: absolute; bottom: 0; right: 0; width: 190rpx; height: 36rpx; line-height: 36rpx; text-align: center; border-radius: 999rpx; background: rgba(255,255,255,0.82); color: #35D6A6; font-size: 19rpx; font-weight: 900; border: 1rpx solid rgba(255,255,255,0.92); box-shadow: 0 10rpx 22rpx rgba(53,214,166,0.12); }
.progress-overview { position: relative; z-index: 1; margin-top: 20rpx; padding: 18rpx 20rpx; border-radius: 30rpx; background: rgba(255,255,255,0.54); border: 1px solid rgba(255,255,255,.7); box-shadow: inset 0 1rpx 0 rgba(255,255,255,0.86); }
.progress-row { display: flex; justify-content: space-between; color: #42635E; font-size: 22rpx; font-weight: 900; }
.progress-row text:last-child { color: #22B889; font-family: DIN, Arial, sans-serif; }
@ -150,16 +179,16 @@
.progress-fill { height: 100%; border-radius: inherit; background: linear-gradient(90deg, #34D399, #60A5FA); box-shadow: 0 0 20rpx rgba(52,211,153,0.28); transition: width .2s ease; }
.dl-events { margin-top: 18rpx; }
.dl-event { margin-top: 10rpx; padding: 14rpx 18rpx; border-radius: 24rpx; background: rgba(255,255,255,0.62); color: #42635E; font-size: 24rpx; }
.main-task { position: relative; z-index: 1; margin-top: 22rpx; height: 170rpx; padding: 24rpx 154rpx 24rpx 24rpx; box-sizing: border-box; border-radius: 32rpx; background: linear-gradient(135deg, #FFF7EC, #FFE7C8); border: 1px solid rgba(255,255,255,.78); box-shadow: 0 20rpx 42rpx rgba(255,184,107,0.18), inset 0 1rpx 0 rgba(255,255,255,0.9); overflow: hidden; transition: transform .2s ease; }
.main-task { position: relative; z-index: 1; margin-top: 22rpx; height: 182rpx; padding: 24rpx 168rpx 24rpx 24rpx; box-sizing: border-box; border-radius: 32rpx; background: linear-gradient(135deg, #FFF7EC, #FFE7C8); border: 3rpx solid rgba(255,184,77,0.34); box-shadow: 0 20rpx 42rpx rgba(255,184,107,0.22), inset 0 1rpx 0 rgba(255,255,255,0.9); overflow: hidden; transition: transform .2s ease; }
.main-task:active, .sub-task:active { transform: scale(.97); }
.main-task.done { filter: saturate(.82); box-shadow: 0 0 30rpx rgba(52,211,153,.25), 0 20rpx 42rpx rgba(255,184,107,0.12); }
.main-task:before { content: ''; position: absolute; right: -70rpx; top: -80rpx; width: 220rpx; height: 220rpx; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,0.72), transparent 66%); }
.main-copy { position: relative; z-index: 1; display: flex; align-items: center; }
.main-icon { position: relative; width: 54rpx; height: 54rpx; margin-right: 16rpx; flex-shrink: 0;font-size: 50rpx; margin-top: 16rpx;}
.main-title { color: #5C3310; font-size: 34rpx; font-weight: 900; white-space: nowrap; }
.main-desc { margin-top: 8rpx; color: #9B7043; font-size: 22rpx; font-weight: 800; white-space: nowrap; }
.main-status { position: absolute; right: 36rpx; top: 50%; z-index: 1; width: 92rpx; height: 92rpx; transform: translateY(-50%); display: flex; align-items: center; justify-content: center; border-radius: 24rpx; background: rgba(255,255,255,0.78); color: #F08322; font-size: 22rpx; font-weight: 900; box-shadow: 0 12rpx 26rpx rgba(240,131,34,0.14), inset 0 1rpx 0 rgba(255,255,255,0.92); }
.main-boost { position: absolute; left: 92rpx; bottom: 20rpx; z-index: 1; color: #C27724; font-size: 21rpx; font-weight: 900; }
.main-title { color: #5C3310; font-size: 31rpx; font-weight: 900; white-space: nowrap; }
.main-desc { margin-top: 8rpx; color: #9B7043; font-size: 21rpx; font-weight: 800; line-height: 30rpx; }
.main-status { position: absolute; right: 28rpx; top: 50%; z-index: 1; width: 116rpx; height: 102rpx; transform: translateY(-50%); display: flex; align-items: center; justify-content: center; border-radius: 28rpx; background: #FFFFFF; color: #F08322; font-size: 24rpx; font-weight: 900; box-shadow: 0 14rpx 30rpx rgba(240,131,34,0.18), inset 0 1rpx 0 rgba(255,255,255,0.92); }
.main-boost { position: absolute; left: 92rpx; bottom: 20rpx; z-index: 1; color: #C27724; font-size: 20rpx; font-weight: 900; }
.main-hand { position: absolute; right: 76rpx; top: 80rpx; z-index: 1; width: 82rpx; height: 46rpx; line-height: 46rpx; border-radius: 999rpx; text-align: center;font-size: 44rpx; font-weight: 900; box-shadow: 0 10rpx 22rpx rgba(240,131,34,0.16); }
.sub-task-list { position: relative; z-index: 1; margin-top: 16rpx; display: flex; gap: 14rpx; }
.sub-task { position: relative; flex: 1; height: 148rpx; box-sizing: border-box; padding: 16rpx; border-radius: 30rpx; background: rgba(255,255,255,0.58); backdrop-filter: blur(20px); border: 1px solid rgba(255,255,255,.72); box-shadow: 0 14rpx 30rpx rgba(53,214,166,0.1), inset 0 1rpx 0 rgba(255,255,255,0.84); overflow: hidden; transition: transform .2s ease; }
@ -185,6 +214,11 @@
.stat-card.collected text:first-child { color: #22B889; }
.stat-card.pooled text:first-child { color: #4FB7FF; }
.stat-card.probability text:first-child { color: #F08322; }
.guide-focus-target { position: relative; z-index: 92; border-radius: 32rpx; box-shadow: 0 0 0 6rpx rgba(255,255,255,0.95), 0 0 0 14rpx rgba(53,214,166,0.34), 0 24rpx 70rpx rgba(18,52,47,0.26); }
@keyframes guidePulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.015); }
}
.reward-float { position: absolute; left: 50%; bottom: 160rpx; z-index: 30; transform: translateX(-50%); padding: 10rpx 20rpx; border-radius: 999rpx; background: rgba(255,255,255,0.9); color: #16A779; font-size: 24rpx; font-weight: 900; box-shadow: 0 14rpx 30rpx rgba(53,214,166,0.18); animation: rewardUp .8s ease-out forwards; pointer-events: none; }
.reward-float.pool { color: #F08322; }
.reward-float.hunt { color: #348FEA; }

576
package1/components/planet/planet-header.vue

@ -3,23 +3,18 @@
<view class="ph-story">
<text class="ph-kicker">BANJINGLI ORBIT</text>
<view class="ph-title-row">
<text class="ph-title">Hello白嫖居民</text>
<text class="ph-title">Hello 白嫖居民</text>
<view class="ph-actions">
<text class="ph-action" @tap="goPoolRule">奖池规则</text>
<text class="ph-action ph-action-main" @tap="goDraw">开奖记录</text>
</view>
</view>
<text class="ph-sub">攒券追捕开盲盒全校一起瓜分补给池</text>
<!-- <text class="ph-sub ph-sub-hot">每天22:00开奖中现金</text>
<text class="ph-sub ph-sub-hot">每天21:30学院赛发奖金奖励</text> -->
</view>
<view class="ph-meteor ph-meteor-a"></view>
<view class="ph-meteor ph-meteor-b"></view>
<view class="ph-station">
<view class="ph-station-core"></view>
<view class="ph-station-wing ph-station-wing-left"></view>
<view class="ph-station-wing ph-station-wing-right"></view>
</view>
<view class="ph-asteroid ph-asteroid-a"></view>
<view class="ph-asteroid ph-asteroid-b"></view>
<view class="ph-floating-box" @tap="goGuide">
<view class="ph-floating-box-lid"></view>
<text>白嫖说明书</text>
@ -55,29 +50,15 @@
<text>S</text>
</view>
</view>
<view class="ph-core-label">现金奖池</view>
<view class="ph-core-label ph-sub-hot">22:00开奖得现金</view>
<view class="ph-pool" :class="{bong: poolBong}">
<text class="ph-pool-symbol"></text>
<text class="ph-pool-num">{{poolText}}</text>
</view>
<view class="ph-pool-label">星球券越多瓜分概率越高</view>
<view class="ph-pool-label"> </view>
</view>
</view>
<view class="ph-squirrel" @tap="goTicketLog">
<image class="ph-squirrel-img" src="/static/images/img/loading.gif" mode="aspectFit"></image>
<view class="ph-squirrel-tag">我的星球券 {{data.myTicketCount || 0}} </view>
</view>
<view class="ph-satellite ph-satellite-left" @tap="goPoolRule">
<text class="ph-satellite-num">规则</text>
<text class="ph-satellite-label">奖池规则</text>
</view>
<view class="ph-satellite ph-satellite-right" @tap="goRank">
<text class="ph-satellite-num">{{rankText}}</text>
<text class="ph-satellite-label">财富排名</text>
</view>
<!-- <view class="ph-ticket-pill">我的星球券 {{data.myTicketCount || 0}} </view> -->
</view>
</template>
@ -101,6 +82,9 @@
}
},
computed: {
loop() {
return (this.data && this.data.dailyLoop) || {}
},
poolText() {
const v = Number(this.displayPoolAmount || 0)
return v.toFixed(2)
@ -120,6 +104,16 @@
m: this.pad(m),
s: this.pad(s)
}
},
poolTicketText() {
return this.loop.myPoolTickets || this.loop.myWeightTickets || 0
},
probabilityText() {
const value = this.loop.myProbability
return (value === undefined || value === null || value === '') ? '0%' : (value + '%')
},
joinCount() {
return this.data.joinCount || this.loop.joinCount || 0
}
},
watch: {
@ -141,9 +135,6 @@
this.clearPoolTimers()
},
methods: {
goTicketLog() {
this.$emit('ticketlog')
},
goDraw() {
this.$emit('draw')
},
@ -156,6 +147,9 @@
goRank() {
this.$emit('rank')
},
onJoin() {
this.$emit('join')
},
pad(n) {
return n < 10 ? ('0' + n) : ('' + n)
},
@ -216,6 +210,313 @@
</script>
<style lang="scss" scoped>
.ph {
position: relative;
margin-top: 8rpx;
}
.ph-topline {
display: flex;
gap: 10rpx;
flex-wrap: wrap;
}
.ph-topline text {
padding: 9rpx 16rpx;
border-radius: 999rpx;
background: rgba(255,255,255,0.72);
color: #13564C;
font-size: 22rpx;
font-weight: 900;
box-shadow: 0 8rpx 20rpx rgba(53,214,166,0.09);
}
.ph-direct {
margin-top: 12rpx;
padding: 18rpx 20rpx;
border-radius: 26rpx;
background: rgba(18,52,47,0.86);
color: #FFFFFF;
font-size: 26rpx;
font-weight: 900;
text-align: center;
box-shadow: 0 16rpx 34rpx rgba(18,52,47,0.16);
}
.ph-hero {
position: relative;
margin-top: 16rpx;
padding: 30rpx 26rpx 26rpx;
border-radius: 44rpx;
background:
radial-gradient(circle at 50% 8%, rgba(255,255,255,0.72), transparent 28%),
radial-gradient(circle at 95% 0%, rgba(255,184,77,0.24), transparent 34%),
linear-gradient(160deg, #FFFFFF 0%, #FFF6D8 48%, #E8FFF4 100%);
border: 3rpx solid rgba(255,255,255,0.94);
box-shadow: 0 28rpx 70rpx rgba(255,138,0,0.16), 0 18rpx 44rpx rgba(53,214,166,0.12);
overflow: hidden;
}
.ph-hero:before {
content: '';
position: absolute;
right: -120rpx;
top: -120rpx;
width: 330rpx;
height: 330rpx;
border-radius: 50%;
background: radial-gradient(circle, rgba(255,184,77,0.28), transparent 68%);
}
.ph-hero-head {
position: relative;
z-index: 1;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 18rpx;
}
.ph-kicker {
color: #FF8A00;
font-size: 20rpx;
font-weight: 900;
letter-spacing: 3rpx;
}
.ph-title {
margin-top: 8rpx;
color: #12342F;
font-size: 40rpx;
font-weight: 900;
letter-spacing: -1rpx;
line-height: 1.18;
}
.ph-record {
flex-shrink: 0;
padding: 12rpx 18rpx;
border-radius: 999rpx;
background: rgba(255,255,255,0.78);
color: #815000;
font-size: 22rpx;
font-weight: 900;
border: 2rpx solid rgba(255,226,128,0.72);
}
.ph-pool {
position: relative;
text-align: center;
z-index: 1;
margin-top: 24rpx;
padding: 12rpx 24rpx 18rpx;
color: #FF8A00;
border-radius: 38rpx;
background:
radial-gradient(circle at 28% 18%, rgba(255,255,255,0.98), rgba(255,255,255,0.38) 34%, transparent 56%),
linear-gradient(145deg, rgba(255,255,255,0.88), rgba(255,246,205,0.72));
border: 2rpx solid rgba(255,226,128,0.82);
box-shadow:
inset 0 0 0 2rpx rgba(255,255,255,0.72),
0 12rpx 28rpx rgba(255,184,77,0.18);
text-shadow:
0 2rpx 0 rgba(255,255,255,0.9),
0 8rpx 16rpx rgba(255,138,0,0.22);
overflow: hidden;
transform-origin: center center;
}
.ph-pool::before {
content: '';
position: absolute;
left: -80rpx;
top: 0;
width: 64rpx;
height: 100%;
background: linear-gradient(90deg, rgba(255,255,255,0), rgba(255,255,255,0.95), rgba(255,255,255,0));
transform: skewX(-18deg);
animation: poolShine 2.1s ease-in-out infinite;
}
.ph-pool::after {
content: '';
position: absolute;
left: 24rpx;
right: 24rpx;
bottom: 6rpx;
height: 8rpx;
border-radius: 999rpx;
background: linear-gradient(90deg, rgba(255,184,77,0), rgba(255,184,77,0.36), rgba(255,184,77,0));
}
.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 {
position: relative;
z-index: 1;
font-size: 42rpx;
font-weight: 900;
color: #FFB000;
vertical-align: 16rpx;
}
.ph-pool-num {
position: relative;
z-index: 1;
font-size: 96rpx;
font-weight: 900;
font-family: DIN, sans-serif;
letter-spacing: -2rpx;
color: #FF8A00;
text-shadow:
0 3rpx 0 #FFF2B7,
0 10rpx 18rpx rgba(255,122,0,0.24);
}
.ph-count {
position: relative;
z-index: 1;
margin-top: 18rpx;
display: flex;
align-items: center;
justify-content: center;
padding: 12rpx;
border-radius: 999rpx;
background: rgba(255,255,255,0.72);
border: 1rpx solid rgba(255,255,255,0.82);
box-shadow: 0 10rpx 24rpx rgba(79,183,255,0.1);
}
.ph-period {
position: relative;
text-align: center;
color: #42635E;
font-size: 24rpx;
font-weight: 900;
margin-right: 12rpx;
}
.ph-count-unit {
width: 58rpx;
height: 58rpx;
margin-left: 8rpx;
border-radius: 18rpx;
background: linear-gradient(145deg, #F8FFFB, #E1F8FF);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-shadow: inset 0 0 0 1rpx rgba(255,255,255,0.72);
}
.ph-count-unit text:first-child {
color: #12342F;
font-size: 26rpx;
font-weight: 900;
line-height: 26rpx;
font-family: DIN, Arial, sans-serif;
}
.ph-count-unit text:last-child {
color: #7E9691;
font-size: 16rpx;
font-weight: 700;
line-height: 20rpx;
}
.ph-stats {
position: relative;
z-index: 1;
margin-top: 18rpx;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12rpx;
}
.ph-stat {
min-height: 96rpx;
padding: 16rpx 10rpx;
box-sizing: border-box;
border-radius: 26rpx;
background: rgba(255,255,255,0.78);
border: 2rpx solid rgba(255,255,255,0.92);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.ph-stat text:first-child {
color: #12342F;
font-size: 30rpx;
font-weight: 900;
font-family: DIN, Arial, sans-serif;
white-space: nowrap;
}
.ph-stat text:last-child {
margin-top: 5rpx;
color: #7E9691;
font-size: 20rpx;
font-weight: 800;
}
.ph-main-btn {
position: relative;
z-index: 1;
margin-top: 24rpx;
height: 104rpx;
line-height: 104rpx;
border-radius: 999rpx;
text-align: center;
background: linear-gradient(135deg, #FF7A00, #FFB84D);
color: #FFFFFF;
font-size: 34rpx;
font-weight: 900;
box-shadow: 0 20rpx 42rpx rgba(255,122,0,0.3);
border: 3rpx solid rgba(255,255,255,0.82);
}
.ph-main-btn:active {
transform: scale(.98);
}
.ph-minor-row {
position: relative;
z-index: 1;
margin-top: 18rpx;
display: flex;
align-items: center;
justify-content: center;
gap: 18rpx;
}
.ph-minor-row text {
padding: 8rpx 14rpx;
border-radius: 999rpx;
background: rgba(18,52,47,0.06);
color: #42635E;
font-size: 20rpx;
font-weight: 800;
}
/* Keep the original planet hero visual language; the copy above only changes hierarchy. */
.ph {
position: relative;
margin-top: 6rpx;
@ -290,6 +591,13 @@
font-weight: 600;
}
.ph-sub-hot {
margin-top: 6rpx;
color: #FF8A00;
font-size: 22rpx;
font-weight: 900;
}
.ph-meteor {
position: absolute;
width: 180rpx;
@ -314,94 +622,9 @@
opacity: 0.72;
}
@keyframes meteorFly {
0% { transform: translate3d(180rpx, -70rpx, 0) rotate(-28deg); opacity: 0; }
12% { opacity: 1; }
70% { opacity: 1; }
100% { transform: translate3d(-760rpx, 260rpx, 0) rotate(-28deg); opacity: 0; }
}
.ph-station {
position: absolute;
right: 30rpx;
top: 132rpx;
width: 132rpx;
height: 60rpx;
z-index: 4;
}
@keyframes stationFloat {
0%, 100% { transform: translateY(0) rotate(4deg); }
50% { transform: translateY(-16rpx) rotate(-2deg); }
}
.ph-station-core {
position: absolute;
left: 44rpx;
top: 16rpx;
width: 44rpx;
height: 30rpx;
border-radius: 16rpx;
background: linear-gradient(145deg, rgba(255,255,255,0.96), rgba(224,247,255,0.88));
border: 2rpx solid rgba(79,183,255,0.28);
box-shadow: 0 14rpx 28rpx rgba(79,183,255,0.18);
}
.ph-station-core:after {
content: '';
position: absolute;
left: 16rpx;
top: 8rpx;
width: 12rpx;
height: 12rpx;
border-radius: 50%;
background: rgba(143,124,255,0.7);
box-shadow: 0 0 12rpx rgba(79,183,255,0.45);
}
.ph-station-wing {
position: absolute;
top: 24rpx;
width: 42rpx;
height: 14rpx;
border-radius: 999rpx;
background: linear-gradient(90deg, rgba(143,124,255,0.76), rgba(79,183,255,0.72));
}
.ph-station-wing-left { left: 4rpx; }
.ph-station-wing-right { right: 4rpx; }
.ph-asteroid {
position: absolute;
border-radius: 46% 54% 44% 56%;
background: linear-gradient(145deg, #FFE6A6, #FFB7D1);
box-shadow: inset -10rpx -10rpx 20rpx rgba(150,93,48,0.12), 0 12rpx 30rpx rgba(255,184,77,0.18);
z-index: 3;
}
.ph-asteroid-a {
left: 18rpx;
top: 260rpx;
width: 62rpx;
height: 48rpx;
}
.ph-asteroid-b {
right: 86rpx;
top: 514rpx;
width: 42rpx;
height: 34rpx;
animation-delay: -2s;
}
@keyframes asteroidFloat {
0%, 100% { transform: translateY(0) rotate(0deg); }
50% { transform: translateY(18rpx) rotate(12deg); }
}
.ph-floating-box {
position: absolute;
left: 34rpx;
right: 30rpx;
top: 500rpx;
width: 116rpx;
height: 76rpx;
@ -421,16 +644,10 @@
position: absolute;
left: -7rpx;
top: -16rpx;
width: 138rpx;
width: 128rpx;
height: 32rpx;
border-radius: 18rpx;
background: linear-gradient(135deg, #FFFFFF, #FFD38C);
/* transform: rotate(-5deg); */
}
@keyframes treasureFloat {
0%, 100% { transform: translateY(0) rotate(-7deg); }
50% { transform: translateY(-18rpx) rotate(5deg); }
}
.ph-orbit {
@ -505,11 +722,6 @@
overflow: hidden;
}
@keyframes planetBreath {
0%, 100% { transform: translateX(-50%) translateY(0) scale(1); }
50% { transform: translateX(-50%) translateY(-14rpx) scale(1.02); }
}
.ph-planet-map {
position: absolute;
background: rgba(53,214,166,0.16);
@ -595,7 +807,7 @@
}
.ph-core-label {
color: #42635E;
color: #FF8A00;
font-size: 22rpx;
font-weight: 800;
letter-spacing: 2rpx;
@ -631,47 +843,6 @@
transform-origin: center center;
}
.ph-pool::before {
content: '';
position: absolute;
left: -80rpx;
top: 0;
width: 64rpx;
height: 100%;
background: linear-gradient(90deg, rgba(255,255,255,0), rgba(255,255,255,0.95), rgba(255,255,255,0));
transform: skewX(-18deg);
animation: poolShine 2.1s ease-in-out infinite;
}
.ph-pool::after {
content: '';
position: absolute;
left: 24rpx;
right: 24rpx;
bottom: 6rpx;
height: 8rpx;
border-radius: 999rpx;
background: linear-gradient(90deg, rgba(255,184,77,0), rgba(255,184,77,0.36), rgba(255,184,77,0));
}
.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 {
position: relative;
z-index: 1;
@ -701,21 +872,6 @@
font-size: 22rpx;
}
.ph-ticket-pill {
position: absolute;
left: 30rpx;
bottom: 86rpx;
z-index: 6;
padding: 12rpx 22rpx;
border-radius: 999rpx;
background: rgba(18,52,47,0.86);
border: 1rpx solid rgba(255,255,255,0.9);
color: #FFFFFF;
font-size: 23rpx;
font-weight: 900;
box-shadow: 0 16rpx 34rpx rgba(18,52,47,0.18);
}
.ph-count {
display: flex;
align-items: center;
@ -727,13 +883,6 @@
box-shadow: 0 10rpx 24rpx rgba(79,183,255,0.1);
}
.ph-count-label {
color: #42635E;
font-size: 24rpx;
font-weight: 700;
margin-right: 12rpx;
}
.ph-count-unit {
width: 52rpx;
height: 52rpx;
@ -789,11 +938,6 @@
animation-delay: -1.5s;
}
@keyframes orbitFloat {
0%, 100% { margin-top: 0; }
50% { margin-top: -12rpx; }
}
.ph-satellite-num {
color: #12342F;
font-size: 30rpx;
@ -811,46 +955,4 @@
font-weight: 600;
}
.ph-squirrel {
position: absolute;
right: 18rpx;
top: 470rpx;
width: 142rpx;
height: 164rpx;
z-index: 7;
}
@keyframes squirrelFloat {
0%, 100% { transform: translateY(0) rotate(6deg); }
50% { transform: translateY(-18rpx) rotate(-4deg); }
}
.ph-squirrel-img {
position: absolute;
right: 30rpx;
top: 0;
width: 142rpx;
height: 142rpx;
border-radius: 50%;
background: rgba(255,255,255,0.5);
border: 3rpx solid rgba(255,255,255,0.9);
box-shadow: 0 16rpx 34rpx rgba(79,183,255,0.18);
}
.ph-squirrel-tag {
position: absolute;
bottom: 0;
right:1rpx;
width: 200rpx;
height: 42rpx;
line-height: 42rpx;
text-align: center;
border-radius: 999rpx;
background: rgba(255,255,255,0.82);
color: #35D6A6;
font-size: 20rpx;
font-weight: 900;
border: 1rpx solid rgba(255,255,255,0.92);
box-shadow: 0 10rpx 22rpx rgba(53,214,166,0.12);
}
</style>

326
package1/ieBrowser/index.vue

@ -29,14 +29,17 @@
<text class="daily-live-text">{{ dailyQuestion.content }}</text>
<text class="daily-live-go">{{ dailyQuestion.answered ? '看答案' : '去回答' }} </text>
</view>
<view class="hero-profile" @tap="goUniverse">
<image class="profile-avatar-img" v-if="profile.avatarUrl" :src="profile.avatarUrl" mode="aspectFill"></image>
<view class="profile-avatar" v-else>{{ profile.avatarText || '' }}</view>
<view class="profile-meta">
<view class="profile-name">{{ profile.anonymousName || '半匿名漂流者' }}</view>
<view class="profile-tags">{{ profileTagsText }}</view>
<view class="hero-profile-line">
<view class="hero-profile" @tap="goUniverse">
<image class="profile-avatar-img" v-if="profile.avatarUrl" :src="profile.avatarUrl" mode="aspectFill"></image>
<view class="profile-avatar" v-else>{{ profile.avatarText || '' }}</view>
<view class="profile-meta">
<view class="profile-name">{{ profile.anonymousName || '半匿名漂流者' }}</view>
<view class="profile-tags">{{ profileTagsText }}</view>
</view>
<view class="profile-arrow"></view>
</view>
<view class="profile-arrow"></view>
<view class="say-intent-btn" @tap.stop="openCompanionEditor">我也说一句</view>
</view>
</view>
@ -92,7 +95,7 @@
<view class="planet-core">
<view class="planet-text">有人在等你</view>
<view class="planet-sub">{{ currentMode === 'i' ? '安静靠近' : '轻轻热闹' }}</view>
<view class="planet-cta">戳我 开始漂流 </view>
<view class="planet-cta" @tap.stop="goMatch" @click.stop="goMatch" @touchstart.stop @touchend.stop="goMatch">戳我 开始漂流 </view>
</view>
</view>
</view>
@ -151,6 +154,7 @@
{{ item.icon }} {{ item.label }}
</view>
</view>
<input class="target-input search-input" v-model="fuzzyKeyword" maxlength="24" placeholder="模糊搜索昵称/签名/找搭子内容" />
<view class="target-title gender-title">今天想遇见谁</view>
<view class="target-row">
<view class="target-chip" v-for="item in targetModes" :key="item.key"
@ -178,6 +182,23 @@
<ie-bottom-tab active="index" :unread-count="unreadCount"></ie-bottom-tab>
<view class="companion-mask" v-if="showCompanionEditor" :style="companionMaskStyle" @tap="closeCompanionEditor">
<view class="companion-editor" :style="companionEditorStyle" @tap.stop>
<view class="companion-editor-head">
<view>
<view class="companion-editor-title">我也说一句</view>
<view class="companion-editor-sub">写下你此刻想找什么搭子会展示在星系漂流里</view>
</view>
<view class="target-close" @tap="closeCompanionEditor">×</view>
</view>
<input class="target-input companion-input" v-model="editCompanionIntent" maxlength="24" :adjust-position="false"
placeholder="例如:想找散步搭子" @focus="onCompanionInputFocus" @blur="onCompanionInputBlur" />
<view class="companion-save" :class="{ disabled: savingCompanionIntent }" @tap="saveCompanionIntent">
{{ savingCompanionIntent ? '保存中...' : '发布一句' }}
</view>
</view>
</view>
<view class="match-mask" v-if="showMatch" @tap="closeMatch">
<view class="match-panel" @tap.stop>
<scroll-view scroll-y class="match-scroll">
@ -254,7 +275,7 @@
</template>
<script>
import { ieHome, getIeUnreadCount, updateIeStatus, startIeMatch, getIeDailyQuestion } from '@/common/ieApi.js'
import { ieHome, getIeUnreadCount, updateIeStatus, startIeMatch, matchIeProfile, getIeDailyQuestion, saveIeProfile } from '@/common/ieApi.js'
import IeBottomTab from '@/components/ie-bottom-tab/ie-bottom-tab.vue'
export default {
@ -280,7 +301,10 @@
countTimer: null,
showProfile: false,
showTargetPanel: false,
showCompanionEditor: false,
matching: false,
savingCompanionIntent: false,
keyboardHeight: 0,
profileReady: false,
profile: {},
lowPowerMode: false,
@ -288,6 +312,9 @@
targetGender: 'any',
matchScope: 'school',
matchIntent: '',
customCompanionIntent: '',
editCompanionIntent: '',
fuzzyKeyword: '',
intents: [
{ key: 'milktea', icon: '🧋', label: '奶茶搭子' },
{ key: 'meal', icon: '🍚', label: '吃饭搭子' },
@ -324,14 +351,15 @@
companions: {"i":[{"name":"树荫下的风","avatar":"风","state":"在校园里发呆","quote":"可以安静待 15 分钟,不用急着找话题。"},{"name":"耳机里的云","avatar":"云","state":"刚从教室出来","quote":"今天只想慢慢说两句。"}],"e":[{"name":"便利店灯光","avatar":"光","state":"想聊点不重要的","quote":"要不要交换一句今天最荒唐的小事?"},{"name":"操场散步员","avatar":"跑","state":"刚从操场回来","quote":"我可以负责开场,你负责随便接。"}]},
matchedPerson: {},
currentMatch: null,
driftMessages: [
presetDriftMessages: [
{ type: 'i', mood: 'quiet', text: '操场现在风很舒服' },
{ type: 'i', mood: 'listen', text: '有人在图书馆假装努力' },
{ type: 'e', mood: 'talk', text: '谁愿意陪我散步 10 分钟' },
{ type: 'i', mood: 'quiet', text: '刚刚有人有点低落' },
{ type: 'e', mood: 'talk', text: '想听一个不重要的故事' },
{ type: 'i', mood: 'drift', text: '走在路上突然有点空' }
]
],
driftMessages: []
}
},
computed: {
@ -367,7 +395,8 @@
},
danmuLanes() {
const lanes = [[], [], []]
this.driftMessages.forEach((item, index) => {
const source = this.driftMessages.length ? this.driftMessages : this.presetDriftMessages
source.forEach((item, index) => {
lanes[index % 3].push(item)
})
// Duplicate each lane so the marquee loops seamlessly.
@ -396,6 +425,13 @@
`transform: translate(-50%, -50%) translate(${x}rpx, ${y}rpx) scale(${scale})`
].join(';')
})
},
companionMaskStyle() {
const lift = this.keyboardHeight ? Math.max(this.keyboardHeight - 24, 0) : 0
return lift ? `padding-bottom: ${lift}px` : ''
},
companionEditorStyle() {
return this.keyboardHeight ? 'margin-bottom: 24rpx' : ''
}
},
onLoad() {
@ -577,6 +613,8 @@
return
}
this.profile = home.profile || {}
this.customCompanionIntent = this.profile.companionIntent || this.customCompanionIntent
this.editCompanionIntent = this.customCompanionIntent
this.profileReady = true
this.onlineCountBase = Number(home.onlineCount) || 0
this.awakeCount = this.randomAwakeCount(this.onlineCountBase)
@ -587,16 +625,31 @@
this.currentMood = home.currentMood || this.currentMood
this.targetMode = home.targetModePreference || this.targetMode
this.targetGender = home.targetGenderPreference || this.targetGender
if (home.hotStatuses && home.hotStatuses.length) {
this.driftMessages = home.hotStatuses.slice(0, 6).map((text, index) => ({
type: index % 2 === 0 ? 'i' : 'e',
mood: this.moods[index % this.moods.length].key,
text
}))
}
this.driftMessages = this.buildDriftMessages(home)
this.animateAwakeCount(this.awakeCount)
this.syncStatus()
},
buildDriftMessages(home = {}) {
const realItems = (home.companionIntents || []).filter(item => item && item.text).slice(0, 50).map((item, index) => ({
type: item.type || (index % 2 === 0 ? 'i' : 'e'),
mood: item.mood || this.moods[index % this.moods.length].key,
text: item.text,
userId: item.userId,
anonymousName: item.anonymousName || '',
avatarText: item.avatarText || '',
avatarUrl: item.avatarUrl || '',
isSelf: !!item.isSelf,
isUserIntent: true
}))
const fillTexts = (home.hotStatuses && home.hotStatuses.length ? home.hotStatuses : this.presetDriftMessages.map(item => item.text))
const fillItems = fillTexts.map((text, index) => ({
type: index % 2 === 0 ? 'i' : 'e',
mood: this.moods[index % this.moods.length].key,
text,
isUserIntent: false
}))
return realItems.concat(fillItems).slice(0, 50)
},
redirectBannedIe(message) {
if (this.ieBannedRedirecting) return
this.ieBannedRedirecting = true
@ -662,6 +715,7 @@
targetGender: this.targetGender,
matchScope: this.matchScope,
intent: this.matchIntent || '',
fuzzyKeyword: this.fuzzyKeyword.trim(),
mood: this.currentMood,
...areaInfo,
interestTags: [this.activeMood.label]
@ -671,23 +725,7 @@
uni.showToast({ title: (match && match.failReason) || '暂时没有同频的人', icon: 'none' })
return
}
this.currentMatch = match
this.matchedPerson = {
avatar: match.avatarText || '◌',
avatarUrl: match.avatarUrl || '',
name: match.anonymousName || '半匿名 漂流者',
mode: match.mode || this.currentMode,
mood: match.mood || 'quiet',
moodIcon: this.moodIcon(match.mood || 'quiet'),
moodText: this.moodText(match.mood || 'quiet'),
gender: match.gender || '',
regionName: match.regionName || '',
tags: match.interestTags || [],
personaImages: match.personaImages || [],
state: match.stateText || '也在等一句轻轻的回应',
quote: match.quoteText || '可以先安静待一会,不用急着找话题。',
lastActiveText: match.lastActiveText || ''
}
this.applyMatchResult(match)
// usedQuota
this.chancesLeft = Math.max(this.chancesLeft - 1, 0)
this.showMatch = true
@ -695,6 +733,25 @@
this.matching = false
}
},
applyMatchResult(match) {
this.currentMatch = match
this.matchedPerson = {
avatar: match.avatarText || '◌',
avatarUrl: match.avatarUrl || '',
name: match.anonymousName || '半匿名漂流者',
mode: match.mode || this.currentMode,
mood: match.mood || 'quiet',
moodIcon: this.moodIcon(match.mood || 'quiet'),
moodText: this.moodText(match.mood || 'quiet'),
gender: match.gender || '',
regionName: match.regionName || '',
tags: match.interestTags || [],
personaImages: match.personaImages || [],
state: match.stateText || '也在等一句轻轻的回应',
quote: match.companionIntent || match.quoteText || '可以先安静待一会,不用急着找话题。',
lastActiveText: match.lastActiveText || ''
}
},
modeText(mode) {
return mode === 'e' ? 'e 人' : 'i 人'
},
@ -733,12 +790,29 @@
this.playMoodCopy(this.activeMood.copy)
this.syncStatus()
},
selectDrift(item) {
this.currentMood = item.mood
this.currentMode = item.type
this.playMoodCopy(this.activeMood.copy)
this.syncStatus()
this.activeDriftText = this.activeDriftText === item.text ? '' : item.text
async selectDrift(item) {
if (item && item.isUserIntent && item.userId) {
if (item.isSelf) {
uni.showToast({ title: '这是你发布的内容,不能匹配自己', icon: 'none' })
return
}
await this.matchDriftUser(item)
}
},
async matchDriftUser(item) {
if (this.matching) return
this.matching = true
try {
const match = await matchIeProfile(item.userId)
if (!match || !match.roomId) {
uni.showToast({ title: (match && match.failReason) || '暂时不能发起聊天', icon: 'none' })
return
}
this.applyMatchResult(match)
this.showMatch = true
} finally {
this.matching = false
}
},
playMoodCopy(text) {
if (this.moodTypeTimer) {
@ -772,6 +846,48 @@
closeTargetPanel() {
this.showTargetPanel = false
},
openCompanionEditor() {
this.editCompanionIntent = this.customCompanionIntent || ''
this.showCompanionEditor = true
},
closeCompanionEditor() {
if (this.savingCompanionIntent) return
this.keyboardHeight = 0
this.showCompanionEditor = false
},
onCompanionInputFocus(event) {
const height = event && event.detail ? Number(event.detail.height) || 0 : 0
this.keyboardHeight = height
},
onCompanionInputBlur() {
this.keyboardHeight = 0
},
async saveCompanionIntent() {
if (this.savingCompanionIntent) return
const text = this.editCompanionIntent.trim()
if (!text) {
uni.showToast({ title: '先写一句想找什么搭子', icon: 'none' })
return
}
this.savingCompanionIntent = true
uni.showLoading({ title: '保存中...', mask: true })
try {
const saved = await saveIeProfile({
...this.profile,
companionIntent: text
})
if (!saved) return
this.profile = saved
this.customCompanionIntent = saved.companionIntent || text
this.editCompanionIntent = this.customCompanionIntent
this.showCompanionEditor = false
uni.showToast({ title: '已发布', icon: 'none' })
this.loadHome()
} finally {
this.savingCompanionIntent = false
uni.hideLoading()
}
},
closeProfile() {
this.showProfile = false
},
@ -811,9 +927,6 @@
endGalaxyDrag() {
if (!this.galaxyDragging) return
this.galaxyDragging = false
if (!this.galaxyMoved) {
this.goMatch()
}
},
skipMatch() {
this.showMatch = false
@ -1082,12 +1195,20 @@
font-size: 21rpx;
}
.hero-profile-line {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14rpx;
margin-top: 14rpx;
}
.hero-profile {
display: flex;
align-items: center;
width: fit-content;
max-width: 600rpx;
margin-top: 14rpx;
min-width: 0;
padding: 10rpx 22rpx 10rpx 10rpx;
border-radius: 999rpx;
background: rgba(255, 255, 255, .56);
@ -1096,6 +1217,25 @@
transition: transform .16s ease;
}
.say-intent-btn {
flex-shrink: 0;
height: 58rpx;
line-height: 58rpx;
padding: 0 22rpx;
border-radius: 999rpx;
color: #5b4fd6;
background: rgba(255, 255, 255, .62);
border: 1rpx solid rgba(255, 255, 255, .9);
box-shadow: 0 12rpx 30rpx rgba(96, 112, 160, .1);
font-size: 22rpx;
font-weight: 900;
}
.say-intent-btn:active {
transform: scale(.96);
background: rgba(169, 255, 231, .76);
}
.hero-profile:active {
transform: scale(.97);
}
@ -1761,13 +1901,13 @@
.target-mask {
position: fixed;
inset: 0;
z-index: 30;
z-index: 99;
display: flex;
align-items: flex-end;
padding: 32rpx 30rpx 136rpx;
padding: 32rpx 30rpx 158rpx;
box-sizing: border-box;
background: rgba(22, 27, 46, .18);
backdrop-filter: blur(16rpx);
background: rgba(22, 27, 46, .42);
backdrop-filter: blur(24rpx);
}
.target-popup {
@ -1776,7 +1916,7 @@
border-radius: 42rpx;
border: 1rpx solid rgba(255, 255, 255, .9);
background:
linear-gradient(135deg, rgba(255, 255, 255, .96), rgba(255, 255, 255, .8)),
linear-gradient(135deg, #ffffff, #f9fbff),
radial-gradient(circle at 82% 0%, rgba(169, 255, 231, .28), transparent 220rpx);
box-shadow: 0 34rpx 100rpx rgba(96, 112, 160, .22);
box-sizing: border-box;
@ -1830,6 +1970,90 @@
gap: 12rpx 0;
}
.target-input {
height: 68rpx;
margin-top: 16rpx;
padding: 0 24rpx;
border-radius: 999rpx;
color: #161b2e;
background: rgba(255, 255, 255, .72);
border: 1rpx solid rgba(255, 255, 255, .9);
box-shadow: inset 0 1rpx 0 rgba(255, 255, 255, .96);
font-size: 23rpx;
font-weight: 700;
}
.search-input {
margin-top: 12rpx;
background: rgba(239, 244, 255, .74);
}
.companion-mask {
position: fixed;
inset: 0;
z-index: 99;
display: flex;
align-items: flex-end;
padding: 0 32rpx 190rpx;
box-sizing: border-box;
background: rgba(22, 27, 46, .2);
backdrop-filter: blur(10rpx);
transition: padding-bottom .18s ease;
}
.companion-editor {
width: 100%;
padding: 34rpx 30rpx 30rpx;
border-radius: 42rpx;
border: 1rpx solid rgba(255, 255, 255, .9);
background: linear-gradient(135deg, rgba(255, 255, 255, .96), rgba(255, 255, 255, .84));
box-shadow: 0 34rpx 100rpx rgba(96, 112, 160, .22);
box-sizing: border-box;
animation: targetUp .18s ease-out both;
}
.companion-editor-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 24rpx;
margin-bottom: 12rpx;
}
.companion-editor-title {
color: #161b2e;
font-size: 34rpx;
font-weight: 900;
}
.companion-editor-sub {
margin-top: 8rpx;
color: rgba(22, 27, 46, .46);
font-size: 23rpx;
line-height: 34rpx;
}
.companion-input {
margin-top: 22rpx;
}
.companion-save {
height: 86rpx;
line-height: 86rpx;
margin-top: 22rpx;
border-radius: 999rpx;
text-align: center;
color: #11162a;
background: linear-gradient(135deg, #effffb, #a9ffe7 62%, #ffd6a5);
box-shadow: 0 18rpx 46rpx rgba(169, 255, 231, .3);
font-size: 28rpx;
font-weight: 900;
}
.companion-save.disabled {
opacity: .62;
}
.intent-chip.active {
color: #fff;
background: linear-gradient(135deg, #ff8a54, #ff5f8f);

1069
package1/planet/index.vue

File diff suppressed because it is too large

7
package1/planet/rank.vue

@ -37,6 +37,7 @@
<view class="rank-kicker">WEALTH COORDINATES</view>
<view class="rank-title">财富坐标榜</view>
</view>
<view class="steal-log-btn" @tap="goTicketLog">谁偷我券了</view>
</view>
<view v-if="podiumList.length" class="podium-card">
@ -365,6 +366,11 @@
uni.navigateTo({ url: '/package1/planet/index' })
}
})
},
goTicketLog() {
uni.navigateTo({
url: '/package1/planet/ticketLog'
})
}
}
}
@ -435,6 +441,7 @@
.radar-count text:last-child { font-size: 19rpx; font-weight: 800; margin-top: 4rpx; }
.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; }
.steal-log-btn { flex-shrink: 0; margin-bottom: 4rpx; padding: 12rpx 18rpx; border-radius: 999rpx; background: linear-gradient(135deg, #FF7A59, #FFB84D); color: #FFFFFF; font-size: 22rpx; font-weight: 900; box-shadow: 0 12rpx 24rpx rgba(255,122,89,0.18); }
.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; }

Loading…
Cancel
Save