diff --git a/common/js/util.js b/common/js/util.js index 04b3255..65ec242 100644 --- a/common/js/util.js +++ b/common/js/util.js @@ -353,13 +353,45 @@ export const isPageInRouteList = (currentRoute, routeList) => { /** * 解析 link 对象得到最终可跳转的 URL - * 优先级: page_key → wap_url → null + * 同时把 wap_url 自带的 query 参数与 page_params 合并, 写入 link.page_params; + * 并把 link.wap_url 改为不含 query 的 path, 避免后续 redirectTo 重复附加 + * 优先级: page_params > wap_url query (新机制优先) * @param {Object} link * @returns {string|null} */ export const resolveLinkUrl = (link) => { if (!link) return null; - // 优先使用 page_key(新机制) + // 0. 把 wap_url 中的 query 合并到 page_params + // - 拆分 wap_url 的 query, 与 link.page_params 合并 + // - page_params 优先 (新机制, 显式声明的参数覆盖 wap_url query) + // - 把 link.wap_url 改为不含 query 的 path, 避免后续 redirectTo 二次编码 + if (link.wap_url) { + const decodedWap = decodeEntity(link.wap_url); + const queryIdx = decodedWap.indexOf('?'); + if (queryIdx !== -1) { + const path = decodedWap.substring(0, queryIdx); + const queryStr = decodedWap.substring(queryIdx + 1); + const urlParams = {}; + queryStr.split('&').forEach(kv => { + if (!kv) return; + const eqIdx = kv.indexOf('='); + const k = eqIdx === -1 ? kv : kv.substring(0, eqIdx); + const v = eqIdx === -1 ? '' : kv.substring(eqIdx + 1); + if (k) urlParams[k] = v; + }); + // 解析 page_params (可能是字符串或对象) + let pageParams = link.page_params; + if (typeof pageParams === 'string' && pageParams) { + try { pageParams = JSON.parse(pageParams); } catch (e) { pageParams = {}; } + } + pageParams = pageParams || {}; + // 合并: page_params 覆盖 urlParams (新机制优先) + link.page_params = Object.assign({}, urlParams, pageParams); + // 把 link.wap_url 改为不含 query 的 path + link.wap_url = path; + } + } + // 1. 优先使用 page_key(新机制) if (link.page_key) { let params = link.page_params; if (typeof params === 'string' && params) { @@ -368,9 +400,9 @@ export const resolveLinkUrl = (link) => { const url = resolvePageUrl(link.page_key, params || {}); if (url) return url; } - // 回退:旧的 wap_url + // 2. 回退:旧的 wap_url(已被处理为不含 query 的 path) if (link.wap_url) { - return decodeEntity(link.wap_url); + return link.wap_url; } return null; }; @@ -1175,7 +1207,7 @@ export default { * @param {Object} link */ diyRedirectTo(link) { - console.log(`-----> diyRedirectTo`, link); + console.log(`-----> diyRedirectTo`, JSON.stringify(link)); //if (link == null || Object.keys(link).length == 1) return; if (link.wap_url) { link.wap_url = decodeEntity(link.wap_url); @@ -1292,7 +1324,10 @@ export default { } } else if (link.wap_url) { // 微页面/内部页面 - this.redirectTo(link.wap_url, {...link}); + // resolveLinkUrl 已把 wap_url 中的 query 合并到 link.page_params + // 这里过滤掉 link 元数据字段, 避免 wap_url/name/parent/title 等被错误附加到目标 URL + const { wap_url, name, parent, title, enable_set_title, type, appid, page, mobile, image, ...navParams } = link; + this.redirectTo(link.wap_url, { ...navParams, ...(link.page_params || {}) }); } }, /** diff --git a/docs/TODO.md b/docs/TODO.md index fbb0c93..d91be42 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -2,4 +2,20 @@ - [x] 滚动的文章组件, 应该允许用户介入手动滚动。 - [x] 文章列表中图文+文混合模式也需要和滚动的文章组件一样能够处理 -- [x] 从 TabBar 触发的页面,要重新梳理一下。让TabBar被激活的状态符合逻辑 \ No newline at end of file +- [x] 从 TabBar 触发的页面,要重新梳理一下。让TabBar被激活的状态符合逻辑 +- [x] 切换语言的代码在 `components\hover-nav\hover-nav.vue` 中 +- [x] `components\hover-nav\hover-nav.vue` 切换语言的按钮,要在所有页面显示一致。现在是主页不显示,会员中心显示了 +- [x] 隐私弹窗,“不同意”、“同意并继续” 按钮,点击两次,弹窗才消失。 +- [x] 隐私弹窗在微信小程序环境没有显示,需要处理 + +- [x] `components\hover-nav\hover-nav.vue`浮动按钮组的样式,没有缓存的场景,第一次全新启动的时候,没有被设置正确; +- [x] 国际化数据请求失败后,会使用缓存数据吗? + +- [x] 由于VR页面,不显示底部的TabBar,进入VR页面,无法回退,也不能进入其他页面。 + +## 鸿蒙元服务 + +- [x] 鸿蒙元服务暂时使用 H5 隐私弹窗及注册登录机制, 但是始终无法弹出 +- [x] 商品分类页面没有显示搜索,这是错误的,要和H5、微信小程序环境一样 +- [x] 会员中心页面(/pages_tool/member/index),点击“登录/注册”, 无法打开登录注册页面 +- [x] 鸿蒙元服务环境,从其他Tab页面,点击TabBar中的"首页",页面无法跳转。(微信小程序、H5环境都是正常的) \ No newline at end of file