ソースを参照

题卡编辑修改

zhangjie 3 年 前
コミット
085ac6c320
39 ファイル変更5080 行追加4105 行削除
  1. 1 2
      src/modules/card/assets/styles/card-preview.scss
  2. 5 5
      src/modules/card/assets/styles/icons.scss
  3. 4 4
      src/modules/card/autoBuild/commonPaperCard.js
  4. 264 0
      src/modules/card/autoBuild/paperCard.js
  5. 4783 0
      src/modules/card/autoBuild/paperJson.json
  6. 0 0
      src/modules/card/autoBuild/paperJsonTemp.json
  7. 0 137
      src/modules/card/components/CardConfigPropEdit.vue
  8. 10 40
      src/modules/card/components/CardDesign.vue
  9. 1 9
      src/modules/card/components/PagePropEdit.vue
  10. 0 358
      src/modules/card/components/PaperParams.vue
  11. 2 1
      src/modules/card/components/RightClickMenu.vue
  12. 2 2
      src/modules/card/elements/explain/ElemExplain.vue
  13. 2 2
      src/modules/card/elements/explain/ElemExplainEdit.vue
  14. 3 2
      src/modules/card/elements/explain/model.js
  15. 1 1
      src/modules/card/elements/gutter/ElemGutter.vue
  16. 0 299
      src/modules/card/modules/free/cardFormatTransform.js
  17. 0 407
      src/modules/card/modules/free/components/CardFreeDesign.vue
  18. 0 113
      src/modules/card/modules/free/components/CardFreeView.vue
  19. 0 98
      src/modules/card/modules/free/components/ElementPropEdit.vue
  20. 0 176
      src/modules/card/modules/free/components/ElementTierEdit.vue
  21. 0 49
      src/modules/card/modules/free/components/HelpDialog.vue
  22. 0 132
      src/modules/card/modules/free/components/PagePropEdit.vue
  23. 0 212
      src/modules/card/modules/free/components/RightClickMenu.vue
  24. 0 188
      src/modules/card/modules/free/components/ShortcutKey.vue
  25. 0 122
      src/modules/card/modules/free/components/TopicColumnEdit.vue
  26. 0 130
      src/modules/card/modules/free/components/TopicElementEdit.vue
  27. 0 84
      src/modules/card/modules/free/components/TopicElementPreview.vue
  28. 0 256
      src/modules/card/modules/free/elements/fill-line/EditFillLine.vue
  29. 0 86
      src/modules/card/modules/free/elements/fill-line/ElemFillLine.vue
  30. 0 60
      src/modules/card/modules/free/elements/fill-line/model.js
  31. 0 239
      src/modules/card/modules/free/elements/fill-question/EditFillQuestion.vue
  32. 0 126
      src/modules/card/modules/free/elements/fill-question/ElemFillQuestion.vue
  33. 0 39
      src/modules/card/modules/free/elements/fill-question/model.js
  34. 0 166
      src/modules/card/modules/free/elements/model.js
  35. 0 209
      src/modules/card/modules/free/store.js
  36. 1 1
      src/modules/card/pageModel.js
  37. 1 3
      src/modules/card/store/index.js
  38. 0 228
      src/modules/card/views/CardFreeEdit.vue
  39. 0 119
      src/modules/card/views/CardFreePreview.vue

+ 1 - 2
src/modules/card/assets/styles/card-preview.scss

@@ -156,10 +156,9 @@
   position: absolute;
   top: 60px;
   bottom: 86px;
-  width: 120px;
+  width: 90px;
   left: 40px;
   z-index: 10;
-  // background-color: #e0e0e0;
 
   .free-topic-preview {
     position: absolute;

+ 5 - 5
src/modules/card/assets/styles/icons.scss

@@ -21,11 +21,11 @@
     width: 32px;
     height: 32px;
   }
