zhangjie %!s(int64=5) %!d(string=hai) anos
pai
achega
4fea00655c

+ 85 - 0
src/assets/styles/card-design.scss

@@ -440,3 +440,88 @@
   z-index: 1001;
   visibility: hidden;
 }
+
+// card custom-select
+.custom-select {
+  width: 100%;
+  .select-preview {
+    height: 40px;
+    line-height: 36px;
+    border: 1px solid #e0e0e0;
+    border-radius: 5px;
+    position: relative;
+    overflow: hidden;
+    cursor: pointer;
+
+    &:hover {
+      border-color: #b0b0b0;
+    }
+
+    &-main {
+      padding: 0 30px 0 15px;
+    }
+    &-icon {
+      position: absolute;
+      top: 0;
+      right: 0;
+      width: 30px;
+      height: 100%;
+      background-color: #fff;
+      text-align: center;
+    }
+  }
+}
+
+// color-select
+.color-item {
+  display: inline-block;
+  vertical-align: middle;
+  width: 100px;
+  height: 26px;
+}
+.color-menu .el-dropdown-menu__item {
+  line-height: 30px;
+  padding: 0 15px;
+}
+// line-style-select
+.style-item {
+  display: inline-block;
+  vertical-align: middle;
+  width: 100px;
+  border-bottom-width: 2px;
+  border-bottom-color: #000;
+}
+.line-style-menu .el-dropdown-menu__item {
+  line-height: 24px;
+  padding: 0 10px;
+}
+// line-width-select
+.width-item {
+  display: inline-block;
+  vertical-align: middle;
+  width: 100px;
+  > i {
+    display: inline-block;
+    vertical-align: middle;
+    width: 65px;
+    border-bottom: 1pt solid #000;
+  }
+  > span {
+    display: block;
+    float: right;
+    line-height: 28px;
+    width: 40px;
+    margin-right: -10px;
+    text-align: center;
+  }
+}
+.line-width-menu .el-dropdown-menu__item {
+  line-height: 24px;
+  padding: 0 10px;
+}
+
+.edit-dialog {
+  .el-dialog__footer {
+    text-align: right;
+  }
+}

+ 8 - 9
src/modules/card/components/RightClickMenu.vue

