Vue中使用matomo进行访问流量统计的实现

Vue中使用matomo进行访问流量统计

原文链接

前言

之前做到了一个页面及接口访问流量统计的需求, 然后在网上找了很多帖子,发现有些有的但是写的都不是很详细,所以今天就整理了一下

正文

  • 第一步 首先自然是引入matomo
npm i vue-matomo
复制代码
  • 第二步 在main.js中注册一下matomo
import VueMatomo from ‘vue-matomo‘
Vue.use(VueMatomo, {
  host: ‘http://matomo.na.xyz‘, // 这里配置你自己的piwik服务器地址和网站ID
  siteId: 3,//siteId值
  // 根据router自动注册
  router: router,
  // // 是否需要在发送追踪信息之前请求许可
  // // 默认false
  requireConsent: false,
  enableLinkTracking: true,
  // // 是否追踪初始页面
  // // 默认true
  trackInitialView: false,
  // // 最终的追踪js文件名
  // // 默认 ‘piwik‘
  trackerFileName: ‘matomo‘,
  debug: false
});
复制代码

当然这里也可以提出一个公共的文件来动态维护你的piwik服务器地址和网站

import VueMatomo from ‘vue-matomo‘
// 动态维护的文件
import baseUrlto from ‘./utils/baseUrlto‘

// 这段代码作用是获取当前加载的路径,并去维护文件中数组里匹配出相应的的集合对象.
let uitem
baseUrlto.map(e => {
  if (document.URL.indexOf(e.environmentUrl) !== -1) {
    uitem = e
  }
})
if (!uitem) {
  uitem = baseUrlto[0]
}
Vue.use(VueMatomo, {
  host: uitem.staUrl, // 这里是匹配到的地址
  siteId: uitem.staId, //这里是匹配到的siteId值
  // 根据router自动注册
  router: router,
  // // 是否需要在发送追踪信息之前请求许可
  // // 默认false
  requireConsent: false,
  enableLinkTracking: true,
  // // 是否追踪初始页面
  // // 默认true
  trackInitialView: false,
  // // 最终的追踪js文件名
  // // 默认 ‘piwik‘
  trackerFileName: ‘matomo‘,
  debug: false
});
复制代码

附上baseUrlto的代码

const statistics = [
// 数组第一项,即为,当路径匹配不到时,默认传送的统计网址,可以是开发环境下测试统计的地址
  {
    staUrl: ‘//analytics.baowei-inc.com/‘, // 统计网址
    staId: ‘2‘, // 统计ID
    environmentUrl: ‘默认‘
  },
  {
    staUrl: ‘//analytics.baowei-inc.com/‘, // 开发环境统计网址
    staId: ‘2‘, // 统计ID
    environmentUrl: ‘http://bwcaigou.baowei-inc.com‘
  },
  {
    staUrl: ‘//analytics.baowei-inc.com/‘, // 生产环境统计网址
    staId: ‘1‘, // 统计ID
    environmentUrl: ‘http://portal.baowei-inc.com‘
  },
  {
    staUrl: ‘//106.12.95.245:8888/‘, // 本地环境统计网址
    staId: ‘2‘, // 统计ID
    environmentUrl: ‘http://localhost:‘
  }
]

export default statistics

复制代码
  • 第三步 ,是在app.vue中监听路由变化
watch: {
      ‘$route‘ () {
        let locationHash = window.location.hash;
        //把路由存在缓存中,此处你可以console.log看出路由变化
        sessionStorage.setItem("hashLocation",locationHash);
      }
    },
复制代码
  • 第四步, 然后在每一个被跳转时都需要统计的组件中,添加上一段追踪信息的代码,每一个页面组件, 对于反复使用的子组件不需要添加,弹窗等也不需要,针对的是页面级的组件,
// 这里说明一下, this.$matomo是注册过后,自动会有的, 不需要进行其他的操作.
 created(){
      const hashLocation= sessionStorage.getItem("hashLocation");//缓存中获取当前页面的路由名称
      const newLocation = hashLocation.split("#/")[1];
      // 注意, 这里使用全路径匹配,在hash模式中,因为地址会携带#,所以页面报告中的url需要重新覆盖一下, 将#去除
      this.$matomo.setCustomUrl("http:baidu.com"+"/"+newLocation);//覆盖页面报告的url,可以自定义页面url,加上本页面路由
      // this.$matomo.trackEvent(shopCode,hashLocation);//事件
      this.$matomo.trackPageView(hashLocation);//页面名称,可以自定义页面名称
    }