-  &-back {
-    background-image: url(../images/icon-back.png);
-    width: 32px;
-    height: 32px;
-  }
+  // &-back {
+  //   background-image: url(../images/icon-back.png);
+  //   width: 32px;
+  //   height: 32px;
+  // }
   &-two-gray {
     background-image: url(../images/icon-two-gray.png);
     width: 12px;

+ 4 - 4
src/modules/card/autoBuildCard.js → src/modules/card/autoBuild/commonPaperCard.js

@@ -1,16 +1,16 @@
-import { numberToChinese } from "./plugins/utils";
+import { numberToChinese } from "../plugins/utils";
 import {
   getModel as createFillQuestion,
   getFullModel as getFillQuesitonElements,
-} from "./elements/fill-question/model";
+} from "../elements/fill-question/model";
 import {
   getModel as createFillLine,
   getFullModel as getFillLineElements,
-} from "./elements/fill-line/model";
+} from "../elements/fill-line/model";
 import {
   getModel as createExplain,
   getFullModel as getExplainElements,
-} from "./elements/explain/model";
+} from "../elements/explain/model";
 
 const STRUCT_TYPES = {
   SINGLE_CHOICE: 1,

+ 264 - 0
src/modules/card/autoBuild/paperCard.js

@@ -0,0 +1,264 @@
+import { numberToChinese } from "../plugins/utils";
+import {
+  getModel as createFillQuestion,
+  getFullModel as getFillQuesitonElements,
+} from "../elements/fill-question/model";
+import {
+  getModel as createFillLine,
+  getFullModel as getFillLineElements,
+} from "../elements/fill-line/model";
+import {
+  getModel as createExplain,
+  getFullModel as getExplainElements,
+} from "../elements/explain/model";
+
+const COMMON_QUESTION_TYPES = [
+  "SINGLE_ANSWER_QUESTION",
+  "MULTIPLE_ANSWER_QUESTION",
+  "BOOL_ANSWER_QUESTION",
+  "FILL_BLANK_QUESTION",
+  "TEXT_ANSWER_QUESTION",
+];
+// TODO:  READING_COMPREHENSION,LISTENING_QUESTION,CLOZE,PARAGRAPH_MATCHING,BANKED_CLOZE
+
+const structTypeToCardElementType = {
+  SINGLE_ANSWER_QUESTION: "FILL_QUESTION",
+  MULTIPLE_ANSWER_QUESTION: "FILL_QUESTION",
+  BOOL_ANSWER_QUESTION: "FILL_QUESTION",
+  FILL_BLANK_QUESTION: "FILL_LINE",
+  TEXT_ANSWER_QUESTION: "EXPLAIN",
+};
+
+const elementModel = {
+  FILL_QUESTION: (presetData) => {
+    const model = createFillQuestion(presetData);
+    return getFillQuesitonElements(model, { pageSize: "A3", columnNumber: 2 });
+  },
+  FILL_LINE: (presetData) => {
+    const model = createFillLine(presetData);
+    return getFillLineElements(model, presetData.questions);
+  },
+  EXPLAIN: (presetData) => {
+    const model = createExplain(presetData);
+    return getExplainElements(model);
+  },
+};
+
+function parseCommonPaperStruct(paperJson) {
+  let structList = [];
+  paperJson.paperDetails.forEach((detail) => {
+    const commonQuestions = detail.paperDetailUnits.filter((q) =>
+      COMMON_QUESTION_TYPES.includes(q.questionType)
+    );
+    if (commonQuestions.length) {
+      const commonStructList = getCommonQuestionStructList(
+        detail,
+        commonQuestions,
+        true,
+        0
+      );
+      structList.push(...commonStructList);
+    }
+
+    const nestedQuestions = detail.paperDetailUnits.filter(
+      (q) => !COMMON_QUESTION_TYPES.includes(q.questionType)
+    );
+    if (nestedQuestions.length) {
+      const nestedStructList = getNestedQuestionStructList(
+        detail,
+        nestedQuestions
+      );
+      structList.push(...nestedStructList);
+    }
+  });
+
+  structList.sort((a, b) => a.sortNo - b.sortNo);
+  console.log(structList);
+  return structList;
+}
+
+function getCommonQuestionStructList(
+  detail,
+  questions,
+  isCommon,
+  nestedQNo = 0
+) {
+  let structList = [];
+  let structs = {};
+  const qTypeNum = isCommon ? 1 : 2;
+  questions.forEach((question) => {
+    if (!structs[question.questionType]) structs[question.questionType] = [];
+    structs[question.questionType].push(question);
+  });
+  Object.keys(structs).forEach((structType) => {
+    const typeNo = COMMON_QUESTION_TYPES.indexOf(structType);
+    const questions = parseCommonTypeQuestions(structType, structs[structType]);
+
+    structList.push({
+      detailName: detail.name,
+      detailNo: detail.number,
+      structType,
+      isCommon,
+      nestedQNo,
+      sortNo:
+        typeNo * 10000 + detail.number * 1000 + qTypeNum * 100 + nestedQNo,
+      questions,
+    });
+  });
+  return structList;
+}
+
+function getNestedQuestionStructList(detail, questions) {
+  let structList = [];
+  questions.forEach((question) => {
+    const qStructList = getCommonQuestionStructList(
+      detail,
+      question.subQuestions,
+      false,
+      question.number
+    );
+    structList.push(...qStructList);
+  });
+  return structList;
+}
+
+function parseCommonTypeQuestions(structType, dataList) {
+  const choiceQs = [
+    "SINGLE_ANSWER_QUESTION",
+    "MULTIPLE_ANSWER_QUESTION",
+    "BOOL_ANSWER_QUESTION",
+  ];
+  let questions = [];
+  if (choiceQs.includes(structType)) {
+    questions = dataList.map((item) => {
+      return {
+        questionNo: item.number,
+        optionCount:
+          structType === "BOOL_ANSWER_QUESTION"
+            ? 2
+            : item.question.quesOptions.length,
+      };
+    });
+  } else if (structType === "FILL_BLANK_QUESTION") {
+    questions = dataList.map((item) => {
+      return {
+        questionNo: item.number,
+        fillCount: getFillBackClozeCount(item.question.quesBody),
+      };
+    });
+  } else {
+    questions = dataList.map((item) => item.number);
+  }
+  return questions;
+}
+
+function getFillBackClozeCount(questionBodyContent) {
+  // TODO:
+  let questionBody = null;
+  let num = 0;
+  try {
+    questionBody = JSON.parse(questionBodyContent);
+    questionBody.sections.forEach((section) => {
+      section.blocks.forEach((block) => {
+        if (block.type === "cloze") num++;
+      });
+    });
+  } catch (error) {
+    num = 1;
+  }
+
+  return num;
+}
+
+function buildCardElements(structList) {
+  let cardElements = [];
+  structList.forEach((struct) => {
+    const detailChineseNumber = numberToChinese(struct.detailNo);
+    let topicName = struct.isCommon
+      ? `${detailChineseNumber}、${struct.detailName}`
+      : `${detailChineseNumber}(${struct.nestedQNo})`;
+    const modelType = structTypeToCardElementType[struct.structType];
+
+    if (!struct.isCommon && struct.structType === "TEXT_ANSWER_QUESTION") {
+      struct.questions.forEach((qno) => {
+        const tname = `${topicName}、${qno}`;
+
+        const elements = elementModel[modelType]({
+          questions: [""],
+          topicName: tname,
+        });
+        cardElements.push(...elements);
+      });
+      return;
+    }
+
+    let presetData = {
+      questions: struct.questions,
+      topicName,
+    };
+    if (struct.structType === "MULTIPLE_ANSWER_QUESTION")
+      presetData.isMultiply = true;
+    if (struct.structType === "BOOL_ANSWER_QUESTION")
+      presetData.isBoolean = true;
+
+    const elements = elementModel[modelType](presetData);
+    cardElements.push(...elements);
+  });
+
+  return cardElements;
+}
+
+export function buildPaperCard(paperJson) {
+  const structList = parseCommonPaperStruct(paperJson);
+  const cardElements = buildCardElements(structList);
+  console.log(cardElements);
+  return cardElements;
+}
+
+// const paperStruct = {
+//   paperName: "",
+//   structList: [
+//     {
+//       detailName: "",
+//       detailNo: 1,
+//       structType: 1,
+//       questions: [
+//         { questionNo: "1", optionCount: 4 },
+//         { questionNo: "2", optionCount: 4 },
+//       ],
+//     },
+//     {
+//       detailName: "",
+//       detailNo: 1,
+//       structType: 2,
+//       questions: [
+//         { questionNo: "3", optionCount: 4 },
+//         { questionNo: "4", optionCount: 4 },
+//       ],
+//     },
+//     {
+//       detailName: "",
+//       detailNo: 1,
+//       structType: 3,
+//       questions: [
+//         { questionNo: "5", optionCount: 2 },
+//         { questionNo: "6", optionCount: 2 },
+//       ],
+//     },
+//     {
+//       detailName: "",
+//       detailNo: 1,
+//       structType: 4,
+//       questions: [
+//         { questionNo: "7", fillCount: 1 },
+//         { questionNo: "8", fillCount: 2 },
+//       ],
+//     },
+//     {
+//       detailName: "",
+//       detailNo: 1,
+//       structType: 5,
+//       questions: ["11", "12"],
+//     },
+//   ],
+// };

+ 4783 - 0
src/modules/card/autoBuild/paperJson.json

@@ -0,0 +1,4783 @@
+{
+  "rootOrgName": null,
+  "id": "6278a9589f92794c33b9a72f",
+  "name": "0509试卷",
+  "title": "0509试卷",
+  "subTitle": null,
+  "totalScore": 100.0,
+  "paperType": "GENERATE",
+  "course": {
+    "id": 68,
+    "code": "T020221",
+    "name": "艺术学概论",
+    "orgId": 3,
+    "level": "ALL",
+    "createTime": "2022-05-09 13:39:46",
+    "updateTime": null,
+    "enable": "true"
+  },
+  "paperDetails": [
+    {
+      "id": "6278a9589f92794c33b9a730",
+      "number": 1,
+      "cnNum": "一",
+      "name": "单项选择题",
+      "description": "<p><span>共10<span>小题,每一小题</span>1<span>分,共</span>10分</span></p>",
+      "title": null,
+      "titleDetail": null,
+      "descriptionWord": null,
+      "score": 10.0,
+      "unitCount": 10,
+      "paperDetailUnits": [
+        {
+          "id": "6278a9589f92794c33b9a731",
+          "mainNumber": 1,
+          "number": 1,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6e7",
+            "updateDate": "2022-05-23 18:44:00",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>【 】认为,理性世界是第一性的,感性世界是第二性的,而艺术世界市第三性的。</p>\n",
+            "quesBodyText": "【 】认为,理性世界是第一性的,感性世界是第二性的,而艺术世界市第三性的。",
+            "quesBodyHash": 2305917265935470732,
+            "quesAnswer": "D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>黑格尔</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>苏格拉底</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>康德</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>柏拉图</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-390",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 390,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第1节:物流与物流信息",
+                  "code": "1-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(36)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a732",
+          "mainNumber": 1,
+          "number": 2,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6e8",
+            "updateDate": "2022-05-23 18:44:15",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>一定时代艺术的发展,从最终原因上讲总是在一定的【 】上形成的。</p>\n",
+            "quesBodyText": "一定时代艺术的发展,从最终原因上讲总是在一定的【 】上形成的。",
+            "quesBodyHash": 2305846411440161153,
+            "quesAnswer": "A",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>经济基础</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>上层建筑</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>哲学原理</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>道德准则</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-391",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 391,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第2节:物流信息管理",
+                  "code": "1-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(30)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a733",
+          "mainNumber": 1,
+          "number": 3,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6e9",
+            "updateDate": "2022-05-23 18:44:27",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>&ldquo;表面上是一幅画,其实是他思想和人格的表现。&rdquo;鲁迅先生指的是意大利文艺复兴时期画家达&middot;芬奇的作品【 】。</p>\n",
+            "quesBodyText": "“表面上是一幅画,其实是他思想和人格的表现。”鲁迅先生指的是意大利文艺复兴时期画家达·芬奇的作品【 】。",
+            "quesBodyHash": 2449961499008304263,
+            "quesAnswer": "B",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>《父亲》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>《蒙娜丽莎》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>《<span>米斯·凡德·罗》</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>《巴尔扎克像》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-392",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 392,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第3节:物流信息管理系统",
+                  "code": "1-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(51)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a734",
+          "mainNumber": 1,
+          "number": 4,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6ea",
+            "updateDate": "2022-05-23 18:44:40",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>《桨声灯影里的秦淮河》作者是【 】</p>\n",
+            "quesBodyText": "《桨声灯影里的秦淮河》作者是【 】",
+            "quesBodyHash": 2235675336869,
+            "quesAnswer": "D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>徐志摩</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>罗丹</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>周树人</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>朱自清</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-394",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 394,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第1节:物流信息的采集与标准化",
+                  "code": "2-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(16)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a735",
+          "mainNumber": 1,
+          "number": 5,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6eb",
+            "updateDate": "2022-05-23 18:44:55",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>电影艺术诞生的时间是【 】</p>\n",
+            "quesBodyText": "电影艺术诞生的时间是【 】",
+            "quesBodyHash": 2305987766804181124,
+            "quesAnswer": "B",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span><span>1958年12月28日</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span><span>1895年12月28日</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span><span>1949年10月1日</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span><span>1905年12月28日</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-395",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 395,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第2节:物流信息的存取和管理",
+                  "code": "2-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(12)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a736",
+          "mainNumber": 1,
+          "number": 6,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6ec",
+            "updateDate": "2022-05-23 18:45:08",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>绘画艺术属于【 】。</p>\n",
+            "quesBodyText": "绘画艺术属于【 】。",
+            "quesBodyHash": 4252951810604941715,
+            "quesAnswer": "D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>听觉艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>时空艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>表演艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>造型艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-396",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 396,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第3节:物流信息的传递和输出",
+                  "code": "2-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(9)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a737",
+          "mainNumber": 1,
+          "number": 7,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6ed",
+            "updateDate": "2022-05-23 18:45:18",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>北京颐和园属于实用艺术中的【 】。</p>\n",
+            "quesBodyText": "北京颐和园属于实用艺术中的【 】。",
+            "quesBodyHash": 2305851065860793346,
+            "quesAnswer": "C",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>建筑艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>综合艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>园林艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>语言艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-390",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 390,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第1节:物流与物流信息",
+                  "code": "1-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(16)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a738",
+          "mainNumber": 1,
+          "number": 8,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6ee",
+            "updateDate": "2022-05-23 18:45:29",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>北宋画家张择端创作的国宝级传世名作是【 】。</p>\n",
+            "quesBodyText": "北宋画家张择端创作的国宝级传世名作是【 】。",
+            "quesBodyHash": 3889727738476,
+            "quesAnswer": "D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>《喀秋莎》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>《马》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>《虾》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>《清明上河图》</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-391",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 391,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第2节:物流信息管理",
+                  "code": "1-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(21)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a739",
+          "mainNumber": 1,
+          "number": 9,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6ef",
+            "updateDate": "2022-05-23 18:45:39",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>戏剧艺术狭义上特指的是【 】。</p>\n",
+            "quesBodyText": "戏剧艺术狭义上特指的是【 】。",
+            "quesBodyHash": 2306128063052645768,
+            "quesAnswer": "A",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>话剧</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>歌剧</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>音乐剧</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>真人秀</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-392",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 392,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第3节:物流信息管理系统",
+                  "code": "1-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(14)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a73a",
+          "mainNumber": 1,
+          "number": 10,
+          "score": 1.0,
+          "questionType": "SINGLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f0",
+            "updateDate": "2022-05-23 18:45:50",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>下列哪个属于第七艺术【 】。</p>\n",
+            "quesBodyText": "下列哪个属于第七艺术【 】。",
+            "quesBodyHash": 3032347455321424918,
+            "quesAnswer": "C",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>绘画</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>电竞游戏</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>电影</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>电视</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "SINGLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 1.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-394",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 394,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第1节:物流信息的采集与标准化",
+                  "code": "2-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "单选" },
+              { "tag": "分值", "content": "1.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(13)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        }
+      ],
+      "hasAudio": null,
+      "questionTypes": null,
+      "nested": false,
+      "resetSubQuesSeq": null,
+      "sortNumber": null,
+      "firstScore": null,
+      "quesType": null,
+      "std": null,
+      "cv": null,
+      "reliability": null,
+      "difficultyDegree": null,
+      "tags": [
+        { "tag": "标准差", "content": "-" },
+        { "tag": "难度", "content": "-" },
+        { "tag": "差异系数", "content": "-" },
+        { "tag": "信度", "content": "-" }
+      ]
+    },
+    {
+      "id": "6278a9589f92794c33b9a73b",
+      "number": 2,
+      "cnNum": "二",
+      "name": "多项选择题",
+      "description": "<p><span>共5<span>题,每一小题</span>2<span>分,共</span>10<span>分,五个选项中至少有</span>2<span>个选项符合题目要求,答错或少选不给分。</span></span></p>",
+      "title": null,
+      "titleDetail": null,
+      "descriptionWord": null,
+      "score": 10.0,
+      "unitCount": 5,
+      "paperDetailUnits": [
+        {
+          "id": "6278a9589f92794c33b9a73c",
+          "mainNumber": 2,
+          "number": 1,
+          "score": 2.0,
+          "questionType": "MULTIPLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f1",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span>艺术起源的几种主要观点分别是【 】。</span></p>",
+            "quesBodyText": "艺术起源的几种主要观点分别是【 】。",
+            "quesBodyHash": 2310635785442215015,
+            "quesAnswer": "A,B,C,D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>“<span>模仿说”</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>“<span>游戏说”</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>“<span>表现说”</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>“<span>巫术说”</span></span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "MULTIPLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "多选" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(17)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a73d",
+          "mainNumber": 2,
+          "number": 2,
+          "score": 2.0,
+          "questionType": "MULTIPLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f2",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span>艺术的社会功能包含【 】。</span></p>",
+            "quesBodyText": "艺术的社会功能包含【 】。",
+            "quesBodyHash": 2666284570321769698,
+            "quesAnswer": "A,B,C",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>审美认知</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>审美教育</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>审美娱乐</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>审美游戏</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              }
+            ],
+            "questionType": "MULTIPLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "多选" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(12)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a73e",
+          "mainNumber": 2,
+          "number": 3,
+          "score": 2.0,
+          "questionType": "MULTIPLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f3",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span><span>以艺术形象的审美方式为依据,将艺术分为</span>【 】。</span></p>",
+            "quesBodyText": "以艺术形象的审美方式为依据,将艺术分为【 】。",
+            "quesBodyHash": 2853816374695,
+            "quesAnswer": "A,B,D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>听觉艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>视觉艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>表演艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>视听艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "MULTIPLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "多选" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(22)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a73f",
+          "mainNumber": 2,
+          "number": 4,
+          "score": 2.0,
+          "questionType": "MULTIPLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f4",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span>实用艺术的审美特征包括</span><span>【 </span><span><span> 】。</span></span></p>",
+            "quesBodyText": "实用艺术的审美特征包括【 】。",
+            "quesBodyHash": 2377904528856068641,
+            "quesAnswer": "A,B,D",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>实用性与审美性</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>表现性与形式美</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>个性与共性</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>民族性与时代性</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "MULTIPLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "多选" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(14)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a740",
+          "mainNumber": 2,
+          "number": 5,
+          "score": 2.0,
+          "questionType": "MULTIPLE_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f5",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span>造型艺术分为【</span><span> </span><span>】。</span></p>",
+            "quesBodyText": "造型艺术分为【 】。",
+            "quesBodyHash": 2484902437666954,
+            "quesAnswer": "A,B,C,E",
+            "quesOptions": [
+              {
+                "number": 1,
+                "optionBody": "<p><span>绘画艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 2,
+                "optionBody": "<p><span>雕塑艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 3,
+                "optionBody": "<p><span>摄影艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              },
+              {
+                "number": 4,
+                "optionBody": "<p><span>化妆艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 0
+              },
+              {
+                "number": 5,
+                "optionBody": "<p><span>书</span><span>法艺术</span></p>",
+                "optionBodyWord": null,
+                "isCorrect": 1
+              }
+            ],
+            "questionType": "MULTIPLE_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "多选" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(9)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        }
+      ],
+      "hasAudio": null,
+      "questionTypes": null,
+      "nested": false,
+      "resetSubQuesSeq": null,
+      "sortNumber": null,
+      "firstScore": null,
+      "quesType": null,
+      "std": null,
+      "cv": null,
+      "reliability": null,
+      "difficultyDegree": null,
+      "tags": [
+        { "tag": "标准差", "content": "-" },
+        { "tag": "难度", "content": "-" },
+        { "tag": "差异系数", "content": "-" },
+        { "tag": "信度", "content": "-" }
+      ]
+    },
+    {
+      "id": "6278a9589f92794c33b9a741",
+      "number": 3,
+      "cnNum": "三",
+      "name": "判断题",
+      "description": "<p><span>本大题共15<span>小题,每小题</span>2<span>分,共</span>30分,<span>判断下列各题正误,正确的在题后括号内打“√”,错误的打“×”</span>,并在下方写上正确答案。</span></p>",
+      "title": null,
+      "titleDetail": null,
+      "descriptionWord": null,
+      "score": 30.0,
+      "unitCount": 15,
+      "paperDetailUnits": [
+        {
+          "id": "6278a9589f92794c33b9a742",
+          "mainNumber": 3,
+          "number": 1,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f6",
+            "updateDate": "2022-05-23 18:46:07",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>《韩熙载夜宴图》为五代南唐画家李煜的作品。【 】</p>\n",
+            "quesBodyText": "《韩熙载夜宴图》为五代南唐画家李煜的作品。【 】",
+            "quesBodyHash": 2219225272405,
+            "quesAnswer": "错误",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-390",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 390,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第1节:物流与物流信息",
+                  "code": "1-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(23)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a743",
+          "mainNumber": 3,
+          "number": 2,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f7",
+            "updateDate": "2022-05-23 18:46:15",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>北宋著名画家张择端创作了巨型长卷风俗画《清明上河图》。【 】</p>\n",
+            "quesBodyText": "北宋著名画家张择端创作了巨型长卷风俗画《清明上河图》。【 】",
+            "quesBodyHash": 38671453133768,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-391",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 391,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第2节:物流信息管理",
+                  "code": "1-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(29)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a744",
+          "mainNumber": 3,
+          "number": 3,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f8",
+            "updateDate": "2022-05-23 18:46:26",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>剧场性是戏剧艺术的特征,人们常把剧本、演员、观众称作戏剧艺术的三要素。【 】</p>\n",
+            "quesBodyText": "剧场性是戏剧艺术的特征,人们常把剧本、演员、观众称作戏剧艺术的三要素。【 】",
+            "quesBodyHash": 2305847174619886985,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-392",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 392,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第3节:物流信息管理系统",
+                  "code": "1-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(37)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a745",
+          "mainNumber": 3,
+          "number": 4,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6f9",
+            "updateDate": "2022-05-23 18:46:36",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>戏曲是中国传统的戏剧形式的总称。【 】</p>\n",
+            "quesBodyText": "戏曲是中国传统的戏剧形式的总称。【 】",
+            "quesBodyHash": 2882311492819865729,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-394",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 394,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第1节:物流信息的采集与标准化",
+                  "code": "2-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(18)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a746",
+          "mainNumber": 3,
+          "number": 5,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6fa",
+            "updateDate": "2022-05-23 18:46:46",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>沈阳故宫是我国现存最大、最完整的宫殿式古建筑群,坐落在城市的中轴线上。【 】</p>\n",
+            "quesBodyText": "沈阳故宫是我国现存最大、最完整的宫殿式古建筑群,坐落在城市的中轴线上。【 】",
+            "quesBodyHash": 2305987598699339781,
+            "quesAnswer": "错误",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-395",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 395,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第2节:物流信息的存取和管理",
+                  "code": "2-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(37)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a747",
+          "mainNumber": 3,
+          "number": 6,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6fb",
+            "updateDate": "2022-05-23 18:46:55",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>世界三大园林体系中,包括东方园林(以中国园林为代表)、欧洲园林(以法国园林为代表)、阿拉伯式园林(从古代巴比伦园林和波斯园林发展起来)。【 】</p>\n",
+            "quesBodyText": "世界三大园林体系中,包括东方园林(以中国园林为代表)、欧洲园林(以法国园林为代表)、阿拉伯式园林(从古代巴比伦园林和波斯园林发展起来)。【 】",
+            "quesBodyHash": 2558762127746538138,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-396",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 396,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第3节:物流信息的传递和输出",
+                  "code": "2-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(70)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a748",
+          "mainNumber": 3,
+          "number": 7,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6fc",
+            "updateDate": "2022-05-23 18:47:09",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>颐和园气势雄伟、设计精湛,体现出中国古代帝王宫苑自清朝以来的传统风格。【 】</p>\n",
+            "quesBodyText": "颐和园气势雄伟、设计精湛,体现出中国古代帝王宫苑自清朝以来的传统风格。【 】",
+            "quesBodyHash": 2488269088448461048,
+            "quesAnswer": "错误",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-390",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 390,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第1节:物流与物流信息",
+                  "code": "1-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(37)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a749",
+          "mainNumber": 3,
+          "number": 8,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6fd",
+            "updateDate": "2022-05-23 18:47:19",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>最早的电影都是无声电影,被称为&ldquo;默片&rdquo;。【 】</p>\n",
+            "quesBodyText": "最早的电影都是无声电影,被称为“默片”。【 】",
+            "quesBodyHash": 4665999306265713898,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-391",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 391,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第2节:物流信息管理",
+                  "code": "1-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(22)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a74a",
+          "mainNumber": 3,
+          "number": 9,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6fe",
+            "updateDate": "2022-05-23 18:47:28",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>我们一般认为戏剧艺术,从广义上说,包括话剧、戏曲、歌剧、舞剧、音乐剧等【 】。</p>\n",
+            "quesBodyText": "我们一般认为戏剧艺术,从广义上说,包括话剧、戏曲、歌剧、舞剧、音乐剧等【 】。",
+            "quesBodyHash": 3139171327560771213,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-392",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 392,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第3节:物流信息管理系统",
+                  "code": "1-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(38)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a74b",
+          "mainNumber": 3,
+          "number": 10,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a6ff",
+            "updateDate": "2022-05-23 18:47:39",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>据不完全统计,我国各地有300多个剧种,其中包括全国性的剧种如京剧、川剧,也包括地方戏如昆曲、秦腔、河北梆子等。 【 】</p>\n",
+            "quesBodyText": "据不完全统计,我国各地有300多个剧种,其中包括全国性的剧种如京剧、川剧,也包括地方戏如昆曲、秦腔、河北梆子等。 【 】",
+            "quesBodyHash": 2305847033070103200,
+            "quesAnswer": "错误",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-394",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 394,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第1节:物流信息的采集与标准化",
+                  "code": "2-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(58)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a74c",
+          "mainNumber": 3,
+          "number": 11,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a700",
+            "updateDate": "2022-05-23 18:47:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>中国的第一部有声片是《歌女红牡丹》。【 】</p>\n",
+            "quesBodyText": "中国的第一部有声片是《歌女红牡丹》。【 】",
+            "quesBodyHash": 144119078113409189,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-395",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 395,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第2节:物流信息的存取和管理",
+                  "code": "2-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(20)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a74d",
+          "mainNumber": 3,
+          "number": 12,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a701",
+            "updateDate": "2022-05-23 18:47:57",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>电视艺术是第八艺术。【 】</p>\n",
+            "quesBodyText": "电视艺术是第八艺术。【 】",
+            "quesBodyHash": 4126862839966488011,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-393-396",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 393,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第2章:物流信息的处理过程",
+                  "code": "2",
+                  "number": 2,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 396,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 393,
+                  "name": "第3节:物流信息的传递和输出",
+                  "code": "2-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(12)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a74e",
+          "mainNumber": 3,
+          "number": 13,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a702",
+            "updateDate": "2022-05-23 18:48:07",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>&ldquo;地球村&rdquo;的概念是在21世纪以来被提出的。【 】</p>\n",
+            "quesBodyText": "“地球村”的概念是在21世纪以来被提出的。【 】",
+            "quesBodyHash": 7181999284361,
+            "quesAnswer": "错误",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-390",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 390,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第1节:物流与物流信息",
+                  "code": "1-1",
+                  "number": 1,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(23)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a74f",
+          "mainNumber": 3,
+          "number": 14,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a703",
+            "updateDate": "2022-05-23 18:48:18",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>北京电视台是我国第一家电视台。【 】</p>\n",
+            "quesBodyText": "北京电视台是我国第一家电视台。【 】",
+            "quesBodyHash": 3087244081846056248,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-391",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 391,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第2节:物流信息管理",
+                  "code": "1-2",
+                  "number": 2,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(17)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a750",
+          "mainNumber": 3,
+          "number": 15,
+          "score": 2.0,
+          "questionType": "BOOL_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a704",
+            "updateDate": "2022-05-23 18:48:28",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p>从审美特征上看,电视与电影作为姊妹艺术有许多相同之处。 【 】</p>\n",
+            "quesBodyText": "从审美特征上看,电视与电影作为姊妹艺术有许多相同之处。 【 】",
+            "quesBodyHash": 2305845418728395529,
+            "quesAnswer": "正确",
+            "quesOptions": null,
+            "questionType": "BOOL_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 2.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": "DIVERSIFIED_TEXT",
+            "quesProperties": [
+              {
+                "id": "23-389-392",
+                "courseProperty": {
+                  "updateTime": "2022-04-13 14:18:48",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 23,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": null,
+                  "courseId": 68,
+                  "name": "测试课程蓝图结构",
+                  "enable": true
+                },
+                "firstProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 389,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 0,
+                  "name": "第1章:物流信息管理系统理论基础",
+                  "code": "1",
+                  "number": 1,
+                  "remark": null
+                },
+                "secondProperty": {
+                  "updateTime": "2022-04-13 14:17:26",
+                  "creationTime": "2022-04-13 14:17:26",
+                  "id": 392,
+                  "creationBy": 70,
+                  "updateBy": 70,
+                  "rootOrgId": 3,
+                  "coursePropertyId": 23,
+                  "parentId": 389,
+                  "name": "第3节:物流信息管理系统",
+                  "code": "1-3",
+                  "number": 3,
+                  "remark": null
+                }
+              }
+            ],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "判断" },
+              { "tag": "分值", "content": "2.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(29)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        }
+      ],
+      "hasAudio": null,
+      "questionTypes": null,
+      "nested": false,
+      "resetSubQuesSeq": null,
+      "sortNumber": null,
+      "firstScore": null,
+      "quesType": null,
+      "std": null,
+      "cv": null,
+      "reliability": null,
+      "difficultyDegree": null,
+      "tags": [
+        { "tag": "标准差", "content": "-" },
+        { "tag": "难度", "content": "-" },
+        { "tag": "差异系数", "content": "-" },
+        { "tag": "信度", "content": "-" }
+      ]
+    },
+    {
+      "id": "6278a9589f92794c33b9a751",
+      "number": 4,
+      "cnNum": "四",
+      "name": "简答题",
+      "description": "<p><span>共5<span>小题,每一小题</span>7<span>分,共</span>35分</span></p>",
+      "title": null,
+      "titleDetail": null,
+      "descriptionWord": null,
+      "score": 35.0,
+      "unitCount": 5,
+      "paperDetailUnits": [
+        {
+          "id": "6278a9589f92794c33b9a752",
+          "mainNumber": 4,
+          "number": 1,
+          "score": 7.0,
+          "questionType": "TEXT_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a705",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span><span>简述“艺术的主要特征”是什么?</span></span></p>",
+            "quesBodyText": "简述“艺术的主要特征”是什么?",
+            "quesBodyHash": 2908483001013843238,
+            "quesAnswer": "<p><span> <span>形象性、主体性、审美性。艺术形象是客观与主观、内容与形式、个性与共性的统一。艺术创作、艺术作品与艺术鉴赏均具有主体性的特点。艺术的审美性是人类审美意识的集中体现,是真、善、美的结晶,艺术的审美性体现为内容美和形式美的统一。</span></span></p>",
+            "quesOptions": null,
+            "questionType": "TEXT_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 7.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "问答" },
+              { "tag": "分值", "content": "7.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(15)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a753",
+          "mainNumber": 4,
+          "number": 2,
+          "score": 7.0,
+          "questionType": "TEXT_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a706",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span><span>关于艺术起源的五种观点是什么?</span></span><span> </span></p>",
+            "quesBodyText": "关于艺术起源的五种观点是什么?",
+            "quesBodyHash": 2311902560336094261,
+            "quesAnswer": "<p><span> <span>关于艺术的起源有多种说法,其中影响较大的主要是“模仿说”、“游戏说”、“表现说”、“巫术说”、“生产劳动说”等五种,每种说法都有一定的道理,但又都不够全面。因此,我们主张第</span>6<span>种说法,即“多元决定论”。</span></span></p>",
+            "quesOptions": null,
+            "questionType": "TEXT_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 7.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "问答" },
+              { "tag": "分值", "content": "7.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(15)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a754",
+          "mainNumber": 4,
+          "number": 3,
+          "score": 7.0,
+          "questionType": "TEXT_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a707",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span>简述戏剧艺术的概念和特征。</span></p>",
+            "quesBodyText": "简述戏剧艺术的概念和特征。",
+            "quesBodyHash": 2882308044169950593,
+            "quesAnswer": "<p><span> <span>从广义上讲,戏剧包括话剧、中国戏曲、歌剧、舞剧、乃至目前欧美各国影响广泛的音乐剧等。从狭义上讲,戏剧主要是指话剧。这里所讲的戏剧即指话剧,是从狭义理解的。话剧在欧美各国通常被称为戏剧。戏剧是在舞台上由演员以对话和动作为主要表现手段,为观众当场表演故事情节的一门综合艺术。</span></span></p>",
+            "quesOptions": null,
+            "questionType": "TEXT_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 7.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "问答" },
+              { "tag": "分值", "content": "7.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(13)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a755",
+          "mainNumber": 4,
+          "number": 4,
+          "score": 7.0,
+          "questionType": "TEXT_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a708",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span><span>简述什么是“蒙太奇”</span>。</span></p>",
+            "quesBodyText": "简述什么是“蒙太奇”。",
+            "quesBodyHash": 2308167813413732386,
+            "quesAnswer": "<p><span> <span>音译词,原为建筑学用语,意为装配、组合、构成等,在影视艺术中,这一术语被用来指画面、镜头和声音的组织结构方式。</span></span></p>",
+            "quesOptions": null,
+            "questionType": "TEXT_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 7.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "问答" },
+              { "tag": "分值", "content": "7.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(11)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        },
+        {
+          "id": "6278a9589f92794c33b9a756",
+          "mainNumber": 4,
+          "number": 5,
+          "score": 7.0,
+          "questionType": "TEXT_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a709",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span>请简要阐释实用艺术的主要审美特征。</span></p>",
+            "quesBodyText": "请简要阐释实用艺术的主要审美特征。",
+            "quesBodyHash": 2308384990196814690,
+            "quesAnswer": "<p><span> <span>形象性、主体性、审美性。艺术形象是客观与主观、内容与形式、个性与共性的统一。艺术创作、艺术作品与艺术鉴赏均具有主体性的特点。艺术的审美性是人类审美意识的集中体现,是真、善、美的结晶,艺术的审美性体现为内容美和形式美的统一。</span></span></p>",
+            "quesOptions": null,
+            "questionType": "TEXT_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 7.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "问答" },
+              { "tag": "分值", "content": "7.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(17)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        }
+      ],
+      "hasAudio": null,
+      "questionTypes": null,
+      "nested": false,
+      "resetSubQuesSeq": null,
+      "sortNumber": null,
+      "firstScore": null,
+      "quesType": null,
+      "std": null,
+      "cv": null,
+      "reliability": null,
+      "difficultyDegree": null,
+      "tags": [
+        { "tag": "标准差", "content": "-" },
+        { "tag": "难度", "content": "-" },
+        { "tag": "差异系数", "content": "-" },
+        { "tag": "信度", "content": "-" }
+      ]
+    },
+    {
+      "id": "6278a9589f92794c33b9a757",
+      "number": 5,
+      "cnNum": "五",
+      "name": "论述题",
+      "description": "<p><span><span>共1题,共</span>15分</span></p>",
+      "title": null,
+      "titleDetail": null,
+      "descriptionWord": null,
+      "score": 15.0,
+      "unitCount": 1,
+      "paperDetailUnits": [
+        {
+          "id": "6278a9589f92794c33b9a758",
+          "mainNumber": 5,
+          "number": 1,
+          "score": 15.0,
+          "questionType": "TEXT_ANSWER_QUESTION",
+          "question": {
+            "id": "6278a9249f92794c33b9a70a",
+            "updateDate": "2022-05-09 13:39:48",
+            "creationDate": "2022-05-09 13:39:48",
+            "creationBy": 70,
+            "updateBy": 70,
+            "quesBody": "<p><span><span>结合《艺术学概论》课程知识,谈谈你对该课程的学习心得。</span></span></p>",
+            "quesBodyText": "结合《艺术学概论》课程知识,谈谈你对该课程的学习心得。",
+            "quesBodyHash": 2341871849484459618,
+            "quesAnswer": "<p><span> 根据学生的解答酌情给分。</span></p>",
+            "quesOptions": null,
+            "questionType": "TEXT_ANSWER_QUESTION",
+            "subQuestions": null,
+            "score": 15.0,
+            "course": {
+              "id": 68,
+              "code": "T020221",
+              "name": "艺术学概论",
+              "orgId": 3,
+              "level": "ALL",
+              "createTime": "2022-05-09 13:39:46",
+              "updateTime": null,
+              "enable": "true"
+            },
+            "orgId": 3,
+            "quesParam": {},
+            "control": {},
+            "hasAudio": null,
+            "questionAudios": null,
+            "quesName": null,
+            "specialty": null,
+            "subNumber": null,
+            "answerType": null,
+            "quesProperties": [],
+            "difficultyDegree": 0.5,
+            "publicity": true,
+            "difficulty": "中",
+            "calculateDifficultyDegree": null,
+            "propertyGroup": null,
+            "audioList": null,
+            "quesBodyWord": null,
+            "quesAnswerWord": null,
+            "quesOptionsWord": null,
+            "std": null,
+            "cv": null,
+            "reliability": null,
+            "exposureTimes": null,
+            "maxRepetition": 100.0,
+            "questionSeq": 0,
+            "tags": [
+              { "tag": "标准差", "content": "-" },
+              { "tag": "难度", "content": "0.5" },
+              { "tag": "差异系数", "content": "-" },
+              { "tag": "信度", "content": "-" },
+              { "tag": "题型大类", "content": "基础题型" },
+              { "tag": "题型小类", "content": "问答" },
+              { "tag": "分值", "content": "15.0" },
+              { "tag": "曝光次数", "content": "-" },
+              { "tag": "最高重复率", "content": "100.0%" }
+            ],
+            "bodyLengthText": "题干词数(27)",
+            "checkDuplicateStatus": "DISPOSED",
+            "basePaperId": "6278a9249f92794c33b9a6e1",
+            "creator": null,
+            "basePaperName": null,
+            "quesMainType": null,
+            "calculateAvgScore": null,
+            "discrimination": null,
+            "duplicateRate": null,
+            "auditStatus": "PASS"
+          },
+          "quesId": null,
+          "subScoreList": null,
+          "optionOrder": null,
+          "firstName": null,
+          "firstCode": null,
+          "secondName": null,
+          "secondCode": null,
+          "optionsSelected": null,
+          "publicity": null
+        }
+      ],
+      "hasAudio": null,
+      "questionTypes": null,
+      "nested": false,
+      "resetSubQuesSeq": null,
+      "sortNumber": null,
+      "firstScore": null,
+      "quesType": null,
+      "std": null,
+      "cv": null,
+      "reliability": null,
+      "difficultyDegree": null,
+      "tags": [
+        { "tag": "标准差", "content": "-" },
+        { "tag": "难度", "content": "-" },
+        { "tag": "差异系数", "content": "-" },
+        { "tag": "信度", "content": "-" }
+      ]
+    }
+  ],
+  "params": null,
+  "objectiveDetails": null,
+  "subjectiveDetails": null,
+  "objectiveTitle": null,
+  "subjectiveTitle": null,
+  "objectiveScore": null,
+  "subjectiveScore": null,
+  "hasAudio": null,
+  "difficultyDegree": 0.5,
+  "examRemark": null,
+  "examRemarkWord": null,
+  "std": null,
+  "cv": null,
+  "reliability": null,
+  "exposureRate": null,
+  "lastAuditTime": "2022-05-09 13:41:30",
+  "auditStatus": "PASS",
+  "checkDuplicateStatus": "DISPOSED",
+  "creationBy": 70
+}

+ 0 - 0
src/modules/card/paperJsonTemp.json → src/modules/card/autoBuild/paperJsonTemp.json


+ 0 - 137
src/modules/card/components/CardConfigPropEdit.vue

@@ -1,137 +0,0 @@
-<template>
-  <div class="card-config-prop-edit">
-    <el-button type="primary" @click="drawer = true"> 配置题卡信息 </el-button>
-    <el-drawer
-      title="配置题卡信息"
-      :visible.sync="drawer"
-      :with-header="false"
-      append-to-body
-    >
-      <div style="padding: 20px">
-        <el-form ref="form" :model="form" label-width="100px">
-          <el-form-item label="学校名称">
-            <el-input v-model="form.schoolName" @change="editChange">
-            </el-input>
-          </el-form-item>
-          <el-form-item label="考号类型">
-            <el-select
-              v-model="form.examNumberStyle"
-              placeholder="请选择学生考号类型"
-              @change="editChange"
-            >
-              <el-option
-                v-for="item in examNumberStyleOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="AB卷类型">
-            <el-select
-              v-model="form.aOrBType"
-              placeholder="请选择AB卷类型"
-              @change="editChange"
-            >
-              <el-option
-                v-for="item in aOrBTypeOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item>
-            <el-checkbox v-model="form.aOrB" @change="editChange"
-              >启用AB卷</el-checkbox
-            >
-          </el-form-item>
-          <el-form-item>
-            <el-checkbox v-model="form.examAbsent" @change="editChange"
-              >启用缺考和涂填提示</el-checkbox
-            >
-          </el-form-item>
-          <el-form-item>
-            <el-checkbox v-model="form.writeSign" @change="editChange"
-              >启用手写签名</el-checkbox
-            >
-          </el-form-item>
-          <el-form-item>
-            <el-checkbox v-model="form.showForbidArea" @change="editChange"
-              >启用禁填区</el-checkbox
-            >
-          </el-form-item>
-        </el-form>
-      </div>
-    </el-drawer>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations } from "vuex";
-import { objAssign } from "../plugins/utils";
-
-export default {
-  name: "CardConfigPropEdit",
-  data() {
-    return {
-      examNumberStyleOptions: [
-        {
-          label: "自动条码",
-          value: "auto",
-        },
-        {
-          label: "手动条码",
-          value: "empty",
-        },
-        {
-          label: "手动涂填",
-          value: "fill",
-        },
-      ],
-      aOrBTypeOptions: [
-        {
-          label: "自动条码",
-          value: "auto",
-        },
-        {
-          label: "手动涂填",
-          value: "fill",
-        },
-      ],
-      drawer: false,
-      form: {
-        schoolName: "河南财经政法大学",
-        examNumberStyle: "fill",
-        aOrBType: "auto",
-        aOrB: true,
-        examAbsent: true,
-        writeSign: true,
-        showForbidArea: true,
-      },
-    };
-  },
-  computed: {
-    ...mapState("card", ["cardConfig"]),
-  },
-  watch: {
-    cardConfig(val) {
-      this.form = objAssign(this.form, val);
-    },
-  },
-  methods: {
-    ...mapMutations("card", ["setCardConfig"]),
-    editChange() {
-      this.setCardConfig({ ...this.form });
-    },
-  },
-};
-</script>
-
-<style lang="scss">
-.card-config-prop-edit {
-  display: inline-block;
-}
-</style>

+ 10 - 40
src/modules/card/components/CardDesign.vue

@@ -15,23 +15,6 @@
           <page-prop-edit @init-page="initPageData"></page-prop-edit>
         </div>
       </div>
-      <div class="action-part">
-        <div class="action-part-title"><h2>试题配置</h2></div>
-        <div class="action-part-body">
-          <div class="type-list">
-            <div
-              v-for="(item, index) in TOPIC_LIST"
-              :key="index"
-              class="type-item"
-            >
-              <el-button @click="addNewTopic(item)"
-                ><i class="el-icon-plus"></i>{{ item.name }}</el-button
-              >
-            </div>
-          </div>
-          <p class="tips-info">提示:点击创建试题</p>
-        </div>
-      </div>
       <div class="action-part">
         <div class="action-part-title"><h2>插入元素</h2></div>
         <div class="action-part-body">
@@ -47,11 +30,7 @@
             </div>
             <p class="tips-info">提示:拖动插入元素</p>
           </div>
-          <!-- Develop btns -->
-          <!-- <card-config-prop-edit></card-config-prop-edit> -->
         </div>
-        <!-- <br /><br /> -->
-        <!-- <el-button @click="initCard">新建页面</el-button> -->
       </div>
     </div>
 
@@ -213,12 +192,6 @@
     <element-prop-edit ref="ElementPropEdit"></element-prop-edit>
     <!-- right-click-menu -->
     <right-click-menu @inset-topic="insetNewTopic"></right-click-menu>
-    <!-- topic select dialog -->
-    <topic-select-dialog
-      ref="TopicSelectDialog"
-      :topics="topicList"
-      @confirm="addNewTopic"
-    ></topic-select-dialog>
   </div>
 </template>
 
@@ -231,23 +204,21 @@ import {
   TOPIC_LIST,
 } from "../elementModel";
 import { CARD_VERSION } from "../enumerate";
-// import CardConfigPropEdit from "../components/CardConfigPropEdit";
-import TopicElementEdit from "../components/TopicElementEdit";
-import TopicElementPreview from "../components/TopicElementPreview";
-import FreeElementPreview from "../components/FreeElementPreview";
-import PagePropEdit from "../components/PagePropEdit";
-import ElementPropEdit from "../components/ElementPropEdit";
-import RightClickMenu from "../components/RightClickMenu";
-import PageNumber from "../components/PageNumber";
-import TopicSelectDialog from "../components/TopicSelectDialog";
+import TopicElementEdit from "./TopicElementEdit";
+import TopicElementPreview from "./TopicElementPreview";
+import FreeElementPreview from "./FreeElementPreview";
+import PagePropEdit from "./PagePropEdit";
+import ElementPropEdit from "./ElementPropEdit";
+import RightClickMenu from "./RightClickMenu";
+import PageNumber from "./PageNumber";
 import { getPageInitElements } from "../pageModel";
-import initPaperJson from "../paperJsonTemp.json";
-import { buildPaperCard } from "../autoBuildCard";
+// test auto build
+import initPaperJson from "../autoBuild/paperJson.json";
+import { buildPaperCard } from "../autoBuild/paperCard";
 
 export default {
   name: "CardDesign",
   components: {
-    // CardConfigPropEdit,
     TopicElementEdit,
     TopicElementPreview,
     FreeElementPreview,
@@ -255,7 +226,6 @@ export default {
     ElementPropEdit,
     RightClickMenu,
     PageNumber,
-    TopicSelectDialog,
   },
   props: {
     content: {

+ 1 - 9
src/modules/card/components/PagePropEdit.vue

@@ -17,7 +17,7 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="栏位布局">
+      <!-- <el-form-item label="栏位布局">
         <el-button
           v-for="(item, index) in columnOptions"
           :key="index"
@@ -35,9 +35,6 @@
             ]"
           ></i>
         </el-button>
-      </el-form-item>
-      <!-- <el-form-item label-width="0px">
-        <el-checkbox v-model="form.aOrB" disabled>启用A/B卷</el-checkbox>
       </el-form-item> -->
       <el-form-item label="禁答区域">
         <el-checkbox
@@ -46,11 +43,6 @@
           >启用</el-checkbox
         >
       </el-form-item>
-      <el-form-item label="大题数">
-        <ul v-if="topicSeries.length" class="topicno-list">
-          <li>{{ topicSeries.length }}</li>
-        </ul>
-      </el-form-item>
     </el-form>
   </div>
 </template>

+ 0 - 358
src/modules/card/components/PaperParams.vue

@@ -1,358 +0,0 @@
-<template>
-  <el-dialog
-    class="paper-params"
-    :visible.sync="modalIsShow"
-    top="10px"
-    width="785px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="dialogOpen"
-  >
-    <h1 slot="title" class="params-dialog-title">
-      请上传阅卷参数
-      <span
-        >卷面总分合计:<em class="param-sum-score">{{ pageSumScore }}分</em>
-      </span>
-    </h1>
-    <div class="params-main">
-      <div class="params-head">
-        <el-button
-          :type="!topicType ? 'primary' : 'default'"
-          @click="selectType(0)"
-          >客观题区</el-button
-        >
-        <el-button
-          :type="topicType ? 'primary' : 'default'"
-          @click="selectType(1)"
-          >主观题区</el-button
-        >
-      </div>
-      <div class="params-body">
-        <div style="text-align: right">
-          <upload-button
-            v-if="topicType"
-            btn-icon="el-icon-upload"
-            btn-content="选择上传主观题标答文件(doc/docx)"
-            btn-type="warning"
-            :upload-url="uploadUrl"
-            :format="['doc', 'docx']"
-            style="margin: 0"
-            @valid-error="validError"
-            @upload-success="uploadSuccess"
-          >
-          </upload-button>
-        </div>
-        <div v-for="topic in curTopicList" :key="topic.id" class="params-part">
-          <h2 class="params-title">{{ topic.topicName }}</h2>
-          <p class="params-subtitle">
-            <span>题型:{{ topic.name }}</span>
-            <span v-if="topic.type !== 'COMPOSITION'">
-              通配小题分值:
-              <el-input-number
-                v-model="topic.commonQuestionScore"
-                size="small"
-                :min="0.1"
-                :max="200"
-                :step="0.1"
-                step-strictly
-                :controls="false"
-                @change="commonQuestionScoreChange(topic)"
-              ></el-input-number
-              >分,</span
-            >
-            <span
-              >本大题总分合计:<em class="param-sum-score"
-                >{{ topic.sumScore }}分</em
-              ></span
-            >
-          </p>
-          <div v-if="topic.type !== 'COMPOSITION'" class="params-table">
-            <table class="table table-striped">
-              <tr>
-                <th>题号</th>
-                <th>分值</th>
-                <th>题号</th>
-                <th>分值</th>
-              </tr>
-              <tr v-for="(group, gindex) in topic.questions" :key="gindex">
-                <template v-for="question in group">
-                  <td :key="`${question.questionNo}-1`">
-                    <span>{{ question.questionNo }}</span>
-                  </td>
-                  <td :key="`${question.questionNo}-2`">
-                    <el-input-number
-                      v-if="question.questionNo"
-                      v-model="question.score"
-                      size="small"
-                      :min="0.1"
-                      :max="200"
-                      :step="0.1"
-                      step-strictly
-                      :controls="false"
-                      @change="questionScoreChange(topic)"
-                    ></el-input-number>
-                  </td>
-                </template>
-              </tr>
-            </table>
-          </div>
-          <div v-else class="params-table">
-            <el-input-number
-              v-model="topic.sumScore"
-              :min="0.1"
-              :max="200"
-              :step="0.1"
-              step-strictly
-              :controls="false"
-              @change="getPageSumScore"
-            ></el-input-number>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div slot="footer" style="text-align: right">
-      <el-button type="primary" @click="submit">确认</el-button>
-      <el-button type="danger" plain @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { calcSum, isEmptyObject, objAssign } from "../plugins/utils";
-import UploadButton from "./UploadButton";
-
-export default {
-  name: "PaperParams",
-  components: { UploadButton },
-  props: {
-    pages: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-    paperParams: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      topicType: 0,
-      pageSumScore: 0,
-      subjectiveAttachmentId: "",
-      curTopicList: [],
-      objectives: [],
-      subjectives: [],
-      cacheScores: {},
-      initTopic: {
-        id: "",
-        topicNo: "",
-        topicName: "",
-        type: "",
-      },
-      // import
-      uploadUrl: "/api/print/basic/sys/saveAttachment",
-    };
-  },
-  methods: {
-    selectType(topicType) {
-      this.topicType = topicType;
-      this.curTopicList = topicType ? this.subjectives : this.objectives;
-    },
-    listIncludeItem(list, item) {
-      const index = list.findIndex((elem) => elem.id === item.id);
-      return index !== -1;
-    },
-    dialogOpen() {
-      if (!isEmptyObject(this.paperParams)) {
-        this.getCacheScore([
-          ...this.paperParams.objectives,
-          ...this.paperParams.subjectives,
-        ]);
-        this.subjectiveAttachmentId = this.paperParams.subjectiveAttachmentId;
-      }
-      // 每次打开时,重新生成试题结构,以便避免题卡结构变化之后,当前页面的试题结构没有变的问题
-      let objectiveList = [];
-      let subjectiveList = [];
-      let objectives = [];
-      let subjectives = [];
-      this.pages.forEach((page) => {
-        page.columns.forEach((column) => {
-          column.elements.forEach((element) => {
-            if (
-              element.sign &&
-              element.type !== "TOPIC_HEAD" &&
-              element.type !== "CARD_HEAD"
-            ) {
-              if (element.sign === "objective") objectiveList.push(element);
-              if (element.sign === "subjective") subjectiveList.push(element);
-            }
-          });
-        });
-      });
-      // 客观题
-      objectiveList.forEach((item) => {
-        const topic = item.parent || item;
-        if (this.listIncludeItem(objectives, topic)) return;
-        let data = {
-          sumScore: 0,
-          commonQuestionScore: 1,
-          name: this.getObjectiveTopicName(topic),
-          choiceList: this.getChoiceList(topic),
-          questions: this.getQuestions(topic),
-          ...objAssign(this.initTopic, topic),
-        };
-        data.sumScore = this.getTopicSumScore(data);
-        objectives.push(data);
-      });
-
-      // 主观题
-      subjectiveList.forEach((item) => {
-        const topic = item.parent || item;
-        if (this.listIncludeItem(subjectives, topic)) return;
-        let data = {
-          sumScore: 0,
-          commonQuestionScore: 1,
-          name: this.getSubjectiveTopicName(topic),
-          ...objAssign(this.initTopic, topic),
-        };
-        if (topic.type === "COMPOSITION") {
-          data.sumScore = this.cacheScores[topic.topicNo] || 1;
-        } else {
-          data.questions = this.getQuestions(topic);
-          data.sumScore = this.getTopicSumScore(data);
-        }
-        subjectives.push(data);
-      });
-
-      this.subjectives = subjectives;
-      this.objectives = objectives;
-      this.getPageSumScore();
-      this.selectType(0);
-    },
-    getQuestions(topic) {
-      let questions = [];
-      let numPerColumn = Math.ceil(topic.questionsCount / 2);
-      for (let j = topic.startNumber; j <= numPerColumn; j++) {
-        let group = [];
-        let question = {
-          questionNo: j,
-          score: this.cacheScores[`${topic.topicNo}-${j}`] || 1,
-        };
-        if (topic.type === "FILL_QUESTION")
-          question.answers = topic.isMultiply ? [] : "";
-        group[0] = question;
-
-        if (numPerColumn + j <= topic.questionsCount) {
-          group[1] = {
-            questionNo: numPerColumn + j,
-            score:
-              this.cacheScores[`${topic.topicNo}-${numPerColumn + j}`] || 1,
-            answers:
-              topic.type === "FILL_QUESTION" && topic.isMultiply ? [] : "",
-          };
-        } else {
-          group[1] = { questionNo: "" };
-        }
-
-        questions.push(group);
-      }
-
-      return questions;
-    },
-    getObjectiveTopicName(data) {
-      if (data.isMultiply) {
-        return "选择题(多选)";
-      } else if (data.isBoolean) {
-        return "填空题";
-      } else {
-        return "选择题(单选)";
-      }
-    },
-    getSubjectiveTopicName(data) {
-      const names = {
-        EXPLAIN: "解答题",
-        COMPOSITION: "作文题",
-        FILL_LINE: "填空题",
-      };
-      return names[data.type];
-    },
-    getChoiceList(data) {
-      const options = data.isBoolean
-        ? data.booleanType
-        : "abcdefghijklmnopqrstuv";
-      return options.toUpperCase().slice(0, data.optionCount).split("");
-    },
-    commonQuestionScoreChange(topic) {
-      topic.questions.map((group) => {
-        group.map((question) => {
-          question.score = topic.commonQuestionScore;
-        });
-      });
-      this.questionScoreChange(topic);
-    },
-    questionScoreChange(topic) {
-      topic.sumScore = this.getTopicSumScore(topic);
-      this.getPageSumScore();
-    },
-    getTopicSumScore(topic) {
-      const scoreList = topic.questions.map((group) => {
-        return calcSum(group.map((question) => question.score || 0));
-      });
-      return calcSum(scoreList);
-    },
-    getPageSumScore() {
-      this.pageSumScore =
-        calcSum(this.objectives.map((item) => item.sumScore)) +
-        calcSum(this.subjectives.map((item) => item.sumScore));
-    },
-    getCacheScore(topics) {
-      topics = topics || [...this.objectives, ...this.subjectives];
-      let cacheScores = {};
-      topics.map((topic) => {
-        if (topic.type === "COMPOSITION") {
-          cacheScores[`${topic.topicNo}`] = topic.sumScore;
-        } else {
-          topic.questions.map((group) => {
-            group.map((question) => {
-              cacheScores[`${topic.topicNo}-${question.questionNo}`] =
-                question.score;
-            });
-          });
-        }
-      });
-
-      this.cacheScores = cacheScores;
-    },
-    // import
-    validError(errorData) {
-      this.$message.error(errorData.message);
-    },
-    uploadSuccess(data) {
-      this.$message.success("上传成功!");
-      this.subjectiveAttachmentId = data.id;
-    },
-    // dialog
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    submit() {
-      this.$emit("confirm", {
-        pageSumScore: this.pageSumScore,
-        objectives: this.objectives,
-        subjectives: this.subjectives,
-        subjectiveAttachmentId: this.subjectiveAttachmentId,
-      });
-      this.modalIsShow = false;
-    },
-  },
-};
-</script>

+ 2 - 1
src/modules/card/components/RightClickMenu.vue

@@ -160,7 +160,8 @@ export default {
       while (
         !(
           (parentNode["id"] && parentNode["id"].includes("element-")) ||
-          parentNode.className.includes("page-column-body")
+          parentNode.className.includes("page-column-body") ||
+          parentNode.className.includes("card-design")
         )
       ) {
         parentNode = parentNode.parentNode;

+ 2 - 2
src/modules/card/elements/explain/ElemExplain.vue

@@ -4,8 +4,8 @@
       {{ data.parent.topicName }}
     </div>
     <div ref="ElemBody" class="elem-body">
-      <div v-if="data.questionNo && !data.isExtend" class="elem-explain-no">
-        {{ data.questionNo }}、
+      <div v-if="data.serialNumber && !data.isExtend" class="elem-explain-no">
+        {{ data.serialNumber }}、
       </div>
       <!-- 解答题子元件区域 -->
       <div class="elem-explain-elements">

+ 2 - 2
src/modules/card/elements/explain/ElemExplainEdit.vue

@@ -4,8 +4,8 @@
       {{ data.parent.topicName }}
     </div>
     <div class="elem-body" :style="bodyStyle">
-      <div v-if="data.questionNo && !data.isExtend" class="elem-explain-no">
-        {{ data.questionNo }}、
+      <div v-if="data.serialNumber && !data.isExtend" class="elem-explain-no">
+        {{ data.serialNumber }}、
       </div>
       <!-- 解答题子元件编辑区域 -->
       <div

+ 3 - 2
src/modules/card/elements/explain/model.js

@@ -17,7 +17,6 @@ const MODEL = {
   minHeight: 60,
   sign: "subjective",
   topicNo: null,
-  questionNo: "",
   isCovered: false,
   // 是否是小题的最后一个答题区,初始每个小题只有一个答题区,默认为true
   isLast: true,
@@ -25,6 +24,8 @@ const MODEL = {
   isExtend: false,
   // 是否展示解答题题目内容,解答题第1小题的第1个答题区需要显示解答题题目内容
   showTitle: false,
+  // 小题序号
+  serialNumber: "",
   // 每一个解答题小题都可以包含其他基础元件,这些基础元件都用绝对定位
   elements: [],
   // 解答题整体信息,EXPLAIN_PROP
@@ -50,7 +51,7 @@ const getFullModel = (explainProp) => {
       key: randomCode(),
       w: parent.w,
       topicNo: parent.topicNo,
-      questionNo: item,
+      serialNumber: item,
       showTitle: !index,
       parent,
     });

+ 1 - 1
src/modules/card/elements/gutter/ElemGutter.vue

@@ -28,7 +28,7 @@ export default {
     },
   },
   created() {
-    this.conts = this.data.content.split("");
+    this.conts = this.data.content.split("").reverse();
   },
   methods: {},
 };

+ 0 - 299
src/modules/card/modules/free/cardFormatTransform.js

@@ -1,299 +0,0 @@
-import { CARD_VERSION } from "../../enumerate";
-import { deepCopy } from "../../plugins/utils";
-
-const initIndex = {
-  question: 1,
-  absent: 1,
-  paperType: 1,
-  examNumber: 1,
-  selective: 1,
-  pageNumber: 1,
-};
-let fillAreaIndex = { ...initIndex };
-
-const VALID_ELEMENTS_FOR_EXTERNAL = [
-  "LOCATOR",
-  "BARCODE",
-  "FILL_QUESTION",
-  "FILL_LINE",
-  "FILL_NUMBER",
-  "FILL_FIELD",
-  "FILL_TABLE",
-  "LINES",
-  "GRIDS",
-];
-
-function initFillAreaIndex() {
-  fillAreaIndex = { ...initIndex };
-}
-
-function getFillAreaIndex(type) {
-  return fillAreaIndex[type]++;
-}
-
-function getPreviewElementById(id) {
-  return document.getElementById(`preview-${id}`);
-}
-
-function getOffsetInfo(dom) {
-  let { offsetTop, offsetLeft } = dom;
-  let parentNode = dom.offsetParent;
-  while (parentNode.className.indexOf("page-box") === -1) {
-    offsetTop += parentNode.offsetTop;
-    offsetLeft += parentNode.offsetLeft;
-    parentNode = parentNode.offsetParent;
-  }
-  const pw = parentNode.offsetWidth;
-  const ph = parentNode.offsetHeight;
-
-  const infos = [
-    offsetLeft / pw,
-    offsetTop / ph,
-    dom.offsetWidth / pw,
-    dom.offsetHeight / ph,
-  ];
-
-  return infos.map((num) => num.toFixed(10) * 1);
-}
-
-// locator: [],
-// barcode: [],
-// info_area: [],
-// fill_area: [],
-// answer_area: []
-
-const elementInfoFunc = {
-  LOCATOR: (locators) => {
-    const result = locators.map((locatorGroup) => {
-      const locatorInfos = locatorGroup.map((locator) => {
-        return getOffsetInfo(document.getElementById(locator.id));
-      });
-      return {
-        top: locatorInfos[0],
-        bottom: locatorInfos[1],
-      };
-    });
-    return {
-      locator: result,
-    };
-  },
-  BARCODE: (element) => {
-    return {
-      barcode: [
-        {
-          field: element.field,
-          area: getOffsetInfo(getPreviewElementById(element.id)),
-        },
-      ],
-    };
-  },
-  FILL_QUESTION: (element) => {
-    const dom = getPreviewElementById(element.id);
-    const single = !element.isMultiply;
-    const horizontal = element.optionDirection === "horizontal";
-
-    let fillAreas = [];
-    dom.querySelectorAll(".group-item").forEach((groupItem) => {
-      let listInfos = [];
-
-      groupItem
-        .querySelectorAll(".question-item")
-        .forEach((questionItem, questionIndex) => {
-          let options = [];
-          questionItem.childNodes.forEach((optionItem, optionIndex) => {
-            if (optionIndex)
-              options[optionIndex - 1] = getOffsetInfo(optionItem);
-          });
-          listInfos[questionIndex] = {
-            main_number: element.topicNo,
-            sub_number: questionItem.firstChild.textContent * 1,
-            options,
-          };
-        });
-      fillAreas.push({
-        field: "question",
-        index: getFillAreaIndex("question"),
-        single,
-        horizontal,
-        items: listInfos,
-      });
-    });
-
-    return {
-      fill_area: fillAreas,
-    };
-  },
-  FILL_LINE: (element) => {
-    const dom = getPreviewElementById(element.id);
-    let sub_numbers = [];
-    for (
-      let i = element.startNumber,
-        len = element.startNumber + element.questionsCount;
-      i < len;
-      i++
-    ) {
-      sub_numbers.push(i);
-    }
-
-    return {
-      answer_area: [
-        {
-          main_number: element.topicNo,
-          sub_numbers,
-          area: getOffsetInfo(dom),
-        },
-      ],
-    };
-  },
-  FILL_NUMBER: (element) => {
-    let listInfos = [];
-    const dom = getPreviewElementById(element.id);
-
-    dom
-      .querySelectorAll(".fill-number-list")
-      .forEach((questionItem, questionIndex) => {
-        let options = [];
-        questionItem.childNodes.forEach((optionItem, optionIndex) => {
-          options[optionIndex] = getOffsetInfo(optionItem);
-        });
-        listInfos[questionIndex] = {
-          main_number: null,
-          sub_number: null,
-          options,
-        };
-      });
-
-    return {
-      fill_area: [
-        {
-          field: "examNumber",
-          index: getFillAreaIndex("examNumber"),
-          single: true,
-          horizontal: false,
-          items: listInfos,
-        },
-      ],
-    };
-  },
-  FILL_FIELD: (element) => {
-    const dom = getPreviewElementById(element.id);
-
-    return {
-      info_area: [getOffsetInfo(dom)],
-    };
-  },
-  FILL_TABLE: (element) => {
-    const dom = getPreviewElementById(element.id);
-
-    return {
-      info_area: [getOffsetInfo(dom)],
-    };
-  },
-  LINES: (element) => {
-    const dom = getPreviewElementById(element.id);
-
-    return {
-      answer_area: [
-        {
-          main_number: null,
-          sub_numbers: null,
-          area: getOffsetInfo(dom),
-        },
-      ],
-    };
-  },
-  GRIDS: (element) => {
-    const dom = getPreviewElementById(element.id);
-
-    return {
-      answer_area: [
-        {
-          main_number: null,
-          sub_numbers: null,
-          area: getOffsetInfo(dom),
-        },
-      ],
-    };
-  },
-};
-
-function getPageNumberInfo() {
-  const dom = document.querySelector(".page-box-0");
-  let options = [];
-  dom
-    .querySelector(".page-number-rect-list")
-    .childNodes.forEach((item, index) => {
-      options[index] = getOffsetInfo(item);
-    });
-  return [
-    {
-      field: "pageNumber",
-      index: 1,
-      single: true,
-      horizontal: true,
-      items: [
-        {
-          main_number: null,
-          sub_number: null,
-          options,
-        },
-      ],
-    },
-  ];
-}
-
-function parsePageExchange(pages) {
-  initFillAreaIndex();
-
-  const npages = deepCopy(pages);
-  const pageNumberInfo = getPageNumberInfo();
-  npages.forEach((page, pindex) => {
-    let exchange = {
-      locator: elementInfoFunc.LOCATOR(page.locators),
-      barcode: [],
-      info_area: [],
-      fill_area: [],
-      answer_area: [],
-    };
-    const elements = [
-      page.globals,
-      ...page.columns.map((column) => column.elements),
-    ];
-
-    elements.forEach((elemGroup) => {
-      elemGroup.forEach((element) => {
-        if (!VALID_ELEMENTS_FOR_EXTERNAL.includes(element.type)) return;
-        const info = elementInfoFunc[element.type](element);
-        Object.entries(info).forEach(([key, vals]) => {
-          exchange[key] = exchange[key].concat(vals);
-        });
-      });
-    });
-
-    if (!(pindex % 2)) {
-      let pnoInfo = deepCopy(pageNumberInfo);
-      pnoInfo[0].index = getFillAreaIndex("pageNumber");
-      exchange.fill_area = exchange.fill_area.concat(pnoInfo);
-    }
-
-    page.exchange = exchange;
-  });
-
-  return npages;
-}
-
-export function getPageModel({ cardConfig, paperParams, pages }) {
-  let npages = parsePageExchange(pages);
-  npages.forEach((page) => {
-    page.exchange.page_size = cardConfig.pageSize;
-  });
-  return JSON.stringify(
-    {
-      version: CARD_VERSION,
-      cardConfig,
-      paperParams,
-      pages: npages,
-    },
-    (k, v) => (k.startsWith("_") ? undefined : v)
-  );
-}

+ 0 - 407
src/modules/card/modules/free/components/CardFreeDesign.vue

@@ -1,407 +0,0 @@
-<template>
-  <div class="card-design card-free-design">
-    <div class="design-header">
-      <div class="design-header-cont box-justify">
-        <div></div>
-        <el-button
-          class="btn-help"
-          icon="el-icon-question"
-          type="text"
-          @click="showHelp"
-        ></el-button>
-      </div>
-    </div>
-
-    <!-- actions -->
-    <div class="design-action">
-      <div class="design-logo">
-        <h1>
-          <i class="el-icon-d-arrow-left" title="退出" @click="toExit"></i>
-          答题卡制作
-        </h1>
-      </div>
-
-      <div class="action-part">
-        <div class="action-part-title"><h2>基本设置</h2></div>
-        <div class="action-part-body">
-          <page-prop-edit></page-prop-edit>
-        </div>
-      </div>
-      <div class="action-part">
-        <div class="action-part-title"><h2>当前页面设置</h2></div>
-        <div class="action-part-body">
-          <edit-page></edit-page>
-        </div>
-      </div>
-      <div class="action-part">
-        <div class="action-part-title"><h2>复杂元素</h2></div>
-        <div class="action-part-body">
-          <div class="type-list">
-            <div
-              v-for="(item, index) in TOPIC_LIST"
-              :key="index"
-              class="type-item"
-              draggable="true"
-              @dragstart="dragstart(item)"
-            >
-              <el-button><i class="el-icon-plus"></i>{{ item.name }}</el-button>
-            </div>
-          </div>
-          <p class="tips-info">提示:拖动插入元素</p>
-        </div>
-      </div>
-      <div class="action-part">
-        <div class="action-part-title"><h2>简单元素</h2></div>
-        <div class="action-part-body">
-          <div class="type-list">
-            <div
-              v-for="(item, index) in ELEMENT_LIST"
-              :key="index"
-              class="type-item"
-              draggable="true"
-              @dragstart="dragstart(item)"
-            >
-              <el-button><i class="el-icon-plus"></i>{{ item.name }}</el-button>
-            </div>
-            <p class="tips-info">提示:拖动插入元素</p>
-          </div>
-        </div>
-      </div>
-      <div class="action-part">
-        <div class="action-part-title"><h2>元素面板</h2></div>
-        <div class="action-part-body">
-          <!-- element-tier-edit -->
-          <element-tier-edit ref="ElementTierEdit"></element-tier-edit>
-        </div>
-      </div>
-    </div>
-
-    <div class="design-main">
-      <!-- menus -->
-      <div class="design-control">
-        <div class="control-left tab-btns">
-          <el-button
-            v-for="(page, pageNo) in pages"
-            :key="pageNo"
-            :type="curPageNo === pageNo ? 'primary' : 'default'"
-            @click="swithPage(pageNo)"
-          >
-            <span>第{{ pageNo + 1 }}页</span>
-            <span class="page-delete" @click.stop="toDeletePage(page)"
-              ><i class="el-icon-error"></i
-            ></span>
-          </el-button>
-          <el-button icon="el-icon-plus" @click="toAddPage"></el-button>
-        </div>
-        <div class="control-right">
-          <el-button
-            type="success"
-            :loading="isSubmit"
-            :disabled="!pages.length"
-            @click="toPreview"
-            >预览</el-button
-          >
-          <el-button
-            v-if="showSaveBtn"
-            type="primary"
-            :loading="isSubmit"
-            :disabled="canSave || !pages.length"
-            @click="toSave"
-            >暂存</el-button
-          >
-          <el-button type="primary" :loading="isSubmit" @click="toSubmit"
-            >提交</el-button
-          >
-        </div>
-      </div>
-
-      <!-- edit body -->
-      <div class="design-body">
-        <div
-          v-if="curPage.id"
-          :class="[
-            'page-box',
-            `page-box-${curPage.pageSize}`,
-            `page-box-${curPageNo % 2}`,
-          ]"
-        >
-          <div
-            :class="[
-              'page-locators',
-              `page-locators-${curPage.locators.length}`,
-            ]"
-          >
-            <ul
-              v-for="(locator, iind) in curPage.locators"
-              :key="iind"
-              class="page-locator-group"
-            >
-              <li
-                v-for="(elem, eindex) in locator"
-                :id="elem.id"
-                :key="eindex"
-              ></li>
-            </ul>
-          </div>
-          <!-- inner edit area -->
-          <div class="page-main-inner">
-            <div
-              :class="['page-main', `page-main-${curPage.columns.length}`]"
-              :style="{ margin: `0 -${curPage.columnGap / 2}px` }"
-            >
-              <div
-                v-for="(column, columnNo) in curPage.columns"
-                :key="columnNo"
-                class="page-column"
-                :style="{ padding: `0 ${curPage.columnGap / 2}px` }"
-              >
-                <topic-column-edit
-                  class="page-column-main"
-                  :data="column"
-                ></topic-column-edit>
-              </div>
-            </div>
-          </div>
-          <!-- outer edit area -->
-          <div class="page-main-outer">
-            <page-number
-              type="rect"
-              :total="pages.length"
-              :current="curPageNo + 1"
-            ></page-number>
-            <page-number
-              type="text"
-              :total="pages.length"
-              :current="curPageNo + 1"
-            ></page-number>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- element-prop-edit -->
-    <element-prop-edit ref="ElementPropEdit"></element-prop-edit>
-    <!-- right-click-menu -->
-    <right-click-menu></right-click-menu>
-    <!-- shortcut-key -->
-    <shortcut-key
-      @sk-save="skSave"
-      @sk-submit="skSubmit"
-      @sk-preview="skPreview"
-    ></shortcut-key>
-    <!-- help-dialog -->
-    <help-dialog ref="HelpDialog"></help-dialog>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations, mapActions } from "vuex";
-import { getElementModel, ELEMENT_LIST, TOPIC_LIST } from "../elements/model";
-import { getModel as getPageModel } from "../../../elements/page/model";
-import { CARD_VERSION } from "../../../enumerate";
-
-import TopicColumnEdit from "../components/TopicColumnEdit";
-import ElementPropEdit from "../components/ElementPropEdit";
-import ElementTierEdit from "../components/ElementTierEdit";
-import PagePropEdit from "../components/PagePropEdit";
-import RightClickMenu from "../components/RightClickMenu";
-import ShortcutKey from "../components/ShortcutKey";
-import HelpDialog from "../components/HelpDialog";
-import EditPage from "../../../elements/page/EditPage";
-
-import PageNumber from "../../../components/PageNumber";
-
-export default {
-  name: "CardFreeDesign",
-  components: {
-    TopicColumnEdit,
-    PagePropEdit,
-    EditPage,
-    ElementPropEdit,
-    ElementTierEdit,
-    RightClickMenu,
-    ShortcutKey,
-    HelpDialog,
-    PageNumber,
-  },
-  props: {
-    content: {
-      type: Object,
-      default() {
-        return {
-          pages: [],
-          cardConfig: {},
-        };
-      },
-    },
-    showSaveBtn: {
-      type: Boolean,
-      default: true,
-    },
-  },
-  data() {
-    return {
-      ELEMENT_LIST,
-      TOPIC_LIST,
-      topicList: [],
-      columnWidth: 0,
-      isSubmit: false,
-      canSave: false,
-    };
-  },
-  computed: {
-    ...mapState("free", [
-      "cardConfig",
-      "pages",
-      "curElement",
-      "curPage",
-      "curPageNo",
-      "curDragElement",
-      "curColumnId",
-    ]),
-  },
-  mounted() {
-    this.initCard();
-  },
-  beforeDestroy() {
-    this.initState();
-  },
-  methods: {
-    ...mapMutations("free", [
-      "setCurPageNo",
-      "setCurElement",
-      "setCardConfig",
-      "setOpenElementEditDialog",
-      "setCurDragElement",
-      "setPages",
-      "initState",
-    ]),
-    ...mapActions("free", [
-      "addPage",
-      "removePage",
-      "addElement",
-      "modifyElement",
-    ]),
-    async initCard() {
-      const { cardConfig, pages } = this.content;
-      this.setCardConfig(cardConfig);
-
-      if (pages && pages.length) {
-        this.setPages(pages);
-        this.setCurPageNo(0);
-      } else {
-        this.initPageData();
-      }
-    },
-    initPageData() {
-      const page = getPageModel(this.cardConfig);
-      this.addPage(page);
-      this.setCurPageNo(0);
-    },
-    toAddPage() {
-      const page = getPageModel(this.cardConfig);
-      this.addPage(page);
-    },
-    addNewTopic(item) {
-      let element = getElementModel(item.type);
-
-      this.setCurElement(element);
-      this.$refs.ElementPropEdit.open();
-      // to elementPropEdit/ElementPropEdit open topic edit dialog
-    },
-    // 元件编辑
-    dragstart(element) {
-      this.setCurDragElement(getElementModel(element.type));
-    },
-    // 操作
-    swithPage(pindex) {
-      if (this.curPageNo === pindex) return;
-      this.setCurPageNo(pindex);
-      this.setCurElement({});
-    },
-    toDeletePage(page) {
-      if (this.pages.length === 1) {
-        this.$message.error("只剩最后一页,不能再删除了");
-        return;
-      }
-      this.removePage(page);
-    },
-    // save
-    getCardData(htmlContent = "", model = "") {
-      let data = {
-        title: this.cardConfig.cardTitle,
-        content: model,
-        htmlContent,
-      };
-      return data;
-    },
-    getCardJson() {
-      // 防止页面未渲染完成,各试题高度未及时更新,保存数据有误的问题
-      return new Promise((resolve) => {
-        setTimeout(() => {
-          const data = JSON.stringify(
-            {
-              version: CARD_VERSION,
-              cardType: "FREE",
-              cardConfig: this.cardConfig,
-              paperParams: this.paperParams,
-              pages: this.pages,
-            },
-            (k, v) => (k.startsWith("_") ? undefined : v)
-          );
-          resolve(data);
-        }, 100);
-      });
-    },
-    skSave() {
-      this.toSave();
-    },
-    skSubmit() {
-      this.toSubmit();
-    },
-    skPreview() {
-      this.toPreview();
-    },
-    async toPreview() {
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const model = await this.getCardJson();
-      const datas = this.getCardData("", model);
-      this.$emit("on-preview", datas);
-    },
-    async toSave() {
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const model = await this.getCardJson();
-      const datas = this.getCardData("", model);
-      this.$emit("on-save", datas);
-    },
-    toSubmit() {
-      if (this.isSubmit) return;
-
-      if (this.pages.length % 2) {
-        this.$message.error("请确保题卡页数是偶数");
-        return;
-      }
-
-      this.$emit("on-submit", {
-        cardConfig: this.cardConfig,
-        pages: this.pages,
-        paperParams: this.paperParams,
-      });
-    },
-    toExit() {
-      this.$emit("on-exit");
-    },
-    showHelp() {
-      this.$refs.HelpDialog.open();
-    },
-    loading() {
-      this.isSubmit = true;
-    },
-    unloading() {
-      this.isSubmit = false;
-    },
-  },
-};
-</script>

+ 0 - 113
src/modules/card/modules/free/components/CardFreeView.vue

@@ -1,113 +0,0 @@
-<template>
-  <div class="card-free-view">
-    <template v-for="(page, pageNo) in pages">
-      <div
-        :key="pageNo"
-        :class="[
-          'page-box',
-          `page-box-${page.pageSize}`,
-          `page-box-${pageNo % 2}`,
-        ]"
-      >
-        <div
-          :class="['page-locators', `page-locators-${page.locators.length}`]"
-        >
-          <ul
-            v-for="(locator, iind) in page.locators"
-            :key="iind"
-            class="page-locator-group"
-          >
-            <li
-              v-for="(elem, eindex) in locator"
-              :id="elem.id"
-              :key="eindex"
-            ></li>
-          </ul>
-        </div>
-        <!-- inner edit area -->
-        <div class="page-main-inner">
-          <div
-            :class="['page-main', `page-main-${page.columns.length}`]"
-            :style="{ margin: `0 -${page.columnGap / 2}px` }"
-          >
-            <div
-              v-for="(column, columnNo) in page.columns"
-              :key="columnNo"
-              class="page-column"
-              :style="{ padding: `0 ${page.columnGap / 2}px` }"
-            >
-              <div
-                :id="[`column-${pageNo}-${columnNo}`]"
-                class="page-column-main"
-              >
-                <div v-if="column.elements.length" class="page-column-body">
-                  <topic-element-preview
-                    v-for="element in column.elements"
-                    :key="element.id"
-                    class="page-column-element"
-                    :data="element"
-                  ></topic-element-preview>
-                </div>
-                <div v-else class="page-column-body">
-                  <div
-                    v-if="cardConfig.showForbidArea"
-                    class="page-column-forbid-area"
-                  >
-                    <p>该区域严禁作答</p>
-                  </div>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <!-- outer edit area -->
-        <div class="page-main-outer">
-          <page-number
-            type="rect"
-            :total="pages.length"
-            :current="pageNo + 1"
-          ></page-number>
-          <page-number
-            type="text"
-            :total="pages.length"
-            :current="pageNo + 1"
-          ></page-number>
-        </div>
-      </div>
-    </template>
-  </div>
-</template>
-
-<script>
-import TopicElementPreview from "./TopicElementPreview";
-import PageNumber from "../../../components/PageNumber";
-import previewTemp from "../../../previewTemp";
-import { getPageModel } from "../cardFormatTransform";
-
-export default {
-  name: "CardFreeView",
-  components: { TopicElementPreview, PageNumber },
-  props: {
-    pages: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-    cardConfig: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  methods: {
-    getPageModel(cardData) {
-      return getPageModel(cardData);
-    },
-    getPreviewTemp(htmlContent) {
-      return previewTemp(htmlContent);
-    },
-  },
-};
-</script>

+ 0 - 98
src/modules/card/modules/free/components/ElementPropEdit.vue

@@ -1,98 +0,0 @@
-<template>
-  <el-dialog
-    class="element-prop-edit edit-dialog"
-    :visible.sync="openElementEditDialog"
-    :title="title"
-    top="10vh"
-    width="640px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    :before-close="cancel"
-    append-to-body
-  >
-    <component
-      :is="curEditComponent"
-      :key="curElement.id"
-      ref="ComponentForm"
-      :instance="curElement"
-      @modified="modified"
-    ></component>
-
-    <div slot="footer">
-      <el-button type="primary" @click="submit">确认</el-button>
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { mapState, mapMutations, mapActions } from "vuex";
-import { getElementName, getElementDesc } from "../elements/model";
-import EditFillLine from "../elements/fill-line/EditFillLine";
-import EditFillQuestion from "../elements/fill-question/EditFillQuestion";
-import EditText from "../../../elements/text/EditText";
-import EditImage from "../../../elements/image/EditImage";
-import EditLine from "../../../elements/line/EditLine";
-import EditLines from "../../../elements/lines/EditLines";
-import EditGrids from "../../../elements/grids/EditGrids";
-import EditPane from "../../../elements/pane/EditPane";
-import EditBarcode from "../../../elements/barcode/EditBarcode";
-import EditFillNumber from "../../../elements/fill-number/EditFillNumber";
-import EditFillField from "../../../elements/fill-field/EditFillField";
-import EditFillTable from "../../../elements/fill-table/EditFillTable";
-import EditFillPane from "../../../elements/fill-pane/EditFillPane";
-
-export default {
-  name: "ElementPropEdit",
-  components: {
-    EditFillLine,
-    EditFillQuestion,
-    EditFillNumber,
-    EditFillField,
-    EditFillTable,
-    EditFillPane,
-    EditText,
-    EditImage,
-    EditLine,
-    EditLines,
-    EditGrids,
-    EditPane,
-    EditBarcode,
-  },
-  data() {
-    return {};
-  },
-  computed: {
-    ...mapState("free", ["curElement", "openElementEditDialog"]),
-    title() {
-      return this.curElement.type
-        ? getElementName(this.curElement.type)
-        : "属性编辑";
-    },
-    curEditComponent() {
-      if (!this.curElement.type) return;
-      let type = this.curElement.type.toLowerCase().replace("_", "-");
-      if (type.indexOf("line-") === 0) type = "line";
-      return `edit-${type}`;
-    },
-  },
-  methods: {
-    ...mapMutations("free", ["setOpenElementEditDialog"]),
-    ...mapActions("free", ["modifyElement"]),
-    cancel() {
-      this.setOpenElementEditDialog(false);
-    },
-    open() {
-      this.setOpenElementEditDialog(true);
-    },
-    submit() {
-      this.$refs.ComponentForm.submit();
-    },
-    modified(element) {
-      element.desc = getElementDesc(element);
-      this.modifyElement(element);
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 176
src/modules/card/modules/free/components/ElementTierEdit.vue

@@ -1,176 +0,0 @@
-<template>
-  <div class="element-tier-edit">
-    <div class="tier-menu">
-      <div
-        v-for="(column, cindex) in curPage.columns"
-        :key="column.id"
-        :class="['tier-menu-item', { 'is-active': column.id === curColumn.id }]"
-        @click="selectColumn(column)"
-      >
-        栏{{ cindex + 1 }}
-      </div>
-    </div>
-    <div
-      ref="TierList"
-      class="tier-list"
-      @drop.prevent="dropInnerElement"
-      @dragover.prevent="dragOver($event)"
-      @dragleave.prevent
-    >
-      <div
-        v-for="element in curColumn.elements"
-        :id="`tier-${element.id}`"
-        :key="element.id"
-        :class="[
-          'tier-item',
-          {
-            'after-drop': element.id === curDropElementId && isDragDown,
-            'before-drop': element.id === curDropElementId && !isDragDown,
-          },
-        ]"
-        draggable="true"
-        @dragstart="($event) => dragStart($event, element)"
-        @dragend.prevent="dragEnd"
-        @click="selectElement(element)"
-      >
-        <div
-          :class="[
-            'tier-item-cont',
-            {
-              'is-active': curElement.id === element.id,
-            },
-          ]"
-        >
-          {{ element.desc }}
-        </div>
-        <!-- <div class="tier-item-cont">{{ element.zindex }}:{{ element.id }}</div> -->
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations, mapActions } from "vuex";
-
-export default {
-  name: "ElementTierEdit",
-  data() {
-    return {
-      curColumn: { id: "1", elements: [] },
-      curDragElement: null,
-      curDropElementId: null,
-      dragStartScreenY: null,
-      isDragDown: false,
-    };
-  },
-  computed: {
-    ...mapState("free", ["curPage", "curElement"]),
-  },
-  watch: {
-    curPage: {
-      immediate: true,
-      handler(val) {
-        this.selectColumn(val.columns && val.columns[0]);
-      },
-    },
-    curElement(val) {
-      if (!val.id) return;
-      const columnIndex = this.curPage.columns.findIndex((column) =>
-        column.elements.find((elem) => elem.id === val.id)
-      );
-      if (columnIndex === -1) return;
-      this.selectColumn(this.curPage.columns[columnIndex]);
-    },
-  },
-  methods: {
-    ...mapMutations("free", ["setCurElement"]),
-    ...mapActions("free", ["moveElementToElement"]),
-    selectColumn(column) {
-      if (column) {
-        if (column.id === this.curColumn.id) return;
-        this.curColumn = column;
-      } else {
-        this.curColumn = { id: "1", elements: [] };
-      }
-    },
-    selectElement(element) {
-      this.setCurElement(element);
-    },
-    getRelateElement(dom) {
-      let element = null;
-      let parentNode = dom;
-      while (!element && !parentNode.className.includes("tier-list")) {
-        if (
-          !element &&
-          parentNode["id"] &&
-          parentNode["id"].includes("tier-element")
-        ) {
-          element = parentNode;
-        } else {
-          parentNode = parentNode.parentNode;
-        }
-      }
-
-      return element;
-    },
-    getElementId(tierId) {
-      return tierId.replace("tier-", "");
-    },
-    checkElementsIsSiblings(elementId1, elementId2) {
-      const pos1 = this.curColumn.elements.findIndex(
-        (elem) => elem.id === elementId1
-      );
-      const pos2 = this.curColumn.elements.findIndex(
-        (elem) => elem.id === elementId2
-      );
-      return Math.abs(pos1 - pos2) <= 1;
-    },
-    getSiblingElement(elementId, offset) {
-      const pos = this.curColumn.elements.findIndex(
-        (elem) => elem.id === elementId
-      );
-      return this.curColumn.elements[pos + offset] || null;
-    },
-    dragStart(e, element) {
-      this.dragStartScreenY = e.screenY;
-      this.curDragElement = element;
-    },
-    dragOver(e) {
-      // console.log(e.target);
-      this.isDragDown = e.screenY > this.dragStartScreenY;
-      if (e.target.className.includes("tier-list")) {
-        const curDropElement = this.isDragDown
-          ? this.curColumn.elements.slice(-1)[0]
-          : this.curColumn.elements[0];
-        this.curDropElementId = curDropElement.id;
-        return;
-      }
-
-      const elementDom = this.getRelateElement(e.target);
-      if (!elementDom) return;
-
-      const targetId = this.getElementId(elementDom.id);
-      const curDropElement = this.getSiblingElement(targetId, 0);
-      this.curDropElementId = curDropElement.id;
-    },
-    dropInnerElement() {
-      // console.log(this.curDragElement.id, this.curDropElementId);
-      if (this.curDragElement.id === this.curDropElementId) return;
-
-      // 往下:target上一个位置
-      // 往上:target下一个位置
-      this.moveElementToElement({
-        curElement: this.curDragElement,
-        toElementId: this.curDropElementId,
-        curColumnId: this.curColumn.id,
-        isDragDown: this.isDragDown,
-      });
-    },
-    dragEnd() {
-      this.curDragElement = null;
-      this.curDropElementId = null;
-      this.dragStartScreenY = null;
-    },
-  },
-};
-</script>

+ 0 - 49
src/modules/card/modules/free/components/HelpDialog.vue

@@ -1,49 +0,0 @@
-<template>
-  <el-dialog
-    class="help-dialog"
-    :visible.sync="dialogVisible"
-    title="帮助"
-    top="0"
-    width="640px"
-    :close-on-click-modal="false"
-    append-to-body
-  >
-    <el-table size="medium" :data="SHORTCUT_KEYS">
-      <el-table-column prop="name" label="命令"></el-table-column>
-      <el-table-column prop="keys" label="快捷键">
-        <template slot-scope="scope">
-          <shortcut-key-spin
-            v-for="sk in scope.row.keys"
-            :key="sk"
-            :data="sk"
-          ></shortcut-key-spin>
-        </template>
-      </el-table-column>
-    </el-table>
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import { SHORTCUT_KEYS } from "../../../enumerate";
-import ShortcutKeySpin from "../../../components/common/ShortcutKeySpin";
-
-export default {
-  name: "HelpDialog",
-  components: { ShortcutKeySpin },
-  data() {
-    return {
-      dialogVisible: false,
-      SHORTCUT_KEYS,
-    };
-  },
-  methods: {
-    cancel() {
-      this.dialogVisible = false;
-    },
-    open() {
-      this.dialogVisible = true;
-    },
-  },
-};
-</script>

+ 0 - 132
src/modules/card/modules/free/components/PagePropEdit.vue

@@ -1,132 +0,0 @@
-<template>
-  <div class="page-prop-edit">
-    <el-form ref="form" :model="form" label-width="70px">
-      <el-form-item label="纸张规格">
-        <el-select
-          v-model="form.pageSize"
-          placeholder="请选择"
-          :disabled="pageSizeOptions.length < 2"
-          @change="modifyPageSize"
-        >
-          <el-option
-            v-for="item in pageSizeOptions"
-            :key="item"
-            :label="item"
-            :value="item"
-          >
-          </el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="禁答区域">
-        <el-checkbox
-          v-model="form.showForbidArea"
-          @change="showForbidAreaChange"
-          >启用</el-checkbox
-        >
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations, mapActions } from "vuex";
-import { objAssign } from "../../../plugins/utils";
-import { getModel as getPageModel } from "../../../elements/page/model";
-
-const COLUMN_OPTIONS = [
-  {
-    value: 1,
-    title: "一栏",
-    label: "one",
-    sizeValid: ["A3", "A4"],
-  },
-  {
-    value: 2,
-    title: "二栏",
-    label: "two",
-    sizeValid: ["A3", "A4"],
-  },
-  {
-    value: 3,
-    title: "三栏",
-    label: "three",
-    sizeValid: ["A3"],
-  },
-  {
-    value: 4,
-    title: "四栏",
-    label: "four",
-    sizeValid: ["A3"],
-  },
-];
-
-export default {
-  name: "PagePropEdit",
-  data() {
-    return {
-      columnOptions: [],
-      pageSizeOptions: ["A3"],
-      // pageSizeOptions: ["A3", "A4"],
-      form: {
-        pageSize: "A3",
-        columnNumber: 2,
-        showForbidArea: false,
-      },
-      prePageSize: "A3",
-    };
-  },
-  computed: {
-    ...mapState("free", ["curPageNo", "pages", "cardConfig"]),
-    curPage() {
-      return this.pages[this.curPageNo];
-    },
-  },
-  watch: {
-    cardConfig: {
-      immediate: true,
-      handler(val) {
-        this.form = objAssign(this.form, val);
-        this.prePageSize = this.form.pageSize;
-        this.columnOptions = COLUMN_OPTIONS.filter((item) =>
-          item.sizeValid.includes(this.form.pageSize)
-        );
-      },
-    },
-  },
-  methods: {
-    ...mapMutations("free", [
-      "setPages",
-      "setCurElement",
-      "setCardConfig",
-      "setCurPageNo",
-    ]),
-    ...mapActions("free", ["modifyAllPageShowForbidArea"]),
-    showForbidAreaChange() {
-      this.setCardConfig(this.form);
-      this.modifyAllPageShowForbidArea(this.form.showForbidArea);
-    },
-    configChange() {
-      this.setCardConfig(this.form);
-      const page = getPageModel(this.form);
-      this.setPages([page]);
-      this.setCurPageNo(0);
-      this.setCurElement({});
-    },
-    modifyPageSize() {
-      this.$confirm("此操作将会重置所有页面, 是否继续?", "提示", {
-        type: "warning",
-      })
-        .then(() => {
-          this.columnOptions = COLUMN_OPTIONS.filter((item) =>
-            item.sizeValid.includes(this.form.pageSize)
-          );
-          this.form.columnNumber = this.columnOptions[0].value;
-          this.configChange();
-        })
-        .catch(() => {
-          this.form.pageSize = this.prePageSize;
-        });
-    },
-  },
-};
-</script>

+ 0 - 212
src/modules/card/modules/free/components/RightClickMenu.vue

@@ -1,212 +0,0 @@
-<template>
-  <div class="right-click-menu">
-    <div
-      v-if="visible"
-      ref="RightMenuBody"
-      v-clickoutside="close"
-      class="right-menu-body"
-      :style="styles"
-    >
-      <ul>
-        <li v-if="elementIsSelected" @click="toEdit">
-          <i class="el-icon-edit-outline"></i> 编辑
-        </li>
-        <li v-if="elementIsSelected" class="li-danger" @click="toDelete">
-          <i class="el-icon-delete"></i> 删除
-        </li>
-        <li v-if="elementIsSelected" @click="toCopy">
-          <i class="el-icon-copy-document"></i> 复制
-        </li>
-        <li v-if="curCopyElement" @click="toPaste">
-          <i class="el-icon-document-copy"></i> 粘贴
-        </li>
-      </ul>
-    </div>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations, mapActions } from "vuex";
-import Clickoutside from "element-ui/src/utils/clickoutside";
-import { deepCopy, getElementId, randomCode } from "../../../plugins/utils";
-
-export default {
-  name: "RightClickMenu",
-  directives: { Clickoutside },
-  data() {
-    return {
-      visible: false,
-      curColumnId: null,
-      styles: {
-        position: "fixed",
-        zIndex: 3000,
-      },
-      rightClickPos: {},
-    };
-  },
-  computed: {
-    ...mapState("free", ["curElement", "curCopyElement"]),
-    elementIsSelected() {
-      return !!this.curElement.id;
-    },
-  },
-  mounted() {
-    this.init();
-  },
-  beforeDestroy() {
-    document.oncontextmenu = null;
-    document.removeEventListener("mouseup", this.docMouseUp);
-  },
-  methods: {
-    ...mapMutations("free", [
-      "setOpenElementEditDialog",
-      "setCurElement",
-      "setCurCopyElement",
-    ]),
-    ...mapActions("free", ["actElementById", "removeElement", "pasteElement"]),
-    init() {
-      // 注册自定义右键事件菜单
-      document.oncontextmenu = function () {
-        return false;
-      };
-      document.addEventListener("mouseup", this.docMouseUp);
-    },
-    close() {
-      this.visible = false;
-    },
-    show() {
-      this.visible = true;
-    },
-    docMouseUp(e) {
-      if (e.button === 2) {
-        this.rightClick(e);
-      }
-    },
-    rightClick(e) {
-      const { elementId, columnId } = this.getRelateElementId(e.target);
-      // 栏外的点击,不做任何处理
-      if (!columnId) {
-        this.curColumnId = null;
-        this.setCurElement({});
-        this.rightClickPos = {};
-        return;
-      }
-      const { offsetLeft, offsetTop } = this.getOffsetInfo(
-        e.target || e.srcElement
-      );
-      this.rightClickPos = {
-        x: offsetLeft + e.offsetX,
-        y: offsetTop + e.offsetY,
-      };
-
-      this.curColumnId = columnId;
-      if (elementId) {
-        this.actElementById(elementId);
-      } else {
-        this.setCurElement({});
-      }
-
-      // 既没有要黏贴的元素也没有选中的元素时,不显示右键菜单
-      if (!this.curCopyElement.id && !this.curElement.id) return;
-
-      this.show();
-      this.$nextTick(() => {
-        const { x: clickLeft, y: clickTop } = e;
-        const { offsetWidth: menuWidth, offsetHeight: menuHeight } =
-          this.$refs.RightMenuBody;
-
-        const { innerWidth: wWidth, innerHeight: wHeight } = window;
-
-        let menuLeft = clickLeft,
-          menuTop = clickTop;
-        if (menuWidth + clickLeft > wWidth) {
-          menuLeft = clickLeft - menuWidth;
-        }
-        if (menuHeight + clickTop > wHeight) {
-          menuTop = clickTop - menuHeight;
-        }
-
-        this.styles = Object.assign({}, this.styles, {
-          top: menuTop + "px",
-          left: menuLeft + "px",
-        });
-      });
-    },
-    getRelateElementId(dom) {
-      let elementId = null,
-        columnId = null;
-      let parentNode = dom;
-      while (!(columnId || parentNode.className.includes("page-box"))) {
-        if (
-          !elementId &&
-          parentNode["id"] &&
-          parentNode["id"].includes("element-")
-        ) {
-          elementId = parentNode["id"];
-        }
-
-        if (
-          !columnId &&
-          parentNode["id"] &&
-          parentNode["id"].includes("column-")
-        ) {
-          columnId = parentNode["id"];
-        }
-
-        parentNode = parentNode.parentNode;
-      }
-
-      return { elementId, columnId };
-    },
-    getOffsetInfo(dom, endParentClass = "page-column-body") {
-      let parentNode = dom;
-      let offsetTop = 0,
-        offsetLeft = 0;
-      while (!parentNode.className.includes(endParentClass)) {
-        offsetTop += parentNode.offsetTop;
-        offsetLeft += parentNode.offsetLeft;
-        parentNode = parentNode.offsetParent;
-      }
-      return {
-        offsetLeft,
-        offsetTop,
-      };
-    },
-    toEdit() {
-      this.close();
-      this.setOpenElementEditDialog(true);
-    },
-    toDelete() {
-      this.removeSelectElement();
-      // this.close();
-      // this.$confirm("确定要删除当前元素吗?", "提示", {
-      //   type: "warning"
-      // })
-      //   .then(() => {
-      //     this.removeSelectElement();
-      //   })
-      //   .catch(() => {});
-    },
-    removeSelectElement() {
-      this.close();
-      this.removeElement(this.curElement);
-    },
-    toCopy() {
-      this.close();
-      this.setCurCopyElement(deepCopy(this.curElement));
-    },
-    toPaste() {
-      this.close();
-      this.pasteElement({
-        element: {
-          ...deepCopy(this.curCopyElement),
-          ...this.rightClickPos,
-          id: getElementId(),
-          key: randomCode(),
-        },
-        toColumnId: this.curColumnId,
-      });
-    },
-  },
-};
-</script>

+ 0 - 188
src/modules/card/modules/free/components/ShortcutKey.vue

@@ -1,188 +0,0 @@
-<template>
-  <div class="shortcut-key"></div>
-</template>
-
-<script>
-import { mapState, mapMutations, mapActions } from "vuex";
-import { deepCopy, randomCode, getElementId } from "../../../plugins/utils";
-import { getModel as getPageModel } from "../../../elements/page/model";
-
-export default {
-  name: "ShortcutKey",
-  data() {
-    return {};
-  },
-  computed: {
-    ...mapState("free", [
-      "cardConfig",
-      "pages",
-      "curElement",
-      "curPage",
-      "curPageNo",
-      "curColumnId",
-      "curCopyElement",
-    ]),
-  },
-  mounted() {
-    this.registShortcutKey();
-  },
-  beforeDestroy() {
-    this.removeShortcutKey();
-  },
-  methods: {
-    ...mapMutations("free", ["setCurCopyElement", "setOpenElementEditDialog"]),
-    ...mapActions("free", [
-      "modifyElement",
-      "addPage",
-      "removePage",
-      "pasteElement",
-      "removeElement",
-      "moveElementZindex",
-    ]),
-    keyEvent(e) {
-      // console.log(e);
-
-      // move
-      const moveAction = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"];
-      if (moveAction.includes(e.code)) {
-        e.preventDefault();
-        // move zindex
-        if (e.ctrlKey) {
-          this.toMoverElementZindex(e.code);
-          return;
-        }
-        const size = e.shiftKey ? 10 : 1;
-        this.toMoveElement(e.code, size);
-        return;
-      }
-
-      if (e.code === "KeyC" && e.ctrlKey && !e.repeat) {
-        e.preventDefault();
-        this.toCopeElement();
-        return;
-      }
-      if (e.code === "KeyV" && e.ctrlKey && !e.repeat) {
-        e.preventDefault();
-        this.toPasteElement();
-        return;
-      }
-      if (e.code === "KeyE" && e.ctrlKey && !e.repeat) {
-        e.preventDefault();
-        this.toEditElement();
-        return;
-      }
-      if (e.code === "KeyP" && e.ctrlKey && !e.repeat) {
-        e.preventDefault();
-        this.$emit("sk-preview");
-        return;
-      }
-      if (e.code === "KeyS" && e.ctrlKey && !e.shiftKey && !e.repeat) {
-        e.preventDefault();
-        this.$emit("sk-save");
-        return;
-      }
-      if (e.code === "KeyS" && e.ctrlKey && e.shiftKey && !e.repeat) {
-        e.preventDefault();
-        this.$emit("sk-submit");
-        return;
-      }
-
-      if (
-        e.code === "Delete" &&
-        !e.ctrlKey &&
-        !e.altKey &&
-        !e.shiftKey &&
-        !e.repeat
-      ) {
-        if (!this.curElement.id) return;
-        e.preventDefault();
-        this.removeElement(this.curElement);
-        return;
-      }
-
-      // create new page
-      // ctrl+n / ctrl+shift+n :无法重置浏览器默认操作
-      if (e.code === "KeyN" && e.ctrlKey && e.altKey && !e.repeat) {
-        e.preventDefault();
-        this.toAddPage();
-        return;
-      }
-      // ctrl+alt+delete :无法重置系统默认操作
-      if (e.code === "KeyD" && e.ctrlKey && e.altKey && !e.repeat) {
-        e.preventDefault();
-        this.toDeletePage();
-        return;
-      }
-    },
-    // actions
-    toMoveElement(direction, size) {
-      if (!this.curElement.id) return;
-      const actionSet = {
-        ArrowUp: ["y", -1],
-        ArrowDown: ["y", 1],
-        ArrowLeft: ["x", -1],
-        ArrowRight: ["x", 1],
-      };
-      const [moveParam, moveDirection] = actionSet[direction];
-      const moveData = {
-        [moveParam]: this.curElement[moveParam] + moveDirection * size,
-        key: randomCode(),
-      };
-      this.modifyElement(Object.assign({}, this.curElement, moveData));
-    },
-    toMoverElementZindex(direction) {
-      if (!this.curElement.id) return;
-
-      const actionSet = {
-        ArrowUp: -1,
-        ArrowDown: 1,
-      };
-      if (!actionSet[direction]) return;
-      this.moveElementZindex({
-        curElement: this.curElement,
-        pos: actionSet[direction],
-      });
-    },
-    toAddPage() {
-      const page = getPageModel(this.cardConfig);
-      this.addPage(page);
-    },
-    toDeletePage() {
-      if (this.pages.length === 1) {
-        this.$message.error("只剩最后一页,不能再删除了");
-        return;
-      }
-      this.removePage(this.curPage);
-    },
-    toCopeElement() {
-      this.setCurCopyElement(deepCopy(this.curElement));
-    },
-    toPasteElement() {
-      if (!this.curCopyElement.id) return;
-      if (!this.curColumnId) return;
-
-      this.pasteElement({
-        element: {
-          ...deepCopy(this.curCopyElement),
-          x: 50,
-          y: 50,
-          id: getElementId(),
-          key: randomCode(),
-        },
-        toColumnId: this.curColumnId,
-      });
-    },
-    toEditElement() {
-      if (!this.curElement.id) return;
-      this.setOpenElementEditDialog(true);
-    },
-    // event
-    registShortcutKey() {
-      document.addEventListener("keydown", this.keyEvent);
-    },
-    removeShortcutKey() {
-      document.removeEventListener("keydown", this.keyEvent);
-    },
-  },
-};
-</script>

+ 0 - 122
src/modules/card/modules/free/components/TopicColumnEdit.vue

@@ -1,122 +0,0 @@
-<template>
-  <div
-    :id="data.id"
-    :class="['topic-column-edit', { 'is-active': curColumnId === data.id }]"
-    @drop.prevent="dropInnerElement($event)"
-    @dragover.prevent
-    @dragleave.prevent
-    @mousedown="columnBodyClick"
-  >
-    <div v-if="data.elements.length" class="page-column-body">
-      <topic-element-edit
-        v-for="element in data.elements"
-        :key="element.key"
-        :data="element"
-        :transform-fit="rebuildGuides"
-        @resize-over="elementResizeOver"
-      ></topic-element-edit>
-
-      <!-- guide-lines -->
-      <div class="element-guide-lines">
-        <div
-          v-for="line in xLines"
-          :key="`x-${line.top}`"
-          class="guide-line guide-line-x"
-          :style="line"
-        ></div>
-        <div
-          v-for="line in yLines"
-          :key="`y-${line.left}`"
-          class="guide-line guide-line-y"
-          :style="line"
-        ></div>
-      </div>
-    </div>
-    <div v-else class="page-column-body">
-      <div v-if="curPage.showForbidArea" class="page-column-forbid-area">
-        <p>该区域严禁作答</p>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { mapState, mapActions, mapMutations } from "vuex";
-import guideLinesMixins from "../../../mixins/guideLines";
-import TopicElementEdit from "./TopicElementEdit";
-import { getElementDesc } from "../elements/model";
-
-export default {
-  name: "TopicColumnEdit",
-  components: { TopicElementEdit },
-  mixins: [guideLinesMixins],
-  props: {
-    data: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {};
-  },
-  computed: {
-    ...mapState("free", ["curDragElement", "curPage", "curColumnId"]),
-  },
-  methods: {
-    ...mapMutations("free", [
-      "setCurDragElement",
-      "setCurElement",
-      "setCurColumnId",
-    ]),
-    ...mapActions("free", ["addElement", "modifyElement"]),
-    dropInnerElement(e) {
-      let { offsetX: x, offsetY: y } = e;
-      const { offsetLeft, offsetTop } = this.getOffsetInfo(
-        e.target || e.srcElement
-      );
-
-      const curElement = {
-        ...this.curDragElement,
-        x: x + offsetLeft,
-        y: y + offsetTop,
-        desc: getElementDesc(this.curDragElement),
-      };
-      const columnNo = this.curPage.columns.findIndex(
-        (col) => col.id === this.data.id
-      );
-
-      this.clear();
-      this.setCurDragElement({});
-      this.addElement({ element: curElement, columnIndex: columnNo });
-    },
-    getOffsetInfo(dom, endParentClass = "page-column-body") {
-      let parentNode = dom;
-      let offsetTop = 0,
-        offsetLeft = 0;
-      while (!parentNode.className.includes(endParentClass)) {
-        offsetTop += parentNode.offsetTop;
-        offsetLeft += parentNode.offsetLeft;
-        parentNode = parentNode.offsetParent;
-      }
-      return {
-        offsetLeft,
-        offsetTop,
-      };
-    },
-    elementResizeOver(element) {
-      this.clear();
-      this.modifyElement(element);
-    },
-    columnBodyClick() {
-      console.log(this.data.id);
-      this.setCurColumnId(this.data.id);
-      this.setCurElement({});
-    },
-    rebuildGuides(element, actionType) {
-      return this.rebuild(this.data.elements, element, actionType);
-    },
-  },
-};
-</script>

+ 0 - 130
src/modules/card/modules/free/components/TopicElementEdit.vue

@@ -1,130 +0,0 @@
-<template>
-  <div class="topic-element-edit">
-    <element-resize
-      v-model="elemData"
-      :class="{ 'element-resize-act': curElement.id === data.id }"
-      :transform-fit="transformFit"
-      :element-pk="data.id"
-      is-compact
-      @resize-over="resizeOver"
-      @on-click="activeCurElement"
-    >
-      <div
-        :id="data.id"
-        :class="classes"
-        :style="styles"
-        :data-type="data.type"
-      >
-        <component :is="compName" :data="data"></component>
-      </div>
-    </element-resize>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations } from "vuex";
-import { objAssign } from "../../../plugins/utils";
-import ElementResize from "../../../components/common/ElementResize";
-import TopicNumber from "../../../components/common/TopicNumber";
-// elements
-import EditFillQuestion from "../elements/fill-question/ElemFillQuestion";
-import EditFillLine from "../elements/fill-line/ElemFillLine";
-import EditText from "../../../elements/text/ElemText";
-import EditImage from "../../../elements/image/ElemImage";
-import EditLine from "../../../elements/line/ElemLine";
-import EditLines from "../../../elements/lines/ElemLines";
-import EditGrids from "../../../elements/grids/ElemGrids";
-import EditPane from "../../../elements/pane/ElemPane";
-import EditBarcode from "../../../elements/barcode/ElemBarcode";
-import EditFillNumber from "../../../elements/fill-number/ElemFillNumber";
-import EditFillField from "../../../elements/fill-field/ElemFillField";
-import EditFillTable from "../../../elements/fill-table/ElemFillTable";
-import EditFillPane from "../../../elements/fill-pane/ElemFillPane";
-
-export default {
-  name: "TopicElementEdit",
-  components: {
-    ElementResize,
-    TopicNumber,
-    EditFillQuestion,
-    EditFillLine,
-    EditFillNumber,
-    EditFillField,
-    EditFillTable,
-    EditFillPane,
-    EditText,
-    EditImage,
-    EditLine,
-    EditLines,
-    EditGrids,
-    EditPane,
-    EditBarcode,
-  },
-  props: {
-    data: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-    transformFit: {
-      type: Function,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      styles: {},
-      elemData: {
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0,
-        zindex: 9,
-        init: false,
-      },
-    };
-  },
-  computed: {
-    ...mapState("free", ["curElement"]),
-    elementName() {
-      if (this.data.type.includes("LINE_")) return "line";
-      return this.data.type.toLowerCase().replace("_", "-");
-    },
-    compName() {
-      return `edit-${this.elementName}`;
-    },
-    classes() {
-      return [
-        "topic-design",
-        "element-item",
-        `element-item-${this.elementName}`,
-      ];
-    },
-  },
-  created() {
-    this.init();
-  },
-  methods: {
-    ...mapMutations("free", ["setCurElement"]),
-    init() {
-      this.elemData = objAssign(this.elemData, this.data);
-      this.styles = {
-        left: this.data.x + "px",
-        top: this.data.y + "px",
-        width: this.data.w + "px",
-        height: this.data.h + "px",
-        zIndex: this.data.zindex,
-      };
-    },
-    activeCurElement() {
-      this.setCurElement(this.data);
-    },
-    resizeOver() {
-      this.$emit("resize-over", Object.assign({}, this.data, this.elemData));
-    },
-  },
-};
-</script>

+ 0 - 84
src/modules/card/modules/free/components/TopicElementPreview.vue

@@ -1,84 +0,0 @@
-<template>
-  <div class="topic-element-preview">
-    <div
-      :id="`preview-${data.id}`"
-      :class="classes"
-      :data-type="data.type"
-      :style="styles"
-    >
-      <component :is="compName" :data="data" preview></component>
-    </div>
-  </div>
-</template>
-
-<script>
-import PreviewFillQuestion from "../elements/fill-question/ElemFillQuestion";
-import PreviewFillLine from "../elements/fill-line/ElemFillLine";
-import PreviewText from "../../../elements/text/ElemText";
-import PreviewImage from "../../../elements/image/ElemImage";
-import PreviewLine from "../../../elements/line/ElemLine";
-import PreviewLines from "../../../elements/lines/ElemLines";
-import PreviewGrids from "../../../elements/grids/ElemGrids";
-import PreviewPane from "../../../elements/pane/ElemPane";
-import PreviewBarcode from "../../../elements/barcode/ElemBarcode";
-import PreviewFillNumber from "../../../elements/fill-number/ElemFillNumber";
-import PreviewFillField from "../../../elements/fill-field/ElemFillField";
-import PreviewFillTable from "../../../elements/fill-table/ElemFillTable";
-import PreviewFillPane from "../../../elements/fill-pane/ElemFillPane";
-
-export default {
-  name: "TopicElementPreview",
-  components: {
-    PreviewFillQuestion,
-    PreviewFillLine,
-    PreviewFillNumber,
-    PreviewFillField,
-    PreviewFillTable,
-    PreviewFillPane,
-    PreviewText,
-    PreviewImage,
-    PreviewLine,
-    PreviewLines,
-    PreviewGrids,
-    PreviewPane,
-    PreviewBarcode,
-  },
-  props: {
-    data: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {};
-  },
-  computed: {
-    elementName() {
-      const name = this.data.type.toLowerCase().replace("_", "-");
-      return name.includes("line-") ? "line" : name;
-    },
-    compName() {
-      return `preview-${this.elementName}`;
-    },
-    classes() {
-      return [
-        "topic-preview",
-        "element-item",
-        `element-item-${this.elementName}`,
-      ];
-    },
-    styles() {
-      return {
-        left: this.data.x + "px",
-        top: this.data.y + "px",
-        width: this.data.w + "px",
-        height: this.data.h + "px",
-        zIndex: this.data.zindex,
-      };
-    },
-  },
-  methods: {},
-};
-</script>

+ 0 - 256
src/modules/card/modules/free/elements/fill-line/EditFillLine.vue

@@ -1,256 +0,0 @@
-<template>
-  <div class="edit-fill-line">
-    <el-form
-      ref="modalFormComp"
-      :key="modalForm.id"
-      :model="modalForm"
-      :rules="rules"
-      label-width="120px"
-    >
-      <el-form-item prop="endNumber" label="起止题号:">
-        <el-input-number
-          v-model="modalForm.startNumber"
-          style="width: 40px"
-          :min="0"
-          :max="999"
-          :step="1"
-          step-strictly
-          :controls="false"
-          @change="lineTypeChange"
-        ></el-input-number>
-        <span class="el-input-split"></span>
-        <el-input-number
-          v-model="modalForm.endNumber"
-          style="width: 40px"
-          :min="0"
-          :max="999"
-          :step="1"
-          step-strictly
-          :controls="false"
-          @change="lineTypeChange"
-        ></el-input-number>
-      </el-form-item>
-      <el-form-item prop="lineSpacing" label="空位上下间距:">
-        <el-input-number
-          v-model.number="modalForm.lineSpacing"
-          style="width: 125px"
-          :min="20"
-          :max="100"
-          :step="1"
-          step-strictly
-          :controls="false"
-        ></el-input-number>
-      </el-form-item>
-      <el-form-item prop="questionNumberPerLine" label="每行空数:">
-        <el-input-number
-          v-model="modalForm.questionNumberPerLine"
-          style="width: 125px"
-          :min="1"
-          :max="10"
-          :step="1"
-          step-strictly
-          :controls="false"
-        ></el-input-number>
-        <span class="el-input-tips">*指一行显示空位数量</span>
-      </el-form-item>
-      <el-form-item label="题号前缀:">
-        <el-input
-          v-model.trim="modalForm.numberPre"
-          style="width: 125px"
-          :maxlength="6"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item label="空位排列方向:" required>
-        <el-radio-group v-model="modalForm.questionDirection" size="small">
-          <el-radio-button
-            v-for="(val, key) in DIRECTION_TYPE"
-            :key="key"
-            :label="key"
-            >{{ val }}</el-radio-button
-          >
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="小题空数类型:">
-        <el-radio-group
-          v-model="modalForm.questionLineType"
-          size="small"
-          @change="lineTypeChange"
-        >
-          <el-radio-button label="norm">标准</el-radio-button>
-          <el-radio-button label="custom">自定义</el-radio-button>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item
-        v-if="modalForm.questionLineType === 'norm'"
-        prop="lineNumberPerQuestion"
-        label="每题空数:"
-      >
-        <el-input-number
-          v-model="modalForm.lineNumberPerQuestion"
-          style="width: 125px"
-          :min="1"
-          :max="15"
-          :step="1"
-          step-strictly
-          :controls="false"
-          @change="lineTypeChange"
-        ></el-input-number>
-        <span class="el-input-tips">*指每一小题的空位数量</span>
-      </el-form-item>
-      <el-form-item v-else prop="questionLineNums" label="各小题空数:">
-        <table class="table table-white table-narrow">
-          <tr>
-            <th>题号</th>
-            <th>空数</th>
-          </tr>
-          <tr v-for="option in modalForm.questionLineNums" :key="option.no">
-            <td>{{ option.no }}</td>
-            <td>
-              <el-input-number
-                v-model="option.count"
-                size="mini"
-                :min="1"
-                :max="50"
-                :step="1"
-                step-strictly
-                :controls="false"
-                style="width: 125px"
-              ></el-input-number>
-            </td>
-          </tr>
-        </table>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script>
-import { DIRECTION_TYPE } from "../../../../enumerate";
-import { deepCopy } from "../../../../plugins/utils";
-import { getModel } from "./model";
-
-const initModalForm = {
-  id: "",
-  topicName: "",
-  startNumber: 1,
-  endNumber: 2,
-  questionsCount: 2,
-  questionNumberPerLine: 1,
-  lineNumberPerQuestion: 1,
-  lineSpacing: 40,
-  questionDirection: "horizontal",
-  questionLineType: "norm",
-  questionLineNums: [],
-  numberPre: "",
-};
-
-export default {
-  name: "EditFillLine",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    const numberRangeValidater = (rule, value, callback) => {
-      if (!this.modalForm.startNumber || !this.modalForm.endNumber) {
-        return callback(new Error("请输入起止题号"));
-      }
-      if (this.modalForm.startNumber > this.modalForm.endNumber) {
-        callback(new Error("开始题号不能大于结束题号"));
-      } else {
-        callback();
-      }
-    };
-    const questionLineNumsValidater = (rule, value, callback) => {
-      if (value.some((item) => !item.count)) {
-        return callback(new Error("请输入每题空数"));
-      }
-
-      callback();
-    };
-
-    return {
-      modalForm: { ...initModalForm },
-      DIRECTION_TYPE,
-      rules: {
-        endNumber: [
-          {
-            required: true,
-            message: "请输入起止题号",
-            trigger: "change",
-          },
-          {
-            type: "number",
-            validator: numberRangeValidater,
-            trigger: "change",
-          },
-        ],
-        lineSpacing: [
-          {
-            required: true,
-            type: "number",
-            message: "请输入空位上下间距",
-            trigger: "change",
-          },
-        ],
-        questionNumberPerLine: [
-          {
-            required: true,
-            type: "number",
-            message: "请输入每行空数",
-            trigger: "change",
-          },
-        ],
-        lineNumberPerQuestion: [
-          {
-            required: true,
-            type: "number",
-            message: "请输入每题空数",
-            trigger: "change",
-          },
-        ],
-        questionLineNums: [
-          {
-            required: true,
-            validator: questionLineNumsValidater,
-            trigger: "change",
-          },
-        ],
-      },
-    };
-  },
-  mounted() {
-    this.initData(this.instance);
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = deepCopy(val);
-      this.modalForm.endNumber =
-        this.modalForm.startNumber + this.modalForm.questionsCount - 1;
-    },
-    lineTypeChange() {
-      if (
-        !this.modalForm.startNumber ||
-        !this.modalForm.endNumber ||
-        this.modalForm.startNumber > this.modalForm.endNumber
-      )
-        return;
-
-      this.modalForm.questionsCount =
-        this.modalForm.endNumber - this.modalForm.startNumber + 1;
-      this.modalForm = getModel(this.modalForm);
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      this.$emit("modified", deepCopy(this.modalForm));
-    },
-  },
-};
-</script>

+ 0 - 86
src/modules/card/modules/free/elements/fill-line/ElemFillLine.vue

@@ -1,86 +0,0 @@
-<template>
-  <div class="elem-fill-line">
-    <div v-if="data.questionDirection === 'vertical'" class="elem-body">
-      <ul
-        v-for="question in data.questionLineNums"
-        :key="question.no"
-        class="elem-fill-quesiton"
-        :style="groupStyles"
-      >
-        <li class="elem-fill-no">
-          <span :style="lineNoStyles"
-            >{{ data.numberPre }}{{ question.no }}.</span
-          >
-        </li>
-        <li
-          v-for="line in question.count"
-          :key="line"
-          class="elem-fill-line"
-          :style="lineStyles"
-        ></li>
-      </ul>
-    </div>
-    <div v-else class="elem-body">
-      <div v-for="question in data.questionLineNums" :key="question.no">
-        <ul
-          v-for="line in question.count"
-          :key="line"
-          class="elem-fill-quesiton"
-          :style="groupStyles"
-        >
-          <li v-if="line === 1" class="elem-fill-no">
-            <span :style="lineNoStyles">
-              {{ data.numberPre }}{{ question.no }}.
-            </span>
-          </li>
-          <li
-            v-if="line !== question.count"
-            class="elem-fill-comma"
-            :style="lineNoStyles"
-          >
-            ,
-          </li>
-          <li class="elem-fill-line" :style="lineStyles"></li>
-        </ul>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  name: "ElemFillLine",
-  props: {
-    data: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      questions: [],
-    };
-  },
-  computed: {
-    lineStyles() {
-      return {
-        height: this.data.lineSpacing + "px",
-      };
-    },
-    lineNoStyles() {
-      return {
-        top: this.data.lineSpacing - 4 + "px",
-      };
-    },
-    groupStyles() {
-      return {
-        width: 100 / this.data.questionNumberPerLine + "%",
-      };
-    },
-  },
-  mounted() {},
-  methods: {},
-};
-</script>

+ 0 - 60
src/modules/card/modules/free/elements/fill-line/model.js

@@ -1,60 +0,0 @@
-import { deepCopy, getElementId, randomCode } from "../../../../plugins/utils";
-
-const MODEL = {
-  type: "FILL_LINE",
-  x: 0,
-  y: 0,
-  w: 500,
-  h: 100,
-  minHeight: 40,
-  sign: "subjective",
-  topicName: "",
-  topicNo: null,
-  startNumber: 1,
-  questionsCount: 4,
-  questionNumberPerLine: 2,
-  lineNumberPerQuestion: 1,
-  lineSpacing: 40,
-  questionDirection: "vertical",
-  questionLineType: "norm",
-  questionLineNums: [],
-  numberPre: "",
-  isCovered: false,
-};
-
-const getModel = (options = {}) => {
-  let model = Object.assign({}, deepCopy(MODEL), options);
-  model.key = randomCode();
-  if (!model.id) model.id = getElementId();
-
-  if (model.questionLineType === "norm") {
-    let questionLineNums = [];
-    for (
-      let j = model.startNumber;
-      j < model.startNumber + model.questionsCount;
-      j++
-    ) {
-      questionLineNums.push({
-        no: j,
-        count: model.lineNumberPerQuestion,
-      });
-    }
-    model.questionLineNums = questionLineNums;
-  } else {
-    const orgQuestionLineCounts = model.questionLineNums.map(
-      (item) => item.count
-    );
-    let questionLineNums = [];
-    for (let j = 0; j < model.questionsCount; j++) {
-      questionLineNums.push({
-        no: j + model.startNumber,
-        count: orgQuestionLineCounts[j] || model.lineNumberPerQuestion,
-      });
-    }
-    model.questionLineNums = questionLineNums;
-  }
-
-  return model;
-};
-
-export { MODEL, getModel };

+ 0 - 239
src/modules/card/modules/free/elements/fill-question/EditFillQuestion.vue

@@ -1,239 +0,0 @@
-<template>
-  <div class="edit-fill-question">
-    <el-form
-      ref="modalFormComp"
-      :key="modalForm.id"
-      :model="modalForm"
-      :rules="rules"
-      label-width="120px"
-    >
-      <el-form-item prop="endNumber" label="起止题号:">
-        <el-input-number
-          v-model="modalForm.startNumber"
-          style="width: 40px"
-          :min="0"
-          :max="999"
-          :step="1"
-          step-strictly
-          :controls="false"
-        ></el-input-number>
-        <span class="el-input-split"></span>
-        <el-input-number
-          v-model="modalForm.endNumber"
-          style="width: 40px"
-          :min="modalForm.startNumber"
-          :max="999"
-          :step="1"
-          step-strictly
-          :controls="false"
-        ></el-input-number>
-      </el-form-item>
-      <el-form-item prop="optionCount" label="选项个数:">
-        <el-input-number
-          v-model="modalForm.optionCount"
-          style="width: 125px"
-          :min="2"
-          :max="22"
-          :step="1"
-          step-strictly
-          :controls="false"
-          :disabled="modalForm.isBoolean"
-        ></el-input-number>
-      </el-form-item>
-      <el-form-item label="小题排列方向:" required>
-        <el-radio-group v-model="modalForm.questionDirection" size="small">
-          <el-radio-button
-            v-for="(val, key) in DIRECTION_TYPE"
-            :key="key"
-            :label="key"
-            >{{ val }}</el-radio-button
-          >
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item>
-        <el-checkbox
-          v-model="modalForm.isMultiply"
-          :disabled="modalForm.isBoolean"
-          >多选</el-checkbox
-        >
-      </el-form-item>
-      <el-form-item>
-        <el-checkbox
-          v-model="modalForm.isBoolean"
-          :disabled="modalForm.isMultiply"
-          @change="selectTypeChange"
-          >判断题</el-checkbox
-        >
-        <el-select
-          v-if="modalForm.isBoolean"
-          v-model="modalForm.booleanType"
-          style="margin-left: 20px; width: 125px"
-          placeholder="请选择"
-          @change="booleanTypeChange"
-        >
-          <el-option
-            v-for="item in BOOLEAN_TYPE"
-            :key="item"
-            :label="item"
-            :value="item"
-          ></el-option>
-        </el-select>
-        <span v-if="modalForm.isBoolean">(备选是否配置)</span>
-      </el-form-item>
-      <el-form-item
-        v-if="modalForm.isBoolean"
-        prop="booleanType"
-        label="是否配置:"
-      >
-        <span>是:</span>
-        <el-input
-          v-model.trim="booleanTypes.yes"
-          :maxlength="1"
-          placeholder="是"
-          style="margin-right: 20px; width: 60px"
-        ></el-input>
-        <span>否:</span>
-        <el-input
-          v-model.trim="booleanTypes.no"
-          :maxlength="1"
-          placeholder="否"
-          style="margin-right: 20px; width: 60px"
-        ></el-input>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script>
-import { BOOLEAN_TYPE, DIRECTION_TYPE } from "../../../../enumerate";
-
-const initModalForm = {
-  id: "",
-  topicName: "",
-  startNumber: 1,
-  endNumber: 5,
-  questionsCount: 10,
-  optionCount: 5,
-  questionDirection: "horizontal",
-  isBoolean: false,
-  booleanType: BOOLEAN_TYPE[0],
-  isMultiply: false,
-};
-
-export default {
-  name: "EditFillQuestion",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    const numberRangeValidater = (rule, value, callback) => {
-      if (!this.modalForm.startNumber || !this.modalForm.endNumber) {
-        return callback(new Error("请输入起止题号"));
-      }
-      if (this.modalForm.startNumber > this.modalForm.endNumber) {
-        callback(new Error("开始题号不能大于结束题号"));
-      } else {
-        callback();
-      }
-    };
-
-    const booleanTypeValidater = (rule, value, callback) => {
-      if (this.modalForm.isBoolean) {
-        if (
-          this.booleanTypes.yes &&
-          this.booleanTypes.no &&
-          this.booleanTypes.yes.length <= 2 &&
-          this.booleanTypes.no.length <= 2
-        ) {
-          callback();
-        } else {
-          callback(new Error("请设置是否配置,单个设置最多两个字符。"));
-        }
-      } else {
-        callback();
-      }
-    };
-
-    return {
-      modalForm: { ...initModalForm },
-      BOOLEAN_TYPE,
-      DIRECTION_TYPE,
-      booleanTypes: {
-        yes: "",
-        no: "",
-      },
-      rules: {
-        endNumber: [
-          {
-            required: true,
-            message: "请输入起止题号",
-            trigger: "change",
-          },
-          {
-            type: "number",
-            validator: numberRangeValidater,
-            trigger: "change",
-          },
-        ],
-        optionCount: [
-          {
-            required: true,
-            type: "number",
-            message: "请输入选项个数",
-            trigger: "change",
-          },
-        ],
-        booleanType: [
-          {
-            required: true,
-            validator: booleanTypeValidater,
-            trigger: "change",
-          },
-        ],
-      },
-    };
-  },
-  mounted() {
-    this.initData(this.instance);
-  },
-  methods: {
-    initData(val) {
-      const valInfo = val.parent || val;
-      this.modalForm = Object.assign({}, this.initModalForm, valInfo);
-      this.modalForm.endNumber =
-        this.modalForm.startNumber + this.modalForm.questionsCount - 1;
-      this.booleanTypeChange();
-    },
-    selectTypeChange(val) {
-      if (val) {
-        this.modalForm.optionCount = 2;
-        this.modalForm.isMultiply = false;
-        this.modalForm.booleanType = BOOLEAN_TYPE[0];
-        this.booleanTypeChange();
-      }
-    },
-    booleanTypeChange() {
-      const [yes, no] = this.modalForm.booleanType.split(",");
-      this.booleanTypes.yes = yes;
-      this.booleanTypes.no = no;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      this.modalForm.questionsCount =
-        this.modalForm.endNumber - this.modalForm.startNumber + 1;
-      this.modalForm.booleanType = [
-        this.booleanTypes.yes,
-        this.booleanTypes.no,
-      ].join();
-      this.$emit("modified", this.modalForm);
-    },
-  },
-};
-</script>

+ 0 - 126
src/modules/card/modules/free/elements/fill-question/ElemFillQuestion.vue

@@ -1,126 +0,0 @@
-<template>
-  <div :class="classes">
-    <div class="elem-body">
-      <ul
-        v-for="(group, gindex) in questions"
-        :key="gindex"
-        class="group-item"
-        :style="gindex !== questions.length - 1 ? groupGapStyles : null"
-      >
-        <li
-          v-for="(question, qindex) in group"
-          :key="qindex"
-          class="question-item"
-          :style="questionGapStyles"
-        >
-          <span
-            v-for="(option, oindex) in question"
-            :key="oindex"
-            class="option-item"
-            :style="optionGapStyles"
-          >
-            <i>{{ option }}</i>
-          </span>
-        </li>
-      </ul>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  name: "ElemFillQuestion",
-  props: {
-    data: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      questions: [],
-    };
-  },
-  computed: {
-    classes() {
-      return [
-        "elem-fill-question",
-        `elem-fill-question-${this.data.optionDirection}`,
-        {
-          "elem-fill-question-simple":
-            !this.data.isMultiply && !this.data.isBoolean,
-          "elem-fill-question-multiply": this.data.isMultiply,
-          "elem-fill-question-boolean": this.data.isBoolean,
-        },
-      ];
-    },
-    groupGapStyles() {
-      return {
-        marginRight: this.data.groupGap + "px",
-      };
-    },
-    questionGapStyles() {
-      return this.data.optionDirection === "vertical"
-        ? { marginRight: this.data.questionGap + "px" }
-        : { marginBottom: this.data.questionGap + "px" };
-    },
-    optionGapStyles() {
-      const styles =
-        this.data.optionDirection === "vertical"
-          ? { marginBottom: this.data.optionGap + "px" }
-          : { marginRight: this.data.optionGap + "px" };
-      // styles.fontSize = this.data.fontSize;
-      return styles;
-    },
-  },
-  watch: {
-    data: {
-      immediate: true,
-      handler(val) {
-        this.parseQuestion(val);
-      },
-    },
-  },
-  methods: {
-    parseQuestion(data) {
-      let questionNo = data.startNumber;
-      let questions = [];
-      const choiceList = this.getChoiceList(data);
-      if (data.questionDirection === "vertical") {
-        const groupNum = Math.ceil(
-          data.questionsCount / data.questionCountPerGroup
-        );
-        for (let i = 0; i < groupNum; i++) {
-          questions[i] = [];
-          const questionCountPerGroup =
-            i === groupNum - 1
-              ? data.questionsCount - data.questionCountPerGroup * i
-              : data.questionCountPerGroup;
-          for (let j = 0; j < questionCountPerGroup; j++) {
-            questions[i][j] = [questionNo++, ...choiceList];
-          }
-        }
-      } else {
-        for (let i = 0; i < data.questionsCount; i++) {
-          const groupIndex = i % data.groupPerLine;
-          if (!questions[groupIndex]) questions[groupIndex] = [];
-          questions[groupIndex].push([questionNo++, ...choiceList]);
-        }
-      }
-      this.questions = questions;
-    },
-    getChoiceList(data) {
-      if (data.isBoolean) {
-        return data.booleanType.split(",");
-      } else {
-        return "abcdefghijklmnopqrstuv"
-          .toUpperCase()
-          .slice(0, data.optionCount)
-          .split("");
-      }
-    },
-  },
-};
-</script>

