zhangjie 4 роки тому
батько
коміт
531a93a6ab

+ 4 - 0
src/api.js

@@ -254,6 +254,10 @@ export const publishScoreTask = ({ subjectId, questionId, taskList }) => {
     "json"
   );
 };
+// grading-standard-paper-manage
+export const cancelStandardPaper = paperIds => {
+  return $patch(`/api/papers/batch/cancelSample`, { paperIds }, "json");
+};
 
 // grading-detail ------------------------->
 // grading-analysis

+ 6 - 3
src/assets/styles/common-component.less

@@ -46,7 +46,10 @@
   }
   &-imgs {
     position: absolute;
+    top: 0;
+    left: 50%;
     width: 600px;
+    margin-left: -300px;
     // box-shadow: 0px 24px 36px 0px rgba(0, 0, 0, 0.3);
     transition: width, height, transform 0.2s linear;
     z-index: 8;
@@ -124,10 +127,10 @@
     position: absolute;
     width: 60px;
     height: 60px;
-    top: 50%;
+    top: 0;
     left: 50%;
-    margin: -30px 0 0 -30px;
-    color: @main-color;
+    margin: 0 0 0 -30px;
+    color: @border-color-base;
     font-size: 50px;
     text-align: center;
     line-height: 60px;

+ 1 - 1
src/assets/styles/main.less

@@ -242,7 +242,7 @@
     margin-top: 20px;
     height: 32px;
     position: relative;
-    .ivu-btn {
+    .ivu-btn[class^="view-action"] {
       position: absolute;
       top: 0;
       left: 50%;

+ 43 - 0
src/assets/styles/mark.less

@@ -808,3 +808,46 @@
     background-color: @background-color;
   }
 }
+
+// grading-standard-paper-manage
+.grading-standard-paper-manage {
+  .level-list {
+    font-size: 0;
+    white-space: nowrap;
+  }
+  .level-item {
+    display: inline-block;
+    vertical-align: top;
+    height: 32px;
+    line-height: 32px;
+    padding: 0 12px;
+    border-radius: @box-border-radius-small;
+    background-color: @white;
+    color: @dark-color-light;
+    font-size: 16px;
+    cursor: pointer;
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
+    &:hover {
+      box-shadow: 0px 10px 10px 0px rgba(34, 192, 255, 0.4);
+    }
+
+    &-act {
+      background-color: @info-color;
+      color: @white;
+      box-shadow: 0px 10px 10px 0px rgba(34, 192, 255, 0.4);
+    }
+  }
+
+  .image-view-actions {
+    text-align: center;
+  }
+
+  .standard-papers-none {
+    padding-top: 200px;
+    text-align: center;
+    font-size: 24px;
+    color: @dark-color-lighter;
+  }
+}

+ 34 - 18
src/components/SimpleImagePreview.vue

@@ -32,19 +32,24 @@
           { [`${prefixCls}-imgs-nosition`]: nosition }
         ]"
         :style="styles"
-        v-show="!loading && curImage.imgSrc"
         v-if="modalIsShow"
       >
         <img
+          :key="curImage.imgSrc"
           :src="curImage.imgSrc"
           :alt="curImage.name"
           ref="PreviewImgDetail"
+          @load="reizeImage"
         />
       </div>
       <div :class="[`${prefixCls}-none`]" v-if="!curImage.imgSrc">
         <Icon type="md-image" />
         <p>暂无数据</p>
       </div>
+
+      <div :class="[`${prefixCls}-loading`]" v-show="loading">
+        <Icon class="ivu-load-loop" type="ios-loading" />
+      </div>
     </div>
 
     <div :class="[`${prefixCls}-footer`]">
@@ -54,10 +59,6 @@
         </li>
       </ul>
     </div>
-
-    <div :class="[`${prefixCls}-loading`]" v-show="loading">
-      <Icon class="ivu-load-loop" type="ios-loading" />
-    </div>
   </Modal>
 </template>
 
