|
|
import { ref, onMounted, onBeforeUnmount, watch } from "vue"; import { useRouter } from "vue-router"; import { computedUsersAPI, useAiGodAPI, updateStayTimeAPI, addUsageAPI, } from "@/api/AIxiaocaishen";
export function useProjectTracking(projectRoutes) { const router = useRouter(); const entryTime = ref(Date.now()); const isInProject = ref(true); const hasRecordedEntry = ref( sessionStorage.getItem("hasRecordedEntry") === "true" ); // const parentUrl = window.parent.location.href
// console.log('Link平台地址:', parentUrl)
let isPageRefreshing = false; // 标志位:是否刷新页面
// 记录用户进入项目的时间
const recordEntryTime = () => { if (hasRecordedEntry.value) { return; }
entryTime.value = Date.now(); const date = new Date(entryTime.value); const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1) .toString() .padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")} ${date .getHours() .toString() .padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date .getSeconds() .toString() .padStart(2, "0")}`;
sessionStorage.setItem("projectEntryTime", formattedDate); sessionStorage.setItem("hasRecordedEntry", "true"); isInProject.value = true; hasRecordedEntry.value = true;
const token = localStorage.getItem("localToken"); if (token) { const result = useAiGodAPI({ token: token, }); console.log(result); // const result2 = addUsageAPI({
// token: token,
// })
// console.log(result2);
} else { console.log("没有token"); } console.log("记录首次进入时间:", formattedDate); };
// 发送追踪数据到后端
const sendTrackingData = async () => { if (!isInProject.value) return;
const storedEntryTime = sessionStorage.getItem("projectEntryTime"); if (!storedEntryTime) { console.warn("未找到存储的进入时间,取消发送跟踪数据"); return; }
let timestamp; try { timestamp = new Date(storedEntryTime.replace(" ", "T")).getTime(); if (isNaN(timestamp)) throw new Error("无效日期"); } catch (error) { console.error("解析存储的进入时间时出错:", error); return; }
const exitTime = Date.now(); const duration = Math.floor((exitTime - timestamp) / 1000); const localToken = localStorage.getItem("localToken"); console.log("进入项目的时间", storedEntryTime); console.log("停留时间", duration);
const params = { stayTime: duration, // loginTime: storedEntryTime,
token: localToken, };
if (localToken) { try { const res = await updateStayTimeAPI(params); console.log("跟踪数据已发送:", res); sessionStorage.removeItem("projectEntryTime"); sessionStorage.removeItem("hasRecordedEntry"); isInProject.value = false; hasRecordedEntry.value = false; } catch (error) { console.error("发送跟踪数据失败:", error); } } };
// 页面可见性变化时触发
const handleVisibilityChange = () => { // console.log(window.location.pathname.includes('duobaoqibing'), '路径是否包含了页面不可见触发')
// if (window.location.pathname.includes('duobaoqibing')) {
// console.log('在 searchCode.html 页面,不发送数据')
// return
// }
if (document.visibilityState === "hidden") { console.log("页面不可见,用户可能离开或切换标签页"); sendTrackingData(); } };
// 页面关闭或刷新时触发
const handleBeforeUnload = (event) => { // console.log(window.location.pathname)
// console.log(
// window.location.pathname.includes('duobaoqibing'),
// '路径是否包含了页面关闭了啦啦啦啦啦啦触发'
// )
// if (window.location.pathname.includes('duobaoqibing')) {
// console.log('在 searchCode.html 页面,不发送数据')
// return
// }
if (isPageRefreshing) { console.log('页面刷新,不触发数据发送') return }
console.log("页面即将关闭或跳转"); sendTrackingData(); };
const handleRefreshDetection = () => { isPageRefreshing = true; };
// 监听路由变化
watch( () => router.currentRoute.value.path, (newPath) => { const isProjectRoute = projectRoutes.some((route) => newPath.startsWith(route) ); let isProjectRouteName = projectRoutes[0]; console.log(isProjectRouteName); // 判断是否是 searchCode.html 的访问
const isSearchCodePage = window.location.pathname.includes("duobaoqibing"); if (!isProjectRoute && !isSearchCodePage) { console.log("离开项目路由:", newPath); sendTrackingData(); } else if (isProjectRouteName && !hasRecordedEntry.value) { console.log("首次进入项目路由:", newPath); recordEntryTime(); } } );
// 添加事件监听
onMounted(() => { document.addEventListener("visibilitychange", handleVisibilityChange); window.addEventListener("beforeunload", handleBeforeUnload); window.addEventListener("unload", handleRefreshDetection); });
// 移除事件监听
onBeforeUnmount(() => { document.removeEventListener("visibilitychange", handleVisibilityChange); window.removeEventListener("beforeunload", handleBeforeUnload); window.removeEventListener("unload", handleRefreshDetection); });
return { entryTime, isInProject, sendTrackingData, }; }
|