From e2a9fef1d03432d1204a8472bc6d6e8005a13289 Mon Sep 17 00:00:00 2001 From: zyh Date: Thu, 6 Nov 2025 18:56:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=80=BB=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=80=BC=E4=B8=BAnull=E5=B9=B6=E4=BB=8EAPI?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9C=9F=E5=AE=9E=E6=95=B0=E6=8D=AE=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E6=B8=B8=E6=88=8F=E7=95=8C=E9=9D=A2=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=A4=84=E7=90=86=EF=BC=8C=E6=8F=90=E5=8D=87=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/play/SelectRegion.vue | 14 +++++++-- src/composables/usePlayState.js | 37 ++++++++++++++++++++--- src/views/Play.vue | 6 ++-- src/views/refund/RefundManagement.vue | 42 +++++++++++++++++++++------ 4 files changed, 81 insertions(+), 18 deletions(-) diff --git a/src/components/play/SelectRegion.vue b/src/components/play/SelectRegion.vue index 4852e6c..07f19d9 100644 --- a/src/components/play/SelectRegion.vue +++ b/src/components/play/SelectRegion.vue @@ -16,7 +16,7 @@
{{ selectedRegion || '未选择' }}
待选区
{{ mecmachineId || '待分配' }}
-
{{ totalPoints || 4000 }}
+
{{ displayTotalPoints }}
@@ -92,7 +92,7 @@ export default { }, totalPoints: { type: Number, - default: 4000 + default: null } }, data() { @@ -103,6 +103,16 @@ export default { } }, emits: ['selectRegion'], + computed: { + displayTotalPoints() { + // 如果 totalPoints 为 null 或 undefined,显示"待分配" + // 注意:0 是有效值,应该显示 + if (this.totalPoints === null || this.totalPoints === undefined) { + return '待分配' + } + return this.totalPoints + } + }, methods: { selectRegionOption(code) { this.regionCode = code diff --git a/src/composables/usePlayState.js b/src/composables/usePlayState.js index 46e0576..89ee309 100644 --- a/src/composables/usePlayState.js +++ b/src/composables/usePlayState.js @@ -23,7 +23,7 @@ export function usePlayState() { qrInfo: null, assets: null, currentPoints: 0, - totalPoints: 1000, + totalPoints: null, // 修改:初始值改为null,等待从API获取真实数据 completedPoints: 0, progressDisplayFormat: '1', error: null, @@ -57,6 +57,32 @@ export function usePlayState() { const response = await getLinkStatus(state.code) const data = response.data await updateStateFromResponse(data) + + // 如果是NEW状态,尝试获取游戏界面数据以获取totalPoints + if (data.status === 'NEW') { + try { + const gameResponse = await getGameInterfaceAPI(state.code) + const gameData = gameResponse.data + console.log('NEW状态 - 游戏界面数据:', gameData) + + // 更新totalPoints和其他可用数据 + if (gameData.totalPoints !== undefined && gameData.totalPoints !== null) { + state.totalPoints = gameData.totalPoints + console.log('从游戏界面获取到totalPoints:', state.totalPoints) + } + + if (gameData.completedPoints !== undefined) { + state.completedPoints = gameData.completedPoints + } + + if (gameData.progressDisplayFormat) { + state.progressDisplayFormat = String(gameData.progressDisplayFormat) + } + } catch (gameError) { + // 游戏界面数据获取失败不影响主流程,只记录日志 + console.log('NEW状态获取游戏界面数据失败(这是正常的):', gameError.message) + } + } } catch (error) { throw error } @@ -239,7 +265,8 @@ export function usePlayState() { state.qrExpireAt = data.qrExpireAt } - if (data.totalPoints) { + // 优先使用 data.totalPoints,确保在NEW状态也能获取到目标点数 + if (data.totalPoints !== undefined && data.totalPoints !== null) { state.totalPoints = data.totalPoints } @@ -251,7 +278,8 @@ export function usePlayState() { state.progressDisplayFormat = String(data.progressDisplayFormat) } - if (data.assets && data.assets.totalPoints) { + // 如果assets中有totalPoints,也更新 + if (data.assets && data.assets.totalPoints !== undefined && data.assets.totalPoints !== null) { state.totalPoints = data.assets.totalPoints if (state.currentPoints === undefined) { state.currentPoints = 0 @@ -263,7 +291,8 @@ export function usePlayState() { dataRegion: data.region, stateRegion: state.region, mecmachineId: data.mecmachineId, - totalPoints: state.totalPoints, + dataTotalPoints: data.totalPoints, + stateTotalPoints: state.totalPoints, completedPoints: state.completedPoints, skipQrProcessing }) diff --git a/src/views/Play.vue b/src/views/Play.vue index 53ac0bc..2baedc6 100644 --- a/src/views/Play.vue +++ b/src/views/Play.vue @@ -33,7 +33,7 @@ - -
+ +
已打完
diff --git a/src/views/refund/RefundManagement.vue b/src/views/refund/RefundManagement.vue index 787af35..cfddf57 100644 --- a/src/views/refund/RefundManagement.vue +++ b/src/views/refund/RefundManagement.vue @@ -187,9 +187,8 @@
    -
  • 支持直接输入链接编号,如:RUC74NCV
  • -
  • 支持输入完整链接URL,如:http://localhost:5173/play?code=RUC74NCV
  • -
  • 系统会自动从URL中提取链接编号
  • +
  • 支持直接输入链接编号,如:6DJWZ4MA
  • +
  • 支持粘贴完整链接URL,系统会自动识别并提取编号
  • 支持使用粘贴按钮或Ctrl+V快速粘贴
@@ -343,7 +342,7 @@ export default { // 移除首尾空格 const trimmed = input.trim() - // 如果是URL,尝试提取code参数 + // 方式1: 尝试从旧格式URL提取 (play?code=xxx) try { if (trimmed.includes('play?code=')) { const url = new URL(trimmed) @@ -354,23 +353,48 @@ export default { // 如果URL解析失败,继续下面的处理 } - // 尝试从各种URL格式中提取代码 + // 方式2: 尝试从查询参数中提取 code= if (trimmed.includes('code=')) { const match = trimmed.match(/code=([^&\s]+)/) if (match) return match[1] } - // 如果包含路径分隔符,取最后一个部分 + // 方式3: 尝试从新格式URL提取 (play/CODE 或 play/CODE?t=xxx) + // 匹配 /play/CODE 格式,CODE后面可能跟查询参数 + const playPathMatch = trimmed.match(/\/play\/([A-Z0-9]+)(?:\?|$|\/)/i) + if (playPathMatch) { + return playPathMatch[1] + } + + // 方式4: 如果包含路径分隔符,取最后一个部分(去除查询参数) if (trimmed.includes('/')) { const parts = trimmed.split('/') - const lastPart = parts[parts.length - 1] + let lastPart = parts[parts.length - 1] + + // 去除查询参数部分 + if (lastPart.includes('?')) { + lastPart = lastPart.split('?')[0] + } + + // 去除hash部分 + if (lastPart.includes('#')) { + lastPart = lastPart.split('#')[0] + } + if (lastPart && lastPart.length >= 6) { return lastPart } } - // 直接返回输入(假设就是代码) - return trimmed + // 方式5: 直接返回输入(假设就是代码,去除可能的查询参数) + let result = trimmed + if (result.includes('?')) { + result = result.split('?')[0] + } + if (result.includes('#')) { + result = result.split('#')[0] + } + return result } // 查询