@@ -92,25 +93,39 @@ export default {
   watch: {
     "curImage.imgSrc": {
       handler(val) {
-        if (val) this.loading = true;
+        if (val) {
+          this.loadingSetT = setTimeout(() => {
+            this.loading = true;
+          }, 300);
+          this.styles = {
+            width: "",
+            height: "",
+            top: "",
+            left: "",
+            transform: ""
+          };
+        }
       }
     }
   },
   methods: {
     visibleChange(visible) {
       if (!visible) return;
-      this.loading = true;
-      this.$nextTick(() => {
-        this.registfileLoad();
-      });
+      // this.loading = true;
+      // this.$nextTick(() => {
+      //   this.registfileLoad();
+      // });
     },
-    registfileLoad() {
+    // registfileLoad() {
+    //   const imgDom = this.$refs.PreviewImgDetail;
+    //   imgDom.onload = () => {
+    //     this.reizeImage(imgDom);
+    //   };
+    // },
+    reizeImage() {
+      if (this.loadingSetT) clearTimeout(this.loadingSetT);
+
       const imgDom = this.$refs.PreviewImgDetail;
-      imgDom.onload = () => {
-        this.rezizeImage(imgDom);
-      };
-    },
-    rezizeImage(imgDom) {
       const { naturalWidth, naturalHeight } = imgDom;
       const imageSize = this.getImageSizePos({
         win: {
@@ -129,14 +144,14 @@ export default {
         height: imageSize.height + "px",
         top: imageSize.top + "px",
         left: imageSize.left + "px",
-        transform: ""
+        marginLeft: "auto",
+        transform: "none"
       });
       this.transform = {
         scale: 1,
         rotate: 0
       };
       this.loading = false;
-      console.log(11);
       setTimeout(() => {
         this.nosition = false;
       }, 100);
@@ -230,6 +245,7 @@ export default {
             this.nosition = false;
           }, 100);
         }, 200);
+        // 200ms当次旋转动画持续时间
       }
     }
   }

+ 10 - 0
src/constants/authority.js

@@ -113,6 +113,11 @@ export const grading = [
     title: "分档分组",
     icon: "ivu-icon-group"
   },
