فهرست منبع

新增了对切屏次数的统计

Jiang Pengyu 4 ماه پیش
والد
کامیت
8d7a4f91a5
4فایلهای تغییر یافته به همراه84 افزوده شده و 2 حذف شده
  1. 1 0
      .gitignore
  2. 5 0
      src/apis/behavior.ts
  3. 22 2
      src/views/EditPage/EditPage.vue
  4. 56 0
      src/views/EditPage/userWritingRecord.ts

+ 1 - 0
.gitignore

@@ -14,6 +14,7 @@ dist-ssr
 coverage
 *.local
 
+/docs
 /cypress/videos/
 /cypress/screenshots/
 

+ 5 - 0
src/apis/behavior.ts

@@ -1,4 +1,5 @@
 import axiosInstance from "@/apis/axios.config";
+import type {WindowSwitchData} from "@/views/EditPage/userWritingRecord";
 
 const PREFIX = "/api/behaviorRecord"
 
@@ -63,6 +64,10 @@ const bevaviorApis = {
             }
         })
     },
+    // 上报窗口切换统计数据
+    reportWindowSwitch: (data: WindowSwitchData) => {
+        return axiosInstance.post(`${PREFIX}/windowSwitch`, data)
+    },
 }
 
 export default bevaviorApis;

+ 22 - 2
src/views/EditPage/EditPage.vue

@@ -36,7 +36,7 @@
   import {useRoute} from 'vue-router'
   import {ElMessageBox} from "element-plus";
   import IndexedDB from "@/utils/indexedDBUtil";
-  import {isModified, registerAllEventListeners, removeAllEventListeners} from "@/views/EditPage/userWritingRecord";
+  import {isModified, registerAllEventListeners, removeAllEventListeners, getWindowSwitchData, resetWindowSwitchData} from "@/views/EditPage/userWritingRecord";
   import emitter from "@/utils/emitter";
 
   // 获得路由中的assignmentId
@@ -130,9 +130,29 @@
     await saveAIDialogue()
   })
 
+  // 监听暂存事件,每次暂存时上报窗口切换数据并重置计数
+  emitter.on('click-stage', async () => {
+    await reportWindowSwitchData()
+    resetWindowSwitchData()
+  })
+
+  // 上报窗口切换数据到后端
+  const reportWindowSwitchData = async () => {
+    try {
+      const data = getWindowSwitchData(store.user.id, assignmentId)
+      if (data.switchCount > 0) {
+        await apis.reportWindowSwitch(data)
+        console.log('窗口切换数据已上报, 切换次数:', data.switchCount)
+      }
+    } catch (error) {
+      console.error('上报窗口切换数据失败:', error)
+    }
+  }
+
   onMounted( () => {
     fetchData()
     // indexedDB.initDB("eventId")
+    resetWindowSwitchData()
     registerAllEventListeners(indexedDB);
   })
 
@@ -141,8 +161,8 @@
     // indexedDB.closeDB()
     // indexedDB.deleteDBAll()
     removeAllEventListeners();
-    // 清理事件监听器
     emitter.off('save-ai-dialogue-before-submit');
+    emitter.off('click-stage');
   })
 
 </script>

+ 56 - 0
src/views/EditPage/userWritingRecord.ts

@@ -5,6 +5,60 @@ import {ref} from "vue";
 
 export let isModified = ref(false)
 
+// ---- 窗口切换统计 ----
+export interface WindowSwitchEvent {
+    eventType: 'hidden' | 'visible';
+    timestamp: string;
+}
+
+export interface WindowSwitchData {
+    studentId: number;
+    assignmentId: number;
+    switchCount: number;
+    switchEvents: WindowSwitchEvent[];
+}
+
+// 离开窗口的总次数(visibilityState 变为 hidden 的次数)
+export const windowSwitchCount = ref(0)
+// 每次切换的详细记录
+export const windowSwitchEvents = ref<WindowSwitchEvent[]>([])
+
+let visibilityChangeHandler: (() => void) | null = null
+
+export const setupWindowSwitchListener = () => {
+    visibilityChangeHandler = () => {
+        const eventType = document.visibilityState === 'hidden' ? 'hidden' : 'visible'
+        if (eventType === 'hidden') {
+            windowSwitchCount.value++
+        }
+        windowSwitchEvents.value.push({
+            eventType,
+            timestamp: new Date().toISOString()
+        })
+    }
+    document.addEventListener('visibilitychange', visibilityChangeHandler)
+}
+
+export const removeWindowSwitchListener = () => {
+    if (visibilityChangeHandler) {
+        document.removeEventListener('visibilitychange', visibilityChangeHandler)
+        visibilityChangeHandler = null
+    }
+}
+
+export const resetWindowSwitchData = () => {
+    windowSwitchCount.value = 0
+    windowSwitchEvents.value = []
+}
+
+export const getWindowSwitchData = (studentId: number, assignmentId: number): WindowSwitchData => ({
+    studentId,
+    assignmentId,
+    switchCount: windowSwitchCount.value,
+    switchEvents: [...windowSwitchEvents.value]
+})
+// ---- 窗口切换统计结束 ----
+
 // 处理word区鼠标移动的记录
 // export const setupWordMouseMoveListener = (indexedDB: IndexedDB) => {
 //     emitter.on("word-mouse-move", (event: any) => {
@@ -33,6 +87,7 @@ export const registerAllEventListeners = (indexedDB: IndexedDB) => {
     // 后续若有其他事件监听,在此处添加调用对应的设置函数即可
     setupClickAISendButtonListener(indexedDB);
     setupIsModifiedListener();
+    setupWindowSwitchListener();
     // setupWordMouseMoveListener(indexedDB)
 };
 
@@ -41,5 +96,6 @@ export const removeAllEventListeners = () => {
     // 后续如有更多事件监听,在此处添加移除对应事件的代码
     emitter.off("click-ai-send-button");
     emitter.off("is-modified");
+    removeWindowSwitchListener();
     // emitter.off("word-mouse-move");
 };