From 79fab8c0d6bd37f337b6c911fae801472e48e0cd Mon Sep 17 00:00:00 2001 From: yukaidi Date: Fri, 29 May 2026 13:45:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E4=B8=A2=E5=A4=B1=20&=20QQ?= =?UTF-8?q?scTool=20filesetId=20=E6=8F=90=E5=8F=96=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端 axios 对 HTTP 非2xx直接reject,catch块丢失后端错误信息,从 error.response.data.msg 提取实际错误展示给用户 - QQscTool extractFilesetId 正则未适配 Nuxt 转义JSON格式 --- .../java/cn/qaiu/parser/impl/QQscTool.java | 6 ++++-- web-front/src/components/DirectoryTree.vue | 19 ++++++++++++++----- web-front/src/views/Home.vue | 11 +++++++++-- web-front/src/views/ShowFile.vue | 2 +- web-front/src/views/ShowList.vue | 2 +- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/parser/src/main/java/cn/qaiu/parser/impl/QQscTool.java b/parser/src/main/java/cn/qaiu/parser/impl/QQscTool.java index ff1c2f9..0e0d439 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/QQscTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/QQscTool.java @@ -281,9 +281,11 @@ public class QQscTool extends PanBase { * 从 HTML 的 __NUXT_DATA__ 中提取 fileset_id */ String extractFilesetId(String html) { - // 匹配 UUID 格式的 fileset_id(出现在 Nuxt 数据的 fileset_id 字段值位置) + // Nuxt __NUXT_DATA__ 中 fileset_id 出现在缓存 key 的嵌套转义 JSON 中: + // {\"fileset_id\":\"0500417e-5431-433f-a9f3-d5ccf9412da3\"} + // 匹配 \"fileset_id\" 后面最近的 UUID Pattern pattern = Pattern.compile( - "\"fileset_id\"[:\\s]*\"([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\""); + "\\\\\"fileset_id\\\\\"[^a-f0-9]*([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})"); Matcher matcher = pattern.matcher(html); if (matcher.find()) { return matcher.group(1); diff --git a/web-front/src/components/DirectoryTree.vue b/web-front/src/components/DirectoryTree.vue index d322291..53767bd 100644 --- a/web-front/src/components/DirectoryTree.vue +++ b/web-front/src/components/DirectoryTree.vue @@ -500,9 +500,14 @@ export default { })) resolve(children) } else { + this.$message.error(res.data.msg || '获取子节点失败') resolve([]) } - }).catch(() => resolve([])) + }).catch(err => { + const msg = err.response?.data?.msg || err.message + if (msg) this.$message.error(msg) + resolve([]) + }) } else { resolve([]) } @@ -540,7 +545,8 @@ export default { } } catch (error) { console.error('进入文件夹失败:', error) - this.$message.error('进入文件夹失败') + const msg = error.response?.data?.msg || error.message || '进入文件夹失败' + this.$message.error(msg) } finally { this.loading = false } @@ -571,7 +577,8 @@ export default { } } catch (error) { console.error('加载目录失败:', error) - this.$message.error('加载目录失败') + const msg = error.response?.data?.msg || error.message || '加载目录失败' + this.$message.error(msg) } finally { this.loading = false } @@ -669,7 +676,8 @@ export default { } } catch (error) { console.error('获取下载信息失败:', error) - this.$message.error('获取下载信息失败,尝试直接下载') + const msg = error.response?.data?.msg || '获取下载信息失败,尝试直接下载' + this.$message.error(msg) this.downloadFile(file) } finally { this.downloadLoading = false @@ -755,7 +763,8 @@ export default { } } catch (error) { console.error('发送到下载器失败:', error) - this.$message.error('发送到下载器失败: ' + error.message) + const msg = error.response?.data?.msg || error.message || '发送到下载器失败' + this.$message.error(msg) } finally { this.singleSendLoading = false } diff --git a/web-front/src/views/Home.vue b/web-front/src/views/Home.vue index ae7544c..8456887 100644 --- a/web-front/src/views/Home.vue +++ b/web-front/src/views/Home.vue @@ -1157,17 +1157,24 @@ export default { params.auth = authParam } const response = await axios.get(`${this.baseAPI}${endpoint}`, { params }) - + if (response.data.code === 200) { // this.$message.success(response.data.msg || '操作成功') return response.data } else { - // 在页面右下角显示一个“查看详情”按钮 可以查看原json + // 在页面右下角显示一个”查看详情”按钮 可以查看原json this.errorDetail = response?.data this.errorButtonVisible = true throw new Error(response.data.msg || '操作失败') } } catch (error) { + // HTTP 非2xx时,从响应体中提取后端返回的错误信息 + if (error.response?.data?.msg) { + this.errorDetail = error.response.data + this.errorButtonVisible = true + this.$message.error(error.response.data.msg) + throw new Error(error.response.data.msg) + } this.$message.error(error.message || '网络错误') throw error } finally { diff --git a/web-front/src/views/ShowFile.vue b/web-front/src/views/ShowFile.vue index 7d174ef..52e67ae 100644 --- a/web-front/src/views/ShowFile.vue +++ b/web-front/src/views/ShowFile.vue @@ -73,7 +73,7 @@ export default { this.parseResult = res.data this.downloadUrl = res.data.data?.directLink } catch (e) { - this.error = '解析失败' + this.error = e.response?.data?.msg || e.response?.data?.error || '解析失败' } finally { this.loading = false } diff --git a/web-front/src/views/ShowList.vue b/web-front/src/views/ShowList.vue index ec18f32..e3dad17 100644 --- a/web-front/src/views/ShowList.vue +++ b/web-front/src/views/ShowList.vue @@ -55,7 +55,7 @@ export default { const res = await axios.get('/v2/getFileList', { params: { url: this.url } }) this.directoryData = res.data.data || [] } catch (e) { - this.error = '目录解析失败' + this.error = e.response?.data?.msg || e.response?.data?.error || '目录解析失败' } finally { this.loading = false }