复制代码

特地说明一下, setCustomUrl的作用是重新设定url,因为在matomo的页面网址统计那块中,它是通过url去统计的, 如果不做处理的话, 会自动统计域名后一级目录为相同页面, 也就是说, /#/会被读取为一个页面网址,不处理的话,那么无论访问哪个页面,都会被统计为/index页面.

一级之后的目录会作为子目录被统计

// 注意, 这里使用全路径匹配,在hash模式中,因为地址会携带#,所以页面报告中的url需要重新覆盖一下, 将#去除
      this.$matomo.setCustomUrl("http:baidu.com"+"/"+newLocation);// 非全路径
      this.$matomo.setCustomUrl("http://www.baidu.com"+"/"+newLocation); // 全路径
      //覆盖页面报告的url,可以自定义页面url,加上本页面路由
复制代码

重要的事说两遍, 需要全路径字符串, 否则依然会把#带上.

  • 第五步, 其实到这里, 已经能正常统计数据了,下面是一些优化的步骤.

    针对接口的统计

    针对接口的统计就是在请求拦截器中添加发送统计信息的代码

    import pathToname from ‘@/utils/pathname‘
    // 请求拦截器
    service.interceptors.request.use(
    config => {
     if (config.url.indexOf(‘/login‘) === -1) {
       // 设置用户名
       const name = store.getters.name
       let urlName
       let curl = config.url
       curl = curl.split(‘?‘)[0] || curl
       // 将请求地址转为中文
       for (const k in pathToname) {
         if (curl === k) {
           urlName = pathToname[k]
         } else {
           const kurl = k
           const turl = curl
           const karr = kurl.split(‘/‘)
           if (karr[karr.length - 1] === ‘*‘) {
             // 代表最后一位为*
             karr.splice(karr.length - 1, 1)
             const karr1 = turl.split(‘/‘)
             karr1.splice(karr1.length - 1, 1)
             const str = karr.join(‘/‘)
             const str2 = karr1.join(‘/‘)
             if (str === str2) {
               urlName = pathToname[k]
             }
           } else {
             karr.splice(karr.length - 2, 1)
             const str = karr.join(‘/‘)
             const karr1 = turl.split(‘/‘)
             karr1.splice(karr1.length - 2, 1)
             const str2 = karr1.join(‘/‘)
             if (str === str2) {
               urlName = pathToname[k]
             }
           }
         }
       }
       // urlName = urlName || ‘其他‘
       urlName = urlName || config.url
       window._paq.push([‘setCustomUrl‘, `${document.URL.split(‘/#‘)[0]}${curl}123`])
       window._paq.push([‘setDocumentTitle‘, urlName])
       window._paq.push([‘setUserId‘, name])
       window._paq.push([‘trackPageView‘])
     }
    复制代码

当然,我这里用的是js的方式原理是一样的,上面的代码,是我对统计的地址名做了中文化的匹配.因为接口的多样性,需要做一个处理,比如说,路径传参中, 其实只是参数变了,地址没变, 这个时候不能算一个新的地址, 所以就需要匹配处理. 代码没写太复杂, 一步一步深入,基本上很容易懂.

附上pathname的代码. 用于将地址匹配为中文统计,:

const changeName = {
// goods相关API
‘/pdc/api/v1/dic/query‘: ‘基础档案管理-获取货品信息‘,
‘/pdc/api/v1/product/query‘: ‘基础档案管理-获取货品详情‘,
// role相关API
‘/api/root/list‘: ‘基础-获取菜单权限‘,
‘/api/createRole‘: ‘权限管理-创建角色‘,
‘/api/checkRoleName‘: ‘权限管理-查询角色是否存在‘,
‘/api/custom/master/permission‘: ‘权限管理-获取外部客户角色列表‘,
‘/api/internal/user/info‘: ‘基础-获取用户信息‘,
// statement相关API
‘/statement/financialForm‘: ‘财务管理-获取JIT财务列表‘,
‘/statement/export‘: ‘财务管理-导出JIT财务报表‘,
‘/statement/count‘: ‘财务管理-获取JIT数据总条目‘,
// trade相关API(待定)
// user相关API
‘/api/internal/user/list‘: ‘权限管理-获取外部用户列表‘,
‘/api/internal/custom/list‘: ‘权限管理-获取外部客户列表‘,
‘/user/create‘: ‘权限管理-创建用户‘,
‘/user/update‘: ‘权限管理-修改用户信息‘,
‘/api/user/password‘: ‘权限管理-修改用户密码‘,
// 订单列表相关API
‘/order/api/v1/orderConfirmation‘: ‘B2B交易管理-提交订单‘,
‘/order/api/v1/serviceApprove‘: ‘B2B交易管理-确认订单‘,
‘/order/api/v1/serviceRefuse‘: ‘B2B交易管理-拒绝订单‘,
‘/order/api/v1/getDispatchSelectInfo‘: ‘B2B交易管理-获取订单字典数据‘,
‘/order/api/v1/import/productList‘: ‘B2B交易管理-导入订单数据‘,
‘/order/api/v1/*/orderInformation‘: ‘B2B交易管理-获取订单基本信息‘,
‘/order/api/v1/*/customerCode‘: ‘B2B交易管理-检查客户代码是否存在‘,
‘/order/api/v1/*/discount‘: ‘B2B交易管理-导入订单折扣‘,
‘/order/api/v1/*/occupyInventory‘: ‘B2B交易管理-导出占库结果‘,
‘/order/api/v1/createDispatch‘: ‘B2B交易管理-提交发货单‘,
‘/order/api/vi/dispatchCancel‘: ‘B2B交易管理-取消发货单‘,
‘/order/api/vi/*/orderCancel‘: ‘B2B交易管理-取消订单‘,
‘/order/api/v1/dispatchApprove‘: ‘B2B交易管理-同意发货单‘,
‘/order/api/v1/dispatchRefuse‘: ‘B2B交易管理-拒绝发货单‘,
‘/order//api/v1/confirmSubmissionApproval‘: ‘B2B交易管理-订单提交审批‘,
‘/order/api/v1/orderStatus‘: ‘B2B交易管理-获取订单状态‘,
‘/bff/api/v1/dispatch/*‘: ‘ODS管理-获取发货单基本信息‘,
‘/bff/api/v1/receive/*‘: ‘ODS管理-获取收货单基本信息‘,
‘/bff/api/v1/vend-cust‘: ‘ODS管理-获取客商列表信息‘,
‘/bff/api/v1/warehouses‘: ‘ODS管理-实时获取仓库信息‘,
‘/bff/api/v1/dict/type‘: ‘ODS管理-仓库类型查询‘,
‘/bff/api/v1/dispatch/_export‘: ‘ODS管理-导出发货单信息‘,
‘/bff/api/v1/receive/_export‘: ‘ODS管理-导出收货单信息‘,
‘/bff/api/v1/dict/type/_list‘: ‘ODS管理-查询字典数据‘,
‘/bff/api/v1/dispatch/_page‘: ‘ODS管理-查询发货单列表‘,
‘/order/api/v1/orderList‘: ‘B2B交易管理-查询订单列表‘,
‘/order/api/v1/orderDetail‘: ‘B2B交易管理-获取订单商品列表‘,
‘/order/api/v1/orderDispatchInfo‘: ‘B2B交易管理-获取订单发货单信息‘,
‘/order/api/v1/dispatchList‘: ‘B2B交易管理-获取订单发货单列表‘,
‘/order/api/v1/confirm‘: ‘B2B交易管理-修改占库结果‘,
‘/order/api/v1/toBeConfirmedDispatch‘: ‘B2B交易管理-查看历史发货单信息‘,
‘/order/api/v1/cumulativeState‘: ‘B2B交易管理-获取占库结果信息‘
}
export default changeName
复制代码

其他的就不赘述了,中文转化方面, 各人有各人的理解, 能达到效果就行.

js方式的统计也是类似的.有需要的话,评论留言,我后续传上来.

结语

Vue-matomo流量统计这块,就算整理完成了, 实际项目中已经正常使用,所以正常来讲应该不会出现问题. 加油, 各位

原文地址:https://www.cnblogs.com/mouseleo/p/12083103.html

时间: 2024-10-29 18:24:00

Vue中使用matomo进行访问流量统计的实现的相关文章

iOS 流量统计

在开发中,有时候需要获取流量统计信息.研究发现:通过函数getifaddrs来得到系统网络接口的信息,网络接口的信息,包含在if_data字段中, 有很多信息, 但我现在只关心ifi_ibytes, ifi_obytes, 应该就是接收到的字节数和发送的字节数, 加起来就是流量了.还发现,接口的名字, 有en, pdp_ip, lo等几种形式,en应该是wifi, pdp_ip大概是3g或者gprs, lo是环回接口, 通过名字区分可以分别统计. 1.导入必要头文件 #include <ifad

Android中进行流量统计

// ---------------------流量统计-------------------------------- try { PackageManager pm = getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo("com.test.app", PackageManager.GET_ACTIVITIES);// com.test.app为自己应用的包名 Log.d("!!", &

Android应用流量统计——NetworkStatsManager使用

在没有Root的情况下,Android应用流量统计在6.0之前一直没有太好的办法,官方虽然提供了TrafficStats,但其主要功能是设备启动以来流量的统计信息,和时间信息无法很好的配合.最近再看TrafficStats类时,发现说明中提到,为获取更具鲁棒性的网络历史数据,建议使用NetworkStatsManager. 本文首先简单对比下TrafficStats和NetworkStatsManager各自的限制和优缺点,然后详细说明NetworkStatsManager的用法,并给出主要代码

网站流量统计(免费的)

我们在网站上经常看到这个图标如下: 这个就是统计当前网站的访问量的,可以查看访问的IP,访问的次数 , 1.CNZZ数据专家网站首页 全球最大的网站统计分析平台 http://www.cnzz.com/ 2.免费注册 3.获取统计代码 4.将统计代码直接粘贴到开发的代码中 一把在底部显示,这段代码放到JSP页面上就可以了 5.查看密码 在网站上,点击统计的图标,进入查看密码页面,需要输入密码,就可以看到本网站的统计量. 设置查看密码: 上述第二步中,有个查看密码,点击进行设置,就可以了. 网站流

PHP学习笔记:php网络流量统计系统

 说明:代码来源<PHP和MySQL Web应用开发>一书,还有就是代码有些是经过修改的,经过我的测验全部都可以用. 这里面ip地址显示的正常的,我电脑是支持 ipv6 的. 本示例的数据库脚本 ~~~ 先执行 set names gbk;   (因为脚本中包含中文)再执行语句: source d:\test\Vote.sql; CREATE DATABASE IF NOT EXISTS FluxStat COLLATE 'gb2312_chinese_ci'; USE FluxStat; C

网站流量统计之PV和UV

转自:http://blog.csdn.NET/webdesman/article/details/4062069 如果您是一个站长,或是一个SEO,您一定对于网站统计系统不会陌生,对于SEO新手来说,统计系统中的一些概念不是很清楚,今天讲讲什么是PV和UV! 网站流量统计之UV(Unique Visitor):独立访客,将每个独立上网电脑(以cookie为依据)视为一位访客,一天之内(00:00-24:00),访问您网站的访客数量.一天之内相同cookie的访问只被计算1次. 网站流量统计之P

网站流量统计系统 phpMyVisites

phpMyVisites是一个网站流量统计系统,它能够提供非常详细的统计报告和高级图形报表.phpMyVisites不是一个Apache log分析工具,它建有自己的log.它的特点包括: 安装部署:提供可视化的安装向导,并且使用简单只要把一段简单的Javascript代码添加到你网站的页面中就能够马上开始收集访问者的信息. 一个简洁,友好的界面可用来展示数据和帮助数据分析. 提供简洁,明了的图形分析报表. 安全:phpMyVisites能够最大限度地阻止入侵和外部攻击. 支持多网站统计 多用户

脚本分享:根据访问日志统计网站每日PV、总带宽、IP统计、url统计等

在平时的运维工作中,我们运维人员需要清楚自己网站每天的总访问量.总带宽.ip统计和url统计等. 虽然网站已经在服务商那里做了CDN加速,所以网站流量压力都在前方CDN层了 像每日PV,带宽,ip统计等数据也都可以在他们后台里查看到的. ------------------------------------------------------------------------------在这里,还是分享一个很早前用到过的shell统计脚本,可以结合crontab计划任务,每天给你的邮箱发送一

mincount嵌入式流量统计系统之数据库篇

这个系列上一篇还是2012-08-01,而开始研究他应该在2011年了.时间过得很快,今年已经是2015年了.这个现在看技术含量已经不是很高了,甚至还有点瑕疵.不管怎么样,我还是先讲我原来的设计想法吧. 根据我当初的设计嵌入式,到数据库这一个阶段我用同一个存储过程设计了多个数据库写法,最先完善的用的是mysql,它主要工作就是将前端传递过来的数据进行处理分发,程序端不需要太多的逻辑(我当初的想法)直接作为一个传送带,将数据发送到数据库中.下面是我的mysql代码: 1 # MySQL-Front