+ 0 - 39
src/modules/card/modules/free/elements/fill-question/model.js

@@ -1,39 +0,0 @@
-import { getElementId, randomCode } from "../../../../plugins/utils";
-import { BOOLEAN_TYPE } from "../../../../enumerate";
-
-const MODEL = {
-  type: "FILL_QUESTION",
-  x: 0,
-  y: 0,
-  w: 500,
-  h: 138,
-  minHeight: 138,
-  sign: "objective",
-  topicName: "",
-  topicNo: null,
-  startNumber: 1,
-  questionsCount: 10,
-  optionCount: 4,
-  questionCountPerGroup: 5,
-  groupPerLine: 4, // 小题纵向排列时,表示每行组数。小题横向排列时,表示每行小题数。
-  optionDirection: "horizontal",
-  questionDirection: "vertical",
-  questionGap: 8,
-  groupGap: 30,
-  optionGap: 12,
-  isBoolean: false, // 是否是判断题
-  booleanType: BOOLEAN_TYPE[0],
-  isMultiply: false, // 是否是多选题
-  isCovered: false,
-  fontSize: "14px",
-};
-
-const getModel = () => {
-  return {
-    id: getElementId(),
-    key: randomCode(),
-    ...MODEL,
-  };
-};
-
-export { MODEL, getModel };

