新增获取游戏界面数据的API,并在Play.vue中处理登录成功后的游戏数据更新逻辑,优化状态管理和二维码处理流程。
This commit is contained in:
@@ -64,8 +64,9 @@
|
||||
<!-- 二维码过期 -->
|
||||
<div v-else class="qr-expired">
|
||||
<div class="warning-icon">⚠️</div>
|
||||
<p class="expired-text">扫码超时</p>
|
||||
<p class="expired-text">扫码超时{{ state.qrInfo.url}}</p>
|
||||
<p class="expired-desc">请手动刷新页面重新获取二维码</p>
|
||||
<img :src="state.qrInfo.url" class="qr-code" alt="扫码登录" />
|
||||
<button
|
||||
@click="handlePageRefresh"
|
||||
class="refresh-btn"
|
||||
@@ -189,7 +190,8 @@ import {
|
||||
selectRegion as selectRegionAPI,
|
||||
refreshLink as refreshLinkAPI,
|
||||
pollLoginStatus,
|
||||
getGameProgress
|
||||
getGameProgress,
|
||||
getGameInterface as getGameInterfaceAPI
|
||||
} from '@/api/play'
|
||||
|
||||
export default {
|
||||
@@ -257,14 +259,12 @@ export default {
|
||||
try {
|
||||
const response = await getLinkStatus(state.code)
|
||||
const data = response.data
|
||||
updateStateFromResponse(data)
|
||||
await updateStateFromResponse(data)
|
||||
|
||||
// 根据状态启动相应的定时器
|
||||
if (state.status === 'USING' && state.qrInfo) {
|
||||
startCountdown()
|
||||
startLoginPolling()
|
||||
} else if (state.status === 'LOGGED_IN') {
|
||||
startProgressPolling()
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
@@ -272,13 +272,80 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
// 获取游戏界面数据
|
||||
const getGameInterface = async () => {
|
||||
try {
|
||||
console.log('调用游戏界面接口,code:', state.code)
|
||||
const response = await getGameInterfaceAPI(state.code)
|
||||
console.log('游戏界面接口响应:', response.data)
|
||||
return response
|
||||
} catch (error) {
|
||||
console.error('获取游戏界面数据失败:', error)
|
||||
ElMessage.error('获取游戏界面数据失败')
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
// 处理登录成功状态
|
||||
const handleLoggedInStatus = async () => {
|
||||
try {
|
||||
console.log('检测到LOGGED_IN状态,获取游戏界面数据')
|
||||
const gameResponse = await getGameInterface()
|
||||
const gameData = gameResponse.data
|
||||
|
||||
console.log('游戏界面数据:', gameData)
|
||||
|
||||
// 更新状态
|
||||
state.status = 'LOGGED_IN'
|
||||
state.assets = gameData.assets
|
||||
|
||||
// 从游戏接口数据中更新总点数和当前进度
|
||||
if (gameData.assets && gameData.assets.totalPoints) {
|
||||
state.totalPoints = gameData.assets.totalPoints
|
||||
}
|
||||
// 初始化当前点数为0(代表刚开始)
|
||||
state.currentPoints = 0
|
||||
|
||||
clearTimer('loginPoll')
|
||||
clearTimer('countdown')
|
||||
ElMessage.success('登录成功,正在进入游戏界面...')
|
||||
|
||||
} catch (error) {
|
||||
console.error('获取游戏界面数据失败:', error)
|
||||
ElMessage.error('获取游戏数据失败,请稍后重试')
|
||||
}
|
||||
}
|
||||
|
||||
// 更新状态
|
||||
const updateStateFromResponse = (data, skipQrProcessing = false) => {
|
||||
const updateStateFromResponse = async (data, skipQrProcessing = false) => {
|
||||
// 如果状态是LOGGED_IN,调用游戏接口获取详细数据
|
||||
if (data.status === 'LOGGED_IN') {
|
||||
await handleLoggedInStatus()
|
||||
return
|
||||
}
|
||||
|
||||
state.status = data.status
|
||||
state.needRefresh = data.needRefresh || false
|
||||
state.region = data.region
|
||||
state.assets = data.assets
|
||||
|
||||
// 如果有游戏数据,更新点数信息
|
||||
if (data.assets && data.assets.totalPoints) {
|
||||
state.totalPoints = data.assets.totalPoints
|
||||
// 如果没有当前进度,初始化为0
|
||||
if (state.currentPoints === undefined) {
|
||||
state.currentPoints = 0
|
||||
}
|
||||
}
|
||||
|
||||
// 调试信息
|
||||
console.log('updateStateFromResponse:', {
|
||||
status: data.status,
|
||||
region: data.region,
|
||||
qrCodeUrl: data.qrCodeUrl,
|
||||
skipQrProcessing
|
||||
})
|
||||
|
||||
// 如果需要跳过二维码处理(延迟处理),则不立即设置 qrInfo
|
||||
if (skipQrProcessing) {
|
||||
return
|
||||
@@ -340,13 +407,17 @@ export default {
|
||||
const response = await selectRegionAPI({ code: state.code, region })
|
||||
const data = response.data
|
||||
|
||||
console.log('selectRegion 响应数据:', data)
|
||||
|
||||
// 如果返回了延迟时间和二维码URL,需要延迟处理
|
||||
if (data.qrDelaySeconds && data.qrDelaySeconds > 0 && data.qrCodeUrl) {
|
||||
console.log('进入延迟分支')
|
||||
// 跳过二维码处理,只更新基本状态
|
||||
updateStateFromResponse(data, true)
|
||||
await updateStateFromResponse(data, true)
|
||||
|
||||
state.qrDelaySeconds = data.qrDelaySeconds
|
||||
state.isWaitingQr = true
|
||||
console.log('设置状态:', { status: state.status, isWaitingQr: state.isWaitingQr })
|
||||
ElMessage.info(`正在准备二维码,请等待 ${data.qrDelaySeconds} 秒...`)
|
||||
|
||||
setTimeout(async () => {
|
||||
@@ -361,9 +432,11 @@ export default {
|
||||
}
|
||||
}, data.qrDelaySeconds * 1000)
|
||||
} else {
|
||||
console.log('进入立即处理分支')
|
||||
// 没有延迟时间,立即处理二维码
|
||||
updateStateFromResponse(data)
|
||||
await updateStateFromResponse(data)
|
||||
state.isWaitingQr = false
|
||||
console.log('设置状态:', { status: state.status, isWaitingQr: state.isWaitingQr, qrInfo: !!state.qrInfo })
|
||||
|
||||
if (state.status === 'USING') {
|
||||
startCountdown()
|
||||
@@ -428,12 +501,11 @@ export default {
|
||||
const response = await pollLoginStatus(state.code)
|
||||
const data = response.data
|
||||
|
||||
if (data.success && data.status === 'LOGGED_IN') {
|
||||
state.status = 'LOGGED_IN'
|
||||
state.assets = data.assets
|
||||
clearTimer('loginPoll')
|
||||
clearTimer('countdown')
|
||||
startProgressPolling()
|
||||
console.log('poll-login 响应数据:', data)
|
||||
|
||||
// 处理登录成功的情况(无论success是true还是false)
|
||||
if (data.status === 'LOGGED_IN') {
|
||||
await handleLoggedInStatus()
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
@@ -559,13 +631,17 @@ export default {
|
||||
|
||||
const progress = getProgressPercent()
|
||||
if (progress === 0) {
|
||||
return state.assets.base + state.assets.firstHome
|
||||
// 显示首页截图
|
||||
return state.assets.homepageUrl
|
||||
} else if (progress < 50) {
|
||||
return state.assets.base + state.assets.firstBonus
|
||||
// 显示初期奖励截图
|
||||
return state.assets.firstRewardUrl
|
||||
} else if (progress < 100) {
|
||||
return state.assets.base + state.assets.midBonus
|
||||
// 显示中期奖励截图
|
||||
return state.assets.midRewardUrl
|
||||
} else {
|
||||
return state.assets.base + state.assets.endBonus
|
||||
// 显示终期奖励截图
|
||||
return state.assets.endRewardUrl
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user