1. 替换所有页面/组件中的硬编码中文提示文案为$lang调用,包括支付、帮助中心、公告等页面 2. 重构diy.js加载失败文案处理逻辑,支持参数化替换 3. 新增多语言混入逻辑,实现导航标题随语种动态切换 4. 重构支付组件初始化逻辑,优化平台适配代码 5. 添加多语言单元测试和硬编码扫描脚本 6. 更新语言包,新增缺失的翻译词条
7804 lines
171 KiB
JSON
7804 lines
171 KiB
JSON
{
|
||
"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: 解码 & 等 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,
|
||
"<!-- 鸿蒙兼容: 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> -->"
|
||
]
|
||
]
|
||
} |