From ec278a03b79d78c10963d18b2208ea9a83dacbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B3=BD-huangze-=E5=A4=A9=E6=B4=A5=E6=98=93?= =?UTF-8?q?=E5=95=86=E6=95=B0=E6=99=BA?= Date: Tue, 10 Jun 2025 17:39:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=A5=9E=E7=AD=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1SDK=E5=8F=8A=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 45 ++++++++++++++++++++++++++++++++--------- src/utils/plugins/sa.ts | 1 + src/utils/url/tools.ts | 3 +++ 3 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 src/utils/url/tools.ts diff --git a/src/main.ts b/src/main.ts index 62dd6af..39fe288 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ import 'amfe-flexible'; import 'core-js/stable'; import 'regenerator-runtime/runtime'; -import { createApp } from 'vue'; +import { createApp, inject } from 'vue'; import { createPinia } from 'pinia'; import App from './App.vue'; import router from './router'; @@ -16,6 +16,7 @@ import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination'; import { sensorsData } from './utils/plugins/sa'; +import { isCollectUrl } from './utils/url/tools'; const app = createApp(App); @@ -30,12 +31,31 @@ declare global { appBridge?: any; } } + +// 页面停留时间 +let pageStayTime = 0; + // 定义路由是否可以返回的判断 const routerCanGoBack = () => { const position = router.options.history.state?.position; return typeof position === 'number' && position > 0; }; router.beforeEach((to, from, next) => { + // 离开页面的时候结束记录时间 + const duration = Date.now() - pageStayTime; + pageStayTime = 0; + + const collectUrl = ['/ad/', '/share/']; + console.log(`is collect page`, collectUrl.some((url) => from.path.startsWith(url))); + + // 判断是否离开需要采集的页面 + if (collectUrl.some((url) => from.path.startsWith(url))) { + // alert(`duration: ${duration}`); + const sensors = inject('sensors'); + sensors.track('pageStayTime', { + duration + }); + } if (to.meta?.title) document.title = to.meta.title as string; if (to.query.digitalYiliToken) { @@ -52,6 +72,12 @@ router.beforeEach((to, from, next) => { }; next(); }); + +router.afterEach((to, from) => { + // 页面导航结束的时候开始记录时间 + pageStayTime = Date.now(); + +}); app.use(createPinia()); app.use(router); // 神策数据插件 @@ -63,22 +89,21 @@ app.use(sensorsData(), { scrollmap: { // Web 视区停留 collect_url: function () { - // 根据不同的页面采集不同的数据 - if (location.href.includes('/ad/')) { - console.log('采集广告页面'); + // 需要采集的页面 + const urls = ['/ad/', '/share/']; + console.log(`collect_url`, isCollectUrl(urls)); - return true; - } - console.log('不采集'); - return false; + return isCollectUrl(urls); } }, heatmap: { //是否开启触达图,default 表示开启,自动采集 $WebStay 事件,可以设置 'not_collect' 表示关闭。 //需要 Web JS SDK 版本号大于 1.9.1 - scroll_notice_map: 'not_collect', + scroll_notice_map: 'default', scroll_delay_time: 4000, - scroll_event_duration: 18000 //单位秒,预置属性停留时长 event_duration 的最大值。默认5个小时,也就是300分钟,18000秒。 + //单位秒,预置属性停留时长 event_duration 的最大值。默认5个小时,也就是300分钟,18000秒。 + scroll_event_duration: 18000, + get_vtrack_config: true } }); app.mount('#app'); diff --git a/src/utils/plugins/sa.ts b/src/utils/plugins/sa.ts index 6602db7..fa1ccad 100644 --- a/src/utils/plugins/sa.ts +++ b/src/utils/plugins/sa.ts @@ -31,6 +31,7 @@ export function sensorsData() { // 注册公共属性 sensors.registerPage({ + platform: 'h5', current_url: location.href, referrer: document.referrer }); diff --git a/src/utils/url/tools.ts b/src/utils/url/tools.ts new file mode 100644 index 0000000..bdb91e4 --- /dev/null +++ b/src/utils/url/tools.ts @@ -0,0 +1,3 @@ +export function isCollectUrl(urls: string[]) { + return urls.some((url) => location.href.includes(url)); +}