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