From c184108f4568955bb3f565eb7ba00b48fbf332b9 Mon Sep 17 00:00:00 2001 From: Karlcarlo Date: Wed, 8 Jul 2026 16:38:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(web=5Fview):=20=E5=A4=AA=E9=98=B3=E7=A0=81?= =?UTF-8?q?=20scene=20=E8=A7=A3=E6=9E=90=E6=94=AF=E6=8C=81=20app=3Didentif?= =?UTF-8?q?ier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit box_app /api/wxacode 新增 app=identifier 模式,scene 编码 "app="。CRMEB 收到后解析 scene,调 box_app /api/mp/apps 找对应 H5 url,加载应用。 场景示例: 太阳码 path=pages/annex/web_view/index 太阳码 scene="app=pregnancy" → CRMEB 调 box_app /api/mp/apps → 遍历 items 找 identifier=pregnancy 的 App → 拿到 App.url → 注入到 web-view src → 加载孕育无忧 H5 兼容性: - 原 ?url=xxx 模式完全保留 - scene 解析失败/响应异常时降级到 CRMEB 首页 - 不影响原有分享/复制链接功能 实现细节: - 遍历 items 找 identifier(不依赖 items[0] 排序假设) - 找不到时回退 items[0](保底) - 未来 box_app 支持 ?identifier= 直接过滤时,CRMEB 端无需改动 --- pages/annex/web_view/index.vue | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/pages/annex/web_view/index.vue b/pages/annex/web_view/index.vue index 3f88bb2..9cad2f6 100644 --- a/pages/annex/web_view/index.vue +++ b/pages/annex/web_view/index.vue @@ -107,6 +107,62 @@ export default { } }, onLoad(option) { + // 太阳码 scene 解析:scene="app=" 时调 box_app 查 url + // 例如 box_app /api/wxacode?app=pregnancy → scene="app=pregnancy" + // CRMEB 收到后查 box_app /api/mp/apps?isPublished=1 找 url,跳对应 H5 + if (option.scene && option.scene.indexOf('app=') === 0) { + const identifier = option.scene.slice(4); + console.log('[web_view] 太阳码 scene 解析: identifier=' + identifier); + // 异步处理:uni.request 拿 H5 url,赋值给 option.url 走后续逻辑 + this._resolveAppScene(identifier, option); + return; + } + + this._initWebView(option); + }, + methods: { + /** + * 太阳码 scene 解析:调 box_app /api/mp/apps 找 url,找到后注入到 option.url + * 然后调用 _initWebView(option) 走标准 web_view 加载流程 + */ + _resolveAppScene(identifier, option) { + const appToken = store.state.app.token || ''; + uni.request({ + url: 'https://mp.yizhezhe.com/api/mp/apps?identifier=' + encodeURIComponent(identifier) + '&isPublished=1&pageSize=1', + method: 'GET', + header: appToken ? { 'Authorization': 'Bearer ' + appToken } : {}, + success: (res) => { + console.log('[web_view] 太阳码 scene 解析响应:', JSON.stringify(res.statusCode)); + const items = res.data && res.data.result && res.data.result.items; + if (res.statusCode === 200 && items && items.length > 0) { + // box_app /api/mp/apps 当前不支持 identifier 过滤,遍历找 + const app = items.find(it => it.identifier === identifier) || items[0]; + if (app && app.url) { + const appUrl = app.url; + console.log('[web_view] 解析到 H5 url:', appUrl); + // 编码到 option.url,复用标准流程 + option.url = encodeURIComponent(appUrl); + } else { + // 解析失败:降级到 CRMEB 首页 + console.warn('[web_view] 太阳码 scene 解析失败,降级到 CRMEB 首页'); + option.url = encodeURIComponent('https://shop.douba.top'); + } + } else { + // 响应异常:降级到 CRMEB 首页 + console.warn('[web_view] 太阳码 scene 解析响应异常,降级到 CRMEB 首页'); + option.url = encodeURIComponent('https://shop.douba.top'); + } + this._initWebView(option); + }, + fail: (err) => { + console.error('[web_view] 太阳码 scene 网络请求失败:', err); + option.url = encodeURIComponent('https://shop.douba.top'); + this._initWebView(option); + } + }); + }, + + _initWebView(option) { try { let targetUrl = decodeURIComponent(option.url); console.log('[web_view] 原始URL:', targetUrl);