+ 0 - 166
src/modules/card/modules/free/elements/model.js

@@ -1,166 +0,0 @@
-// element
-import { getModel as createLines } from "../../../elements/lines/model";
-import { getModel as createLine } from "../../../elements/line/model";
-import { getModel as createText } from "../../../elements/text/model";
-import { getModel as createImage } from "../../../elements/image/model";
-import { getModel as createGrids } from "../../../elements/grids/model";
-import { getModel as createPane } from "../../../elements/pane/model";
-import { getModel as createBarcode } from "../../../elements/barcode/model";
-import { getModel as createFillNumber } from "../../../elements/fill-number/model";
-import { getModel as createFillField } from "../../../elements/fill-field/model";
-import { getModel as createFillTable } from "../../../elements/fill-table/model";
-import { getModel as createFillPane } from "../../../elements/fill-pane/model";
-import { getModel as createFillQuestion } from "./fill-question/model";
-import { getModel as createFillLine } from "./fill-line/model";
-
-// available infos
-export const EDITABLE_ELEMENT = [
-  "LINE_HORIZONTAL",
-  "LINE_VERTICAL",
-  "TEXT",
-  "IMAGE",
-  "PANE",
-  "BARCODE",
-];
-
-export const EDITABLE_TOPIC = [
-  "FILL_QUESTION",
-  "FILL_LINE",
-  "FILL_NUMBER",
-  "FILL_FIELD",
-  "FILL_TABLE",
-  "FILL_PANE",
-  "LINES",
-  "GRIDS",
-];
-
-export const ELEMENT_INFOS = {
-  LINES: {
-    name: "多横线",
-    getModel: createLines,
-    getDesc: (element) => {
-      return `多横线-行数:${element.lineCount}`;
-    },
-  },
-  LINE_HORIZONTAL: {
-    name: "横线",
-    getModel: () => createLine("HORIZONTAL"),
-    getDesc: () => {
-      return `横线`;
-    },
-  },
-  LINE_VERTICAL: {
-    name: "竖线",
-    getModel: () => createLine("VERTICAL"),
-    getDesc: () => {
-      return `竖线`;
-    },
-  },
-  TEXT: {
-    name: "文本",
-    getModel: createText,
-    getDesc: (element) => {
-      return `文本-${element.content[0].content.substr(0, 20)}`;
-    },
-  },
-  IMAGE: {
-    name: "图片",
-    getModel: createImage,
-    getDesc: () => {
-      return `图片`;
-    },
-  },
-  GRIDS: {
-    name: "网格",
-    getModel: createGrids,
-    getDesc: (element) => {
-      return `网格-${element.columnCount}×${element.rowCount}`;
-    },
-  },
-  PANE: {
-    name: "方框",
-    getModel: createPane,
-    getDesc: () => {
-      return `方框`;
-    },
-  },
-  BARCODE: {
-    name: "条形码",
-    getModel: createBarcode,
-    getDesc: (element) => {
-      const name = (element.fields[0] && element.fields[0].name) || "";
-      return `条形码-${name}`;
-    },
-  },
-  FILL_QUESTION: {
-    name: "选项填涂",
-    getModel: createFillQuestion,
-    getDesc: (element) => {
-      const endNumber = element.startNumber + element.questionsCount - 1;
-      return `选项填涂-${element.startNumber}~${endNumber}`;
-    },
-  },
-  FILL_LINE: {
-    name: "填空",
-    getModel: createFillLine,
-    getDesc: (element) => {
-      const endNumber = element.startNumber + element.questionsCount - 1;
-      return `填空-${element.startNumber}~${endNumber}`;
-    },
-  },
-  FILL_NUMBER: {
-    name: "号码填涂",
-    getModel: createFillNumber,
-    getDesc: (element) => {
-      return `号码填涂-${element.name}`;
-    },
-  },
-  FILL_FIELD: {
-    name: "变量",
-    getModel: createFillField,
-    getDesc: (element) => {
-      const fieldNames = element.fields.map((field) => field.name).join(",");
-      return `变量-${fieldNames}`;
-    },
-  },
-  FILL_TABLE: {
-    name: "表格",
-    getModel: createFillTable,
-    getDesc: (element) => {
-      return `表格-${element.colCount}×${element.rowCount}`;
-    },
-  },
-  FILL_PANE: {
-    name: "方格组",
-    getModel: createFillPane,
-    getDesc: (element) => {
-      return `方格组-${element.paneCount}`;
-    },
-  },
-};
-
-export const ELEMENT_LIST = EDITABLE_ELEMENT.map((type) => {
-  return {
-    ...ELEMENT_INFOS[type],
-    type,
-  };
-});
-
-export const TOPIC_LIST = EDITABLE_TOPIC.map((type) => {
-  return {
-    ...ELEMENT_INFOS[type],
-    type,
-  };
-});
-
-// 获取元件默认数据结构
-export const getElementModel = (type) => {
-  return { ...ELEMENT_INFOS[type].getModel(), zindex: 9, desc: "" };
-};
-
-export const getElementName = (type) => {
-  return ELEMENT_INFOS[type].name;
-};
-export const getElementDesc = (element) => {
-  return ELEMENT_INFOS[element.type].getDesc(element);
-};

