Michael Wang il y a 4 ans
Parent
commit
a894e5af62

+ 27 - 2
src/components/mark/Mark.vue

@@ -6,11 +6,12 @@
 </template>
 
 <script lang="ts">
-import { reactive, defineComponent, onMounted, toRefs } from "vue";
-import { getSetting, getStatus } from "@/api/markPage";
+import { defineComponent, onMounted, toRefs } from "vue";
+import { getGroup, getSetting, getStatus, getTask } from "@/api/markPage";
 import { store } from "./store";
 import MarkHeader from "./MarkHeader.vue";
 import MarkBody from "./MarkBody.vue";
+import { useTimers } from "@/setups/useTimers";
 
 export default defineComponent({
   name: "Mark",
@@ -19,6 +20,8 @@ export default defineComponent({
     MarkBody,
   },
   setup: () => {
+    const { addInterval } = useTimers();
+
     async function updateSetting() {
       const settingRes = await getSetting();
       store.setting = settingRes.data;
@@ -27,9 +30,31 @@ export default defineComponent({
       const res = await getStatus();
       store.status = res.data;
     }
+    async function updateGroups() {
+      const res = await getGroup();
+      store.groups = res.data;
+    }
+    async function updateTask() {
+      const res = await getTask();
+      if (res.data.libraryId) {
+        store.tasks.push(res.data);
+        store.currentTask = store.tasks[0];
+      }
+    }
+
+    // 5秒更新一次tasks
+    addInterval(() => {
+      // console.log("get task", store.tasks);
+      if (store.tasks.length < 3) {
+        updateTask();
+      }
+    }, 5 * 1000);
+
     onMounted(() => {
       updateSetting();
       updateStatus();
+      updateGroups();
+      updateTask();
     });
     return { store };
   },

+ 5 - 2
src/components/mark/MarkHeader.vue

@@ -39,7 +39,7 @@
     >
       时钟
     </div>
-    <div>{{ store.setting.groupNumber }}(切换)</div>
+    <div>{{ group?.title }}(切换)</div>
     <div>{{ store.setting.marker?.name }}</div>
     <div>退出</div>
   </div>
@@ -60,7 +60,10 @@ export default defineComponent({
       p = Math.floor(p * 100);
       return p;
     });
-    return { store, progress };
+    const group = computed(() => {
+      return store.groups.find((g) => g.number === store.setting.groupNumber);
+    });
+    return { store, progress, group };
   },
 });
 </script>

+ 23 - 1
src/components/mark/store.ts

@@ -4,8 +4,30 @@ import { reactive } from "vue";
 const obj = {
   setting: {
     mode: "TRACK",
+    examType: "SCAN_IMAGE",
+    forceMode: false,
+    sheetView: false,
+    sheetConfig: [],
+    enableAllZero: false,
+    fileServer: "",
+    marker: <Setting["marker"]>{},
+    subject: <Setting["subject"]>{},
+    forceSpecialTag: false,
+    uiSetting: <Setting["uiSetting"]>{},
+    statusValue: "FORMAL",
+    problemTypes: [],
+    groupNumber: 0,
+    topCount: 0,
+    splitConfig: [],
+    prefetchCount: 3,
+    startTime: 0,
+    endTime: 0,
   },
-  status: {},
+  status: <MarkStore["status"]>{},
+  groups: [],
+  tasks: [],
+  currentTask: <MarkStore["currentTask"]>{},
+  markResults: [],
 } as MarkStore;
 
 /** 保存setting和task */

+ 42 - 0
src/setups/useTimers.ts

@@ -0,0 +1,42 @@
+import { onUnmounted } from "vue";
+
+/**
+ * 自动添加和清除timer
+ */
+export function useTimers() {
+  const mixin__intervals: number[] = [];
+  const mixin__timeouts: number[] = [];
+
+  /**
+   * 会在 beforeDestory 中自动清除
+   * @param {function} fn 要执行的函数
+   * @param {number} interval 执行间隔ms
+   */
+  function addInterval(fn: Function, interval: number) {
+    const i = setInterval(fn, interval);
+    mixin__intervals.push(i);
+  }
+  /**
+   * 会在 beforeDestory 中自动清除
+   * @param {function} fn 要执行的函数
+   * @param {number} timeout 触发时间ms
+   */
+  function addTimeout(fn: Function, timeout: number) {
+    const i = setTimeout(fn, timeout);
+    mixin__timeouts.push(i);
+  }
+
+  onUnmounted(() => {
+    for (const i of mixin__intervals) {
+      clearInterval(i);
+    }
+    for (const i of mixin__timeouts) {
+      clearTimeout(i);
+    }
+  });
+
+  return {
+    addInterval,
+    addTimeout,
+  };
+}

+ 0 - 9
src/shims-vue.d.ts

@@ -3,12 +3,3 @@ declare module "*.vue" {
   const component: DefineComponent<{}, {}, any>;
   export default component;
 }
-
-import { ComponentCustomProperties } from "vue";
-import filters from "@/filters";
-
-declare module "@vue/runtime-core" {
-  interface ComponentCustomProperties {
-    $filters: typeof filters;
-  }
-}

+ 8 - 0
src/types/global.d.ts

@@ -0,0 +1,8 @@
+import Vue, { ComponentCustomProperties } from "vue";
+import filters from "@/filters";
+
+declare module "@vue/runtime-core" {
+  interface ComponentCustomProperties {
+    $filters: typeof filters;
+  }
+}

+ 3 - 2
src/types/index.ts

@@ -18,7 +18,8 @@ export interface Setting {
   mode: ModeEnum; //模式 TRACK/COMMON
   forceMode: boolean; //强制模式切换
   sheetView: boolean; //是否显示原图功能
-  sheetConfig: [SingleSheetConfig]; //原图遮盖规则
+  sheetConfig: Array<SingleSheetConfig>; //原图遮盖规则
+  enableAllZero: boolean; // 是否开启全零分
   fileServer: string; //图片服务地址
   marker: { id: number; name: string }; //评卷员信息
   subject: {
@@ -31,7 +32,7 @@ export interface Setting {
   forceSpecialTag: boolean; //强制标记是否开启 forceTag
   uiSetting: UISetting;
   statusValue: "TRIAL" | "FORMAL" | "FINISH"; //只显示试评名称  TRIAL("试评"), FORMAL("正评"), FINISH("结束")
-  problemTypes: [{ id: number; name: string }]; //问题卷类型
+  problemTypes: Array<{ id: number; name: string }> | []; //问题卷类型
   groupNumber: number; //评卷分组
   topCount: number; //限制提示数量
   splitConfig: Array<number>; //使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55],