const app = getApp() const GUEST_TRACK_STORAGE_KEY = 'guest_track_id_v1' /** * 未登录访客设备标识:持久化,用于埋点区分「人」——避免全部为 anonymous 导致后台只统计到 1 人 */ function getGuestTrackId() { try { let id = wx.getStorageSync(GUEST_TRACK_STORAGE_KEY) id = typeof id === 'string' ? id.trim() : '' if (id.length >= 12) return id id = 'gt_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 14) wx.setStorageSync(GUEST_TRACK_STORAGE_KEY, id) return id } catch (_) { return 'gt_fallback_local' } } function sendMiniprogramTrack(data) { return app.request('/api/miniprogram/track', { method: 'POST', data, silent: true }) } /** * 全局按钮/标签点击埋点(未登录也上报,携带 guestId) * @param {string} module 模块:home|chapters|read|my|vip|wallet|match|referral|search|settings|about * @param {string} action 行为:tab_click|btn_click|nav_click|card_click|link_click 等 * @param {string} target 目标标识:按钮文案、章节ID、标签名等 * @param {object} [extra] 附加数据 */ function trackClick(module, action, target, extra) { const userId = app.globalData.userInfo?.id || '' const payload = { action, target, extraData: Object.assign({ module, page: module }, extra || {}) } if (userId) { payload.userId = userId } else { payload.guestId = getGuestTrackId() } sendMiniprogramTrack(payload).catch(() => {}) } /** * 章节 PV:写入 user_tracks.action=view_chapter;未登录携带 guestId */ function trackViewChapter(sectionId, extra) { const id = String(sectionId || '').trim() if (!id) return const userId = app.globalData.userInfo?.id || '' const payload = { action: 'view_chapter', target: id, extraData: Object.assign({ page: 'read', module: 'read' }, extra || {}) } if (userId) { payload.userId = userId } else { payload.guestId = getGuestTrackId() } sendMiniprogramTrack(payload).catch(() => {}) } module.exports = { trackClick, trackViewChapter, getGuestTrackId }