+ 0 - 209
src/modules/card/modules/free/store.js

@@ -1,209 +0,0 @@
-import { randomCode } from "../../plugins/utils";
-
-const state = {
-  cardConfig: {},
-  curElement: {},
-  curDragElement: {},
-  curCopyElement: {},
-  curPage: {},
-  curPageNo: 0,
-  curColumnId: 0,
-  pages: [],
-  openElementEditDialog: false,
-};
-
-const mutations = {
-  setCardConfig(state, cardConfig) {
-    state.cardConfig = Object.assign({}, state.cardConfig, cardConfig);
-  },
-  setCurElement(state, curElement) {
-    state.curElement = curElement;
-
-    if (!curElement.id) return;
-    const curColumn = state.curPage.columns.find(
-      (column) => !!column.elements.find((elem) => elem.id === curElement.id)
-    );
-    state.curColumnId = curColumn.id;
-  },
-  setCurDragElement(state, curDragElement) {
-    state.curDragElement = curDragElement;
-  },
-  setCurCopyElement(state, curCopyElement) {
-    state.curCopyElement = curCopyElement;
-  },
-  setCurPageNo(state, curPageNo) {
-    const pageNo = state.pages[curPageNo] ? curPageNo : 0;
-    state.curPage = state.pages[pageNo];
-    state.curPageNo = pageNo;
-  },
-  setCurPage(state, curPage) {
-    state.curPage = curPage;
-  },
-  setCurColumnId(state, curColumnId) {
-    state.curColumnId = curColumnId;
-  },
-  setPages(state, pages) {
-    state.pages = pages;
-  },
-  setOpenElementEditDialog(state, openElementEditDialog) {
-    state.openElementEditDialog = openElementEditDialog;
-  },
-  initState(state) {
-    state.curElement = {};
-    state.curDragElement = {};
-    state.curCopyElement = {};
-    state.curPage = {};
-    state.curPageNo = 0;
-    state.pages = [];
-    state.cardConfig = {};
-    state.openElementEditDialog = false;
-  },
-};
-
-const findElementById = (id, curPage) => {
-  let curElement = null;
-  let columnIndex = 0;
-  let elementIndex = 0;
-  curPage.columns.forEach((column, cindex) => {
-    column.elements.forEach((element, eindex) => {
-      if (curElement) return;
-      if (element.id === id) {
-        curElement = element;
-        columnIndex = cindex;
-        elementIndex = eindex;
-        return;
-      }
-    });
-  });
-  return { curElement, columnIndex, elementIndex };
-};
-
-const updateElementsZindex = (elements) => {
-  const maxZindex = elements.length + 9 - 1;
-  elements.forEach((element, index) => {
-    element.zindex = maxZindex - index;
-    element.key = randomCode();
-  });
-};
-
-const actions = {
-  addPage({ state }, page) {
-    state.pages.push(page);
-  },
-  modifyPage({ state, commit }, page) {
-    const pos = state.pages.findIndex((p) => p.id === page.id);
-    state.pages.splice(pos, 1, page);
-    commit("setCurPageNo", pos);
-  },
-  modifyAllPageShowForbidArea({ state, commit }, showForbidArea) {
-    state.pages.forEach((page) => {
-      page.showForbidArea = showForbidArea;
-    });
-    commit("setCurPageNo", state.curPageNo);
-  },
-  removePage({ state, commit }, page) {
-    const pos = state.pages.findIndex((p) => p.id === page.id);
-    state.pages.splice(pos, 1);
-    if (pos === state.curPageNo) commit("setCurPageNo", state.curPageNo);
-  },
-  actElementById({ state, commit }, id) {
-    const { curElement } = findElementById(id, state.curPage);
-    if (!curElement) return;
-
-    commit("setCurElement", curElement);
-  },
-  addElement({ state, commit }, { columnIndex, element }) {
-    // 层级大的放最前面,层级自增,即后创建的元素放前面
-    const elements = state.curPage.columns[columnIndex].elements;
-    elements.unshift(element);
-    updateElementsZindex(elements);
-    commit(
-      "setCurElement",
-      elements.find((elem) => elem.id === element.id)
-    );
-  },
-  modifyElement({ state, commit }, element) {
-    const { columnIndex, elementIndex } = findElementById(
-      element.id,
-      state.curPage
-    );
-    const elements = state.curPage.columns[columnIndex].elements;
-    elements.splice(elementIndex, 1, element);
-    commit("setCurElement", element);
-  },
-  removeElement({ state }, element) {
-    const { columnIndex, elementIndex } = findElementById(
-      element.id,
-      state.curPage
-    );
-    const elements = state.curPage.columns[columnIndex].elements;
-    elements.splice(elementIndex, 1);
-    updateElementsZindex(elements);
-  },
-  pasteElement({ state, dispatch }, { element, toColumnId }) {
-    const columnIndex = state.curPage.columns.findIndex(
-      (col) => col.id === toColumnId
-    );
-    dispatch("addElement", { columnIndex, element });
-  },
-  moveElementToElement(
-    { state, commit },
-    { curElement, toElementId, curColumnId, isDragDown }
-  ) {
-    const columnIndex = state.curPage.columns.findIndex(
-      (col) => col.id === curColumnId
-    );
-    const elements = state.curPage.columns[columnIndex].elements;
-    const curPos = elements.findIndex((elem) => elem.id === curElement.id);
-    elements.splice(curPos, 1);
-
-    const toPos = elements.findIndex((elem) => elem.id === toElementId);
-    const offset = isDragDown ? 1 : 0;
-    elements.splice(toPos + offset, 0, curElement);
-    // console.log(toPos);
-
-    updateElementsZindex(elements);
-    commit(
-      "setCurElement",
-      elements.find((elem) => elem.id === curElement.id)
-    );
-  },
-  moveElementZindex({ state, commit }, { curElement, pos }) {
-    let curColumn = null,
-      curElementPos = null;
-
-    state.curPage.columns.forEach((column) =>
-      column.elements.forEach((elem, eindex) => {
-        if (elem.id === curElement.id) {
-          curElementPos = eindex;
-          curColumn = column;
-        }
-      })
-    );
-
-    const elements = curColumn.elements;
-
-    if (
-      (curElementPos === elements.length - 1 && pos > 0) ||
-      (curElementPos === 0 && pos < 0)
-    )
-      return;
-
-    const toPos = curElementPos + pos;
-    elements.splice(curElementPos, 1);
-    elements.splice(toPos, 0, curElement);
-
-    updateElementsZindex(elements);
-    commit(
-      "setCurElement",
-      elements.find((elem) => elem.id === curElement.id)
-    );
-  },
-};
-
-export default {
-  namespaced: true,
-  state,
-  mutations,
-  actions,
-};

