wangfukang 1 week ago
parent
commit
06cffc0666
  1. 2
      package1/buyFood/buyFood.vue
  2. 59
      package1/components/planet/planet-box.vue
  3. 33
      package1/components/planet/planet-daily-loop.vue
  4. 9
      package1/components/planet/planet-header.vue
  5. 10
      package1/components/planet/planet-operate.vue
  6. 2
      package1/order/orderDetail.vue
  7. 341
      package1/planet/adventure.vue
  8. 212
      package1/planet/drawResult.vue
  9. 172
      package1/planet/index.vue
  10. 60
      package1/planet/more.vue
  11. 29
      package1/planet/pkHall.vue
  12. 75
      package1/planet/rank.vue
  13. 33
      package1/planet/ticketLog.vue
  14. 2
      package1/runErrand/runErrand.vue

2
package1/buyFood/buyFood.vue

@ -334,7 +334,7 @@
<view class="commission-popup-input"> <view class="commission-popup-input">
<text></text> <text></text>
<input type="digit" :value="commissionInputValue" placeholder="请输入佣金" <input type="digit" :value="commissionInputValue" placeholder="请输入佣金"
focus @input="onCommissionPopupInput" /> @input="onCommissionPopupInput" />
</view> </view>
<view class="commission-popup-actions"> <view class="commission-popup-actions">
<view class="commission-popup-cancel" @tap="$refs.commissionPopup.close()">取消</view> <view class="commission-popup-cancel" @tap="$refs.commissionPopup.close()">取消</view>

59
package1/components/planet/planet-box.vue

@ -183,70 +183,71 @@
.pb.compact { .pb.compact {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
min-height: 190rpx; min-height: 368rpx;
margin-top: 0; margin-top: 0;
padding: 22rpx 18rpx; padding: 28rpx 22rpx;
border-radius: 34rpx; border-radius: 34rpx;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
justify-content: space-between;
} }
.pb.compact .pb-tag { .pb.compact .pb-tag {
right: 18rpx; right: 18rpx;
top: 14rpx; top: 18rpx;
font-size: 15rpx; font-size: 17rpx;
} }
.pb.compact .pb-visual { .pb.compact .pb-visual {
width: 94rpx; width: 126rpx;
height: 94rpx; height: 126rpx;
} }
.pb.compact .pb-glow { .pb.compact .pb-glow {
width: 112rpx; width: 148rpx;
height: 112rpx; height: 148rpx;
} }
.pb.compact .pb-box { .pb.compact .pb-box {
width: 66rpx; width: 90rpx;
height: 68rpx; height: 92rpx;
border-radius: 18rpx; border-radius: 22rpx;
} }
.pb.compact .pb-box-lid { .pb.compact .pb-box-lid {
left: -6rpx; left: -8rpx;
top: -14rpx; top: -18rpx;
width: 78rpx; width: 106rpx;
height: 26rpx; height: 34rpx;
} }
.pb.compact .pb-box-face { .pb.compact .pb-box-face {
width: 32rpx; width: 42rpx;
height: 32rpx; height: 42rpx;
line-height: 32rpx; line-height: 42rpx;
font-size: 22rpx; font-size: 28rpx;
} }
.pb.compact .pb-mid { .pb.compact .pb-mid {
margin-left: 0; margin-left: 0;
margin-top: 10rpx; margin-top: 8rpx;
} }
.pb.compact .pb-title { .pb.compact .pb-title {
font-size: 27rpx; font-size: 31rpx;
} }
.pb.compact .pb-desc { .pb.compact .pb-desc {
font-size: 20rpx; font-size: 22rpx;
line-height: 28rpx; line-height: 32rpx;
margin-top: 6rpx; margin-top: 8rpx;
} }
.pb.compact .pb-btn { .pb.compact .pb-btn {
margin-top: 14rpx; margin-top: 18rpx;
height: 48rpx; height: 58rpx;
line-height: 48rpx; line-height: 58rpx;
padding: 0 18rpx; padding: 0 24rpx;
font-size: 21rpx; font-size: 24rpx;
} }
</style> </style>

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

