Files
lucky_shop/scripts/hardcoded_cn_scan.json
ZF sun 94142268a0 refactor(i18n): 完成全量硬编码中文文案替换为多语言方案
1.  替换所有页面/组件中的硬编码中文提示文案为$lang调用,包括支付、帮助中心、公告等页面
2.  重构diy.js加载失败文案处理逻辑,支持参数化替换
3.  新增多语言混入逻辑,实现导航标题随语种动态切换
4.  重构支付组件初始化逻辑,优化平台适配代码
5.  添加多语言单元测试和硬编码扫描脚本
6.  更新语言包,新增缺失的翻译词条
2026-07-23 09:46:16 +08:00

7804 lines
171 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"pages_tool\\ai-chat\\ai-chat-message.vue": [
[
3,
"<!-- 搜索组件 -->"
],
[
14,
"<!-- 聊天消息列表 - scroll-into-view 用于多端滚动定位(兼容微信小程序) -->"
],
[
24,
"<!-- 加载更多历史消息 -->"
],
[
29,
"<!-- 消息列表 -->"
],
[
37,
"<!-- 用户消息 -->"
],
[
62,
"<!-- AI消息 -->"
],
[
65,
"<!-- 智能客服头像 -->"
],
[
75,
"<!-- AI昵称固定,不可修改 - 左移到气泡上方 -->"
],
[
86,
"<!-- 文本消息 -->"
],
[
91,
"<!-- Markdown文档 -->"
],
[
102,
"<!-- 文件链接 -->"
],
[
118,
"<!-- 音频消息 -->"
],
[
145,
"<!-- 视频消息 -->"
],
[
166,
"<!-- 跳转链接 -->"
],
[
181,
"<!-- 加载/处理中状态 -->"
],
[
200,
"<!-- 操作按钮 -->"
],
[
220,
"<!-- 输入区域 -->"
],
[
245,
"<!-- 扩大按钮 -->"
],
[
250,
"<!-- Emoji按钮 -->"
],
[
255,
"<!-- 发送按钮 -->"
],
[
266,
"<!-- 更多工具面板 -->"
],
[
275,
"<!-- Emoji面板 -->"
],
[
281,
"<!-- 扩大编辑器弹窗 -->"
],
[
307,
"<!-- 键盘垫高层:键盘弹出时平滑撑开空间将输入框上推 -->"
],
[
310,
"<!-- 语音输入面板 -->"
],
[
316,
"<!-- 头像选择弹窗 -->"
],
[
323,
"<!-- 昵称编辑弹窗 -->"
],
[
615,
"console.log('[AI Chat] → 分支1: ID变化,加载历史');"
],
[
620,
"console.log('[AI Chat] → 分支2: ID不变但只有初始消息,从服务端恢复');"
],
[
624,
"console.log('[AI Chat] → 分支3: 全新会话');"
],
[
627,
"console.log('[AI Chat] → 分支4: 跳过加载,保留当前消息, messages.length:', this.messages.length);"
],
[
635,
"console.log('[AI Chat] 已有会话,跳过欢迎语')"
],
[
646,
"console.log('[AI Chat] API getServiceConfig 返回:', JSON.stringify(config))"
],
[
657,
"console.log('[AI Chat] 使用远程欢迎语:', welcomeText.substring(0, 50))"
],
[
661,
"console.warn('[AI Chat] 获取服务配置失败:', e)"
],
[
669,
"console.log('[AI Chat] 使用降级欢迎语')"
],
[
671,
"console.log('[AI Chat] 无可用欢迎语')"
],
[
764,
"console.log('[AI Chat] loadChatHistoryIfExist 被调用, convId:', convId);"
],
[
768,
"console.log('[AI Chat] 请求历史 API...');"
],
[
772,
"console.log('[AI Chat] 历史 API 返回:', JSON.stringify(response).substring(0, 200));"
],
[
775,
"console.warn('[AI Chat] 历史记录为空或格式无效, success:', response.success, 'messages:', Array.isArray(response.messages));"
],
[
778,
"console.log('[AI Chat] 原始消息数:', response.messages.length, 'total:', response.total);"
],
[
798,
"console.log('[AI Chat] 过滤后消息数:', this.messages.length, '内容摘要:', this.messages.map(m => ({role: m.role, content: m.content.substring(0, 30)})));"
],
[
804,
"console.error('[AI Chat] 加载历史记录失败:', error.message, error.stack);"
],
[
881,
"console.error('AI服务调用失败:', error)"
],
[
1023,
"console.error('流式请求失败:', error)"
],
[
1079,
"console.error('流式请求失败')"
],
[
1474,
"console.error('加载历史失败:', error);"
],
[
1702,
"console.log('[AI Chat] 开始复制, 内容长度:', copyText.length, '内容前50字:', copyText.substring(0, 50))"
],
[
1706,
"console.log('[AI Chat] 复制成功')"
],
[
1710,
"console.error('[AI Chat] 复制失败, 详细错误:', JSON.stringify(err))"
],
[
1711,
"console.error('[AI Chat] 复制失败 errMsg:', err.errMsg || err.message || '无错误消息')"
],
[
1862,
"console.error('AI服务调用失败:', error)"
],
[
1968,
"'😀': '[开心]',"
],
[
1969,
"'😂': '[大笑]',"
],
[
1970,
"'😊': '[微笑]',"
],
[
1971,
"'❤️': '[爱心]',"
],
[
1972,
"'👍': '[点赞]',"
],
[
1973,
"'😭': '[哭泣]',"
],
[
1974,
"'🙏': '[感谢/拜托]',"
],
[
1975,
"'😍': '[喜欢]',"
],
[
1976,
"'🎉': '[庆祝]',"
],
[
1977,
"'🤔': '[思考]',"
],
[
1978,
"'😅': '[尴尬]',"
],
[
1979,
"'😁': '[开心]',"
],
[
1980,
"'🥰': '[喜爱]',"
],
[
1981,
"'😘': '[飞吻]',"
],
[
1982,
"'😏': '[坏笑]',"
],
[
1983,
"'🥳': '[庆祝]',"
],
[
1984,
"'😔': '[难过]',"
],
[
1985,
"'😢': '[哭泣]',"
],
[
1986,
"'😤': '[生气]',"
],
[
1987,
"'😴': '[困]',"
],
[
1988,
"'🤗': '[拥抱]',"
],
[
1989,
"'🙂': '[微笑]',"
],
[
1990,
"'😃': '[开心]',"
],
[
1991,
"'😄': '[大笑]',"
],
[
1992,
"'😆': '[开心]',"
],
[
1993,
"'😇': '[天使]',"
],
[
1994,
"'🤩': '[惊喜]',"
],
[
1995,
"'😋': '[好吃]',"
],
[
1996,
"'😛': '[调皮]',"
],
[
1997,
"'😜': '[调皮]',"
],
[
1998,
"'🤪': '[搞怪]',"
],
[
1999,
"'😝': '[开心]',"
],
[
2000,
"'🤑': '[发财]',"
],
[
2001,
"'🤭': '[害羞]',"
],
[
2002,
"'🤫': '[嘘]',"
],
[
2003,
"'🤐': '[闭嘴]',"
],
[
2004,
"'🤨': '[疑惑]',"
],
[
2005,
"'😐': '[无语]',"
],
[
2006,
"'😑': '[无语]',"
],
[
2007,
"'😶': '[沉默]',"
],
[
2008,
"'😒': '[不屑]',"
],
[
2009,
"'🙄': '[白眼]',"
],
[
2010,
"'😬': '[尴尬]',"
],
[
2011,
"'🤥': '[说谎]',"
],
[
2012,
"'😌': '[安心]',"
],
[
2013,
"'😪': '[困]',"
],
[
2014,
"'🤤': '[流口水]',"
],
[
2015,
"'😷': '[生病]',"
],
[
2016,
"'🤒': '[发烧]',"
],
[
2017,
"'🤕': '[受伤]',"
],
[
2018,
"'🤢': '[恶心]',"
],
[
2019,
"'🤮': '[呕吐]',"
],
[
2020,
"'🤧': '[感冒]',"
],
[
2021,
"'🥵': '[热]',"
],
[
2022,
"'🥶': '[冷]',"
],
[
2023,
"'🥴': '[头晕]',"
],
[
2024,
"'😵': '[晕]',"
],
[
2025,
"'🤯': '[爆炸]',"
],
[
2026,
"'🤠': '[酷]',"
],
[
2027,
"'😎': '[酷]',"
],
[
2028,
"'🤓': '[书呆子]',"
],
[
2029,
"'🧐': '[疑惑]',"
],
[
2030,
"'😕': '[困惑]',"
],
[
2031,
"'😟': '[担心]',"
],
[
2032,
"'🙁': '[难过]',"
],
[
2033,
"'😮': '[惊讶]',"
],
[
2034,
"'😯': '[惊讶]',"
],
[
2035,
"'😲': '[震惊]',"
],
[
2036,
"'😳': '[脸红]',"
],
[
2037,
"'🥺': '[恳求]',"
],
[
2038,
"'😦': '[惊讶]',"
],
[
2039,
"'😧': '[惊讶]',"
],
[
2040,
"'😨': '[害怕]',"
],
[
2041,
"'😰': '[紧张]',"
],
[
2042,
"'😥': '[失望]',"
],
[
2043,
"'😱': '[恐惧]',"
],
[
2044,
"'😖': '[困扰]',"
],
[
2045,
"'😣': '[痛苦]',"
],
[
2046,
"'😞': '[难过]',"
],
[
2047,
"'😓': '[汗]',"
],
[
2048,
"'😩': '[累]',"
],
[
2049,
"'😫': '[累]',"
],
[
2050,
"'🥱': '[困]',"
],
[
2051,
"'😡': '[愤怒]',"
],
[
2052,
"'😠': '[生气]',"
],
[
2053,
"'🤬': '[咒骂]',"
],
[
2054,
"'😈': '[恶魔]',"
],
[
2055,
"'👿': '[生气]',"
],
[
2056,
"'💀': '[骷髅]',"
],
[
2057,
"'💩': '[便便]',"
],
[
2058,
"'👻': '[鬼]',"
],
[
2059,
"'👽': '[外星人]',"
],
[
2060,
"'🤖': '[机器人]',"
],
[
2061,
"'🎃': '[万圣节]',"
],
[
2062,
"'😺': '[开心猫]',"
],
[
2063,
"'😸': '[微笑猫]',"
],
[
2064,
"'😹': '[大笑猫]',"
],
[
2065,
"'😻': '[花痴猫]',"
],
[
2066,
"'😼': '[得意猫]',"
],
[
2067,
"'😽': '[亲亲猫]',"
],
[
2068,
"'🙀': '[惊讶猫]',"
],
[
2069,
"'😿': '[哭泣猫]',"
],
[
2070,
"'😾': '[生气猫]',"
],
[
2071,
"'👋': '[挥手]',"
],
[
2072,
"'🤚': '[举手]',"
],
[
2073,
"'🖐': '[手掌]',"
],
[
2074,
"'✋': '[手掌]',"
],
[
2077,
"'🤏': '[捏]',"
],
[
2078,
"'✌️': '[耶]',"
],
[
2079,
"'🤞': '[好运]',"
],
[
2080,
"'🤟': '[爱你]',"
],
[
2081,
"'🤘': '[摇滚]',"
],
[
2082,
"'🤙': '[打电话]',"
],
[
2083,
"'👈': '[左边]',"
],
[
2084,
"'👉': '[右边]',"
],
[
2085,
"'👆': '[上边]',"
],
[
2086,
"'🖕': '[竖中指]',"
],
[
2087,
"'👇': '[下边]',"
],
[
2088,
"'☝': '[向上]',"
],
[
2089,
"'👎': '[鄙视]',"
],
[
2090,
"'✊': '[拳头]',"
],
[
2091,
"'👊': '[拳头]',"
],
[
2092,
"'🤛': '[左拳]',"
],
[
2093,
"'🤜': '[右拳]',"
],
[
2094,
"'👏': '[鼓掌]',"
],
[
2095,
"'🙌': '[举手庆祝]',"
],
[
2096,
"'👐': '[张开手]',"
],
[
2097,
"'🤲': '[摊手]',"
],
[
2098,
"'🤝': '[握手]',"
],
[
2099,
"'✍️': '[写字]',"
],
[
2100,
"'💅': '[美甲]',"
],
[
2101,
"'🤳': '[自拍]',"
],
[
2102,
"'💪': '[肌肉]',"
],
[
2103,
"'💗': '[爱心]',"
],
[
2104,
"'💓': '[心跳]',"
],
[
2105,
"'💕': '[两颗心]',"
],
[
2106,
"'💖': '[闪亮心]',"
],
[
2107,
"'💝': '[礼物心]',"
],
[
2108,
"'💞': '[旋转心]',"
],
[
2109,
"'💘': '[丘比特]',"
],
[
2110,
"'💌': '[情书]',"
],
[
2111,
"'💟': '[心形]',"
],
[
2112,
"'💛': '[黄心]',"
],
[
2113,
"'💙': '[蓝心]',"
],
[
2114,
"'💜': '[紫心]',"
],
[
2115,
"'🖤': '[黑心]',"
],
[
2116,
"'💔': '[心碎]',"
],
[
2117,
"'💢': '[愤怒]',"
],
[
2118,
"'💣': '[炸弹]',"
],
[
2119,
"'💥': '[爆炸]',"
],
[
2120,
"'💫': '[头晕]',"
],
[
2121,
"'💦': '[汗]',"
],
[
2122,
"'💨': '[风]',"
],
[
2123,
"'👁️': '[眼睛]',"
],
[
2124,
"'👀': '[看]',"
],
[
2125,
"'👅': '[舌头]',"
],
[
2126,
"'👄': '[嘴巴]',"
],
[
2127,
"'👂': '[耳朵]',"
],
[
2128,
"'👃': '[鼻子]'"
]
],
"tests\\tabbar-highlight.test.js": [
[
104,
"{ id: 1, text: '首页', url: HOME },"
],
[
105,
"{ id: 2, text: '分类', url: CATEGORY },"
],
[
106,
"{ id: 3, text: '购物车', url: CART },"
],
[
107,
"{ id: 4, text: '商户', url: MERCHANT },"
],
[
108,
"{ id: 5, text: '我的', url: MEMBER },"
],
[
166,
"`[${label}] 期望 ${expected || '不点亮'}, 实际 ${actual || '不点亮'}`);"
],
[
174,
"test('场景 1.1: 用户从首页点 diy 链接 → 首页保持高亮', () => {"
],
[
181,
"test('场景 1.2: 用户从分类点 diy 链接 → 分类高亮', () => {"
],
[
188,
"test('场景 1.3: 用户从商户 tab 进 diy 微页面 → 商户高亮', () => {"
],
[
195,
"test('场景 1.4: 深层导航, 跳过非 tab 中间页', () => {"
],
[
204,
"test('场景 1.5: 经过 login 弹窗后, 仍记为来自原 tab', () => {"
],
[
218,
"test('场景 2.1: /pages_goods/list → /pages_goods/detail 属于分类频道', () => {"
],
[
225,
"test('场景 2.2: /pages_tool/member/coupon → /pages_tool/member/info 属于\"我的\"', () => {"
],
[
232,
"test('场景 2.3: 在\"我的\"频道内多页浏览, 高亮始终是\"我的\"', () => {"
],
[
244,
"test('场景 3.1: tab→tab 跳转, 目标 tab 高亮 (不受来源干扰)', () => {"
],
[
251,
"test('场景 3.2: 在 diy 页面点\"我的\" tab → 我的高亮 (同包)', () => {"
],
[
261,
"test('场景 3.3: 在 diy 页面点\"首页\" tab → 首页高亮 (跨包)', () => {"
],
[
268,
"test('场景 3.4: 链式 tab 切换 home→分类→我的→购物车→首页', () => {"
],
[
275,
"}), tabs[i], `链式第 ${i + 1} 步: ${tabs[i]}`);"
],
[
283,
"test('场景 4.1: 首页 → 商品搜索 → 分类高亮 (通配符 /pages_tool/goods"
],
[
286,
"test('场景 5.1: /pages_tool/files/list 显式绑 null → 不点亮 (业务规则: 文件页不归属任何 tab)', () => {"
],
[
290,
"}), null, 'home → files/list (null 优先)');"
],
[
293,
"test('场景 5.2: /pages_tool/index/diy 不在 PAGE_TAB_MAP, 走 history-walk', () => {"
],
[
299,
"}), HOME, 'diy 走 history-walk, home 高亮');"
],
[
302,
"test('场景 5.3: diy 没在 PAGE_TAB_MAP 显式声明 (避免硬绑)', () => {"
],
[
308,
"'diy 不应在 PAGE_TAB_MAP (修复后靠 history-walk 决定)');"
],
[
315,
"test('场景 6.1: 用户扫码进 diy → 不高亮任何 tab (iOS HIG)', () => {"
],
[
320,
"}), null, '深链 diy');"
],
[
323,
"test('场景 6.2: 分享 diy 链接给朋友, 朋友点开 → 不高亮 (无历史)', () => {"
],
[
327,
"}), null, '深链 diy?id=123');"
],
[
330,
"test('场景 6.3: 分享商品详情链接, 朋友点开 → 分类高亮 (通配符)', () => {"
],
[
336,
"}), CATEGORY, '深链 goods/detail');"
],
[
339,
"test('场景 6.4: 分享会员中心链接, 朋友点开 → 我的高亮 (精确绑)', () => {"
],
[
343,
"}), MEMBER, '深链 member (精确)');"
],
[
346,
"test('场景 6.5: 分享 fenxiao 链接, 朋友点开 → 不高亮 (不在任何 map)', () => {"
],
[
352,
"}), null, '深链 fenxiao');"
],
[
360,
"test('场景 7.1: 在 home 点登录 → 全屏不点亮 (NO_TAB_PAGES)', () => {"
],
[
367,
"test('场景 7.2: 支付流程中 → 不点亮 (NO_TAB_PAGES)', () => {"
],
[
374,
"test('场景 7.3: 登录后回到原页面, 高亮不丢失', () => {"
],
[
380,
"}), HOME, 'home → login → diy (modal 透明)');"
],
[
383,
"test('场景 7.4: 支付完成后回到原页面, 高亮跟随当前包', () => {"
],
[
391,
"}), CATEGORY, 'home → cart → pay → list (modal 透明 + 同包)');"
],
[
398,
"test('场景 8.1: URL 带 from_tab=home → 强制高亮 home (即使当前在 pages_tool)', () => {"
],
[
408,
"assert.equal(result, true, 'from_tab=home → HOME 高亮');"
],
[
411,
"test('场景 8.2: from_tab=member 但 PAGE_TAB_MAP 已显式声明 → PAGE_TAB_MAP 优先', () => {"
],
[
422,
"assert.equal(result, false, 'PAGE_TAB_MAP 优先于 from_tab');"
],
[
425,
"test('场景 8.3: 非法 from_tab 值 → 忽略, 走后续链路', () => {"
],
[
435,
"assert.equal(result, false, '非法 from_tab → 忽略, 无其它信号 → 不亮');"
],
[
442,
"test('场景 9.1: diy 带 query ?id=123&from=share → 行为不变', () => {"
],
[
449,
"test('场景 9.2: tab 根带 query 也精确匹配', () => {"
],
[
456,
"assert.equal(result, HOME, 'home tab 根 + query');"
],
[
459,
"test('场景 9.3: 老路径 /pages/member/index 自动适配到 /pages_tool/member/index', () => {"
],
[
466,
"assert.equal(result, MEMBER, '老路径自动 adaptSubpackageUrl');"
],
[
473,
"test('场景 10.1: 5 个 tab 中, 同时只有 1 个高亮 (互斥)', () => {"
],
[
485,
"assert.equal(trueCount, 1, `5 个 tab 应只亮 1 个, 实际 ${trueCount} 个亮`);"
],
[
488,
"test('场景 10.2: 同场景下 (current + history), 高亮结果应一致 (幂等)', () => {"
],
[
497,
"assert.equal(r1, r2, 'resolveEntryTab 幂等');"
],
[
498,
"assert.equal(r1, HOME, '且结果应为 home');"
],
[
506,
"test('场景 11.1: tabBarList 为空 (服务端配置异常) → 任何 tab 都不亮', () => {"
],
[
512,
"}), null, 'tabBarList 空');"
],
[
515,
"test('场景 11.2: tabBarList.list 含脏数据 (link 为 null/空) → 不崩', () => {"
],
[
520,
"{ id: 3, text: '首页', link: { wap_url: HOME } },"
],
[
521,
"{ id: 4, text: '我的', link: { wap_url: MEMBER } },"
],
[
529,
"assert.equal(r, HOME, '脏数据不影响查找');"
],
[
532,
"test('场景 11.3: historyRoutes 含 null/空/无效值 → 安全跳过', () => {"
],
[
538,
"assert.equal(r, HOME, 'historyRoutes 脏数据 → 跳过');"
],
[
541,
"test('场景 11.4: historyRoutes 不是数组 → 视为无历史 (iOS HIG)', () => {"
],
[
549,
"assert.equal(r, null, 'historyRoutes 非数组 → 视为空 → 不点亮');"
],
[
552,
"test('场景 11.5: 当前页面是 /pages_goods/some-unmapped-page 深链 → 不亮', () => {"
],
[
557,
"}), null, '深链 unmapped 页');"
],
[
564,
"test('场景 12.1: 用户在 home → diy → 切到 member → 回 home → 进 diy, 仍归 home', () => {"
],
[
577,
"}), HOME, 'home → diy → member → 返回 → home → diy');"
],
[
580,
"test('场景 12.2: 进入 cart tab 后, 旧 packageEntryTab 被新 tab 覆盖', () => {"
],
[
587,
"}), CART, 'home → diy → 点 cart tab → CART');"
],
[
590,
"test('场景 12.3: 登出后, 旧 packageEntryTab 保持 (惰性, 下次 updateCurrentRoute 重算)', () => {"
],
[
597,
"}), HOME, '登出后 diy 高亮仍由 history-walk 决定');"
],
[
605,
"test('单元 13.1: 当前是 tab 根 → 走 step 1 精确匹配, 不查 history', () => {"
],
[
609,
"'category 是 tab 根, 不被 history 干扰',"
],
[
613,
"test('单元 13.2: lookupPageTabMap 精确匹配优先于通配符', () => {"
],
[
621,
"test('单元 13.3: lookupPageTabMap 通配符命中非精确条目', () => {"
],
[
625,
"'通配符 /pages_tool/member"
],
[
629,
"{ label: '深链扫 diy', current: DIY, history: [], expected: null },"
],
[
630,
"{ label: '首页 → diy 链接', current: DIY, history: [HOME], expected: HOME },"
],
[
631,
"{ label: '首页 → 会员中心', current: MEMBER, history: [HOME], expected: MEMBER },"
],
[
632,
"{ label: '分类 → diy 链接', current: DIY, history: [CATEGORY], expected: CATEGORY },"
],
[
633,
"{ label: '分类 → 商品列表 → diy', current: DIY, history: [CATEGORY, GOODS_LIST], expected: CATEGORY },"
],
[
634,
"{ label: '我的 → 优惠券 → diy', current: DIY, history: [MEMBER, MEMBER_COUPON], expected: MEMBER },"
],
[
635,
"{ label: '首页 → 登录页 → diy', current: DIY, history: [HOME, LOGIN], expected: HOME },"
],
[
636,
"{ label: '深链扫 member/info', current: MEMBER_INFO, history: [], expected: MEMBER },"
],
[
639,
"test('场景对照: 8 个核心业务场景', () => {"
],
[
656,
"test('场景 16.1: 在 home page (name=DIY_VIEW_INDEX), 自点 home tab → home 高亮', () => {"
],
[
668,
"assert.equal(result, true, '在 home 上点 home tab → 高亮');"
],
[
671,
"test('场景 16.2: 在 home page, 点 cart tab → cart 不亮 (无来源记忆)', () => {"
],
[
682,
"assert.equal(result, false, '在 home 上点 cart → cart 不该高亮');"
],
[
685,
"test('场景 16.3: 在 home page, 点 merchant tab → 走 PAGE_TAB_MAP 兜底', () => {"
],
[
695,
"assert.equal(result, false, 'home → merchant: HOME 优先, merchant 不亮');"
],
[
702,
"test('场景 17.1: tabBarList 异步加载场景 (文档化行为)', () => {"
],
[
712,
"assert.equal(r1, null, 'tabBarList 空时, resolveEntryTab 应安全返回 null');"
],
[
720,
"assert.equal(r2, null, 'tabBarList null 时, resolveEntryTab 应安全返回 null');"
],
[
728,
"test('场景 18.1: __TABBAR_DEBUG__ 开启时, 决策路径有 console.log', () => {"
],
[
750,
"assert.ok(logCapture.length > 0, `应至少有一次 console.log, 实际 ${logCapture.length} 次`);"
],
[
751,
"assert.ok(logCapture.some(l => l.includes('[TABBAR]')), '日志应包含 [TABBAR] 前缀');"
],
[
754,
"test('场景 18.2: __TABBAR_DEBUG__ 未开启时, 决策路径无 console.log', () => {"
],
[
776,
"assert.equal(tabbarLogs.length, 0, '__TABBAR_DEBUG__ 关闭时不应有 [TABBAR] 日志');"
],
[
779,
"test('场景 18.3: opts.debug = true 也能触发调试', () => {"
],
[
801,
"assert.ok(tabbarLogs.length > 0, 'opts.debug=true 应触发 [TABBAR] 日志');"
],
[
808,
"test('场景 19.1: 多语言切换时高亮结果不变 (zh → en → ja)', () => {"
],
[
816,
"assert.equal(initial, HOME, '语言切换前: HOME');"
],
[
827,
"assert.equal(afterRefresh1, HOME, '第 1 次 re-render: HOME');"
],
[
828,
"assert.equal(afterRefresh2, HOME, '第 2 次 re-render: HOME');"
],
[
829,
"assert.equal(initial, afterRefresh1, '高亮幂等');"
],
[
830,
"assert.equal(afterRefresh1, afterRefresh2, '高亮幂等');"
],
[
833,
"test('场景 19.2: 语言切换时不同页面的高亮都正确', () => {"
],
[
848,
"assert.equal(result, sc.expected, `${sc.label} (第 ${i + 1} 次)`);"
],
[
857,
"test('场景 20.1: 登出后 packageEntryTab 保持 (惰性, 不主动清)', () => {"
],
[
863,
"assert.equal(before, HOME, '登出前: HOME 高亮');"
],
[
877,
"'setMemberInfo 函数体不应包含 packageEntryTab (惰性更新)',"
],
[
882,
"test('场景 20.2: 登出后新导航自然覆盖 packageEntryTab', () => {"
],
[
889,
"assert.equal(r1, null, '登出后深链 diy → 不点亮 (iOS HIG)');"
],
[
896,
"assert.equal(r2, HOME, '登出后重新进 diy → HOME (新 history-walk)');"
],
[
899,
"test('场景 20.3: 登出后登入另一账号, 高亮反映新行为', () => {"
],
[
908,
"assert.equal(r, HOME, '新账号进 diy → HOME (新 history-walk 决定)');"
],
[
915,
"test('场景 21.1: 500 步历史栈应在 50ms 内完成 resolveEntryTab', () => {"
],
[
932,
"assert.equal(result, HOME, '500 步栈应找到 HOME');"
],
[
933,
"assert.ok(elapsedMs < 50, `应 < 50ms, 实际 ${elapsedMs.toFixed(2)}ms`);"
],
[
936,
"test('场景 21.2: 1000 步历史栈性能依然可接受', () => {"
],
[
951,
"assert.ok(elapsedMs < 100, `1000 步应 < 100ms, 实际 ${elapsedMs.toFixed(2)}ms`);"
],
[
954,
"test('场景 21.3: 1000 次 findHighlightedTab 端到端性能', () => {"
],
[
965,
"assert.ok(perCall < 1, `每次应 < 1ms, 实际 ${perCall.toFixed(4)}ms`);"
],
[
972,
"test('场景 22.1: 极长路径名 (200 字符) 仍能正确匹配', () => {"
],
[
984,
"assert.equal(result, true, '极长路径应被通配符命中');"
],
[
987,
"test('场景 22.2: URL 编码的 query 参数 (含 %xx) 不影响匹配', () => {"
],
[
994,
"assert.equal(result, HOME, 'URL 编码 query 不影响 diy 高亮');"
],
[
997,
"test('场景 22.3: query 含特殊字符 (& =) 不影响路径匹配', () => {"
],
[
1003,
"assert.equal(result, CATEGORY, '商品详情 (复杂 query) → CATEGORY');"
],
[
1006,
"test('场景 22.4: 路径含 hash (H5 模式) 不影响匹配', () => {"
],
[
1014,
"assert.equal(result, HOME, '标准路径 → HOME');"
],
[
1017,
"test('场景 22.5: 路径前缀相近但不匹配通配符 (members vs member)', () => {"
],
[
1029,
"assert.equal(result, false, '前缀相近路径不应被错误匹配');"
],
[
1036,
"test('场景 23.1: tabBarList 从一种配置切到另一种, 高亮应基于新配置', () => {"
],
[
1039,
"{ id: 1, text: '首页', url: HOME },"
],
[
1040,
"{ id: 2, text: '我的', url: MEMBER },"
],
[
1050,
"assert.equal(result, HOME, '新配置下, home → HOME 仍高亮');"
],
[
1053,
"test('场景 23.2: 切换 tabBarList 后 PAGE_TAB_MAP 仍指向已删除的 tab', () => {"
],
[
1057,
"{ id: 1, text: '首页', url: HOME },"
],
[
1073,
"assert.equal(result, false, 'PAGE_TAB_MAP 优先: MEMBER_INFO 不归 HOME (即使 MEMBER 已删除)');"
],
[
1086,
"assert.equal(result2, false, '没任何信号 → 不点亮');"
],
[
1089,
"test('场景 23.3: tabBarList 从 null 恢复 (用户等了很久后端才返回)', () => {"
],
[
1096,
"assert.equal(r1, null, 'tabBarList 空时不点亮');"
],
[
1104,
"assert.equal(r2, HOME, 'tabBarList 恢复后: HOME');"
]
],
"tests\\search-keyword-encoding.test.js": [
[
37,
"test('_safeEncodeForPlatform: 鸿蒙元服务 → JS 只 encode 分隔符(和 mp-weixin 一致)', () => {"
],
[
45,
"const r1 = api._safeEncodeForPlatform('沙发');"
],
[
46,
"assert.equal(r1, '沙发', `mp-harmony 中文应原样,实际: ${r1}`);"
],
[
50,
"assert.equal(r2, 'a%26b%3Dc', `mp-harmony 分隔符应 encode,实际: ${r2}`);"
],
[
54,
"assert.equal(r3, '`hello%20world`', `mp-harmony 空格应 encode,实际: ${r3}`);"
],
[
57,
"test('_safeEncodeForPlatform: 鸿蒙下已编码入参 → decode 一次还原(避免双编码)', () => {"
],
[
65,
"assert.equal(r, '发', `mp-harmony 已编码入参应 decode 一次,实际: ${r}`);"
],
[
68,
"test('_safeEncodeForPlatform: H5 → JS 侧主动 encode', () => {"
],
[
72,
"const r1 = api._safeEncodeForPlatform('沙发');"
],
[
73,
"assert.equal(r1, '%E6%B2%99%E5%8F%91', `h5 中文应 encode,实际: ${r1}`);"
],
[
76,
"assert.equal(r2, 'a%26b', `h5 & 应 encode 成 %26,实际: ${r2}`);"
],
[
79,
"test('_safeEncodeForPlatform: 微信小程序 → JS 只 encode 分隔符 (不 encode 中文)', () => {"
],
[
87,
"const r1 = api._safeEncodeForPlatform('沙发');"
],
[
88,
"assert.equal(r1, '沙发', `mp-weixin 中文应原样,实际: ${r1}`);"
],
[
92,
"assert.equal(r2, 'a%26b', `mp-weixin & 应 encode 成 %26,实际: ${r2}`);"
],
[
96,
"assert.equal(r3, 'a%3Db', `mp-weixin = 应 encode 成 %3D,实际: ${r3}`);"
],
[
100,
"assert.equal(r4, 'a%3Fb', `mp-weixin ? 应 encode 成 %3F,实际: ${r4}`);"
],
[
107,
"test('_safeEncodeForPlatform: 华为快应用 → JS 侧主动 encode', () => {"
],
[
111,
"const r1 = api._safeEncodeForPlatform('沙发');"
],
[
112,
"assert.equal(r1, '%E6%B2%99%E5%8F%91', `quickapp 中文应 encode,实际: ${r1}`);"
],
[
115,
"test('_safeEncodeForPlatform: 已编码字符串不双编码(非微信/非鸿蒙平台)', () => {"
],
[
124,
"assert.equal(r, '%E8%A1%A8', `${p} decode roundtrip + re-encode 不应双编码,实际: ${r}`);"
],
[
128,
"test('_safeEncodeForPlatform: 微信小程序下已编码入参 → decode 一次还原', () => {"
],
[
133,
"assert.equal(r, '发', `mp-weixin 已编码入参应 decode 一次,实际: ${r}`);"
],
[
217,
"test('端到端: 鸿蒙元服务 → 搜索关键词\"沙发\"在列表页 search 输入框显示原文(不乱码)', () => {"
],
[
227,
"const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
],
[
230,
"assert.ok(url.includes('keyword=沙发'),"
],
[
231,
"`鸿蒙下 url 应含 keyword=沙发,实际: ${url}`);"
],
[
235,
"assert.equal(options.keyword, '沙发',"
],
[
236,
"`鸿蒙下 onLoad(options).keyword 应是原文,实际: ${options.keyword}`);"
],
[
239,
"test('端到端: 鸿蒙元服务 → 含中文 + 反引号 + 空格的关键词在列表页 search 显示原文', () => {"
],
[
246,
"const kw = '`hello world` 沙发';"
],
[
250,
"`鸿蒙下 url 应含 JS 编码后的 keyword(空格 → %20),实际: ${url}`);"
],
[
255,
"`鸿蒙下 onLoad(options).keyword 应是 decode 后的原文,实际: ${options.keyword}`);"
],
[
261,
"test('端到端: 微信小程序 → 搜索关键词\"沙发\"在列表页 search 输入框显示原文(不乱码)', () => {"
],
[
268,
"const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
],
[
272,
"`微信下 url 不应含 %xx(JS 不预 encode 中文),实际 url: ${url}`);"
],
[
273,
"assert.ok(url.includes('keyword=沙发'),"
],
[
274,
"`微信下 url 应含 keyword=沙发,实际: ${url}`);"
],
[
278,
"assert.equal(options.keyword, '沙发',"
],
[
279,
"`微信下 onLoad(options).keyword 应是原文,实际: ${options.keyword}`);"
],
[
282,
"test('端到端: 微信小程序 → 含中文 + 反引号 + 空格的关键词在列表页 search 显示原文', () => {"
],
[
287,
"const kw = '`hello world` 沙发';"
],
[
290,
"assert.ok(url.includes('keyword=' + encode('`hello world` 沙发')),"
],
[
291,
"`微信下 url 应含 JS 编码后的 keyword(空格 → %20),实际: ${url}`);"
],
[
296,
"`微信下 onLoad(options).keyword 应是 decode 后的原文,实际: ${options.keyword}`);"
],
[
302,
"test('端到端: H5 → 搜索关键词在列表页 search 输入框显示原文', () => {"
],
[
307,
"const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
],
[
309,
"`H5 下 url 应含编码后的 keyword,实际: ${url}`);"
],
[
313,
"assert.equal(options.keyword, '沙发',"
],
[
314,
"`H5 下 browser decode 后 keyword 应是原文,实际: ${options.keyword}`);"
],
[
320,
"test('端到端: 快应用 → 搜索关键词在列表页 search 输入框显示原文', () => {"
],
[
325,
"const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
],
[
327,
"`快应用下 url 应含编码后的 keyword,实际: ${url}`);"
],
[
330,
"assert.equal(options.keyword, '沙发',"
],
[
331,
"`快应用下 decode 后 keyword 应是原文,实际: ${options.keyword}`);"
],
[
337,
"test('Bug 回归场景: 商品分类页输入\"沙发\" → 列表页搜索框显示\"沙发\"(4 平台)', () => {"
],
[
362,
"const keyword = searchClick(p, '沙发');"
],
[
363,
"assert.equal(keyword, '沙发',"
],
[
364,
"`${p} 平台:onLoad(options).keyword 应是\"沙发\",实际: ${keyword}`);"
],
[
368,
"test('Bug 回归场景: 长关键词 + 特殊字符,4 平台都不应乱码', () => {"
],
[
388,
"'沙发',"
],
[
389,
"'Nike 运动鞋',"
],
[
390,
"'`反引号`',"
],
[
391,
"'100%纯棉',"
],
[
392,
"'价格>100',"
],
[
400,
"`${p} 平台: 关键词 \"${kw}\" 应原样传递,实际: \"${got}\"`);"
],
[
408,
"test('防御: 鸿蒙下已 encode 的入参 → decode 一次还原(避免双编码)', () => {"
],
[
418,
"assert.ok(url.includes('keyword=发'),"
],
[
419,
"`鸿蒙下已编码入参应被 decode 还原,实际 url: ${url}`);"
],
[
423,
"assert.equal(options.keyword, '发',"
],
[
424,
"`鸿蒙下 decode 一次后应是原文,实际: ${options.keyword}`);"
],
[
427,
"test('防御: 微信下已 encode 的入参 → decode 一次还原(避免平台 encode 后变成双编码)', () => {"
],
[
434,
"assert.ok(url.includes('keyword=发'),"
],
[
435,
"`微信下已编码入参应被 decode 还原,实际 url: ${url}`);"
],
[
438,
"assert.equal(options.keyword, '发',"
],
[
439,
"`微信下 decode-encode-decode 一次后应是原文,实际: ${options.keyword}`);"
]
],
"tests\\util-navigate.test.js": [
[
39,
"test('util-navigate.js: 能被 vm 加载,所有 export 都存在', () => {"
],
[
50,
"`${name} 应是 function,实际是 ${typeof nav[name]}`);"
],
[
57,
"test('createNavigateApi: 一次性拿到所有跳转方法', () => {"
],
[
72,
"test('_toParamValueString: 各种类型', () => {"
],
[
83,
"test('parsePageParams: JSON 字符串 / 对象 / null / 兜底', () => {"
],
[
99,
"test('resolveLinkUrl: 拆分 wap_url 的 query 进 page_params', () => {"
],
[
109,
"test('resolveLinkUrl: 无 wap_url 返回 null', () => {"
],
[
118,
"test('cleanParamUrls: 移除反引号和首尾空白', () => {"
],
[
126,
"test('cleanParamUrls: 任意 key / 任意嵌套层级', () => {"
],
[
137,
"test('normalizeUrl: 严格不补协议/不补 host', () => {"
],
[
144,
"test('normalizeUrl: host 小写 + 去默认端口', () => {"
],
[
154,
"test('appendQueryParams: 基本功能', () => {"
],
[
162,
"test('appendQueryParams: 已有 ? 时用 &', () => {"
],
[
170,
"test('appendQueryParams: 对象走 JSON.stringify', () => {"
],
[
179,
"test('getPlatform: createNavigateApi 注入 platform 强制指定', () => {"
],
[
189,
"test('getPlatform: 运行时 platform 注入(模拟 systemInfo)', () => {"
],
[
210,
"test('shouldEncodeUrl: 4 平台都为 true', () => {"
],
[
220,
"test('_safeEncodeForPlatform: H5 / 华为快应用 → 主动 encode', () => {"
],
[
226,
"assert.equal(r, 'a%26b', `${p}: & 必须 encode 成 %26,实际: ${r}`);"
],
[
230,
"test('_safeEncodeForPlatform: 鸿蒙元服务 → JS 只 encode 分隔符(和 mp-weixin 行为一致)', () => {"
],
[
237,
"assert.equal(api._safeEncodeForPlatform('a&b'), 'a%26b', '& 应 encode 成 %26');"
],
[
238,
"assert.equal(api._safeEncodeForPlatform('沙发'), '沙发', '中文不应 encode');"
],
[
239,
"assert.equal(api._safeEncodeForPlatform('a=b'), 'a%3Db', '= 应 encode 成 %3D');"
],
[
240,
"assert.equal(api._safeEncodeForPlatform('a?b'), 'a%3Fb', '? 应 encode 成 %3F');"
],
[
243,
"test('_safeEncodeForPlatform: 微信小程序 → JS 只 encode 分隔符', () => {"
],
[
248,
"assert.equal(api._safeEncodeForPlatform('a&b'), 'a%26b', '& 应 encode 成 %26');"
],
[
249,
"assert.equal(api._safeEncodeForPlatform('沙发'), '沙发', '中文不应 encode');"
],
[
250,
"assert.equal(api._safeEncodeForPlatform('a=b'), 'a%3Db', '= 应 encode 成 %3D');"
],
[
251,
"assert.equal(api._safeEncodeForPlatform('a?b'), 'a%3Fb', '? 应 encode 成 %3F');"
],
[
254,
"test('_safeEncodeForPlatform: 已编码字符串不双编码(非微信/非鸿蒙平台)', () => {"
],
[
261,
"assert.equal(r, '%E8%A1%A8', `${p} decode roundtrip + re-encode 不应双编码,实际: ${r}`);"
],
[
265,
"test('_safeEncodeForPlatform: 微信/鸿蒙下已编码入参 → decode 一次还原', () => {"
],
[
270,
"assert.equal(r, '表', `${p} 已编码入参应 decode 一次还原,实际: ${r}`);"
],
[
277,
"test('_navigateTo: H5 用 window.location', () => {"
],
[
316,
"test('_navigateTo: 微信小程序调 uni.navigateTo', () => {"
],
[
337,
"test('_navigateTo: 鸿蒙元服务 tabBar 用 reLaunch 兜底', () => {"
],
[
354,
"assert.equal(calls.switchTab.length, 0, '鸿蒙不用 switchTab');"
],
[
355,
"assert.equal(calls.reLaunch.length, 1, '鸿蒙用 reLaunch 兜底');"
],
[
361,
"test('util.js: 通过 import 引用 util-navigate 的方法,挂载到 default export', () => {"
],
[
371,
"'util.js 应 import util-navigate.js');"
],
[
373,
"'util.js 应 import cleanParamUrls');"
],
[
375,
"'util.js 应 import normalizeUrl 别名 _normalizeUrlBase');"
],
[
377,
"'util.js 应 import extractInternalAppPath 别名');"
],
[
379,
"'util.js 应 import resolveNavMode 别名');"
],
[
382,
"'util.js 应把 cleanParamUrls 挂载到 default export');"
],
[
384,
"'util.js 的 normalizeUrl 应委托给 _normalizeUrlBase');"
],
[
390,
"test('util.js: redirectTo / diyRedirectTo 仍在 util.js(没被搬走)', () => {"
],
[
397,
"'redirectTo 应仍在 util.js');"
],
[
400,
"'diyRedirectTo 应仍在 util.js');"
],
[
403,
"'redirectTo 应调 _safeEncodeForPlatform');"
],
[
406,
"'diyRedirectTo 应调 this.cleanParamUrls');"
],
[
409,
"'diyRedirectTo 应调 _resolveNavMode');"
],
[
411,
"'diyRedirectTo 应调 _extractInternalAppPath');"
],
[
418,
"test('extractInternalAppPath: 相对内部路径直接放行', () => {"
],
[
424,
"test('extractInternalAppPath: 同域绝对 URL → 还原为相对路径', () => {"
],
[
433,
"test('extractInternalAppPath: 同平台不同子域(域名不完全一致)→ null(严格模式)', () => {"
],
[
442,
"test('extractInternalAppPath: 传入完整 URL 作为白名单也能提取 host(完全一致才还原)', () => {"
],
[
456,
"test('extractInternalAppPath: 外链域名不同(Shopify / Facebook)→ 不误伤, 返回 null', () => {"
],
[
464,
"test('extractInternalAppPath: 绝对 URL 但路径无 /pages 段 → null(真外链)', () => {"
],
[
470,
"test('extractInternalAppPath: 无白名单时绝对 URL 一律 null(不猜测)', () => {"
],
[
476,
"test('extractInternalAppPath: 空/非法输入安全返回 null', () => {"
],
[
483,
"test('extractInternalAppPath: host 大小写不敏感 + 忽略端口', () => {"
],
[
498,
"test('extractInternalAppPath: 各分包页面根都能识别 + 保留 hash', () => {"
],
[
509,
"test('extractInternalAppPath: allowedHosts=true → 跳过 host 校验(强制内部)', () => {"
],
[
543,
"test('resolveNavMode: 未设置 / 未知值 → auto', () => {"
],
[
555,
"test('hasStaleUniacidInUrl: URL 无 uniacid → false', () => {"
],
[
561,
"test('hasStaleUniacidInUrl: URL uniacid 与当前一致 → false', () => {"
],
[
568,
"test('hasStaleUniacidInUrl: URL uniacid 与当前不一致 → true(脏数据)', () => {"
],
[
574,
"test('hasStaleUniacidInUrl: 兼容 URL 编码 + 大小写 + 多个 query', () => {"
],
[
582,
"test('hasStaleUniacidInUrl: currentUniacid 无效 → false(无法比较)', () => {"
],
[
590,
"test('hasStaleUniacidInUrl: 空 / 非法输入 → false(安全降级)', () => {"
],
[
604,
"test('pickCurrentUniacid: 第一参(运行时 storage)非 0 → 选第一参', () => {"
],
[
610,
"test('pickCurrentUniacid: 第一参无值 → 回退到第二参(Config 兜底)', () => {"
],
[
617,
"test('pickCurrentUniacid: 第一参为 0 → 回退到第二参(关键边界)', () => {"
],
[
625,
"test('pickCurrentUniacid: 两个参都无值 → 0', () => {"
],
[
633,
"test('pickCurrentUniacid: 字符串数字自动 parseInt', () => {"
]
],
"components-diy\\diy-group.vue": [
[
5,
"<!-- 门店展示 -->"
],
[
10,
"<!-- 客服按钮 -->"
],
[
15,
"<!-- 表单组件 -->"
],
[
22,
"<!-- 门店标签 -->"
],
[
27,
"<!-- 单图组组件 -->"
],
[
32,
"<!-- 列表按钮组件 -->"
],
[
37,
"<!-- 文本 -->"
],
[
42,
"<!-- 公告 -->"
],
[
47,
"<!-- 图文导航 -->"
],
[
52,
"<!-- 图片广告 -->"
],
[
57,
"<!-- 搜索 -->"
],
[
63,
"<!-- 富文本 -->"
],
[
68,
"<!-- 辅助线 -->"
],
[
73,
"<!-- 辅助空白 -->"
],
[
78,
"<!-- 优惠券 -->"
],
[
83,
"<!-- 商品列表 -->"
],
[
88,
"<!-- 多商品组 -->"
],
[
94,
"<!-- 魔方、橱窗 -->"
],
[
99,
"<!-- 视频 -->"
],
[
107,
"<!-- 秒杀 -->"
],
[
112,
"<!-- 拼团 -->"
],
[
117,
"<!-- 团购 -->"
],
[
121,
"<!-- 拼团返利 -->"
],
[
127,
"<!-- 砍价 -->"
],
[
132,
"<!-- 预售 -->"
],
[
137,
"<!-- 店铺笔记 -->"
],
[
142,
"<!-- 浮动按钮 -->"
],
[
147,
"<!-- 小程序直播 -->"
],
[
154,
"<!-- 分销商品 -->"
],
[
159,
"<!-- 商品推荐 -->"
],
[
164,
"<!-- 商品品牌 -->"
],
[
169,
"<!-- 文章 -->"
],
[
174,
"<!-- 商户列表 -->"
],
[
179,
"<!-- 自定义会员中心——会员信息 -->"
],
[
184,
"<!-- 自定义会员中心——我的订单 -->"
],
[
189,
"<!-- 快捷导航 -->"
],
[
194,
"<!-- 付款码 -->"
],
[
199,
"<!-- 热区 -->"
],
[
204,
"<!-- 关注公众号 -->"
],
[
209,
"<!-- 地图组件 -->"
],
[
215,
"<!-- 音频 -->"
],
[
220,
"<!-- 图片导航 -->"
],
[
225,
"<!-- 数字 -->"
],
[
230,
"<!-- 视频列表 -->"
],
[
235,
"<!-- 底部导航 -->"
],
[
240,
"<!-- 分类项 -->"
],
[
245,
"<!-- 分类 -->"
],
[
250,
"<!-- 图标 -->"
],
[
255,
"<!-- Tab 组件 -->"
],
[
260,
"<!-- 视频号列表 -->"
],
[
264,
"<!-- 自定义扩展组件 -->"
]
],
"tests\\util.test.js": [
[
61,
"console.warn('[normalizeUrl] scheme 后有多余的 /:', urlString);"
],
[
110,
"console.warn('[normalizeUrl] host 含非法字符:', urlString);"
],
[
396,
"test('decodeEntity: 解码 &amp; 等 HTML 实体', () => {"
],
[
400,
"test('decodeEntity: 解码 &#x4E2D; 这种十六进制', () => {"
],
[
401,
"assert.equal(decodeEntity('&#x4E2D;'), '中');"
],
[
407,
"test('normalizeUrl: 基础 https URL 不变', () => {"
],
[
414,
"test('normalizeUrl: 剥离反引号和首尾空白', () => {"
],
[
425,
"test('normalizeUrl: 不补协议,内部路径原样返回', () => {"
],
[
430,
"test('normalizeUrl: 不补 host,只补协议也不做', () => {"
],
[
434,
"test('normalizeUrl: host 小写', () => {"
],
[
441,
"test('normalizeUrl: 去默认端口', () => {"
],
[
447,
"test('normalizeUrl: 解析 . 和 ..', () => {"
],
[
451,
"test('normalizeUrl: 合并连续"
],
[
455,
"test('normalizeUrl: query 排序', () => {"
],
[
462,
"test('normalizeUrl: BOM / 零宽字符剥离', () => {"
],
[
469,
"test('normalizeUrl: 全部是空白或反引号返回空串', () => {"
],
[
474,
"test('normalizeUrl: 非字符串返回空串', () => {"
],
[
483,
"test('resolveLinkUrl: 拆分 wap_url 的 query 进 page_params', () => {"
],
[
491,
"test('resolveLinkUrl: page_params 优先于 wap_url query', () => {"
],
[
500,
"test('resolveLinkUrl: 无 wap_url 返回 null', () => {"
],
[
508,
"test('adaptSubpackageUrl: 老前缀映射到新前缀', () => {"
],
[
519,
"test('adaptSubpackageUrl: 已经是新前缀不动', () => {"
],
[
526,
"test('adaptSubpackageUrl: 把 3 个及以上 / 收敛成 2 个', () => {"
],
[
536,
"test('redirectTo: 基础 navigateTo 拼装 url', () => {"
],
[
546,
"test('redirectTo: 0 号清理步骤 — 移除 param.src 反引号 + 修补 scheme', () => {"
],
[
554,
"assert.ok(!call.url.includes('`'), 'url 不应包含反引号');"
],
[
560,
"test('redirectTo: page_params 永远在最末', () => {"
],
[
564,
"assert.ok(url.endsWith('page_params={\"x\":\"y\"}'), 'page_params 应在 URL 末尾');"
],
[
567,
"test('redirectTo: mode=redirectTo 调 uni.redirectTo', () => {"
],
[
574,
"test('redirectTo: mode=reLaunch 调 uni.reLaunch', () => {"
],
[
583,
"test('diyRedirectTo: 外部链接带脏数据(反引号+空格)能清洗干净', () => {"
],
[
587,
"title: '表单',"
],
[
594,
"assert.ok(call, '应该调用了 uni.navigateTo');"
],
[
597,
"assert.ok(!url.includes('`'), 'url 不应包含反引号: ' + url);"
],
[
601,
"assert.ok(url.startsWith('/pages_tool/webview/webview?'), '应跳到 webview 页面: ' + url);"
],
[
604,
"assert.ok(srcMatch, 'url 应含 src 参数');"
],
[
607,
"'src 应以正确的 host + path 开头: ' + src);"
],
[
610,
"assert.ok(src.includes('id=130'), 'src 内应含 id=130');"
],
[
611,
"assert.ok(src.includes('uniacid=2482'), 'src 内应含 uniacid=2482');"
],
[
614,
"test('diyRedirectTo: wap_url 是畸形 https:"
],
[
618,
"title: '表单',"
],
[
626,
"assert.ok(call, '应该调用了 uni.navigateTo');"
],
[
628,
"assert.ok(url.includes('src='), 'url 应含 src 参数');"
],
[
635,
"assert.ok(!srcMatch[1].includes('host.com'), 'src 不应含 host.com(被 reject)');"
],
[
639,
"test('diyRedirectTo: 内部路径不走 webview', () => {"
],
[
643,
"title: '详情',"
],
[
647,
"assert.ok(call.url.startsWith('/pages_order/detail?'), '应跳到内部路径: ' + call.url);"
],
[
650,
"test('diyRedirectTo: page_params 的键值会出现在 src 内', () => {"
],
[
654,
"title: '表单',"
],
[
659,
"assert.ok(url.includes('id=130'), '应含 id=130');"
],
[
660,
"assert.ok(url.includes('uniacid=2482'), '应含 uniacid=2482');"
]
],
"tests\\cross-platform.test.js": [
[
153,
"test('getPlatform: 4 个平台都识别正确', () => {"
],
[
160,
"test('getPlatform: 编译时变量也能识别', () => {"
],
[
167,
"test('getPlatform: 运行时特征(鸿蒙/微信)识别', () => {"
],
[
181,
"test('getPlatform: 有 window 没 uni → h5', () => {"
],
[
185,
"test('getPlatform: 兜底 h5', () => {"
],
[
191,
"test('getPlatform: 华为快应用 = H5 嵌入快应用 Webview,通过 systemInfo.platform 识别', () => {"
],
[
213,
"test('shouldEncodeUrl: 4 个平台都为 true', () => {"
],
[
217,
"assert.equal(shouldEncodeUrl(), true, `${p} 平台应该 encode`);"
],
[
224,
"test('safeEncode: 4 个平台对普通字符串 encode 行为一致', () => {"
],
[
227,
"assert.equal(r1, 'hello', `${p} 普通字符串不变`);"
],
[
228,
"const r2 = safeEncodeForPlatform('`表单`', p);"
],
[
229,
"assert.equal(r2, '%60%E8%A1%A8%E5%8D%95%60', `${p} 反引号应被 encode`);"
],
[
231,
"assert.equal(r3, 'a%26b', `${p} & 应被 encode`);"
],
[
235,
"test('safeEncode: 4 个平台对已编码字符串不双编码', () => {"
],
[
239,
"assert.equal(r, '%E8%A1%A8', `${p} decode roundtrip + re-encode 不应双编码`);"
],
[
243,
"test('safeEncode: src 内嵌 URL 的 & 在 4 个平台都被 encode(防微信丢参数)', () => {"
],
[
248,
"assert.ok(!r.includes('&'), `${p} src 不应含裸 &: ${r}`);"
],
[
249,
"assert.ok(r.includes('%26'), `${p} src 应含 %26: ${r}`);"
],
[
256,
"test('_navigateTo: H5 用 window.location', () => {"
],
[
263,
"test('_navigateTo: H5 redirectTo/reLaunch 用 location.replace', () => {"
],
[
271,
"test('_navigateTo: 微信小程序默认调 uni.navigateTo', () => {"
],
[
278,
"test('_navigateTo: 微信小程序 redirectTo/reLaunch 调对应 API', () => {"
],
[
286,
"test('_navigateTo: 微信小程序 tabBar 调 uni.switchTab', () => {"
],
[
293,
"test('_navigateTo: 鸿蒙元服务 tabBar 兜底用 reLaunch(不用 switchTab)', () => {"
],
[
297,
"assert.equal(ctx.calls.switchTab.length, 0, '鸿蒙不用 switchTab');"
],
[
298,
"assert.equal(ctx.calls.reLaunch.length, 1, '鸿蒙用 reLaunch 兜底');"
],
[
301,
"test('_navigateTo: 鸿蒙元服务普通跳转用 uni.navigateTo', () => {"
],
[
307,
"test('_navigateTo: 华为快应用 tabBar 调 uni.switchTab', () => {"
],
[
314,
"test('_navigateTo: 华为快应用普通跳转调 uni.navigateTo', () => {"
],
[
320,
"test('_navigateTo: 非 H5 但没有 uni 全局 → noop(不报错)', () => {"
],
[
328,
"test('_navigateTo: H5 但没有 window → noop(不报错)', () => {"
],
[
339,
"test('diyRedirectTo 外部链接: H5 直接跳完整 URL,不走 webview 容器', () => {"
],
[
350,
"test('diyRedirectTo 外部链接: 微信跳到 webview 容器,url 作为 src', () => {"
],
[
359,
"'应跳到 webview: ' + url);"
],
[
363,
"assert.ok(!srcMatch[1].includes('&'), 'src 不应含裸 &: ' + url);"
],
[
366,
"test('diyRedirectTo 外部链接: 鸿蒙跳到 webview 容器(走 uni.navigateTo)', () => {"
],
[
374,
"test('diyRedirectTo 外部链接: 华为快应用跳到 webview 容器(走 uni.navigateTo)', () => {"
],
[
385,
"test('端到端: 4 平台 — 你的真实 link 走完跳转,参数全部保留', () => {"
],
[
388,
"title: '表单',"
],
[
402,
"`H5 完整 url 应被设置: ${url}`);"
],
[
414,
"assert.ok(keys.includes('src'), `${p} 应含 src: ${url}`);"
],
[
415,
"assert.ok(keys.includes('id'), `${p} 应含 id: ${url}`);"
],
[
416,
"assert.ok(keys.includes('uniacid'), `${p} 应含 uniacid: ${url}`);"
],
[
424,
"test('safeEncode: null/undefined 不报错', () => {"
],
[
429,
"assert.ok(typeof r1 === 'string', `${p} null 应返回字符串`);"
],
[
430,
"assert.ok(typeof r2 === 'string', `${p} undefined 应返回字符串`);"
],
[
434,
"test('safeEncode: 数字 0 / 布尔 false 都正确', () => {"
],
[
441,
"test('safeEncode: 对象走 JSON.stringify 路径', () => {"
],
[
445,
"assert.equal(r, '%7B%22id%22%3A%22130%22%7D', `${p} 对象序列化`);"
],
[
449,
"test('navigateTo: 4 平台 url 都正确传过去', () => {"
]
],
"tests\\_v.js": [
[
28,
"{ id:1, text:'首页', link:{wap_url:HOME} }, { id:2, text:'分类', link:{wap_url:CATEGORY} },"
],
[
29,
"{ id:3, text:'购物车', link:{wap_url:CART} }, { id:4, text:'商户', link:{wap_url:MERCHANT} },"
],
[
30,
"{ id:5, text:'我的', link:{wap_url:MEMBER} },"
],
[
59,
"const A = (a, e, l) => assert.equal(a, e, `[${l}] 期望 ${e||'不点亮'}, 实际 ${a||'不点亮'}`);"
],
[
75,
"T('3.4 链式', () => {"
],
[
78,
"assert.equal(findH(tabs[i], tabs.slice(0, i)), tabs[i], `链式${i+1}`);"
],
[
90,
"T('5.2 diy 走 history-walk', () => A(findH(DIY, [HOME]), HOME, '5.2'));"
],
[
91,
"T('5.3 diy 不在 PAGE_TAB_MAP', () => assert.equal(PAGE_TAB_MAP[DIY], undefined));"
],
[
93,
"T('6.1 深链 diy', () => A(findH(DIY, []), null, '6.1'));"
],
[
94,
"T('6.2 深链 diy?id=123', () => A(findH(DIY + '?id=123', []), null, '6.2'));"
],
[
95,
"T('6.3 深链 goods/detail', () => A(findH(GOODS_DETAIL, []), CATEGORY, '6.3'));"
],
[
96,
"T('6.4 深链 member', () => A(findH(MEMBER, []), MEMBER, '6.4'));"
],
[
97,
"T('6.5 深链 fenxiao', () => A(findH(FENXIAO, []), null, '6.5'));"
],
[
105,
"T('8.2 PAGE_TAB_MAP 优先 from_tab', () => assert.equal(checkTabBarActive(MEMBER, DIY, tabBarList, {}, {from_tab:MEMBER}, {noTabPages:NO_TAB_PAGES, pageTabMap:{[DI"
],
[
106,
"T('8.3 非法 from_tab', () => assert.equal(checkTabBarActive(HOME, DIY, tabBarList, {}, {from_tab:'/foo/bar'}, {noTabPages:NO_TAB_PAGES, pageTabMap:{}, pageTabWild"
],
[
108,
"T('9.1 diy 带 query', () => A(findH('/pages_tool/index/diy?id=123&from=share', [HOME]), HOME, '9.1'));"
],
[
109,
"T('9.2 tab 根带 query', () => assert.equal(resolveEntryTab({currentPageRoute:'/pages/index/index?from=share', tabBarList, historyRoutes:[]}), HOME));"
],
[
110,
"T('9.3 老路径', () => assert.equal(resolveEntryTab({currentPageRoute:DIY, tabBarList, historyRoutes:['/pages/member/index']}), MEMBER));"
],
[
112,
"T('10.1 互斥 1 亮', () => {"
],
[
116,
"T('10.2 幂等', () => {"
],
[
122,
"T('11.1 tabBarList 空', () => A(findH(DIY, [HOME], {list:[]}), null, '11.1'));"
],
[
123,
"T('11.2 脏数据', () => {"
],
[
127,
"T('11.3 history 脏', () => assert.equal(resolveEntryTab({currentPageRoute:DIY, tabBarList, historyRoutes:[null,'',undefined,HOME]}), HOME));"
],
[
128,
"T('11.4 history 非数组', () => assert.equal(resolveEntryTab({currentPageRoute:DIY, tabBarList, historyRoutes:'not-array'}), MEMBER));"
],
[
129,
"T('11.5 深链 unmapped', () => A(findH('/pages_goods/some-unmapped-page', []), null, '11.5'));"
],
[
131,
"T('12.1 home→diy→member→回→home→diy', () => A(findH(DIY, [HOME]), HOME, '12.1'));"
],
[
132,
"T('12.2 home→diy→点 cart tab', () => A(findH(CART, [HOME]), CART, '12.2'));"
],
[
133,
"T('12.3 登出后 diy', () => A(findH(DIY, [HOME]), HOME, '12.3'));"
],
[
135,
"T('13.1 tab 根优先', () => assert.equal(resolveEntryTab({currentPageRoute:CATEGORY, tabBarList, historyRoutes:[HOME, MEMBER]}), CATEGORY));"
],
[
136,
"T('13.2 精确', () => assert.equal(lookupPageTabMap(MEMBER, PAGE_TAB_MAP, PAGE_TAB_WILDCARDS), MEMBER));"
],
[
137,
"T('13.3 通配符', () => {"
],
[
141,
"T('13.4 null 优先', () => {"
],
[
146,
"T('13.5 无匹配', () => assert.equal(lookupPageTabMap(DIY, PAGE_TAB_MAP, PAGE_TAB_WILDCARDS), undefined));"
],
[
147,
"T('13.6 前缀相近', () => assert.equal(lookupPageTabMap('/pages_tool/members', PAGE_TAB_MAP, PAGE_TAB_WILDCARDS), undefined));"
],
[
149,
"T('14.1 非法 link', () => assert.equal(checkTabBarActive('/pages/x', DIY, tabBarList, {pages_tool:HOME}, {from_tab:HOME}, {noTabPages:NO_TAB_PAGES, pageTabMap:PAG"
],
[
150,
"T('14.2 NO_TAB_PAGES 都不亮', () => {"
],
[
156,
"T('15. 8 场景', () => {"
],
[
158,
"['深链扫 diy', DIY, [], null],"
],
[
159,
"['首页 → diy 链接', DIY, [HOME], HOME],"
],
[
160,
"['首页 → 会员中心', MEMBER, [HOME], MEMBER],"
],
[
161,
"['分类 → diy 链接', DIY, [CATEGORY], CATEGORY],"
],
[
162,
"['分类 → 商品列表 → diy', DIY, [CATEGORY, GOODS_LIST], CATEGORY],"
],
[
163,
"['我的 → 优惠券 → diy', DIY, [MEMBER, MEMBER_COUPON], MEMBER],"
],
[
164,
"['首页 → 登录页 → diy', DIY, [HOME, LOGIN], HOME],"
],
[
165,
"['深链扫 member/info', MEMBER_INFO, [], MEMBER],"
],
[
172,
"console.log('通过:', p, '/ 失败:', f);"
]
],
"vue.config.js": [
[
16,
"console.log(`\\n🛡️ [test-gate] 检测到生产构建,先执行测试门禁 (${process.versions.node})...`);"
],
[
22,
"console.log('🛡️ [test-gate] ✅ 测试通过,放行生产构建\\n');"
],
[
24,
"console.error('\\n❌ [test-gate] 测试未通过,已阻止生产构建');"
],
[
31,
"console.log(`[vue.config] 已加载 | node ${process.versions.node} @ ${process.execPath}`);"
],
[
49,
"console.log(`🏠 当前构建的平台: [${process.env.UNI_PLATFORM || '(未知)'}]\\n`);"
],
[
53,
"console.log(`\\n[H5 发行] 脚本: ${process.env.UNI_SCRIPT || '(默认)'}`);"
],
[
54,
"console.log(`[H5 发行] 域名: ${process.env.UNI_APP_DOMAIN || '(未配置)'}\\n`);"
],
[
65,
"console.error(`❌ NODE_ENV 环境变量未设置`);"
],
[
66,
"throw new Error('NODE_ENV 环境变量未设置');"
],
[
77,
"console.log(`🧹 清理构建目录 ${assetDir}\\n`);"
],
[
108,
"console.log('NODE_ENV 环境变量未设置,默认使用开发模式');"
],
[
120,
"console.warn(`[manifest] h5.router.base \"${base}\" 不规范,已自动补全 /`);"
],
[
126,
"console.warn('[manifest] 读取 h5.router.base 失败:', e.message);"
],
[
253,
"console.log(`[VersionInject] ✅ vendor.js 已注入 (platform=${platform}, mode=${mode}, commit=${this._cachedCommitId})`);"
],
[
270,
"console.log(`[VersionInject] ✅ index.html 已注入 (platform=${platform}, commit=${this._cachedCommitId})`);"
],
[
286,
"console.log('\\n🚀 mp-weixin 生产构建完成,运行补丁脚本(site.js 拷贝 + ZIP 打包)...');"
],
[
290,
"console.error('补丁脚本执行失败:', e.message);"
],
[
293,
"console.log('\\n🚀 mp-harmony 生产构建完成,运行补丁脚本(配置拷贝 + ZIP 打包)...');"
],
[
297,
"console.error('补丁脚本执行失败:', e.message);"
],
[
300,
"console.log('\\n🚀 mp-harmony 生产构建完成,拷贝产物到 ascf_src 目录...');"
],
[
325,
"console.log('[H5Zip] 输出目录名:', result);"
],
[
345,
"console.log(`[H5Zip] 输出目录已重命名为: ${outputDirName}`);"
],
[
347,
"console.error('[H5Zip] 目录重命名失败:', e.message);"
],
[
351,
"console.log(`[H5Zip] 输出目录名正确: ${outputDirName}`);"
],
[
392,
"console.warn(`⚠️ 打开目录失败(不影响 ZIP 打包): ${openErr.message}`);"
],
[
399,
"console.error('H5 ZIP 打包失败:', e.message);"
],
[
407,
"console.log(`\\n📋 拷贝鸿蒙构建产物...`);"
],
[
408,
"console.log(` 源: ${sourceDir}`);"
],
[
409,
"console.log(` 目标: ${destDir}`);"
],
[
413,
"console.error(`❌ 源目录不存在: ${sourceDir}`);"
],
[
414,
"throw new Error(`鸿蒙构建产物目录不存在: ${sourceDir}`);"
],
[
425,
"console.log(` ✅ 已清空目标目录 ${destDir}`);"
],
[
427,
"console.warn(` ⚠️ 清空目标目录 ${destDir} 失败,将尝试覆盖: ${cleanErr.message}`);"
],
[
451,
"console.log(' ✅ 拷贝完成');"
],
[
453,
"console.error(` ❌ 拷贝失败: ${e.message}`);"
],
[
482,
"console.log(`[vue.config] ✅ lang/ 目录已替换为 stub (source=remote-only) — 节省 lang 包体积`);"
],
[
485,
"console.error('[vue.config] 配置 lang/ 排除失败:', e.message);"
],
[
488,
"console.log(`[vue.config] lang/ 目录保留 (source=${langSource || 'unknown'})`);"
],
[
509,
"console.log(`[vue.config] ✅ style_color.js 已替换为 stub (source=remote-only) — 节省 ~75KB`);"
],
[
512,
"console.error('[vue.config] 配置 style_color 排除失败:', e.message);"
],
[
515,
"console.log(`[vue.config] style_color.js 保留 (source=${themeSource || 'unknown'})`);"
],
[
519,
"console.log('[vue.config] 开始尝试配置极限压缩');"
],
[
555,
"console.log(`[vue.config] 是否保留console语句 = ${Boolean(enableKeepConsole)}`);"
],
[
607,
"console.log('[vue.config] 配置极限压缩完成');"
]
],
"tests\\redirectTo-real.test.js": [
[
150,
"test('redirectTo 职责: 不对 param 做 URL 清理(职责单一)', () => {"
],
[
165,
"'反引号应被 encode,url 不应含裸反引号(清理是上游 diyRedirectTo 职责): ' + url);"
],
[
167,
"'反引号应被 encode 成 %60: ' + url);"
],
[
172,
"'decode 后应还原原文(说明 redirectTo 没清理脏数据): ' + wapUrlDecoded);"
],
[
178,
"test('redirectTo 职责: 干净 param → 正确拼装 url + 调 uni.navigateTo', () => {"
],
[
185,
"title: '表单',"
],
[
197,
"assert.ok(url.startsWith('/pages_tool/webview/webview?'), '应跳到 webview: ' + url);"
],
[
201,
"assert.ok(srcMatch, 'url 应含 src: ' + url);"
],
[
203,
"'decode 后应含 xcx3 域名: ' + decodeURIComponent(srcMatch[1]));"
],
[
205,
"assert.ok(wapUrlMatch, 'url 应含 wap_url: ' + url);"
],
[
207,
"'decode 后应含 xcx3 域名: ' + decodeURIComponent(wapUrlMatch[1]));"
],
[
211,
"assert.ok(pageParamsIdx > 0, 'url 应含 page_params');"
],
[
218,
"test('redirectTo 职责: enable_set_title=0 正确序列化', () => {"
],
[
228,
"assert.ok(url.includes('enable_set_title=0'), 'enable_set_title=0 应出现: ' + url);"
],
[
234,
"test('mode=redirectTo: 调 uni.redirectTo', () => {"
],
[
242,
"test('mode=reLaunch: 调 uni.reLaunch', () => {"
],
[
249,
"test('默认 mode=navigateTo: 调 uni.navigateTo', () => {"
],
[
259,
"test('param 为 undefined 不会报错', () => {"
],
[
267,
"test('空对象 param 不会报错', () => {"
],
[
274,
"test('to 带 query 时也能正确合并 param', () => {"
],
[
279,
"assert.ok(url.includes('from=tab1'), 'to 里的 query 应保留: ' + url);"
],
[
280,
"assert.ok(url.includes('id=1'), 'param 应追加: ' + url);"
],
[
286,
"test('微信小程序: src 内的 & 不能被当成 top-level query 分隔符', () => {"
],
[
300,
"title: '表单',"
],
[
313,
"assert.ok(srcMatch, 'url 应含 src 参数');"
],
[
316,
"'src 段不能含裸 &,否则微信会把 src 内的 & 当成 top-level 分隔符: ' + url);"
],
[
318,
"'src 段必须含 %26(encode 后的 &): ' + url);"
],
[
323,
"assert.ok(keys.includes('name'), '应含 name: ' + url);"
],
[
324,
"assert.ok(keys.includes('title'), '应含 title: ' + url);"
],
[
325,
"assert.ok(keys.includes('wap_url'), '应含 wap_url: ' + url);"
],
[
326,
"assert.ok(keys.includes('enable_set_title'), '应含 enable_set_title: ' + url);"
],
[
327,
"assert.ok(keys.includes('parent'), '应含 parent: ' + url);"
],
[
328,
"assert.ok(keys.includes('src'), '应含 src: ' + url);"
],
[
329,
"assert.ok(keys.includes('page_params'), '应含 page_params: ' + url);"
],
[
331,
"assert.ok(!keys.includes('a'), 'src 内的 a 不能成为 top-level key: ' + url);"
],
[
332,
"assert.ok(!keys.includes('b'), 'src 内的 b 不能成为 top-level key: ' + url);"
],
[
333,
"assert.ok(!keys.includes('c'), 'src 内的 c 不能成为 top-level key: ' + url);"
],
[
336,
"test('微信小程序: 反引号 / 空格 / 中文都被正确 encode', () => {"
],
[
340,
"title: '`表单`',"
],
[
347,
"assert.equal(url.indexOf('=' + '`'), -1, 'url 不应有裸 =`,反引号应被 encode: ' + url);"
],
[
352,
"assert.ok(titleMatch, '应含 title');"
],
[
353,
"assert.equal(decodeURIComponent(titleMatch[1]), '`表单`', 'decode 后应还原原文');"
],
[
356,
"test('微信小程序: decode roundtrip 不导致双重编码', () => {"
],
[
373,
"assert.equal(decoded, '表单', 'decode 两次后应得原文,不应该是双重编码乱码');"
]
],
"pages_goods\\detail.vue": [
[
2,
"<!-- 鸿蒙兼容: themeColor 是 CSS 变量字符串, 鸿蒙 JSVM 早期版本对 :style=\"字符串\" 处理可能不稳."
],
[
3,
"兜底: 只有非空字符串才绑定 :style. -->"
],
[
12,
"<!-- 价格区域 -->"
],
[
14,
"<!-- 限时折扣 -->"
],
[
98,
"<!-- 会员卡 -->"
],
[
101,
"<view class=\"info\">开通{{ membercard.level_name }}仅需{{ membercard.member_price }}元</view>"
],
[
102,
"<text class=\"btn\">立即开通</text>"
],
[
107,
"<!-- 当前商品参与的营销活动入口 -->"
],
[
131,
"<view class=\"card-title\">- 套餐包含以下的服务及商品 -</view>"
],
[
133,
"{{ goodsSkuDetail.card_info.card_type == 'commoncard' ? '卡项内项目/商品总的可用次数为' + goodsSkuDetail.card_info.common_num + ' ,' : '' }}"
],
[
134,
"{{ goodsSkuDetail.card_info.card_type == 'timecard' ? '次数不限 ,' : '' }} 有效期为{{"
],
[
135,
"(goodsSkuDetail.card_info.validity_type == 0 && '永久') ||"
],
[
136,
"(goodsSkuDetail.card_info.validity_type == 1 && goodsSkuDetail.card_info.validity_day + '天') ||"
],
[
154,
"<text>{{ cardOff ? '收起' : '展开' }}</text>"
],
[
159,
"<!--多规格-->"
],
[
169,
"<!-- 入口区域 -->"
],
[
172,
"<view class=\"label\">领券</view>"
],
[
178,
"? '满' + decimalPointFormat(item.at_least) + '减' + decimalPointFormat(item.money)"
],
[
179,
": '无门槛使用' + decimalPointFormat(item.money)"
],
[
182,
"<view v-else-if=\"item.type == 'discount'\">{{ '满' + decimalPointFormat(item.at_least) + '打' + parseFloat(item.discount)+'折' }}</view>"
],
[
189,
"<view class=\"label\">选择</view>"
],
[
196,
"<view class=\"label\">促销</view>"
],
[
197,
"<text class=\"free-tip color-base-text\">满减</text>"
],
[
203,
"<!-- 业务区域 -->"
],
[
205,
"<!-- SKU选择 -->"
],
[
217,
"<!-- 组合套餐 -->"
],
[
316,
"<!-- 优惠券 -->"
],
[
367,
"<!-- 促销 -->"
],
[
393,
"<!--商品留言弹窗-->"
],
[
403,
"<view class=\"free-tip color-base-text color-base-border\">满减</view>"
],
[
407,
"<text class=\"free-tip color-base-text color-base-border\">满送</text>"
],
[
411,
"<view class=\"free-tip color-base-text color-base-border\">包邮</view>"
],
[
416,
"<!-- 表单暂无字段时的友好提示, 避免\"打开弹窗却什么都不显示\"困惑用户 -->"
],
[
445,
"<!-- 操作区域 -->"
],
[
447,
"<!-- 商品底部导航 -->"
],
[
479,
"<!-- \t\t<ns-goods-action-button v-if=\"goodsSkuDetail.isinformation == 2\" class=\"goods-action-button active3\" disabled-text=\"\" backgroundColor=\"#54c952\" @click=\"b"
],
[
528,
"<!-- 隐私弹窗 -->"
],
[
531,
"<!-- 联系电话弹窗 -->"
]
],
"pages_goods\\_components\\goods-detail-view\\goods-detail-view.vue": [
[
3,
"<!-- 修复鸿蒙元服务: 移除无效的 scroll-y=\"true\" 属性 (scroll-y 是 <scroll-view> 的指令属性)"
],
[
4,
"鸿蒙 JSVM 早期版本遇到无效 attribute 会让 view 子树静默不渲染, 导致整个详情页空白 -->"
],
[
7,
"<!-- AI客服悬浮按钮 -->"
],
[
12,
"<!-- 弹幕 -->"
],
[
17,
"<!-- 商品媒体信息 -->"
],
[
19,
"<!-- 商品图片 -->"
],
[
37,
"<!-- 商品视频 -->"
],
[
43,
"<!-- 切换视频、图片 -->"
],
[
52,
"<!-- 价格区域 -->"
],
[
59,
"<!-- 入口区域 -->"
],
[
62,
"<!-- 配送 -->"
],
[
81,
"<!-- 门店 -->"
],
[
83,
"<view class=\"label\">门店</view>"
],
[
90,
"<text class=\"distance\" v-if=\"parseFloat(globalStoreInfo.distance)\">距离{{ globalStoreInfo.distance > 1 ? globalStoreInfo.distance + 'km' : globalStoreInfo.distanc"
],
[
124,
"<!--多规格区域-->"
],
[
126,
"<!-- 入口区域 -->"
],
[
130,
"<!-- 商家 -->"
],
[
132,
"<!-- 入口区域 -->"
],
[
134,
"<!-- 商家 -->"
],
[
153,
"<!-- 配送方式 -->"
],
[
177,
"<!-- 商品服务 -->"
],
[
210,
"<!-- 门店列表 -->"
],
[
247,
"<!-- 业务区域 -->"
],
[
250,
"<!-- QR二维码 -->"
],
[
262,
"<!-- 促销 -->"
],
[
266,
"<view>添加社群</view>"
],
[
271,
"<view class=\"community-model-content-text\">长按识别二维码,添加社群</view>"
],
[
278,
"<!-- 参与流程 -->"
],
[
281,
"<!-- 商品评价 -->"
],
[
338,
"<!-- 规格属性 -->"
],
[
363,
"<!-- 商品详情 -->"
],
[
376,
"<!-- PDF文档 -->"
],
[
392,
"<!-- HTML内容 -->"
],
[
409,
"<!-- 商品推荐 -->"
],
[
414,
"<!-- 海报 -->"
],
[
434,
"<!-- 分享弹窗 -->"
],
[
482,
"<!-- 操作区域 -->"
]
],
"scripts\\open-directory.js": [
[
24,
"console.warn(`❌ 路径:${targetPath} 不存在!!`)"
],
[
41,
"throw new Error(`路径不存在或无法访问: ${targetPath}`);"
],
[
51,
"console.log(`📁 在文件资源管理器中打开: ${normalizedPath}`);"
],
[
60,
"console.log('✅ 已启动文件资源管理器');"
],
[
63,
"console.warn('方法1失败:', error.message);"
],
[
70,
"console.log('✅ 已使用 start 命令打开');"
],
[
73,
"console.warn('方法2失败:', error.message);"
],
[
76,
"throw new Error('无法在Windows系统中打开目录');"
],
[
81,
"console.log(`📁 在访达中打开: ${directoryPath}`);"
],
[
87,
"console.log('✅ 已启动访达');"
],
[
90,
"console.warn('方法1失败:', error.message);"
],
[
97,
"console.log('✅ 已使用 open -R 命令打开');"
],
[
100,
"console.warn('方法2失败:', error.message);"
],
[
103,
"throw new Error('无法在macOS系统中打开目录');"
],
[
108,
"console.log(`📁 在文件管理器中打开: ${directoryPath}`);"
],
[
133,
"console.log(`✅ 已使用 ${manager} 打开目录`);"
],
[
150,
"console.log('✅ 已使用 xdg-open 打开目录');"
],
[
153,
"throw new Error('无法在Linux系统中打开目录,请确保已安装文件管理器');"
],
[
162,
"console.log(`💻 操作系统: ${os}`);"
],
[
163,
"console.log(`📂 目标目录: ${dirPath}`);"
],
[
166,
"throw new Error(`路径不存在: ${dirPath}`);"
],
[
177,
"throw new Error(`不支持的操作系统: ${process.platform}`);"
],
[
186,
"console.log(`🖥️ 在终端中打开目录: ${dirPath}`);"
],
[
189,
"throw new Error(`路径不存在: ${dirPath}`);"
],
[
193,
"windows: `start cmd /K \"cd /d \"${dirPath}\" && echo 当前目录: %cd%\"`,"
],
[
211,
"throw new Error('不支持的操作系统');"
],
[
224,
"console.log('✅ 已启动终端并切换到目录');"
],
[
227,
"console.warn('无法在终端中打开目录:', error.message);"
],
[
247,
"console.log(`📁 创建目录: ${dirPath}`);"
],
[
249,
"throw new Error(`路径不存在: ${filePath}`);"
],
[
263,
"console.error('❌ 打开目录失败:', error.message);"
],
[
272,
"console.log('当前文件:', currentFile);"
],
[
275,
"console.log('\\n--- 在文件管理器中打开 ---');"
],
[
282,
"console.log('\\n--- 在终端中打开 ---');"
],
[
297,
"console.error('错误:', error.message);"
],
[
312,
"console.error('错误:', error.message);"
]
],
"tests\\clean-param-urls.test.js": [
[
43,
"test('cleanParamUrls: 基础 https URL 不变', () => {"
],
[
50,
"test('cleanParamUrls: 反引号 + 首尾空格被清', () => {"
],
[
57,
"test('cleanParamUrls: scheme 后多余斜杠被修补', () => {"
],
[
64,
"test('cleanParamUrls: \\\\t \\\\n \\\\r 也被清', () => {"
],
[
71,
"test('cleanParamUrls: http 和 https 都支持', () => {"
],
[
79,
"test('cleanParamUrls: 普通文本不变(name)', () => {"
],
[
83,
"test('cleanParamUrls: 中文文本不变(title)', () => {"
],
[
84,
"assert.equal(cleanParamUrls('表单'), '表单');"
],
[
87,
"test('cleanParamUrls: 含 :"
],
[
93,
"assert.ok(!result.includes(' '), '空格应被清');"
],
[
96,
"test('cleanParamUrls: 数字字符串不变', () => {"
],
[
103,
"test('cleanParamUrls: 嵌套对象里的 URL 被清', () => {"
],
[
113,
"test('cleanParamUrls: 普通文本字段不被误伤', () => {"
],
[
116,
"title: '表单',"
],
[
121,
"assert.equal(out.title, '表单');"
],
[
125,
"test('cleanParamUrls: 任意 key 名字都生效(不限定 keys)', () => {"
],
[
144,
"test('cleanParamUrls: 深层嵌套对象里的 URL 也被清', () => {"
],
[
158,
"test('cleanParamUrls: page_params 里的 URL 也被清', () => {"
],
[
177,
"test('cleanParamUrls: 数组里的 URL 被清', () => {"
],
[
185,
"test('cleanParamUrls: 数组里的对象(URL 字段)被清', () => {"
],
[
198,
"test('cleanParamUrls: null 原样返回', () => {"
],
[
202,
"test('cleanParamUrls: undefined 原样返回', () => {"
],
[
206,
"test('cleanParamUrls: 数字原样返回', () => {"
],
[
210,
"test('cleanParamUrls: 布尔原样返回', () => {"
],
[
215,
"test('cleanParamUrls: 空对象返回空对象', () => {"
],
[
219,
"test('cleanParamUrls: 空数组返回空数组', () => {"
],
[
223,
"test('cleanParamUrls: 数字 0 原样返回', () => {"
],
[
227,
"test('cleanParamUrls: enable_set_title=0 这种数字字段不变', () => {"
],
[
238,
"test('cleanParamUrls: 真实 param 场景,所有 URL 字段一次性清理', () => {"
],
[
241,
"title: '表单',"
],
[
251,
"assert.equal(out.title, '表单');"
],
[
273,
"test('cleanParamUrls: 不修改输入对象(返回新对象)', () => {"
],
[
276,
"name: '`表单`',"
],
[
280,
"assert.equal(JSON.stringify(input), inputStr, '原对象不应被修改');"
]
],
"tests\\diy-redirect-to.test.js": [
[
85,
"test('端到端: 你提供的真实 link → diyRedirectTo 清理 → 跳转到 webview', () => {"
],
[
108,
"title: '表单',"
],
[
117,
"assert.equal(calls.navigateTo.length, 1, '应调一次 uni.navigateTo');"
],
[
122,
"'应跳到 webview: ' + url);"
],
[
125,
"assert.ok(!url.includes('`'), 'url 不应含反引号: ' + url);"
],
[
132,
"assert.ok(wapUrlMatch, 'url 应含 wap_url');"
],
[
134,
"assert.equal(wapUrl.indexOf('`'), -1, 'wap_url 不应含反引号: ' + wapUrl);"
],
[
135,
"assert.equal(wapUrl.indexOf(' '), -1, 'wap_url 不应含空格: ' + wapUrl);"
],
[
137,
"'wap_url 应以 https:"
],
[
141,
"assert.ok(srcMatch, 'url 应含 src');"
],
[
143,
"assert.equal(src.indexOf('`'), -1, 'src 不应含反引号: ' + src);"
],
[
148,
"assert.ok(pageParamsIdx > 0, 'url 应含 page_params');"
],
[
153,
"test('端到端: 普通文本字段(name/title/parent)保留原文,不被误伤', () => {"
],
[
168,
"title: '`表单`',"
],
[
175,
"assert.ok(url.includes('name=`bad`'), 'name 保留原文: ' + url);"
],
[
176,
"assert.ok(url.includes('title=`表单`'), 'title 保留原文: ' + url);"
],
[
180,
"assert.ok(wapUrlMatch, 'url 应含 wap_url');"
],
[
182,
"assert.equal(wapUrl.indexOf('`'), -1, 'wap_url 值不应含反引号: ' + wapUrl);"
],
[
183,
"assert.equal(wapUrl.indexOf(' '), -1, 'wap_url 值不应含空格: ' + wapUrl);"
],
[
185,
"'wap_url 应以 https:"
],
[
189,
"assert.ok(srcMatch, 'url 应含 src');"
],
[
195,
"'src 应以干净的 https:"
],
[
199,
"test('端到端: 多种空白(\\\\t\\\\n\\\\r) + 反引号都能被清', () => {"
],
[
218,
"assert.equal(url.indexOf('`'), -1, '反引号应被清');"
],
[
219,
"assert.equal(url.indexOf('\\t'), -1, '\\\\t 应被清');"
],
[
220,
"assert.equal(url.indexOf('\\n'), -1, '\\\\n 应被清');"
],
[
221,
"assert.equal(url.indexOf('\\r'), -1, '\\\\r 应被清');"
],
[
225,
"'src 应基于干净的 wap_url 拼出: ' + url);"
],
[
228,
"test('端到端: link 为空/null/undefined 不报错', () => {"
],
[
238,
"test('端到端: page_params 里的 URL 字段也被清理', () => {"
],
[
262,
"'顶层 src 应被清: ' + url);"
],
[
265,
"'page_params 里的 src 已被清(应该有 https:"
],
[
266,
"assert.ok(!url.match(/\"src\":\"`https/), 'page_params 里 src 不应再含反引号: ' + url);"
]
],
"pages_order\\_components\\common-payment\\common-payment.vue": [
[
3,
"<!-- 自定义标题栏 -->"
],
[
17,
"<!-- 虚拟商品联系方式 -->"
],
[
33,
"<!-- 配送方式 -->"
],
[
38,
"<!-- 外圆角 -->"
],
[
118,
"<!-- 门店信息 -->"
],
[
161,
"<!-- 店铺 -->"
],
[
169,
"<!-- 商品 -->"
],
[
239,
"<!-- \t<text class=\"unit price-font\">优惠</text>"
],
[
273,
"<text class=\"tit\">优惠券</text>"
],
[
276,
"<text>已使用优惠券,优惠</text>"
],
[
280,
"<text v-else>不使用优惠券</text>"
],
[
285,
"<text class=\"tit\">活动优惠</text>"
],
[
293,
"<text>使用{{ parseInt(calculateGoodsData.max_usable_point) }}积分可抵扣</text>"
],
[
301,
"<text class=\"tit\">发票</text>"
],
[
303,
"<text v-if=\"orderCreateData.is_invoice == 1\">{{ orderCreateData.invoice_type == 1 ? '纸质' : '电子' }}发票({{ orderCreateData.invoice_content }})</text>"
],
[
304,
"<text v-else>无需发票</text>"
],
[
331,
"<!-- 订单金额 -->"
],
[
351,
"<text>税费</text>"
],
[
361,
"<text class=\"tit\">发票邮寄费</text>"
],
[
393,
"<text class=\"tit\">会员卡</text>"
],
[
415,
"<!-- \t<button v-else class=\"no-submit mini\" size=\"mini\">差{{ surplusStartMoney() | moneyFormat }}起送</button> -->"
],
[
424,
"<!-- 活动优惠弹窗 -->"
],
[
448,
"<!-- 门店列表弹窗 -->"
],
[
489,
"<!-- 留言弹窗 -->"
],
[
511,
"<!-- 优惠券弹窗 -->"
],
[
566,
"<!-- 交易协议 -->"
],
[
583,
"<!-- 表单修改弹窗 -->"
],
[
628,
"<!-- 门店自提时间 -->"
]
],
"common\\js\\ai-service.js": [
[
25,
"console.warn('读取会话ID失败:', e);"
],
[
141,
"console.log('[AI WS] 流结束信号, event:', data.event, 'type:', data.type, 'conversationId:', conversationId, '当前内存:', currentConversationId);"
],
[
148,
"console.log('[AI WS] 会话ID已持久化到 storage:', conversationId);"
],
[
150,
"console.error('保存会话ID失败:', e);"
],
[
163,
"console.log('[AI WS] 未识别的消息:', JSON.stringify(data).substring(0, 200));"
],
[
166,
"console.error('WebSocket 消息解析失败:', e, '原始数据:', res.data);"
],
[
171,
"console.error('WebSocket 连接失败:', err);"
],
[
180,
"console.warn('WebSocket 连接已关闭');"
],
[
255,
"console.error('[AI Service] AiChat API请求失败,详细错误:', error);"
],
[
256,
"console.error('[AI Service] 错误堆栈:', error.stack);"
],
[
258,
"console.error('[AI Service] store 状态:', {"
],
[
366,
"console.log('[AI SSE] 收到完成信号:', data.event, 'conversationId:', cid);"
],
[
370,
"console.warn('解析失败:', e, line);"
],
[
396,
"console.warn('最后 buffer 解析失败:', e);"
],
[
400,
"console.log('[AI SSE] 流完成, conversationId:', conversationId, 'content长度:', content.length);"
],
[
406,
"console.error('H5 流式请求失败:', error);"
],
[
438,
"console.error('保存会话ID失败:', e);"
],
[
449,
"console.error('清除会话ID失败:', e);"
],
[
538,
"console.error('清除会话失败:', error);"
],
[
549,
"console.log('[AI History] 请求历史, conversation_id:', params.conversation_id, 'limit:', params.limit);"
],
[
580,
"console.error('获取会话历史失败:', error);"
],
[
625,
"console.error('解析消息失败:', error);"
],
[
629,
"console.error('EventSource错误:', error);"
],
[
635,
"console.error('创建EventSource失败:', error);"
],
[
641,
"console.warn('chatWithEventSource 不支持微信小程序');"
],
[
655,
"console.warn('chatWithFetchStream 不支持微信小程序');"
]
],
"pages_promotion\\fenxiao\\index.vue": [
[
6,
"<!-- 头部 -->"
],
[
27,
"推广规则"
],
[
33,
"<view class=\"title\">{{ info.level_num > 0 ? info.level_name : '等级未解锁' }}</view>"
],
[
34,
"<view class=\"desc\">下单、邀请好友均可提升等级</view>"
],
[
36,
"<view class=\"btn\" @click=\"$refs.taskPopup.open()\" v-if=\"info.condition.last_level\">做任务</view>"
],
[
55,
"<view class=\"title\">总{{ fenxiaoWords.account }}</view>"
],
[
59,
"<view class=\"title\">已提现{{ fenxiaoWords.account }}</view>"
],
[
85,
"<!-- 功能列表 -->"
],
[
133,
"<view class=\"title\">邀请好友</view>"
],
[
134,
"<view class=\"desc\">邀好友赚好礼</view>"
],
[
142,
"<view class=\"title\">账单报表</view>"
],
[
143,
"<view class=\"desc\">{{ fenxiaoWords.account }}变更明细</view>"
],
[
151,
"<view class=\"title\">{{ fenxiaoWords.concept }}商品</view>"
],
[
152,
"<view class=\"desc\">{{ fenxiaoWords.concept }}商品</view>"
],
[
161,
"<view class=\"title\">{{ fenxiaoWords.account }}排行</view>"
],
[
162,
"<view class=\"desc\">您的排名为第{{ profitRanking }}位</view>"
],
[
171,
"<view class=\"title\">推广人排行</view>"
],
[
172,
"<view class=\"desc\">您的排名为{{ invitedNumRanking }}位</view>"
],
[
180,
"<view class=\"title\">等级说明</view>"
],
[
181,
"<view class=\"desc\">{{ fenxiaoWords.concept }}等级说明</view>"
],
[
193,
"<text class=\"all-money-tit\">我的粉丝</text>"
],
[
194,
"<text class=\"all-money-num\">{{ teamNum.num }}人</text>"
],
[
205,
"<text class=\"all-money-num\">{{ teamNum.fenxiao_num }}人</text>"
],
[
260,
"<!-- 底部tabBar -->"
]
],
"pages_promotion\\merch\\detail.vue": [
[
4,
"<!-- 搜索区域 -->"
],
[
41,
"<!-- 排序 -->"
],
[
123,
"<!-- 购物车图标 -->"
],
[
132,
"<!--加号图标 -->"
],
[
141,
"<!-- 按钮 -->"
],
[
153,
"<!--自定义图标 -->"
],
[
213,
"<!-- 购物车图标 -->"
],
[
222,
"<!--加号图标 -->"
],
[
231,
"<!-- 按钮 -->"
],
[
243,
"<!--自定义图标 -->"
],
[
263,
"<!-- 筛选弹出框 -->"
],
[
267,
"<!-- 包邮 -->"
],
[
269,
"<view class=\"label\"><text>是否包邮</text></view>"
],
[
271,
"<uni-tag :inverted=\"true\" text=\"包邮\" :type=\"isFreeShipping ? 'primary' : 'default'\" @click=\"isFreeShipping = !isFreeShipping\" />"
],
[
275,
"<!-- 价格筛选项 -->"
],
[
277,
"<view class=\"label\"><text>价格区间(元)</text></view>"
],
[
279,
"<input class=\"uni-input\" type=\"digit\" v-model=\"minPrice\" placeholder=\"最低价\" />"
],
[
281,
"<input class=\"uni-input\" type=\"digit\" v-model=\"maxPrice\" placeholder=\"最高价\" />"
],
[
285,
"<!-- 品牌筛选项 -->"
],
[
287,
"<view class=\"label\"><text>品牌</text></view>"
],
[
295,
"<!-- 分类筛选项 -->"
],
[
318,
"<!-- 隐私弹窗 -->"
]
],
"components-diy\\diy-tab.vue": [
[
2,
"<!-- DIY 标签页组件 - 支持多种样式和位置的标签页切换 -->"
],
[
5,
"<!-- 顶部标签位置:标签导航 + 指示器 + 内容区域 -->"
],
[
7,
"<!-- 标签导航 -->"
],
[
18,
"<!-- 指示器 -->"
],
[
31,
"<!-- 内容区域 -->"
],
[
39,
"<!-- 渲染每个标签下的组件 -->"
],
[
47,
"<!-- 底部标签位置:内容区域 + 指示器 + 标签导航 -->"
],
[
49,
"<!-- 内容区域 -->"
],
[
57,
"<!-- 渲染每个标签下的组件 -->"
],
[
63,
"<!-- 指示器 -->"
],
[
76,
"<!-- 标签导航 -->"
],
[
88,
"<!-- 左侧标签位置:标签导航 + 指示器 + 内容区域 (水平布局) -->"
],
[
91,
"<!-- 左侧标签导航 -->"
],
[
102,
"<!-- 左侧指示器 -->"
],
[
115,
"<!-- 右侧内容区域 -->"
],
[
123,
"<!-- 渲染每个标签下的组件 -->"
],
[
132,
"<!-- 右侧标签位置:内容区域 + 指示器 + 标签导航 (水平布局) -->"
],
[
135,
"<!-- 左侧内容区域 -->"
],
[
143,
"<!-- 渲染每个标签下的组件 -->"
],
[
150,
"<!-- 右侧指示器 -->"
],
[
163,
"<!-- 右侧标签导航 -->"
]
],
"tests\\mp-share-default.test.js": [
[
106,
"test('黑名单包含 webview 页面', () => {"
],
[
110,
"test('黑名单不包含普通商品详情页', () => {"
],
[
118,
"test('_isCurrentPageDisabled: 当前页是 webview 时返回 true', () => {"
],
[
123,
"test('_isCurrentPageDisabled: 当前页是其他页时返回 false', () => {"
],
[
128,
"test('_isCurrentPageDisabled: 当前页带前导 / 时也认得', () => {"
],
[
134,
"test('_isCurrentPageDisabled: getCurrentPages 返回空时不报错', () => {"
],
[
139,
"test('_isCurrentPageDisabled: getCurrentPages 不存在时不报错', () => {"
],
[
147,
"test('mixin: 命中禁用列表时 onLoad 调 wx.hideShareMenu', () => {"
],
[
153,
"assert.equal(_wxCalls.length, 1, '应该调了一次 hideShareMenu');"
],
[
158,
"test('mixin: 命中禁用列表时 onLoad 不调网络', () => {"
],
[
164,
"assert.equal(ctx.__networkCalled, undefined, '不应触发网络拉取');"
],
[
167,
"test('mixin: 非命中页面 onLoad 调网络(且不调 hideShareMenu)', () => {"
],
[
173,
"assert.equal(ctx.__networkCalled, true, '应触发网络拉取');"
],
[
174,
"assert.equal(_wxCalls.length, 0, '不应调 hideShareMenu');"
],
[
177,
"test('mixin: 命中禁用列表时 onShow 不调网络', () => {"
],
[
186,
"test('mixin: 命中禁用列表时 onShareAppMessage 返回 undefined', () => {"
],
[
193,
"test('mixin: 命中禁用列表时 onShareTimeline 返回 undefined', () => {"
],
[
200,
"test('mixin: 非命中页面 onShareAppMessage 返回正常分享对象', () => {"
],
[
210,
"test('_hideShareMenu: wx.hideShareMenu 不存在时静默', () => {"
],
[
216,
"test('_hideShareMenu: menus 参数不支持时降级到无参', () => {"
],
[
228,
"assert.equal(secondCall, undefined, '应降级到无参调用');"
]
],
"docs\\example\\wechat-channel-demo.vue": [
[
4,
"<text class=\"demo-title\">微信视频号集成示例</text>"
],
[
8,
"<view class=\"section-title\">单个视频号</view>"
],
[
13,
"<view class=\"section-title\">视频号列表</view>"
],
[
18,
"<view class=\"section-title\">使用说明</view>"
],
[
20,
"<view class=\"content-item\">1. 确保微信小程序已开通视频号权限</view>"
],
[
21,
"<view class=\"content-item\">2. 小程序需与视频号关联</view>"
],
[
22,
"<view class=\"content-item\">3. 传递正确的feedId用于播放视频</view>"
],
[
23,
"<view class=\"content-item\">4. 仅支持微信小程序环境</view>"
],
[
43,
"channelName: \"示例视频号\","
],
[
45,
"videoTitle: \"这是一个示例视频,展示如何使用微信视频号组件\","
],
[
58,
"channelName: \"示例视频号1\","
],
[
60,
"videoTitle: \"这是示例视频1,展示如何使用微信视频号组件\","
],
[
65,
"channelName: \"示例视频号2\","
],
[
67,
"videoTitle: \"这是示例视频2,展示如何使用微信视频号组件\","
],
[
72,
"channelName: \"示例视频号3\","
],
[
74,
"videoTitle: \"这是示例视频3,展示如何使用微信视频号组件\","
],
[
79,
"channelName: \"示例视频号4\","
],
[
81,
"videoTitle: \"这是示例视频4,展示如何使用微信视频号组件\","
],
[
101,
"console.log('微信视频号示例页面加载');"
]
],
"pages_tool\\member\\info.vue": [
[
4,
"<!-- 头像@click=\"headImage\" -->"
],
[
12,
"<!-- 账号 -->"
],
[
14,
"<text class=\"cell-tit\">账号</text>"
],
[
18,
"<!-- 账号 -->"
],
[
23,
"<!-- 昵称 -->"
],
[
29,
"<!-- 真实姓名 -->"
],
[
35,
"<!-- 性别 -->"
],
[
41,
"<!-- 生日 -->"
],
[
47,
"<!-- 手机号 -->"
],
[
54,
"<!-- 密码 -->"
],
[
56,
"<text class=\"cell-tit\">密码</text>"
],
[
59,
"<!-- 支付密码 -->"
],
[
66,
"<text class=\"cell-tit\">所在地址</text>"
],
[
69,
"<text class=\"cell-tip\" v-else>去设置</text>"
],
[
73,
"<!-- 注销 -->"
],
[
79,
"<text class=\"cell-tit\">注销账号</text>"
],
[
83,
"<text class=\"cell-tit\">版本号</text>"
],
[
87,
"<!-- 语言 -->"
],
[
93,
"<!-- 退出登录 -->"
]
],
"common\\js\\customer-service.js": [
[
88,
"result.warnings.push('企业微信未启用');"
],
[
91,
"result.warnings.push('企业微信活码链接未配置');"
],
[
113,
"console.error('跳转 AI智能客服失败:', err);"
],
[
122,
"console.error('跳转 AI智能客服异常:', e);"
],
[
131,
"console.error('客服配置验证失败:', validation.errors);"
],
[
137,
"console.warn('客服配置警告:', validation.warnings);"
],
[
173,
"console.error('【未知客服类型】', config.type);"
],
[
192,
"console.error('跳转企业微信失败:', err);"
],
[
199,
"console.error('企业微信配置不完整,缺少 wxwork_url 或 corpid');"
],
[
243,
"console.error('【跳转第三方小程序失败】', err);"
],
[
268,
"console.error('【第三方客服配置不完整】缺少 mini_app_id 或 third_url');"
],
[
505,
"console.error('跳转 AI智能客服失败:', err);"
],
[
513,
"console.error('跳转 AI智能客服异常:', e);"
],
[
562,
"console.error('客服配置无效:', validation.errors);"
],
[
568,
"console.warn('客服配置警告:', validation.warnings);"
],
[
579,
"console.warn('企业微信配置不完整,使用原生客服');"
],
[
586,
"console.error('企业微信链接未配置');"
],
[
600,
"console.error('客服处理失败:', error);"
]
],
"components-diy\\diy-member-info.vue": [
[
3,
"<!-- 会员信息 -->"
],
[
110,
"<text>超级会员</text>"
],
[
113,
"<text class=\"see\" v-if=\"memberInfo && memberInfo.member_level_type\" @tap.stop=\"redirectBeforeAuth('/pages_tool/member/card')\">查看特权</text>"
],
[
114,
"<text class=\"see\" v-else @tap.stop=\"redirectBeforeAuth('/pages_tool/member/card_buy')\">会员可享更多权益</text>"
],
[
121,
"<view class=\"desc\">开通可享更多权益</view>"
],
[
124,
"<text class=\"see\" v-if=\"memberInfo && memberInfo.member_level_type\" @tap.stop=\"redirectBeforeAuth('/pages_tool/member/card')\">查看特权</text>"
],
[
125,
"<text class=\"see\" v-else @tap.stop=\"redirectBeforeAuth('/pages_tool/member/card_buy')\">立即开通</text>"
],
[
134,
"<view class=\"desc\">开通可享更多权益</view>"
],
[
137,
"<text class=\"see\" v-if=\"memberInfo && memberInfo.member_level_type\" @tap.stop=\"redirectBeforeAuth('/pages_tool/member/card')\">查看更多权益</text>"
],
[
138,
"<text class=\"see\" v-else @tap.stop=\"redirectBeforeAuth('/pages_tool/member/card_buy')\">立即开通</text>"
],
[
146,
"<view class=\"title\">余额</view>"
],
[
152,
"<view class=\"title\">积分</view>"
],
[
159,
"<view class=\"title\">优惠券</view>"
],
[
164,
"<view @tap.stop=\"redirect('/pages_tool/recharge/list')\" class=\"recharge-btn\">余额充值</view>"
],
[
192,
"<!-- 完善会员资料 -->"
],
[
403,
"if (this.nickName == '微信用户') {"
],
[
426,
"if (this.nickName == '微信用户') {"
]
],
"pages_tool\\recharge\\list.vue": [
[
5,
"<!-- \t<view class=\"recharge-title\">充值</view>"
],
[
7,
"<view class=\"label\">账户余额</view>"
],
[
8,
"<view class=\"value\"><text class=\"price-font\">{{balanceInfo.balance}}</text><text>元</text></view>"
],
[
34,
"<text class=\"other\">其他金额</text>"
],
[
41,
"注:充值 {{ list[isIndex].face_value }} 元赠送:"
],
[
42,
"<text>{{ list[isIndex].point }} 积分,</text>"
],
[
43,
"<text>{{ list[isIndex].growth }} 成长值</text>"
],
[
44,
"<text v-if=\"list[isIndex].coupon_id != ''\">,优惠券X{{ list[isIndex].coupon_id.split(',').length }}</text>"
],
[
50,
"<view class=\"title\">充值说明</view>"
],
[
53,
"充值 {{ item.face_value }} 元赠送:"
],
[
54,
"<text v-if=\"item.point\">{{ item.point }} 积分,</text>"
],
[
55,
"<text v-if=\"item.growth\">{{ item.growth }} 成长值</text>"
],
[
56,
"<text v-if=\"item.coupon_id != ''\">,优惠券X{{ item.coupon_id.split(',').length }}</text>"
],
[
59,
"充值任意金额后,会存到您的账户资金中"
],
[
94,
"<!-- 选择支付方式弹窗 -->"
],
[
100,
"<!-- <button class=\"add-account\" type=\"primary\" :disabled=\"recharge_id > 0 ? false : true\" @click=\"openChoosePayment\">充值</button> -->"
]
],
"components\\hover-nav\\hover-nav.vue": [
[
2,
"<!-- Vue 2 / uni-app 单根约束:用 view 包一层 -->"
],
[
12,
"<!-- 多语言切换按钮:根据语言数智能切换交互 -->"
],
[
21,
"<!-- 微信官方客服按钮-->"
],
[
31,
"<!-- 其他类型客服按钮(智能客服、企业微信等)-->"
],
[
49,
"<!-- 智能客服按钮(当同时显示小程序系统客服时)-->"
],
[
67,
"<!-- 小程序系统客服按钮 -->"
],
[
77,
"<!-- 电话按钮 -->"
],
[
89,
"<!-- 语言选择弹窗(底部弹出) -->"
],
[
441,
"fail: () => { console.warn('[hover-nav] 未获取到 shopInfo,使用默认设置'); }"
],
[
445,
"console.warn('[hover-nav] 读取 shopInfo 异常:', e);"
],
[
533,
"console.warn('[hover-nav] 读取 CSS 变量失败,使用 fallback 默认值:', e);"
],
[
633,
"console.warn('[hover-nav] 切换语言失败:langList 为空');"
],
[
640,
"console.warn('[hover-nav] 切换语言失败:目标语种为空', this.langIndexMap, this.currentLangIndex);"
],
[
678,
"console.warn('[hover-nav] selectLanguage 越界:', idx, this.langList);"
],
[
708,
"sendMessageTitle: '来自悬浮按钮的咨询',"
]
],
"pages_goods\\list.vue": [
[
4,
"<!-- 搜索区域 -->"
],
[
15,
"<!-- 排序 -->"
],
[
152,
"<!-- 筛选弹出框 -->"
],
[
156,
"<!-- 包邮 -->"
],
[
158,
"<view class=\"label\"><text>是否包邮</text></view>"
],
[
160,
"<uni-tag :inverted=\"true\" text=\"包邮\" :type=\"isFreeShipping ? 'primary' : 'default'\" @click=\"isFreeShipping = !isFreeShipping\" />"
],
[
164,
"<!-- 价格筛选项 -->"
],
[
166,
"<view class=\"label\"><text>价格区间(元)</text></view>"
],
[
168,
"<input class=\"uni-input\" type=\"digit\" v-model=\"minPrice\" placeholder=\"最低价\" />"
],
[
170,
"<input class=\"uni-input\" type=\"digit\" v-model=\"maxPrice\" placeholder=\"最高价\" />"
],
[
174,
"<!-- 品牌筛选项 -->"
],
[
176,
"<view class=\"label\"><text>品牌</text></view>"
],
[
184,
"<!-- 分类筛选项 -->"
],
[
207,
"<!-- 隐私弹窗 -->"
],
[
210,
"<!-- 底部tabBar -->"
]
],
"pages_promotion\\merch\\list.vue": [
[
4,
"<!-- 搜索区域 -->"
],
[
15,
"<!-- 排序 -->"
],
[
89,
"<!-- 购物车图标 -->"
],
[
98,
"<!--加号图标 -->"
],
[
107,
"<!-- 按钮 -->"
],
[
119,
"<!--自定义图标 -->"
],
[
179,
"<!-- 购物车图标 -->"
],
[
188,
"<!--加号图标 -->"
],
[
197,
"<!-- 按钮 -->"
],
[
209,
"<!--自定义图标 -->"
],
[
229,
"<!-- 筛选弹出框 -->"
],
[
233,
"<!-- 分类筛选项 -->"
],
[
256,
"<!-- 隐私弹窗 -->"
],
[
259,
"<!-- 底部tabBar -->"
]
],
"common\\js\\platform.js": [
[
140,
"? _t('common.platform.wechatOfficialAccount', '微信公众号')"
],
[
147,
"weapp: _t('common.platform.wechatMiniProgram', '微信小程序'),"
],
[
148,
"alipay: _t('common.platform.alipayMiniProgram', '支付宝小程序'),"
],
[
149,
"baidu: _t('common.platform.baiduMiniProgram', '百度小程序'),"
],
[
150,
"toutiao: _t('common.platform.toutiaoMiniProgram', '头条小程序'),"
],
[
151,
"qq: _t('common.platform.qqMiniProgram', 'QQ小程序'),"
],
[
152,
"kuaishou: _t('common.platform.kuaishouMiniProgram', '快手小程序'),"
],
[
153,
"jd: _t('common.platform.jdMiniProgram', '京东小程序'),"
],
[
154,
"'360': _t('common.platform.miniProgram360', '360小程序'),"
],
[
155,
"xhs: _t('common.platform.xhsMiniProgram', '小红书小程序'),"
],
[
156,
"harmony: _t('common.platform.harmonyService', '鸿蒙元服务'),"
],
[
158,
"pc: _t('common.platform.pc', 'PC端'),"
],
[
161,
"cachedAppTypeName = platformNameMap[platform] || _t('common.platform.unknown', '未知平台');"
]
],
"uni_modules\\mp-html\\components\\mp-html\\node\\node.vue": [
[
4,
"<!-- 图片 -->"
],
[
5,
"<!-- 占位图 -->"
],
[
7,
"<!-- 显示图片 -->"
],
[
12,
"<!-- 表格中的图片,使用 rich-text 防止大小不正确 -->"
],
[
27,
"<!-- 文本 -->"
],
[
35,
"<!-- 链接 -->"
],
[
39,
"<!-- 视频 -->"
],
[
51,
"<!-- 音频 -->"
],
[
71,
"<!-- 富文本 -->"
],
[
78,
"<!-- 继续递归 -->"
],
[
290,
"itemList: ['保存图片'],"
],
[
297,
"title: '保存成功'"
],
[
369,
"title: '链接已复制'"
]
],
"components\\yuyue-date\\yuyue-date.vue": [
[
6,
"<text class=\"title\">选择时间</text>"
],
[
11,
"<!-- 日期列表 -->"
],
[
29,
"<!-- 时间选项 -->"
],
[
42,
"<!-- 预约时间段 -->"
],
[
57,
"<text>预约时间:</text>"
],
[
60,
"<button form-type=\"submit\" type=\"primary\" size=\"mini\" class=\"submit-btn\" @click=\"handleSubmit\">确认预约</button>"
],
[
63,
"<!-- <view class=\"yuyue-date-desc\">如不想线上预约,可致电商家电话预约</view> -->"
],
[
103,
"default: '已约满'"
],
[
108,
"default: '可预约'"
],
[
192,
"return this.disableText && this.disableText !== '已约满'"
],
[
197,
"return this.undisableText && this.undisableText !== '可预约'"
],
[
216,
"return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];"
]
],
"components-diy\\diy-form.vue": [
[
4,
"<!-- 鸿蒙元服务运行时在首次 _render 时 value 可能还是 undefined,"
],
[
5,
"下面所有 value.xxx 模板表达式都必须用 `value && value.xxx` 守护,"
],
[
6,
"否则会触发 MP 编译器注入的 propsToData 观察者(对应编译产物里"
],
[
8,
"报 \"Cannot read properties of undefined (reading 'show_banner')\"。 -->"
],
[
12,
"<!-- 提示语 -->"
],
[
14,
"<!-- 表单组件 -->"
],
[
22,
"<!-- 提交按钮(外层 = form-bg + form-padding-x;按钮 = submit-bg + submit-color + input-height + input-radius)。"
],
[
23,
"showSubmit=false 时由父级页面渲染自己的提交按钮并通过 ref 调用本组件的 verify()/getFormData()。 -->"
],
[
149,
"return this.mergedFormConfig.submitText || '提交';"
],
[
306,
"form_name: this.value.form_name || '默认表单'"
],
[
311,
"title: '提交成功',"
],
[
320,
"title: res.message || '提交失败',"
]
],
"scripts\\test-gate.js": [
[
23,
"console.error('[test-gate] 需要 node 18+(自带 --test),当前 node 版本:', process.version);"
],
[
29,
"console.log('\\n[test-gate] === 运行测试文件:', path.relative(ROOT, testFile), '===');"
],
[
46,
"console.error('[test-gate] tests/ 下没有任何 *.test.js 文件');"
],
[
50,
"console.log('[test-gate] 找到', files.length, '个测试文件');"
],
[
55,
"console.log('\\n[test-gate] =============== 汇总 ===============');"
],
[
56,
"console.log(' 总数:', results.length);"
],
[
57,
"console.log(' 通过:', results.length - failed.length);"
],
[
58,
"console.log(' 失败:', failed.length);"
],
[
60,
"console.log(' 失败文件:');"
],
[
62,
"console.log(' -', r.file, '(退出码', r.status + ')');"
],
[
64,
"console.log('\\n[test-gate] ❌ 测试未全部通过,不允许继续');"
],
[
67,
"console.log('\\n[test-gate] ✅ 全部测试通过');"
]
],
"components\\ns-newform\\ns-newform.vue": [
[
4,
"<!-- 文本输入框 -->"
],
[
22,
"<!-- 多行文本输入框 -->"
],
[
39,
"<!-- 下拉选择器 -->"
],
[
60,
"<!-- 复选框 -->"
],
[
88,
"<!-- 单选框 -->"
],
[
116,
"<!-- 图片上传 -->"
],
[
135,
"<!-- 日期选择器 -->"
],
[
157,
"<!-- 日期范围选择器 -->"
],
[
196,
"<!-- 时间选择器 -->"
],
[
218,
"<!-- 时间范围选择器 -->"
],
[
257,
"<!-- 城市选择器 -->"
]
],
"pages_promotion\\point\\list.vue": [
[
50,
"<view class=\"title\">活动规则</view>"
],
[
55,
"<view class=\"title\">储值赚积分</view>"
],
[
59,
"<view class=\"title\">兑换记录</view>"
],
[
63,
"<view class=\"title\">积分抽奖</view>"
],
[
67,
"<view class=\"title\">积分明细</view>"
],
[
228,
"<!-- 弹出规则 -->"
],
[
255,
"<!-- 隐私弹窗 -->"
],
[
258,
"<!-- 底部tabBar -->"
],
[
275,
"name: '积分换好物'"
],
[
279,
"name: '积分换券'"
],
[
283,
"name: '积分换红包'"
]
],
"scripts\\i18n-check.js": [
[
47,
"if (trimmed.startsWith(' "
],
[
175,
"console.log(` 扫描文件数: ${srcFiles.length}`);"
],
[
176,
"console.log(` 含中文的文件数: ${hardcodeResults.length}`);"
],
[
177,
"console.log(` 中文字符串命中数: ${totalCnHits}`);"
],
[
180,
"console.log(`\\n ⚠️ 疑似硬编码中文 TOP 20:`);"
],
[
186,
"console.log(` ... 还有 ${hardcodeResults.length - 20} 个文件`);"
],
[
188,
"console.log(`\\n 💡 提示:这是粗略扫描,包含注释/默认值等误报,仅供参考`);"
],
[
190,
"console.log(' ✅ 未发现硬编码中文(粗略扫描)');"
],
[
195,
"console.log(' 检查完成');"
],
[
200,
"console.log('\\n ❌ 存在差异,请修复后再提交');"
],
[
203,
"console.log('\\n ✅ 全部通过');"
]
],
"pages_order\\detail.vue": [
[
3,
"<!-- 订单状态 -->"
],
[
27,
"<!-- 地址信息 -->"
],
[
59,
"<!-- 门店信息 -->"
],
[
122,
"<!-- 店铺 -->"
],
[
205,
"<!-- 订单概况 -->"
],
[
334,
"<!-- 联系客服 -->"
],
[
339,
"<text>联系客服</text>"
],
[
480,
"<!-- 订单金额 -->"
],
[
619,
"<!-- 订单 -->"
],
[
625,
"<!-- 选择支付方式弹窗 -->"
]
],
"pages_promotion\\point\\payment.vue": [
[
18,
"<!-- 选择地址 -->"
],
[
20,
"<!-- 配送方式 -->"
],
[
29,
"<!-- 外圆角 -->"
],
[
78,
"<!-- 外卖配送 -->"
],
[
146,
"<!-- 虚拟商品展示手机号 -->"
],
[
161,
"<!-- 店铺 -->"
],
[
214,
"<!-- 金额 -->"
],
[
263,
"<!-- 门店列表弹窗 -->"
],
[
304,
"<!-- 选择支付方式弹窗 -->"
],
[
310,
"<!-- 门店自提、同城配送时间选择 -->"
]
],
"uni_modules\\uni-calendar\\components\\uni-calendar\\uni-calendar.vue": [
[
6,
"<view class=\"uni-calendar__header-btn-box\" @click=\"close\"><text class=\"uni-calendar__header-text uni-calendar--fixed-width\">取消</text></view>"
],
[
7,
"<view class=\"uni-calendar__header-btn-box\" @click=\"confirm\"><text class=\"uni-calendar__header-text uni-calendar--fixed-width\">确定</text></view>"
],
[
15,
"<text class=\"uni-calendar__header-text\">{{ (nowDate.year || '') + '年' + (nowDate.month || '') + '月' }}</text>"
],
[
27,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">日</text></view>"
],
[
28,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">一</text></view>"
],
[
29,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">二</text></view>"
],
[
30,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">三</text></view>"
],
[
31,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">四</text></view>"
],
[
32,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">五</text></view>"
],
[
33,
"<view class=\"uni-calendar__weeks-day\"><text class=\"uni-calendar__weeks-day-text\">六</text></view>"
]
],
"components-diy\\diy-category.vue": [
[
12,
"<view :style=\"navbarInnerStyle\" v-if=\"!value.search\">商品分类</view>"
],
[
15,
"<!-- \t\t\t<view :style=\"navbarInnerStyle\">商品分类</view> -->"
],
[
80,
"<!-- 全屏骨架占位 (只显示: 左分类树 + 右商品网格 + 底部空隙, 不画 navbar/TabBar,"
],
[
81,
"避免与小程序/H5 顶部 navbar / diy-bottom-nav 错位)。"
],
[
82,
"通过 v-if 拿到 categoryTreeLoading 时按真实布局骨架填充。"
],
[
83,
"search-box / 商品 nav-bar 由外层 category.vue 渲染, 不在本组件里动它 -->"
],
[
109,
"<!-- 模板99 + 二级分类: 全局二级分类按钮(去重, 一直显示) + 商品列表 -->"
],
[
163,
"<text class=\"title\">总计:</text>"
],
[
169,
"<view class=\"right-wrap\"><button type=\"primary\" class=\"settlement-btn\" @tap.stop=\"settlement\">去结算</button>"
]
],
"pages\\index\\index.vue": [
[
5,
"<!-- diy 数据网络加载失败提示(页面内横幅,各端可靠,悬浮在最上层) -->"
],
[
8,
"<text class=\"diy-load-error__msg\">{{ diyLoadErrorMsg || '网络异常,请稍后重试' }}</text>"
],
[
61,
"<view bindtap=\"adverclose\">跳过</view>"
],
[
93,
"<!-- 底部tabBar -->"
],
[
98,
"<!-- 关注公众号弹窗 -->"
],
[
109,
"<!-- 收藏 -->"
],
[
118,
"<!-- 选择门店弹出框,定位当前位置,展示最近的一个门店 -->"
],
[
154,
"<!-- 隐私协议 -->"
],
[
158,
"<!-- 启动屏: 由 splash-state 状态控制, 仅在 boot 阶段显示 -->"
]
],
"pages_promotion\\point\\detail.vue": [
[
78,
"<!-- 添加二维码 start -->"
],
[
90,
"<!-- 促销 -->"
],
[
109,
"<!-- 添加二维码 end -->"
],
[
112,
"<!-- 已选规格 -->"
],
[
135,
"<!-- 商品属性 -->"
],
[
155,
"<!-- 商品服务 -->"
],
[
180,
"<!-- 详情 -->"
],
[
196,
"<!-- SKU选择 -->"
],
[
219,
"<!-- 隐私弹窗 -->"
]
],
"pages_tool\\contact\\contact.vue": [
[
7,
"<!-- 专属客服 + 在线留言 -->"
],
[
39,
"<!-- 人员信息/名片 -->"
],
[
74,
"<!-- 企业文件 -->"
],
[
91,
"<!-- 企业视频 -->"
],
[
107,
"<!-- 视频号视频列表 -->"
],
[
120,
"<!-- 地图 -->"
],
[
134,
"<!--留言弹窗-->"
],
[
165,
"<!-- <input v-model=\"Form.mailbox\" class=\"fui-input\" placeholder=\"请输入您的邮箱\" type=\"text\" ></input> -->"
],
[
184,
"<!-- 视频播放弹窗 -->"
]
],
"components-diy\\diy-article.vue": [
[
4,
"<!-- 注: :class 用内联数组,与 ns-newform 对齐;computed listClass/itemClass 已移除(避免数组 toString 用逗号 join 的问题) -->"
],
[
6,
"<!-- 自动垂直滚动(JS 驱动 transform 跑马灯,默认开启,同时支持用户手动拖拽)"
],
[
7,
"设计:loopedList 把 list 复制成 A+A 两份;外层容器固定高度(窗口)overflow:hidden,"
],
[
8,
"内层容器用 JS 控制 transform:translateY,从 0 → -第一份高度后无缝重置。"
],
[
9,
"支持:① 自动连续/步进滚动;② 用户触摸并拖拽可手动滚动;③ 松手 2s 后从当前位置恢复自动滚动。 -->"
],
[
21,
"<!-- 封面图:无图时隐藏图位;style-4 纯文字始终不显示 -->"
],
[
55,
"<!-- 非滚动模式(scrollMode==='none')时的普通列表 -->"
],
[
90,
"<!-- 查看更多(仅非滚动模式显示) -->"
]
],
"components-diy\\diy-category-item.vue": [
[
80,
"<!-- 分类筛选 -->"
],
[
114,
"<!--一级分类展示商品显示-->"
],
[
118,
"<!--一级-->"
],
[
168,
"<view class=\"color-base-bg select-sku\" @tap.stop=\"toDetail(item)\">立即购买</view>"
],
[
172,
"<text>选规格</text>"
],
[
194,
"<view class=\"color-base-bg select-sku\" @tap.stop=\"toDetail(item)\">立即购买</view>"
],
[
203,
"<!-- \t\t<view class=\"end-tips\" ref=\"endTips\" v-if=\"last && (categoryId == -1 || !category.child_list || (category.child_list && categoryId == category.child_list"
],
[
206,
"上滑查看下一分类"
]
],
"components-diy\\diy-channel-list.vue": [
[
3,
"<!-- 轮播模式 -->"
],
[
11,
"<!-- 视频号视频卡片,轮播模式 -->"
],
[
21,
"<!-- 固定布局模式 -->"
],
[
24,
"<!-- 视频号视频卡片,列表模式 -->"
],
[
32,
"<!-- 其他布局模式(如滚动布局) -->"
],
[
42,
"<!-- 视频号视频卡片,滚动模式 -->"
],
[
208,
"title: '视频号仅支持在微信小程序环境中播放',"
],
[
218,
"console.error('打开视频号失败', err);"
]
],
"pages_promotion\\point\\goods_list.vue": [
[
4,
"<!-- 搜索区域 -->"
],
[
14,
"<!-- 排序 -->"
],
[
78,
"<!-- <button type=\"primary\" size=\"mini\">立即兑换</button> -->"
],
[
92,
"<!-- 筛选弹出框 -->"
],
[
96,
"<!-- 价格筛选项 -->"
],
[
107,
"<!-- 分类筛选项 -->"
],
[
128,
"<!-- 隐私弹窗 -->"
],
[
131,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\member\\info_edit.vue": [
[
4,
"<!-- 修改用户名 -->"
],
[
15,
"<!-- 修改昵称 -->"
],
[
25,
"<!-- 修改真实姓名 -->"
],
[
35,
"<!-- 修改性别 -->"
],
[
52,
"<!-- 修改生日 -->"
],
[
64,
"<!-- 修改密码 -->"
],
[
108,
"<!-- 修改手机号 -->"
],
[
128,
"<!-- 绑定手机号 -->"
]
],
"scripts\\fix-longpress-syntax.js": [
[
56,
"console.log(`✓ 已修复: ${filePath}`)"
],
[
84,
"console.error(`✗ 无法读取目录: ${dir}`)"
],
[
92,
"console.log('开始修复 show-menu-by-longpress 语法...\\n')"
],
[
104,
"console.log(`\\n修复完成!`)"
],
[
105,
"console.log(`总共扫描: ${totalFiles} 个文件`)"
],
[
106,
"console.log(`成功修复: ${fixedFiles} 个文件`)"
],
[
107,
"console.log(`\\n正确的用法:`);"
],
[
109,
"console.log(` <image src=\"...\" :show-menu-by-longpress=\"condition\"></image> (如果需要动态控制)`);"
]
],
"components\\mescroll\\mescroll-body.vue": [
[
11,
"<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->"
],
[
20,
"<!-- 列表内容 -->"
],
[
23,
"<!-- 空布局 -->"
],
[
26,
"<!-- 上拉加载区域 (下拉刷新时不显示, 支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)-->"
],
[
29,
"<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->"
],
[
34,
"<!-- 无数据 -->"
],
[
39,
"<!-- 回到顶部按钮 (fixed元素需写在transform外面,防止降级为absolute)-->"
]
],
"components\\mescroll\\mescroll-uni.vue": [
[
20,
"<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->"
],
[
29,
"<!-- 列表内容 -->"
],
[
32,
"<!-- 空布局 -->"
],
[
35,
"<!-- 上拉加载区域 (下拉刷新时不显示, 支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)-->"
],
[
38,
"<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->"
],
[
44,
"<!-- 无数据 -->"
],
[
50,
"<!-- 回到顶部按钮 (fixed元素,需写在scroll-view外面,防止滚动的时候抖动)-->"
]
],
"components-diy\\diy-channel-video.vue": [
[
3,
"<!-- 嵌入式视频播放 -->"
],
[
8,
"<!-- 嵌入式视频播放组件 -->"
],
[
16,
"<!-- 视频标题,支持多行显示控制 -->"
],
[
19,
"<!-- 视频统计信息 -->"
],
[
24,
"<!-- 跳转式视频播放 -->"
],
[
36,
"<!-- 视频标题,支持多行显示控制 -->"
],
[
39,
"<!-- 视频统计信息,非列表模式下显示 -->"
]
],
"pages_order\\detail_point.vue": [
[
3,
"<!-- 订单状态 -->"
],
[
21,
"<!-- 店铺 -->"
],
[
58,
"<!-- 订单概况 -->"
],
[
85,
"<!-- 联系客服 -->"
],
[
90,
"<text>联系客服</text>"
],
[
96,
"<!-- 订单金额 -->"
],
[
133,
"<!-- 选择支付方式弹窗 -->"
]
],
"pages_tool\\member\\point.vue": [
[
53,
"<view class=\"title\">做任务赚积分</view>"
],
[
57,
"<view class=\"title\">每日签到</view>"
],
[
58,
"<view class=\"desc color-tip font-size-tag\">连续签到可获得更多积分</view>"
],
[
60,
"<view class=\"btn\">去签到</view>"
],
[
65,
"<view class=\"title\">购买商品</view>"
],
[
66,
"<view class=\"desc color-tip font-size-tag\">购买商品可获得积分</view>"
],
[
68,
"<view class=\"btn\">去下单</view>"
]
],
"scripts\\harmony.patch.js": [
[
19,
"console.log('site.js 已同步到 stub 项目源码目录');"
],
[
22,
"console.error('同步 site.js 到 stub 失败:', err);"
],
[
60,
"console.warn('[harmony.patch] ⚠️ harmony-component-placeholder 注入失败:', e.message);"
],
[
63,
"console.log('HarmonyOS 资源拷贝完成');"
],
[
65,
"console.error('发生错误:', err);"
],
[
106,
"console.log(`ZIP 文件路径: ${zipFilePath}`);"
],
[
110,
"console.log('跳过创建 ZIP 文件和打开目录');"
]
],
"scripts\\mp-weixin.patch.js": [
[
25,
"console.log(`已拷贝: ${srcPath} -> ${destPath}`);"
],
[
27,
"console.warn(`源文件不存在,跳过复制: ${srcPath}`);"
],
[
35,
"console.log(`已拷贝: ${srcSitePath} -> ${destDir}`);"
],
[
37,
"console.error(`源文件不存在: ${srcSitePath}`);"
],
[
41,
"console.error('发生错误:', err);"
],
[
67,
"console.log(`ZIP 文件路径: ${zipFilePath}`);"
],
[
70,
"console.log('跳过创建 ZIP 文件和打开目录');"
]
],
"store\\index.js": [
[
524,
"console.error('设置主题颜色失败', e);"
],
[
580,
"console.log('[theme] preset 暂不可用,等待远端 preset 拉完:', finalPresetName);"
],
[
586,
"console.log('[theme] 远端 preset 到达,重应用成功:', finalPresetName);"
],
[
588,
"console.warn('[theme] 远端 preset 到达后仍找不到:', finalPresetName);"
],
[
599,
"console.log('[theme] 远端 preset 补充,重应用:', finalPresetName);"
],
[
605,
"console.error('[theme] applyThemeWithRemote 失败,回退到纯预设:', e);"
],
[
615,
"console.error('[theme] 纯预设回退也失败:', e2);"
]
],
"common\\js\\navigation.js": [
[
33,
"console.warn('获取导航栏高度失败,使用默认值:', error)"
],
[
49,
"console.warn('未找到 uni-page-head 元素或高度为0')"
],
[
69,
"console.error('微信小程序高度计算失败:', error)"
],
[
95,
"console.error('App端高度获取失败:', error)"
],
[
213,
"console.error('处理导航请求失败:', error)"
],
[
248,
"console.error('导航处理错误:', {"
]
],
"components\\payment\\payment.vue": [
[
3,
"<!-- 选择支付方式弹窗 -->"
],
[
44,
"<!-- 新版支付组件 订单表为order表 的订单支付时使用该组件 -->"
],
[
66,
"name: '支付宝支付',"
],
[
72,
"name: '微信支付',"
],
[
82,
"name: '微信支付',"
],
[
91,
"name: '支付宝支付',"
]
],
"components-diy\\diy-bottom-nav.vue": [
[
2,
"<!-- 修复底部 TabBar 频闪:"
],
[
3,
"微信小程序等环境下 `shouldShowTabBar` 在 tabBarList 异步加载期间会从 false→true 短暂切换,"
],
[
4,
"配合 `v-if` 会让整个 tab 组件树卸载/重建 -> 视觉频闪 + tabBar 占用空间反复占位/释放导致上方内容跳动。"
],
[
5,
"改为 `v-show`, 只切换可见性, 内部 tab 始终在 DOM 中(无 tabBarList 时只渲染空壳占位)。 -->"
],
[
7,
"<!-- tabBarList 未就绪时仍保留 placeholder 占位, 避免上方内容在加载完成后突跳 -->"
],
[
46,
"<!-- 解决fixed定位后底部导航栏塌陷问题: 始终保留 placeholder, 避免内容随 tabBar 可见性跳 -->"
]
],
"scripts\\add-longpress-to-images.js": [
[
74,
"console.log(`✓ 已处理: ${filePath}`)"
],
[
106,
"console.log('开始处理图片长按识别功能...\\n')"
],
[
118,
"console.log(`\\n处理完成!`)"
],
[
119,
"console.log(`总共扫描: ${totalFiles} 个文件`)"
],
[
120,
"console.log(`成功处理: ${processedFiles} 个文件`)"
],
[
121,
"console.log(`\\n提示:如需排除某些图片,请在 <image> 标签添加 class=\"no-longpress\"`)"
]
],
"scripts\\create-zip.js": [
[
13,
"throw new Error(`源目录不存在: ${sourceDir}`);"
],
[
22,
"console.warn('无法获取 Git 提交 ID,使用 unknown 代替');"
],
[
47,
"console.log(`执行命令: ${command}`);"
],
[
51,
"console.warn('警告:', stderr);"
],
[
54,
"console.log(`✅ ZIP文件创建完成: ${zipFileName}`);"
],
[
57,
"throw new Error(`系统命令执行失败: ${error.message}`);"
]
],
"scripts\\harmony-component-placeholder.js": [
[
115,
"console.error('用法: node scripts/harmony-component-placeholder.js <产物根目录>');"
],
[
119,
"console.error(`目录不存在: ${rootDir}`);"
],
[
123,
"console.log(`[HarmonyPlaceholder] 扫描根: ${rootDir}`);"
],
[
124,
"console.log(`[HarmonyPlaceholder] 页面清单大小: ${pageSet.size}, diy 组件清单大小: ${DIY_LIST.length}`);"
],
[
133,
"console.log(` ✓ 注入: ${rel}`);"
],
[
148,
"console.log(`[HarmonyPlaceholder] 注入: ${stats.injected}, 已有 placeholder: ${stats.hasPlaceholder}, 跳过 (页面): ${stats.pageSkip}, 无 diy: ${stats.noDiy}, 无 usingComp"
]
],
"uni_modules\\uni-datetime-picker\\components\\uni-datetime-picker\\time-picker.vue": [
[
39,
"<!-- 兼容 nvue 不支持伪类 -->"
],
[
62,
"<!-- 兼容 nvue 不支持伪类 -->"
],
[
112,
"title: '日期和时间',"
],
[
194,
"this.title = '日期'"
],
[
198,
"this.title = '时间'"
],
[
202,
"this.title = '日期和时间'"
]
],
"common\\js\\util-navigate.js": [
[
179,
"console.warn('[normalizeUrl] scheme 后有多余的 /:', urlString);"
],
[
232,
"console.warn('[normalizeUrl] host 含非法字符:', urlString);"
],
[
507,
"console.warn('[navigate] H5 环境下没有 window.location');"
],
[
517,
"console.warn('[navigate] H5 跳转失败:', e);"
],
[
525,
"console.warn('[navigate] 非 H5 环境下没有 uni 全局');"
]
],
"components\\mescroll\\mescroll-uni-option.js": [
[
8,
"textInOffset: Lang.lang('components.mescroll.down.textInOffset', '下拉刷新'),"
],
[
9,
"textOutOffset: Lang.lang('components.mescroll.down.textOutOffset', '释放更新'),"
],
[
10,
"textLoading: Lang.lang('components.mescroll.down.textLoading', '加载中 ...'),"
],
[
16,
"textLoading: Lang.lang('components.mescroll.up.textLoading', '加载中 ...'),"
],
[
32,
"tip: Lang.lang('components.mescroll.empty.tip', '~ 暂无相关数据 ~')"
]
],
"components\\mescroll\\mescroll-uni.js": [
[
63,
"textInOffset: __i18n('components.mescroll.down.textInOffset', '下拉刷新'),"
],
[
64,
"textOutOffset: __i18n('components.mescroll.down.textOutOffset', '释放更新'),"
],
[
65,
"textLoading: __i18n('components.mescroll.down.textLoading', '加载中 ...'),"
],
[
98,
"textLoading: __i18n('components.mescroll.up.textLoading', '加载中 ...'),"
],
[
123,
"tip: __i18n('components.mescroll.empty.tip', '~ 暂无相关数据 ~'),"
]
],
"components\\mescroll\\my-list-mescroll.vue": [
[
2,
"<!-- top=\"xxx\"下拉布局往下偏移,防止被悬浮菜单遮住 -->"
],
[
3,
"<!-- 鸿蒙下不要用 v-if=\"isInit\",会导致内层 mescroll 创建被严重延迟,先 onReady 后 inner created -->"
],
[
17,
"<!-- 数据列表 - 鸿蒙下用 key 强制重建 slot DOM,绕过 ArkUI slot 响应式失效问题 -->"
],
[
44,
"tip: '~ 空空如也 ~',"
],
[
45,
"btnText: '去看看'"
]
],
"components\\ns-login\\ns-login.vue": [
[
3,
"<!-- 完善会员资料 -->"
],
[
43,
"<!-- 协议勾选 -->"
],
[
57,
"<!-- 手机号授权按钮 -->"
],
[
75,
"<!-- 昵称和头像模式 -->"
],
[
125,
"<!-- 隐私弹窗 -->"
]
],
"components\\wxwork-contact\\wxwork-contact.vue": [
[
12,
"<!-- 确认弹窗 -->"
],
[
111,
"console.error('企业微信SDK初始化失败');"
],
[
115,
"console.error('初始化企业微信SDK失败:', error);"
],
[
170,
"console.error('跳转企业微信失败:', err);"
],
[
187,
"console.error('打开用户资料失败:', err);"
]
],
"pages_tool\\member\\coupon.vue": [
[
10,
"<view class=\"sort\" :class=\"sort == 1 ? 'color-base-border color-base-text' : ''\" @click=\"changeSort(1, '')\">全部</view>"
],
[
11,
"<view class=\"sort\" :class=\"sort == 2 ? 'color-base-border color-base-text' : ''\" @click=\"changeSort(2, 'reward')\">满减券</view>"
],
[
12,
"<view class=\"sort\" :class=\"sort == 3 ? 'color-base-border color-base-text' : ''\" @click=\"changeSort(3, 'discount')\">折扣券</view>"
],
[
13,
"<view class=\"sort\" :class=\"sort == 4 ? 'color-base-border color-base-text' : ''\" @click=\"changeSort(4, 'no_threshold')\">无门槛券</view>"
],
[
47,
"{{ item.use_store==='all'?'适用门店:全部门店': '适用门店:'+item.use_store_name}}"
]
],
"scripts\\inject-placeholder.js": [
[
12,
"console.warn(`[InjectPlaceholder] ⚠️ ${DIY_DIR} 不存在, diy 组件清单为空`);"
],
[
231,
"console.error('[InjectPlaceholder] ❌ 读取 pages.json 失败:', e.message);"
],
[
310,
"console.log(`[InjectPlaceholder] ✅ 展开 ${expanded}, 注入 ${added}, 移除 ${removed}, 跳过 ${skipped}, 无变化 ${noChange}, diy 组件 ${DIY_LIST.length}`);"
],
[
312,
"console.error('[InjectPlaceholder] ❌ 写回 pages.json 失败:', e.message);"
],
[
316,
"console.log(`[InjectPlaceholder] ✓ 无需改动, diy 组件 ${DIY_LIST.length}`);"
]
],
"components\\l-time\\time.js": [
[
96,
"return \"刚刚\""
],
[
102,
"return Math.floor(timer / 60) + \"分钟前\""
],
[
110,
"return Math.floor(timer / 60 / 60) + \"小时前\";"
],
[
119,
"return Math.ceil(timer / 86400) + \"天前\""
]
],
"components\\ns-contact\\ns-contact.vue": [
[
12,
"<!-- 微信小程序官方客服按钮 -->"
],
[
18,
"<!-- 微信小程序自定义客服按钮 -->"
],
[
23,
"<!-- 其他平台保持原逻辑 -->"
],
[
42,
"<!-- 客服组件 -->"
]
],
"components-diy\\diy-goods-list.vue": [
[
69,
"<!-- 购物车图标 -->"
],
[
78,
"<!--加号图标 -->"
],
[
87,
"<!-- 按钮 -->"
],
[
100,
"<!--自定义图标 -->"
]
],
"pages_goods\\cart.vue": [
[
213,
"<!-- 底部tabBar占位 -->"
],
[
354,
"<!-- 加载动画 -->"
],
[
357,
"<!-- 返回顶部 -->"
],
[
362,
"<!-- 隐私弹窗 -->"
]
],
"pages_order\\list.vue": [
[
74,
"<view class=\"goods-action\"><!-- <view class=\"action-btn\">加购物车</view> -->"
],
[
152,
"<view class=\"action-btn color-base-text color-base-border\" @click=\"mergePay()\">合并付款</view>"
],
[
155,
"<!-- 选择支付方式弹窗 -->"
],
[
166,
"<!-- 底部tabBar -->"
]
],
"pages_promotion\\fenxiao\\goods_list.vue": [
[
63,
"<!-- 分享弹窗 -->"
],
[
106,
"<!-- 海报 -->"
],
[
127,
"<!-- 隐私弹窗 -->"
],
[
130,
"<!-- 底部tabBar -->"
]
],
"pages_promotion\\fenxiao\\withdraw_list.vue": [
[
45,
"text: '已转账'"
],
[
49,
"text: '待审核'"
],
[
53,
"text: '已审核'"
],
[
57,
"text: '已拒绝'"
]
],
"pages_tool\\file-preview\\file-preview.vue": [
[
12,
"<!-- PDF 文件预览 -->"
],
[
18,
"<!-- Word 文件预览 -->"
],
[
24,
"<!-- 视频文件预览 -->"
],
[
30,
"<!-- 其他文件类型 -->"
]
],
"pages_tool\\goods\\coupon.vue": [
[
11,
"<!-- \t\t<view @click=\"changeSort(4, 'no_threshold')\"><text :class=\"sort == 4 ? 'color-base-text active color-base-border-bottom' : ''\">无门槛券</text></view> -->"
],
[
51,
"{{ item.use_store==='all'?'适用门店:全部门店': '适用门店:'+item.use_store_name}}"
],
[
75,
"<!-- 隐私弹窗 -->"
],
[
78,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\member\\account_edit.vue": [
[
110,
"if (this.payList.length == 1 && this.payList[0] == '银行卡') {"
],
[
127,
"case '银行卡':"
],
[
130,
"case '支付宝':"
],
[
133,
"case '微信零钱':"
]
],
"pages_tool\\member\\index.vue": [
[
29,
"<!-- 退出登录和账号注销按钮 -->"
],
[
51,
"<!-- 底部tabBar -->"
],
[
56,
"<!-- 收藏 -->"
],
[
71,
"<!-- 小程序隐私协议 -->"
]
],
"pages_tool\\notice\\list.vue": [
[
23,
"<!-- 隐私弹窗 -->"
],
[
26,
"<!-- 底部tabBar -->"
],
[
80,
"title: '公告',"
],
[
88,
"var title = '公告';"
]
],
"pages_tool\\order\\refund_detail.vue": [
[
10,
"<!-- <view class=\"font-size-goods-tag color-tip\">如果商家逾期未处理,平台将自动通过申请并退款给你</view> -->"
],
[
40,
"<!-- 商品信息 -->"
],
[
49,
"<!-- 退款信息 -->"
],
[
136,
"<text>联系客服</text>"
]
],
"pages_tool\\recharge\\order_list.vue": [
[
24,
"<view class=\"<strong>goods-name</strong> color-tip \" v-if=\"orderItem.point > 0 || orderItem.growth > 0\">赠送:</view>"
],
[
25,
"<view class=\"goods-name color-tip \" v-if=\"orderItem.point > 0\">{{ orderItem.point }}积分</view>"
],
[
27,
"<view class=\"goods-name color-tip \" v-if=\"orderItem.growth > 0\">{{ orderItem.growth }}成长值</view>"
],
[
29,
"<view class=\"goods-name color-tip \" v-if=\"orderItem.coupon_id\">优惠券x{{ orderItem.coupon_id.split(',').length }}</view>"
]
],
"scripts\\inject-nav-title.js": [
[
103,
"console.error('[InjectNavTitle] ❌ 读取 pages.json 失败:', e.message);"
],
[
152,
"console.log(`[InjectNavTitle] ✅ 注入 ${injected}, 跳过(已存在) ${skipped}`);"
],
[
154,
"console.error('[InjectNavTitle] ❌ 写回 pages.json 失败:', e.message);"
],
[
158,
"console.log(`[InjectNavTitle] ✓ 无需改动, 跳过(已存在) ${skipped}`);"
]
],
"uni_modules\\uni-count-down\\components\\uni-count-down\\uni-count-down.vue": [
[
11,
"<view v-if=\"showDay && d > 0\" :style=\"{ color: splitorColor }\" class=\"uni-countdown__splitor day\" :class=\"splitorColorClass\">{{ showColon ? '天' : '天' }}</view>"
],
[
19,
"<view :style=\"{ color: splitorColor }\" class=\"uni-countdown__splitor\" :class=\"splitorColorClass\">{{ showColon ? ':' : '时' }}</view>"
],
[
27,
"<view :style=\"{ color: splitorColor }\" class=\"uni-countdown__splitor\" :class=\"splitorColorClass\">{{ showColon ? ':' : '分' }}</view>"
],
[
35,
"<view v-if=\"!showColon\" :style=\"{ color: splitorColor }\" class=\"uni-countdown__splitor\" :class=\"splitorColorClass\">秒</view>"
]
],
"common\\js\\util.js": [
[
525,
"console.error('[navigate] tabBar 跳转失败:', cleanUrl, err);"
],
[
1029,
"console.log(`外部链接,跳转到webview`, url);"
],
[
1419,
"else reject(err || new Error('复制失败'));"
]
],
"components\\mescroll\\components\\mescroll-up.vue": [
[
1,
"<!-- 上拉加载区域 -->"
],
[
4,
"<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->"
],
[
9,
"<!-- 无数据 -->"
]
],
"components\\ns-goods-sku\\ns-goods-sku.vue": [
[
134,
"<!-- 阶梯拼团 -->"
],
[
184,
"<!-- 兑换商品 -->"
],
[
189,
"<!-- 兑换优惠券、红包 -->"
]
],
"components\\ns-navbar\\ns-navbar.vue": [
[
31,
"<text>请输入商品名称</text>"
],
[
39,
"<view v-else class=\"title-wrap\" :style=\"{ color: data.textNavColor }\">定位中...</view>"
],
[
41,
"<view class=\"nearby-store-name\" :style=\"{ color: data.textNavColor }\">附近门店</view>"
]
],
"components-diy\\diy-groupbuy.vue": [
[
52,
"已团{{ item.sell_num }}件"
],
[
92,
":style=\"{ color: value.theme == 'diy' ? value.saleStyle.color : '' }\">已团{{"
],
[
93,
"item.sell_num }}件</view>"
]
],
"components-diy\\diy-index-page.vue": [
[
52,
"<!-- 二级分类 -->"
],
[
105,
"<!-- 分类广告 -->"
],
[
161,
"<!-- <ns-empty v-else-if=\"!isloading\" :isIndex=\"false\" text=\"该分类下暂无商品\"></ns-empty> -->"
]
],
"components-diy\\diy-rubik-cube.vue": [
[
3,
"<!-- 自定义 -->"
],
[
8,
"<!-- 1左2右 -->"
],
[
31,
"<!-- 1左3右 -->"
]
],
"components-diy\\diy-video-list.vue": [
[
3,
"<!-- 固定布局模式 -->"
],
[
25,
"<!-- 其他布局模式 -->"
],
[
54,
"<!-- 视频播放弹窗 -->"
]
],
"components-diy\\diy-video.vue": [
[
3,
"<!-- H5端使用原生video标签 -->"
],
[
19,
"<!-- 微信小程序端使用uni-app的video组件 -->"
],
[
35,
"<!-- 鸿蒙元服务端使用uni-app的video组件 -->"
]
],
"pages\\index\\public\\js\\index.js": [
[
161,
"title: '版本信息',"
],
[
162,
"content: `提交 ID: ${v.commitId}\\n构建时间: ${v.buildTime}\\n${Config.baseUrl}`,"
],
[
166,
"console.error('未获取到构建版本信息');"
]
],
"pages_goods\\category.vue": [
[
3,
"<!-- 使用 item.id / componentName 稳定 key 避免 v-for 在 diyData 整体重赋值时把组件整个销毁重建, 引发频闪 -->"
],
[
16,
"<!-- 隐私弹窗 -->"
],
[
19,
"<!-- 底部tabBar: loading 期间隐藏, 等 loading-cover 关闭后下一 tick 再挂载, 避免 TabBar 与 loading-cover 同时 GPU 合成导致频闪 -->"
]
],
"pages_promotion\\fenxiao\\withdraw_apply.vue": [
[
53,
"提现"
],
[
64,
"<view class=\"recoend-con\">提现记录</view>"
],
[
215,
"let branchBankName = this.isBalance ? \"余额\" : this.bankAccountInfo.branch_bank_name;"
]
],
"pages_promotion\\merch\\merchcategory.vue": [
[
7,
"<input type=\"text\" class=\"uni-input\" maxlength=\"50\" placeholder=\"商品搜索\" confirm-type=\"search\" disabled=\"true\" />"
],
[
50,
"<view class=\"tips\">暂时没有分类哦!</view>"
],
[
59,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\agreement\\contenr.vue": [
[
3,
"<!-- 加载状态 -->"
],
[
8,
"<!-- 空状态 -->"
],
[
16,
"<!-- 内容状态 -->"
]
],
"pages_tool\\ai-chat\\index.vue": [
[
3,
"<!--自定义导航头部 - 绝对定位在顶部,不随键盘上移 -->"
],
[
15,
"<!-- 聊天内容区域:从导航栏下方到容器底部 -->"
],
[
37,
"<!-- 设置面板 -->"
]
],
"pages_tool\\goods\\brand.vue": [
[
19,
"<!-- 隐私弹窗 -->"
],
[
22,
"<!-- 底部tabBar -->"
],
[
79,
"var title = '你想要的大牌都在这里';"
]
],
"pages_tool\\goods\\coupon_receive.vue": [
[
16,
"<!-- 适用场景: -->"
],
[
18,
"<!-- 适用门店: -->"
],
[
33,
"<!-- 隐私弹窗 -->"
]
],
"pages_tool\\goods\\search.vue": [
[
11,
"<!-- 历史搜索 -->"
],
[
29,
"<!-- 热门搜索 -->"
],
[
44,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\help\\list.vue": [
[
13,
"<!-- 隐私弹窗 -->"
],
[
82,
"title: '帮助中心',"
],
[
90,
"var title = '帮助中心使你更加方便';"
]
],
"pages_tool\\index\\diy.vue": [
[
36,
"<!-- 底部tabBar -->"
],
[
41,
"<!-- 收藏 -->"
],
[
51,
"<!-- 小程序隐私协议 -->"
]
],
"pages_tool\\login\\find.vue": [
[
23,
"<!-- 输入手机号和验证码 -->"
],
[
51,
"<!-- 输入动态码 -->"
],
[
56,
"<!-- 输入新密码 -->"
]
],
"pages_tool\\member\\balance.vue": [
[
24,
"<view class=\"font-size-tag\">现金余额(元)</view>"
],
[
28,
"<view class=\"font-size-tag\">储值余额(元)</view>"
],
[
56,
"<text class=\"title\">充值记录</text>"
]
],
"pages_tool\\member\\card_log.vue": [
[
3,
"<!-- 顶部统计 -->"
],
[
21,
"<!-- 筛选 tab -->"
],
[
30,
"<!-- 列表 -->"
]
],
"pages_tool\\member\\invite_friends.vue": [
[
157,
"<!-- 海报 -->"
],
[
178,
"<!-- 分享弹窗 -->"
],
[
212,
"<!-- 弹出规则 -->"
]
],
"pages_tool\\member\\point_detail.vue": [
[
66,
"label: '全部',"
],
[
94,
"this.date = tempArr[0] + '年' + tempArr[1] + '月';"
],
[
111,
"return `${year}年${month}月`;"
]
],
"pages_tool\\pay\\cashier.vue": [
[
43,
"name: '支付宝支付',"
],
[
49,
"name: '微信支付',"
],
[
59,
"name: '微信支付',"
]
],
"pages_tool\\storeclose\\storeclose.vue": [
[
41,
"return '该店铺已打烊...';"
],
[
45,
"return '店铺不存在';"
],
[
47,
"return '店铺打烊';"
]
],
"scripts\\verify-p2-keys.js": [
[
313,
"console.log('\\n⚠️ components-diy/diy-tab.vue 的 title 为运行时 DIY 数据,无法静态枚举,建议通过 DIY 数据规范/白名单保证。');"
],
[
316,
"console.log('\\n✅ 所有可枚举的 P2 动态 key 均可解析');"
],
[
319,
"console.log('\\n❌ 部分 P2 动态 key 缺失');"
]
],
"uni_modules\\uni-datetime-picker\\components\\uni-datetime-picker\\calendar.vue": [
[
13,
"class=\"uni-calendar__header-text\">{{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}}</text>"
],
[
23,
"<!-- <text class=\"uni-calendar__backtoday\" @click=\"backtoday\">回到今天</text> -->"
],
[
89,
"<view class=\"uni-datetime-picker--btn\" @click=\"confirm\">确认</view>"
]
],
"uni_modules\\x-skeleton\\components\\x-skeleton\\x-skeleton.vue": [
[
3,
"<!-- 骨架屏 -->"
],
[
52,
"<!-- 插槽 -->"
],
[
143,
"console.error('x-skeleton: textHeight参数不支持百分比单位');"
]
],
"common\\js\\config-external.js": [
[
252,
"console.error(`加载页面语言包 ${lang}/${pagePath} 失败:`, error);"
],
[
291,
"console.error(`加载主题 ${theme} 失败:`, error);"
]
],
"common\\js\\event-safety.js": [
[
62,
"console.warn('matches 检查失败:', error)"
],
[
86,
"console.error('事件处理错误:', error)"
]
],
"common\\js\\mp-share-default.js": [
[
85,
"title: '小程序分享',"
],
[
130,
"cfg.title = siteName || '小程序分享';"
]
],
"components\\mescroll\\components\\mescroll-empty.vue": [
[
1,
"<!--空布局"
],
[
3,
"可作为独立的组件, 不使用mescroll的页面也能单独引入, 以便APP全局统一管理:"
]
],
"components\\ns-goods-recommend\\ns-goods-recommend.vue": [
[
13,
"title: '猜你喜欢',"
],
[
20,
"text: '购买',"
]
],
"components\\ns-goods-sku\\ns-goods-sku-index.vue": [
[
4,
"<!-- sku选择 -->"
],
[
140,
"item.unit = item.unit || '件';"
]
],
"components\\ns-payment\\ns-payment.vue": [
[
3,
"<!-- 选择支付方式弹窗 -->"
],
[
46,
"<!-- 旧版支付组件 订单表不为order表 的订单支付时使用该组件 -->"
]
],
"components\\ns-select-time\\ns-select-time.vue": [
[
11,
"<!-- 左侧日期选择 -->"
],
[
19,
"<!-- 右侧时间选择 -->"
]
],
"components-diy\\diy-bargain.vue": [
[
5,
"<!-- 商品头部 -->"
],
[
24,
"<!-- 商品列表 -->"
]
],
"components-diy\\diy-image-nav.vue": [
[
8,
"<!-- 图片部分 -->"
],
[
26,
"<!-- 文字部分 -->"
]
],
"components-diy\\diy-map.vue": [
[
9,
"<cover-view style=\"font-size:24rpx\">一键导航</cover-view>"
],
[
12,
"<!-- 使用非原生cover-view, 解决原生cover-view组件渲染机制z-index失效的问题 -->"
]
],
"components-diy\\diy-notes.vue": [
[
20,
"<text class=\"notes-label color-base-text\">#{{ item.note_type == 'goods_item' ? '单品介绍' :"
],
[
21,
"'掌柜说' }}#</text>"
]
],
"components-diy\\diy-notice.vue": [
[
11,
"<!-- 横向滚动 -->"
],
[
28,
"<!-- 上下滚动 -->"
]
],
"components-diy\\diy-text.vue": [
[
230,
"<!-- 图十五 -->"
],
[
264,
"<!-- 图十六 -->"
]
],
"pages_promotion\\fenxiao\\order.vue": [
[
65,
"<!-- <text>返{{ fenxiaoWords.account }}金额:</text>"
],
[
96,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\ai-chat\\components\\ai-chat-search.vue": [
[
3,
"<!-- 搜索入口按钮(浮动在消息区右上角) -->"
],
[
9,
"<!-- 搜索浮条 -->"
]
],
"pages_tool\\article\\list.vue": [
[
29,
"<!-- 隐私弹窗 -->"
],
[
32,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\form\\formdata.vue": [
[
6,
"<!-- 复用 diy-form:banner / tip / 表单字段 / 提交按钮 全部由其内部渲染,样式(bannerPaddingX/tipColor/submitBgColor 等)由 form_config 控制。"
],
[
7,
"@submit 接管提交逻辑(带 uniacid + showModal) -->"
]
],
"pages_tool\\member\\balance_detail.vue": [
[
26,
"<!-- 明细列表 -->"
],
[
47,
"<!-- 无明细列表 -->"
]
],
"pages_tool\\member\\bind_mobile.vue": [
[
4,
"<!-- 一键授权绑定区域(小程序环境) -->"
],
[
20,
"<!-- 手动绑定表单 -->"
]
],
"pages_tool\\member\\card_buy.vue": [
[
191,
"<!-- 弹出规则 -->"
],
[
219,
"<!-- 选择支付方式弹窗 -->"
]
],
"pages_tool\\notice\\detail.vue": [
[
11,
"<!-- 隐私弹窗 -->"
],
[
87,
"var title = '[公告]' + this.detail.title;"
]
],
"pages_tool\\weapp\\order_shipping.vue": [
[
20,
"this.errorMsg = '缺少merchant_trade_no参数';"
],
[
32,
"this.errorMsg = res.message || '未知错误';"
]
],
"uni_modules\\uni-nav-bar\\components\\uni-nav-bar\\uni-nav-bar.vue": [
[
20,
"<!-- 标题插槽 -->"
],
[
25,
"<!-- 优先显示图标 -->"
]
],
"uni_modules\\uni-number-box\\components\\uni-number-box\\uni-number-box.vue": [
[
137,
"title: '商品库存不足'"
],
[
141,
"title: '商品最少购买' + this.min + '件'"
]
],
"common\\js\\auth.js": [
[
13,
"console.log(`微信小程序登录`)"
]
],
"common\\js\\config.js": [
[
19,
"console.warn('小程序发行环境下,必须配置site.js文件,不然将使用默认配置,影响小程序定制分发!');"
]
],
"common\\js\\goods_detail_base.js": [
[
309,
"title: title + '已下单'"
]
],
"common\\js\\lang.js": [
[
1132,
"console.error('解析语言包失败:', e, { langPath, field, locale });"
]
],
"common\\js\\map-wx-jssdk.js": [
[
675,
"region: options.region || '全国',"
]
],
"common\\js\\share.js": [
[
39,
"console.error('分享失败:', err);"
]
],
"common\\js\\splash-state.js": [
[
111,
"try { uni.showLoading({ title: opts.title || '加载中...', mask: false }); } catch (e) {}"
]
],
"common\\js\\util-tabbar.js": [
[
401,
"_log('step 5: pageTabMap miss → 进入 step 6/7');"
]
],
"components\\l-time\\l-time.vue": [
[
40,
"if (timeVal && (timeVal.endsWith('刚刚') || timeVal.endsWith('分钟前'))) {"
]
],
"components\\mescroll\\components\\mescroll-down.vue": [
[
1,
"<!-- 下拉刷新区域 -->"
]
],
"components\\mescroll\\components\\mescroll-top.vue": [
[
1,
"<!-- 回到顶部的按钮 -->"
]
],
"components\\ns-copyright\\ns-copyright.vue": [
[
13,
"<image :src=\"$util.img('public/uniapp/common/gov_record.png')\" alt=\"公安备案\" show-menu-by-longpress/>"
]
],
"components\\ns-form\\ns-form.vue": [
[
30,
"<!-- 鸿蒙元服务渲染为原生 ArkUI TextArea,必须用 :rows 控制初始显示行数;CSS height 在原生组件上不生效 -->"
]
],
"components\\ns-goods-action-icon\\ns-goods-action-icon.vue": [
[
3,
"<block v-if=\"text == '客服' || text == 'Contact'\">"
]
],
"components\\ns-loading\\ns-loading.vue": [
[
16,
"default: '加载中'"
]
],
"components\\privacy-popup\\privacy-popup.vue": [
[
102,
"console.error(\"=========低版本基础库==========\", e)"
]
],
"components\\splash-screen\\splash-screen.vue": [
[
21,
"<!-- 进度条 + 百分比 -->"
]
],
"components\\to-top\\to-top.vue": [
[
1,
"<!-- 回到顶部的按钮 -->"
]
],
"components-diy\\diy-hot-area.vue": [
[
6,
"<!-- 热区功能 -->"
]
],
"components-diy\\diy-search.vue": [
[
45,
"<!-- 解决fixed定位后导航栏塌陷的问题 -->"
]
],
"components-diy\\js\\wechat-channel.js": [
[
172,
"console.error('微信视频号错误:', err);"
]
],
"components-diy\\placeholder\\index.vue": [
[
2,
"<!-- DIY 占位页(不可达,仅用于让 components-diy 成为微信真分包) -->"
]
],
"pages_goods\\public\\js\\list.js": [
[
40,
"text: \"购买\","
]
],
"pages_goods\\_components\\goods-detail-view\\detail.js": [
[
494,
"console.log('打开成功');"
]
],
"pages_goods\\_components\\ns-goods-promotion\\ns-goods-promotion.vue": [
[
2,
"<!-- 当前商品参与的营销活动入口 -->"
]
],
"pages_promotion\\fenxiao\\apply.vue": [
[
3,
"<!-- 导航栏 -->"
]
],
"pages_promotion\\fenxiao\\promote.vue": [
[
52,
"<!-- 小程序隐私协议 -->"
]
],
"pages_promotion\\fenxiao\\promote_code.vue": [
[
38,
"<!-- 隐私弹窗 -->"
]
],
"pages_promotion\\fenxiao\\relation.vue": [
[
52,
"<!-- <text>返{{ fenxiaoWords.account }}金额:</text>"
]
],
"pages_promotion\\fenxiao\\withdrawal_detail.vue": [
[
7,
"<!-- 状态0待审核1.待转账2已转账 -1拒绝' -->"
]
],
"pages_promotion\\point\\order_list.vue": [
[
91,
"<!-- 选择支付方式弹窗 -->"
]
],
"pages_tool\\article\\detail.vue": [
[
20,
"<!-- 隐私弹窗 -->"
]
],
"pages_tool\\cases\\index.vue": [
[
86,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\files\\list.vue": [
[
40,
"<!-- 底部tabBar -->"
]
],
"pages_tool\\help\\detail.vue": [
[
10,
"<!-- 隐私弹窗 -->"
]
],
"pages_tool\\member\\address_edit.vue": [
[
36,
"<!-- 外卖地址区分 -->"
]
],
"pages_tool\\member\\card.vue": [
[
99,
"<!-- 弹出规则 -->"
]
],
"pages_tool\\member\\collection.vue": [
[
31,
"<!-- 第一个列表为空时 -->"
]
],
"pages_tool\\member\\contact.vue": [
[
4,
"<!--<ns-contact><button type=\"primary\">联系客服</button></ns-contact>-->"
]
],
"pages_tool\\member\\level.vue": [
[
136,
"<!-- 优惠券 -->"
]
],
"pages_tool\\member\\withdrawal_detail.vue": [
[
7,
"<!-- 状态0待审核1.待转账2已转账 -1拒绝' -->"
]
],
"pages_tool\\order\\refund_batch.vue": [
[
63,
"<!-- <button type=\"primary\">提交</button> -->"
]
],
"pages_tool\\pay\\index.vue": [
[
54,
"title: '未获取到支付信息!'"
]
],
"pages_tool\\vr\\index.vue": [
[
4,
"<!-- 顶部导航覆盖层:使用 cover-view 兼容微信小程序的 web-view 原生组件 -->"
]
],
"pages_tool\\webview\\webview.vue": [
[
12,
"<!-- 隐私弹窗 -->"
]
],
"pages_tool\\_components\\img-cropping\\img-cropping.vue": [
[
22,
"<!-- <view @click=\"fPreview\" hover-class=\"hover\" :style=\"{width: bW}\"><text>预览</text></view> -->"
]
],
"scripts\\verify-pages-json-cross-platform.js": [
[
51,
"console.warn(`[warn] platform=${platform}: 残留未关闭 #ifdef/#ifndef ${stack.length} 个`);"
]
],
"uni_modules\\uni-calendar\\components\\uni-calendar\\uni-calendar-item.vue": [
[
50,
"{{ weeks.isDay ? '今天' : weeks.lunar.IDayCn === '初一' ? weeks.lunar.IMonthCn : weeks.lunar.IDayCn }}"
]
],
"uni_modules\\uni-datetime-picker\\components\\uni-datetime-picker\\uni-datetime-picker.vue": [
[
46,
"<!-- <text class=\"\">此刻</text> -->"
]
]
}