|
@@ -1,3 +1,19 @@
|
|
|
|
+import type { AxiosResponse } from "axios";
|
|
|
|
+interface SplitConfig {
|
|
|
|
+ /** index of sheets */
|
|
|
|
+ i: number;
|
|
|
|
+ /** 覆盖区域的width */
|
|
|
|
+ w: number;
|
|
|
|
+ /** 覆盖区域的height */
|
|
|
|
+ h: number;
|
|
|
|
+ /** 从哪里开始覆盖 左上角为 (0, 0) */
|
|
|
|
+ x: number;
|
|
|
|
+ /** 从哪里开始覆盖 左上角为 (0, 0) */
|
|
|
|
+ y: number;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+type SingleSheetConfig = SplitConfig;
|
|
|
|
+export type PictureSlice = SplitConfig;
|
|
export interface MarkStore {
|
|
export interface MarkStore {
|
|
setting: Setting;
|
|
setting: Setting;
|
|
groups: Array<Group>;
|
|
groups: Array<Group>;
|
|
@@ -64,19 +80,14 @@ export interface Setting {
|
|
fileServer: string;
|
|
fileServer: string;
|
|
/** 评卷员姓名 */
|
|
/** 评卷员姓名 */
|
|
userName: string;
|
|
userName: string;
|
|
- subject: {
|
|
|
|
- /** 科目信息(试卷和答案功能)*/
|
|
|
|
- name: string;
|
|
|
|
- code: string;
|
|
|
|
- answerUrl: string;
|
|
|
|
- paperUrl: string;
|
|
|
|
- questions: Array<RichTextQuestion>;
|
|
|
|
- };
|
|
|
|
|
|
+ /** 科目信息(试卷和答案功能)*/
|
|
|
|
+ subject: Subject;
|
|
/** 强制标记是否开启 */
|
|
/** 强制标记是否开启 */
|
|
forceSpecialTag: boolean;
|
|
forceSpecialTag: boolean;
|
|
|
|
+ /** 评卷小工具控制字段 */
|
|
uiSetting: UISetting;
|
|
uiSetting: UISetting;
|
|
/** 只显示试评名称 TRIAL("试评"), FORMAL("正评"), FINISH("结束"): 结束状态不会在评卷端出现 */
|
|
/** 只显示试评名称 TRIAL("试评"), FORMAL("正评"), FINISH("结束"): 结束状态不会在评卷端出现 */
|
|
- statusValue: "TRIAL" | "FORMAL";
|
|
|
|
|
|
+ statusValue: "TRIAL" | "FORMAL" | null;
|
|
/** 问题卷类型 */
|
|
/** 问题卷类型 */
|
|
problemTypes: Array<{ id: number; name: string }> | [];
|
|
problemTypes: Array<{ id: number; name: string }> | [];
|
|
/** 当前评卷分组号 */
|
|
/** 当前评卷分组号 */
|
|
@@ -97,6 +108,24 @@ export interface Setting {
|
|
selective: boolean;
|
|
selective: boolean;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/** 科目信息(试卷和答案功能) */
|
|
|
|
+interface RawSubject {
|
|
|
|
+ /** 科目名称 */
|
|
|
|
+ name: string;
|
|
|
|
+ /** 科目编号 */
|
|
|
|
+ code: string;
|
|
|
|
+ /** 学生答案json url */
|
|
|
|
+ answerUrl: string;
|
|
|
|
+ /** 试卷json url */
|
|
|
|
+ paperUrl: string;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/** 科目信息(试卷和答案功能)增加前端自定义 questions字段*/
|
|
|
|
+interface Subject extends RawSubject {
|
|
|
|
+ /** 前端自定义questions字段, 在多媒体阅卷模式下使用 */
|
|
|
|
+ questions: Array<RichTextQuestion>;
|
|
|
|
+}
|
|
|
|
+
|
|
// setting for admin page
|
|
// setting for admin page
|
|
export interface AdminPageSetting {
|
|
export interface AdminPageSetting {
|
|
/** 扫描图片或者多媒体,多媒体只允许 common mode */
|
|
/** 扫描图片或者多媒体,多媒体只允许 common mode */
|
|
@@ -105,14 +134,8 @@ export interface AdminPageSetting {
|
|
fileServer: string;
|
|
fileServer: string;
|
|
/** 管理员姓名 */
|
|
/** 管理员姓名 */
|
|
userName: string;
|
|
userName: string;
|
|
- subject: {
|
|
|
|
- /** 科目信息(试卷和答案功能) */
|
|
|
|
- name: string;
|
|
|
|
- code: string;
|
|
|
|
- answerUrl: string;
|
|
|
|
- paperUrl: string;
|
|
|
|
- questions: Array<RichTextQuestion>;
|
|
|
|
- };
|
|
|
|
|
|
+ /** 科目信息 */
|
|
|
|
+ subject: Subject;
|
|
/** 使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55], */
|
|
/** 使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55], */
|
|
splitConfig: Array<number>;
|
|
splitConfig: Array<number>;
|
|
enableSplit: boolean;
|
|
enableSplit: boolean;
|
|
@@ -125,22 +148,11 @@ export interface AdminPageSettingForImport extends AdminPageSetting {
|
|
message: string;
|
|
message: string;
|
|
}
|
|
}
|
|
|
|
|
|
-interface SingleSheetConfig {
|
|
|
|
- /** index of sheets */
|
|
|
|
- i: number;
|
|
|
|
- /** 覆盖区域的width */
|
|
|
|
- w: number;
|
|
|
|
- /** 覆盖区域的height */
|
|
|
|
- h: number;
|
|
|
|
- /** 从哪里开始覆盖 左上角为 (0, 0) */
|
|
|
|
- x: number;
|
|
|
|
- /** 从哪里开始覆盖 左上角为 (0, 0) */
|
|
|
|
- y: number;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
export interface Group {
|
|
export interface Group {
|
|
markerId: number;
|
|
markerId: number;
|
|
|
|
+ /** 分组编号 */
|
|
number: number;
|
|
number: number;
|
|
|
|
+ /** 分组title */
|
|
title: string;
|
|
title: string;
|
|
/** 总评卷数量 */
|
|
/** 总评卷数量 */
|
|
markedCount: number;
|
|
markedCount: number;
|
|
@@ -148,22 +160,21 @@ export interface Group {
|
|
totalCount: number;
|
|
totalCount: number;
|
|
}
|
|
}
|
|
|
|
|
|
-export interface Task {
|
|
|
|
|
|
+interface RawTask {
|
|
libraryId: number;
|
|
libraryId: number;
|
|
|
|
+ /** 学生ID */
|
|
studentId: number;
|
|
studentId: number;
|
|
|
|
+ /** 任务编号 */
|
|
secretNumber: string;
|
|
secretNumber: string;
|
|
/** 后端处理是否显示 */
|
|
/** 后端处理是否显示 */
|
|
|
|
+ /** 学生名称 */
|
|
studentName: string;
|
|
studentName: string;
|
|
|
|
+ /** 学生编号 */
|
|
studentCode: string;
|
|
studentCode: string;
|
|
|
|
+ /** 考试编号 */
|
|
examNumber: string;
|
|
examNumber: string;
|
|
- subject?: {
|
|
|
|
- /** 一般不要用此处的subject,优先用setting.subject */
|
|
|
|
- name: string;
|
|
|
|
- code: string;
|
|
|
|
- answerUrl: string;
|
|
|
|
- paperUrl: string;
|
|
|
|
- questions: Array<RichTextQuestion>;
|
|
|
|
- };
|
|
|
|
|
|
+ /** 一般不要用此处的subject,优先用setting.subject */
|
|
|
|
+ subject?: Subject;
|
|
/** 裁切图url */
|
|
/** 裁切图url */
|
|
sliceUrls: Array<string>;
|
|
sliceUrls: Array<string>;
|
|
/** 最高显示优先级,有sliceConfig就用sliceConfig,否则使用sheetConfig */
|
|
/** 最高显示优先级,有sliceConfig就用sliceConfig,否则使用sheetConfig */
|
|
@@ -191,14 +202,16 @@ export interface Task {
|
|
/** 是否是打回 */
|
|
/** 是否是打回 */
|
|
rejected: boolean;
|
|
rejected: boolean;
|
|
message: string | null;
|
|
message: string | null;
|
|
|
|
+}
|
|
|
|
|
|
|
|
+export interface Task extends RawTask {
|
|
/** 评卷结果,在task第一次被访问时自动添加,watch currentTask */
|
|
/** 评卷结果,在task第一次被访问时自动添加,watch currentTask */
|
|
markResult: MarkResult;
|
|
markResult: MarkResult;
|
|
/** 前端自用,用于标记阅卷开始时间和计算spent */
|
|
/** 前端自用,用于标记阅卷开始时间和计算spent */
|
|
__markStartTime: number;
|
|
__markStartTime: number;
|
|
}
|
|
}
|
|
|
|
|
|
-export interface Question {
|
|
|
|
|
|
+interface RawQuestion {
|
|
/** 分组序号 */
|
|
/** 分组序号 */
|
|
groupNumber: number;
|
|
groupNumber: number;
|
|
/** 大题号 */
|
|
/** 大题号 */
|
|
@@ -207,8 +220,11 @@ export interface Question {
|
|
subNumber: string;
|
|
subNumber: string;
|
|
/** 分数间隔 */
|
|
/** 分数间隔 */
|
|
intervalScore: number;
|
|
intervalScore: number;
|
|
|
|
+ /** 默认分数 */
|
|
defaultScore: number;
|
|
defaultScore: number;
|
|
|
|
+ /** 限制最小分数 */
|
|
minScore: number;
|
|
minScore: number;
|
|
|
|
+ /** 限制最大分数 */
|
|
maxScore: number;
|
|
maxScore: number;
|
|
/** 题目名称 */
|
|
/** 题目名称 */
|
|
title: string;
|
|
title: string;
|
|
@@ -216,10 +232,13 @@ export interface Question {
|
|
trackList: Array<Track>;
|
|
trackList: Array<Track>;
|
|
/** 得分;null的值时是为打回时可以被评卷修改的;null也是从未评分过的情况,要通过rejected来判断 */
|
|
/** 得分;null的值时是为打回时可以被评卷修改的;null也是从未评分过的情况,要通过rejected来判断 */
|
|
score: number | null;
|
|
score: number | null;
|
|
|
|
+}
|
|
|
|
+export interface Question extends RawQuestion {
|
|
/** question 在 task 里面的 index ,用来对应 scoreList 的 score */
|
|
/** question 在 task 里面的 index ,用来对应 scoreList 的 score */
|
|
__index: number;
|
|
__index: number;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/** 轨迹数据 */
|
|
export interface Track {
|
|
export interface Track {
|
|
/** 大题号 */
|
|
/** 大题号 */
|
|
mainNumber: number;
|
|
mainNumber: number;
|
|
@@ -235,11 +254,13 @@ export interface Track {
|
|
/** 相对slice的位置比例 */
|
|
/** 相对slice的位置比例 */
|
|
positionX: number;
|
|
positionX: number;
|
|
positionY: number;
|
|
positionY: number;
|
|
|
|
+ /** 评分数 */
|
|
score: number;
|
|
score: number;
|
|
/** 是否此处未作答,未作答时,score默认是-0分 */
|
|
/** 是否此处未作答,未作答时,score默认是-0分 */
|
|
unanswered: boolean;
|
|
unanswered: boolean;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/** 特殊标记数据 */
|
|
export interface SpecialTag {
|
|
export interface SpecialTag {
|
|
/** 第几张图 */
|
|
/** 第几张图 */
|
|
offsetIndex: number;
|
|
offsetIndex: number;
|
|
@@ -253,45 +274,52 @@ export interface SpecialTag {
|
|
tagName: string;
|
|
tagName: string;
|
|
}
|
|
}
|
|
|
|
|
|
-export interface PictureSlice {
|
|
|
|
- /** 从1开始 */
|
|
|
|
- i: number;
|
|
|
|
- w: number;
|
|
|
|
- h: number;
|
|
|
|
- x: number;
|
|
|
|
- y: number;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
export interface UISetting {
|
|
export interface UISetting {
|
|
|
|
+ /** 给分面板展示形态 */
|
|
"score.board.collapse": boolean;
|
|
"score.board.collapse": boolean;
|
|
/** 0.2 gap */
|
|
/** 0.2 gap */
|
|
|
|
+ /** 试卷缩放比例 */
|
|
"answer.paper.scale": number;
|
|
"answer.paper.scale": number;
|
|
|
|
+ /**
|
|
|
|
+ * 给分模式
|
|
|
|
+ * "keyboard": 键盘模式
|
|
|
|
+ * "mouse": 鼠标模式
|
|
|
|
+ * */
|
|
"normal.mode": "keyboard" | "mouse";
|
|
"normal.mode": "keyboard" | "mouse";
|
|
|
|
+ /** 弹窗显示试卷 */
|
|
"paper.modal": boolean;
|
|
"paper.modal": boolean;
|
|
|
|
+ /** 弹窗显示答案 */
|
|
"answer.modal": boolean;
|
|
"answer.modal": boolean;
|
|
|
|
+ /** 弹窗显示缩略图 */
|
|
"minimap.modal": boolean;
|
|
"minimap.modal": boolean;
|
|
|
|
+ /** 弹窗显示特殊字符 */
|
|
"specialTag.modal": boolean;
|
|
"specialTag.modal": boolean;
|
|
|
|
+ /** 弹窗显示快捷键配置 */
|
|
"shortCut.modal": boolean;
|
|
"shortCut.modal": boolean;
|
|
/** 0.1 gap */
|
|
/** 0.1 gap */
|
|
|
|
+ /** 分数标记缩放比例 */
|
|
"score.fontSize.scale": number;
|
|
"score.fontSize.scale": number;
|
|
}
|
|
}
|
|
|
|
|
|
export interface MarkResult {
|
|
export interface MarkResult {
|
|
libraryId: number;
|
|
libraryId: number;
|
|
studentId: number;
|
|
studentId: number;
|
|
- statusValue: string;
|
|
|
|
|
|
+ statusValue: "TRIAL" | "FORMAL" | null;
|
|
/** 毫秒单位 */
|
|
/** 毫秒单位 */
|
|
spent: number;
|
|
spent: number;
|
|
|
|
|
|
// 轨迹 or 键盘
|
|
// 轨迹 or 键盘
|
|
markerScore: number | null;
|
|
markerScore: number | null;
|
|
|
|
+ /** 轨迹列表 */
|
|
trackList: Array<Track>;
|
|
trackList: Array<Track>;
|
|
|
|
+ /** 给分列表 */
|
|
scoreList: Array<number | null>;
|
|
scoreList: Array<number | null>;
|
|
/** 轨迹和键盘都需要 */
|
|
/** 轨迹和键盘都需要 */
|
|
specialTagList: Array<SpecialTag>;
|
|
specialTagList: Array<SpecialTag>;
|
|
|
|
|
|
/** 问题卷 */
|
|
/** 问题卷 */
|
|
problem: boolean;
|
|
problem: boolean;
|
|
|
|
+ /** 问题卷类型ID */
|
|
problemTypeId: number;
|
|
problemTypeId: number;
|
|
/** 当前task是否为学生未选做 */
|
|
/** 当前task是否为学生未选做 */
|
|
unselective: boolean;
|
|
unselective: boolean;
|
|
@@ -341,7 +369,9 @@ export interface HistoryQueryParams {
|
|
}
|
|
}
|
|
|
|
|
|
export interface GetHistory {
|
|
export interface GetHistory {
|
|
- (historyQuery: HistoryQueryParams): any;
|
|
|
|
|
|
+ (historyQuery: HistoryQueryParams): Promise<
|
|
|
|
+ AxiosResponse<Task[]> | undefined
|
|
|
|
+ >;
|
|
}
|
|
}
|
|
|
|
|
|
export interface CommonResponse {
|
|
export interface CommonResponse {
|
|
@@ -367,8 +397,16 @@ export interface RichTextQuestion {
|
|
parentBody: RichTextJSON | null;
|
|
parentBody: RichTextJSON | null;
|
|
answer: Array<RichTextJSON> | null;
|
|
answer: Array<RichTextJSON> | null;
|
|
objective: boolean | null;
|
|
objective: boolean | null;
|
|
- options: Array<{ number: number; body: RichTextJSON }>;
|
|
|
|
|
|
+ options: Array<{ number: number; body: RichTextJSON }> | null;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+export interface QuestionForRender extends Omit<RichTextQuestion, "answer"> {
|
|
|
|
+ studentAnswer: RichTextQuestion['answer'];
|
|
|
|
+ standardAnswer: RichTextQuestion['answer'];
|
|
|
|
+ score: number | null;
|
|
|
|
+ totalScore: number;
|
|
}
|
|
}
|
|
|
|
+
|
|
export interface RichTextJSON {
|
|
export interface RichTextJSON {
|
|
sections: RichTextSectionJSON[];
|
|
sections: RichTextSectionJSON[];
|
|
}
|
|
}
|