最近菜鸟做项目,需要做简单的数据埋点,不是企业级的,反正看渡一的视频,企业级特别复杂,包括但不限于:错误收集、点击地方、用户行为……
菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间,而且面向的是全球用户,所以自己简单写了。
一、获取IP、地址
这里菜鸟最开始想到的就是高德、腾讯地图这样的平台,里面都是有ip逆向解析的,但是菜鸟一看高德的api,发现不支持国外!!!
然后百度虽然支持,但是也不是很准确,最重要的一点是总是提示我跨域了,不知道咋解决!!!
所以菜鸟就在网上找到一个免费且比较准确的
https://ipinfo.io/account/profile
反正电脑不是手机,定位确实不好搞,反正菜鸟感觉定位的地方就是离你最近的转发基站的位置,而不是你本来的位置!
希望有知道可以精确定位的读者可以 指点江山,激扬文字!
二、数据埋点
这里菜鸟最开始想的是 vue3 的 mixins,发现 vue3 不推荐 mixins,但是可以直接使用组合式 API 的组合式函数,就相当于把mixins当函数提出去,然后需要用到的时候直接引入就行!
然后菜鸟写的代码就是这样的了:
src/mixins/pagetime.js
/**
* 书写界面停留时间函数
*/
import {
onBeforeUnmount } from "vue";
import {
DataburialpointApi } from "@/network/api";
import {
useRoute } from "vue-router";
// 按照惯例,组合式函数名以“use”开头
export function usePageTime() {
const _routeObj = {
"/content": "首页",
"/services/0": "NGS- Whole Genome Sequencing",
"/services/1": "NGS- mRNA Sequencing",
"/services/2": "NGS- Small RNA Sequencing",
"/services/3": "NGS-Lnc RNA Sequencing",
"/services/4": "NGS- Metagenome Sequencing",
"/services/5": "NGS- Microbial diversity Sequencing",
"/services/6": "NGS- Hi-C Sequencing",
"/services/7": "Nanopore- Nanopore Ultra-long Sequencing",
"/services/8": "Nanopore- Nanopore Sequencing",
"/services/9": "Nanopore- Direct RNA Sequencing",
"/services/10": "Nanopore- Lnc RNA Sequencing",
"/services/11": "Nanopore- CircRNA Sequencing",
"/services/12": "Nanopore- TAIL Iso Sequencing",
"/services/13": "Nanopore- Isoform Sequencing",
"/services/14": "Nanopore- Direct-CDNA Sequencing",
"/services/15": "Nanopore- Single-cell full-length transcriptome Sequencing",
"/services/16": "Nanopore- Full-length 16S/18S/ITS Amplicon Sequencing",
"/services/17": "Nanopore- 16S-23S Amplicon Metagenomic Sequencing",
"/services/18": "Nanopore- Metagenome Sequencing",
"/services/19": "Nanopore- PORE-C Sequencing",
"/services/20": "Pacbio Revio- Revio Sequencing",
"/resources/sample": "资源-样本要求",
"/about": "关于我们",
"/contactus": "联系我们",
};
let _startTime = Date.now();
let _useTime = 0;
// 路由菜单相关
let route = useRoute();
onBeforeUnmount(() => {
_useTime = Date.now() - _startTime;
let _formdata = {
};
_formdata.visitorId = localStorage.getItem("userId");
_formdata.url = route.path;
_formdata.classify = _routeObj[route.path];
_formdata.time = _useTime;
DataburialpointApi(_formdata)
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
});
}
结果压根不靠谱,这样发送给后端的是跳转后的界面,而不是跳转前的,所以每次都是把上一个界面的访问时间和新跳转的界面发送过去