{ "pages_tool\\ai-chat\\ai-chat-message.vue": [ [ 3, "" ], [ 14, "" ], [ 24, "" ], [ 29, "" ], [ 37, "" ], [ 62, "" ], [ 65, "" ], [ 75, "" ], [ 86, "" ], [ 91, "" ], [ 102, "" ], [ 118, "" ], [ 145, "" ], [ 166, "" ], [ 181, "" ], [ 200, "" ], [ 220, "" ], [ 245, "" ], [ 250, "" ], [ 255, "" ], [ 266, "" ], [ 275, "" ], [ 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, "" ], [ 260, "" ], [ 264, "" ] ], "tests\\util.test.js": [ [ 61, "console.warn('[normalizeUrl] scheme 后有多余的 /:', urlString);" ], [ 110, "console.warn('[normalizeUrl] host 含非法字符:', urlString);" ], [ 396, "test('decodeEntity: 解码 & 等 HTML 实体', () => {" ], [ 400, "test('decodeEntity: 解码 中 这种十六进制', () => {" ], [ 401, "assert.equal(decodeEntity('中'), '中');" ], [ 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, "" ], [ 12, "" ], [ 14, "" ], [ 98, "" ], [ 101, "开通{{ membercard.level_name }}仅需{{ membercard.member_price }}元" ], [ 102, "立即开通" ], [ 107, "" ], [ 131, "- 套餐包含以下的服务及商品 -" ], [ 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, "{{ cardOff ? '收起' : '展开' }}" ], [ 159, "" ], [ 169, "" ], [ 172, "领券" ], [ 178, "? '满' + decimalPointFormat(item.at_least) + '减' + decimalPointFormat(item.money)" ], [ 179, ": '无门槛使用' + decimalPointFormat(item.money)" ], [ 182, "{{ '满' + decimalPointFormat(item.at_least) + '打' + parseFloat(item.discount)+'折' }}" ], [ 189, "选择" ], [ 196, "促销" ], [ 197, "满减" ], [ 203, "" ], [ 205, "" ], [ 217, "" ], [ 316, "" ], [ 367, "" ], [ 393, "" ], [ 403, "满减" ], [ 407, "满送" ], [ 411, "包邮" ], [ 416, "" ], [ 445, "" ], [ 447, "" ], [ 479, "" ], [ 531, "" ] ], "pages_goods\\_components\\goods-detail-view\\goods-detail-view.vue": [ [ 3, "" ], [ 7, "" ], [ 12, "" ], [ 17, "" ], [ 19, "" ], [ 37, "" ], [ 43, "" ], [ 52, "" ], [ 59, "" ], [ 62, "" ], [ 81, "" ], [ 83, "门店" ], [ 90, "距离{{ globalStoreInfo.distance > 1 ? globalStoreInfo.distance + 'km' : globalStoreInfo.distanc" ], [ 124, "" ], [ 126, "" ], [ 130, "" ], [ 132, "" ], [ 134, "" ], [ 153, "" ], [ 177, "" ], [ 210, "" ], [ 247, "" ], [ 250, "" ], [ 262, "" ], [ 266, "添加社群" ], [ 271, "长按识别二维码,添加社群" ], [ 278, "" ], [ 281, "" ], [ 338, "" ], [ 363, "" ], [ 376, "" ], [ 392, "" ], [ 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, "" ], [ 351, "税费" ], [ 361, "发票邮寄费" ], [ 393, "会员卡" ], [ 415, "" ], [ 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, "{{ info.level_num > 0 ? info.level_name : '等级未解锁' }}" ], [ 34, "下单、邀请好友均可提升等级" ], [ 36, "做任务" ], [ 55, "总{{ fenxiaoWords.account }}" ], [ 59, "已提现{{ fenxiaoWords.account }}" ], [ 85, "" ], [ 133, "邀请好友" ], [ 134, "邀好友赚好礼" ], [ 142, "账单报表" ], [ 143, "{{ fenxiaoWords.account }}变更明细" ], [ 151, "{{ fenxiaoWords.concept }}商品" ], [ 152, "{{ fenxiaoWords.concept }}商品" ], [ 161, "{{ fenxiaoWords.account }}排行" ], [ 162, "您的排名为第{{ profitRanking }}位" ], [ 171, "推广人排行" ], [ 172, "您的排名为{{ invitedNumRanking }}位" ], [ 180, "等级说明" ], [ 181, "{{ fenxiaoWords.concept }}等级说明" ], [ 193, "我的粉丝" ], [ 194, "{{ teamNum.num }}人" ], [ 205, "{{ teamNum.fenxiao_num }}人" ], [ 260, "" ] ], "pages_promotion\\merch\\detail.vue": [ [ 4, "" ], [ 41, "" ], [ 123, "" ], [ 132, "" ], [ 141, "" ], [ 153, "" ], [ 213, "" ], [ 222, "" ], [ 231, "" ], [ 243, "" ], [ 263, "" ], [ 267, "" ], [ 269, "是否包邮" ], [ 271, "" ], [ 275, "" ], [ 277, "价格区间(元)" ], [ 279, "" ], [ 281, "" ], [ 285, "" ], [ 287, "品牌" ], [ 295, "" ], [ 318, "" ] ], "components-diy\\diy-tab.vue": [ [ 2, "" ], [ 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, "微信视频号集成示例" ], [ 8, "单个视频号" ], [ 13, "视频号列表" ], [ 18, "使用说明" ], [ 20, "1. 确保微信小程序已开通视频号权限" ], [ 21, "2. 小程序需与视频号关联" ], [ 22, "3. 传递正确的feedId用于播放视频" ], [ 23, "4. 仅支持微信小程序环境" ], [ 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, "" ], [ 12, "" ], [ 14, "账号" ], [ 18, "" ], [ 23, "" ], [ 29, "" ], [ 35, "" ], [ 41, "" ], [ 47, "" ], [ 54, "" ], [ 56, "密码" ], [ 59, "" ], [ 66, "所在地址" ], [ 69, "去设置" ], [ 73, "" ], [ 79, "注销账号" ], [ 83, "版本号" ], [ 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, "超级会员" ], [ 113, "查看特权" ], [ 114, "会员可享更多权益" ], [ 121, "开通可享更多权益" ], [ 124, "查看特权" ], [ 125, "立即开通" ], [ 134, "开通可享更多权益" ], [ 137, "查看更多权益" ], [ 138, "立即开通" ], [ 146, "余额" ], [ 152, "积分" ], [ 159, "优惠券" ], [ 164, "余额充值" ], [ 192, "" ], [ 403, "if (this.nickName == '微信用户') {" ], [ 426, "if (this.nickName == '微信用户') {" ] ], "pages_tool\\recharge\\list.vue": [ [ 5, "" ], [ 100, "" ] ], "components\\hover-nav\\hover-nav.vue": [ [ 2, "" ], [ 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, "是否包邮" ], [ 160, "" ], [ 164, "" ], [ 166, "价格区间(元)" ], [ 168, "" ], [ 170, "" ], [ 174, "" ], [ 176, "品牌" ], [ 184, "" ], [ 207, "" ], [ 210, "" ] ], "pages_promotion\\merch\\list.vue": [ [ 4, "" ], [ 15, "" ], [ 89, "" ], [ 98, "" ], [ 107, "" ], [ 119, "" ], [ 179, "" ], [ 188, "" ], [ 197, "" ], [ 209, "" ], [ 229, "" ], [ 233, "" ], [ 256, "" ], [ 259, "" ] ], "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, "" ], [ 27, "" ], [ 35, "" ], [ 39, "" ], [ 51, "" ], [ 71, "" ], [ 78, "" ], [ 290, "itemList: ['保存图片']," ], [ 297, "title: '保存成功'" ], [ 369, "title: '链接已复制'" ] ], "components\\yuyue-date\\yuyue-date.vue": [ [ 6, "选择时间" ], [ 11, "" ], [ 29, "" ], [ 42, "" ], [ 57, "预约时间:" ], [ 60, "" ], [ 63, "" ], [ 103, "default: '已约满'" ], [ 108, "default: '可预约'" ], [ 192, "return this.disableText && this.disableText !== '已约满'" ], [ 197, "return this.undisableText && this.undisableText !== '可预约'" ], [ 216, "return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];" ] ], "components-diy\\diy-form.vue": [ [ 4, "" ], [ 12, "" ], [ 14, "" ], [ 22, "" ], [ 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, "活动规则" ], [ 55, "储值赚积分" ], [ 59, "兑换记录" ], [ 63, "积分抽奖" ], [ 67, "积分明细" ], [ 228, "" ], [ 255, "" ], [ 258, "" ], [ 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, "联系客服" ], [ 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, "取消" ], [ 7, "确定" ], [ 15, "{{ (nowDate.year || '') + '年' + (nowDate.month || '') + '月' }}" ], [ 27, "日" ], [ 28, "一" ], [ 29, "二" ], [ 30, "三" ], [ 31, "四" ], [ 32, "五" ], [ 33, "六" ] ], "components-diy\\diy-category.vue": [ [ 12, "商品分类" ], [ 15, "" ], [ 80, "" ], [ 109, "" ], [ 163, "总计:" ], [ 169, "" ] ], "pages\\index\\index.vue": [ [ 5, "" ], [ 8, "{{ diyLoadErrorMsg || '网络异常,请稍后重试' }}" ], [ 61, "跳过" ], [ 93, "" ], [ 98, "" ], [ 109, "" ], [ 118, "" ], [ 154, "" ], [ 158, "" ] ], "pages_promotion\\point\\detail.vue": [ [ 78, "" ], [ 90, "" ], [ 109, "" ], [ 112, "" ], [ 135, "" ], [ 155, "" ], [ 180, "" ], [ 196, "" ], [ 219, "" ] ], "pages_tool\\contact\\contact.vue": [ [ 7, "" ], [ 39, "" ], [ 74, "" ], [ 91, "" ], [ 107, "" ], [ 120, "" ], [ 134, "" ], [ 165, "" ], [ 184, "" ] ], "components-diy\\diy-article.vue": [ [ 4, "" ], [ 6, "" ], [ 21, "" ], [ 55, "" ], [ 90, "" ] ], "components-diy\\diy-category-item.vue": [ [ 80, "" ], [ 114, "" ], [ 118, "" ], [ 168, "立即购买" ], [ 172, "选规格" ], [ 194, "立即购买" ], [ 203, "" ], [ 11, "" ], [ 21, "" ], [ 24, "" ], [ 32, "" ], [ 42, "" ], [ 208, "title: '视频号仅支持在微信小程序环境中播放'," ], [ 218, "console.error('打开视频号失败', err);" ] ], "pages_promotion\\point\\goods_list.vue": [ [ 4, "" ], [ 14, "" ], [ 78, "" ], [ 92, "" ], [ 96, "" ], [ 107, "" ], [ 128, "" ], [ 131, "" ] ], "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(` (如果需要动态控制)`);" ] ], "components\\mescroll\\mescroll-body.vue": [ [ 11, "" ], [ 20, "" ], [ 23, "" ], [ 26, "" ], [ 29, "" ], [ 34, "" ], [ 39, "" ] ], "components\\mescroll\\mescroll-uni.vue": [ [ 20, "" ], [ 29, "" ], [ 32, "" ], [ 35, "" ], [ 38, "" ], [ 44, "" ], [ 50, "" ] ], "components-diy\\diy-channel-video.vue": [ [ 3, "" ], [ 8, "" ], [ 16, "" ], [ 19, "" ], [ 24, "" ], [ 36, "" ], [ 39, "" ] ], "pages_order\\detail_point.vue": [ [ 3, "" ], [ 21, "" ], [ 58, "" ], [ 85, "" ], [ 90, "联系客服" ], [ 96, "" ], [ 133, "" ] ], "pages_tool\\member\\point.vue": [ [ 53, "做任务赚积分" ], [ 57, "每日签到" ], [ 58, "连续签到可获得更多积分" ], [ 60, "去签到" ], [ 65, "购买商品" ], [ 66, "购买商品可获得积分" ], [ 68, "去下单" ] ], "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, "" ], [ 66, "name: '支付宝支付'," ], [ 72, "name: '微信支付'," ], [ 82, "name: '微信支付'," ], [ 91, "name: '支付宝支付'," ] ], "components-diy\\diy-bottom-nav.vue": [ [ 2, "" ], [ 7, "" ], [ 46, "" ] ], "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提示:如需排除某些图片,请在 标签添加 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, "" ], [ 62, "" ], [ 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, "" ], [ 3, "" ], [ 17, "" ], [ 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, "全部" ], [ 11, "满减券" ], [ 12, "折扣券" ], [ 13, "无门槛券" ], [ 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, "" ], [ 354, "" ], [ 357, "" ], [ 362, "" ] ], "pages_order\\list.vue": [ [ 74, "" ], [ 152, "合并付款" ], [ 155, "" ], [ 166, "" ] ], "pages_promotion\\fenxiao\\goods_list.vue": [ [ 63, "" ], [ 106, "" ], [ 127, "" ], [ 130, "" ] ], "pages_promotion\\fenxiao\\withdraw_list.vue": [ [ 45, "text: '已转账'" ], [ 49, "text: '待审核'" ], [ 53, "text: '已审核'" ], [ 57, "text: '已拒绝'" ] ], "pages_tool\\file-preview\\file-preview.vue": [ [ 12, "" ], [ 18, "" ], [ 24, "" ], [ 30, "" ] ], "pages_tool\\goods\\coupon.vue": [ [ 11, "" ], [ 51, "{{ item.use_store==='all'?'适用门店:全部门店': '适用门店:'+item.use_store_name}}" ], [ 75, "" ], [ 78, "" ] ], "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, "" ], [ 56, "" ], [ 71, "" ] ], "pages_tool\\notice\\list.vue": [ [ 23, "" ], [ 26, "" ], [ 80, "title: '公告'," ], [ 88, "var title = '公告';" ] ], "pages_tool\\order\\refund_detail.vue": [ [ 10, "" ], [ 40, "" ], [ 49, "" ], [ 136, "联系客服" ] ], "pages_tool\\recharge\\order_list.vue": [ [ 24, "goods-name color-tip \" v-if=\"orderItem.point > 0 || orderItem.growth > 0\">赠送:" ], [ 25, " 0\">{{ orderItem.point }}积分" ], [ 27, " 0\">{{ orderItem.growth }}成长值" ], [ 29, "优惠券x{{ orderItem.coupon_id.split(',').length }}" ] ], "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, " 0\" :style=\"{ color: splitorColor }\" class=\"uni-countdown__splitor day\" :class=\"splitorColorClass\">{{ showColon ? '天' : '天' }}" ], [ 19, "{{ showColon ? ':' : '时' }}" ], [ 27, "{{ showColon ? ':' : '分' }}" ], [ 35, "秒" ] ], "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, "" ], [ 9, "" ] ], "components\\ns-goods-sku\\ns-goods-sku.vue": [ [ 134, "" ], [ 184, "" ], [ 189, "" ] ], "components\\ns-navbar\\ns-navbar.vue": [ [ 31, "请输入商品名称" ], [ 39, "定位中..." ], [ 41, "附近门店" ] ], "components-diy\\diy-groupbuy.vue": [ [ 52, "已团{{ item.sell_num }}件" ], [ 92, ":style=\"{ color: value.theme == 'diy' ? value.saleStyle.color : '' }\">已团{{" ], [ 93, "item.sell_num }}件" ] ], "components-diy\\diy-index-page.vue": [ [ 52, "" ], [ 105, "" ], [ 161, "" ] ], "components-diy\\diy-rubik-cube.vue": [ [ 3, "" ], [ 8, "" ], [ 31, "" ] ], "components-diy\\diy-video-list.vue": [ [ 3, "" ], [ 25, "" ], [ 54, "" ] ], "components-diy\\diy-video.vue": [ [ 3, "" ], [ 19, "" ], [ 35, "" ] ], "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, "" ], [ 16, "" ], [ 19, "" ] ], "pages_promotion\\fenxiao\\withdraw_apply.vue": [ [ 53, "提现" ], [ 64, "提现记录" ], [ 215, "let branchBankName = this.isBalance ? \"余额\" : this.bankAccountInfo.branch_bank_name;" ] ], "pages_promotion\\merch\\merchcategory.vue": [ [ 7, "" ], [ 50, "暂时没有分类哦!" ], [ 59, "" ] ], "pages_tool\\agreement\\contenr.vue": [ [ 3, "" ], [ 8, "" ], [ 16, "" ] ], "pages_tool\\ai-chat\\index.vue": [ [ 3, "" ], [ 15, "" ], [ 37, "" ] ], "pages_tool\\goods\\brand.vue": [ [ 19, "" ], [ 22, "" ], [ 79, "var title = '你想要的大牌都在这里';" ] ], "pages_tool\\goods\\coupon_receive.vue": [ [ 16, "" ], [ 18, "" ], [ 33, "" ] ], "pages_tool\\goods\\search.vue": [ [ 11, "" ], [ 29, "" ], [ 44, "" ] ], "pages_tool\\help\\list.vue": [ [ 13, "" ], [ 82, "title: '帮助中心'," ], [ 90, "var title = '帮助中心使你更加方便';" ] ], "pages_tool\\index\\diy.vue": [ [ 36, "" ], [ 41, "" ], [ 51, "" ] ], "pages_tool\\login\\find.vue": [ [ 23, "" ], [ 51, "" ], [ 56, "" ] ], "pages_tool\\member\\balance.vue": [ [ 24, "现金余额(元)" ], [ 28, "储值余额(元)" ], [ 56, "充值记录" ] ], "pages_tool\\member\\card_log.vue": [ [ 3, "" ], [ 21, "" ], [ 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||'') +' 月'}}" ], [ 23, "" ], [ 89, "确认" ] ], "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, "" ], [ 140, "item.unit = item.unit || '件';" ] ], "components\\ns-payment\\ns-payment.vue": [ [ 3, "" ], [ 46, "" ] ], "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, "一键导航" ], [ 12, "" ] ], "components-diy\\diy-notes.vue": [ [ 20, "#{{ item.note_type == 'goods_item' ? '单品介绍' :" ], [ 21, "'掌柜说' }}#" ] ], "components-diy\\diy-notice.vue": [ [ 11, "" ], [ 28, "" ] ], "components-diy\\diy-text.vue": [ [ 230, "" ], [ 264, "" ] ], "pages_promotion\\fenxiao\\order.vue": [ [ 65, "" ] ], "pages_tool\\ai-chat\\components\\ai-chat-search.vue": [ [ 3, "" ], [ 9, "" ] ], "pages_tool\\article\\list.vue": [ [ 29, "" ], [ 32, "" ] ], "pages_tool\\form\\formdata.vue": [ [ 6, "" ] ], "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, "\"公安备案\"" ] ], "components\\ns-form\\ns-form.vue": [ [ 30, "" ] ], "components\\ns-goods-action-icon\\ns-goods-action-icon.vue": [ [ 3, "" ] ], "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, "" ] ], "components-diy\\js\\wechat-channel.js": [ [ 172, "console.error('微信视频号错误:', err);" ] ], "components-diy\\placeholder\\index.vue": [ [ 2, "" ] ], "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, "" ] ], "pages_promotion\\point\\order_list.vue": [ [ 91, "" ] ], "pages_tool\\article\\detail.vue": [ [ 20, "" ] ], "pages_tool\\cases\\index.vue": [ [ 86, "" ] ], "pages_tool\\files\\list.vue": [ [ 40, "" ] ], "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, "" ] ], "pages_tool\\member\\level.vue": [ [ 136, "" ] ], "pages_tool\\member\\withdrawal_detail.vue": [ [ 7, "" ] ], "pages_tool\\order\\refund_batch.vue": [ [ 63, "" ] ], "pages_tool\\pay\\index.vue": [ [ 54, "title: '未获取到支付信息!'" ] ], "pages_tool\\vr\\index.vue": [ [ 4, "" ] ], "pages_tool\\webview\\webview.vue": [ [ 12, "" ] ], "pages_tool\\_components\\img-cropping\\img-cropping.vue": [ [ 22, "" ] ], "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, "" ] ] }