邏輯思路 跳轉頁面前,記錄當前頁面的信息停留的時長以及各種信息,然后等走的時候再將記錄的信息發送出去
1.記錄當前頁面信息的函數
// 埋點通用接口
// triggerType: 必傳 類型 entryStr(進入) || leaveStr(離開) || String:自定義事件描述
// pageUrl:非必傳,頁面路徑,不穿默認獲取當前路徑
//再洗一個觸發事件
async function myMta(triggerType = "", pageUrl = '') {console.log('埋點', triggerType, pageUrl)let entryTime, leaveTime, stayTime, nowTime;// entryTime 進入頁面時間// leaveTime 離開頁面時間// stayTime 停留時長// nowTime 進行當前函數的時間if (!triggerType) returnif (triggerType == 'entryStr') {entryTime = new Date().getTime();nowTime = new Date().getTime();leaveTime = null;uni.setStorageSync('entryTime', entryTime)} else {entryTime = uni.getStorageSync('entryTime');leaveTime = new Date().getTime();stayTime = leaveTime - entryTime;nowTime = new Date().getTime();}//異步請求當前網絡信息是wifi還是啥uni.getNetworkType({success: function(res) {let networkType = res.networkType;let token, openid, sysTemInfo;try {uni.getStorage({key: 'storage_key',success: function(res) {token = res.data.tokenopenid = res.data.openIduni.getSystemInfo({success: function(res) {sysTemInfo = resconst urlArgs =getCurrentPageUrlWithArgs(); //通過這個函數獲取當前頁面的信息 如果想返回更多自己去函數里面更改var data = {token: token,openid: openid,triggerType: triggerType,networkType: networkType,pageInfo: {pageUrl: pageUrl,route: urlArgs.route,params: urlArgs.options,title: urlArgs.title,},entryTime: toDateDetail(entryTime),leaveTime: toDateDetail(leaveTime),nowTime: toDateDetail(nowTime),stayTime: stayTime,sysTemInfo: sysTemInfo,// ip: ip[0]}data = {token: token,openid: openid,triggerType: triggerType,networkType: networkType,pageInfo: JSON.stringify({pageUrl: pageUrl,route: urlArgs.route,params: urlArgs.options,title: urlArgs.title,}),entryTime: toDateDetail(entryTime),leaveTime: toDateDetail(leaveTime),nowTime: toDateDetail(nowTime),stayTime: stayTime,sysTemInfo: JSON.stringify(sysTemInfo),// ip: ip[0]}var headers = {};headers['X-Token'] = tokenuni.request({url: 'https://lingzhuang.gengduoke.com/adminapi/customtrajectory/save',data: data,header: headers,method: 'post',success: (res) => {console.log('res', res)},fail: (err) => {console.log('err', err)}})},fail(error) {sysTemInfo = 'null'}})},fail(error) {token = "null"}})} catch (e) {}}})
}// 獲取當前頁面鏈接和參數
function getCurrentPageUrlWithArgs() {const pages = getCurrentPages();const currentPage = pages[pages.length - 1]; //當前頁面的全部信息const route = currentPage.route; //當前路由的路徑 pages/login/loginconst options = currentPage.options; //url里面的參數json類型const title = currentPage.$holder.navigationBarTitleText //當前頁面的navigationBarTitleText/拼接路由url字符串開始///let urlWithArgs = `/${route}?`; //將url里面的參數拼接成字符串 /pages/login/login?a=1for (let key in options) {const value = options[key];urlWithArgs += `${key}=${value}&`;}urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1);/拼接路由url字符串結束///return {options, //當前頁面的參數urlWithArgs, //當前頁面的參數route,title};
}function toDateDetail(number) {if (!number) number = new Date();// var n = number * 1000var date = new Date(number);var Y = date.getFullYear() + "-";var M =(date.getMonth() + 1 < 10 ?"0" + (date.getMonth() + 1) :date.getMonth() + 1) + "-";var D = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();var h = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();var mm = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();var s = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();return Y + "" + M + "" + D + " " + h + ":" + mm + ":" + s;
}/*** appId -> 小程序ID 類型:String* appToken -> 自定義 類型:String* token -> 當前用戶token 類型:String* openid -> 當前用戶openid 類型:String* triggerType -> 事件類型 類型:String* pageInfo { -> 當前頁面信息 類型:Object* pageUrl: -> 不帶參數 類型:String* url: -> 帶參數 類型:String* ...params -> 當前頁面所有參數 類型:Object* }* entryTime -> 進入頁面時間 類型:Number* leaveTime -> 離開當前頁面時間 類型:Number* stayTime -> 停留時長 類型:Number 單位:ms* sysTemInfo -> 設備信息 類型:Object*/
export default {myMta
};
2.跳轉進行路由攔截然后讓他進行第一個里面的函數的操作
import Mta from "./myMta.js";
var nav = {navigateTo: ({url}) => {var link = getCurrentPages()[getCurrentPages().length - 1].route;Mta.myMta('leaveStr', link)console.log('navigateTo', link, '-', url)uni.navigateTo({url: url,success: function(res) {Mta.myMta('entryStr', url)}});},redirectTo: ({url}) => {var link = getCurrentPages()[getCurrentPages().length - 1].route;Mta.myMta('leaveStr', link)console.log('redirectTo', link, '-', url)uni.redirectTo({url: url,success: function(res) {Mta.myMta('entryStr', url)}});},reLaunch: ({url}) => {var link = getCurrentPages()[getCurrentPages().length - 1].route;Mta.myMta('leaveStr', link)console.log('reLaunch', link, '-', url)uni.reLaunch({url: url,success: function(res) {Mta.myMta('entryStr', url)}});},switchTab: ({url}) => {var link = getCurrentPages()[getCurrentPages().length - 1].route;Mta.myMta('leaveStr', link)console.log('switchTab', link, '-', url)uni.switchTab({url: url,success: function(res) {Mta.myMta('entryStr', url)}});},navigateBack: ({num}) => {var link = getCurrentPages()[getCurrentPages().length - 1].route;Mta.myMta('leaveStr', link)console.log('navigateBack', link, '-', num)uni.navigateBack({delta: num});},share:()=>{Mta.myMta('share')}
}
export default {...nav
}
3.調用頁面跳轉以及函數監聽和發送
this.nav.navigateTo({url:'/pages/login/login'
})
4.可以封裝全局
頁面埋點/
import nav from '@/utils/navRoute.js'
Vue.prototype.nav = nav
//1.navigateTo
//2.reLaunch
//3.switchTab
//4.navigateBack