埋点数据种类:
1.按钮点击
2.页面切换
(具体数据内容根据实际需求再定义)

埋点数据交互:
采用img的默认下载功能,发送get请求,带上埋点数据(此处后期需要加上加密)

发送频率:
1.固定时间
2.固定数据量(根据get请求的限制和每条埋点的数据量制定最大的存储数据量)

代码如下

main.js

1.自定义指令监听发送

2.页面切换监听

 1 import Vue from 'vue'
2 import App from './App.vue'
3 import router from './router'
4 import store from './store'
5 // import axios from 'axios'
6 import ElementUI from 'element-ui';
7 import 'element-ui/lib/theme-chalk/index.css';
8 import JsonExcel from 'vue-json-excel'
9 import { get, post } from '@/util/http'
10
11 Vue.config.productionTip = false
12 // Vue.prototype.$axios = axios
13 Vue.prototype.$post = post;
14 Vue.prototype.$get = get;
15 Vue.use(ElementUI)
16 Vue.component('downloadExcel', JsonExcel)
17
18 new Vue({
19 router,
20 store,
21 render: h => h(App)
22 }).$mount('#app')
23
24 /**
25 * 自定义埋点指令
26 */
27 Vue.directive('log', {
28 bind(el, binding, vNode) {
29 // 当前页面的vue对象
30 const ts = vNode.context
31 el.addEventListener('click', () => {
32 console.log('v-log指令', binding.value)
33 const text = binding.value.text
34 store.dispatch('dealLogger', {
35 type: '点击操作',
36 text,
37 curPage: ts.$route.name,
38 timeStamp: '事件发生的时间戳' + new Date().getTime() // 时间戳
39 })
40 })
41
42 }
43
44 })
45
46 let currentTime = null
47 let startTime = Date.now()
48
49 router.beforeEach((to, from, next) => {
50 console.log('beforeEach')
51 if (to) {
52 // 第一步:页面跳转后记录一下当前的时间 currentTime
53 currentTime = Date.now()
54 // 第二步:计算 currentTime - startTime 的 差值
55 console.log('用户由 ', from.name, ' 页面 跳转到 ', to.name, ' 页面,在 ', from.name, ' 页面停留了 ', currentTime - startTime, '毫秒。转换成秒数约为:', parseInt((currentTime - startTime) / 1000))
56 // 通过计算currentTime - startTime 的 差值 之后,再上报数据
57 const sed = parseInt((currentTime - startTime) / 1000)
58 store.dispatch('dealLogger', {
59 type: '页面切换',
60 prePage: from.name, // 上一个页面
61 curPage: to.name, // 当前页面
62 timeStay: '停留了' + sed + 's', // 停留时间
63 })
64
65 // 第三步:每次都要初始化一下 startTime
66 startTime = Date.now()
67 }
68 next()
69 })
70
71 // Vue.config.errorHandler = (err, vm, info) => {
72 // console.log('*************************************************************************************addEventListener errorHandler')
73 // console.log(err)
74 // console.log(vm)
75 // console.log(info)
76 // }
77
78 // window.addEventListener('error', (evt) => {
79 // console.log('*************************************************************************************addEventListener error')
80 // console.log(evt)
81 // })
82
83 // // 监听promise的报错
84 // window.addEventListener('unhandledrejection', (evt) => {
85 // console.log('*************************************************************************************addEventListener unhandledrejection')
86 // console.log(evt)
87 // })

vuex文件

export default {
state: {
logUrl: 'https://kunpeng.csdn.net/ad/json/list', // 发送埋点的url
loggerResult: [], // 埋点数据统计
logLength: 5, // 最大存储埋点数量
logTime: 60, // 发送埋点间隔时间
},
getters: {
getLogTime: state => state.logTime,
getLoggerResult: state => state.loggerResult
},
mutations: {
/**
* 添加埋点数据
* @param {*} state
* @param {*} payload
*/
appendLogger: (state, payload) => {
state.loggerResult.push(payload)
},
/**
* 清空埋点数据
* @param {*} state
* @param {*} payload
*/
resetLogger: (state) => state.loggerResult = [],
},
actions: {
/**
* 处理埋点数据
* @param {*} param0
* @param {*} payload
*/
dealLogger({ state, commit, dispatch }, payload) {
console.log('dealLogger****************', payload)
commit('appendLogger', payload)
const res = state.loggerResult
// 当埋点数量超出定义的最大存储数量,发送一次
if (res.length >= state.logLength) {
dispatch('sendLogger')
}
},
/**
* 发送埋点数据
* @param {*} param0
* @param {*} payload
*/
sendLogger({ state, commit }) {
const res = state.loggerResult
// 如果没有埋点数据,则不发送
if (res.length === 0) {
return
}
// 发送数据
console.log('sendLogger loggerResult', res)
const img = new Image() img.style.display = 'none' const removeImage = function () {
img.parentNode.removeChild(img)
} img.onload = removeImage
img.onerror = removeImage img.src = `${state.logUrl}?params=${JSON.stringify(res)}` document.body.appendChild(img)
// 清空
commit('resetLogger')
}
},
modules: {
}
}

