Przeglądaj źródła

优化typescript类型

Michael Wang 3 lat temu
rodzic
commit
e4f20d3528

+ 2 - 2
src/features/mark/MarkBody.vue

@@ -17,7 +17,7 @@
 <script setup lang="ts">
 import { onMounted, onUnmounted, watch } from "vue";
 import { store } from "@/store/store";
-import { SliceImage, SpecialTag, Track, ModeEnum } from "@/types";
+import { SliceImage, SpecialTag, Track } from "@/types";
 // @ts-ignore
 import CustomCursor from "custom-cursor.js";
 import CommonMarkBody from "./CommonMarkBody.vue";
@@ -197,7 +197,7 @@ const makeTrack = (
 watch(
   () => store.setting.mode,
   () => {
-    const shouldHide = store.setting.mode === ModeEnum.COMMON;
+    const shouldHide = store.setting.mode === "COMMON";
     if (shouldHide) {
       // console.log("hide cursor", theCursor);
       // eslint-disable-next-line @typescript-eslint/no-unsafe-call

+ 4 - 5
src/features/mark/MarkHeader.vue

@@ -352,7 +352,6 @@
 import { doLogout, updateUISetting } from "@/api/markPage";
 import { watch, watchEffect } from "vue";
 import { store } from "@/store/store";
-import { ModeEnum } from "@/types";
 import MarkChangeProfile from "./MarkChangeProfile.vue";
 import MarkSwitchGroupDialog from "./MarkSwitchGroupDialog.vue";
 import MarkProblemDialog from "./MarkProblemDialog.vue";
@@ -360,18 +359,18 @@ import { isNumber } from "lodash-es";
 import { Modal } from "ant-design-vue";
 
 const modeName = $computed(() =>
-  store.setting.mode === ModeEnum.TRACK ? "轨迹模式" : "普通模式"
+  store.setting.mode === "TRACK" ? "轨迹模式" : "普通模式"
 );
 
 const exchangeModeName = $computed(() =>
-  store.setting.mode === ModeEnum.TRACK ? "普通模式" : "轨迹模式"
+  store.setting.mode === "TRACK" ? "普通模式" : "轨迹模式"
 );
 
 async function toggleSettingMode() {
   if (store.isTrackMode) {
-    store.setting.mode = ModeEnum.COMMON;
+    store.setting.mode = "COMMON";
   } else {
-    store.setting.mode = ModeEnum.TRACK;
+    store.setting.mode = "TRACK";
   }
   await updateUISetting(store.setting.mode);
 

+ 5 - 5
src/store/store.ts

@@ -1,4 +1,4 @@
-import { Setting, MarkStore, ModeEnum, AdminPageSetting, Task } from "@/types";
+import { Setting, MarkStore, AdminPageSetting, Task } from "@/types";
 import { watch } from "vue";
 import { defineStore } from "pinia";
 
@@ -64,7 +64,7 @@ export const useMarkStore = defineStore("mark", {
     },
     /** 是否是评卷端的轨迹模式 */
     isTrackMode(): boolean {
-      return store.setting.mode && store.setting.mode === ModeEnum.TRACK;
+      return store.setting.mode && store.setting.mode === "TRACK";
     },
     /** 评卷端的轨迹模式显示轨迹 && 管理后台都显示轨迹 */
     shouldShowTrack(): boolean {
@@ -89,13 +89,13 @@ export const useMarkStore = defineStore("mark", {
     },
     shouldShowMarkBoardKeyBoard(): boolean {
       return (
-        store.setting.mode === ModeEnum.COMMON &&
+        store.setting.mode === "COMMON" &&
         store.setting.uiSetting["normal.mode"] === "keyboard"
       );
     },
     shouldShowMarkBoardMouse(): boolean {
       return (
-        store.setting.mode === ModeEnum.COMMON &&
+        store.setting.mode === "COMMON" &&
         store.setting.uiSetting["normal.mode"] === "mouse"
       );
     },
@@ -109,7 +109,7 @@ export const useMarkStore = defineStore("mark", {
   actions: {
     initSetting(adminPageSetting: AdminPageSetting): void {
       Object.assign(this.setting, adminPageSetting, {
-        mode: ModeEnum.COMMON,
+        mode: "COMMON" as Setting["mode"],
         uiSetting: {
           "answer.paper.scale": 1,
           "score.board.collapse": false,

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

@@ -17,6 +17,7 @@ declare module "@vue/runtime-core" {
 declare module "axios/index" {
   interface AxiosRequestConfig {
     noErrorMessage?: boolean;
+    /** 设置整页遮罩 */
     setGlobalMask?: boolean;
   }
 }

+ 196 - 110
src/types/index.ts

@@ -2,79 +2,115 @@ export interface MarkStore {
   setting: Setting;
   groups: Array<Group>;
   status: {
-    valid: boolean; // 为false时不更新以下字段
-    personCount: number; //个人评卷数量
-    markedCount: number; //总评卷数量
-    totalCount: number; //总数量
-    problemCount: number; //问题卷数量
-    arbitrateCount: number; //待仲裁卷数量
-
-    personCountTweenedNumber: number; // 已评数量(动画用)
-    todoMarkCountTweenedNumber: number; // 待评数量(动画用)
+    /** 为false时不更新以下count字段 */
+    valid: boolean;
+    /** 个人评卷数量 */
+    personCount: number;
+    /** 总评卷数量 */
+    markedCount: number;
+    /** 总数量 */
+    totalCount: number;
+    /** 问题卷数量 */
+    problemCount: number;
+    /** 待仲裁卷数量 */
+    arbitrateCount: number;
   };
-  tasks: Array<Task>; // 保持数量为3
-  currentTask?: Task; // 用来切换task,还有回看
+  /** 保持数量为3(prefetchCount) */
+  tasks: Array<Task>;
+  /** 用来切换task,还有回看 */
+  currentTask?: Task;
   currentQuestion?: Question;
   currentScore?: number;
   currentSpecialTag?: string;
-  historyOpen: boolean; // 是否打开回评侧边栏
+  /** 是否打开回评侧边栏 */
+  historyOpen: boolean;
   historyTasks: Array<Task>;
+  /** 删除这些轨迹 */
   removeScoreTracks: Array<Track>;
-  focusTracks: Array<Track>; // 暂时无用
+  /** 聚焦这些tracks */
+  focusTracks: Array<Track>;
   message: string | null;
   maxModalZIndex: number;
-  minimapScrollToX?: number; // 宽度的百分比
-  minimapScrollToY?: number; // 高度的百分比
-  allPaperModal: boolean; // 是否显示全卷
-  sheetViewModal: boolean; // 是否显示原卷
-  globalMask: boolean; // 是否全局遮盖
+  /** 缩略图设置滚动到宽度的百分比 */
+  minimapScrollToX?: number;
+  /** 缩略图设置滚动到高度的百分比 */
+  minimapScrollToY?: number;
+  /** 是否显示全卷 */
+  allPaperModal: boolean;
+  /** 是否显示原卷 */
+  sheetViewModal: boolean;
+  /** 是否全局遮盖 */
+  globalMask: boolean;
 }
 
 export interface Setting {
-  examType: "SCAN_IMAGE" | "MULTI_MEDIA"; // 扫描图片或者多媒体,多媒体只允许 common mode
-  mode: ModeEnum; //模式 TRACK/COMMON
-  forceMode: boolean; //强制模式切换
-  sheetView: boolean; //是否显示原图功能
-  sheetConfig: Array<SingleSheetConfig>; //原图遮盖规则
-  enableAllZero: boolean; // 是否开启全零分
-  fileServer: string; //图片服务地址
-  userName: string; //评卷员姓名
+  /** 扫描图片或者多媒体,多媒体只允许 common mode */
+  examType: "SCAN_IMAGE" | "MULTI_MEDIA";
+  /** 阅卷模式 TRACK | COMMON */
+  mode: "TRACK" | "COMMON";
+  /** 是否允许模式切换,true为不允许 */
+  forceMode: boolean;
+  /** 是否显示原图功能 */
+  sheetView: boolean;
+  /** 原图遮盖规则 */
+  sheetConfig: Array<SingleSheetConfig>;
+  /** 是否开启全零分 */
+  enableAllZero: boolean;
+  /** 图片服务地址 */
+  fileServer: string;
+  /** 评卷员姓名 */
+  userName: string;
   subject: {
-    //科目信息(试卷和答案功能)
+    /** 科目信息(试卷和答案功能)*/
     name: string;
     code: string;
     answerUrl: string;
     paperUrl: string;
     questions: Array<RichTextQuestion>;
   };
-  forceSpecialTag: boolean; //强制标记是否开启 forceTag
+  /** 强制标记是否开启 */
+  forceSpecialTag: boolean;
   uiSetting: UISetting;
-  statusValue: "TRIAL" | "FORMAL" | "FINISH"; //只显示试评名称  TRIAL("试评"), FORMAL("正评"), FINISH("结束")
-  problemTypes: Array<{ id: number; name: string }> | []; //问题卷类型
-  groupNumber: number; //评卷分组
-  groupTitle: string; //评卷分组名称
-  topCount: number; //限制提示数量
-  splitConfig: Array<number>; //使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55],
-  prefetchCount: number; //预加载任务数量
-  startTime: number; //评卷开始时间
-  endTime: number; //评卷结束时间
-  selective: boolean; // 是否是未选做类型
+  /** 只显示试评名称  TRIAL("试评"), FORMAL("正评"), FINISH("结束") */
+  statusValue: "TRIAL" | "FORMAL" | "FINISH";
+  /** 问题卷类型 */
+  problemTypes: Array<{ id: number; name: string }> | [];
+  /** 当前评卷分组号 */
+  groupNumber: number;
+  /** 当前评卷分组名称 */
+  groupTitle: string;
+  /** 推荐老师评卷的数量,到达这个数量提示老师 */
+  topCount: number;
+  /** 使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55], */
+  splitConfig: Array<number>;
+  /** 预加载任务数量 */
+  prefetchCount: number;
+  /** 评卷开始时间 */
+  startTime: number;
+  /** 评卷结束时间 */
+  endTime: number;
+  /** 是否是未选做类型 */
+  selective: boolean;
 }
 
 // setting for admin page
 export interface AdminPageSetting {
-  examType: "SCAN_IMAGE" | "MULTI_MEDIA"; // 扫描图片或者多媒体,多媒体只允许 common mode
-  fileServer: string; //图片服务地址
-  userName: string; //管理员姓名
+  /** 扫描图片或者多媒体,多媒体只允许 common mode */
+  examType: "SCAN_IMAGE" | "MULTI_MEDIA";
+  /** 图片服务地址 */
+  fileServer: string;
+  /** 管理员姓名 */
+  userName: string;
   subject: {
-    //科目信息(试卷和答案功能)
+    /** 科目信息(试卷和答案功能) */
     name: string;
     code: string;
     answerUrl: string;
     paperUrl: string;
     questions: Array<RichTextQuestion>;
   };
-  splitConfig: Array<number>; //使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55],
+  /** 使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55], */
+  splitConfig: Array<number>;
 }
 
 export interface AdminPageSettingForImport extends AdminPageSetting {
@@ -84,101 +120,135 @@ export interface AdminPageSettingForImport extends AdminPageSetting {
   message: string;
 }
 
-export enum ModeEnum {
-  TRACK = "TRACK",
-  COMMON = "COMMON",
-}
-
 interface SingleSheetConfig {
-  i: number; // index of sheets
-  w: number; // width
-  h: number; // height
-  x: number; // x 左上角为 (0, 0)
-  y: number; // y 左上角为 (0, 0)
+  /** index of sheets */
+  i: number;
+  /** 覆盖区域的width */
+  w: number;
+  /** 覆盖区域的height */
+  h: number;
+  /** 从哪里开始覆盖 左上角为 (0, 0) */
+  x: number;
+  /** 从哪里开始覆盖 左上角为 (0, 0) */
+  y: number;
 }
 
 export interface Group {
   markerId: number;
   number: number;
   title: string;
-  markedCount: number; //总评卷数量
-  totalCount: number; //总数量
+  /** 总评卷数量 */
+  markedCount: number;
+  /** 总数量 */
+  totalCount: number;
 }
 
 export interface Task {
   libraryId: number;
   studentId: number;
   secretNumber: string;
-  studentName: string; //后端处理是否显示
+  /** 后端处理是否显示 */
+  studentName: string;
   studentCode: string;
   examNumber: string;
   subject?: {
-    // 一般不要用此处的subject,优先用setting.subject
+    /** 一般不要用此处的subject,优先用setting.subject */
     name: string;
     code: string;
     answerUrl: string;
     paperUrl: string;
     questions: Array<RichTextQuestion>;
   };
-  sliceUrls: Array<string>; //裁切图url
-  sliceConfig: Array<PictureSlice>; //最高显示优先级
-  jsonUrl: string; // sliceUrls为空,则是多媒体阅卷,显示JSON
+  /** 裁切图url */
+  sliceUrls: Array<string>;
+  /** 最高显示优先级,有sliceConfig就用sliceConfig,否则使用sheetConfig */
+  sliceConfig: Array<PictureSlice>;
+  /** sliceUrls为空,则是多媒体阅卷,显示JSON */
+  jsonUrl: string;
   questionList: Array<Question>;
   specialTagList: Array<SpecialTag>;
 
-  sheetUrls: Array<string>; //原图url
-  objectiveScore: number; //客观分 复核也用到
+  /** 原图url */
+  sheetUrls: Array<string>;
+  /** 客观分 复核也用到 */
+  objectiveScore: number;
 
-  markerScore: number; // 评卷总分
-  markerTime: number; //评卷时间
-  inspectTime?: number; // 复核有用
-  self: boolean; // 是否自评,暂时用不着
-  previous: boolean; // 是否回评
-  rejected: boolean; // 是否是打回
+  /** 评卷总分 */
+  markerScore: number;
+  /** 评卷时间 */
+  markerTime: number;
+  /** 复核有用 */
+  inspectTime?: number;
+  /** 是否自评,暂时用不着 */
+  self: boolean;
+  /** 是否回评 */
+  previous: boolean;
+  /** 是否是打回 */
+  rejected: boolean;
   message: string | null;
 
-  // 评卷结果,在task第一次被访问时自动添加,watch currentTask
+  /** 评卷结果,在task第一次被访问时自动添加,watch currentTask */
   markResult: MarkResult;
-  __markStartTime: number; // 前端自用,用于标记阅卷开始时间和计算spent
+  /** 前端自用,用于标记阅卷开始时间和计算spent */
+  __markStartTime: number;
 }
 
 export interface Question {
-  groupNumber: number; // 分组序号
-  mainNumber: number; // 大题号
-  subNumber: string; // 小题号
-  intervalScore: number; // 分数间隔
+  /** 分组序号 */
+  groupNumber: number;
+  /** 大题号 */
+  mainNumber: number;
+  /** 小题号 */
+  subNumber: string;
+  /** 分数间隔 */
+  intervalScore: number;
   defaultScore: number;
   minScore: number;
   maxScore: number;
-  title: string; // 题目名称
-  trackList: Array<Track>; // 轨迹列表
-  score: number | null; //得分;null的值时是为打回时可以被评卷修改的;null也是从未评分过的情况,要通过rejected来判断
-  __index: number; // question 在 task 里面的 index ,用来对应 scoreList 的 score
+  /** 题目名称 */
+  title: string;
+  /** 轨迹列表 */
+  trackList: Array<Track>;
+  /** 得分;null的值时是为打回时可以被评卷修改的;null也是从未评分过的情况,要通过rejected来判断 */
+  score: number | null;
+  /** question 在 task 里面的 index ,用来对应 scoreList 的 score */
+  __index: number;
 }
 
 export interface Track {
-  mainNumber: number; // 大题号
-  subNumber: string; // 小题号,当前api中只有number // 特殊标记中没有
-  number: number; // 前端使用,暂时用不着,赋0
-  offsetIndex: number; // 第几张图
-  offsetX: number; // 左上角为原点
+  /** 大题号 */
+  mainNumber: number;
+  /** 小题号,当前api中只有number // 特殊标记中没有 */
+  subNumber: string;
+  /** 前端使用,暂时用不着,赋0 */
+  number: number;
+  /** 第几张图 */
+  offsetIndex: number;
+  /** 左上角为原点 */
+  offsetX: number;
   offsetY: number;
-  positionX: number; // 相对slice的位置比例
+  /** 相对slice的位置比例 */
+  positionX: number;
   positionY: number;
   score: number;
 }
 
 export interface SpecialTag {
-  offsetIndex: number; // 第几张图
-  offsetX: number; // 左上角为原点
+  /** 第几张图 */
+  offsetIndex: number;
+  /** 左上角为原点 */
+  offsetX: number;
   offsetY: number;
-  positionX: number; // 相对slice的位置比例
+  /** 相对slice的位置比例 */
+  positionX: number;
   positionY: number;
-  tagName: string; // 特殊标记的字符串,勾叉
+  /** 特殊标记的字符串,勾叉 */
+  tagName: string;
 }
 
 export interface PictureSlice {
-  i: number; // 从1开始
+  /** 从1开始 */
+  i: number;
   w: number;
   h: number;
   x: number;
@@ -187,37 +257,43 @@ export interface PictureSlice {
 
 export interface UISetting {
   "score.board.collapse": boolean;
-  "answer.paper.scale": number; // 0.2 gap
+  /** 0.2 gap */
+  "answer.paper.scale": number;
   "normal.mode": "keyboard" | "mouse";
   "paper.modal": boolean;
   "answer.modal": boolean;
   "minimap.modal": boolean;
   "specialTag.modal": boolean;
   "shortCut.modal": boolean;
-  "score.fontSize.scale": number; // 0.1 gap
+  /** 0.1 gap */
+  "score.fontSize.scale": number;
 }
 
 export interface MarkResult {
   libraryId: number;
   studentId: number;
   statusValue: string;
-  spent: number; // 毫秒单位
+  /** 毫秒单位 */
+  spent: number;
 
   // 轨迹 or 键盘
   markerScore: number | null;
   trackList: Array<Track>;
   scoreList: Array<number | null>;
-  specialTagList: Array<SpecialTag>; // 轨迹和键盘都需要
+  /** 轨迹和键盘都需要 */
+  specialTagList: Array<SpecialTag>;
 
-  // 问题卷
+  /** 问题卷 */
   problem: boolean;
   problemTypeId: number;
-  unselective: boolean; // 当前task是否为学生未选做
+  /** 当前task是否为学生未选做 */
+  unselective: boolean;
 }
 
-// 前端自用,用来渲染裁切图
+/** 前端自用,用来渲染裁切图 */
 export interface SliceImage {
-  url: string; // 当前是 ObjectURL , 因为 DataURL 性能太差
+  /** 当前是 ObjectURL , 因为 DataURL 性能太差 */
+  url: string;
   indexInSliceUrls: number;
   trackList: Array<Track>;
   tagList: Array<SpecialTag>;
@@ -225,9 +301,14 @@ export interface SliceImage {
   // originalImageHeight: number; // 为了兼容原图还原轨迹而添加的属性,当前CommonMarkBody用不到
   sliceImageWidth: number;
   sliceImageHeight: number;
-  dx: number; // 裁切图在原图中的左上角的x偏移量
-  dy: number; // 裁切图在原图中的左上角的y偏移量
-  accumTopHeight: number; // 在多个图片从高至低排列中中累积的高度
+  /** 裁切图在原图中的左上角的x偏移量 */
+  dx: number;
+  /** 裁切图在原图中的左上角的y偏移量 */
+  dy: number;
+  /** 在多个图片从高至低排列中累积的高度 */
+  accumTopHeight: number;
+  /** 当前裁切图有效宽度,大小不一的裁切图时有用。
+   * 为了能让多张图统一比例的缩放,所以将所有的图的宽度设为一样了。 */
   effectiveWidth: number;
 }
 
@@ -240,7 +321,8 @@ export type MarkHistoryOrderBy =
 export type MarkHistorySortField = "ASC" | "DESC" | undefined;
 
 export interface HistoryQueryParams {
-  pageNumber?: number; // 从1开始
+  /** 从1开始 */
+  pageNumber?: number;
   pageSize?: number;
   order?: MarkHistoryOrderBy;
   sort?: MarkHistorySortField;
@@ -256,11 +338,13 @@ export interface GetHistory {
 }
 
 export interface CommonResponse {
-  success: boolean; // 请求是否成功
-  message: string; // 错误消息
+  /** 请求是否成功 */
+  success: boolean;
+  /** 错误消息 */
+  message: string;
 }
 
-// 仲裁用:评卷明细
+/** 仲裁用:评卷明细 */
 export interface MarkDetail {
   markerName: string;
   markerTime: number;
@@ -268,9 +352,10 @@ export interface MarkDetail {
   scoreList: string;
 }
 
-// 多媒体评卷 start
+//#region  多媒体评卷
 export interface RichTextQuestion {
-  unionOrder: string; // 题目的综合题号 1-2-4
+  /** 题目的综合题号 1-2-4 */
+  unionOrder: string;
   body: RichTextJSON;
   parentBody: RichTextJSON | null;
   answer: Array<RichTextJSON> | null;
@@ -302,7 +387,7 @@ export interface StudentAnswer {
   answer: Array<RichTextJSON> | null;
 }
 
-// 云平台试卷格式
+/** 云平台试卷格式 */
 export type ECSPaperJSON = {
   mainNumber: number;
   subNumber: string;
@@ -311,11 +396,12 @@ export type ECSPaperJSON = {
   answer: RichTextJSON;
 }[];
 
-// 在线考试平台试卷格式
+/** 在线考试平台试卷格式 */
 export type OExamPaperJSON = OExamPaperJSONQuestionList[];
 
 interface OExamPaperJSONQuestionList {
-  number: number; // 大题号
+  /** 大题号 */
+  number: number;
   questions: OExamPaperJSONQuestion[];
 }
 interface OExamPaperJSONQuestion {
@@ -326,4 +412,4 @@ interface OExamPaperJSONQuestion {
   options: Array<{ number: number; body: RichTextJSON }>;
   subQuestions: OExamPaperJSONQuestion[] | null;
 }
-// 多媒体评卷 end
+//#endregion