新增获取游戏界面数据的API,并在Play.vue中处理登录成功后的游戏数据更新逻辑,优化状态管理和二维码处理流程。

This commit is contained in:
zyh
2025-08-26 23:11:13 +08:00
parent 41739f32a1
commit e3db781926
2 changed files with 99 additions and 18 deletions

View File

@@ -38,6 +38,11 @@ export function getGameProgress(code) {
})
}
// 获取游戏界面数据
export function getGameInterface(code) {
return http.get(`/api/link/${code}/game-interface`)
}
// 获取二维码图片(可选,用于代理二维码避免混合内容问题)
export function getQRCode(code) {
return http.get('/api/link/qr.png', {

View File

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