埋点数据种类:
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. .NET WebAPI 跨域问题(has been blocked by CORS policy:No Access-Control-Allow-Ogigin header is present on the requested resource)

    一.什么是跨域 1. 跨域解释 跨域指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 同源指的是:域名,协议,端口均相同. 2. 什么情况下会导致跨域 2.1 ...

  2. OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析

    OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍在 OpenMP 当中 guided 调度方式的实现原理.这个调度方式其实和 dy ...

  3. 使用vscode调试ros

    https://blog.csdn.net/u012254599/article/details/106143540/ CMakeLists.txt set(CMAKE_BUILD_TYPE &quo ...

  4. 树莓派UBUNTU MATE 自动登录用户

    1.sudo vim /usr/share/lightdm/lightdm.conf.d/60-lightdm-gtk-greeter.conf 2.添加autologin-user=youruser ...

  5. Diffusers库的初识及使用

    diffusers库的目标是: 将扩散模型(diffusion models)集中到一个单一且长期维护的项目中 以公众可访问的方式复现高影响力的机器学习系统,如DALLE.Imagen等 让开发人员可 ...

  6. JZOJ 1121. Fix

    解析 考场时想多了,其实根本不用分阶段 一维状压 \(DP\) 就行了 可我没想清楚,加了个第几次去稳固一个点的阶段 然后时间就炸了!!! \(Code\) #include<cstdio> ...

  7. 跳板攻击之:SSH 隧道

    跳板攻击之:SSH 隧道 郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共 ...

  8. Mybatis连接数据库

    从零开始Mybatis连接数据库 创建Maven文件 File-->new-->project-->maven,点击next 配置 在出现的pom.xml文件中<project ...

  9. 【前端】js实现图片自适应

    一.问题分析 既然要实现图片自适应,那就要对不同的图片尺寸进行分类处理,我最开始是分了5类 对于长宽都不超过的情况 -- 应该不改变图片本身比例 对于长宽都超过的情况 -- 应该是根据图片比例进行缩小 ...

  10. 基于JavaScript的OpenGL 01 之Hello Triangle

    1. 引言 本文基于JavaScript语言,描述OpenGL(即,WebGL)的绘制流程,这里描述的是OpenGL的核心模式(Core-profile) 笔者这里不过多描述每个名词.函数和细节,更详 ...