@@ -27,6 +27,7 @@ export default {
     return {
       visible: false,
       styles: {
+        padding: "10px",
         position: "fixed",
         visibility: "hidden",
         zIndex: 3000
@@ -55,9 +56,7 @@ export default {
       document.addEventListener("mouseup", e => {
         if (e.button === 2) {
           this.visible = false;
-          this.$nextTick(() => {
-            this.rightClick(e);
-          });
+          this.rightClick(e);
         }
       });
     },
@@ -70,12 +69,12 @@ export default {
         top: e.y + "px",
         left: e.x - 50 + "px"
       });
-      // TODO:需要研究一下popover弹出的机制
-      // console.log(`x:${this.styles.left},y:${this.styles.top}`);
-
-      this.$nextTick(() => {
+      // 直接用了setTimeout,完美解决弹出框跟随延迟的问题,似乎粗暴了点。
+      setTimeout(() => {
         this.visible = true;
-      });
+      }, 100);
+      // this.$nextTick(() => {
+      // });
     },
     getRelateElementId(dom) {
       let parentNode = dom;
@@ -118,7 +117,7 @@ export default {
       } else {
         this.removeElement(this.curElement);
       }
-      // TODO: 解答题小题的删除要直接删除大题
+
       // 作文题是个坑爹的设计,删除子元件之后会影响主体题卡布局,解答题小题不会
       if (
         !this.curElement["container"] ||

+ 1 - 1
src/modules/card/components/elementEdit/CardHead.vue

@@ -10,7 +10,7 @@
           placeholder="请输入题卡名称"
           @blur="nameChange"
           v-model="cardName"
-          v-if="!preview"
+          v-if="!preview && !data.isSimple"
         >
         </el-input>
         <p v-else>{{ data.cardName }}</p>

+ 1 - 1
src/modules/card/components/elementPropEdit/EditExplain.vue

@@ -106,7 +106,7 @@ export default {
   },
   methods: {
     initData(val) {
-      this.modalForm = { ...val };
+      this.modalForm = { ...val.parent };
       this.modalForm.endNumber =
         this.modalForm.startNumber + this.modalForm.questionsCount - 1;
     },

+ 1 - 1
src/modules/card/components/elementPropEdit/EditImage.vue

@@ -31,7 +31,7 @@
           type="file"
           style="display:none;"
           @change="imageChange"
-          accept="image/jpg,image/png"
+          accept=".jpeg,.jpg,.png"
         />
       </el-form-item>
       <div style="text-align: center;">

+ 32 - 13
src/modules/card/store.js

@@ -51,12 +51,15 @@ const mutations = {
 };
 
 const fetchElementPositionInfos = (element, pages) => {
+  // 当为解答题时,element传入的值是EXPLAIN_PROP
   let postionInfos = [];
   for (let i = 0, ilen = pages.length; i < ilen; i++) {
     for (let j = 0, jlen = pages[i].columns.length; j < jlen; j++) {
       pages[i].columns[j].elements.forEach((item, eindex) => {
         const itemId =
-          item.type === "EXPLAIN" ? item.parent && item.parent.id : item.id;
+          item.type === "EXPLAIN_CHILDREN"
+            ? item.parent && item.parent.id
+            : item.id;
 
         if (itemId === element.id) {
           postionInfos.push({ _pageNo: i, _columnNo: j, _elementNo: eindex });
@@ -64,8 +67,8 @@ const fetchElementPositionInfos = (element, pages) => {
       });
     }
   }
-
-  return postionInfos;
+  // 反序获得的位置数组,方便批量删除操作。
+  return postionInfos.reverse();
 };
 
 const fetchFirstSubjectiveTopicPositionInfo = pages => {
@@ -122,10 +125,10 @@ const actions = {
         });
         // 创建新的解答题元素
         const newElements = getExplainChildren(element);
-        const pos = positionInfos[0];
-        newElements.forEach(newElement => {
+        const pos = positionInfos.pop();
+        newElements.forEach((newElement, index) => {
           state.pages[pos._pageNo].columns[pos._columnNo].elements.splice(
-            pos._elementNo,
+            pos._elementNo + index,
             0,
             newElement
           );
@@ -136,7 +139,7 @@ const actions = {
     } else {
       const positionInfos = fetchElementPositionInfos(element, state.pages);
       if (positionInfos.length) {
-        const pos = positionInfos[0];
+        const pos = positionInfos.pop();
         const elements =
           state.pages[pos._pageNo].columns[pos._columnNo].elements;
         elements.splice(pos._elementNo, 1, element);
@@ -170,12 +173,28 @@ const actions = {
     state.pages[0].columns[0].elements.splice(0, 1, element);
   },
   removeElement({ state, commit }, element) {
-    const positionInfos = fetchElementPositionInfos(element, state.pages);
-    if (!positionInfos.length) return;
-    positionInfos.forEach(pos => {
-      const elements = state.pages[pos._pageNo].columns[pos._columnNo].elements;
-      elements.splice(pos._elementNo, 1);
-    });
+    // 解答题时,删除所有小题。
+    if (element.type === "EXPLAIN_CHILDREN") {
+      const positionInfos = fetchElementPositionInfos(
+        element.parent,
+        state.pages
+      );
+      if (positionInfos.length) {
+        positionInfos.forEach(pos => {
+          const elems =
+            state.pages[pos._pageNo].columns[pos._columnNo].elements;
+          elems.splice(pos._elementNo, 1);
+        });
+      }
+    } else {
+      const positionInfos = fetchElementPositionInfos(element, state.pages);
+      if (!positionInfos.length) return;
+      positionInfos.forEach(pos => {
+        const elements =
+          state.pages[pos._pageNo].columns[pos._columnNo].elements;
+        elements.splice(pos._elementNo, 1);
+      });
+    }
 
     commit("setCurElement", {});
   },

+ 2 - 2
src/modules/login/views/Login.vue

@@ -51,8 +51,8 @@ export default {
   data() {
     return {
       loginModel: {
-        loginName: "sysadmin",
-        password: "123456"
+        loginName: "",
+        password: ""
       },
       loginRules: {
         loginName: [