浏览代码

测试store

Michael Wang 4 年之前
父节点
当前提交
0a3781a17f
共有 5 个文件被更改,包括 207 次插入14 次删除
  1. 3 0
      src/App.vue
  2. 10 3
      src/components/TestStatus.vue
  3. 17 0
      src/components/TestStore.vue
  4. 11 11
      src/devLogin.ts
  5. 166 0
      src/store/index.ts

+ 3 - 0
src/App.vue

@@ -1,4 +1,5 @@
 <template>
+  <TestStore />
   <TestStatus />
   <TestSetting />
 </template>
@@ -7,12 +8,14 @@
 import { defineComponent } from "vue";
 import TestStatus from "./components/TestStatus.vue";
 import TestSetting from "./components/TestSetting.vue";
+import TestStore from "./components/TestStore.vue";
 
 export default defineComponent({
   name: "App",
   components: {
     TestStatus,
     TestSetting,
+    TestStore,
   },
   // setup() {
   //   console.log("inside App.vue setup");

+ 10 - 3
src/components/TestStatus.vue

@@ -6,10 +6,13 @@
   <div>markedCount: {{ markedCount }}</div>
   <div>problemCount: {{ problemCount }}</div>
   <div>arbitrateCount: {{ arbitrateCount }}</div>
+  <div>mode: {{ store.setting.mode }}</div>
 </template>
 
 <script lang="ts">
 import { reactive, defineComponent, onMounted, toRefs } from "vue";
+import { store } from "../store";
+
 export default defineComponent({
   name: "TestStatus",
   setup: () => {
@@ -26,10 +29,14 @@ export default defineComponent({
       const statusRes = await (
         await fetch("/mark/getStatus", { method: "POST" })
       ).json();
-      const groupStatus = await (
+      const groupRes = await (
         await fetch("/mark/getGroup", { method: "POST" })
       ).json();
-      console.log(groupStatus);
+      console.log(groupRes);
+      const taskRes = await (
+        await fetch("/mark/getTask", { method: "POST" })
+      ).json();
+      console.log(taskRes);
       console.log(statusRes, statusRes.totalCount);
       state.valid = statusRes.valid;
       state.totalCount = statusRes.totalCount;
@@ -41,7 +48,7 @@ export default defineComponent({
     onMounted(() => {
       updateCount();
     });
-    return toRefs(state);
+    return { ...toRefs(state), store };
   },
 });
 </script>

+ 17 - 0
src/components/TestStore.vue

@@ -0,0 +1,17 @@
+<template>
+  <div>mode: {{ state.setting.mode }}</div>
+  <div><button @click="toggleMode">toggle mode</button></div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from "vue";
+import { store, toggleMode } from "../store";
+
+export default defineComponent({
+  setup() {
+    console.log(store);
+
+    return { state: store, toggleMode };
+  },
+});
+</script>

+ 11 - 11
src/devLogin.ts

@@ -12,16 +12,16 @@ export async function initLogin() {
       f.append("markerId", "367");
 
       return fetch("/mark/subject-select", { body: f, method: "POST" });
-    })
-    .then(() => {
-      console.log("login completed");
-      return fetch("/mark/status");
-    })
-    .then(async (r) => {
-      console.log(await r.json());
-      return fetch("/mark/gettask");
-    })
-    .then(async (r) => {
-      console.log(await r.json());
     });
+  // .then(() => {
+  //   console.log("login completed");
+  //   return fetch("/mark/status");
+  // })
+  // .then(async (r) => {
+  //   console.log(await r.json());
+  //   return fetch("/mark/gettask");
+  // })
+  // .then(async (r) => {
+  //   console.log(await r.json());
+  // });
 }

+ 166 - 0
src/store/index.ts

@@ -0,0 +1,166 @@
+import { reactive } from "vue";
+
+export interface Store {
+  setting: Setting;
+  groups: Array<Group>;
+  status: {
+    personCount: number; //个人评卷数量
+    markedCount: number; //总评卷数量
+    totalCount: number; //总数量
+    problemCount: number; //问题卷数量
+    arbitrateCount: number; //待仲裁卷数量
+  };
+  tasks: Array<Task>; // 保持数量为3
+  currentTask: Task; // 用来切换task,还有回看
+  markResults: Array<MarkResult>;
+}
+
+interface Setting {
+  examType: "SCAN_IMAGE" | "MULTI_MEDIA"; // 扫描图片或者多媒体,多媒体只允许 common mode
+  mode: "TRACK" | "COMMON"; //模式 TRACK/COMMON
+  forceMode: boolean; //强制模式切换
+  sheetView: boolean; //是否显示原图功能
+  sheetConfig: [SingleSheetConfig]; //原图遮盖规则
+  fileServer: string; //图片服务地址
+  marker: { id: number; name: string }; //评卷员信息
+  subject: {
+    //科目信息(试卷和答案功能)
+    name: string;
+    code: string;
+    answerUrl: string;
+    paperUrl: string;
+  };
+  forceSpecialTag: boolean; //强制标记是否开启 forceTag
+  uiSetting: {
+    "score.board.collapse": boolean;
+  };
+  statusValue: "TRIAL" | "FORMAL" | "FINISH"; //只显示试评名称  TRIAL("试评"), FORMAL("正评"), FINISH("结束")
+  problemTypes: [{ id: number; name: string }]; //问题卷类型
+  groupNumber: number; //评卷分组
+  topCount: number; //限制提示数量
+  splitConfig: Array<number>; //使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55],
+  prefetchCount: number; //预加载任务数量
+  startTime: number; //评卷开始时间
+  endTime: number; //评卷结束时间
+}
+
+interface SingleSheetConfig {
+  i: number; // index of sheets
+  w: number; // width
+  h: number; // height
+  x: number; // x 左上角为 (0, 0)
+  y: number; // y 左上角为 (0, 0)
+}
+
+interface Group {
+  markerId: number;
+  number: number;
+  title: string;
+  markedCount: number; //总评卷数量
+  totalCount: number; //总数量
+}
+
+interface Task {
+  libraryId: number;
+  studentId: number;
+  secretNumber: string;
+  studentName: string; //后端处理是否显示
+  studentCode: string;
+  examNumber: string;
+  subject: { name: string; code: string };
+  sliceUrls: Array<string>; //裁切图url
+  sliceConfig: Array<PictureSlice>; //最高显示优先级
+  jsonUrl: string; // sliceUrls为空,则是多媒体阅卷,显示JSON
+  questionList: Array<Question>;
+  currentQuestion: number; // 前端添加和使用的属性; 通过index去questionList去定位question,然后找到大题号、小题号
+  specialTagList: Array<SpecialTag>;
+
+  sheetUrls: Array<string>; //原图url
+  objectiveScore: number; //客观分 复核也用到
+
+  markerScore: number; // 评卷总分
+  markTime: number; //评卷时间
+  self: boolean; // 是否自评,暂时用不着
+  previous: boolean; // 是否回评
+  rejected: boolean; // 是否是打回
+}
+
+interface Question {
+  groupNumber: number; // 分组序号
+  mainNumber: number; // 大题号
+  subNumber: string; // 小题号
+  intervalScore: number; // 分数间隔
+  defaultScore: number;
+  minScore: number;
+  maxScore: number;
+  title: string; // 题目名称
+  trackList: Array<Track>; // 轨迹列表
+  score: number; //得分;null的值时是为打回时可以被修改的;null也是从未评分过的情况,要通过rejected来判断
+}
+
+interface Track {
+  mainNumber: number; // 大题号
+  subNumber: string; // 小题号,当前api中只有number // 特殊标记中没有
+  offsetIndex: number; // 第几张图
+  offsetX: number; // 左上角为原点
+  offsetY: number;
+  positionX: number; // 相对slice的位置比例
+  positionY: number;
+  score: number;
+}
+
+interface SpecialTag {
+  offsetIndex: number; // 第几张图
+  offsetX: number; // 左上角为原点
+  offsetY: number;
+  positionX: number; // 相对slice的位置比例
+  positionY: number;
+  tagName: string; // 特殊标记的字符串,勾叉
+}
+
+interface PictureSlice {
+  i: number;
+  w: number;
+  h: number;
+  x: number;
+  y: number;
+}
+
+interface MarkResult {
+  libraryId: number;
+  studentId: number;
+  statusValue: string;
+  spent: number; // 毫秒单位
+
+  // 轨迹 or 键盘
+  markerScore: number;
+  trackList: Array<Track>;
+  scoreList: Array<number>;
+  specialTagList: Array<SpecialTag>; // 轨迹和键盘都需要
+
+  // 问题卷
+  problem: boolean;
+  problemTypeId: number;
+}
+
+const obj = {
+  setting: {
+    mode: "TRACK",
+  },
+} as Store;
+
+/** 保存setting和task */
+export function saveSetting(settingRes: Setting) {
+  store.setting = settingRes;
+}
+
+/** 切换评分模式 */
+export function toggleMode() {
+  store.setting.mode = store.setting.mode === "TRACK" ? "COMMON" : "TRACK";
+  // 切换模式会清除当前任务的打分
+}
+
+/** 给当前任务评分 */
+export function markScore() {}
+
+export const store = reactive(obj);