import { request } from "@/utils/request" // 生成并缓存 device_id function getOrCreateDeviceId() { let deviceId = uni.getStorageSync('device_id') if (!deviceId) { deviceId = Date.now() + '_' + Math.random().toString(36).substr(2, 9) uni.setStorageSync('device_id', deviceId) } return deviceId } // 获取网络类型 function getNetworkType() { return new Promise((resolve) => { uni.getNetworkType({ success: (res) => resolve(res.networkType || 'unknown'), fail: () => resolve('unknown') }) }) } // 获取系统平台 function getSystemInfo() { return new Promise((resolve) => { uni.getSystemInfo({ success: (res) => resolve(res), fail: () => resolve({}) }) }) } // 获取当前页面路径 function getCurrentPagePath() { const pages = getCurrentPages() const currentPage = pages[pages.length - 1] return currentPage?.route || '' } function getMiniProgramVersion() { const platform = process.env.UNI_PLATFORM let version = '' let envVersion = '' try { if (platform === 'mp-weixin') { // 微信小程序 const info = wx.getAccountInfoSync() version = info?.miniProgram?.version || '' envVersion = info?.miniProgram?.envVersion || '' } else if (platform === 'mp-alipay') { // 支付宝小程序 const info = my.getAppInfoSync() version = info?.version || '' } else if (platform === 'mp-toutiao' || platform === 'mp-jd') { // 抖音/头条/京东小程序 const info = tt.getAccountInfoSync?.() version = info?.miniProgram?.version || '' envVersion = info?.miniProgram?.envVersion || '' } else if (platform === 'mp-baidu') { // 百度小程序(无标准方法获取版本号) version = '' // 百度不支持获取版本号 } else { version = '' } } catch (e) { version = '' envVersion = '' } return { platform, // 当前小程序平台 version, // 小程序版本号 envVersion // develop / trial / release(微信等支持) } } // 构造埋点对象 async function buildEventData(eventName, eventType = 'click', customParams = {}) { const deviceId = getOrCreateDeviceId() const systemInfo = await getSystemInfo() const networkType = await getNetworkType() // const location = await getLocation() const appVersion = (typeof plus !== 'undefined') ? plus?.runtime?.version : '' const { envVersion, platform, version} = getMiniProgramVersion() return { userId: uni.getStorageSync('user_id') || null, deviceId: deviceId, eventName: eventName, eventType: eventType, eventTime: new Date(), page: getCurrentPagePath(), elementId: customParams.element_id || null, elementContent: customParams.element_content || null, customParams: customParams, networkType: networkType, os: systemInfo.platform || 'unknown', appVersion: version || 'unknown', envVersion: envVersion ?? '', platform: platform ?? '' } } // 发送埋点数据到服务器 async function sendTrack(eventName, eventType = 'click', customParams = {}) { const eventData = await buildEventData(eventName, eventType, customParams); request({ url: '/api/common/tracking/create', method: 'POST', data: eventData }) } export default { sendTrack }