@ -2,14 +2,10 @@
<view class="dl"> <view class="dl">
<view class="dl-top"> <view class="dl-top">
<view class="dl-copy"> <view class="dl-copy">
<view class="dl-kicker">2 MIN DAILY</view> <view class="dl-kicker">JOIN DAILY</view>
<view class="dl-title">{{progressTitle}}</view> <view class="dl-title">{{progressTitle}}</view>
<view class="dl-sub">完成任务可获得星球券与开奖权重</view> <view class="dl-sub">完成任务可获得星球券与开奖权重</view>
</view> </view>
<view class="dl-map" @tap="$emit('more')">
<text>星球补给地图</text>
<text>进入</text>
</view>
</view> </view>
<!-- <view class="progress-overview"> <!-- <view class="progress-overview">
@ -31,7 +27,7 @@
:class="{done: taskDone('pool')}" :class="{done: taskDone('pool')}"
@tap="onJoin"> @tap="onJoin">
<view class="main-copy"> <view class="main-copy">
<view class="main-icon icon-rocket"></view> <view class="main-icon"></view>
<view> <view>
<view class="main-title">投入星球券</view> <view class="main-title">投入星球券</view>
<view class="main-desc">参与今晚奖金池瓜分</view> <view class="main-desc">参与今晚奖金池瓜分</view>
@ -39,7 +35,6 @@
</view> </view>
<view class="main-status">{{taskDone('pool') ? '已参与' : '立即参与'}}</view> <view class="main-status">{{taskDone('pool') ? '已参与' : '立即参与'}}</view>
<view class="main-boost">预计提升中奖概率 +{{boostText}}%</view> <view class="main-boost">预计提升中奖概率 +{{boostText}}%</view>
<view class="main-arrow"></view>
</view> </view>
<view class="dl-stat"> <view class="dl-stat">
@ -49,11 +44,11 @@
</view> </view>
<view class="stat-card pooled"> <view class="stat-card pooled">
<text>{{data.myPoolTickets || 0}}</text> <text>{{data.myPoolTickets || 0}}</text>
<text>已投奖</text> <text>已投奖</text>
</view> </view>
<view class="stat-card probability"> <view class="stat-card probability">
<text>{{data.myProbability || 0}}%</text> <text>{{data.myProbability || 0}}%</text>
<text>当前中奖概率</text> <text>中奖概率</text>
</view> </view>
</view> </view>
@ -148,9 +143,6 @@
.dl-kicker { color: #59CBB5; font-size: 20rpx; font-weight: 900; letter-spacing: 2rpx; } .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-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: 24rpx; }
.dl-map { width: auto; min-width: 164rpx; min-height: 82rpx; padding: 12rpx 18rpx; border-radius: 28rpx; background: linear-gradient(145deg, #FFFFFF, #E5FFF1); color: #22B889; display: flex; flex-direction: column; align-items: center; justify-content: center; box-shadow: 0 14rpx 28rpx rgba(53,214,166,0.16); border: 2rpx solid rgba(255,255,255,0.96); flex-shrink: 0; }
.dl-map text:first-child { font-size: 21rpx; font-weight: 900; line-height: 1.18; text-align: center; white-space: nowrap; }
.dl-map text:last-child { margin-top: 8rpx; padding: 4rpx 14rpx; border-radius: 999rpx; background: linear-gradient(135deg, #35D6A6, #4FB7FF); color: #FFFFFF; font-size: 18rpx; font-weight: 900; }
.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-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 { 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; } .progress-row text:last-child { color: #22B889; font-family: DIN, Arial, sans-serif; }
@ -163,12 +155,12 @@
.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.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-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-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; } .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-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-desc { margin-top: 8rpx; color: #9B7043; font-size: 22rpx; font-weight: 800; white-space: nowrap; }
.main-status { position: absolute; right: 76rpx; top: 26rpx; z-index: 1; height: 46rpx; line-height: 46rpx; padding: 0 18rpx; border-radius: 999rpx; background: rgba(255,255,255,0.66); color: #F08322; font-size: 21rpx; font-weight: 900; } .main-status { position: absolute; right: 76rpx; top: 26rpx; z-index: 1; height: 46rpx; line-height: 46rpx; padding: 0 18rpx; border-radius: 999rpx; background: rgba(255,255,255,0.66); color: #F08322; font-size: 21rpx; font-weight: 900; }
.main-boost { position: absolute; left: 24rpx; bottom: 20rpx; z-index: 1; color: #C27724; font-size: 21rpx; font-weight: 900; } .main-boost { position: absolute; left: 92rpx; bottom: 20rpx; z-index: 1; color: #C27724; font-size: 21rpx; font-weight: 900; }
.main-arrow { position: absolute; right: 28rpx; top: 58rpx; z-index: 1; color: rgba(240,131,34,0.72); font-size: 56rpx; 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-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; } .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; }
.sub-task.done { filter: saturate(.72); box-shadow: 0 0 30rpx rgba(52,211,153,.22), 0 12rpx 28rpx rgba(53,214,166,0.08); } .sub-task.done { filter: saturate(.72); box-shadow: 0 0 30rpx rgba(52,211,153,.22), 0 12rpx 28rpx rgba(53,214,166,0.08); }
@ -186,10 +178,13 @@
.task-badge { height: 30rpx; line-height: 30rpx; padding: 0 10rpx; border-radius: 999rpx; background: rgba(229,255,241,0.78); color: #16A779; font-size: 16rpx; font-weight: 900; white-space: nowrap; } .task-badge { height: 30rpx; line-height: 30rpx; padding: 0 10rpx; border-radius: 999rpx; background: rgba(229,255,241,0.78); color: #16A779; font-size: 16rpx; font-weight: 900; white-space: nowrap; }
.sub-title { margin-top: 18rpx; color: #12342F; font-size: 27rpx; font-weight: 900; } .sub-title { margin-top: 18rpx; color: #12342F; font-size: 27rpx; font-weight: 900; }
.sub-desc { margin-top: 7rpx; color: #7E9691; font-size: 21rpx; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .sub-desc { margin-top: 7rpx; color: #7E9691; font-size: 21rpx; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dl-stat { margin-top: 18rpx; display: flex; gap: 10rpx; opacity: .72; } .dl-stat { margin-top: 18rpx; display: flex; gap: 10rpx; }
.stat-card { flex: 1; padding: 12rpx 8rpx; border-radius: 22rpx; display: flex; flex-direction: column; align-items: center; background: rgba(255,255,255,0.42); border: 1px solid rgba(255,255,255,0.62); } .stat-card { flex: 1; padding: 16rpx 8rpx 14rpx; border-radius: 24rpx; display: flex; flex-direction: column; align-items: center; background: rgba(255,255,255,0.82); border: 2rpx solid rgba(255,255,255,0.95); box-shadow: 0 12rpx 28rpx rgba(53,214,166,0.1), inset 0 1rpx 0 rgba(255,255,255,0.95); }
.stat-card text:first-child { color: #42635E; font-size: 26rpx; font-weight: 900; font-family: DIN, Arial, sans-serif; } .stat-card text:first-child { color: #12342F; font-size: 30rpx; font-weight: 900; font-family: DIN, Arial, sans-serif; line-height: 34rpx; }
.stat-card text:last-child { color: #7E9691; font-size: 18rpx; margin-top: 2rpx; font-weight: 800; } .stat-card text:last-child { color: #42635E; font-size: 20rpx; margin-top: 6rpx; font-weight: 900; }
.stat-card.collected text:first-child { color: #22B889; }
.stat-card.pooled text:first-child { color: #4FB7FF; }
.stat-card.probability text:first-child { color: #F08322; }
.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 { 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.pool { color: #F08322; }
.reward-float.hunt { color: #348FEA; } .reward-float.hunt { color: #348FEA; }

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

@ -1,7 +1,7 @@
<template> <template>
<view class="ph"> <view class="ph">
<view class="ph-story"> <view class="ph-story">
<text class="ph-kicker">BANJINLI ORBIT</text> <text class="ph-kicker">BANJINGLI ORBIT</text>
<view class="ph-title-row"> <view class="ph-title-row">
<text class="ph-title">Hello白嫖居民</text> <text class="ph-title">Hello白嫖居民</text>
<view class="ph-actions"> <view class="ph-actions">
@ -55,12 +55,12 @@
<text>S</text> <text>S</text>
</view> </view>
</view> </view>
<view class="ph-core-label">得现金奖励</view> <view class="ph-core-label">现金奖池</view>
<view class="ph-pool" :class="{bong: poolBong}"> <view class="ph-pool" :class="{bong: poolBong}">
<text class="ph-pool-symbol"></text> <text class="ph-pool-symbol"></text>
<text class="ph-pool-num">{{poolText}}</text> <text class="ph-pool-num">{{poolText}}</text>
</view> </view>
<view class="ph-pool-label">星球券越多瓜分权重越高</view> <view class="ph-pool-label">星球券越多瓜分概率越高</view>
</view> </view>
</view> </view>
@ -75,7 +75,7 @@
</view> </view>
<view class="ph-satellite ph-satellite-right" @tap="goRank"> <view class="ph-satellite ph-satellite-right" @tap="goRank">
<text class="ph-satellite-num">{{rankText}}</text> <text class="ph-satellite-num">{{rankText}}</text>
<text class="ph-satellite-label">财富坐标</text> <text class="ph-satellite-label">财富排名</text>
</view> </view>
<!-- <view class="ph-ticket-pill">我的星球券 {{data.myTicketCount || 0}} </view> --> <!-- <view class="ph-ticket-pill">我的星球券 {{data.myTicketCount || 0}} </view> -->
</view> </view>
@ -605,7 +605,6 @@
.ph-period { .ph-period {
position: relative; position: relative;
text-align: center; text-align: center;
color: #7E9691;
font-size: 22rpx; font-size: 22rpx;
font-weight: 700; font-weight: 700;
margin-right: 12rpx; margin-right: 12rpx;

10
package1/components/planet/planet-operate.vue

@ -37,7 +37,7 @@
<view class="po-order" v-for="(o,i) in treeOrders" :key="i"> <view class="po-order" v-for="(o,i) in treeOrders" :key="i">
<view> <view>
<view class="po-order-title">{{o.cycleHours}}h · 投入{{o.investTickets}}</view> <view class="po-order-title">{{o.cycleHours}}h · 投入{{o.investTickets}}</view>
<view class="po-order-desc">预计收获 {{o.expectedTotal}} </view> <view class="po-order-desc">预计 {{o.matureTime}} 收获 {{o.expectedTotal}} </view>
</view> </view>
<view class="po-order-btn" @tap="$emit('harvest', o)">{{o.status === 2 ? '已收' : '收获'}}</view> <view class="po-order-btn" @tap="$emit('harvest', o)">{{o.status === 2 ? '已收' : '收获'}}</view>
</view> </view>
@ -48,10 +48,10 @@
<view class="tower-copy"> <view class="tower-copy">
<view class="po-icon">TOWER</view> <view class="po-icon">TOWER</view>
<view class="po-card-title">防御塔 Lv{{state.towerLevel || 1}}</view> <view class="po-card-title">防御塔 Lv{{state.towerLevel || 1}}</view>
<view class="po-card-desc highlight">拦截 {{state.towerInterceptRate || 0}}% · 反击 {{state.towerCounterRate || 0}}% · 伤害 {{state.towerDamage || 0}}</view> <view class="po-card-desc highlight">拦截概率 {{state.towerInterceptRate || 0}}% · 反击概率 {{state.towerCounterRate || 0}}%</view>
<view class="tower-next" v-if="nextTower"> <view class="tower-next" v-if="nextTower">
<text>下一级 Lv{{nextTower.level}}</text> <text>下一级 Lv{{nextTower.level}}</text>
<text>拦截 {{nextTower.interceptRate || 0}}% · 反击 {{nextTower.counterRate || 0}}% · 伤害 {{nextTower.damage || 0}}</text> <text>拦截概率 {{nextTower.interceptRate || 0}}% · 反击概率 {{nextTower.counterRate || 0}}%</text>
<text>升级消耗 {{nextTower.upgradeCost || 0}} 张星球券</text> <text>升级消耗 {{nextTower.upgradeCost || 0}} 张星球券</text>
</view> </view>
<view class="tower-next max" v-else> <view class="tower-next max" v-else>
@ -59,7 +59,7 @@
</view> </view>
<view class="po-tool-tip tower-tip"> <view class="po-tool-tip tower-tip">
<text>🛡</text> <text>🛡</text>
<text>被偷券时更容易挡住还能反击消耗对方体力</text> <text>被偷券时更容易挡住还能反击掉落对方星球券</text>
</view> </view>
</view> </view>
<view class="tower-action"> <view class="tower-action">
@ -123,7 +123,7 @@
.po-tool-tip { position: relative; z-index: 1; display: flex; gap: 12rpx; margin-top: 16rpx; padding: 16rpx 18rpx; border-radius: 24rpx; background: rgba(255,184,77,0.13); border: 2rpx solid rgba(255,184,77,0.22); color: #7A5420; font-size: 22rpx; line-height: 1.45; font-weight: 800; max-width: 430rpx; } .po-tool-tip { position: relative; z-index: 1; display: flex; gap: 12rpx; margin-top: 16rpx; padding: 16rpx 18rpx; border-radius: 24rpx; background: rgba(255,184,77,0.13); border: 2rpx solid rgba(255,184,77,0.22); color: #7A5420; font-size: 22rpx; line-height: 1.45; font-weight: 800; max-width: 430rpx; }
.po-tool-tip text:first-child { flex-shrink: 0; } .po-tool-tip text:first-child { flex-shrink: 0; }
.po-tool-tip.tower-tip { background: rgba(79,183,255,0.13); border-color: rgba(79,183,255,0.22); color: #315A78; } .po-tool-tip.tower-tip { background: rgba(79,183,255,0.13); border-color: rgba(79,183,255,0.22); color: #315A78; }
.po-tree { position: absolute; right: 54rpx; top: 34rpx; width: 140rpx; height: 150rpx; animation: treeBreath 2.6s ease-in-out infinite; } .po-tree { position: absolute; right: 6rpx; top: 34rpx; width: 140rpx; height: 150rpx; animation: treeBreath 2.6s ease-in-out infinite; }
.po-tree-crown { width: 130rpx; height: 110rpx; border-radius: 70rpx 70rpx 50rpx 50rpx; background: radial-gradient(circle at 35% 28%, #FFFFFF, #A8F7C1 42%, #35D6A6); box-shadow: 0 18rpx 38rpx rgba(53,214,166,0.24); } .po-tree-crown { width: 130rpx; height: 110rpx; border-radius: 70rpx 70rpx 50rpx 50rpx; background: radial-gradient(circle at 35% 28%, #FFFFFF, #A8F7C1 42%, #35D6A6); box-shadow: 0 18rpx 38rpx rgba(53,214,166,0.24); }
.po-tree-body { margin: -12rpx auto 0; width: 28rpx; height: 66rpx; border-radius: 20rpx; background: linear-gradient(180deg, #F5C68A, #D8894F); } .po-tree-body { margin: -12rpx auto 0; width: 28rpx; height: 66rpx; border-radius: 20rpx; background: linear-gradient(180deg, #F5C68A, #D8894F); }
@keyframes treeBreath { 0%,100%{ transform: translateY(0) scale(1); } 50%{ transform: translateY(-10rpx) scale(1.04); } } @keyframes treeBreath { 0%,100%{ transform: translateY(0) scale(1); } 50%{ transform: translateY(-10rpx) scale(1.04); } }

2
package1/order/orderDetail.vue

@ -702,7 +702,7 @@
<view class="commission-popup-input"> <view class="commission-popup-input">
<text></text> <text></text>
<input type="digit" :value="additionalFee" placeholder="请输入金额" <input type="digit" :value="additionalFee" placeholder="请输入金额"
focus @input="onAdditionalFeeInput" /> @input="onAdditionalFeeInput" />
</view> </view>
<view class="commission-popup-actions"> <view class="commission-popup-actions">
<view class="commission-popup-cancel" @tap="$refs.addFeePopup.close()">取消</view> <view class="commission-popup-cancel" @tap="$refs.addFeePopup.close()">取消</view>

341
package1/planet/adventure.vue

@ -27,55 +27,64 @@
</view> </view>
</view> </view>
<view class="glory-card" v-if="isDailyMode"> <view class="rank-overview" v-if="isDailyMode">
<view class="section-head"> <view class="section-head">
<text>今日最快通关</text> <text>单速览</text>
<text>学院荣耀</text> <text class="reward-record-btn" @tap="openYesterdayRewards">昨日获奖榜单</text>
</view> </view>
<view class="glory-list"> <view class="rank-mini-grid">
<view class="glory-item" v-for="(item,i) in gloryList" :key="item._key" :class="'rank-' + i"> <view class="rank-mini-panel">
<view class="glory-medal">{{gloryMedals[i] || (i + 1)}}</view> <view class="rank-mini-title">
<view class="glory-user"> <text>个人排位榜</text>
<text>{{item.college || '神秘学院'}}</text> <text>最快通关</text>
<text>{{item.nickname || '匿名同学'}}</text>
</view> </view>
<view class="glory-time">{{item.durationSeconds || 0}}s</view> <view class="glory-mini-list" v-if="compactGloryList.length">
<view class="glory-mini-item" v-for="(item,i) in compactGloryList" :key="item._key" :class="'rank-' + i">
<view class="mini-medal">{{gloryMedals[i] || (i + 1)}}</view>
<view class="mini-main">
<text>{{item.nickname || '匿名同学'}}</text>
<text>{{item.college || '神秘学院'}}</text>
</view>
<view class="mini-score">{{item.durationSeconds || 0}}s</view>
</view>
</view>
<view class="empty mini-empty" v-else>第一枚金牌等你来拿</view>
</view> </view>
</view> <view class="rank-mini-panel">
<view class="empty" v-if="!gloryList.length">今天还没人通关第一枚金牌等你来拿</view> <view class="rank-mini-title">
</view> <text>学院排位榜</text>
<text>推进值</text>
<view class="rank-card" v-if="isDailyMode"> </view>
<view class="section-head"> <view class="college-mini-list" v-if="compactCollegeRanks.length">
<text>学院推进榜</text> <view class="college-mini-item" v-for="(item,i) in compactCollegeRanks" :key="i">
<text>我的学院第 {{home.myRankNo || '-'}} </text> <view class="mini-medal">{{i + 1}}</view>
</view> <view class="mini-main">
<view class="college-row" v-for="(item,i) in collegeRanks" :key="i"> <text>{{item.college || item.nickname || '未知学院'}}</text>
<view class="medal">{{i + 1}}</view> <view class="mini-bar"><view :style="{width: (item.percent || 8) + '%'}"></view></view>
<view class="college-main"> </view>
<text>{{item.college || item.nickname || '未知学院'}}</text> <view class="mini-score college-score">{{item.score || 0}}</view>
<view class="bar"><view :style="{width: (item.percent || 8) + '%'}"></view></view> </view>
</view>
<view class="empty mini-empty" v-else>快来抢第一棒</view>
</view> </view>
<view class="score">{{item.score || 0}}</view>
</view> </view>
<view class="empty" v-if="!collegeRanks.length">今天还没有学院上榜快来抢第一棒</view>
</view> </view>
<view class="game-card"> <view class="game-card">
<view class="section-head"> <view class="section-head">
<text>{{gameTitle}}</text> <text>{{gameTitle}}</text>
<view class="timer-pill" :class="timerClass"> <view class="timer-pill" :class="timerClass">
<text>{{cleared ? '已通关' : timerText}}</text> <text>{{cleared ? clearedPillText : timerText}}</text>
</view> </view>
</view> </view>
<button class="arena-share" v-if="isPkMode" open-type="share">邀请同学来擂台</button> <button class="arena-share" v-if="isPkMode" open-type="share">邀请同学来擂台</button>
<view class="start-strip" v-if="!playing && !cleared" @tap="startLevel"> <view class="start-strip" :class="{disabled: actionLocked && isDailyMode}" v-if="!playing && !cleared" @tap="startLevel">
<text>{{isDailyMode ? '开始游戏' : '开始PK'}}</text> <text>{{isDailyMode ? '开始游戏' : '开始PK'}}</text>
<text>先点这里再开始消除卡牌</text> <text>先点这里再开始消除卡牌</text>
</view> </view>
<view class="start-strip done" v-if="cleared && isDailyMode"> <view class="start-strip done" v-if="cleared && isDailyMode">
<text>今日已排位</text> <text>今日已通关</text>
<text>明天再来为学院继续推进</text> <text>{{dailyResultText || '明天再来为学院继续推进'}}</text>
</view> </view>
<view class="tips"> <view class="tips">
@ -90,6 +99,10 @@
<text>{{timeLeft}}</text> <text>{{timeLeft}}</text>
<text>{{timerHint}}</text> <text>{{timerHint}}</text>
</view> </view>
<view class="restart-left" v-if="isDailyMode">
<text>{{dailyRestartLeft}}</text>
<text>今日剩余</text>
</view>
</view> </view>
<view class="countdown-track"> <view class="countdown-track">
<view class="countdown-progress" :style="{width: timerPercent + '%'}"></view> <view class="countdown-progress" :style="{width: timerPercent + '%'}"></view>
@ -125,8 +138,11 @@
</view> </view>
</view> </view>
<view class="actions"> <view class="actions" v-if="isDailyMode">
<view class="sub-btn" @tap="resetLevel">{{isDailyMode ? '重开本关' : '查看同局'}}</view> <view class="main-btn full-btn" :class="{disabled: actionLocked}" @tap="playing ? resetLevel() : startLevel()">{{playing ? '重开本关' : '开始排位'}}</view>
</view>
<view class="actions" v-else>
<view class="sub-btn" @tap="resetLevel">查看同局</view>
<view class="main-btn" :class="{disabled: cleared || playing}" @tap="startLevel"> <view class="main-btn" :class="{disabled: cleared || playing}" @tap="startLevel">
{{startButtonText}} {{startButtonText}}
</view> </view>
@ -165,6 +181,50 @@
<view class="main-btn" @tap="closeCollegePicker">确定</view> <view class="main-btn" @tap="closeCollegePicker">确定</view>
</view> </view>
</view> </view>
<view v-if="rewardModal.show" class="modal">
<view class="modal-card reward-modal">
<view class="modal-title">昨日奖励记录</view>
<view class="modal-sub">个人前五显示通关秒数学院前三显示学院分数</view>
<view class="reward-modal-grid">
<view class="reward-modal-panel">
<view class="reward-modal-head">
<text>个人前五</text>
<text>秒数</text>
</view>
<view v-if="personalRewardList.length" class="reward-record-list">
<view class="reward-record-row" v-for="(item,i) in personalRewardList" :key="item._key">
<view class="mini-medal">{{gloryMedals[i] || item.rankNo || (i + 1)}}</view>
<view class="mini-main">
<text>{{item.nickname || '匿名同学'}}</text>
<text class="reward-content personal">{{item.rewardContent || '现金奖励待发放'}}</text>
</view>
<view class="mini-score">{{item.durationSeconds || 0}}s</view>
</view>
</view>
<view class="empty mini-empty" v-else>昨日暂无个人奖励</view>
</view>
<view class="reward-modal-panel">
<view class="reward-modal-head">
<text>学院前三</text>
<text>分数</text>
</view>
<view v-if="collegeRewardList.length" class="reward-record-list">
<view class="reward-record-row" v-for="(item,i) in collegeRewardList" :key="item._key">
<view class="mini-medal">{{item.rankNo || (i + 1)}}</view>
<view class="mini-main">
<text>{{item.college || item.nickname || '未知学院'}}</text>
<text class="reward-content college">{{item.rewardContent || '学院奖励待发放'}}</text>
</view>
<view class="mini-score college-score">{{item.score || 0}}</view>
</view>
</view>
<view class="empty mini-empty" v-else>昨日暂无学院奖励</view>
</view>
</view>
<view class="main-btn" @tap="closeRewardModal">知道了</view>
</view>
</view>
</view> </view>
</template> </template>
@ -205,7 +265,16 @@
moveCount: 0, moveCount: 0,
buildingLevel: false, buildingLevel: false,
prebuildTimer: null, prebuildTimer: null,
modal: { show: false, title: '', sub: '' } needRebuildOnStart: false,
actionLocked: false,
dailyRestartCount: 0,
modal: { show: false, title: '', sub: '' },
rewardModal: {
show: false,
loading: false,
personalRewardList: [],
collegeRewardList: []
}
} }
}, },
computed: { computed: {
@ -243,6 +312,9 @@
if (this.isChallengeMode) return '开始挑战' if (this.isChallengeMode) return '开始挑战'
return '开始排位' return '开始排位'
}, },
dailyRestartLeft() {
return Math.max(0, 3 - this.dailyRestartCount)
},
collegeRanks() { collegeRanks() {
const list = this.home.rankList || [] const list = this.home.rankList || []
let max = 1 let max = 1
@ -254,6 +326,54 @@
return item return item
}) })
}, },
compactGloryList() {
return (this.gloryList || []).slice(0, 5)
},
personalRewardList() {
return this.withRewardKeys(this.rewardModal.personalRewardList || [], 'personal_reward')
},
collegeRewardList() {
return this.withRewardKeys(this.rewardModal.collegeRewardList || [], 'college_reward')
},
compactCollegeRanks() {
return (this.collegeRanks || []).slice(0, 3)
},
myDailyDuration() {
const home = this.home || {}
const fields = [
home.myDurationSeconds,
home.durationSeconds,
home.myBestDurationSeconds,
home.myRecord && home.myRecord.durationSeconds,
home.todayRecord && home.todayRecord.durationSeconds,
home.adventureRecord && home.adventureRecord.durationSeconds
]
const value = fields.find(item => Number(item) > 0)
return value ? Number(value) : 0
},
myDailyScore() {
const home = this.home || {}
const fields = [
home.myScore,
home.score,
home.myTodayScore,
home.myRecord && home.myRecord.score,
home.todayRecord && home.todayRecord.score,
home.adventureRecord && home.adventureRecord.score
]
const value = fields.find(item => Number(item) > 0)
return value ? Number(value) : 0
},
dailyResultText() {
const parts = []
if (this.myDailyDuration) parts.push(`用时 ${this.myDailyDuration}s`)
if (this.myDailyScore) parts.push(`推进值 ${this.myDailyScore}`)
return parts.join(' · ')
},
clearedPillText() {
if (this.myDailyDuration) return `已通关 ${this.myDailyDuration}s`
return '已通关'
},
rocketPercent() { rocketPercent() {
let mine = null let mine = null
for (let i = 0; i < this.collegeRanks.length; i++) { for (let i = 0; i < this.collegeRanks.length; i++) {
@ -339,6 +459,7 @@
} catch (e) {} } catch (e) {}
this.college = uni.getStorageSync('planetCollege_' + this.regionId) || '' this.college = uni.getStorageSync('planetCollege_' + this.regionId) || ''
if (this.isDailyMode && this.inviteCollege) this.college = this.inviteCollege if (this.isDailyMode && this.inviteCollege) this.college = this.inviteCollege
this.dailyRestartCount = this.getDailyRestartCount()
this.loadColleges() this.loadColleges()
this.loadHome() this.loadHome()
this.loadGlory() this.loadGlory()
@ -361,7 +482,7 @@
const elapsed = Math.floor((Date.now() - this.startTs) / 1000) const elapsed = Math.floor((Date.now() - this.startTs) / 1000)
this.timeLeft = Math.max(0, this.timeLimit - elapsed) this.timeLeft = Math.max(0, this.timeLimit - elapsed)
if (this.timeLeft <= 0) { if (this.timeLeft <= 0) {
this.failLevel('时间到了', '超过300秒,本关失败。不消耗次数,调整顺序再来一次。') this.failLevel('时间到了', '超过300秒,本次挑战结束。')
} else { } else {
this.startTimer(false) this.startTimer(false)
} }
@ -454,6 +575,33 @@
} }
}) })
}, },
openYesterdayRewards() {
if (!this.regionId || this.rewardModal.loading) return
this.rewardModal.show = true
this.rewardModal.loading = true
this.tui.request('/app/planet/adventure/yesterdayRewards', 'POST', {
regionId: this.regionId
}, false, false, true).then(res => {
this.rewardModal.loading = false
if (res.code == 200 && res.result) {
this.rewardModal.personalRewardList = res.result.personalRewardList || []
this.rewardModal.collegeRewardList = res.result.collegeRewardList || []
} else {
this.tui.toast(res.message)
}
}).catch(() => {
this.rewardModal.loading = false
})
},
closeRewardModal() {
this.rewardModal.show = false
},
withRewardKeys(list, prefix) {
return (list || []).map((item, index) => {
item._key = item.id || item.userId || item.college || (prefix + '_' + index)
return item
})
},
prepareSharedMode() { prepareSharedMode() {
if (this.isPkMode && this.roomId && !this.fixedSeed) { if (this.isPkMode && this.roomId && !this.fixedSeed) {
this.checkPkRoomAvailable(() => { this.checkPkRoomAvailable(() => {
@ -545,11 +693,19 @@
}, },
startLevel() { startLevel() {
if (this.cleared || this.playing) return if (this.cleared || this.playing) return
if (this.isDailyMode && this.actionLocked) return
if (this.isDailyMode) this.actionLocked = true
this.clearPrebuildTimer() this.clearPrebuildTimer()
if (!this.college && this.isDailyMode) { if (!this.college && this.isDailyMode) {
this.actionLocked = false
this.openCollegePicker() this.openCollegePicker()
return return
} }
if (this.isDailyMode && !this.canUseDailyRestart()) {
this.actionLocked = false
this.tui.toast('今日重开次数已用完')
return
}
if (!this.isDailyMode) { if (!this.isDailyMode) {
this.startFixedMode() this.startFixedMode()
return return
@ -562,18 +718,24 @@
college: this.college college: this.college
}).then(res => { }).then(res => {
if (res.code != 200 || !res.result) { if (res.code != 200 || !res.result) {
this.actionLocked = false
this.tui.toast(res.message) this.tui.toast(res.message)
return return
} }
this.session = res.result this.session = res.result
this.playing = true this.playing = true
this.startTs = Date.now() this.startTs = Date.now()
if (!this.cards.length) { this.recordDailyRestartUse()
if (this.needRebuildOnStart || !this.cards.length) {
this.roundSeed = this.newRoundSeed() this.roundSeed = this.newRoundSeed()
this.buildLevel() this.buildLevel()
if (!this.cards.length) this.buildLevel() if (!this.cards.length) this.buildLevel()
this.needRebuildOnStart = false
} }
this.startTimer() this.startTimer()
this.actionLocked = false
}).catch(() => {
this.actionLocked = false
}) })
}, },
startFixedMode() { startFixedMode() {
@ -1178,7 +1340,7 @@
if (this.cards.every(item => item.removed) && this.slots.length === 0) { if (this.cards.every(item => item.removed) && this.slots.length === 0) {
this.finishClear() this.finishClear()
} else if (this.cards.every(item => item.removed || item.selected) && this.slots.length > 0) { } else if (this.cards.every(item => item.removed || item.selected) && this.slots.length > 0) {
this.failLevel('没有可消组合', '剩余卡牌无法凑成消除,本关失败。不消耗次数,换个顺序再来一次。') this.failLevel('没有可消组合', '剩余卡牌无法凑成消除,本次挑战结束。')
} else if (this.slots.length >= this.slotLimit) { } else if (this.slots.length >= this.slotLimit) {
this.failLevel() this.failLevel()
} }
@ -1194,7 +1356,7 @@
const elapsed = Math.floor((Date.now() - this.startTs) / 1000) const elapsed = Math.floor((Date.now() - this.startTs) / 1000)
this.timeLeft = Math.max(0, this.timeLimit - elapsed) this.timeLeft = Math.max(0, this.timeLimit - elapsed)
if (this.timeLeft <= 0) { if (this.timeLeft <= 0) {
this.failLevel('时间到了', '超过300秒,本关失败。不消耗次数,调整顺序再来一次。') this.failLevel('时间到了', '超过300秒,本次挑战结束。')
} }
}, 1000) }, 1000)
}, },
@ -1259,6 +1421,11 @@
}).then(res => { }).then(res => {
if (res.code == 200) { if (res.code == 200) {
this.cleared = true this.cleared = true
this.home = Object.assign({}, this.home, {
myDurationSeconds: duration,
myScore: progress
})
this.clearDailyRestartCount()
this.modal = { this.modal = {
show: true, show: true,
title: '排位成功', title: '排位成功',
@ -1280,10 +1447,11 @@
this.submitCompetitive(false, Math.floor((Date.now() - this.startTs) / 1000), this.remainingCount) this.submitCompetitive(false, Math.floor((Date.now() - this.startTs) / 1000), this.remainingCount)
return return
} }
this.needRebuildOnStart = true
this.modal = { this.modal = {
show: true, show: true,
title: title || '槽位满了', title: title || '槽位满了',
sub: sub || '本关失败,不消耗次数。换个顺序再推一次。' sub: `${sub || '本次挑战结束。'}${this.dailyRestartLeft <= 0 ? ' 今日次数已用完。' : ' 今日还可开始 ' + this.dailyRestartLeft + ' 次。'}`
} }
}, },
submitCompetitive(cleared, duration, remainingCards) { submitCompetitive(cleared, duration, remainingCards) {
@ -1336,16 +1504,52 @@
}, },
resetLevel() { resetLevel() {
if (this.cleared) return if (this.cleared) return
if (this.isDailyMode && this.actionLocked) return
if (this.isDailyMode) this.actionLocked = true
if (!this.isDailyMode && this.playing) { if (!this.isDailyMode && this.playing) {
this.tui.toast('擂台/挑战只有一次机会,不能重开') this.tui.toast('擂台/挑战只有一次机会,不能重开')
return return
} }
if (this.isDailyMode && !this.canUseDailyRestart()) {
this.actionLocked = false
this.tui.toast('今日重开次数已用完')
return
}
/* if (this.isDailyMode) this.recordDailyRestartUse() */
this.playing = false this.playing = false
this.clearTimer() this.clearTimer()
this.timeLeft = this.timeLimit this.timeLeft = this.timeLimit
this.roundSeed = this.fixedSeed || this.newRoundSeed() this.roundSeed = this.fixedSeed || this.newRoundSeed()
this.buildLevel() this.buildLevel()
if (!this.cards.length) this.buildLevel() if (!this.cards.length) this.buildLevel()
this.needRebuildOnStart = false
this.actionLocked = false
},
dailyRestartStorageKey() {
const uid = this.userId || uni.getStorageSync('id') || 'guest'
return `planetAdventureRestart_${uid}_${this.regionId || 'global'}_${this.todayKey()}`
},
todayKey() {
const d = new Date()
const p = n => (n < 10 ? '0' + n : '' + n)
return `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}`
},
getDailyRestartCount() {
const count = parseInt(uni.getStorageSync(this.dailyRestartStorageKey()) || '0', 10)
return Number.isNaN(count) ? 0 : count
},
canUseDailyRestart() {
return this.dailyRestartCount < 3
},
recordDailyRestartUse() {
const count = Math.min(3, this.getDailyRestartCount() + 1)
uni.setStorageSync(this.dailyRestartStorageKey(), count)
this.dailyRestartCount = count
return count
},
clearDailyRestartCount() {
uni.removeStorageSync(this.dailyRestartStorageKey())
this.dailyRestartCount = 0
}, },
closeModal() { closeModal() {
this.modal.show = false this.modal.show = false
@ -1442,16 +1646,16 @@
.boost { min-height: 100vh; background: linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 46%, #FFF7DE 100%); color: #12342F; } .boost { min-height: 100vh; background: linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 46%, #FFF7DE 100%); color: #12342F; }
.nav { position: fixed; top: 0; left: 0; right: 0; z-index: 200; box-sizing: border-box; display: flex; align-items: center; justify-content: center; background: rgba(243,255,244,0.9); } .nav { position: fixed; top: 0; left: 0; right: 0; z-index: 200; box-sizing: border-box; display: flex; align-items: center; justify-content: center; background: rgba(243,255,244,0.9); }
.nav-back { position: absolute; left: 24rpx; bottom: 12rpx; width: 56rpx; height: 56rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: rgba(255,255,255,.72); color: #12342F; box-shadow: 0 8rpx 20rpx rgba(18,52,47,.08); } .nav-back { position: absolute; left: 24rpx; bottom: 12rpx; width: 56rpx; height: 56rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: rgba(255,255,255,.72); color: #12342F; box-shadow: 0 8rpx 20rpx rgba(18,52,47,.08); }
.nav-back text { font-size: 42rpx; line-height: 1; transform: translateY(-2rpx); } .nav-back text { padding-bottom: 14rpx;padding-right: 4rpx;font-size: 62rpx; line-height: 1;font-weight: 500; transform: translateY(-2rpx); }
.nav-title { padding-bottom: 14rpx; color: #12342F; font-size: 32rpx; font-weight: 900; } .nav-title { padding-bottom: 14rpx; color: #12342F; font-size: 32rpx; font-weight: 900; }
.page { height: 100vh; box-sizing: border-box; padding-left: 24rpx; padding-right: 24rpx; } .page { height: 100vh; box-sizing: border-box; padding-left: 24rpx; padding-right: 24rpx; }
.hero, .glory-card, .rank-card, .game-card { margin-bottom: 24rpx; border-radius: 42rpx; background: rgba(255,255,255,0.82); padding: 30rpx; box-shadow: 0 16rpx 42rpx rgba(79,183,255,0.10); } .hero, .rank-overview, .game-card { margin-bottom: 24rpx; border-radius: 42rpx; background: rgba(255,255,255,0.82); padding: 30rpx; box-shadow: 0 16rpx 42rpx rgba(79,183,255,0.10); }
.hero-kicker { color: #FF9C42; font-size: 22rpx; font-weight: 900; letter-spacing: 2rpx; } .hero-kicker { color: #FF9C42; font-size: 22rpx; font-weight: 900; letter-spacing: 2rpx; }
.hero-title { margin-top: 10rpx; font-size: 42rpx; font-weight: 900; } .hero-title { margin-top: 10rpx; font-size: 42rpx; font-weight: 900; }
.hero-sub, .tips { margin-top: 16rpx; color: #6B817D; font-size: 24rpx; line-height: 1.55; } .hero-sub, .tips { margin-top: 16rpx; color: #6B817D; font-size: 24rpx; line-height: 1.55; }
.hero-reward-tip { position: relative; margin-top: 20rpx; padding: 20rpx 22rpx 20rpx 86rpx; border-radius: 24rpx; background: linear-gradient(135deg, rgba(255,247,221,0.96), rgba(255,255,255,0.9) 48%, rgba(229,255,246,0.92)); border: 3rpx solid rgba(255,184,77,0.58); box-shadow: 0 16rpx 34rpx rgba(255,184,77,0.18), inset 0 0 0 2rpx rgba(255,255,255,0.72); overflow: hidden; } .hero-reward-tip { position: relative; margin-top: 20rpx; padding: 20rpx 22rpx 20rpx 86rpx; border-radius: 24rpx; background: linear-gradient(135deg, rgba(255,247,221,0.96), rgba(255,255,255,0.9) 48%, rgba(229,255,246,0.92)); border: 3rpx solid rgba(255,184,77,0.58); box-shadow: 0 16rpx 34rpx rgba(255,184,77,0.18), inset 0 0 0 2rpx rgba(255,255,255,0.72); overflow: hidden; }
.hero-reward-tip:before { content: ''; position: absolute; right: -48rpx; top: -62rpx; width: 180rpx; height: 180rpx; border-radius: 50%; background: radial-gradient(circle, rgba(255,184,77,0.26), transparent 66%); } .hero-reward-tip:before { content: ''; position: absolute; right: -48rpx; top: -62rpx; width: 180rpx; height: 180rpx; border-radius: 50%; background: radial-gradient(circle, rgba(255,184,77,0.26), transparent 66%); }
.hero-reward-tip:after { content: '现金奖励'; position: absolute; right: 18rpx; top: 14rpx; padding: 4rpx 14rpx; border-radius: 999rpx; background: linear-gradient(135deg, #FFB84D, #35D6A6); color: #FFFFFF; font-size: 19rpx; font-weight: 900; } .hero-reward-tip:after { content: '现金奖励'; position: absolute; right: 10rpx; top: 14rpx; padding: 4rpx 14rpx; border-radius: 999rpx; background: linear-gradient(135deg, #FFB84D, #35D6A6); color: #FFFFFF; font-size: 19rpx; font-weight: 900; }
.hero-reward-icon { position: absolute; left: 20rpx; top: 50%; transform: translateY(-50%); width: 48rpx; height: 48rpx; line-height: 48rpx; border-radius: 50%; text-align: center; background: rgba(255,255,255,0.82); box-shadow: 0 8rpx 18rpx rgba(255,184,77,0.18); font-size: 28rpx; } .hero-reward-icon { position: absolute; left: 20rpx; top: 50%; transform: translateY(-50%); width: 48rpx; height: 48rpx; line-height: 48rpx; border-radius: 50%; text-align: center; background: rgba(255,255,255,0.82); box-shadow: 0 8rpx 18rpx rgba(255,184,77,0.18); font-size: 28rpx; }
.hero-reward-copy { position: relative; z-index: 1; padding-right: 92rpx; color: #6A4A1D; font-size: 24rpx; line-height: 1.55; font-weight: 800; } .hero-reward-copy { position: relative; z-index: 1; padding-right: 92rpx; color: #6A4A1D; font-size: 24rpx; line-height: 1.55; font-weight: 800; }
.tips { display: flex; flex-direction: column; gap: 6rpx; } .tips { display: flex; flex-direction: column; gap: 6rpx; }
@ -1461,8 +1665,12 @@
.countdown-main { display: flex; align-items: center; gap: 16rpx; } .countdown-main { display: flex; align-items: center; gap: 16rpx; }
.countdown-main > text { width: 58rpx; height: 58rpx; line-height: 58rpx; border-radius: 50%; text-align: center; background: #fff; font-size: 32rpx; box-shadow: 0 8rpx 18rpx rgba(18,52,47,0.08); } .countdown-main > text { width: 58rpx; height: 58rpx; line-height: 58rpx; border-radius: 50%; text-align: center; background: #fff; font-size: 32rpx; box-shadow: 0 8rpx 18rpx rgba(18,52,47,0.08); }
.countdown-main view { display: flex; flex-direction: column; } .countdown-main view { display: flex; flex-direction: column; }
.countdown-main view:not(.restart-left) { flex: 1; min-width: 0; }
.countdown-main view text:first-child { color: #12342F; font-size: 42rpx; font-weight: 900; line-height: 1; } .countdown-main view text:first-child { color: #12342F; font-size: 42rpx; font-weight: 900; line-height: 1; }
.countdown-main view text:last-child { margin-top: 8rpx; color: #6B817D; font-size: 22rpx; } .countdown-main view text:last-child { margin-top: 8rpx; color: #6B817D; font-size: 22rpx; }
.restart-left { width: 132rpx; height: 72rpx; border-radius: 22rpx; align-items: center; justify-content: center; background: rgba(255,255,255,0.78); border: 2rpx solid rgba(53,214,166,0.18); box-shadow: 0 8rpx 18rpx rgba(18,52,47,0.06); }
.countdown-main .restart-left text:first-child { color: #22B889; font-size: 30rpx; font-weight: 900; line-height: 1; }
.countdown-main .restart-left text:last-child { margin-top: 6rpx; color: #6B817D; font-size: 20rpx; font-weight: 800; }
.countdown-card.warning .countdown-main view text:first-child { color: #D88400; } .countdown-card.warning .countdown-main view text:first-child { color: #D88400; }
.countdown-card.danger .countdown-main view text:first-child { color: #F04444; } .countdown-card.danger .countdown-main view text:first-child { color: #F04444; }
.countdown-track { margin-top: 16rpx; height: 14rpx; border-radius: 999rpx; background: rgba(255,255,255,0.72); overflow: hidden; } .countdown-track { margin-top: 16rpx; height: 14rpx; border-radius: 999rpx; background: rgba(255,255,255,0.72); overflow: hidden; }
@ -1481,17 +1689,25 @@
.rocket-progress { height: 100%; border-radius: 999rpx; background: linear-gradient(90deg, #35D6A6, #4FB7FF, #FFB84D); } .rocket-progress { height: 100%; border-radius: 999rpx; background: linear-gradient(90deg, #35D6A6, #4FB7FF, #FFB84D); }
.section-head { display: flex; justify-content: space-between; align-items: center; font-size: 24rpx; color: #6B817D; } .section-head { display: flex; justify-content: space-between; align-items: center; font-size: 24rpx; color: #6B817D; }
.section-head text:first-child { color: #12342F; font-size: 31rpx; font-weight: 900; } .section-head text:first-child { color: #12342F; font-size: 31rpx; font-weight: 900; }
.glory-card { background: radial-gradient(circle at 90% 8%, rgba(255,184,77,.26), transparent 34%), linear-gradient(135deg, rgba(255,255,255,.92), rgba(242,250,255,.82)); } .reward-record-btn { padding: 8rpx 18rpx; border-radius: 999rpx; background: rgba(255,184,77,0.18); color: #D88400; font-size: 22rpx; font-weight: 900; border: 2rpx solid rgba(255,184,77,0.36); }
.glory-list { margin-top: 18rpx; display: flex; flex-direction: column; gap: 14rpx; } .rank-overview { padding: 24rpx; background: radial-gradient(circle at 90% 8%, rgba(255,184,77,.22), transparent 34%), linear-gradient(135deg, rgba(255,255,255,.9), rgba(242,250,255,.82)); }
.glory-item { min-height: 86rpx; padding: 16rpx 18rpx; border-radius: 28rpx; background: rgba(255,255,255,.86); display: flex; align-items: center; gap: 16rpx; border: 2rpx solid rgba(255,255,255,.7); box-shadow: 0 12rpx 28rpx rgba(79,183,255,.08); } .rank-mini-grid { margin-top: 18rpx; display: flex; gap: 16rpx; }
.glory-item.rank-0 { background: linear-gradient(135deg, rgba(255,243,199,.96), rgba(255,255,255,.88)); box-shadow: 0 16rpx 34rpx rgba(255,184,77,.18); } .rank-mini-panel { flex: 1; min-width: 0; padding: 16rpx; border-radius: 28rpx; background: rgba(255,255,255,.72); border: 2rpx solid rgba(255,255,255,.68); }
.glory-item.rank-1 { background: linear-gradient(135deg, rgba(241,245,249,.98), rgba(255,255,255,.88)); } .rank-mini-title { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12rpx; }
.glory-item.rank-2 { background: linear-gradient(135deg, rgba(255,235,213,.96), rgba(255,255,255,.88)); } .rank-mini-title text:first-child { color: #12342F; font-size: 24rpx; font-weight: 900; }
.glory-medal { width: 58rpx; height: 58rpx; line-height: 58rpx; border-radius: 50%; background: #fff; text-align: center; font-size: 32rpx; box-shadow: 0 8rpx 18rpx rgba(18,52,47,.08); } .rank-mini-title text:last-child { color: #8AA09C; font-size: 20rpx; font-weight: 800; }
.glory-user { flex: 1; min-width: 0; display: flex; flex-direction: column; } .glory-mini-list, .college-mini-list { display: flex; flex-direction: column; gap: 8rpx; }
.glory-user text:first-child { color: #12342F; font-size: 27rpx; font-weight: 900; } .glory-mini-item, .college-mini-item { min-height: 50rpx; display: flex; align-items: center; gap: 10rpx; }
.glory-user text:last-child { margin-top: 6rpx; color: #6B817D; font-size: 22rpx; } .glory-mini-item.rank-0 .mini-score { color: #FF9C42; }
.glory-time { min-width: 90rpx; text-align: right; color: #FF9C42; font-size: 31rpx; font-weight: 900; } .mini-medal { width: 40rpx; height: 40rpx; line-height: 40rpx; border-radius: 50%; background: #FFF1C7; color: #B87932; text-align: center; font-size: 22rpx; font-weight: 900; flex-shrink: 0; }
.mini-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.mini-main text:first-child { color: #12342F; font-size: 22rpx; font-weight: 900; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mini-main text:last-child { margin-top: 2rpx; color: #8AA09C; font-size: 18rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mini-score { min-width: 58rpx; text-align: right; color: #FF9C42; font-size: 23rpx; font-weight: 900; }
.college-score { color: #22B889; }
.mini-bar { margin-top: 8rpx; height: 8rpx; background: #EEF7F4; border-radius: 999rpx; overflow: hidden; }
.mini-bar view { height: 100%; border-radius: 999rpx; background: linear-gradient(90deg, #35D6A6, #4FB7FF); }
.mini-empty { margin-top: 28rpx; font-size: 21rpx; text-align: center; }
.timer-pill { min-width: 126rpx; height: 48rpx; padding: 0 18rpx; border-radius: 999rpx; background: #EFFFF8; color: #20B486; display: flex; align-items: center; justify-content: center; font-size: 26rpx; font-weight: 900; box-shadow: 0 8rpx 20rpx rgba(32,180,134,0.12); } .timer-pill { min-width: 126rpx; height: 48rpx; padding: 0 18rpx; border-radius: 999rpx; background: #EFFFF8; color: #20B486; display: flex; align-items: center; justify-content: center; font-size: 26rpx; font-weight: 900; box-shadow: 0 8rpx 20rpx rgba(32,180,134,0.12); }
.timer-pill.warning { background: #FFF4D7; color: #D88400; box-shadow: 0 8rpx 22rpx rgba(216,132,0,0.16); } .timer-pill.warning { background: #FFF4D7; color: #D88400; box-shadow: 0 8rpx 22rpx rgba(216,132,0,0.16); }
.timer-pill.danger { background: #FFE8E8; color: #F04444; box-shadow: 0 8rpx 24rpx rgba(240,68,68,0.2); } .timer-pill.danger { background: #FFE8E8; color: #F04444; box-shadow: 0 8rpx 24rpx rgba(240,68,68,0.2); }
@ -1501,13 +1717,7 @@
.start-strip text:first-child { font-size: 30rpx; font-weight: 900; } .start-strip text:first-child { font-size: 30rpx; font-weight: 900; }
.start-strip text:last-child { font-size: 22rpx; opacity: .88; } .start-strip text:last-child { font-size: 22rpx; opacity: .88; }
.start-strip.done { background: rgba(255,255,255,0.8); color: #6B817D; box-shadow: none; } .start-strip.done { background: rgba(255,255,255,0.8); color: #6B817D; box-shadow: none; }
.college-row { margin-top: 18rpx; display: flex; align-items: center; gap: 16rpx; } .start-strip.disabled { opacity: .45; }
.medal { width: 48rpx; height: 48rpx; line-height: 48rpx; border-radius: 50%; text-align: center; background: #FFF1C7; color: #B87932; font-weight: 900; }
.college-main { flex: 1; min-width: 0; }
.college-main text { font-size: 25rpx; font-weight: 800; }
.bar { margin-top: 10rpx; height: 12rpx; background: #EEF7F4; border-radius: 999rpx; overflow: hidden; }
.bar view { height: 100%; border-radius: 999rpx; background: linear-gradient(90deg, #35D6A6, #4FB7FF); }
.score { width: 92rpx; text-align: right; color: #22B889; font-size: 28rpx; font-weight: 900; }
.empty { margin-top: 18rpx; color: #8AA09C; font-size: 24rpx; } .empty { margin-top: 18rpx; color: #8AA09C; font-size: 24rpx; }
.board { margin-top: 22rpx; height: 620rpx; border-radius: 36rpx; background: linear-gradient(155deg, rgba(234,248,255,0.9), rgba(255,248,222,0.72)); position: relative; overflow: hidden; z-index: 1; } .board { margin-top: 22rpx; height: 620rpx; border-radius: 36rpx; background: linear-gradient(155deg, rgba(234,248,255,0.9), rgba(255,248,222,0.72)); position: relative; overflow: hidden; z-index: 1; }
.tile { position: absolute; width: 76rpx; height: 76rpx; border-radius: 22rpx; background: #fff; display: flex; align-items: center; justify-content: center; box-shadow: 0 10rpx 22rpx rgba(66,99,94,0.12); border: 2rpx solid rgba(255,255,255,0.9); transition: transform .12s ease, opacity .12s ease; } .tile { position: absolute; width: 76rpx; height: 76rpx; border-radius: 22rpx; background: #fff; display: flex; align-items: center; justify-content: center; box-shadow: 0 10rpx 22rpx rgba(66,99,94,0.12); border: 2rpx solid rgba(255,255,255,0.9); transition: transform .12s ease, opacity .12s ease; }
@ -1527,12 +1737,25 @@
.sub-btn, .main-btn { flex: 1; height: 82rpx; line-height: 82rpx; text-align: center; border-radius: 999rpx; font-size: 28rpx; font-weight: 900; } .sub-btn, .main-btn { flex: 1; height: 82rpx; line-height: 82rpx; text-align: center; border-radius: 999rpx; font-size: 28rpx; font-weight: 900; }
.sub-btn { background: rgba(255,255,255,0.78); color: #42635E; } .sub-btn { background: rgba(255,255,255,0.78); color: #42635E; }
.main-btn { background: linear-gradient(135deg, #35D6A6, #4FB7FF); color: #fff; box-shadow: 0 14rpx 34rpx rgba(53,214,166,0.2); } .main-btn { background: linear-gradient(135deg, #35D6A6, #4FB7FF); color: #fff; box-shadow: 0 14rpx 34rpx rgba(53,214,166,0.2); }
.full-btn { width: 100%; }
.main-btn.disabled { opacity: .45; } .main-btn.disabled { opacity: .45; }
.modal { position: fixed; inset: 0; z-index: 9999; background: rgba(18,52,47,0.2); display: flex; align-items: center; justify-content: center; padding: 46rpx; } .modal { position: fixed; inset: 0; z-index: 9999; background: rgba(18,52,47,0.2); display: flex; align-items: center; justify-content: center; padding: 46rpx; }
.modal-card { width: 100%; border-radius: 42rpx; background: #fff; padding: 42rpx; text-align: center; } .modal-card { width: 100%; border-radius: 42rpx; background: #fff; padding: 42rpx; text-align: center; }
.modal-title { font-size: 40rpx; font-weight: 900; } .modal-title { font-size: 40rpx; font-weight: 900; }
.modal-sub { margin: 18rpx 0 30rpx; color: #6B817D; font-size: 26rpx; line-height: 1.55; } .modal-sub { margin: 18rpx 0 30rpx; color: #6B817D; font-size: 26rpx; line-height: 1.55; }
.invite-share { margin: 0 0 18rpx; height: 76rpx; line-height: 76rpx; border-radius: 999rpx; background: linear-gradient(135deg, #35D6A6, #FFB84D); color: #fff; font-size: 27rpx; font-weight: 900; box-shadow: 0 14rpx 30rpx rgba(53,214,166,.18); } .invite-share { margin: 0 0 18rpx; height: 76rpx; line-height: 76rpx; border-radius: 999rpx; background: linear-gradient(135deg, #35D6A6, #FFB84D); color: #fff; font-size: 27rpx; font-weight: 900; box-shadow: 0 14rpx 30rpx rgba(53,214,166,.18); }
.reward-modal { text-align: left; }
.reward-modal .modal-title, .reward-modal .modal-sub { text-align: center; }
.reward-modal-grid { display: flex; flex-direction: column; gap: 18rpx; margin-bottom: 26rpx; }
.reward-modal-panel { padding: 18rpx; border-radius: 26rpx; background: #F5FBFA; border: 2rpx solid rgba(53,214,166,0.12); }
.reward-modal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12rpx; }
.reward-modal-head text:first-child { color: #12342F; font-size: 26rpx; font-weight: 900; }
.reward-modal-head text:last-child { color: #8AA09C; font-size: 21rpx; font-weight: 800; }
.reward-record-list { display: flex; flex-direction: column; gap: 10rpx; }
.reward-record-row { min-height: 58rpx; display: flex; align-items: center; gap: 12rpx; }
.reward-record-row .reward-content { align-self: flex-start; display: inline-flex; width: fit-content; max-width: 100%; margin-top: 6rpx; padding: 4rpx 12rpx; border-radius: 999rpx; font-size: 20rpx; font-weight: 900; line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.reward-record-row .reward-content.personal { color: #D88400; background: linear-gradient(135deg, rgba(255,184,77,0.22), rgba(255,245,214,0.96)); border: 2rpx solid rgba(255,184,77,0.46); box-shadow: 0 6rpx 14rpx rgba(255,184,77,0.12); }
.reward-record-row .reward-content.college { color: #16A779; background: linear-gradient(135deg, rgba(53,214,166,0.18), rgba(235,255,249,0.96)); border: 2rpx solid rgba(53,214,166,0.36); box-shadow: 0 6rpx 14rpx rgba(53,214,166,0.10); }
.college-modal { text-align: left; } .college-modal { text-align: left; }
.college-modal .modal-title, .college-modal .modal-sub { text-align: center; } .college-modal .modal-title, .college-modal .modal-sub { text-align: center; }
.college-list { max-height: 560rpx; margin-bottom: 24rpx; } .college-list { max-height: 560rpx; margin-bottom: 24rpx; }

212
package1/planet/drawResult.vue

@ -27,16 +27,36 @@
<view v-else class="dr-empty">本商圈暂未开奖敬请期待 🌌</view> <view v-else class="dr-empty">本商圈暂未开奖敬请期待 🌌</view>
<view class="dr-winners" v-if="history && history.length"> <view class="dr-winners" v-if="history && history.length">
<view class="dr-sec-title">最近10期中奖记录</view> <view class="dr-sec-head">
<view>
<view class="dr-sec-kicker">RECENT DRAWS</view>
<view class="dr-sec-title">最近10期中奖记录</view>
</view>
<view class="dr-sec-count">{{history.length}}</view>
</view>
<view class="dr-history" v-for="(h, hi) in history" :key="hi"> <view class="dr-history" v-for="(h, hi) in history" :key="hi">
<view class="dr-history-head"> <view class="dr-history-mark">
<text> {{h.record && h.record.periodNo}} </text> <view class="dr-history-dot"></view>
<text>{{drawDate(h.record && h.record.drawTime)}}</text> <view class="dr-history-line"></view>
</view> </view>
<view class="dr-winner" v-for="(w, i) in h.winners" :key="i"> <view class="dr-history-body">
<text class="dr-w-level" :class="'lv'+w.rewardLevel">{{w.levelName}}</text> <view class="dr-history-head">
<text class="dr-w-name">{{maskName(w.userName)}}</text> <view>
<text class="dr-w-amount">{{Number(w.amount||0).toFixed(2)}}</text> <view class="dr-history-label"> {{h.record && h.record.periodNo}} </view>
<view class="dr-history-sub">本期中奖名单</view>
</view>
<view class="dr-history-date">{{drawDate(h.record && h.record.drawTime)}}</view>
</view>
<view class="dr-winner-list" v-if="h.winners && h.winners.length">
<view class="dr-winner" v-for="(w, i) in h.winners" :key="i">
<view class="dr-winner-left">
<text class="dr-w-level" :class="'lv'+w.rewardLevel">{{w.levelName}}</text>
<text class="dr-w-name">{{maskName(w.userName)}}</text>
</view>
<text class="dr-w-amount">{{Number(w.amount||0).toFixed(2)}}</text>
</view>
</view>
<view v-else class="dr-history-empty">本期暂无中奖用户</view>
</view> </view>
</view> </view>
</view> </view>
@ -188,7 +208,7 @@
.nav-back { .nav-back {
position: absolute; position: absolute;
left: 24rpx; left: 24rpx;
bottom: 12rpx; bottom: 14rpx;
width: 56rpx; width: 56rpx;
height: 56rpx; height: 56rpx;
border-radius: 50%; border-radius: 50%;
@ -201,7 +221,10 @@
.nav-back-icon { .nav-back-icon {
color: #12342F; color: #12342F;
font-size: 42rpx; font-size: 64rpx;
font-weight: 500;
padding-right: 4rpx;
padding-bottom: 10rpx;
line-height: 1; line-height: 1;
transform: translateY(-2rpx); transform: translateY(-2rpx);
} }
@ -296,64 +319,191 @@
font-size: 26rpx; font-size: 26rpx;
} }
.dr-winners {
margin-top: 34rpx;
padding: 28rpx 22rpx 12rpx;
border-radius: 38rpx;
background:
linear-gradient(180deg, rgba(255,255,255,0.86), rgba(255,255,255,0.56)),
radial-gradient(circle at 88% 2%, rgba(79,183,255,0.16), transparent 38%);
border: 1rpx solid rgba(255,255,255,0.94);
box-shadow: 0 22rpx 52rpx rgba(35,107,96,0.09);
}
.dr-sec-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 22rpx;
padding: 0 4rpx;
}
.dr-sec-kicker {
color: #8DA8A2;
font-size: 18rpx;
font-weight: 900;
letter-spacing: 2rpx;
}
.dr-sec-title { .dr-sec-title {
margin: 32rpx 0 18rpx; margin-top: 6rpx;
color: #12342F; color: #12342F;
font-size: 30rpx; font-size: 32rpx;
font-weight: 900; font-weight: 900;
} }
.dr-winner { .dr-sec-count {
display: flex; padding: 8rpx 18rpx;
align-items: center; border-radius: 999rpx;
padding: 22rpx 24rpx; background: rgba(53,214,166,0.12);
margin-bottom: 14rpx; color: #22B889;
border-radius: 28rpx; font-size: 22rpx;
background: rgba(255,255,255,0.72); font-weight: 900;
border: 1rpx solid rgba(255,255,255,0.9);
box-shadow: 0 12rpx 28rpx rgba(53,214,166,0.08);
} }
.dr-history { .dr-history {
margin-bottom: 22rpx; position: relative;
padding: 20rpx; display: flex;
margin-bottom: 20rpx;
}
.dr-history-mark {
position: relative;
width: 34rpx;
flex: 0 0 34rpx;
display: flex;
justify-content: center;
}
.dr-history-dot {
position: relative;
z-index: 2;
width: 16rpx;
height: 16rpx;
margin-top: 32rpx;
border-radius: 50%;
background: linear-gradient(135deg, #35D6A6, #4FB7FF);
box-shadow: 0 0 0 8rpx rgba(53,214,166,0.14);
}
.dr-history-line {
position: absolute;
top: 48rpx;
bottom: -24rpx;
width: 2rpx;
background: linear-gradient(180deg, rgba(53,214,166,0.3), rgba(79,183,255,0));
}
.dr-history:last-child .dr-history-line {
display: none;
}
.dr-history-body {
flex: 1;
overflow: hidden;
padding: 24rpx;
border-radius: 30rpx; border-radius: 30rpx;
background: rgba(255,255,255,0.58); background: rgba(255,255,255,0.82);
border: 1rpx solid rgba(255,255,255,0.86); border: 1rpx solid rgba(255,255,255,0.95);
box-shadow: 0 14rpx 34rpx rgba(56,98,91,0.08);
} }
.dr-history-head { .dr-history-head {
display: flex; display: flex;
align-items: flex-start;
justify-content: space-between; justify-content: space-between;
margin-bottom: 12rpx; margin-bottom: 18rpx;
color: #42635E; }
.dr-history-label {
color: #315C55;
font-size: 24rpx; font-size: 24rpx;
font-weight: 900; font-weight: 900;
} }
.dr-history-sub {
margin-top: 6rpx;
color: #9AA9A5;
font-size: 20rpx;
font-weight: 700;
}
.dr-history-date {
padding: 6rpx 14rpx;
border-radius: 999rpx;
background: rgba(18,52,47,0.06);
color: #42635E;
font-size: 22rpx;
font-weight: 800;
}
.dr-winner-list {
padding-top: 2rpx;
}
.dr-winner {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18rpx 0;
border-top: 1rpx solid rgba(18,52,47,0.06);
}
.dr-winner:first-child {
border-top: 0;
padding-top: 0;
}
.dr-winner:last-child {
padding-bottom: 0;
}
.dr-winner-left {
min-width: 0;
flex: 1;
display: flex;
align-items: center;
}
.dr-history-empty {
padding: 18rpx 0 2rpx;
border-top: 1rpx solid rgba(18,52,47,0.06);
color: #9AA9A5;
font-size: 22rpx;
font-weight: 700;
}
.dr-w-level { .dr-w-level {
font-size: 22rpx; font-size: 22rpx;
padding: 2rpx 14rpx; line-height: 34rpx;
border-radius: 8rpx; padding: 0 16rpx;
border-radius: 999rpx;
background: rgba(53,214,166,0.14); background: rgba(53,214,166,0.14);
color: #22B889; color: #22B889;
font-weight: 900;
white-space: nowrap;
} }
.dr-w-level.lv1 { background: rgba(255,122,89,0.14); color: #FF7A59; } .dr-w-level.lv1 { background: rgba(255,122,89,0.14); color: #FF7A59; }
.dr-w-level.lv2 { background: rgba(255,184,77,0.18); color: #C98716; } .dr-w-level.lv2 { background: rgba(255,184,77,0.18); color: #C98716; }
.dr-w-name { .dr-w-name {
flex: 1; min-width: 0;
margin-left: 18rpx; margin-left: 18rpx;
color: #12342F; color: #12342F;
font-size: 26rpx; font-size: 26rpx;
font-weight: 700; font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
} }
.dr-w-amount { .dr-w-amount {
color: #22B889; color: #22B889;
font-size: 28rpx; font-size: 28rpx;
font-weight: 700; font-weight: 900;
margin-left: 16rpx;
white-space: nowrap;
} }
.dr-my-item { .dr-my-item {

172
package1/planet/index.vue

@ -44,7 +44,6 @@
<planet-daily-loop <planet-daily-loop
:data="home.dailyLoop" :data="home.dailyLoop"
:my-ticket-count="home.myTicketCount" :my-ticket-count="home.myTicketCount"
@more="goMore"
@join="onJoinPool"> @join="onJoinPool">
</planet-daily-loop> </planet-daily-loop>
@ -52,16 +51,32 @@
<view class="planet-quick-row"> <view class="planet-quick-row">
<planet-box <planet-box
class="quick-box"
compact compact
:available="home.boxAvailable" :available="home.boxAvailable"
:opening="boxOpening" :opening="boxOpening"
@open="openBox"> @open="openBox">
</planet-box> </planet-box>
<planet-me <view class="planet-side-col">
compact <view class="planet-map-card" @tap="goMore">
:data="home" <view class="planet-map-orb"></view>
@sign="onSign"> <view class="planet-map-head">
</planet-me> <text class="planet-map-title">星球补给地图</text>
<text class="planet-map-btn">进入</text>
</view>
<view class="planet-map-plays">
<text>下单得券</text>
<text>种树得券</text>
<text>防御塔升级</text>
</view>
</view>
<planet-me
class="quick-me"
compact
:data="home"
@sign="onSign">
</planet-me>
</view>
</view> </view>
<view class="bottom-space"></view> <view class="bottom-space"></view>
@ -108,7 +123,7 @@
<view class="pool-detail-head"> <view class="pool-detail-head">
<view> <view>
<view class="pool-detail-kicker">CURRENT POOL</view> <view class="pool-detail-kicker">CURRENT POOL</view>
<view class="pool-detail-title">本期奖池详情</view> <view class="pool-detail-title">本期奖池规则</view>
</view> </view>
<view class="pool-detail-close" @tap="poolRuleVisible=false">×</view> <view class="pool-detail-close" @tap="poolRuleVisible=false">×</view>
</view> </view>
@ -128,7 +143,7 @@
</view> </view>
<view class="pool-detail-item"> <view class="pool-detail-item">
<text>{{(home.dailyLoop && home.dailyLoop.myWeightTickets) || 0}}</text> <text>{{(home.dailyLoop && home.dailyLoop.myWeightTickets) || 0}}</text>
<text>我的权重</text> <text>我的概率</text>
</view> </view>
</view> </view>
<view class="reward-list" v-if="home.rewardList && home.rewardList.length"> <view class="reward-list" v-if="home.rewardList && home.rewardList.length">
@ -137,30 +152,30 @@
<text>{{Number(r.amount || 0).toFixed(2)}} × {{r.quota || 0}}</text> <text>{{Number(r.amount || 0).toFixed(2)}} × {{r.quota || 0}}</text>
</view> </view>
</view> </view>
<view class="pool-rule">投入越多权重越高但权重会递减每人每期最多中一次概率仅为实时估算</view> <view class="pool-rule">投入越多概率越高但权重会递减每人每期最多中一次概率仅为实时估算</view>
</view> </view>
</view> </view>
<view v-if="guideVisible" class="guide-mask" @tap="guideVisible=false"> <view v-if="guideVisible" class="guide-mask" @tap="guideVisible=false">
<view class="guide-card" @tap.stop> <view class="guide-card" @tap.stop>
<view class="guide-kicker">BANJINLI GUIDE</view> <view class="guide-kicker">BANJINGLI GUIDE</view>
<view class="guide-title">白嫖星球玩法说明书</view> <view class="guide-title">白嫖星球玩法说明书</view>
<view class="guide-list"> <view class="guide-list">
<view class="guide-item"> <view class="guide-item">
<text>1</text> <text>1</text>
<view>每天签到开补给箱玩学院排位赛都能获得星球券</view> <view>每天签到开补给箱玩学院排位赛都能获得星球券和现金奖励</view>
</view> </view>
<view class="guide-item"> <view class="guide-item">
<text>2</text> <text>2</text>
<view>把星球券投入奖池券越多开奖时瓜分现金奖励的权重越高</view> <view>把星球券投入奖池券越多开奖时瓜分现金奖励的概率越高</view>
</view> </view>
<view class="guide-item"> <view class="guide-item">
<text>3</text> <text>3</text>
<view>排行榜里可以发起星际追查有机会从榜上同学那里追回补给</view> <view>财富排名里可以发起星际追查可以互相偷取星球</view>
</view> </view>
<view class="guide-item"> <view class="guide-item">
<text>4</text> <text>4</text>
<view>补给地图保留农场券树防御塔和校园下单给券任务适合每天顺手经营</view> <view>补给地图农场券树防御塔和校园下单给券任务适合每天顺手经营</view>
</view> </view>
</view> </view>
<view class="guide-btn" @tap="guideVisible=false">知道怎么玩了</view> <view class="guide-btn" @tap="guideVisible=false">知道怎么玩了</view>
@ -758,13 +773,27 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: rgba(243,255,244,0.9); background:
radial-gradient(circle at 50% 260rpx, rgba(255,255,255,0.72), rgba(255,255,255,0) 360rpx),
linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 100%);
overflow: visible;
}
.nav:after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: -18rpx;
height: 20rpx;
background: linear-gradient(180deg, #EAF8FF 0%, rgba(234,248,255,0));
pointer-events: none;
} }
.nav-back { .nav-back {
position: absolute; position: absolute;
left: 24rpx; left: 24rpx;
bottom: 12rpx; bottom: 14rpx;
width: 56rpx; width: 56rpx;
height: 56rpx; height: 56rpx;
border-radius: 50%; border-radius: 50%;
@ -777,8 +806,10 @@
.nav-back-icon { .nav-back-icon {
color: #12342F; color: #12342F;
font-size: 42rpx; font-size: 64rpx;
font-weight: 300; font-weight: 500;
padding-bottom: 10rpx;
padding-right: 4rpx;
line-height: 1; line-height: 1;
transform: translateY(-2rpx); transform: translateY(-2rpx);
} }
@ -827,7 +858,7 @@
width: 100%; width: 100%;
max-height: 78vh; max-height: 78vh;
overflow-y: auto; overflow-y: auto;
background: linear-gradient(155deg, rgba(255,255,255,0.97), rgba(240,255,248,0.9)); background: #fff;
} }
.pool-detail-head { .pool-detail-head {
@ -934,10 +965,111 @@
.planet-quick-row { .planet-quick-row {
margin-top: 24rpx; margin-top: 24rpx;
display: flex; display: flex;
gap: 18rpx; gap: 16rpx;
align-items: stretch; align-items: stretch;
} }
.quick-box {
width: calc((100% - 16rpx) / 2);
flex: 0 0 calc((100% - 16rpx) / 2);
min-height: 368rpx;
}
.planet-side-col {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 14rpx;
}
.planet-map-card {
min-height: 164rpx;
padding: 20rpx 18rpx;
box-sizing: border-box;
border-radius: 32rpx;
background:
radial-gradient(circle at 18% 30%, rgba(53,214,166,0.16), transparent 24%),
radial-gradient(circle at 86% 18%, rgba(79,183,255,0.18), transparent 28%),
linear-gradient(145deg, #FFFFFF, #E5FFF1);
color: #22B889;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
box-shadow: 0 14rpx 28rpx rgba(53,214,166,0.16);
border: 2rpx solid rgba(255,255,255,0.96);
position: relative;
overflow: hidden;
}
.planet-map-orb {
position: absolute;
left: 14rpx;
top: 20rpx;
width: 30rpx;
height: 30rpx;
border-radius: 50%;
background: linear-gradient(145deg, #B9FFE3, #4FB7FF);
box-shadow: 0 0 22rpx rgba(53,214,166,0.28);
opacity: .72;
}
.planet-map-head {
position: relative;
width: 100%;
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10rpx;
}
.planet-map-title {
flex: 1;
color: #13A77C;
font-size: 24rpx;
font-weight: 900;
line-height: 1.18;
text-align: right;
white-space: nowrap;
}
.planet-map-btn {
position: relative;
padding: 5rpx 15rpx;
border-radius: 999rpx;
background: linear-gradient(135deg, #35D6A6, #4FB7FF);
color: #FFFFFF;
font-size: 18rpx;
font-weight: 900;
box-shadow: 0 10rpx 20rpx rgba(53,214,166,0.2);
white-space: nowrap;
}
.planet-map-plays {
position: relative;
width: 100%;
display: flex;
flex-wrap: wrap;
gap: 8rpx;
}
.planet-map-plays text {
padding: 7rpx 10rpx;
border-radius: 999rpx;
background: rgba(255,255,255,0.66);
color: #42635E;
font-size: 18rpx;
font-weight: 900;
line-height: 1;
box-shadow: inset 0 1rpx 0 rgba(255,255,255,0.86);
}
.quick-me {
flex: 1;
min-height: 0;
}
/* 骨架屏 */ /* 骨架屏 */
.skeleton { .skeleton {
padding-top: 22rpx; padding-top: 22rpx;

60
package1/planet/more.vue

@ -1,8 +1,14 @@
<template> <template>
<view class="more" :style="{'--statusbar': statusBarHeight + 'px'}"> <view class="more" :style="{'--statusbar': statusBarHeight + 'px'}">
<view class="nav" :style="{paddingTop: statusBarHeight + 'px'}"> <!-- <view class="nav" :style="{paddingTop: statusBarHeight + 'px'}">
<view class="nav-back" @tap="goBack"><text></text></view> <view class="nav-back" @tap="goBack"><text></text></view>
<view class="nav-title">星球补给地图</view> <view class="nav-title">星球补给地图</view>
</view> -->
<view class="nav" :style="{height: navHeight + 'px', paddingTop: statusBarHeight + 'px'}">
<view class="nav-back" @tap="goBack">
<text class="nav-back-icon"></text>
</view>
<view class="nav-title">星球排行榜</view>
</view> </view>
<scroll-view scroll-y class="page" :scroll-into-view="scrollTarget" :scroll-top="scrollTop" scroll-with-animation :style="{paddingTop: (statusBarHeight + 58) + 'px'}"> <scroll-view scroll-y class="page" :scroll-into-view="scrollTarget" :scroll-top="scrollTop" scroll-with-animation :style="{paddingTop: (statusBarHeight + 58) + 'px'}">
@ -51,7 +57,7 @@
<text class="guide-icon">🛡</text> <text class="guide-icon">🛡</text>
<view> <view>
<text>升防御塔</text> <text>升防御塔</text>
<text>提高被偷券时的拦截反击和伤害能力</text> <text>提高被偷券时的拦截反击能力</text>
</view> </view>
<text class="guide-action" @tap.stop="scrollToSupply('operate')">去完成</text> <text class="guide-action" @tap.stop="scrollToSupply('operate')">去完成</text>
</view> </view>
@ -113,7 +119,7 @@
</view> </view>
<view class="tree-input-tip"> <view class="tree-input-tip">
<text>🌱</text> <text>🌱</text>
<text>成熟后返还本金和收益超过范围会无法种植</text> <text>成熟后返还本金和收益超过范围会无法种植收益券数会向下取整</text>
</view> </view>
<view class="tree-input-actions"> <view class="tree-input-actions">
<view @tap="closeTreeInput">取消</view> <view @tap="closeTreeInput">取消</view>
@ -139,6 +145,7 @@
return { return {
statusBarHeight: 20, statusBarHeight: 20,
loading: true, loading: true,
navHeight: 64,
userId: '', userId: '',
regionId: '', regionId: '',
nickname: '', nickname: '',
@ -342,9 +349,50 @@
background: linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 46%, #FFF8DE 100%); background: linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 46%, #FFF8DE 100%);
color: #12342F; color: #12342F;
} }
.nav { position: fixed; top: 0; left: 0; right: 0; height: 44px; z-index: 20; display: flex; align-items: center; justify-content: center; box-sizing: content-box; background: linear-gradient(180deg, rgba(243,255,244,0.96), rgba(243,255,244,0)); } .nav {
.nav-back { position: absolute; left: 20rpx; bottom: 0; height: 44px; width: 60rpx; display: flex; align-items: center; justify-content: center; } position: fixed;
.nav-back text { color: #12342F; font-size: 48rpx; font-weight: 300; } top: 30rpx;
left: 0;
right: 0;
z-index: 20;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
background: rgba(243,255,244,0.9);
}
.nav-back {
position: absolute;
left: 24rpx;
bottom: 1rpx;
width: 56rpx;
height: 56rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255,255,255,.72);
box-shadow: 0 8rpx 20rpx rgba(18,52,47,.08);
}
.nav-back-icon {
color: #12342F;
font-size: 64rpx;
font-weight: 500;
padding-bottom: 10rpx;
padding-right: 4rpx;
line-height: 1;
transform: translateY(-2rpx);
}
.nav-title {
color: #12342F;
font-size: 32rpx;
font-weight: 900;
letter-spacing: 1rpx;
padding-bottom: 14rpx;
}
.nav-title { color: #12342F; font-size: 34rpx; font-weight: 900; align-self: flex-end; padding-bottom: 6rpx; } .nav-title { color: #12342F; font-size: 34rpx; font-weight: 900; align-self: flex-end; padding-bottom: 6rpx; }
.page { height: 100vh; box-sizing: border-box; padding-left: 22rpx; padding-right: 22rpx; } .page { height: 100vh; box-sizing: border-box; padding-left: 22rpx; padding-right: 22rpx; }
.loading-card { margin-top: 24rpx; height: 220rpx; border-radius: 38rpx; background: rgba(255,255,255,0.76); display: flex; align-items: center; justify-content: center; color: #6B817D; font-size: 26rpx; } .loading-card { margin-top: 24rpx; height: 220rpx; border-radius: 38rpx; background: rgba(255,255,255,0.76); display: flex; align-items: center; justify-content: center; color: #6B817D; font-size: 26rpx; }

29
package1/planet/pkHall.vue

@ -9,7 +9,7 @@
<view class="hero"> <view class="hero">
<view class="hero-kicker">CAMPUS ARENA</view> <view class="hero-kicker">CAMPUS ARENA</view>
<view class="hero-title">同一关卡拼手速和决策</view> <view class="hero-title">同一关卡拼手速和决策</view>
<view class="hero-sub">独立于每日排位赛房间内所有人使用同一个 seed每人一次机会第一名通吃奖池</view> <view class="hero-sub">房间内使用同一个规则每人一次机会第一名通吃奖池</view>
<view class="create-btn" @tap="showCreate = true">创建房间</view> <view class="create-btn" @tap="showCreate = true">创建房间</view>
</view> </view>
@ -46,7 +46,7 @@
</view> </view>
<view class="record-card" v-for="record in myRecords" :key="record._key"> <view class="record-card" v-for="record in myRecords" :key="record._key">
<view class="record-main"> <view class="record-main">
<view class="record-title">{{record._title}}</view> <!-- <view class="record-title">{{record._title}}</view> -->
<view class="record-meta">{{record._meta}}</view> <view class="record-meta">{{record._meta}}</view>
</view> </view>
<view class="record-badge" :class="record._class">{{record._result}}</view> <view class="record-badge" :class="record._class">{{record._result}}</view>
@ -81,7 +81,7 @@
<view class="modal-title">创建星球擂台</view> <view class="modal-title">创建星球擂台</view>
<input class="field" v-model="form.roomName" placeholder="房间名称" /> <input class="field" v-model="form.roomName" placeholder="房间名称" />
<input class="field" v-model.number="form.maxPlayers" type="number" placeholder="人数 2-5" /> <input class="field" v-model.number="form.maxPlayers" type="number" placeholder="人数 2-5" />
<input class="field" v-model.number="form.tickets" type="number" placeholder="入场券数量" /> <input class="field" v-model.number="form.tickets" type="number" min="1" placeholder="入场券数量" @blur="normalizeTickets" />
<input class="field" v-model="form.password" placeholder="私密房密码,不填则公开" /> <input class="field" v-model="form.password" placeholder="私密房密码,不填则公开" />
<view class="modal-actions"> <view class="modal-actions">
<view class="sub-btn" @tap="showCreate = false">取消</view> <view class="sub-btn" @tap="showCreate = false">取消</view>
@ -126,7 +126,7 @@
form: { form: {
roomName: '今晚冲榜局', roomName: '今晚冲榜局',
maxPlayers: '', maxPlayers: '',
tickets: '', tickets: 1,
password: '' password: ''
} }
} }
@ -210,9 +210,9 @@
}, },
switchTab(tab) { switchTab(tab) {
this.activeTab = tab this.activeTab = tab
if (tab === 'myRooms' && !this.myRooms.length) this.loadMyRooms(true) if (tab === 'myRooms') this.loadMyRooms(true)
if (tab === 'myRecords' && !this.myRecords.length) this.loadMyRecords(true) if (tab === 'myRecords') this.loadMyRecords(true)
if (tab === 'hotRooms' && !this.hotRooms.length) this.loadHotRooms(true) if (tab === 'hotRooms') this.loadHotRooms(true)
}, },
loadPageList(type, reset) { loadPageList(type, reset) {
const config = { const config = {
@ -334,11 +334,7 @@
this.shareRoom = room this.shareRoom = room
}, },
createRoom() { createRoom() {
const tickets = Number(this.form.tickets || 1) const tickets = this.normalizeTickets()
if (tickets <= 0) {
this.tui.toast('请输入入场券数量')
return
}
if (this.myTicketCount === null) { if (this.myTicketCount === null) {
this.loadTicketCount().then(() => { this.loadTicketCount().then(() => {
this.createRoom() this.createRoom()
@ -374,6 +370,11 @@
this.joinRoom(res.result) this.joinRoom(res.result)
}) })
}, },
normalizeTickets() {
const tickets = parseInt(this.form.tickets || 1, 10)
this.form.tickets = Number.isNaN(tickets) || tickets < 1 ? 1 : tickets
return this.form.tickets
},
joinRoom(room) { joinRoom(room) {
this.tui.request('/app/planet/adventure/pk/roomInfo', 'POST', { this.tui.request('/app/planet/adventure/pk/roomInfo', 'POST', {
userId: this.userId, userId: this.userId,
@ -489,7 +490,7 @@
.arena { min-height: 100vh; background: linear-gradient(155deg, #F7F2FF 0%, #EAF8FF 46%, #FFF7DE 100%); color: #172033; } .arena { min-height: 100vh; background: linear-gradient(155deg, #F7F2FF 0%, #EAF8FF 46%, #FFF7DE 100%); color: #172033; }
.nav { position: fixed; top: 0; left: 0; right: 0; z-index: 20; box-sizing: border-box; display: flex; align-items: center; justify-content: center; background: rgba(247,242,255,.9); } .nav { position: fixed; top: 0; left: 0; right: 0; z-index: 20; box-sizing: border-box; display: flex; align-items: center; justify-content: center; background: rgba(247,242,255,.9); }
.nav-back { position: absolute; left: 24rpx; bottom: 12rpx; width: 56rpx; height: 56rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: rgba(255,255,255,.72); color: #172033; box-shadow: 0 8rpx 20rpx rgba(23,32,51,.08); } .nav-back { position: absolute; left: 24rpx; bottom: 12rpx; width: 56rpx; height: 56rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: rgba(255,255,255,.72); color: #172033; box-shadow: 0 8rpx 20rpx rgba(23,32,51,.08); }
.nav-back text { font-size: 42rpx; line-height: 1; transform: translateY(-2rpx); } .nav-back text { padding-bottom: 14rpx;padding-right: 4rpx;font-size: 62rpx; line-height: 1;font-weight: 500; transform: translateY(-2rpx); }
.nav-title { padding-bottom: 14rpx; font-size: 32rpx; font-weight: 900; } .nav-title { padding-bottom: 14rpx; font-size: 32rpx; font-weight: 900; }
.page { height: 100vh; box-sizing: border-box; padding-left: 24rpx; padding-right: 24rpx; } .page { height: 100vh; box-sizing: border-box; padding-left: 24rpx; padding-right: 24rpx; }
.hero, .section, .panel { margin-bottom: 24rpx; border-radius: 42rpx; background: rgba(255,255,255,.84); padding: 30rpx; box-shadow: 0 18rpx 48rpx rgba(124,58,237,.10); } .hero, .section, .panel { margin-bottom: 24rpx; border-radius: 42rpx; background: rgba(255,255,255,.84); padding: 30rpx; box-shadow: 0 18rpx 48rpx rgba(124,58,237,.10); }
@ -521,7 +522,7 @@
.record-card { margin-top: 16rpx; padding: 24rpx; border-radius: 30rpx; background: linear-gradient(135deg, rgba(255,255,255,.94), rgba(247,250,255,.84)); display: flex; align-items: center; justify-content: space-between; border: 2rpx solid rgba(124,58,237,.10); } .record-card { margin-top: 16rpx; padding: 24rpx; border-radius: 30rpx; background: linear-gradient(135deg, rgba(255,255,255,.94), rgba(247,250,255,.84)); display: flex; align-items: center; justify-content: space-between; border: 2rpx solid rgba(124,58,237,.10); }
.record-main { flex: 1; min-width: 0; } .record-main { flex: 1; min-width: 0; }
.record-title { color: #172033; font-size: 29rpx; font-weight: 900; } .record-title { color: #172033; font-size: 29rpx; font-weight: 900; }
.record-meta { margin-top: 8rpx; color: #667085; font-size: 22rpx; } .record-meta { margin-top: 8rpx; color: #667085; font-size: 24rpx; }
.record-badge { margin-left: 18rpx; min-width: 110rpx; height: 58rpx; line-height: 58rpx; border-radius: 999rpx; text-align: center; font-size: 23rpx; font-weight: 900; background: #EEF2FF; color: #7C3AED; } .record-badge { margin-left: 18rpx; min-width: 110rpx; height: 58rpx; line-height: 58rpx; border-radius: 999rpx; text-align: center; font-size: 23rpx; font-weight: 900; background: #EEF2FF; color: #7C3AED; }
.record-badge.win { background: linear-gradient(135deg, #FFB84D, #FF7A59); color: #fff; box-shadow: 0 12rpx 24rpx rgba(255,122,89,.18); } .record-badge.win { background: linear-gradient(135deg, #FFB84D, #FF7A59); color: #fff; box-shadow: 0 12rpx 24rpx rgba(255,122,89,.18); }
.record-badge.lose { background: #FEE2E2; color: #EF4444; } .record-badge.lose { background: #FEE2E2; color: #EF4444; }

75
package1/planet/rank.vue

@ -1,8 +1,14 @@
<template> <template>
<view class="rank-page" :style="{'--statusbar': statusBarHeight + 'px'}"> <view class="rank-page" :style="{'--statusbar': statusBarHeight + 'px'}">
<view class="nav" :style="{paddingTop: statusBarHeight + 'px'}"> <!-- <view class="nav" :style="{paddingTop: statusBarHeight + 'px'}">
<view class="nav-back" @tap="goBack"><text></text></view> <view class="nav-back" @tap="goBack"><text></text></view>
<view class="nav-title">星球排行榜</view> <view class="nav-title">星球排行榜</view>
</view> -->
<view class="nav" :style="{height: navHeight + 'px', paddingTop: statusBarHeight + 'px'}">
<view class="nav-back" @tap="goBack">
<text class="nav-back-icon"></text>
</view>
<view class="nav-title">星球排行榜</view>
</view> </view>
<scroll-view scroll-y enhanced :show-scrollbar="false" class="page" :style="{paddingTop: (statusBarHeight + 58) + 'px'}" @scrolltolower="loadMore"> <scroll-view scroll-y enhanced :show-scrollbar="false" class="page" :style="{paddingTop: (statusBarHeight + 58) + 'px'}" @scrolltolower="loadMore">
@ -40,16 +46,16 @@
<view class="podium-kicker">TOP HUNTERS ARE WATCHING</view> <view class="podium-kicker">TOP HUNTERS ARE WATCHING</view>
<view class="podium-title">前三领奖台</view> <view class="podium-title">前三领奖台</view>
</view> </view>
<view class="podium-prize">抢榜越高 · 越容易被盯上</view> <view class="podium-prize">排名越高 · 越容易被盯上</view>
</view> </view>
<view class="reward-rule"> <view class="reward-rule">
<view class="reward-main">每日 21:30 按校区分别结算有券 5 名瓜分星球券</view> <view class="reward-main">每日 21:30 按校区分别结算排行榜 5 名瓜分星球券</view>
<view class="reward-chips"> <view class="reward-chips">
<text>第1名 +5</text> <text>第1名 +5</text>
<text>第2名 +4</text> <text>第2名 +4</text>
<text>第3名 +3</text> <text>第3名 +3</text>
<text>第4名 +2</text> <text>第4名 +2</text>
<text>第5名 +1</text> <text>第5名 +1</text>
</view> </view>
</view> </view>
<view class="podium-stage"> <view class="podium-stage">
@ -155,6 +161,7 @@
return { return {
statusBarHeight: 20, statusBarHeight: 20,
loading: true, loading: true,
navHeight: 64,
userId: '', userId: '',
regionId: '', regionId: '',
nickname: '', nickname: '',
@ -365,10 +372,50 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.rank-page { min-height: 100vh; background: linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 46%, #FFF7DD 100%); color: #12342F; } .rank-page { min-height: 100vh; background: linear-gradient(155deg, #F3FFF4 0%, #EAF8FF 46%, #FFF7DD 100%); color: #12342F; }
.nav { position: fixed; top: 0; left: 0; right: 0; height: 44px; z-index: 20; display: flex; align-items: center; justify-content: center; box-sizing: content-box; background: linear-gradient(180deg, rgba(243,255,244,0.98), rgba(243,255,244,0)); } .nav {
.nav-back { position: absolute; left: 20rpx; bottom: 0; height: 44px; width: 60rpx; display: flex; align-items: center; justify-content: center; } position: fixed;
.nav-back text { color: #12342F; font-size: 48rpx; font-weight: 300; } top: 30rpx;
.nav-title { color: #12342F; font-size: 34rpx; font-weight: 900; align-self: flex-end; padding-bottom: 6rpx; } left: 0;
right: 0;
z-index: 20;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
background: rgba(243,255,244,0.9);
}
.nav-back {
position: absolute;
left: 24rpx;
bottom: 1rpx;
width: 56rpx;
height: 56rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255,255,255,.72);
box-shadow: 0 8rpx 20rpx rgba(18,52,47,.08);
}
.nav-back-icon {
color: #12342F;
font-size: 64rpx;
font-weight: 500;
padding-bottom: 10rpx;
padding-right: 4rpx;
line-height: 1;
transform: translateY(-2rpx);
}
.nav-title {
color: #12342F;
font-size: 32rpx;
font-weight: 900;
letter-spacing: 1rpx;
padding-bottom: 14rpx;
}
.page { height: 100vh; box-sizing: border-box; padding-left: 22rpx; padding-right: 22rpx; } .page { height: 100vh; box-sizing: border-box; padding-left: 22rpx; padding-right: 22rpx; }
.loading-card, .empty-card { margin-top: 24rpx; height: 220rpx; border-radius: 38rpx; background: rgba(255,255,255,0.76); display: flex; align-items: center; justify-content: center; color: #6B817D; font-size: 26rpx; } .loading-card, .empty-card { margin-top: 24rpx; height: 220rpx; border-radius: 38rpx; background: rgba(255,255,255,0.76); display: flex; align-items: center; justify-content: center; color: #6B817D; font-size: 26rpx; }
.radar-card { position: relative; margin-top: 24rpx; min-height: 210rpx; padding: 30rpx 24rpx; border-radius: 46rpx; background: radial-gradient(circle at 18% 50%, rgba(255,122,89,0.16), transparent 34%), linear-gradient(135deg, rgba(255,255,255,0.9), rgba(255,246,219,0.7)); border: 2rpx solid rgba(255,255,255,0.94); box-shadow: 0 24rpx 58rpx rgba(255,122,89,0.12); display: flex; align-items: center; overflow: hidden; } .radar-card { position: relative; margin-top: 24rpx; min-height: 210rpx; padding: 30rpx 24rpx; border-radius: 46rpx; background: radial-gradient(circle at 18% 50%, rgba(255,122,89,0.16), transparent 34%), linear-gradient(135deg, rgba(255,255,255,0.9), rgba(255,246,219,0.7)); border: 2rpx solid rgba(255,255,255,0.94); box-shadow: 0 24rpx 58rpx rgba(255,122,89,0.12); display: flex; align-items: center; overflow: hidden; }
@ -383,7 +430,7 @@
.radar-kicker, .rank-kicker { color: #FF7A59; font-size: 18rpx; font-weight: 900; letter-spacing: 3rpx; } .radar-kicker, .rank-kicker { color: #FF7A59; font-size: 18rpx; font-weight: 900; letter-spacing: 3rpx; }
.radar-title { margin-top: 6rpx; color: #12342F; font-size: 38rpx; font-weight: 900; } .radar-title { margin-top: 6rpx; color: #12342F; font-size: 38rpx; font-weight: 900; }
.radar-sub { margin-top: 8rpx; color: #7E9691; font-size: 23rpx; line-height: 1.42; font-weight: 600; } .radar-sub { margin-top: 8rpx; color: #7E9691; font-size: 23rpx; line-height: 1.42; font-weight: 600; }
.radar-count { width: 112rpx; height: 112rpx; border-radius: 34rpx; background: linear-gradient(135deg, #FF7A59, #FFB84D); color: #FFFFFF; display: flex; flex-direction: column; align-items: center; justify-content: center; box-shadow: 0 12rpx 26rpx rgba(255,122,89,0.18); transform: rotate(4deg); flex-shrink: 0; } .radar-count { width: 102rpx; height: 102rpx; border-radius: 34rpx; background: linear-gradient(135deg, #FF7A59, #FFB84D); color: #FFFFFF; display: flex; flex-direction: column; align-items: center; justify-content: center; box-shadow: 0 12rpx 26rpx rgba(255,122,89,0.18); transform: rotate(4deg); flex-shrink: 0; }
.radar-count text:first-child { font-size: 40rpx; font-weight: 900; line-height: 42rpx; } .radar-count text:first-child { font-size: 40rpx; font-weight: 900; line-height: 42rpx; }
.radar-count text:last-child { font-size: 19rpx; font-weight: 800; margin-top: 4rpx; } .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-head { margin-top: 30rpx; display: flex; align-items: flex-end; justify-content: space-between; }
@ -395,7 +442,7 @@
.podium-head { position: relative; z-index: 1; display: flex; justify-content: space-between; gap: 16rpx; align-items: flex-start; } .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-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-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); } .podium-prize { max-width: 230rpx; 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-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-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 { margin-top: 12rpx; display: flex; flex-wrap: wrap; gap: 10rpx; }

33
package1/planet/ticketLog.vue

@ -16,7 +16,7 @@
<text class="tl-sum-num">{{balance}}</text> <text class="tl-sum-num">{{balance}}</text>
<text class="tl-sum-unit"></text> <text class="tl-sum-unit"></text>
</view> </view>
<view class="tl-sum-tip">星球券永久有效越多瓜分越多</view> <view class="tl-sum-tip">星球券永久有效的越多投入奖池后中奖概率越高</view>
</view> </view>
<view class="tl-tabs"> <view class="tl-tabs">
@ -154,6 +154,7 @@
const area = uni.getStorageSync('area') const area = uni.getStorageSync('area')
if (area) this.regionId = JSON.parse(area).id || '' if (area) this.regionId = JSON.parse(area).id || ''
} catch (e) {} } catch (e) {}
this.loadBalance()
this.loadPage(true) this.loadPage(true)
this.loadRaiders(true) this.loadRaiders(true)
}, },
@ -194,8 +195,6 @@
this.total = res.result.total || 0 this.total = res.result.total || 0
if (reset) { if (reset) {
this.list = records this.list = records
//
if (records.length) this.balance = records[0].balance
} else { } else {
this.list = this.list.concat(records) this.list = this.list.concat(records)
} }
@ -207,6 +206,21 @@
this.loading = false this.loading = false
}) })
}, },
loadBalance() {
if (!this.userId) return
this.tui.request('/app/planet/ticket/count', 'POST', {
userId: this.userId,
regionId: this.regionId
}, false, false, true).then((res) => {
if (res.code == 200 && res.result !== undefined && res.result !== null) {
const result = res.result
const count = typeof result === 'object'
? (result.myTicketCount ?? result.ticketCount ?? result.balance ?? result.count)
: result
this.balance = Number(count || 0)
}
})
},
loadMore() { loadMore() {
if (this.loading || this.noMore) return if (this.loading || this.noMore) return
this.pageNumber++ this.pageNumber++
@ -287,6 +301,7 @@
if (res.code == 200 && res.result) { if (res.code == 200 && res.result) {
this.huntModal.result = res.result this.huntModal.result = res.result
this.huntModal.phase = 'result' this.huntModal.phase = 'result'
this.loadBalance()
this.loadPage(true) this.loadPage(true)
this.loadRaiders(true) this.loadRaiders(true)
} else { } else {
@ -362,7 +377,7 @@
.nav-back { .nav-back {
position: absolute; position: absolute;
left: 24rpx; left: 24rpx;
bottom: 12rpx; bottom: 14rpx;
width: 56rpx; width: 56rpx;
height: 56rpx; height: 56rpx;
border-radius: 50%; border-radius: 50%;
@ -373,7 +388,15 @@
box-shadow: 0 8rpx 20rpx rgba(18,52,47,.08); box-shadow: 0 8rpx 20rpx rgba(18,52,47,.08);
} }
.nav-back-icon { color: #12342F; font-size: 42rpx; font-weight: 300; line-height: 1; transform: translateY(-2rpx); } .nav-back-icon {
color: #12342F;
font-size: 64rpx;
font-weight: 500;
padding-right: 4rpx;
padding-bottom: 10rpx;
line-height: 1;
transform: translateY(-2rpx);
}
.nav-title { .nav-title {
color: #12342F; color: #12342F;

2
package1/runErrand/runErrand.vue

@ -318,7 +318,7 @@
<view class="commission-popup-input"> <view class="commission-popup-input">
<text></text> <text></text>
<input type="digit" :value="commissionInputValue" placeholder="请输入佣金" <input type="digit" :value="commissionInputValue" placeholder="请输入佣金"
focus @input="onCommissionPopupInput" /> @input="onCommissionPopupInput" />
</view> </view>
<view class="commission-popup-actions"> <view class="commission-popup-actions">
<view class="commission-popup-cancel" @tap="$refs.commissionPopup.close()">取消</view> <view class="commission-popup-cancel" @tap="$refs.commissionPopup.close()">取消</view>

Loading…
Cancel
Save