+  {
+    name: "GradingStandardPaperManage",
+    title: "标准卷管理",
+    icon: "ivu-icon-score"
+  },
   {
     name: "ExamPaperView",
     title: "查看试卷",
@@ -141,6 +146,11 @@ export const mark = [
     title: "用户管理",
     icon: "ivu-icon-student"
   },
+  {
+    name: "MarkGroupManage",
+    title: "打分分组",
+    icon: "ivu-icon-group"
+  },
   {
     name: "MarkExamPaperView",
     title: "查看试卷",

+ 1 - 5
src/modules/grading/Grading.vue

@@ -128,11 +128,7 @@ export default {
     buildNavs() {
       this.navs = deepCopy(grading);
       if (this.IS_ADMIN) {
-        this.navs.pop();
-        this.navs = [...main.slice(0, 2), ...this.navs];
-        if (this.curSubject.stage === "LEVEL") {
-          this.navs[this.navs.length - 1].title = "打分分组";
-        }
+        this.navs = [...main.slice(0, 2), ...this.navs.slice(0, -2)];
       } else {
         this.navs.splice(2, 2);
       }

+ 2 - 2
src/modules/grading/GradingGroupManage.vue

@@ -3,7 +3,7 @@
     <div class="group-user part-box" v-if="users.length">
       <draggable class="group-user-list" group="user" :list="users">
         <Button size="small" v-for="user in users" :key="user.id">
-          {{ user.name }}
+          {{ user.loginName }}
         </Button>
       </draggable>
       <Button
@@ -33,7 +33,7 @@
                 @on-close="removeGroupUser(uindex, group)"
                 closable
               >
-                {{ user.name }}
+                {{ user.loginName }}
               </Tag>
             </draggable>
           </div>

+ 3 - 3
src/modules/grading/GradingProgress.vue

@@ -57,13 +57,13 @@
             v-if="IS_LEVEL && markerProgress.length"
           >
             <tr>
-              <td>{{ kzzInfo.name }}</td>
+              <td>{{ kzzInfo.loginName }}</td>
               <td colspan="3" style="text-align:left">
                 仲裁:{{ kzzInfo.arbitrated }}
               </td>
             </tr>
             <tr v-for="(item, aindex) in markerProgress" :key="aindex">
-              <td>{{ item.markerName }}</td>
+              <td>{{ item.loginName }}</td>
               <td>
                 <progress-line
                   :sum="item.totalCount"
@@ -77,7 +77,7 @@
 
           <table class="table table-noborder" v-if="IS_SCORE">
             <tr v-for="(item, aindex) in markerProgress" :key="aindex">
-              <td>{{ item.markerName }}</td>
+              <td>{{ item.loginName }}</td>
               <td>
                 <progress-line
                   :sum="item.totalCount"

+ 254 - 0
src/modules/grading/GradingStandardPaperManage.vue

@@ -0,0 +1,254 @@
+<template>
+  <div class="grading-standard-paper-manage">
+    <div class="part-box-head">
+      <Form
+        class="part-box-head-left"
+        ref="FilterForm"
+        label-position="left"
+        inline
+      >
+        <FormItem>
+          <Select v-model="questionId" placeholder="选择考区">
+            <Option
+              v-for="area in areas"
+              :key="area.id"
+              :value="area.id"
+              :label="area.areaName"
+            ></Option>
+          </Select>
+        </FormItem>
+        <FormItem>
+          <Button
+            size="small"
+            class="btn-form-search"
+            type="primary"
+            @click="toPage(1)"
+            >查询</Button
+          >
+        </FormItem>
+      </Form>
+      <div class="part-box-head-right">
+        <div class="level-list">
+          <p
+            v-for="(level, index) in levels"
+            :key="level"
+            :class="[
+              'level-item',
+              { 'level-item-act': index === curLevelIndex }
+            ]"
+            @click="switchLevel(index)"
+          >
+            {{ level }}
+          </p>
+        </div>
+      </div>
+    </div>
+
+    <div class="standard-papers-list" v-if="papers.length">
+      <div class="image-view-list image-view-list-5">
+        <div
+          :class="[
+            'image-view',
+            { 'image-view-act': curPaperIndex === index || image.selected }
+          ]"
+          v-for="(image, index) in papers"
+          :key="index"
+        >
+          <h5 class="image-view-title">{{ image.title }}</h5>
+          <div class="image-view-contain">
+            <img
+              :src="image.thumbSrc"
+              :alt="image.title"
+              @click="toReview(index)"
+            />
+          </div>
+          <div class="image-view-actions" v-if="canCancel">
+            <Button
+              type="error"
+              size="small"
+              @click="cancelPaper(image)"
+              :disabled="image.loading"
+              >取消标准卷</Button
+            >
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="standard-papers-list" v-else>
+      <p class="standard-papers-none">暂无数据</p>
+    </div>
+
+    <!-- image-preview -->
+    <simple-image-preview
+      :cur-image="curPaper"
+      @on-prev="toPrevPaper"
+      @on-next="toNextPaper"
+      ref="SimpleImagePreview"
+    ></simple-image-preview>
+  </div>
+</template>
+
+<script>
+import {
+  paperList,
+  subjectDetail,
+  areaList,
+  workLevelList,
+  cancelStandardPaper
+} from "@/api";
+import SimpleImagePreview from "@/components/SimpleImagePreview";
+
+export default {
+  name: "grading-standard-paper-manage",
+  components: { SimpleImagePreview },
+  data() {
+    return {
+      workId: this.$route.params.workId,
+      subjectId: this.$route.params.subjectId,
+      subject: "",
+      canCancel: false,
+      questionId: "",
+      curLevel: "",
+      curLevelIndex: 0,
+      levels: [],
+      areas: [],
+      paperMap: {},
+      papers: [],
+      curPaper: {},
+      curPaperIndex: 0
+    };
+  },
+  mounted() {
+    this.subject = this.subjectId.split("-")[1];
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      this.curSubject = await subjectDetail(this.subjectId);
+      const isLevelOrScore =
+        (this.curSubject.stage === "LEVEL" ||
+          this.curSubject.stage === "SCORE") &&
+        this.curSubject.test === 0;
+      this.canCancel = !isLevelOrScore;
+
+      await this.getAreaList();
+      this.questionId = this.areas[0].id;
+      await this.getWorkLevels();
+      this.switchLevel(0);
+    },
+    async getWorkLevels() {
+      const data = await workLevelList(this.workId);
+      this.levels = data.map(item => item.code);
+    },
+    async getAreaList() {
+      const data = await areaList({
+        workId: this.workId,
+        subject: this.subject
+      });
+      this.areas = data.map(item => {
+        return {
+          id: item.id,
+          areaName: item.areaName,
+          areaCode: item.areaCode
+        };
+      });
+    },
+    async getList() {
+      if (this.paperMap[this.curLevel] && this.paperMap[this.curLevel].length) {
+        this.papers = this.paperMap[this.curLevel];
+        return;
+      }
+      const datas = {
+        questionId: this.questionId,
+        level: this.curLevel,
+        sort: "secretNumber",
+        isSample: true,
+        page: 0,
+        size: 100
+      };
+      const data = await paperList(datas);
+      this.papers = data.data.map(item => {
+        item.title = `NO.${item.sn}`;
+        item.loading = false;
+        return item;
+      });
+      this.paperMap[this.curLevel] = data.data;
+    },
+    switchLevel(index) {
+      this.curLevelIndex = index;
+      this.curLevel = this.levels[index];
+
+      this.getList();
+    },
+    cancelPaper(paper) {
+      if (paper.loading) return;
+      this.$Modal.confirm({
+        content: "确定要取消当前标准卷吗?",
+        onOk: async () => {
+          paper.loading = true;
+          const res = await cancelStandardPaper(paper.id).catch(() => {});
+          paper.loading = false;
+          if (!res) return;
+          this.paperMap[this.curLevel] = null;
+          await this.getList();
+          this.selectPaper(this.curPaperIndex);
+        }
+      });
+    },
+    // to review
+    toReview(index) {
+      this.selectPaper(index);
+      this.$refs.SimpleImagePreview.open();
+    },
+    selectPaper(index) {
+      let nindex = index;
+      if (!this.papers.length) {
+        nindex = 0;
+      } else if (index > this.papers.length - 1) {
+        nindex = this.papers.length - 1;
+      } else if (index < 0) {
+        nindex = 0;
+      }
+      this.curPaperIndex = nindex;
+      this.curPaper = this.papers[nindex] ? { ...this.papers[nindex] } : {};
+    },
+    async toPrevPaper() {
+      if (this.curPaperIndex === 0) {
+        if (this.curLevelIndex === 0) {
+          this.$Message.warning("当前已经是第一条数据了");
+          return;
+        } else {
+          this.curLevelIndex--;
+          this.curLevel = this.levels[this.curLevelIndex];
+          await this.getList();
+          this.curPaperIndex = this.papers.length - 1;
+        }
+      } else {
+        this.curPaperIndex--;
+      }
+
+      this.selectPaper(this.curPaperIndex);
+    },
+    async toNextPaper() {
+      if (
+        this.curPaperIndex === this.papers.length - 1 ||
+        !this.papers.length
+      ) {
+        if (this.curLevelIndex === this.levels.length - 1) {
+          this.$Message.warning("当前已经是最后一条数据了");
+          return;
+        } else {
+          this.curLevelIndex++;
+          this.curLevel = this.levels[this.curLevelIndex];
+          await this.getList();
+          this.curPaperIndex = 0;
+        }
+      } else {
+        this.curPaperIndex++;
+      }
+
+      this.selectPaper(this.curPaperIndex);
+    }
+  }
+};
+</script>

+ 3 - 2
src/modules/grading/components/GradeAction.vue

@@ -98,7 +98,7 @@
           v-for="his in gradingHistory"
           :key="his.id"
         >
-          <p>{{ his.name }}</p>
+          <p>{{ his.loginName }}</p>
           <p>{{ his.value }}</p>
         </div>
       </div>
@@ -318,6 +318,7 @@ export default {
           id: item.id,
           markerId: item.markerId,
           name: item.marker,
+          loginName: item.loginName,
           value: level
         };
       });
