UNPKG

ctc-track-plugin

Version:

uniapp 小程序埋点劫持

1 lines 35.7 kB
{"version":3,"sources":["../src/bury.ts","../src/common/router.ts","../src/common/device.ts"],"sourcesContent":["/**\r\n * 埋点工具模块,提供页面埋点、批量处理埋点数据以及自动埋点功能。\r\n * 包含以下功能:\r\n * - 获取页面标题的工具函数。\r\n * - 批量处理埋点数据的类,支持定时或按批次大小自动发送埋点数据。\r\n * - Vue插件,用于拦截页面跳转并发送埋点数据。\r\n * - 发送埋点数据的工具函数。\r\n */\r\n\r\nimport type { App, Plugin } from 'vue';\r\nimport { shallowRef, watchEffect } from 'vue';\r\nimport { getCurrentPageInfo } from '@/common/device';\r\nimport type { PageMetaDatum, SubPageMetaDatum, PagesConfig } from '@uni-helper/vite-plugin-uni-pages';\r\nimport { md5 } from 'js-md5';\r\n\r\n// 常量定义\r\nconst CONSTANTS = {\r\n // 默认配置\r\n DEFAULT_BATCH_SIZE: 10, // 批量发送数据条数: 100条\r\n DEFAULT_INTERVAL_TIME: 10000, // 隔多少秒发送数据:10秒\r\n DEFAULT_RETRY_COUNT: 3, // 重试次数:3次\r\n DEFAULT_ACTIVE_SWITCH: 1, // 活动开关:1开0关\r\n DEFAULT_AUTO_SWITCH: 1, // 自动开关:1开0关\r\n\r\n // 客户端类型\r\n CLIENT_TYPE: '2', // 客户端类型:2代表小程序\r\n\r\n // 随机数范围\r\n RANDOM_MIN: 1000, // 随机数最小值:1000\r\n RANDOM_MAX: 9000, // 随机数最大值:9000\r\n\r\n // HTTP状态码\r\n HTTP_NOT_FOUND: 404, // 404错误\r\n HTTP_BAD_GATEWAY: 502, // 502错误\r\n\r\n // 自定义接口返回成功\r\n REQUEST_SUCCESSFUL: 0, // 后台自定义成功返回状态值\r\n\r\n // API路径\r\n CONFIG_API_PATH: '/event-api/event/config/configManage', // 配置管理接口路径\r\n REPORT_API_PATH: '/event-api/event/dataReport', // 配置发送埋点数据接口路径 \r\n\r\n // 页面配置忽略的键\r\n IGNORED_PAGE_KEYS: ['easycom', 'globalStyle', 'tabBar', 'pages'],\r\n} as const;\r\n\r\nlet buryUrl: string;\r\n\r\n// 类型定义\r\ninterface TrackCountObj {\r\n trackCount: number;\r\n}\r\n\r\ninterface ConfigManageParams {\r\n batchSize: number;\r\n intervalTime: number;\r\n retryCount: number;\r\n activeSwitch: 0 | 1;\r\n autoSwitch: 0 | 1;\r\n}\r\n\r\ninterface ConfigManageResponse {\r\n data: {\r\n statis: number;\r\n data: ConfigManageParams;\r\n msg: string;\r\n };\r\n}\r\n\r\ninterface BuryContent {\r\n content?: any;\r\n tag?: string;\r\n text?: string;\r\n}\r\n\r\nconst trackCountObj: TrackCountObj = {\r\n trackCount: 1,\r\n};\r\n\r\n/**\r\n * timestamp 格式化为 2021-10-09 10:20:50 形式。\r\n * @returns 返回格式化的时间戳 \r\n */\r\nconst formatTime = () => {\r\n const now = new Date();\r\n\r\n // 获取时间\r\n const year = now.getFullYear();\r\n const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始需+1\r\n const day = String(now.getDate()).padStart(2, '0');\r\n const hours = String(now.getHours()).padStart(2, '0');\r\n const minutes = String(now.getMinutes()).padStart(2, '0');\r\n const seconds = String(now.getSeconds()).padStart(2, '0');\r\n\r\n // 组合成目标格式\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取当前用户唯一traceId\r\n * @returns 唯一的追踪ID\r\n */\r\nconst getTraceId = (): string => {\r\n const deviceId = uni.getSystemInfoSync().deviceId;\r\n const timestamp = new Date().getTime();\r\n const randomNum = Math.floor(Math.random() * CONSTANTS.RANDOM_MAX) + CONSTANTS.RANDOM_MIN;\r\n return `${deviceId}${timestamp}${randomNum}`;\r\n};\r\n\r\n/**\r\n * 获取报告ID\r\n * @param type 事件类型\r\n * @param millis 毫秒值\r\n * @returns MD5加密的报告ID\r\n */\r\nconst getReportId = (type: string, millis: number): string => {\r\n const traceId = getTraceId();\r\n return md5(`${type}${traceId}${millis}`);\r\n};\r\n\r\n/**\r\n * 获取会话ID\r\n * @returns 会话ID\r\n */\r\nconst getSessionId = (): string => `${getTraceId()}${trackCountObj.trackCount}`;\r\n\r\n/**\r\n * 获取页面标题的工具函数。\r\n * @param pagePath - 页面路径。\r\n * @returns 返回匹配的页面配置信息。\r\n */\r\nconst matchPathReg = /[^/]+$/;\r\nconst matchLastPathName = (path: string) => path.match(matchPathReg)?.[0];\r\nconst getPageTitle = (pagePath: string, pagesJson: PagesConfig) => {\r\n const mainPage = (pagesJson.pages as unknown as PageMetaDatum[]).find((item) => item.path === pagePath\r\n ||\r\n // 针对 navigator或者navigateTo等跳转的时候路径是用的相对路径的情况\r\n matchLastPathName(item.path) === matchLastPathName(pagePath));\r\n if (mainPage) return mainPage;\r\n\r\n for (const key in pagesJson) {\r\n if (CONSTANTS.IGNORED_PAGE_KEYS.includes(key as any)) continue;\r\n const subPages = pagesJson[key as keyof typeof pagesJson] as SubPageMetaDatum[];\r\n for (const item of subPages) {\r\n const foundPage = item.pages.find((pageItem: PageMetaDatum) => `${item.root}/${pageItem.path}` === pagePath || matchLastPathName(pageItem.path) === matchLastPathName(pagePath));\r\n if (foundPage) return foundPage;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * batchSize - 批处理大小\r\n * intervalTime - 批处理间隔时间\r\n * retryCount - 重试次数\r\n * 主动上报开关 1开启 0 关闭\r\n * 自动上报开关 1开启 0 关闭\r\n */\r\n// 埋点配置响应式变量\r\nconst batchSize = shallowRef<number>(CONSTANTS.DEFAULT_BATCH_SIZE);\r\nconst intervalTime = shallowRef<number>(CONSTANTS.DEFAULT_INTERVAL_TIME);\r\nconst retryCount = shallowRef<number>(CONSTANTS.DEFAULT_RETRY_COUNT);\r\nconst activeSwitch = shallowRef<number>(CONSTANTS.DEFAULT_ACTIVE_SWITCH);\r\nconst autoSwitch = shallowRef<number>(CONSTANTS.DEFAULT_AUTO_SWITCH);\r\n\r\n/**\r\n * 获取用户认证信息\r\n * @returns 用户认证信息对象\r\n */\r\nconst getUserAuth = () => {\r\n const user = uni.getStorageSync('user');\r\n if (!user) {\r\n console.log('未获取到user值');\r\n return { jwt: null, usertype: 'customer' };\r\n }\r\n\r\n const userInfo = JSON.parse(user)?.userInfo ?? { jwt: null, usertype: 'customer' };\r\n return { jwt: userInfo.jwt, usertype: userInfo.usertype };\r\n};\r\n\r\n/**\r\n * 创建请求签名\r\n * @param jwt JWT令牌\r\n * @param timestamp 时间戳\r\n * @param usertype 用户类型\r\n * @returns MD5签名\r\n */\r\nconst createRequestSign = (jwt: string | null, timestamp: number, usertype: string): string => {\r\n const encryption = jwt ? `${jwt}${timestamp}${usertype}` : `${timestamp}${usertype}`;\r\n return md5(encryption);\r\n};\r\n\r\n/**\r\n * 处理配置响应\r\n * @param res 响应对象\r\n */\r\nconst handleConfigResponse = (res: any) => {\r\n console.log(res, 'config response');\r\n\r\n if (res.statusCode === CONSTANTS.HTTP_NOT_FOUND || res.statusCode === CONSTANTS.HTTP_BAD_GATEWAY) {\r\n logger.error('获取埋点配置参数失败');\r\n return;\r\n }\r\n\r\n if (res.data.status !== CONSTANTS.REQUEST_SUCCESSFUL) {\r\n logger.error('获取埋点配置参数失败', res.data.msg)\r\n return;\r\n }\r\n\r\n const data = (res as ConfigManageResponse).data?.data;\r\n if (data) {\r\n batchSize.value = data.batchSize ?? CONSTANTS.DEFAULT_BATCH_SIZE;\r\n intervalTime.value = data.intervalTime ?? CONSTANTS.DEFAULT_INTERVAL_TIME;\r\n retryCount.value = data.retryCount ?? CONSTANTS.DEFAULT_RETRY_COUNT;\r\n activeSwitch.value = data.activeSwitch ?? CONSTANTS.DEFAULT_ACTIVE_SWITCH;\r\n autoSwitch.value = data.autoSwitch ?? CONSTANTS.DEFAULT_AUTO_SWITCH;\r\n }\r\n};\r\n\r\n/**\r\n * 初始化埋点配置参数\r\n * @param options 配置选项\r\n */\r\nexport const handleInitConfigParams = (options: Record<string, any> = {}) => {\r\n if (!buryUrl) {\r\n logger.error('埋点URL未配置,无法获取配置参数');\r\n return;\r\n }\r\n\r\n const timestamp = Math.floor(new Date().getTime() / 1000);\r\n const { jwt, usertype } = getUserAuth();\r\n // 采用用户传入的usertype类型,没有的话用localStorage里面的usertype\r\n const finalUsertype = options?.usertype ?? usertype;\r\n\r\n const sign = createRequestSign(jwt, timestamp, finalUsertype);\r\n const headers: Record<string, any> = {\r\n sign,\r\n timestamp,\r\n usertype: finalUsertype,\r\n };\r\n\r\n if (jwt) {\r\n headers.Authorization = jwt;\r\n }\r\n\r\n uni.request({\r\n url: `${buryUrl}${CONSTANTS.CONFIG_API_PATH}`,\r\n method: 'POST',\r\n data: {\r\n clientType: CONSTANTS.CLIENT_TYPE,\r\n device: uni.getSystemInfoSync().deviceId,\r\n },\r\n header: headers,\r\n success: handleConfigResponse,\r\n fail: () => console.log('获取埋点配置参数失败'),\r\n });\r\n};\r\n\r\n/**\r\n * 统一的日志工具\r\n */\r\nconst logger = {\r\n success: (message: string, data?: any) => {\r\n console.log(`[埋点成功] ${message}`, data || '');\r\n },\r\n error: (message: string, error?: any) => {\r\n console.error(`[埋点错误] ${message}`, error || '');\r\n },\r\n info: (message: string, data?: any) => {\r\n console.log(`[埋点信息] ${message}`, data || '');\r\n },\r\n};\r\n\r\n/**\r\n * 判断响应是否成功\r\n * @param statusCode HTTP状态码\r\n * @returns 是否成功\r\n */\r\nconst isResponseSuccess = (statusCode: number): boolean => {\r\n return statusCode !== CONSTANTS.HTTP_NOT_FOUND && statusCode !== CONSTANTS.HTTP_BAD_GATEWAY;\r\n};\r\n\r\n/**\r\n * 获取上报URL\r\n * @returns 埋点上报的完整URL\r\n */\r\nconst getReportUrl = (): string => {\r\n if (!buryUrl) {\r\n logger.error('埋点URL未配置,无法生成上报URL');\r\n return '';\r\n }\r\n return `${buryUrl}${CONSTANTS.REPORT_API_PATH}`;\r\n};\r\n\r\n/**\r\n * 发送埋点数据的工具函数。\r\n * @param data - 埋点数据。\r\n */\r\nconst send = (data: any, options: any): void => {\r\n const reportUrl = getReportUrl();\r\n if (!reportUrl) {\r\n logger.error('无法获取上报URL,取消埋点数据发送');\r\n return;\r\n }\r\n const timestamp = Math.floor(new Date().getTime() / 1000);\r\n const { jwt, usertype } = getUserAuth();\r\n // 采用用户传入的usertype类型,没有的话用localStorage里面的usertype\r\n const finalUsertype = options?.usertype ?? usertype;\r\n\r\n const sign = createRequestSign(jwt, timestamp, finalUsertype);\r\n const headers: Record<string, any> = {\r\n sign,\r\n timestamp,\r\n usertype: finalUsertype,\r\n };\r\n\r\n if (jwt) {\r\n headers.Authorization = jwt;\r\n }\r\n uni.request({\r\n header: headers,\r\n method: 'POST',\r\n url: getReportUrl(),\r\n data,\r\n success: (res) => {\r\n if (isResponseSuccess(res.statusCode)) {\r\n logger.success('埋点事件提交成功', res);\r\n } else {\r\n logger.error('埋点事件提交失败', `状态码: ${res.statusCode}`);\r\n }\r\n },\r\n fail: (error) => {\r\n logger.error('埋点事件提交失败', error);\r\n },\r\n });\r\n};\r\n\r\n/**\r\n * 获取网络类型\r\n * @returns Promise解析为当前网络类型\r\n */\r\nconst getNetworkType = (): Promise<string> => {\r\n return new Promise((resolve, reject) => {\r\n uni.getNetworkType({\r\n success({ networkType }) {\r\n resolve(networkType);\r\n },\r\n fail: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * 获取用户信息\r\n * @returns 用户ID和类型\r\n */\r\nconst getUserInfo = () => {\r\n const user = uni.getStorageSync('user');\r\n if (!user) {\r\n logger.info('未获取到user值');\r\n return { userid: null, userType: null };\r\n }\r\n\r\n const { userid, userType } = JSON.parse(user)?.userInfo ?? {\r\n userid: null,\r\n userType: null,\r\n };\r\n return { userid, userType };\r\n};\r\n\r\n/**\r\n * 获取设备信息\r\n * @returns 设备相关信息\r\n */\r\nconst getDeviceInfo = () => {\r\n const {\r\n deviceId,\r\n uniPlatform,\r\n osName,\r\n osVersion,\r\n deviceModel,\r\n deviceBrand,\r\n ua,\r\n } = uni.getSystemInfoSync();\r\n\r\n return {\r\n device_id: deviceId,\r\n platform: uniPlatform,\r\n os: osName,\r\n osVersion,\r\n model: deviceModel,\r\n brand: deviceBrand,\r\n ua,\r\n terminal_type: uniPlatform === 'mp-weixin' ? '微信小程序' : 'h5页面',\r\n };\r\n};\r\n\r\n/**\r\n * 生成公共消息参数\r\n * @param options 可选配置项\r\n * @returns 公共消息参数对象\r\n */\r\nconst createCommonMessage = async (options: Record<string, any> = {}) => {\r\n const pageInfo = getCurrentPageInfo();\r\n const networkType = await getNetworkType();\r\n const { userid, userType } = getUserInfo();\r\n const deviceInfo = getDeviceInfo();\r\n\r\n return {\r\n event_timestamp: formatTime(),\r\n page_url: pageInfo?.route,\r\n extra_params: JSON.stringify({} as Record<string, any>),\r\n user_id: userid,\r\n user_type: userType,\r\n network_type: networkType,\r\n session_id: getSessionId(),\r\n ...deviceInfo,\r\n ...options,\r\n };\r\n};\r\n\r\n/**\r\n * 处理埋点内容\r\n * @param content 埋点内容\r\n * @returns 处理后的埋点对象\r\n */\r\nconst processBuryContent = (content: any) => {\r\n if (typeof content === 'object' && content !== null) {\r\n const { event_id, ...extraParams } = content;\r\n return {\r\n event_id,\r\n extra_params: JSON.stringify(extraParams),\r\n };\r\n }\r\n return { event_id: content };\r\n};\r\n\r\n/**\r\n * 创建自动埋点消息\r\n * @param buryContent 埋点内容\r\n * @returns 自动埋点消息对象\r\n */\r\nconst createAutomaticMessage = (buryContent: BuryContent) => {\r\n if (buryContent.content) {\r\n return { is_element: false };\r\n }\r\n\r\n const pageInfo = getCurrentPageInfo();\r\n return {\r\n is_element: true,\r\n element_id: null,\r\n element_type: buryContent.tag,\r\n element_name: `${pageInfo?.route}_${buryContent.text}`,\r\n };\r\n};\r\n\r\n/**\r\n * 批量处理埋点数据的类。\r\n * 支持定时或按批次大小自动发送埋点数据。\r\n */\r\nclass BatchProcessor {\r\n private batch: any[] = [];\r\n private timer: NodeJS.Timeout | null = null;\r\n private readonly batchSize: number;\r\n private readonly interval: number;\r\n private readonly retryCount: number;\r\n\r\n constructor(batchSize: number, intervalTime: number, retryCount: number) {\r\n logger.info('初始化BatchProcessor', { batchSize, intervalTime, retryCount });\r\n this.batchSize = batchSize;\r\n this.interval = intervalTime;\r\n this.retryCount = retryCount;\r\n }\r\n\r\n /**\r\n * 发送当前批次中的埋点数据\r\n */\r\n private async sendBatch(options: Record<string, any> = {}): Promise<void> {\r\n if (this.batch.length === 0) return;\r\n\r\n let retries = this.retryCount;\r\n let success = false;\r\n\r\n while (retries > 0 && !success) {\r\n try {\r\n logger.info(`发送批次数据`, `${this.batch.length}条记录`);\r\n\r\n send({ eventList: this.batch }, options);\r\n success = true;\r\n this.batch = [];\r\n } catch (error) {\r\n retries--;\r\n if (retries === 0) {\r\n logger.error('批次重试后仍失败', error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 添加埋点数据到批次中\r\n * @param buryContent 埋点内容\r\n * @param options 可选配置项\r\n */\r\n public async addToBatch(\r\n buryContent: BuryContent,\r\n options: Record<string, any> = {},\r\n ): Promise<void> {\r\n /**\r\n * 创建公共消息参数\r\n */\r\n const commonMessage = await createCommonMessage(options);\r\n /**\r\n * 创建自动埋点消息\r\n */\r\n const automaticMessage = createAutomaticMessage(buryContent);\r\n /**\r\n * 创建主动埋点消息\r\n */\r\n const processedContent = buryContent.content ? processBuryContent(buryContent.content) : {};\r\n\r\n this.batch.push({\r\n ...commonMessage,\r\n ...automaticMessage,\r\n ...processedContent,\r\n });\r\n\r\n if (this.batch.length >= this.batchSize) {\r\n logger.info('批次大小达到阈值,立即发送', `${this.batch.length}/${this.batchSize}`);\r\n await this.sendBatch(options);\r\n } else if (!this.timer) {\r\n logger.info('启动定时器', `${this.interval}秒后发送`);\r\n this.timer = setTimeout(async () => {\r\n await this.sendBatch(options);\r\n this.timer = null;\r\n }, this.interval * 1000);\r\n }\r\n }\r\n}\r\n\r\nlet batchProcessor: BatchProcessor;\r\n\r\n// 监听配置变化,重新创建BatchProcessor\r\nwatchEffect(() => {\r\n if (batchSize.value || intervalTime.value || retryCount.value) {\r\n batchProcessor = new BatchProcessor(\r\n batchSize.value,\r\n intervalTime.value,\r\n retryCount.value\r\n );\r\n }\r\n});\r\n\r\n/**\r\n * 检查上报开关状态\r\n * @param buryContent 埋点内容\r\n * @returns 是否允许上报\r\n */\r\nconst checkReportSwitch = (buryContent: BuryContent): boolean => {\r\n // 关闭主动上报开关,阻止主动埋点上报\r\n if (buryContent.content && activeSwitch.value === 0) {\r\n logger.info('主动上报开关已关闭');\r\n return false;\r\n }\r\n\r\n // 关闭自动上报开关,阻止自动埋点上报\r\n if (!buryContent.content && autoSwitch.value === 0) {\r\n logger.info('自动上报开关已关闭');\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * 发送埋点数据\r\n * @param buryContent 埋点内容\r\n * @param eventType 事件类型\r\n * @param options 额外选项\r\n */\r\nconst sendTrackingData = async (\r\n buryContent: BuryContent,\r\n eventType: string,\r\n options: Record<string, any> = {}\r\n): Promise<void> => {\r\n if (!checkReportSwitch(buryContent)) return;\r\n\r\n trackCountObj.trackCount++;\r\n\r\n await batchProcessor?.addToBatch(buryContent, {\r\n ...options,\r\n event_type: eventType,\r\n id: getReportId(eventType, new Date().getTime()),\r\n });\r\n};\r\n\r\n/**\r\n * 创建页面跳转埋点数据\r\n * @param currentPageInfo 当前页面信息\r\n * @param prevPageInfo 上一页面信息\r\n * @param prevPage 上一页面路径\r\n * @param options 额外选项\r\n * @returns 页面跳转埋点数据\r\n */\r\nconst createPageViewData = (\r\n currentPageInfo: PageMetaDatum | null,\r\n prevPageInfo: PageMetaDatum | null,\r\n prevPage: string,\r\n options: Record<string, any> = {}\r\n) => ({\r\n content: {\r\n event_id: options?.event_id || currentPageInfo?.style?.navigationBarTitleText,\r\n },\r\n pageOptions: {\r\n page_id: currentPageInfo?.style?.navigationBarTitleText,\r\n refer_page_id: prevPageInfo?.style?.navigationBarTitleText,\r\n refer_page_url: prevPage,\r\n ...options,\r\n event_type: 'page_view',\r\n id: getReportId('page_view', new Date().getTime()),\r\n },\r\n});\r\n\r\n/**\r\n * Vue插件,用于自动埋点功能。\r\n * 拦截页面跳转并发送埋点数据。\r\n */\r\nconst TrackAutomaticPlugin: Plugin = {\r\n install(app: App, options: Record<string, any>, pagesJson?: PagesConfig) {\r\n if (!options.baseUrl) {\r\n logger.error('请传入baseUrl参数');\r\n }\r\n\r\n // 设置基础URL\r\n buryUrl = options.baseUrl;\r\n // 初始化配置参数\r\n handleInitConfigParams(options);\r\n const sendMd = async (buryContent: Record<string, any>) => {\r\n if (!buryUrl) {\r\n logger.error('埋点URL未配置,请先传入baseUrl参数');\r\n return;\r\n }\r\n logger.info('手动/自动埋点触发', buryContent);\r\n await sendTrackingData(buryContent, 'click', options);\r\n };\r\n /**\r\n * 兼容非navigateTo跳转,addInterceptor拦截不到,navigator标签跳转会触发\r\n * @param url 当前页面路径\r\n * @returns \r\n */\r\n const sendPageMd = async (url: string, buryContent: Record<string, any> = {}, tagName?: string) => {\r\n if (!buryUrl) {\r\n logger.error('埋点URL未配置,请先传入baseUrl参数');\r\n return;\r\n }\r\n if (autoSwitch.value === 0 && tagName) {\r\n logger.info('自动上报开关已关闭,跳过页面埋点');\r\n return;\r\n }\r\n // 页面埋点逻辑\r\n const stackPages = getCurrentPages();\r\n const prevPage = stackPages[stackPages.length - 1].route as any;\r\n const prevPageInfo = getPageTitle(prevPage, pagesJson);\r\n const currentPageInfo = getPageTitle(url.slice(1), pagesJson);\r\n const { content, pageOptions } = createPageViewData(\r\n currentPageInfo,\r\n prevPageInfo,\r\n prevPage || '',\r\n { ...options, ...buryContent, page_url: url }\r\n );\r\n\r\n await sendTrackingData({ content }, 'page_view', pageOptions);\r\n logger.success('页面跳转埋点成功', url);\r\n }\r\n app.config.globalProperties.sendMd = sendMd;\r\n app.config.globalProperties.sendPageMd = sendPageMd;\r\n uni.addInterceptor('navigateTo', {\r\n invoke(args) {\r\n logger.info('页面跳转拦截', args);\r\n },\r\n success(args) {\r\n /**\r\n * 关闭自动上报开关,阻止自动埋点上报\r\n */\r\n if (autoSwitch.value === 0) return;\r\n const stackPages = getCurrentPages();\r\n const currentPage = getCurrentPageInfo();\r\n const currentPageInfo = getPageTitle(currentPage?.route as string, pagesJson);\r\n const prevPage = stackPages[stackPages.length - 2].route as any;\r\n const prevPageInfo = getPageTitle(prevPage, pagesJson);\r\n\r\n const { content, pageOptions } = createPageViewData(\r\n currentPageInfo,\r\n prevPageInfo,\r\n prevPage || '',\r\n options\r\n );\r\n\r\n sendTrackingData({ content }, 'page_view', pageOptions);\r\n logger.success('页面跳转埋点成功', args);\r\n },\r\n });\r\n },\r\n};\r\n\r\nexport default TrackAutomaticPlugin;\r\n\r\n","// import Security from './security'\n\n/**\n * 路由跳转封装\n */\nexport default class Router {\n /**\n * 生成需要跳转的页面路径,路径后可带参数,形如 path?key=value&key2=value2\n * @param {*} path\n * @param {*} query\n */\n static genUrl(path, query) {\n if (query && typeof query === 'object') {\n const pairs = [];\n const holdCharList = [',']; // 无需转义的字符\n\n for (const key in query) {\n if (Object.prototype.hasOwnProperty.call(query, key)) {\n const value = query[key];\n\n // 避免 undefined / false 被处理成字符串\n let pair = `${key}=${encodeURIComponent(value || '')}`;\n\n // 无需转义的字符\n if (value && typeof value === 'string') {\n for (const char of holdCharList) {\n if (value.includes(char)) {\n const reg = new RegExp(`${encodeURIComponent(char)}`, 'g');\n\n pair = pair.replace(reg, char);\n }\n }\n }\n\n // ios抖音在参数包含三个‘i’的时候会屏蔽参数,所以加密后规避此规则\n // if (key === 'hm' && path === '/pages/order/haoma') {\n // pair = `${key}=${encodeURIComponent(Security.encrypt(value || ''))}`\n // }\n\n pairs.push(pair);\n }\n }\n if (pairs.length > 0) {\n path = path + '?' + pairs.join('&');\n }\n }\n return path;\n }\n}\n","import Router from './router';\n\nexport function getCurrentPageInfo() {\n const stackPages = getCurrentPages();\n\n let result;\n\n if (stackPages && stackPages.length > 0) {\n const currentPage = stackPages[stackPages.length - 1];\n\n result = {\n fullPath: Router.genUrl(currentPage.route, (currentPage as unknown as any).options),\n route: currentPage.route,\n options: (currentPage as unknown as any).options,\n };\n }\n return result;\n}\n"],"mappings":"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","names":["bury_exports","__export","bury_default","handleInitConfigParams","__toCommonJS","import_vue","Router","path","query","pairs","holdCharList","key","value","pair","char","reg","getCurrentPageInfo","stackPages","result","currentPage","Router","import_js_md5","CONSTANTS","buryUrl","trackCountObj","formatTime","now","year","month","day","hours","minutes","seconds","getTraceId","deviceId","timestamp","randomNum","getReportId","type","millis","traceId","getSessionId","matchPathReg","matchLastPathName","path","_a","getPageTitle","pagePath","pagesJson","mainPage","item","key","subPages","foundPage","pageItem","batchSize","intervalTime","retryCount","activeSwitch","autoSwitch","getUserAuth","user","userInfo","createRequestSign","jwt","usertype","encryption","handleConfigResponse","res","logger","data","handleInitConfigParams","options","finalUsertype","headers","message","error","isResponseSuccess","statusCode","getReportUrl","send","getNetworkType","resolve","reject","networkType","getUserInfo","userid","userType","getDeviceInfo","uniPlatform","osName","osVersion","deviceModel","deviceBrand","ua","createCommonMessage","pageInfo","getCurrentPageInfo","deviceInfo","processBuryContent","content","event_id","extraParams","createAutomaticMessage","buryContent","BatchProcessor","retries","success","commonMessage","automaticMessage","processedContent","batchProcessor","checkReportSwitch","sendTrackingData","eventType","createPageViewData","currentPageInfo","prevPageInfo","prevPage","_b","_c","TrackAutomaticPlugin","app","sendMd","sendPageMd","url","tagName","stackPages","pageOptions","args","currentPage","bury_default"]}