微信小程序記錄用戶行為瀏覽記錄和停留時間以及小程序全局分享
項目需求
1、后台統計一個用戶在我們小程序的每個頁面的停留時間
2,前台用戶可以在個人中心看到自己的分享記錄以及多少人查看
需求分析
需求一:想要記錄用戶在每個頁面的停留時間,無非就是記錄用戶進來的時間和退出頁面的時間,獲取時間差。
需求二:每個頁面在分享的時候做記錄(附帶用戶的唯一標識openid或者其他跟后端對接)我的分享例
相信大家在看到這個需求之后都會有這樣的思路,但是如果在每一個頁面都這樣操作重復代碼太多,后期維護也過於麻煩,因此如果可以做一個全局函數,就可以避免這些問題,下面就是我的代碼和具體操作,代碼有不足歡迎指正優化,如果有更好的方法我們可以互相share學習一下(▽)。
在app.js中
添加一個重寫分享的方法(記錄用戶行為的操作也放在里面了,代碼里面有注釋),在onLaunch中調用
//重寫分享方法 overShare: function () { var that = this //監聽路由切換 //間接實現全局設置分享內容 wx.onAppRoute(function (res) { //獲取加載的頁面 let pages = getCurrentPages(), //獲取當前頁面的對象 view = pages[pages.length - 1], data; data = view.data; data.timeStart = Date.now() //在當前頁面的data中,記錄進入頁面的時間 if(!data.addonHide) { var oldOnHide = view.onHide // 記錄單獨在某些頁面onhide里做的一些操作,防止全局覆蓋原有頁面操作 data.addonHide = true view['onHide'] = function(view) { //全局添加的一些操作 // 做一些我們自己想做的事情 let timeEnd = Date.now() // 記錄onhide時候的時間戳(用戶離開頁面的操作有兩種(跳轉頁面走的是onhide,直接關閉小程序走的是onUnload )下面onUnload 不做解釋,同樣的操作) var stayTime = timeEnd - data.timeStart // 獲取停留時間 var stayArray = wx.getStorageSync('record') || [] // 這里我獲取到當前頁面的停留時間之后沒有直接調用接口上報,而是先存起來(10條后上報,特殊情況除外(不夠十條,用戶關閉了小程序)),防止多次提交 stayArray.push({ //具體數據和相關參數跟后端對接 userId: wx.getStorageSync('tokenAdmin').frontUserId, openId: wx.getStorageSync('tokenAdmin').openId, type: data.shareType || '', sourceId: data.id || '', // 資源id,(對於需要id的詳情頁) page: res.path, stay: stayTime, timeStart: data.timeStart, timeEnd: timeEnd }) wx.setStorageSync('record', stayArray) if(wx.getStorageSync('record').length == that.globalData.recordNumber) { // that.globalData.recordNumber即你規定的條數(多少條后上報) that.setRecordBatch() // 調用上報的函數(根據自己接口編寫,這里不展示) } // 調用原來的onHide方法 oldOnHide.call(that, res) } var oldOnUnload = view.onUnload view['onUnload'] = function(view) { // 做一些我們自己想做的事情 let timeEnd = Date.now() var stayTime = timeEnd - data.timeStart var stayArray = wx.getStorageSync('record') || [] stayArray.push({ userId: wx.getStorageSync('tokenAdmin').frontUserId, openId: wx.getStorageSync('tokenAdmin').openId, type: data.shareType || '', sourceId: data.id || '', page: res.path, stay: stayTime }) wx.setStorageSync('record', stayArray) if(wx.getStorageSync('record').length == that.globalData.recordNumber) { that.setRecordBatch() } // 調用原來的onUnload 方法 oldOnUnload.call(that, res) } } //到此處 記錄用戶軌跡的操作結束,下面是針對全局分享的操作 (下面注釋的這部分代碼:統計用戶是通過哪種方式查看的小程序,用戶用戶個人中心我的分享展示,如圖一) // var scene = '?' + decodeURIComponent(res.query.scene) // var rid = getUrlParams(scene, 'rid') || '' // if (view) { // if(res.query.openid) { // that.setClickRecord(res) // } // if(wx.getStorageSync('tokenAdmin')) { // if(rid) { // that.setPosterRecord(rid) // } // } // console.log('是否重寫分享方法', data.isOverShare) if (data.isOverShare) { // isOverShare參數為是否需要需要重寫分享方法,在需要的頁面加上該變量 view.onShareAppMessage = function () { if(wx.getStorageSync('tokenAdmin')) { //防止用戶在該頁面多次分享給不同的人記錄成條分享記錄,看需求 if(!data.isShareRecord) { that.getshareRecord(res, data) } } if(data.id) { //帶id的頁面分享參數和不帶區分() // console.log(data) return { title: data.shareTitle, imageUrl: data.shareImage, path: `${view.route}?id=${data.id}&openid=${wx.getStorageSync('tokenAdmin').openId}&ts=${Date.parse(new Date())}`, } } else { return { title: data.shareTitle, path: `${view.route}?openid=${wx.getStorageSync('tokenAdmin').openId}&ts=${Date.parse(new Date())}`, imageUrl: data.shareImage } } } } } }) },
原文鏈接:https://blog.csdn.net/weixin_42311676/article/details/113308618