zhangjie 4 年 前
コミット
490ef4f048

+ 14 - 5
card/assets/styles/card-preview.scss

@@ -364,6 +364,8 @@
     font-size: 24px;
     font-family: "楷体";
     font-weight: bold;
+    overflow: hidden;
+
     .el-input__inner {
       font-size: 24px;
       font-family: "楷体";
@@ -373,6 +375,7 @@
     }
     > h1 {
       line-height: 33px;
+      white-space: nowrap;
     }
   }
   &-subtitle {
@@ -985,13 +988,19 @@
   position: relative;
   > p {
     position: absolute;
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    display: table;
+    text-align: center;
     color: #b0b0b0;
     font-size: 30pt;
-    text-align: center;
-    left: 0;
-    width: 100%;
-    top: 50%;
-    transform: translateY(-50%);
+
+    i {
+      display: table-cell;
+      vertical-align: middle;
+    }
   }
   > img {
     max-height: 100%;

+ 8 - 5
card/elements/composition/ElemCompositionEdit.vue

@@ -84,12 +84,15 @@ export default {
       });
     },
     dropInnerElement(e) {
-      let { layerX: x, layerY: y } = e;
+      let { offsetX: x, offsetY: y } = e;
+      const { offsetLeft, offsetTop } = this.getOffsetInfo(
+        e.target || e.srcElement
+      );
       // 作文题的子元素中会新增container字段
       const curElement = {
         ...this.curDragElement,
-        x,
-        y,
+        x: x + offsetLeft,
+        y: y + offsetTop,
         container: {
           id: this.data.id,
           type: this.data.type
@@ -103,11 +106,11 @@ export default {
       this.setCurDragElement({});
       this.setCurElement(curElement);
     },
-    getOffsetInfo(dom, endParent = "elem-composition-elements") {
+    getOffsetInfo(dom, endParentClass = "elem-composition-elements") {
       let parentNode = dom;
       let offsetTop = 0,
         offsetLeft = 0;
-      while (!parentNode.className.includes(endParent)) {
+      while (!parentNode.className.includes(endParentClass)) {
         offsetTop += parentNode.offsetTop;
         offsetLeft += parentNode.offsetLeft;
         parentNode = parentNode.offsetParent;

+ 6 - 4
card/elements/explain/ElemExplainEdit.vue

@@ -91,8 +91,10 @@ export default {
       });
     },
     dropInnerElement(e) {
-      let { layerX: x, layerY: y } = e;
-      const { offsetLeft, offsetTop } = this.getOffsetInfo(e.target);
+      let { offsetX: x, offsetY: y } = e;
+      const { offsetLeft, offsetTop } = this.getOffsetInfo(
+        e.target || e.srcElement
+      );
       // 解答题的子元素中会新增container字段
       const curElement = {
         ...this.curDragElement,
@@ -107,11 +109,11 @@ export default {
       this.setCurDragElement({});
       this.setCurElement(curElement);
     },
-    getOffsetInfo(dom, endParent = "elem-explain-elements") {
+    getOffsetInfo(dom, endParentClass = "elem-explain-elements") {
       let parentNode = dom;
       let offsetTop = 0,
         offsetLeft = 0;
-      while (!parentNode.className.includes(endParent)) {
+      while (!parentNode.className.includes(endParentClass)) {
         offsetTop += parentNode.offsetTop;
         offsetLeft += parentNode.offsetLeft;
         parentNode = parentNode.offsetParent;

ファイルの差分が大きいため隠しています
+ 0 - 0
card/previewTemp.js


+ 1 - 0
card/store/card.js

@@ -348,6 +348,7 @@ const actions = {
     const pos = fetchElementPositionInfos(element.container, state.topics);
     const columnElements = state.topics[pos].elements;
     const childIndex = columnElements.findIndex(item => item.id === element.id);
+    element.id = getElementId();
     if (childIndex === -1) {
       columnElements.push(element);
     } else {

+ 29 - 20
card/views/CardDesign.vue

@@ -22,17 +22,19 @@
           <div class="control-right">
             <el-button
               class="btn-white"
-              @click="toPreview"
+              :loading="isSubmit"
               :disabled="!pages.length"
+              @click="toPreview"
               >预览</el-button
             >
             <el-button
               type="primary"
-              @click="toSave"
+              :loading="isSubmit"
               :disabled="canSave || !pages.length"
+              @click="toSave"
               >暂存</el-button
             >
-            <el-button type="primary" @click="toSubmit" :loading="isSubmit"
+            <el-button type="primary" :loading="isSubmit" @click="toSubmit"
               >提交</el-button
             >
           </div>
@@ -460,12 +462,10 @@ export default {
     },
     // 操作
     async toPreview() {
-      // this.$ls.set("cardData", {
-      //   cardConfig: this.cardConfig,
-      //   pages: this.pages,
-      //   paperParams: this.paperParams
-      // });
-      const result = await this.save();
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const result = await this.save().catch(() => {});
+      this.isSubmit = false;
       if (!result) return;
       const { href } = this.$router.resolve({
         name: "CardPreview",
@@ -547,19 +547,25 @@ export default {
       return true;
     },
     getModel() {
-      return JSON.stringify(
-        {
-          version: CARD_VERSION,
-          cardConfig: this.cardConfig,
-          paperParams: this.paperParams,
-          pages: this.pages
-        },
-        (k, v) => (k.startsWith("_") ? undefined : v)
-      );
+      return new Promise((resolve, reject) => {
+        setTimeout(() => {
+          const data = JSON.stringify(
+            {
+              version: CARD_VERSION,
+              cardConfig: this.cardConfig,
+              paperParams: this.paperParams,
+              pages: this.pages
+            },
+            (k, v) => (k.startsWith("_") ? undefined : v)
+          );
+          resolve(data);
+        }, 100);
+      });
     },
     async save() {
       if (!this.checkCardValid()) return;
-      let datas = this.getCardData("", this.getModel());
+      const model = await this.getModel();
+      let datas = this.getCardData("", model);
       datas.status = "STAGE";
       const result = await saveCard(datas, this.getRequestConfig());
       this.cardId = result;
@@ -567,7 +573,10 @@ export default {
       return true;
     },
     async toSave() {
-      const result = await this.save();
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const result = await this.save().catch(() => {});
+      this.isSubmit = false;
       if (result) this.$message.success("保存成功!");
     },
     toSubmit() {

+ 1 - 1
src/constants/enumerate.js

@@ -64,7 +64,7 @@ export const CONFIRM_PRINT_TYPE = {
 };
 
 // 命题 -------------->
-// 办任务警告时间
+// 办任务警告时间
 export const TASK_WARNING_TIME = 3 * 24 * 60 * 60 * 1000;
 
 // 题卡

+ 6 - 2
src/modules/base/components/ModifyField.vue

@@ -59,8 +59,12 @@ export default {
         name: [
           {
             required: true,
-            pattern: /^[\u4E00-\u9FA5]{1,10}$/,
-            message: "字段名称只能输入汉字,长度不能超过10",
+            message: "请输入字段名称",
+            trigger: "change"
+          },
+          {
+            max: 20,
+            message: "字段名称不能超过20",
             trigger: "change"
           }
         ],

+ 11 - 5
src/modules/base/components/ModifyUser.vue

@@ -50,7 +50,7 @@
             @change="rolesChange"
           >
             <el-option
-              v-for="item in roles"
+              v-for="item in roleList"
               :key="item.id"
               :value="item.id"
               :label="item.name"
@@ -79,7 +79,7 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item prop="orgId" label="所属学院:">
+        <el-form-item prop="orgId" label="所属学院:" v-if="!IS_SUPER_ADMIN">
           <select-orgs
             ref="SelectOrgs"
             v-model="modalForm.orgId"
@@ -159,8 +159,6 @@ export default {
       }
     };
     const orgIdValidator = (rule, value, callback) => {
-      if (this.IS_SUPER_ADMIN) return callback();
-
       if (!value || !value.length) {
         callback(new Error("请选择所属学院"));
       } else {
@@ -217,7 +215,7 @@ export default {
         ],
         orgId: [
           {
-            required: !IS_SUPER_ADMIN,
+            required: true,
             validator: orgIdValidator,
             trigger: "change"
           }
@@ -225,6 +223,7 @@ export default {
       },
       user: {},
       courses: [],
+      roleList: [],
       roleTypes: [],
       IS_SUPER_ADMIN
     };
@@ -234,6 +233,7 @@ export default {
   },
   methods: {
     initData(val) {
+      this.roleList = this.getRoleList();
       if (val.id) {
         this.modalForm = this.$objAssign(initModalForm, val);
         this.modalForm.roleIds = val.roles.map(item => item.id);
@@ -244,6 +244,12 @@ export default {
         this.modalForm = { ...initModalForm };
       }
     },
+    getRoleList() {
+      if (this.IS_SUPER_ADMIN)
+        return this.roles.filter(item => item.type === "SCHOOL_ADMIN");
+
+      return this.roles.filter(item => item.type !== "SCHOOL_ADMIN");
+    },
     visibleChange() {
       this.initData(this.instance);
     },

+ 7 - 4
src/modules/exam/components/ModifyTaskApply.vue

@@ -60,7 +60,8 @@
               <el-button
                 v-if="
                   instance.auditStatus === 'NOT_AUDITED' &&
-                    instance.status === 'SUBMIT'
+                    instance.status === 'SUBMIT' &&
+                    IS_QUESTION_TEACHER
                 "
                 type="text"
                 class="btn-table-icon ml-2"
@@ -99,9 +100,8 @@
         >{{ item.name }}</el-button
       >
     </div>
-    <div class="part-box part-box-pad part-box-border">
+    <div class="part-box part-box-pad part-box-border" v-if="modalIsShow">
       <apply-content
-        v-if="modalIsShow"
         v-show="curMenu.id === '1'"
         ref="ApplyContent"
         :exam-task="modalForm"
@@ -236,7 +236,10 @@ export default {
         { id: "1", name: "命题处理", component: "apply-content" },
         { id: "2", name: "审核意见", component: "apply-audit-history" }
       ],
-      curMenu: {}
+      curMenu: {},
+      IS_QUESTION_TEACHER: this.$ls
+        .get("user", { roleList: [] })
+        .roleList.includes("QUESTION_TEACHER")
     };
   },
   created() {

+ 2 - 5
src/modules/exam/components/WaitTaskAudit.vue

@@ -2,7 +2,7 @@
   <div class="wait-task-audit part-box part-box-pad part-box-border">
     <div class="task-head part-box part-box-flex">
       <h3>
-        审核办(<span class="color-danger">{{ total }}</span
+        审核办(<span class="color-danger">{{ total }}</span
         >)
       </h3>
       <div>
@@ -35,10 +35,7 @@
           <el-tag :type="task.residueTips.status" effect="dark">
             {{ task.residueTips.title }}
           </el-tag>
-          <span
-            v-if="task.endTime > task.systemCurrentTime"
-            class="task-action"
-            @click="toDo(task)"
+          <span class="task-action" @click="toDo(task)"
             >立即处理 <i class="el-icon-arrow-right"></i
           ></span>
         </div>

+ 2 - 5
src/modules/exam/components/WaitTaskExam.vue

@@ -2,7 +2,7 @@
   <div class="wait-task-exam part-box part-box-pad part-box-border">
     <div class="task-head part-box part-box-flex">
       <h3>
-        命题分配办(<span class="color-danger">{{ total }}</span
+        命题分配办(<span class="color-danger">{{ total }}</span
         >)
       </h3>
       <div>
@@ -27,10 +27,7 @@
           <el-tag :type="task.residueTips.status" effect="dark">
             {{ task.residueTips.title }}
           </el-tag>
-          <span
-            v-if="task.endTime > task.systemCurrentTime"
-            class="task-action"
-            @click="toDo(task)"
+          <span class="task-action" @click="toDo(task)"
             >立即处理 <i class="el-icon-arrow-right"></i
           ></span>
         </div>

+ 2 - 5
src/modules/exam/components/WaitTaskExamTask.vue

@@ -2,7 +2,7 @@
   <div class="wait-task-exam part-box part-box-pad part-box-border">
     <div class="task-head part-box part-box-flex">
       <h3>
-        命题办(<span class="color-danger">{{ total }}</span
+        命题办(<span class="color-danger">{{ total }}</span
         >)
       </h3>
       <div>
@@ -27,10 +27,7 @@
           <el-tag :type="task.residueTips.status" effect="dark">
             {{ task.residueTips.title }}
           </el-tag>
-          <span
-            v-if="task.endTime > task.systemCurrentTime"
-            class="task-action"
-            @click="toDo(task)"
+          <span class="task-action" @click="toDo(task)"
             >立即处理 <i class="el-icon-arrow-right"></i
           ></span>
         </div>

+ 2 - 1
src/modules/exam/views/ExamTaskManage.vue

@@ -248,6 +248,7 @@ export default {
       examTasks: [],
       curExamTask: {},
       curUserId: this.$ls.get("user", { id: "" }).id,
+      userRoles: this.$ls.get("user", { roleList: [] }).roleList,
       // date-picker
       createTime: [],
       pickerOptions
@@ -339,7 +340,7 @@ export default {
     },
     taskModified() {
       this.getList();
-      this.updateWaitTaskCount();
+      this.updateWaitTaskCount(this.userRoles);
     }
   }
 };

+ 2 - 1
src/modules/exam/views/TaskApplyManage.vue

@@ -226,6 +226,7 @@ export default {
       examTasks: [],
       curExamTask: {},
       curUserId: this.$ls.get("user", { id: "" }).id,
+      userRoles: this.$ls.get("user", { roleList: [] }).roleList,
       // date-picker
       createTime: [],
       pickerOptions
@@ -284,7 +285,7 @@ export default {
     },
     taskModified() {
       this.getList();
-      this.updateWaitTaskCount();
+      this.updateWaitTaskCount(this.userRoles);
     }
   }
 };

+ 2 - 1
src/modules/exam/views/TaskReviewManage.vue

@@ -284,6 +284,7 @@ export default {
       multipleSelection: [],
       loading: false,
       curUserId: this.$ls.get("user", { id: "" }).id,
+      userRoles: this.$ls.get("user", { roleList: [] }).roleList,
       // audit-dialog
       auditDialogShow: false,
       auditModal: { reason: "" },
@@ -422,7 +423,7 @@ export default {
     },
     taskModified() {
       this.getList();
-      this.updateWaitTaskCount();
+      this.updateWaitTaskCount(this.userRoles);
     }
   }
 };

+ 1 - 1
src/modules/exam/views/WaitTask.vue

@@ -60,7 +60,7 @@ export default {
   methods: {
     ...mapActions("exam", ["updateWaitTaskCount"]),
     updateList() {
-      this.updateWaitTaskCount();
+      this.updateWaitTaskCount(this.userRoles);
       if (this.IS_QUESTION_TEACHER) {
         this.$refs.WaitTaskExamTask.getList();
       }

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません