zhangjie 2 jaren geleden
bovenliggende
commit
954cb4ecb2

+ 17 - 23
src/modules/paper-export/components/BoxElementEdit.vue

@@ -23,42 +23,36 @@
 
 <script>
 import { mapState, mapMutations } from "vuex";
-import { objAssign } from "../../../plugins/utils";
-import ElementResize from "../../../components/common/ElementResize";
-import TopicNumber from "../../../components/common/TopicNumber";
+import { objAssign } from "../../card/plugins/utils";
+import ElementResize from "../../card/components/common/ElementResize";
+import TopicNumber from "../../card/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";
+import EditText from "../../card/elements/text/ElemText";
+import EditImage from "../../card/elements/image/ElemImage";
+import EditLine from "../../card/elements/line/ElemLine";
+import EditLines from "../../card/elements/lines/ElemLines";
+import EditGrids from "../../card/elements/grids/ElemGrids";
+import EditPane from "../../card/elements/pane/ElemPane";
+import EditGutter from "../../card/elements/gutter/ElemGutter";
+import EditFillField from "../../card/elements/fill-field/ElemFillField";
+import EditFillTable from "../../card/elements/fill-table/ElemFillTable";
+import EditFillPane from "../../card/elements/fill-pane/ElemFillPane";
 
 export default {
   name: "TopicElementEdit",
   components: {
     ElementResize,
     TopicNumber,
-    EditFillQuestion,
-    EditFillLine,
-    EditFillNumber,
-    EditFillField,
-    EditFillTable,
-    EditFillPane,
     EditText,
     EditImage,
     EditLine,
     EditLines,
     EditGrids,
     EditPane,
-    EditBarcode,
+    EditGutter,
+    EditFillField,
+    EditFillTable,
+    EditFillPane,
   },
   props: {
     data: {

+ 78 - 0
src/modules/paper-export/components/BoxElementPreview.vue

@@ -0,0 +1,78 @@
+<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 PreviewText from "../../card/elements/text/ElemText";
+import PreviewImage from "../../card/elements/image/ElemImage";
+import PreviewLine from "../../card/elements/line/ElemLine";
+import PreviewLines from "../../card/elements/lines/ElemLines";
+import PreviewGrids from "../../card/elements/grids/ElemGrids";
+import PreviewPane from "../../card/elements/pane/ElemPane";
+import PreviewGutter from "../../card/elements/gutter/ElemGutter";
+import PreviewFillField from "../../card/elements/fill-field/ElemFillField";
+import PreviewFillTable from "../../card/elements/fill-table/ElemFillTable";
+import PreviewFillPane from "../../card/elements/fill-pane/ElemFillPane";
+
+export default {
+  name: "BoxElementPreview",
+  components: {
+    PreviewText,
+    PreviewImage,
+    PreviewLine,
+    PreviewLines,
+    PreviewGrids,
+    PreviewPane,
+    PreviewGutter,
+    PreviewFillField,
+    PreviewFillTable,
+    PreviewFillPane,
+  },
+  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>

+ 1 - 1
src/modules/paper-export/components/PaperTemplateDesign.vue

@@ -241,7 +241,7 @@ export default {
     addNewTopic(type) {
       let element = getElementModel(type);
       element.w = document.getElementById("topic-column").offsetWidth;
-      this.setCurElement(element);
+      this.addElement(element);
     },
     // 元件编辑
     dragstart(element) {

+ 1 - 0
src/modules/paper-export/components/RightClickMenu.vue

@@ -120,6 +120,7 @@ export default {
         );
         this.showDeleteChildBtn = positionInfos.length >= 2;
       }
+      // todo:
       this.show();
 
       this.$nextTick(() => {

+ 3 - 2
src/modules/paper-export/components/TopicElementEdit.vue

@@ -29,8 +29,9 @@ import { objAssign } from "../../card/plugins/utils";
 import { checkElementisCovered } from "../store/paper-export";
 
 import EditPaneBox from "../elements/pane-box/ElemPaneBoxEdit.vue";
-import ElementResize from "../../card/common/ElementResize";
-import TopicNumber from "./common/TopicNumber";
+
+import ElementResize from "../../card/components/common/ElementResize";
+import TopicNumber from "../../card/components/common/TopicNumber";
 
 export default {
   name: "TopicElementEdit",

+ 18 - 0
src/modules/paper-export/elementModel.js

@@ -4,8 +4,11 @@ import { getModel as createLine } from "../card/elements/line/model";
 import { getModel as createText } from "../card/elements/text/model";
 import { getModel as createImage } from "../card/elements/image/model";
 import { getModel as createGrids } from "../card/elements/grids/model";
+import { getModel as createPane } from "../card/elements/pane/model";
 import { getModel as createGutter } from "../card/elements/gutter/model";
 import { getModel as createFillField } from "../card/elements/fill-field/model";
+import { getModel as createFillTable } from "../card/elements/fill-table/model";
+import { getModel as createFillPane } from "../card/elements/fill-pane/model";
 import { getModel as createPaneBox } from "./elements/pane-box/model";
 
 // available infos
@@ -16,8 +19,11 @@ const EDITABLE_ELEMENT = [
   "TEXT",
   "IMAGE",
   "GRIDS",
+  "PANE",
   "GUTTER",
   "FILL_FIELD",
+  "FILL_TABLE",
+  "FILL_PANE",
 ];
 
 const ELEMENT_INFOS = {
@@ -45,6 +51,10 @@ const ELEMENT_INFOS = {
     name: "网格",
     getModel: createGrids,
   },
+  PANE: {
+    name: "方框",
+    getModel: createPane,
+  },
   GUTTER: {
     name: "装订线",
     getModel: createGutter,
@@ -53,6 +63,14 @@ const ELEMENT_INFOS = {
     name: "填词块",
     getModel: createFillField,
   },
+  FILL_TABLE: {
+    name: "表格",
+    getModel: createFillTable,
+  },
+  FILL_PANE: {
+    name: "方格组",
+    getModel: createFillPane,
+  },
   PANE_BOX: {
     name: "编辑框",
     getModel: createPaneBox,

+ 1 - 0
src/modules/paper-export/elements/pane-box/ElemPaneBoxEdit.vue

@@ -11,6 +11,7 @@
         <box-element-edit
           v-for="element in data.elements"
           :key="element.id"
+          class="elem-pane-box-element"
           :data="element"
           :transform-fit="rebuildGuides"
           @resize-over="elementResizeOver"

+ 0 - 138
src/modules/paper-export/elements/text/EditText.vue

@@ -1,138 +0,0 @@
-<template>
-  <div class="edit-text">
-    <el-form
-      ref="modalFormComp"
-      :key="modalForm.id"
-      :model="modalForm"
-      :rules="rules"
-      label-width="100px"
-    >
-      <el-form-item label="字号:">
-        <size-select
-          v-model="modalForm.fontSize"
-          style="width: 100%"
-        ></size-select>
-      </el-form-item>
-      <el-form-item label="字体:">
-        <font-family-select
-          v-model="modalForm.fontFamily"
-          style="width: 100%"
-        ></font-family-select>
-      </el-form-item>
-      <el-form-item label="颜色:">
-        <color-select v-model="modalForm.color"></color-select>
-      </el-form-item>
-      <el-form-item label="加粗:">
-        <el-checkbox v-model="isBold" @change="boldChange"
-          >是否加粗</el-checkbox
-        >
-      </el-form-item>
-      <el-form-item prop="contentStr" label="内容:">
-        <el-input
-          ref="contentTextarea"
-          v-model="modalForm.contentStr"
-          type="textarea"
-          :rows="4"
-          placeholder="请输入内容"
-          @change="contentChange"
-        >
-        </el-input>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script>
-import SizeSelect from "../../components/common/SizeSelect";
-import ColorSelect from "../../components/common/ColorSelect";
-import FontFamilySelect from "../../components/common/FontFamilySelect";
-
-const initModalForm = {
-  id: "",
-  fontSize: "14px",
-  color: "",
-  fontFamily: "",
-  fontWeight: 400,
-  rotation: 0,
-  content: [],
-  contentStr: "",
-};
-
-export default {
-  name: "EditText",
-  components: {
-    SizeSelect,
-    ColorSelect,
-    FontFamilySelect,
-  },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalForm: { ...initModalForm },
-      isBold: false,
-      rules: {
-        contentStr: [
-          {
-            required: true,
-            message: "请输入文本内容",
-            trigger: "change",
-          },
-        ],
-      },
-    };
-  },
-  mounted() {
-    this.initData(this.instance);
-  },
-  methods: {
-    initData(val) {
-      const contentStr = val.content
-        .map((item) => {
-          return item.type === "text"
-            ? item.content
-            : "${" + item.content + "}";
-        })
-        .join("");
-      this.modalForm = { ...val, contentStr };
-      this.isBold = val.fontWeight > 400;
-    },
-    boldChange(isBold) {
-      this.modalForm.fontWeight = isBold ? 700 : 400;
-    },
-    contentChange() {
-      const constentStr = this.modalForm.contentStr;
-      const rexp = new RegExp(/\$\{.+?\}/, "g");
-      const variates = constentStr.match(rexp);
-      const texts = constentStr.split(rexp);
-      let contents = [];
-
-      texts.forEach((text, index) => {
-        if (text)
-          contents.push({
-            type: "text",
-            content: text,
-          });
-
-        if (variates && variates[index])
-          contents.push({
-            type: "variate",
-            content: variates[index].replace("${", "").replace("}", ""),
-          });
-      });
-      this.modalForm.content = contents;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-      this.$emit("modified", this.modalForm);
-    },
-  },
-};
-</script>

+ 0 - 37
src/modules/paper-export/elements/text/ElemText.vue

@@ -1,37 +0,0 @@
-<template>
-  <div class="elem-text">
-    <div class="text-body" :style="styles">
-      <span
-        v-for="(cont, index) in data.content"
-        :key="index"
-        :class="`cont-${cont.type}`"
-        >{{ cont.content }}</span
-      >
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  name: "ElemText",
-  props: {
-    data: {
-      type: Object,
-    },
-  },
-  data() {
-    return {};
-  },
-  computed: {
-    styles() {
-      return {
-        fontWeight: this.data.fontWeight,
-        fontFamily: this.data.fontFamily,
-        fontSize: this.data.fontSize,
-        color: this.data.color,
-      };
-    },
-  },
-  methods: {},
-};
-</script>

+ 0 - 30
src/modules/paper-export/elements/text/model.js

@@ -1,30 +0,0 @@
-import { getElementId, randomCode, deepCopy } from "../../plugins/utils";
-
-const MODEL = {
-  type: "TEXT",
-  x: 0,
-  y: 0,
-  w: 200,
-  h: 50,
-  sign: "",
-  fontWeight: 400,
-  fontFamily: "宋体",
-  fontSize: "14px",
-  color: "#000",
-  content: [
-    {
-      type: "text",
-      content: "样例内容",
-    },
-  ],
-};
-
-const getModel = () => {
-  return {
-    id: getElementId(),
-    key: randomCode(),
-    ...deepCopy(MODEL),
-  };
-};
-
-export { MODEL, getModel };

+ 25 - 255
src/modules/paper-export/store/paper-export.js

@@ -1,9 +1,7 @@
-import { getNewPage } from "../elementModel";
 import {
-  deepCopy,
+  // deepCopy,
   calcSum,
   getElementId,
-  numberIsOdd,
   objAssign,
 } from "../../card/plugins/utils";
 
@@ -66,32 +64,15 @@ const fetchElementPositionInfos = (element, topics) => {
   return topics.findIndex((item) => item.id === element.id);
 };
 
-const fetchAllRelateParentElementPositionInfos = (parentElement, topics) => {
-  let postionInfos = [];
-  topics.forEach((item, eindex) => {
-    if (item["parent"] && item.parent.id === parentElement.id) {
-      let pos = { _elementNo: eindex };
-      postionInfos.push(pos);
-    }
-  });
-
-  return postionInfos;
-};
-
 const fetchSameSerialNumberChildrenPositionInfo = (
   elementChildernElement,
   topics
 ) => {
   let postionInfos = [];
   const elementId = elementChildernElement.parent.id;
-  const serialNumber = elementChildernElement.serialNumber;
 
   topics.forEach((item, eindex) => {
-    if (
-      item.parent &&
-      item.parent.id === elementId &&
-      item.serialNumber === serialNumber
-    ) {
+    if (item.parent && item.parent.id === elementId) {
       postionInfos.push({
         _elementNo: eindex,
         _elementId: item.id,
@@ -101,18 +82,6 @@ const fetchSameSerialNumberChildrenPositionInfo = (
   return postionInfos;
 };
 
-const groupByParams = (datas, paramKey) => {
-  let elementGroupInfos = [];
-  for (let i = 0, len = datas.length; i < len; i++) {
-    if (i === 0 || datas[i][paramKey] !== datas[i - 1][paramKey]) {
-      elementGroupInfos.push([datas[i]]);
-    } else {
-      elementGroupInfos[elementGroupInfos.length - 1].push(datas[i]);
-    }
-  }
-  return elementGroupInfos;
-};
-
 const findElementById = (id, topics) => {
   let curElement = null;
   topics.forEach((element) => {
@@ -134,35 +103,15 @@ const findElementById = (id, topics) => {
 const checkElementisCovered = (id, type) => {
   const elementDom = document.getElementById(id);
 
-  if (type === "EXPLAIN") {
-    const elemTitleDome = elementDom.querySelector(".elem-title");
-    const limitHeight = elemTitleDome
-      ? elementDom.offsetHeight - elemTitleDome.offsetHeight
-      : elementDom.offsetHeight;
+  if (type === "PANE_BOX") {
+    const limitHeight = elementDom.offsetHeight;
 
     let elementHeights = [];
     elementDom
-      .querySelector(".elem-explain-elements")
+      .querySelector(".elem-pane-box-elements")
       .childNodes.forEach((node) => {
-        if (!node.className.includes("elem-explain-element")) return;
-        elementHeights.push(
-          node.firstChild.offsetHeight + node.firstChild.offsetTop
-        );
-      });
-    return elementHeights.some((item) => item > limitHeight);
-  }
-
-  if (type === "COMPOSITION") {
-    const elemTitleDome = elementDom.querySelector(".elem-title");
-    const limitHeight = elemTitleDome
-      ? elementDom.offsetHeight - elemTitleDome.offsetHeight
-      : elementDom.offsetHeight;
+        if (!node.className.includes("elem-pane-box-element")) return;
 
-    let elementHeights = [];
-    elementDom
-      .querySelector(".elem-composition-elements")
-      .childNodes.forEach((node) => {
-        if (!node.className.includes("elem-composition-element")) return;
         elementHeights.push(
           node.firstChild.offsetHeight + node.firstChild.offsetTop
         );
@@ -179,11 +128,6 @@ const actions = {
     state.pages.forEach((page) => {
       page.columns.forEach((column) => {
         column.elements.forEach((element) => {
-          if (
-            element.type === "TOPIC_HEAD" ||
-            (element.type === "CARD_HEAD" && element.isSimple)
-          )
-            return;
           topics.push(element);
         });
       });
@@ -202,44 +146,9 @@ const actions = {
 
     commit("setCurElement", curElement);
   },
-  resetTopicSeries({ state, commit }) {
-    let curTopicId = "",
-      curTopicNo = 0,
-      topicSeries = [];
-    state.topics.forEach((topic) => {
-      if (!topic.parent) return;
-      if (curTopicId !== topic.parent.id) {
-        curTopicId = topic.parent.id;
-        curTopicNo++;
-        topicSeries.push({
-          id: curTopicId,
-          topicNo: curTopicNo,
-          type: topic.type,
-          sign: topic.sign,
-        });
-      }
-      topic.topicNo = curTopicNo;
-    });
-    commit("setTopicSeries", topicSeries);
-  },
   // 新增试题 --------------->
   addElement({ state, commit }, element) {
-    let pos = null;
-
-    if (state.insetTarget.id) {
-      //
-    } else {
-      //
-    }
-
-    let preElements = [];
-    preElements.forEach((preElement, index) => {
-      if (pos && pos !== -1) {
-        state.topics.splice(pos + index, 0, preElement);
-      } else {
-        state.topics.push(preElement);
-      }
-    });
+    state.topics.push(element);
     commit("setCurElement", element);
   },
   addSideElement({ state, commit }, element) {
@@ -248,34 +157,10 @@ const actions = {
     commit("setCurElement", element);
   },
   // 修改试题 --------------->
-  modifyTopic({ state }, element) {
-    // 单独编辑某个细分题
+  modifyElement({ state }, element) {
     const pos = fetchElementPositionInfos(element, state.topics);
     state.topics.splice(pos, 1, element);
   },
-  modifyExplain({ state }, element) {
-    // 解答题既是拆分题,又是可复制题
-    const positionInfos = fetchAllRelateParentElementPositionInfos(
-      element,
-      state.topics
-    );
-    const elementGroupPosInfos = groupByParams(positionInfos, "serialNumber");
-    for (let i = 0; i < elementGroupPosInfos.length; i++) {
-      elementGroupPosInfos[i].forEach((pos) => {
-        let child = state.topics[pos._elementNo];
-        child.parent = { ...element };
-        child.topicName = element.topicName;
-      });
-    }
-  },
-  modifyElement({ dispatch }, element) {
-    if (element.type === "EXPLAIN") {
-      dispatch("modifyExplain", element);
-    } else {
-      dispatch("modifySplitTopic", element);
-    }
-    // commit("setCurElement", element);
-  },
   // 修改试题包含元素
   modifyElementChild({ state, commit }, element) {
     // 修改解答题小题
@@ -294,7 +179,7 @@ const actions = {
     commit("setCurElement", element);
   },
   // 粘贴试题内的元素
-  pasteExplainElementChild({ state }, { curElement, pasteElement }) {
+  pasteElementChild({ state }, { curElement, pasteElement }) {
     let element = {
       id: curElement.container ? curElement.container.id : curElement.id,
     };
@@ -313,19 +198,13 @@ const actions = {
   },
   // 删除试题 --------------->
   removeElement({ state, commit }, element) {
-    const positionInfos = fetchAllRelateParentElementPositionInfos(
-      element.parent,
-      state.topics
-    );
-    positionInfos.reverse().forEach((pos) => {
-      state.topics.splice(pos._elementNo, 1);
-    });
+    const pos = fetchElementPositionInfos(element, state.topics);
+    state.topics.splice(pos, 1);
 
     commit("setCurElement", {});
   },
   // 删除试题包含元素 --------------->
   removeElementChild({ state, commit }, element) {
-    // 删除解答题小题
     const pos = fetchElementPositionInfos(element.container, state.topics);
     const columnElements = state.topics[pos].elements;
     const childIndex = columnElements.findIndex(
@@ -335,91 +214,6 @@ const actions = {
 
     commit("setCurElement", {});
   },
-  // 扩展答题区操作 --------------->
-  copyExplainChildren({ state }, element) {
-    let curElement = {
-      id: element.container ? element.container.id : element.id,
-    };
-    const pos = fetchElementPositionInfos(curElement, state.topics);
-    curElement = state.topics[pos];
-
-    let newElement = Object.assign({}, curElement, {
-      id: getElementId(),
-      elements: [],
-      h: 200,
-      isExtend: true,
-      showTitle: false,
-    });
-
-    state.topics.splice(pos + 1, 0, newElement);
-    // 更新小题答题区isLast
-    let positionInfos = fetchSameSerialNumberChildrenPositionInfo(
-      curElement,
-      state.topics
-    );
-    positionInfos.forEach((pos, pindex) => {
-      state.topics[pos._elementNo].isLast = pindex + 1 === positionInfos.length;
-    });
-  },
-  deleteExplainChildren({ state }, element) {
-    let curElement = {
-      id: element.container ? element.container.id : element.id,
-    };
-    const curPos = fetchElementPositionInfos(curElement, state.topics);
-    curElement = state.topics[curPos];
-
-    let positionInfos = fetchSameSerialNumberChildrenPositionInfo(
-      curElement,
-      state.topics
-    );
-    if (positionInfos.length < 2) return;
-    const pindex = positionInfos.findIndex(
-      (item) => item._elementId === curElement.id
-    );
-    const pos = positionInfos[pindex]._elementNo;
-    positionInfos.splice(pindex, 1);
-    const nextPos = positionInfos[0]._elementNo;
-    // 当删除的是非扩展区域时,则下一个答题区要被设置成非扩展区
-    if (!curElement.isExtend) {
-      state.topics[nextPos].isExtend = false;
-    }
-    // 当删除的是含有标题答题区时,则需要将下一个答题区开启显示标题。
-    if (curElement.showTitle) {
-      state.topics[nextPos].showTitle = true;
-    }
-    state.topics.splice(pos, 1);
-    // 更新小题答题区isLast
-    positionInfos = fetchSameSerialNumberChildrenPositionInfo(
-      curElement,
-      state.topics
-    );
-    positionInfos.forEach((pos, pindex) => {
-      state.topics[pos._elementNo].isLast = pindex + 1 === positionInfos.length;
-    });
-  },
-  // 大题顺序操作 --------------->
-  topicMoveUp({ state, dispatch }, topicId) {
-    const curTopicPos = state.topicSeries.findIndex(
-      (item) => item.id === topicId
-    );
-    const prevTopicId = state.topicSeries[curTopicPos - 1].id;
-    let relateTopicPos = [];
-    state.topics.forEach((item, index) => {
-      if (item.parent && item.parent.id === topicId) relateTopicPos.push(index);
-    });
-    const prevTopicFirstIndex = state.topics.findIndex(
-      (item) => item.parent && item.parent.id === prevTopicId
-    );
-    const relateTopics = state.topics.splice(
-      relateTopicPos[0],
-      relateTopicPos.length
-    );
-    relateTopics.reverse().forEach((topic) => {
-      state.topics.splice(prevTopicFirstIndex, 0, topic);
-    });
-
-    dispatch("resetTopicSeries");
-  },
   // 重构页面
   resetElementProp({ state }, isResetId = false) {
     state.topics.forEach((element) => {
@@ -434,8 +228,8 @@ const actions = {
     });
   },
   rebuildPages({ state, commit }) {
-    const columnNumber = state.cardConfig.columnNumber;
-    const pageSize = state.cardConfig.pageSize;
+    const pageInfo = state.pages[0];
+    const { columnNumber } = pageInfo;
     // 更新元件最新的高度信息
     // 整理所有元件
     state.topics.forEach((element) => {
@@ -444,19 +238,16 @@ const actions = {
       if (elementDom) {
         element.h = elementDom.offsetHeight;
         element.w = elementDom.offsetWidth;
-        // 解答题小题与其他题有些区别。
-        // 其他题都是通过内部子元素自动撑高元件,而解答题则需要手动设置高度。
-        const ESCAPE_ELEMENTS = ["CARD_HEAD"];
-        element.isCovered =
-          !ESCAPE_ELEMENTS.includes(element.type) &&
-          checkElementisCovered(`preview-${element.id}`, element.type);
+        // 编辑框需要手动设置高度。
+        element.isCovered = checkElementisCovered(
+          `preview-${element.id}`,
+          element.type
+        );
       }
     });
 
     // 动态计算每列可以分配的元件
     const columnHeight = document.getElementById("topic-column").offsetHeight;
-    let pages = [];
-    let page = {};
     let columns = [];
     let curColumnElements = [];
     let curColumnHeight = 0;
@@ -468,8 +259,6 @@ const actions = {
 
     // 放入元素通用流程
     const pushElement = (element) => {
-      // 当前栏中第一个题型之前新增题型头元素(topic-head)。
-      // 题型头和当前题要组合加入栏中,不可拆分。
       let elementList = [element];
 
       const elementHeight = calcSum(elementList.map((elem) => elem.h));
@@ -493,39 +282,20 @@ const actions = {
 
     // 批量添加所有元素。
     initCurColumnElements();
-    state.topics.forEach((element, eindex) => {
-      element.elementSerialNo = eindex;
+    state.topics.forEach((element) => {
       pushElement(element);
     });
 
     // 最后一栏的处理。
     columns.push([...curColumnElements]);
-    // 构建pages
-    columns.forEach((column, cindex) => {
-      const columnNo = cindex % columnNumber;
-      if (!columnNo) {
-        page = getNewPage(pages.length, { pageSize, columnNumber });
-      }
-      page.columns[columnNo].elements = column;
-
-      if (columnNo + 1 === columnNumber || cindex === columns.length - 1) {
-        pages.push(page);
-      }
-    });
-    // 保证页面总是偶数页
-    if (numberIsOdd(pages.length)) {
-      pages.push(getNewPage(pages.length, { pageSize, columnNumber }));
+    // 更新pages,只能有两页
+    columns = columns.slice(0, 2 * columnNumber);
+    for (let i = 0; i < 2 * columnNumber; i++) {
+      const pageNo = Math.floor(i / columnNumber);
+      const columnNo = i % columnNumber;
+      state.pages[pageNo].columns[columnNo].elements = columns[i] || [];
     }
 
-    pages.forEach((page, pindex) => {
-      if (numberIsOdd(pindex + 1)) {
-        page.sides = deepCopy(state.pageDefaultElems.sideLeft);
-      } else {
-        page.sides = deepCopy(state.pageDefaultElems.sideRight);
-      }
-    });
-
-    commit("setPages", pages);
     commit("setCurPage", state.curPageNo);
   },
 };