+ 1 - 1
src/modules/card/pageModel.js

@@ -51,7 +51,7 @@ const templateDict = {
       {
         type: "GUTTER",
         direction: "right",
-        x: 30,
+        x: 0,
         w: 30,
       },
     ],

+ 1 - 3
src/modules/card/store/index.js

@@ -1,7 +1,6 @@
 import Vue from "vue";
 import Vuex from "vuex";
 import card from "./card";
-import free from "../modules/free/store";
 
 Vue.use(Vuex);
 
@@ -11,8 +10,7 @@ export default new Vuex.Store({
   actions: {},
   modules: {
     card,
-    free,
   },
 });
 
-export { card, free };
+export { card };

+ 0 - 228
src/modules/card/views/CardFreeEdit.vue

@@ -1,228 +0,0 @@
-<template>
-  <div class="card-free-edit">
-    <card-free-design
-      v-if="dataReady"
-      ref="CardFreeDesign"
-      :content="cardContent"
-      @on-preview="toPreview"
-      @on-save="toSave"
-      @on-submit="toSubmit"
-      @on-exit="toExit"
-    ></card-free-design>
-    <!-- card-view-frame -->
-    <div v-if="cardPreviewUrl" class="design-preview-frame">
-      <iframe :src="cardPreviewUrl" frameborder="0"></iframe>
-    </div>
-  </div>
-</template>
-
-<script>
-import { cardConfigInfos, cardDetail, saveCard } from "../api";
-import CardFreeDesign from "../modules/free/components/CardFreeDesign";
-
-export default {
-  name: "CardFreeEdit",
-  components: {
-    CardFreeDesign,
-  },
-  data() {
-    return {
-      cardId: this.$route.params.cardId || this.$ls.get("cardId"),
-      prepareTcPCard: this.$ls.get("prepareTcPCard", {
-        examTaskId: "",
-        courseCode: "",
-        courseName: "",
-        makeMethod: "SELF",
-        cardRuleId: "",
-      }),
-      cardContent: {},
-      cardPreviewUrl: "",
-      isSubmit: false,
-      canSave: false,
-      dataReady: false,
-    };
-  },
-  computed: {
-    isEdit() {
-      return !!this.cardId;
-    },
-  },
-  mounted() {
-    // if (!this.prepareTcPCard.examTaskId && !this.isEdit) {
-    //   this.$message.error("找不到命题任务,请退出题卡制作!");
-    //   return;
-    // }
-    this.initCard();
-    this.registWindowSubmit();
-  },
-  beforeDestroy() {
-    this.$ls.remove("cardId");
-    this.$ls.remove("prepareTcPCard");
-    delete window.submitCardTemp;
-  },
-  methods: {
-    async initCard() {
-      this.dataReady = false;
-      if (this.isEdit) {
-        await this.getCardTempDetail();
-      } else {
-        const cardConfig = await this.getCardConfig();
-        this.cardContent = {
-          pages: [],
-          cardConfig,
-          paperParams: {},
-        };
-      }
-      this.dataReady = true;
-    },
-    getCardTitle(titleRule) {
-      const fieldMap = {
-        courseCode: this.prepareTcPCard.courseCode,
-        courseName: this.prepareTcPCard.courseName,
-        schoolName: this.prepareTcPCard.schoolName,
-      };
-      Object.entries(fieldMap).forEach(([key, val]) => {
-        titleRule = titleRule.replace("${" + key + "}", val);
-      });
-      return titleRule;
-    },
-    async getCardTempDetail() {
-      const detData = await cardDetail(this.cardId);
-
-      // 可能存在题卡内容没有记录的情况
-      if (detData.content) {
-        this.cardContent = JSON.parse(detData.content);
-      } else {
-        let cardConfig = await this.getCardConfig();
-        // 没有题卡内容时,直接创建新的内容
-        if (detData.makeMethod === "CUST") {
-          this.setCardConfig({ cardTitle: detData.title });
-        }
-
-        this.cardContent = {
-          pages: [],
-          cardConfig,
-          paperParams: {},
-        };
-      }
-    },
-    async getCardConfig() {
-      const data = await cardConfigInfos(this.prepareTcPCard.cardRuleId);
-      if (!data) {
-        this.$message.error("找不到题卡规则!");
-        return;
-      }
-      let config = {
-        ...data,
-        ...{
-          pageSize: "A3",
-          columnNumber: 2,
-          columnGap: 20,
-          showForbidArea: true,
-          cardDesc: "",
-          makeMethod: this.prepareTcPCard.makeMethod,
-        },
-      };
-      config.aOrB = true; // 默认开启A/B卷型
-      config.requiredFields = JSON.parse(config.requiredFields);
-      config.extendFields = JSON.parse(config.extendFields);
-      config.cardTitle = this.getCardTitle(config.titleRule);
-      return config;
-    },
-    // 操作
-    getRequestConfig() {
-      return this.prepareTcPCard.makeMethod === "CUST"
-        ? {
-            headers: {
-              schoolId: this.prepareTcPCard.schoolId,
-            },
-          }
-        : {};
-    },
-    getCardData(htmlContent = "", model = "") {
-      let data = this.$refs.CardFreeDesign.getCardData(htmlContent, model);
-      data = {
-        ...data,
-        type: "CUSTOM",
-        ...this.prepareTcPCard,
-      };
-      if (this.cardId) data.id = this.cardId;
-      return data;
-    },
-    async toPreview(datas) {
-      await this.toSave(datas);
-
-      const { href } = this.$router.resolve({
-        name: "CardFreePreview",
-        params: {
-          cardId: this.cardId,
-          viewType: "view",
-        },
-      });
-      window.open(href);
-    },
-    async toSave(datas) {
-      datas.status = "STAGE";
-      const result = await saveCard(datas, this.getRequestConfig()).catch(
-        () => {}
-      );
-
-      this.$refs.CardFreeDesign.unloading();
-      if (!result) return;
-
-      this.cardId = result;
-      this.$ls.set("cardId", this.cardId);
-      this.$message.success("保存成功!");
-    },
-    async toSubmit(cardData) {
-      const res = await this.$confirm("确定要提交当前题卡吗?", "提示", {
-        type: "warning",
-      }).catch(() => {});
-      if (res !== "confirm") return;
-
-      window.cardData = cardData;
-      const { href } = this.$router.resolve({
-        name: "CardFreePreview",
-        params: {
-          cardId: 1,
-          viewType: "frame",
-        },
-      });
-      this.cardPreviewUrl = href;
-    },
-    registWindowSubmit() {
-      window.submitCardTemp = async (htmlContent, model) => {
-        const datas = this.getCardData(htmlContent, model);
-        datas.status = "SUBMIT";
-        const result = await saveCard(datas, this.getRequestConfig()).catch(
-          () => {}
-        );
-        this.cardPreviewUrl = "";
-        window.cardData = null;
-        if (result) {
-          this.cardId = result;
-          this.$ls.set("cardId", this.cardId);
-          this.canSave = false;
-          this.$message.success("提交成功!");
-          this.goback();
-        } else {
-          this.$message.error("提交失败,请重新尝试!");
-        }
-      };
-    },
-    toExit() {
-      this.$confirm(
-        "请确保当前题卡已经正常保存,确定要退出当前题卡编辑吗?",
-        "提示",
-        {
-          type: "warning",
-        }
-      )
-        .then(() => {
-          this.goback();
-        })
-        .catch(() => {});
-    },
-  },
-};
-</script>

