From 06bd96a473480385764c23e3c00d0f22f24f40d4 Mon Sep 17 00:00:00 2001
From: wm <2747639460@qq.com>
Date: Wed, 22 Jul 2026 15:30:28 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8A=A8=E4=BD=9C?=
=?UTF-8?q?=E5=8D=A1=E7=89=87=E7=82=B9=E5=87=BB=E5=8F=8C=E8=A7=A6=E5=8F=91?=
=?UTF-8?q?=E5=AF=BC=E8=87=B4=E8=B7=B3=20404?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 8 个页面 exercise-card 由 bind:tap 改为 catch:tap,拦截原生 tap 冒泡
避免一次点击被『自定义事件 + 原生冒泡』触发两次,
第二次 e.detail 无 id → navigateTo detail?id=undefined → 404
- 所有 onExercise 顶部加 id 守卫,无 id 直接 return
- exercise-card 点击前校验 exercise.id,缺失不触发
- detail onLoad 的 id 为空时直接显示空态,不再发起错误请求
---
miniprogram/components/exercise-card/index.js | 2 ++
miniprogram/pages/category/category.js | 1 +
miniprogram/pages/category/category.wxml | 2 +-
miniprogram/pages/collection-detail/collection-detail.js | 1 +
miniprogram/pages/collection-detail/collection-detail.wxml | 2 +-
miniprogram/pages/detail/detail.js | 6 ++++++
miniprogram/pages/detail/detail.wxml | 2 +-
miniprogram/pages/favorites/favorites.js | 1 +
miniprogram/pages/favorites/favorites.wxml | 2 +-
miniprogram/pages/index/index.js | 1 +
miniprogram/pages/index/index.wxml | 2 +-
miniprogram/pages/plan-detail/plan-detail.js | 1 +
miniprogram/pages/plan-detail/plan-detail.wxml | 2 +-
miniprogram/pages/recommend/recommend.js | 1 +
miniprogram/pages/recommend/recommend.wxml | 2 +-
miniprogram/pages/search/search.js | 3 ++-
miniprogram/pages/search/search.wxml | 2 +-
17 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/miniprogram/components/exercise-card/index.js b/miniprogram/components/exercise-card/index.js
index 472dcb2..9fe33d0 100644
--- a/miniprogram/components/exercise-card/index.js
+++ b/miniprogram/components/exercise-card/index.js
@@ -21,6 +21,8 @@ Component({
},
onTap() {
const ex = this.data.exercise || {};
+ // 防御:id 缺失时绝不跳转(避免 navigate 到 /api/exercises/undefined 触发 404)
+ if (!ex || !ex.id) return;
this.triggerEvent('tap', { id: ex.id, exercise: ex });
}
}
diff --git a/miniprogram/pages/category/category.js b/miniprogram/pages/category/category.js
index aee0e3e..0a046d8 100644
--- a/miniprogram/pages/category/category.js
+++ b/miniprogram/pages/category/category.js
@@ -84,6 +84,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
wx.navigateTo({ url: '/pages/detail/detail?id=' + encodeURIComponent(e.detail.id) });
}
});
diff --git a/miniprogram/pages/category/category.wxml b/miniprogram/pages/category/category.wxml
index bb7fae2..c752f85 100644
--- a/miniprogram/pages/category/category.wxml
+++ b/miniprogram/pages/category/category.wxml
@@ -17,7 +17,7 @@
-
+
暂无数据
diff --git a/miniprogram/pages/collection-detail/collection-detail.js b/miniprogram/pages/collection-detail/collection-detail.js
index 6df5867..3f7f035 100644
--- a/miniprogram/pages/collection-detail/collection-detail.js
+++ b/miniprogram/pages/collection-detail/collection-detail.js
@@ -69,6 +69,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
wx.navigateTo({
url: '/pages/detail/detail?from=collection&slug=' +
encodeURIComponent(this.data.slug) + '&id=' + encodeURIComponent(e.detail.id)
diff --git a/miniprogram/pages/collection-detail/collection-detail.wxml b/miniprogram/pages/collection-detail/collection-detail.wxml
index 583c246..9b1c8dd 100644
--- a/miniprogram/pages/collection-detail/collection-detail.wxml
+++ b/miniprogram/pages/collection-detail/collection-detail.wxml
@@ -22,7 +22,7 @@
-
+
该计划暂无动作
diff --git a/miniprogram/pages/detail/detail.js b/miniprogram/pages/detail/detail.js
index 07010fb..99c650f 100644
--- a/miniprogram/pages/detail/detail.js
+++ b/miniprogram/pages/detail/detail.js
@@ -21,6 +21,11 @@ Page({
const id = query.id || '';
const planId = query.planId || '';
this.setData({ statusBarHeight: app.globalData.statusBarHeight || 20, id, planId });
+ // 防御:id 缺失直接显示空态,避免请求 /api/exercises/ 导致错乱或 404
+ if (!id) {
+ this.setData({ loading: false });
+ return;
+ }
this.load();
if (auth.isLogin()) {
favSvc.exerciseStatus(id).then((r) => {
@@ -117,6 +122,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
wx.navigateTo({ url: '/pages/detail/detail?id=' + encodeURIComponent(e.detail.id) });
},
diff --git a/miniprogram/pages/detail/detail.wxml b/miniprogram/pages/detail/detail.wxml
index 5bb3219..3983032 100644
--- a/miniprogram/pages/detail/detail.wxml
+++ b/miniprogram/pages/detail/detail.wxml
@@ -60,7 +60,7 @@
相关推荐
-
+
diff --git a/miniprogram/pages/favorites/favorites.js b/miniprogram/pages/favorites/favorites.js
index 7f69ddd..b4d00dc 100644
--- a/miniprogram/pages/favorites/favorites.js
+++ b/miniprogram/pages/favorites/favorites.js
@@ -45,6 +45,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
if (this.data.managing) return;
wx.navigateTo({ url: '/pages/detail/detail?id=' + encodeURIComponent(e.detail.id) });
},
diff --git a/miniprogram/pages/favorites/favorites.wxml b/miniprogram/pages/favorites/favorites.wxml
index 4f43ecd..1d44673 100644
--- a/miniprogram/pages/favorites/favorites.wxml
+++ b/miniprogram/pages/favorites/favorites.wxml
@@ -10,7 +10,7 @@
-
+
移除
diff --git a/miniprogram/pages/index/index.js b/miniprogram/pages/index/index.js
index f1b122d..0a226d9 100644
--- a/miniprogram/pages/index/index.js
+++ b/miniprogram/pages/index/index.js
@@ -81,6 +81,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
wx.navigateTo({
url: '/pages/detail/detail?id=' + encodeURIComponent(e.detail.id)
});
diff --git a/miniprogram/pages/index/index.wxml b/miniprogram/pages/index/index.wxml
index ffb40c8..b4669a1 100644
--- a/miniprogram/pages/index/index.wxml
+++ b/miniprogram/pages/index/index.wxml
@@ -37,7 +37,7 @@
-
+
暂无数据
diff --git a/miniprogram/pages/plan-detail/plan-detail.js b/miniprogram/pages/plan-detail/plan-detail.js
index 99be52e..982f4dc 100644
--- a/miniprogram/pages/plan-detail/plan-detail.js
+++ b/miniprogram/pages/plan-detail/plan-detail.js
@@ -42,6 +42,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
wx.navigateTo({
url: '/pages/detail/detail?planId=' + encodeURIComponent(this.data.id) +
'&id=' + encodeURIComponent(e.detail.id)
diff --git a/miniprogram/pages/plan-detail/plan-detail.wxml b/miniprogram/pages/plan-detail/plan-detail.wxml
index b4fbbc2..f70c746 100644
--- a/miniprogram/pages/plan-detail/plan-detail.wxml
+++ b/miniprogram/pages/plan-detail/plan-detail.wxml
@@ -14,7 +14,7 @@
-
+
移除
diff --git a/miniprogram/pages/recommend/recommend.js b/miniprogram/pages/recommend/recommend.js
index a517338..8bec1cb 100644
--- a/miniprogram/pages/recommend/recommend.js
+++ b/miniprogram/pages/recommend/recommend.js
@@ -86,6 +86,7 @@ Page({
},
onExercise(e) {
+ if (!e || !e.detail || !e.detail.id) return;
wx.navigateTo({ url: '/pages/detail/detail?id=' + encodeURIComponent(e.detail.id) });
}
});
diff --git a/miniprogram/pages/recommend/recommend.wxml b/miniprogram/pages/recommend/recommend.wxml
index 7eb67da..3c03109 100644
--- a/miniprogram/pages/recommend/recommend.wxml
+++ b/miniprogram/pages/recommend/recommend.wxml
@@ -71,7 +71,7 @@
exercise="{{item}}"
score="{{item.score}}"
reason="{{item.reason}}"
- bind:tap="onExercise" />
+ catch:tap="onExercise" />
{{ loading ? '匹配中…' : '暂无匹配结果' }}
diff --git a/miniprogram/pages/search/search.js b/miniprogram/pages/search/search.js
index 855b1ce..946bc33 100644
--- a/miniprogram/pages/search/search.js
+++ b/miniprogram/pages/search/search.js
@@ -57,7 +57,8 @@ Page({
},
onExercise(e) {
- const id = e.detail.id;
+ const id = e.detail && e.detail.id;
+ if (!id) return;
if (this.data.selectMode && this.data.planId) {
planSvc.addExercise(this.data.planId, id).then(() => {
wx.showToast({ title: '已添加', icon: 'success' });
diff --git a/miniprogram/pages/search/search.wxml b/miniprogram/pages/search/search.wxml
index b8b100a..6e8f85a 100644
--- a/miniprogram/pages/search/search.wxml
+++ b/miniprogram/pages/search/search.wxml
@@ -17,7 +17,7 @@
-
+
搜索中…