埋点数据种类:
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. maven打包失败 Cannot create resource output directory

    转https://blog.csdn.net/wuyuanshun/article/details/103097447 maven clean后打包出现Cannot create resource o ...

  2. JAVA虚拟机25---编译器,解释器,JAVA中的即时编译

    https://www.cnblogs.com/somefuture/p/14272221.html 1.简介 编译器:是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往 ...

  3. 超详细!Jmeter性能测试

    前言 性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性能的瓶颈所在,而这也是优化架构设计中重要的依据. 测试流程: 需求分析→环境搭建→测试 ...

  4. SQLSERVER 临时表和表变量到底有什么区别?

    一:背景 1. 讲故事 今天和大家聊一套面试中经常被问到的高频题,对,就是 临时表 和 表变量 这俩玩意,如果有朋友在面试中回答的不好,可以尝试看下这篇能不能帮你成功迈过. 二:到底有什么区别 1. ...

  5. 如何优化 Vue.js 应用程序

    单页面应用(SPAs)当处理实时.异步数据时,可以提供丰富的.可交互的用户体验.但它们也可能很重,很臃肿,而且性能很差.在这篇文章中,我们将介绍一些前端优化技巧,以保持我们的Vue应用程序相对精简,并 ...

  6. 解决VS2019 DevExpress工具不显示问题

    一.序言 环境:NetFramework4.5,vs2019社区板 ,DevExpress 14.2.3 项目类型:winfrom 二.解决 找到DevExpress安装路径下的Bin\Framewo ...

  7. 触觉仿真系统:Force Dimension+CHAI 3D

    推荐:将 NSDT场景编辑器 加入你的3D开发工具链 Force Dimension 成立于2001年,总部在瑞士,比sensable 晚了8年,开发的理念也不一样,他们开发是连杆式力反馈触觉系统,仿 ...

  8. element-ui/lib/style.css in ./src/main.js 解决方案

    在node_modules 中    找到element-ui/lib路径 创建style.css文件   就好了

  9. 昇腾AI新技能,还能预防猪生病?

    摘要:日前,由华为与武汉伯生科技基于昇腾AI合作研发的"思符(SiFold)蛋白质结构预测平台"正式推出,并成功应用于国药集团动物保健股份有限公司的猪圆环病毒疫苗研发中. 本文分享 ...

  10. 结合代码和内存变化图一步步弄懂JVM的FullGC

    1.年轻代存活的对象太多,老年代了放不下 01.示例代码 public class DemoTest1 { public static void main(String[] args) { byte[ ...