页面具体实现

v-log绑定相关信息

<div class="btn">
<el-form-item>
<el-button type="primary" @click="onSubmit" v-log="{text: '查询'}">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="" @click="onReset" v-log="{text: '重置'}">重置</el-button>
</el-form-item>
</div>

vue项目埋点实践,使用img发送埋点数据的更多相关文章

  1. 【Vuejs】335-(超全) Vue 项目性能优化实践指南

    点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...

  2. VUE项目性能优化实践——通过懒加载提升页面响应速度

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近我司因业务需求,需要在一个内部数据分析平台集成在线Excel功能,既然我 ...

  3. webpack+vue项目实战(四,前端与后端的数据交互和前端展示数据)

    地址:https://segmentfault.com/a/1190000010063757 1.前言 今天要做的,就是在上一篇文章的基础上,进行功能页面的开发.简单点说呢,就是与后端的数据交互和怎么 ...

  4. Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resource异步请求和跨域

    跨域原理: 一.使用axios发送get请求 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 & ...

  5. vue项目缓存最佳实践

    需求 在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要 ...

  6. vue项目使用v-charts的柱形图的各种样式和数据配置

    找了很多网上关于v-charts的柱形图使用,我发现我一模一样的配置就是没有效果,我原来是按需引入的, import VeHistogram from 'v-charts/lib/histogram' ...

  7. HBuilder打包vue项目app后空白,并请求不到数据

    (解决空白问题)在打包之前一定要修改 config 目录下的 index.js 文件中的 bulid 模块打包配置项,否则会出现空白,如图   修改前 assetsPublicPath= '/',. ...

  8. Vue项目中实现tab栏和步骤条的数据联动

    也就是tab栏切换步骤条随之变化 <template>   <div>     <!-- 面包屑导航  -->     <el-breadcrumb sepa ...

  9. vue项目部署上线

    前言 今天把自己写的demo登录写完了,就想着试着走一下部署上线的流程.参考了很多的文档,终于成功进行了部署.在这里将服务器的搭建和vue项目的 部署上线进行整理(都是基础的知识,希望对大家有帮助.对 ...

  10. vue项目post、put、delete、get向java后端传数组

    通常我们向后端发送数据有两种方式 get.post,后又restful风格出现,又有put.delete等传参方式.但是对于我们来说他们的传参本质还是只有get和post的两种,即 get.delet ...

随机推荐

  1. mac os黑苹果安装

    前言 习惯了mac敲代码的攻城师很难再去适应windows,那么如何在windows上安装苹果系统呢?用黑苹果. 关于黑苹果的安装,网上的一大堆教程显得过于啰嗦,又是安装Unlocker破解mac限制 ...

  2. [NOI Online 2022 提高组] 如何正确地排序

    \(\text{Solution}\) 当 \(m=2\) 时,\(ans=2n\sum a_{i,j}\) 当 \(m=3\) 时 当然先套路地考虑某一行的贡献,记为第 \(x\) 行 则当取 \( ...

  3. 「SHOI2015」脑洞治疗仪

    \(\text{Naive Solition}\) 当然是 \(ODT\) 暴力啦 \(Luogu\) 煞费苦心加强了数据,于是就过不了了... 不过 \(LibreOJ\) 上可以过 #includ ...

  4. 【模板】AC自动机(二次加强版)

    模板 \(Problem:\) 求 \(n\) 个模式串在文本串中出现的次数 \(templete:\) \(Luogu5357\) \(Code\) #include<cstdio> # ...

  5. 题解 [AHOI2009]同类分布

    不理解之前为什么不会哈哈哈哈哈哈哈哈. 我是个天才(喜 显然记录 \(f_{i, t, r, s, limit, lead}\),\(i, limit, lead\) 是数位 dp 的套路,\(t\) ...

  6. .Net 6 miniAPI

    启动:1.双击 WebApplication1.exe文件   2.dotnet WebApplication1.dll --urls "http://localhost:5403;http ...

  7. 都在用 AI 生成美少女,而我却。。。

    最近 AI 画画特别的火,你能从网上看到非常多好看的图片,于是我就开始了我的安装之旅,我看到的图是这样的. 这样的. 还有这样的. 然后我就开始了我的 AI 安装生成计划. 安装环境 首先我们需要安装 ...

  8. 如何在 JavaScript 中使用媒体查询

    前言 说起媒体查询想必大家最先想到的都是CSS中@media,没错,这是我们最常用的媒体查询方法,主要用来为我们的网站做适配处理. 比如: h1 { font-size: 2rem; color: g ...

  9. android 上传文件到服务器,FTP方式

    public class UploadFileUtils { private static boolean flag; /** * 需在在子线程下执行 * pathname 为:服务器存储地址 ,re ...

  10. Vue 非单文件组件(不常用)3步骤(创建、注册、使用)和几个注意点、组件的本质(VueComponent)

    Vue中使用组件的三大步骤: 1.定义组件(创建) 2.注册组件 3.使用组件(写组件标签) 一.如何定义一个组件? 使用Vue.extend(options)创建,其中options 和 new V ...