|
|
@ -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; } |
|
|
|