+ 0 - 119
src/modules/card/views/CardFreePreview.vue

@@ -1,119 +0,0 @@
-<template>
-  <div :class="classes">
-    <card-free-view
-      v-if="pages.length"
-      ref="CardFreeView"
-      class="preview-body"
-      :pages="pages"
-      :card-config="cardConfig"
-    ></card-free-view>
-  </div>
-</template>
-
-<script>
-import CardFreeView from "../modules/free/components/CardFreeView";
-import { cardDetail } from "../api";
-import { deepCopy } from "../plugins/utils";
-
-export default {
-  name: "CardFreePreview",
-  components: { CardFreeView },
-  data() {
-    return {
-      isPrint: this.$route.params.viewType !== "view",
-      isFrame: this.$route.params.viewType === "frame",
-      cardId: this.$route.params.cardId,
-      pages: [],
-      cardConfig: {},
-    };
-  },
-  computed: {
-    classes() {
-      return [
-        "card-free-preview",
-        {
-          "card-print": this.isPrint,
-        },
-      ];
-    },
-  },
-  mounted() {
-    if (this.isFrame) {
-      this.initFrame();
-    } else {
-      this.init();
-    }
-  },
-  methods: {
-    initFrame() {
-      const cardData = window.parent.cardData;
-      if (!cardData) return;
-
-      const { cardConfig, pages } = deepCopy(cardData);
-      let fieldInfos = {};
-      [...cardConfig.requiredFields, ...cardConfig.extendFields]
-        .filter((item) => item.enable)
-        .map((item) => {
-          fieldInfos[item.code] = "${" + item.code + "}";
-        });
-      this.cardConfig = cardConfig;
-      this.pages = this.appendFieldInfo(pages, fieldInfos);
-
-      this.$nextTick(() => {
-        const cardContentTemp = this.$refs.CardFreeView.getPreviewTemp(
-          this.$el.outerHTML
-        );
-        const model = this.$refs.CardFreeView.getPageModel(cardData);
-        window.parent &&
-          window.parent.submitCardTemp &&
-          window.parent.submitCardTemp(cardContentTemp, model);
-      });
-    },
-    async init() {
-      const detData = await cardDetail(this.cardId);
-      if (!detData.content) {
-        this.$message.error("很抱歉,当前题卡还没开始制作!");
-        return;
-      }
-      const { cardConfig, pages } = JSON.parse(detData.content);
-      const fieldInfos = this.fetchFieldInfos(cardConfig, {});
-
-      this.cardConfig = cardConfig;
-      this.pages = this.appendFieldInfo(pages, fieldInfos);
-    },
-    fetchFieldInfos(cardConfig, stdInfo) {
-      let fieldInfos = {};
-      const defContent = "相关信息";
-      [...cardConfig.requiredFields, ...cardConfig.extendFields]
-        .filter((item) => item.enable)
-        .map((item) => {
-          fieldInfos[item.code] = stdInfo[item.code] || defContent;
-        });
-
-      return fieldInfos;
-    },
-    getBase64Barcode(str) {
-      return str;
-    },
-    appendFieldInfo(pages, fieldInfos) {
-      const VALID_ELEMENTS_FOR_EXTERNAL = ["BARCODE", "FILL_FIELD"];
-      pages.forEach((page) => {
-        page.columns.forEach((column) => {
-          column.elements.forEach((element) => {
-            if (!VALID_ELEMENTS_FOR_EXTERNAL.includes(element.type)) return;
-
-            if (element.type === "BARCODE") {
-              const field = element.fields[0] && element.fields[0].code;
-              element.content = `data:image/png;base64,${fieldInfos[field]}`;
-              return;
-            }
-
-            element.fieldInfos = fieldInfos;
-          });
-        });
-      });
-      return pages;
-    },
-  },
-};
-</script>