@@ -342,7 +343,7 @@ export default {
           this.gradingHistory.map(item => {
             return {
               id: item.markerId,
-              name: item.name
+              name: item.loginName
             };
           })
         );

+ 4 - 4
src/modules/login/ResetPwd.vue

@@ -14,7 +14,7 @@
       </div>
       <div class="login-form">
         <Form ref="resetForm" :model="reset" :rules="resetRules">
-          <FormItem prop="password">
+          <!-- <FormItem prop="password">
             <Input
               size="large"
               class="input-huge"
@@ -24,7 +24,7 @@
               placeholder="请输入旧密码"
               clearable
             ></Input>
-          </FormItem>
+          </FormItem> -->
           <FormItem prop="newpswd">
             <Input
               size="large"
@@ -84,7 +84,7 @@ import { resetPwd } from "@/api";
 import { password } from "@/plugins/formRules";
 
 const initModalForm = {
-  password: "",
+  // password: "",
   newpswd: "",
   renewpswd: ""
 };
@@ -107,7 +107,7 @@ export default {
         ...initModalForm
       },
       resetRules: {
-        password,
+        // password,
         newpswd: password,
         renewpswd: [
           ...password,

+ 17 - 2
src/modules/main/PaperManage.vue

@@ -154,9 +154,20 @@ export default {
   },
   mounted() {
     this.CAFA_EXCEPTION_TYPE = { ...CAFA_EXCEPTION_TYPE, 2: "全部" };
-    this.getSubjects();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getSubjects();
+      this.filter.subject = this.subjects[0].subject;
+      this.filter.areaCode = "";
+      this.areas = [];
+      await this.getAreaList();
+      if (!this.filter.areaCode) {
+        this.filter.areaCode = this.areas[0].areaCode;
+      }
+      this.toPage(1);
+    },
     async getList() {
       const datas = {
         ...this.filter,
@@ -165,9 +176,13 @@ export default {
       };
       const data = await paperPageList(datas);
       this.papers = data.data.map(paper => {
+        const title =
+          this.paperType === "0"
+            ? `${paper.examNumber} ${paper.studentName}`
+            : paper.examNumber;
         return {
           id: paper.id,
-          title: paper.examNumber,
+          title,
           imgSrc: paper.imgSrc,
           thumbSrc: paper.thumbSrc,
           missing: paper.missing,

+ 10 - 1
src/modules/main/QualityAnalysis.vue

@@ -158,9 +158,18 @@ export default {
     };
   },
   mounted() {
-    this.getSubjects();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getSubjects();
+      this.filter.subject = this.subjects[0].subject;
+      this.filter.areaCode = "";
+      this.areas = [];
+      await this.getAreaList();
+      this.filter.areaCode = this.areas[0].areaCode;
+      this.toSearch();
+    },
     async getSubjects() {
       const data = await subjectList(this.filter.workId);
       this.subjects = data.filter(item => item.enable);

+ 21 - 2
src/modules/main/StudentManage.vue

@@ -8,12 +8,12 @@
           @click="$refs.ExportStudent.open()"
           >导入考生信息</Button
         >
-        <Button
+        <!-- <Button
           icon="upload icon"
           shape="circle"
           @click="$refs.ExportRelate.open()"
           >导入关联信息</Button
-        >
+        > -->
       </div>
       <div class="part-box-head-right">
         <Button
@@ -23,6 +23,13 @@
           @click="toAdd"
           >添加考生</Button
         >
+        <Button
+          shape="circle"
+          type="success"
+          icon="upload-white icon"
+          @click="toExport"
+          >导出表格</Button
+        >
       </div>
     </div>
     <div class="part-box part-box-filter">
@@ -199,6 +206,7 @@ import {
 import ImportFile from "@/components/common/ImportFile";
 import ModifyStudent from "./components/ModifyStudent";
 import { BOOLEAN_TYPE, PAPER_UPLOAD_TYPE } from "@/constants/enumerate";
+import qs from "qs";
 
 export default {
   name: "students",
@@ -337,6 +345,7 @@ export default {
         this.$Message.error("上传状态和科目必须同时选择!");
         return;
       }
+      if (datas.subject === "ALL") datas.subject = null;
       const data = await studentPageList(datas);
       this.students = data.data.map(student => {
         student.uploadStatus.split(",").map(status => {
@@ -372,6 +381,10 @@ export default {
         };
         this.columns.splice(this.columns.length - 1, 0, column);
       });
+      this.subjects.unshift({
+        subject: "ALL",
+        name: "全部"
+      });
     },
     areaChange() {
       const curArea = this.cascadeList.find(
@@ -418,6 +431,12 @@ export default {
       await deleteStudent(id);
       this.$Message.success("删除成功!");
       this.deletePageLastItem();
+    },
+    toExport() {
+      const sqDatas = qs.stringify(this.filter, {
+        arrayFormat: "brackets"
+      });
+      window.open(`${this.GLOBAL.domain}/api/export/student?${sqDatas}`);
     }
   }
 };

+ 16 - 1
src/modules/mark/MarkDetail.vue

@@ -1,7 +1,12 @@
 <template>
   <div :class="compClasses">
     <div class="part-box-head">
-      <Form ref="FilterForm" label-position="left" inline>
+      <Form
+        class="part-box-head-left"
+        ref="FilterForm"
+        label-position="left"
+        inline
+      >
         <FormItem>
           <Select
             v-model="filter.questionId"
@@ -26,6 +31,11 @@
           >
         </FormItem>
       </Form>
+      <div class="part-box-head-right">
+        <Button icon="upload icon" shape="circle" @click="toExport"
+          >导出改档信息</Button
+        >
+      </div>
     </div>
     <mark-step
       :steps="steps"
@@ -344,6 +354,11 @@ export default {
       this.selectPaper(index);
       this.$refs.SimpleImagePreview.open();
     },
+    toExport() {
+      window.open(
+        `${this.GLOBAL.domain}/api/export/paper/${this.workId}/${this.subject}/changeLevel`
+      );
+    },
     selectPaper(index) {
       let nindex = index;
       if (!this.papers.length) {

+ 12 - 0
src/modules/mark/MarkOperation.vue

@@ -385,8 +385,20 @@ export default {
       } else if (index < 0) {
         nindex = 0;
       }
+      const lastPaper = { ...this.curPaper };
       this.curPaperIndex = nindex;
       this.curPaper = this.papers[nindex] ? { ...this.papers[nindex] } : {};
+
+      // 待评时,检查当前试卷是否已经切换档位
+      if (
+        this.curStep.type === "undo" &&
+        this.curPaper["level"] &&
+        this.curPaper["level"] !== lastPaper["level"]
+      ) {
+        this.$Modal.info({
+          content: `即将打分档位:${this.curPaper.level}`
+        });
+      }
     },
     async toPrevPaper() {
       if (this.curPaperIndex === 0) {

+ 2 - 1
src/modules/mark/components/MarkAction.vue

@@ -164,7 +164,7 @@
           v-for="(his, hindex) in gradingHistory"
           :key="hindex"
         >
-          <p>{{ his.name }}</p>
+          <p>{{ his.loginName }}</p>
           <p>{{ his.value }}</p>
         </div>
       </div>
@@ -398,6 +398,7 @@ export default {
         return {
           id: item.markerId,
           name: item.marker,
+          loginName: item.loginName,
           value: item.result || "未评"
         };
       });

+ 9 - 0
src/routers/grading.js

@@ -5,6 +5,7 @@ import GradingDetail from "../modules/grading/GradingDetail";
 import GradingUserManage from "../modules/grading/GradingUserManage";
 import GradingGroupManage from "../modules/grading/GradingGroupManage";
 import ExamPaperView from "../modules/main/ExamPaperView";
+import GradingStandardPaperManage from "../modules/grading/GradingStandardPaperManage";
 
 // 阅卷员分档
 import GradingOperation from "../modules/grading/GradingOperation";
@@ -49,6 +50,14 @@ const gradingRoutes = [
     meta: {
       title: "试卷查看"
     }
+  },
+  {
+    path: "grading-standard-paper-manage",
+    name: "GradingStandardPaperManage",
+    component: GradingStandardPaperManage,
+    meta: {
+      title: "标准卷管理"
+    }
   }
 ];
 

+ 9 - 1
src/routers/mark.js

@@ -4,7 +4,7 @@ import MarkProgress from "../modules/mark/MarkProgress";
 import MarkDetail from "../modules/mark/MarkDetail";
 import MarkTaskManage from "../modules/mark/MarkTaskManage";
 import MarkUserManage from "../modules/mark/MarkUserManage";
-// import MarkGroupManage from "../modules/mark/MarkGroupManage";
+import MarkGroupManage from "../modules/mark/MarkGroupManage";
 import ExamPaperView from "../modules/main/ExamPaperView";
 
 // 阅卷员打分
@@ -43,6 +43,14 @@ const markRoutes = [
       title: "用户管理"
     }
   },
+  {
+    path: "mark-group-manage",
+    name: "MarkGroupManage",
+    component: MarkGroupManage,
+    meta: {
+      title: "打分分组"
+    }
+  },
   {
     path: "exam-paper-view",
     name: "MarkExamPaperView",