zhangjie 4 жил өмнө
parent
commit
0b07d37b31
34 өөрчлөгдсөн 1656 нэмэгдсэн , 1049 устгасан
  1. 10 6
      public/index.html
  2. 233 0
      src/assets/styles/adaptive.less
  3. 26 0
      src/assets/styles/base.less
  4. 26 33
      src/assets/styles/home.less
  5. 1 0
      src/assets/styles/index.less
  6. 91 77
      src/assets/styles/main.less
  7. 225 87
      src/assets/styles/mark.less
  8. 110 0
      src/components/ImageViewContain.vue
  9. 1 1
      src/components/PaperCarousel.vue
  10. 30 17
      src/components/ViewHeader.vue
  11. 6 1
      src/constants/authority.js
  12. 3 3
      src/modules/grading/Grading.vue
  13. 151 0
      src/modules/grading/GradingAnalysis.vue
  14. 100 190
      src/modules/grading/GradingDetail.vue
  15. 139 174
      src/modules/grading/GradingOperation.vue
  16. 23 24
      src/modules/grading/GradingStandardPaperManage.vue
  17. 94 0
      src/modules/grading/components/GradeFilter.vue
  18. 0 17
      src/modules/grading/components/GradeStep.vue
  19. 3 0
      src/modules/grading/components/ModifyGradingUser.vue
  20. 1 1
      src/modules/inspection/Inspection.vue
  21. 38 33
      src/modules/inspection/InspectionGrading.vue
  22. 1 1
      src/modules/main/ClientMonitor.vue
  23. 1 1
      src/modules/main/Main.vue
  24. 12 7
      src/modules/main/PaperManage.vue
  25. 1 1
      src/modules/main/QualityAnalysis.vue
  26. 1 1
      src/modules/main/StudentScore.vue
  27. 34 31
      src/modules/main/WorkManage.vue
  28. 11 1
      src/modules/main/components/ImageActionList.vue
  29. 54 88
      src/modules/mark/MarkDetail.vue
  30. 2 2
      src/modules/mark/MarkHome.vue
  31. 97 131
      src/modules/mark/MarkOperation.vue
  32. 120 120
      src/modules/quality/Quality.vue
  33. 2 1
      src/plugins/axios.js
  34. 9 0
      src/routers/grading.js

+ 10 - 6
public/index.html

@@ -1,15 +1,19 @@
 <!DOCTYPE html>
 <html lang="en">
   <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title><%= htmlWebpackPlugin.options.title %></title>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+    <title>美术阅卷系统</title>
   </head>
   <body>
     <noscript>
-      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+      <strong
+        >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
+        properly without JavaScript enabled. Please enable it to
+        continue.</strong
+      >
     </noscript>
     <div id="app"></div>
     <!-- built files will be auto injected -->

+ 233 - 0
src/assets/styles/adaptive.less

@@ -0,0 +1,233 @@
+@media screen and (max-width: 1400px) {
+  // base
+  .part-box {
+    &-head {
+      margin-bottom: 15px;
+    }
+  }
+  .part-page {
+    margin-top: 10px;
+  }
+
+  // home
+  .home-main > div {
+    padding: 15px 20px;
+  }
+  .home-navs {
+    li {
+      padding: 0 8px;
+    }
+  }
+
+  // main
+  .overview {
+    &-head {
+      margin-bottom: 24px;
+    }
+    &-body {
+      margin: 0 -10px;
+    }
+    &-subject {
+      padding: 0 10px;
+    }
+    .subject {
+      &-content {
+        padding: 15px;
+      }
+      &-name {
+        font-size: 30px;
+        line-height: 42px;
+      }
+      &-infos {
+        margin: 15px 0 24px;
+      }
+      &-actions {
+        padding: 24px 15px;
+        margin-bottom: 24px;
+      }
+    }
+  }
+  .student-score-content {
+    .score-content {
+      &-body {
+        padding: 15px;
+      }
+    }
+  }
+  .exam-paper-view {
+    .exam-paper-item {
+      padding: 15px;
+    }
+    .exam-paper-area {
+      font-size: 18px;
+    }
+  }
+  .image-view {
+    &-title {
+      font-size: 16px;
+      line-height: 18px;
+    }
+  }
+  // mark
+  .grade-step {
+    .step-item {
+      padding: 6px;
+
+      &:not(:last-child) {
+        margin-right: 8px;
+      }
+      p {
+        height: 12px;
+        line-height: 1;
+      }
+      .step-name {
+        font-size: 18px;
+        height: 30px;
+        line-height: 30px;
+      }
+
+      &.step-other {
+        min-width: 60px;
+        .step-name {
+          font-size: 16px;
+        }
+      }
+    }
+  }
+  .grading-detail {
+    .detail-papers {
+      padding: 0 15px;
+    }
+    .detail-action {
+      padding: 15px;
+      width: 270px;
+    }
+    &-image-preview {
+      .ivu-modal-mask,
+      .ivu-modal-wrap {
+        right: 270px;
+      }
+    }
+  }
+  .grading-operation {
+    &-image-preview {
+      .ivu-modal-mask,
+      .ivu-modal-wrap {
+        right: 270px;
+      }
+    }
+  }
+  .grade-action {
+    .action-search {
+      margin-bottom: 15px;
+    }
+    .action-paper-state {
+      margin-bottom: 15px;
+      .paper-state-cont {
+        font-size: 16px;
+        font-weight: 600;
+        line-height: 22px;
+      }
+    }
+
+    .action-paper-info {
+      line-height: 20px;
+      margin-bottom: 15px;
+
+      span:last-child {
+        font-size: 16px;
+      }
+    }
+    .action-grade-change {
+      margin-bottom: 15px;
+
+      > p:first-child {
+        margin-bottom: 6px;
+      }
+    }
+    .action-grade-change-status {
+      padding: 12px;
+      line-height: 20px;
+      font-size: 16px;
+    }
+
+    .action-grade-info {
+      margin-bottom: 15px;
+      padding: 5px;
+
+      + .action-mark-info {
+        margin-top: -5px;
+      }
+      &-title {
+        font-size: 16px;
+      }
+
+      .grade-info-name {
+        height: 50px;
+        line-height: 50px;
+        font-size: 46px;
+      }
+      .grade-info-none {
+        font-size: 26px;
+      }
+      .grade-info-range {
+        p:first-child {
+          line-height: 16px;
+        }
+
+        p:last-child {
+          font-size: 18px;
+          line-height: 26px;
+        }
+
+        > span {
+          margin: 0 2px;
+        }
+      }
+    }
+    .action-grade-list {
+      margin: -5px -5px 15px;
+    }
+    .action-grade-item {
+      &-content {
+        padding: 6px;
+      }
+
+      p {
+        line-height: 1;
+
+        &:first-child {
+          font-size: 18px;
+          line-height: 24px;
+        }
+      }
+    }
+
+    .action-grade-history {
+      > h3 {
+        font-size: 16px;
+      }
+    }
+    .action-grade-pass {
+      height: 45px;
+      padding: 10px;
+      line-height: 25px;
+      font-size: 18px;
+    }
+  }
+  .mark-action {
+    .action-mark-list {
+      margin: -5px -5px 15px;
+    }
+    .action-mark-input {
+      margin-bottom: 15px;
+    }
+  }
+
+  // iview
+  .ivu-form-inline {
+    .ivu-form-item {
+      margin-right: 15px;
+    }
+  }
+}

+ 26 - 0
src/assets/styles/base.less

@@ -115,6 +115,14 @@ body {
   color: @font-color-main;
   background-color: @background-color;
 }
+.page-container-flex {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
 
 /* part */
 .part-box {
@@ -354,6 +362,24 @@ h3.account-title {
 .color-error {
   color: @error-color;
 }
+.color-default-hover {
+  &:hover {
+    color: fade(@primary-color, 80%);
+  }
+}
+.color-text-hover {
+  color: @dark-color-light;
+  &:hover {
+    color: @dark-color;
+  }
+}
+.color-error-hover {
+  color: @error-color;
+
+  &:hover {
+    color: fade(@error-color, 80%);
+  }
+}
 
 .clear-float {
   &::after {

+ 26 - 33
src/assets/styles/home.less

@@ -8,18 +8,21 @@
 .home-body {
   position: absolute;
   left: 0;
-  top: 64px;
+  top: 50px;
   right: 0;
   bottom: 0;
   overflow: auto;
   background: @background-color;
-  z-index: 100;
+  z-index: 99;
 }
 .home-main {
   position: relative;
-  padding: 32px 32px 52px;
   min-height: 100%;
 
+  > div {
+    padding: 20px;
+  }
+
   &-nofooter {
     padding-bottom: 0;
   }
@@ -53,16 +56,17 @@
   width: 100%;
   top: 0;
   left: 0;
-  z-index: 100;
+  z-index: 98;
   background: #fff;
   border-radius: 0px 0px 20px 20px;
 
   .head-main {
-    height: 64px;
+    height: 50px;
   }
   .head-logo {
     float: left;
-    padding: 18px 0 18px 32px;
+    margin: 0 70px 0 0;
+    padding: 8px;
     line-height: 28px;
     color: @font-color-main;
     font-size: 20px;
@@ -73,31 +77,29 @@
     }
   }
   .head-nav {
-    margin: 0 150px 0 190px;
-    padding: 15px;
+    margin: 0 70px 0 0;
+    padding: 8px;
     line-height: 34px;
   }
   .head-user {
     float: right;
-    height: 50px;
-    padding: 16px 32px 16px 10px;
+    padding: 9px 20px 8px 0;
     line-height: 32px;
     color: @dark-color-light;
-    span {
-      display: inline-block;
-      vertical-align: middle;
-      margin-left: 10px;
-      padding: 0 10px;
-      font-weight: 600;
-      background: @background-color;
-      border-radius: 16px;
-      cursor: pointer;
-    }
   }
   .user-name {
+    display: block;
+    padding: 0 10px;
+    font-weight: 600;
+    background: @background-color;
+    border-radius: 16px;
+    cursor: pointer;
     > i {
       color: #bec3d1;
     }
+    &:hover {
+      background-color: shade(@background-color, 5%);
+    }
   }
   .user-logout {
     i {
@@ -106,20 +108,9 @@
     }
 
     &:hover {
-      background-color: shade(@background-color, 5%);
+      color: @error-color;
     }
   }
-
-  .head-sub {
-    border-top: 1px solid @background-color;
-    height: 60px;
-    line-height: 59px;
-    text-align: center;
-  }
-}
-
-.view-header-sub + .home-body {
-  top: 124px;
 }
 
 /* navs */
@@ -129,7 +120,9 @@
   overflow-y: hidden;
   color: @dark-color-light;
   ul {
-    word-wrap: none;
+    white-space: nowrap;
+    word-break: keep-all;
+    overflow: auto;
   }
   li {
     display: inline-block;

+ 1 - 0
src/assets/styles/index.less

@@ -8,3 +8,4 @@
 @import "./main.less";
 @import "./mark.less";
 @import "./common-component.less";
+@import "./adaptive.less";

+ 91 - 77
src/assets/styles/main.less

@@ -1,7 +1,6 @@
-// work-manage
-
 // work-overview
 .overview {
+  padding-top: 40px !important;
   &-head {
     height: 138px;
     background: rgba(78, 87, 170, 1);
@@ -177,6 +176,24 @@
   }
 }
 
+// paper-manage
+.paper-manage {
+  .part-box-filter,
+  .part-page {
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+  .image-action-list {
+    flex-grow: 2;
+  }
+}
+// client-monitor
+.client-monitor {
+  .image-view-list {
+    flex-grow: 2;
+  }
+}
+
 // image-action-list
 // image-view
 .image-view {
@@ -188,27 +205,32 @@
   text-align: center;
   &-act {
     img {
-      // box-shadow: 0px 10px 20px 0px rgba(34, 192, 255, 0.5);
       box-shadow: 0 0 20px rgba(34, 192, 255, 0.6);
+      // box-shadow: 0px 10px 20px 0px rgba(34, 192, 255, 0.5);
       // box-shadow: -20px 0px 40px 0px rgba(224, 225, 235, 1);
     }
   }
 
   &-container {
-    padding: 20px 25px;
     border-radius: @box-border-radius;
     background-color: @white;
+    position: relative;
+    height: 100%;
   }
 
   &-title {
+    position: absolute;
+    width: 100%;
+    top: 0;
+    padding: 10px;
     font-size: 18px;
-    line-height: 25px;
-    margin-bottom: 20px;
+    line-height: 1;
   }
   &-contain {
-    position: relative;
-    height: 0;
-    padding-bottom: 100%;
+    position: absolute;
+    top: 38px;
+    bottom: 52px;
+    width: 100%;
 
     > img {
       position: absolute;
@@ -239,13 +261,28 @@
       font-weight: 600;
     }
   }
+  &-image {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    z-index: 8;
+
+    > img {
+      display: block;
+      width: 100%;
+      cursor: pointer;
+    }
+  }
   &-actions {
-    margin-top: 20px;
-    height: 32px;
-    position: relative;
+    position: absolute;
+    width: 100%;
+    bottom: 0;
+    height: 52px;
+    padding: 10px;
     .ivu-btn[class^="view-action"] {
       position: absolute;
-      top: 0;
+      top: 10px;
       left: 50%;
     }
     .view-action-save {
@@ -283,6 +320,7 @@
   margin: -10px;
   .image-view {
     width: 20%;
+    height: 50%;
   }
 
   &-6 {
@@ -312,51 +350,6 @@
   }
 }
 
-/* paper-carousel */
-.paper-carousel {
-  position: relative;
-  min-height: 40px;
-
-  .carousel-none {
-    color: @dark-color-lighter;
-    font-size: @font-size-base;
-    text-align: center;
-    position: absolute;
-    width: 100%;
-    top: 50%;
-    left: 0;
-    transform: translateY(-50%);
-    z-index: 8;
-    > i {
-      font-size: 30px;
-    }
-  }
-  .carousel-btn {
-    position: absolute;
-    width: 40px;
-    height: 40px;
-    top: 50%;
-    z-index: 9;
-    margin-top: -20px;
-    text-align: center;
-    line-height: 40px;
-    font-size: 36px;
-    color: #ccc;
-    cursor: pointer;
-
-    &:hover {
-      color: @main-color;
-    }
-
-    &-left {
-      left: 0;
-    }
-    &-right {
-      right: 0;
-    }
-  }
-}
-
 /* client-set */
 // set-navs
 .set-navs {
@@ -515,31 +508,40 @@
 }
 
 // inspection-grading
+.inspection-grading {
+  .part-box-filter {
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+}
 .check-grade {
+  flex-grow: 2;
+  min-height: 500px;
+  display: flex;
+  justify-content: space-between;
+
   &-body {
     padding: 20px;
-    margin-right: 300px;
+    flex-grow: 2;
+    margin: 0;
   }
   &-list {
-    min-height: 500px;
-    .image-view-list {
-      margin: 0;
-    }
+    height: 100%;
   }
   &-action {
-    float: right;
     width: 280px;
-    padding: 32px;
-    min-height: 540px;
+    padding: 20px;
     background-color: @white;
     border-radius: @box-border-radius;
+    margin-left: 20px;
     overflow-x: hidden;
     overflow-y: auto;
+    flex-grow: 0;
 
     &-fullscreen {
       position: fixed;
-      width: 290px;
-      top: 64px;
+      width: 280px;
+      top: 0;
       right: 0;
       bottom: 0;
       border-radius: 0;
@@ -548,11 +550,10 @@
     }
   }
   .action-paper-info {
-    font-size: 16px;
-    line-height: 30px;
-    margin-bottom: 32px;
+    font-size: 14px;
+    margin-bottom: 20px;
     color: @dark-color-light;
-    line-height: 25px;
+    line-height: 24px;
     text-align: left;
 
     p {
@@ -566,12 +567,12 @@
   }
 
   .action-grade-info {
-    margin-bottom: 32px;
+    margin-bottom: 20px;
     background-color: #e7eaf1;
     color: @dark-color-light;
     padding: 20px;
     font-size: 20px;
-    border-radius: @box-border-radius;
+    border-radius: @box-border-radius-small;
     line-height: 28px;
 
     > p:first-child {
@@ -587,7 +588,7 @@
     background: rgba(247, 247, 250, 1);
     border-radius: 20px;
     color: rgba(194, 199, 213, 1);
-    border-radius: @box-border-radius;
+    border-radius: @box-border-radius-small;
 
     &-error {
       background: rgba(255, 112, 129, 0.1);
@@ -596,6 +597,7 @@
   }
 
   &-none {
+    width: 100%;
     padding-top: 200px;
     text-align: center;
     font-size: 24px;
@@ -607,12 +609,24 @@
     .ivu-modal-wrap {
       left: 0;
       bottom: 0;
-      top: 64px;
-      right: 290px;
+      top: 0;
+      right: 280px;
     }
   }
 }
 
+// quality
+.quality {
+  .part-box-filter,
+  .part-page {
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+  .image-action-list {
+    flex-grow: 2;
+  }
+}
+
 // exam-paper-view
 .exam-paper-view {
   .exam-paper-item {

+ 225 - 87
src/assets/styles/mark.less

@@ -99,9 +99,10 @@
 
 // grading
 .grading-subnav {
+  display: flex;
+  justify-content: space-between;
   .grading-title {
-    float: left;
-    padding: 0 32px;
+    padding: 0 10px;
 
     > h1 {
       display: inline-block;
@@ -117,9 +118,6 @@
       color: @dark-color-light;
     }
   }
-  .home-navs {
-    float: right;
-  }
 }
 
 // grading-progress
@@ -212,11 +210,11 @@
     white-space: nowrap;
     overflow-x: scroll;
     overflow-y: visible;
-    padding: 0 0 20px;
+    padding: 0 0 10px;
   }
   &-other {
     float: right;
-    padding: 0 0 20px 20px;
+    padding: 0 0 10px 20px;
   }
   .step-item {
     display: inline-block;
@@ -280,13 +278,70 @@
 
 // grading-detail
 .grading-detail {
-  .grading-head {
+  .grade-filter {
+    position: fixed;
+    left: 0;
+    top: 50%;
+    z-index: 199;
+    width: 20px;
+    transform: translateY(-50%);
+    transition: width 0.2s ease-in;
+    overflow: hidden;
+
+    .ivu-form {
+      white-space: nowrap;
+    }
     .ivu-form-item {
-      margin-bottom: 0;
+      margin-right: 10px;
+    }
+    .ivu-form-item:last-child {
+      margin-right: 0;
+    }
+
+    &-form {
+      display: none;
+    }
+    .detail-area {
+      background-color: @success-color;
+      border-radius: 3px;
+      color: @dark-color-light;
+      font-size: 12px;
+      line-height: 16px;
+      width: 20px;
+      padding: 5px 3px;
+      text-align: center;
+      color: #fff;
+      cursor: pointer;
+
+      &:hover {
+        background-color: fade(@success-color, 80%);
+      }
+    }
+
+    &-select {
+      width: 290px;
+      background-color: #fff;
+      padding: 10px 10px 0;
+      border-top-right-radius: 5px;
+      border-bottom-right-radius: 5px;
+      box-shadow: 0 0 15px #c0c0c0;
+      .grade-filter-form {
+        display: block;
+      }
+      .detail-area {
+        display: none;
+      }
     }
   }
+  .grade-step {
+    flex-grow: 0;
+  }
+
   .detail-body {
+    flex-grow: 2;
     min-height: 500px;
+    display: flex;
+    justify-content: space-between;
 
     &-2 {
       .detail-papers-list {
@@ -295,45 +350,46 @@
     }
   }
   .detail-action {
-    float: right;
     width: 280px;
-    padding: 32px;
-    min-height: 540px;
+    padding: 20px;
+    margin-left: 20px;
     background-color: @white;
     border-radius: @box-border-radius;
     overflow-x: hidden;
     overflow-y: auto;
+    flex-grow: 0;
   }
   .detail-action-fullscreen {
     position: fixed;
-    width: 290px;
-    top: 125px;
+    width: 280px;
+    top: 0;
     right: 0;
     bottom: 0;
     z-index: 98;
     border-radius: 0;
     min-height: auto;
+    margin: 0;
     overflow-y: auto;
     overflow-x: hidden;
+    z-index: 999;
   }
   .detail-papers {
     padding: 0 20px;
-    margin-right: 300px;
     background-color: @white;
     border-radius: @box-border-radius;
     font-size: 0;
+    flex-grow: 2;
     display: flex;
+    justify-content: space-between;
+    min-height: 500px;
 
     &-carousel {
       position: relative;
-      display: inline-block;
-      vertical-align: top;
-      padding: 20px 0;
+      padding: 10px 0 70px;
       font-size: 14px;
       &-split {
         height: 40px;
       }
-
       &::after {
         content: "";
         position: absolute;
@@ -345,21 +401,20 @@
       }
     }
     &-list {
-      display: inline-block;
-      vertical-align: top;
       width: 100%;
       font-size: 14px;
-      min-height: 625px;
       position: relative;
-      padding: 20px 0 80px;
+      padding: 10px 0 70px;
       .image-view-list {
         margin: 0;
+        height: 100%;
       }
       .part-page {
         position: absolute;
-        bottom: 30px;
+        bottom: 20px;
         width: 100%;
         z-index: auto;
+        margin: 0;
       }
     }
     &-none {
@@ -411,8 +466,8 @@
     .ivu-modal-wrap {
       left: 0;
       bottom: 0;
-      top: 125px;
-      right: 290px;
+      top: 0;
+      right: 280px;
     }
   }
 }
@@ -421,29 +476,92 @@
 // grading-operation
 .grading-operation {
   .detail-action-fullscreen {
-    top: 64px;
+    top: 0;
   }
   &-image-preview {
     .ivu-modal-mask,
     .ivu-modal-wrap {
       left: 0;
       bottom: 0;
-      top: 64px;
-      right: 290px;
+      top: 0;
+      right: 280px;
+    }
+  }
+}
+
+/* paper-carousel */
+.paper-carousel {
+  position: absolute;
+  top: 48px;
+  bottom: 62px;
+  left: 10px;
+  right: 10px;
+
+  .carousel-body > img {
+    position: absolute;
+    max-width: 100%;
+    max-height: 100%;
+    width: auto;
+    height: auto;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+    cursor: pointer;
+  }
+  .carousel-none {
+    color: @dark-color-lighter;
+    font-size: @font-size-base;
+    text-align: center;
+    position: absolute;
+    width: 100%;
+    top: 50%;
+    left: 0;
+    transform: translateY(-50%);
+    z-index: 8;
+    > i {
+      font-size: 30px;
+    }
+  }
+  .carousel-btn {
+    position: absolute;
+    width: 40px;
+    height: 40px;
+    top: 50%;
+    z-index: 9;
+    margin-top: -20px;
+    text-align: center;
+    line-height: 40px;
+    font-size: 36px;
+    color: #ccc;
+    cursor: pointer;
+
+    &:hover {
+      color: @main-color;
+    }
+
+    &-left {
+      left: 0;
+    }
+    &-right {
+      right: 0;
     }
   }
 }
 
 // .grade-history-paper
 .grade-history-paper {
-  width: 100%;
+  position: relative;
   padding: 10px;
+  width: 100%;
+  height: 50%;
 
   .carousel-title {
     text-align: center;
     height: 32px;
     line-height: 32px;
-    margin-bottom: 13px;
+    margin-bottom: 6px;
     > h3 {
       font-size: 16px;
     }
@@ -453,10 +571,11 @@
 .grade-standard-paper {
   position: relative;
   padding: 10px;
+  height: 50%;
   // margin
   .carousel-title {
     text-align: center;
-    margin-bottom: 13px;
+    height: 38px;
 
     > h3 {
       display: inline-block;
@@ -473,10 +592,10 @@
   }
   .carousel-loading {
     position: absolute;
-    top: 32px;
-    left: 0;
-    right: 0;
-    bottom: 0;
+    top: 38px;
+    left: 10px;
+    right: 10px;
+    bottom: 10px;
     z-index: 99;
     background-color: rgba(255, 255, 255, 0.3);
     text-align: center;
@@ -495,22 +614,22 @@
   font-size: 14px;
   text-align: center;
   .action-search {
-    text-align: left;
     margin-top: 20px;
     padding-top: 20px;
     border-top: 1px dashed #e0e0e0;
+    text-align: left;
 
     .search-select {
       display: block;
       width: 100px;
       min-width: auto;
-      margin-bottom: 10px;
+      margin-bottom: 8px;
     }
     .search-input {
       display: inline-block;
       vertical-align: top;
-      margin-right: 15px;
-      width: 140px;
+      margin-right: 10px;
+      width: 150px;
     }
     .search-btn {
       display: inline-block;
@@ -519,6 +638,7 @@
     }
   }
   .action-paper-state {
+    position: relative;
     display: inline-block;
     color: @dark-color-light;
     margin-bottom: 30px;
@@ -526,7 +646,7 @@
       background: @background-color;
       border-radius: @box-border-radius-small;
       font-size: 20px;
-      line-height: 32px;
+      line-height: 26px;
       padding: 6px 12px;
     }
     .paper-state-intro {
@@ -544,10 +664,9 @@
 
   .action-paper-info {
     font-size: 14px;
-    line-height: 30px;
     margin-bottom: 20px;
     color: @dark-color-light;
-    line-height: 25px;
+    line-height: 24px;
     text-align: left;
 
     p {
@@ -565,7 +684,7 @@
     color: @dark-color-light;
     padding: 20px;
     font-size: 20px;
-    border-radius: @box-border-radius;
+    border-radius: @box-border-radius-small;
     line-height: 28px;
     text-align: left;
 
@@ -575,14 +694,13 @@
   }
   .action-grade-change-status {
     text-align: center;
-    padding: 16px;
+    padding: 8px;
     line-height: 28px;
     font-size: 20px;
     font-weight: 600;
     background: rgba(247, 247, 250, 1);
-    border-radius: 20px;
     color: rgba(194, 199, 213, 1);
-    border-radius: @box-border-radius;
+    border-radius: @box-border-radius-small;
 
     &-error {
       background: rgba(255, 112, 129, 0.1);
@@ -594,17 +712,17 @@
     margin-bottom: 20px;
     background-color: @success-color;
     color: @white;
-    padding: 9px;
-    border-radius: @box-border-radius;
+    padding: 8px;
+    border-radius: @box-border-radius-small;
 
     + .action-mark-info {
       margin-top: -10px;
     }
     &-title {
       color: @dark-color;
-      font-size: 16px;
+      font-size: 18px;
       font-weight: 600;
-      line-height: 32px;
+      line-height: 1;
       margin-bottom: 10px;
       text-align: left;
     }
@@ -612,15 +730,15 @@
     .grade-info-name {
       display: inline-block;
       vertical-align: top;
-      height: 67px;
-      line-height: 69px;
-      font-size: 60px;
+      height: 60px;
+      line-height: 60px;
+      font-size: 54px;
       text-align: center;
       border-radius: 50%;
       color: #fff;
     }
     .grade-info-none {
-      font-size: 40px;
+      font-size: 34px;
     }
     .grade-info-range {
       display: inline-block;
@@ -628,14 +746,17 @@
       margin-left: 20px;
       font-size: 12px;
       text-align: left;
+      padding: 5px 0;
+      p {
+        margin: 0;
+      }
       p:first-child {
-        line-height: 17px;
-        margin: 12px 0 2px;
+        line-height: 20px;
       }
 
       p:last-child {
-        font-size: 22px;
-        line-height: 26px;
+        font-size: 20px;
+        line-height: 30px;
       }
 
       > span {
@@ -645,7 +766,7 @@
   }
   .action-grade-list {
     font-size: 0;
-    margin: -5px -5px 32px;
+    margin: -5px -5px 20px;
   }
   .action-grade-item {
     display: inline-block;
@@ -656,9 +777,9 @@
     color: @dark-color-light;
 
     &-content {
-      padding: 10px;
+      padding: 8px;
       background: @background-color;
-      border-radius: @box-border-radius;
+      border-radius: @box-border-radius-small;
       cursor: pointer;
 
       &:hover {
@@ -668,7 +789,7 @@
     }
 
     p {
-      line-height: 14px;
+      line-height: 1;
 
       &:first-child {
         font-size: 24px;
@@ -686,43 +807,37 @@
     > h3 {
       font-size: 18px;
       font-weight: 600;
-      line-height: 25px;
-      margin-bottom: 20px;
-    }
-    .grade-history-list {
-      font-size: 0;
-      margin: 0 -5px;
+      line-height: 1;
+      margin-bottom: 10px;
     }
     .grade-history-item {
-      display: inline-block;
-      vertical-align: top;
-      margin: 0 5px;
-      padding: 4px;
+      margin: 0 0 5px 0;
+      padding: 4px 4px 4px 10px;
       background-color: @background-color;
       color: @dark-color-light;
-      border-radius: 16px;
-      width: 62px;
+      border-radius: 5px;
+      height: 34px;
       font-size: 14px;
-      text-align: center;
+      line-height: 26px;
 
       p:first-child {
-        height: 26px;
         white-space: nowrap;
         word-break: keep-all;
+        float: left;
       }
       p:last-child {
-        height: 26px;
-        line-height: 26px;
+        padding: 0 8px;
         border-radius: 8px;
         background-color: @white;
         font-size: 14px;
+        float: right;
       }
     }
   }
   .action-grade-pass {
     height: 60px;
     background-color: #f7f7fa;
-    border-radius: 20px;
+    border-radius: @box-border-radius-small;
     padding: 14px;
     color: @dark-color-light;
     font-weight: 600;
@@ -741,16 +856,15 @@
   }
   .action-mark-list {
     font-size: 0;
-    margin: -2px -2px 32px;
+    margin: -5px -5px 20px;
   }
   .action-mark-item {
     display: inline-block;
     vertical-align: top;
-    padding: 2px;
+    padding: 5px;
     width: 20%;
 
     &-content {
-      width: 40px;
       height: 40px;
       padding: 5px 2px;
       font-size: 16px;
@@ -767,6 +881,27 @@
       }
     }
   }
+  .action-mark-input {
+    margin-bottom: 20px;
+    text-align: left;
+    .tips-info {
+      line-height: 20px;
+      text-align: left;
+    }
+    .ivu-icon {
+      margin-right: 3px;
+    }
+    .ivu-input-number {
+      width: 90px;
+      min-width: 0;
+    }
+    .ivu-form-item.mark-input-confirm {
+      margin-right: 0;
+    }
+    .ivu-form-item-error + .mark-input-confirm + .tips-info {
+      color: @error-color;
+    }
+  }
 }
 
 // .grade-analysis
@@ -878,16 +1013,19 @@
     }
   }
 
-  .image-view-actions {
-    text-align: center;
-  }
-
   .standard-papers-none {
     padding-top: 200px;
     text-align: center;
     font-size: 24px;
     color: @dark-color-lighter;
   }
+  .standard-papers-list {
+    min-height: 500px;
+
+    .image-view-list .image-view {
+      height: 400px;
+    }
+  }
 }
 .change-standard-paper-dialog {
   .level-list {

+ 110 - 0
src/components/ImageViewContain.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="image-view-contain">
+    <div class="image-view-image" :style="styles">
+      <img
+        :src="image.thumbSrc"
+        :alt="image.title"
+        @click="toReview"
+        @load="resizeImage"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "image-view-contain",
+  props: {
+    image: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      styles: { width: "", height: "", top: "", left: "", transform: "" },
+      deg: 0
+    };
+  },
+  mounted() {
+    this.registWinResize();
+  },
+  beforeDestroy() {
+    window.removeEventListener("resize", () => {
+      this.resizeImage(this.deg);
+    });
+  },
+  methods: {
+    toReview() {
+      this.$emit("to-review");
+    },
+    registWinResize() {
+      window.addEventListener("resize", () => {
+        this.resizeImage(this.deg);
+      });
+    },
+    resizeImage(deg = 0) {
+      this.deg = deg;
+      const box = this.$el;
+      const imgDom = box.firstChild.firstChild;
+      const { naturalWidth, naturalHeight } = imgDom;
+      const imageSize = this.getImageSizePos({
+        win: {
+          width: box.clientWidth,
+          height: box.clientHeight
+        },
+        img: {
+          width: naturalWidth,
+          height: naturalHeight
+        },
+        rotate: deg
+      });
+      this.styles = Object.assign(this.styles, {
+        width: imageSize.width + "px",
+        height: imageSize.height + "px",
+        top: imageSize.top + "px",
+        left: imageSize.left + "px",
+        transform: `rotate(${deg}deg)`
+      });
+    },
+    getImageSizePos({ win, img, rotate }) {
+      const imageSize = {
+        width: 0,
+        height: 0,
+        top: 0,
+        left: 0
+      };
+      const isHorizontal = !!(rotate % 180);
+
+      const rateWin = isHorizontal
+        ? win.height / win.width
+        : win.width / win.height;
+      const hwin = isHorizontal
+        ? {
+            width: win.height,
+            height: win.width
+          }
+        : win;
+
+      const rateImg = img.width / img.height;
+
+      if (rateImg <= rateWin) {
+        imageSize.height = Math.min(hwin.height, img.height);
+        imageSize.width = Math.floor(
+          (imageSize.height * img.width) / img.height
+        );
+      } else {
+        imageSize.width = Math.min(hwin.width, img.width);
+        imageSize.height = Math.floor(
+          (imageSize.width * img.height) / img.width
+        );
+      }
+      imageSize.left = (win.width - imageSize.width) / 2;
+      imageSize.top = (win.height - imageSize.height) / 2;
+      return imageSize;
+    }
+  }
+};
+</script>

+ 1 - 1
src/components/PaperCarousel.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="paper-carousel">
-    <div class="carousel-body image-view-contain">
+    <div class="carousel-body">
       <img
         :src="curPaper.thumbSrc"
         :alt="curPaper.sn"

+ 30 - 17
src/components/ViewHeader.vue

@@ -1,29 +1,38 @@
 <template>
   <div :class="classes">
     <div class="head-main">
-      <div class="head-logo">
+      <!-- <div class="head-logo">
         <slot name="logo">
           <h1>美术阅卷系统</h1>
         </slot>
-      </div>
+      </div> -->
       <div class="head-user">
-        <span class="user-name"
-          ><Icon type="md-person" size="16" /> {{ username }}</span
-        >
-        <span class="user-name" @click="toResetPwd" v-if="showResetPwd"
-          >修改密码</span
-        >
-        <span class="user-logout" title="退出登录" @click="logout">
-          <Icon type="logout icon" size="20" />
-        </span>
+        <Dropdown placement="bottom-end" transfer @on-click="menuClick">
+          <span class="user-name"><Icon type="md-person" size="16" /> </span>
+          <DropdownMenu slot="list">
+            <DropdownItem>{{ username }}</DropdownItem>
+            <DropdownItem
+              v-if="showResetPwd"
+              class="color-default-hover"
+              divided
+              name="toResetPwd"
+              >修改密码</DropdownItem
+            >
+            <DropdownItem
+              class="color-error-hover"
+              divided
+              name="logout"
+              @click="logout"
+            >
+              退出登录
+            </DropdownItem>
+          </DropdownMenu>
+        </Dropdown>
       </div>
-      <div class="head-nav">
-        <slot name="navTop"></slot>
+      <div class="head-nav" v-if="$slots.navSub">
+        <slot name="navSub"></slot>
       </div>
     </div>
-    <div class="head-sub head-nav-sub" v-if="$slots.navSub">
-      <slot name="navSub"></slot>
-    </div>
 
     <reset-pwd ref="ResetPwd" v-if="showResetPwd"></reset-pwd>
   </div>
@@ -44,7 +53,7 @@ export default {
   },
   computed: {
     classes() {
-      return ["view-header", { "view-header-sub": this.$slots.navSub }];
+      return ["view-header"];
     }
   },
   data() {
@@ -53,6 +62,10 @@ export default {
     };
   },
   methods: {
+    menuClick(name) {
+      if (!name) return;
+      this[name]();
+    },
     toResetPwd() {
       this.$refs.ResetPwd.open();
     },

+ 6 - 1
src/constants/authority.js

@@ -103,6 +103,11 @@ export const grading = [
     title: "分档详情",
     icon: "ivu-icon-score-detail"
   },
+  {
+    name: "GradingAnalysis",
+    title: "分档统计",
+    icon: "ivu-icon-score-detail"
+  },
   {
     name: "GradingUserManage",
     title: "用户管理",
@@ -183,7 +188,7 @@ export const inspection = [
 
 const getLeadRouter = () => {
   let leadGrade = grading.map(item => item.name);
-  leadGrade.splice(2, 2);
+  leadGrade.splice(3, 2);
   let leadMark = mark.map(item => item.name);
   leadMark.splice(1, 1);
   leadMark.splice(2, 1);

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

@@ -29,7 +29,7 @@
       </div>
     </view-header>
     <view-header key="2" v-else>
-      <div class="home-navs" slot="navTop">
+      <div class="home-navs" slot="navSub">
         <ul>
           <li
             :class="{ act: curNav.name === nav.name }"
@@ -54,7 +54,7 @@
       <div class="home-main">
         <router-view />
 
-        <view-footer></view-footer>
+        <!-- <view-footer></view-footer> -->
       </div>
     </div>
   </div>
@@ -130,7 +130,7 @@ export default {
       if (this.IS_ADMIN) {
         this.navs = [...main.slice(0, 2), ...this.navs.slice(0, -2)];
       } else {
-        this.navs.splice(2, 2);
+        this.navs.splice(3, 2);
       }
     },
     actSubNav() {

+ 151 - 0
src/modules/grading/GradingAnalysis.vue

@@ -0,0 +1,151 @@
+<template>
+  <div class="grading-analysis">
+    <div class="part-box-head">
+      <div class="part-box-head-left">
+        <Form ref="FilterForm" label-position="left" inline>
+          <FormItem>
+            <Select
+              v-model="filter.questionId"
+              @on-change="areaChange"
+              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>
+      <div class="part-box-head-right">
+        <Button
+          shape="circle"
+          type="success"
+          icon="upload-white icon"
+          @click="toExport"
+          :load="isDownload"
+          >导出表格</Button
+        >
+      </div>
+    </div>
+    <grade-analysis
+      :question-id="filter.questionId"
+      :subject-id="subjectId"
+      ref="GradeAnalysis"
+      v-if="filter.questionId && subjectId"
+    ></grade-analysis>
+
+    <!-- grade-analysis-export -->
+    <grade-analysis-export
+      ref="GradeAnalysisExport"
+      :chart-data="renderChartData"
+      :page-info="renderPageInfo"
+      @on-exported="exportOver"
+      v-if="renderExportPage"
+    ></grade-analysis-export>
+  </div>
+</template>
+
+<script>
+import { areaList, subjectDetail } from "@/api";
+import GradeAnalysis from "./components/GradeAnalysis";
+import GradeAnalysisExport from "./components/GradeAnalysisExport";
+
+export default {
+  name: "grading-analysis",
+  components: { GradeAnalysis, GradeAnalysisExport },
+  data() {
+    return {
+      filter: {
+        questionId: "",
+        sort: "secretNumber"
+      },
+      workId: this.$route.params.workId,
+      subjectId: this.$route.params.subjectId,
+      areas: [],
+      curSubject: {},
+      // export
+      renderExportPage: false,
+      renderChartData: {},
+      renderPageInfo: {},
+      isDownload: false
+    };
+  },
+  computed: {
+    IS_ADMIN() {
+      return (
+        this.curUserRoleType === "ADMIN" ||
+        this.curUserRoleType === "SUPER_ADMIN"
+      );
+    }
+  },
+  mounted() {
+    this.subject = this.subjectId.split("-")[1];
+    this.curUserRoleType = this.$ls.get("user", { role: "" }).role;
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      await this.getSubjectDetail();
+      // 获取考区列表,一个考区对应一个questionId
+      await this.getAreaList();
+      this.filter.questionId = this.areas[0].id;
+    },
+    async getSubjectDetail() {
+      this.curSubject = await subjectDetail(this.subjectId);
+    },
+    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
+        };
+      });
+    },
+    areaChange() {
+      this.$nextTick(() => {
+        this.$refs.GradeAnalysis.initData();
+      });
+    },
+    // export
+    toExport() {
+      this.isDownload = true;
+      const curArea = this.areas.find(
+        item => item.id === this.filter.questionId
+      );
+      this.renderPageInfo = {
+        subjectName: this.curSubject.name,
+        areaName: curArea.areaName
+      };
+      this.renderChartData = {
+        levelData: this.$refs.GradeAnalysis.levelData,
+        lineChartData: this.$refs.GradeAnalysis.lineChartData
+      };
+      this.renderExportPage = true;
+    },
+    exportOver(result) {
+      if (!result) {
+        this.$Message.error("导出失败,请重新尝试!");
+      }
+      this.renderExportPage = false;
+      this.isDownload = false;
+    }
+  }
+};
+</script>

+ 100 - 190
src/modules/grading/GradingDetail.vue

@@ -1,95 +1,18 @@
 <template>
   <div :class="compClasses">
-    <div class="part-box-head grading-head">
-      <div class="part-box-head-left">
-        <Form ref="FilterForm" label-position="left" inline>
-          <FormItem>
-            <Select
-              v-model="filter.questionId"
-              @on-change="areaChange"
-              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>
-      <div class="part-box-head-right" v-if="curStep.name === 'analysis'">
-        <Button
-          shape="circle"
-          type="success"
-          icon="upload-white icon"
-          @click="toExport"
-          :load="isDownload"
-          >导出表格</Button
-        >
-      </div>
-    </div>
+    <grade-filter
+      ref="GradeFilter"
+      :data="workSubject"
+      @change="areaChange"
+    ></grade-filter>
     <grade-step
       :steps="steps"
+      :init-step="curStep"
       @on-change="stepChange"
       ref="GradeStep"
       v-if="steps.levelStep"
     ></grade-step>
-    <div class="detail-body clear-float" v-if="curStep.name !== 'analysis'">
-      <!-- detail-aciton -->
-      <div
-        :class="[
-          'detail-action',
-          { 'detail-action-fullscreen': isFullscreenMarking }
-        ]"
-        v-show="!multipleGradingList.length"
-      >
-        <grade-action
-          :cur-paper-or-task="curPaper"
-          :levels="levels"
-          :params-set="paramsSet"
-          @on-leader-level="leaderSelectLevel"
-          @on-code-search="serachPaperByCode"
-          ref="GradeAction"
-          v-if="curPaper.id"
-        ></grade-action>
-      </div>
-      <!-- multiple grading action -->
-      <div class="detail-action" v-show="multipleGradingList.length">
-        <div class="grade-action">
-          <div class="action-paper-state">
-            <p class="paper-state-cont">批量操作</p>
-          </div>
-          <div class="action-grade-list">
-            <div
-              class="action-grade-item"
-              v-for="(level, index) in levels"
-              :key="index"
-            >
-              <div
-                :class="[
-                  'action-grade-item-content',
-                  { 'action-item-content-disabled': multiplebtnClicked }
-                ]"
-                @click="multipleSelectLevel(level)"
-              >
-                <p>{{ level.name }}</p>
-                <p>{{ level.minScore }}~{{ level.maxScore }}</p>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
+    <div class="detail-body">
       <!-- detail-papers -->
       <div :class="detailPapersClasses">
         <div class="detail-papers-carousel">
@@ -105,10 +28,6 @@
             v-if="levels.length && filter.questionId"
             ref="GradeStandardPaper"
           ></grade-standard-paper>
-          <div
-            class="detail-papers-carousel-split"
-            v-if="ACTION_CAN_BATCH"
-          ></div>
           <grade-history-paper
             :question-id="filter.questionId"
             @on-paper-click="
@@ -130,24 +49,26 @@
               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="ACTION_CAN_BATCH">
-                <div
-                  :class="[
-                    'image-view-multibar',
-                    { 'image-view-selected': image.selected },
-                    { 'image-view-disabled': image.sample }
-                  ]"
-                  :title="image.sample ? '标准卷' : '选中批量操作'"
-                  @click="selectMultiplePaper(image)"
-                ></div>
+              <div class="image-view-container">
+                <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="ACTION_CAN_BATCH">
+                  <div
+                    :class="[
+                      'image-view-multibar',
+                      { 'image-view-selected': image.selected },
+                      { 'image-view-disabled': image.sample }
+                    ]"
+                    :title="image.sample ? '标准卷' : '选中批量操作'"
+                    @click="selectMultiplePaper(image)"
+                  ></div>
+                </div>
               </div>
             </div>
           </div>
@@ -166,14 +87,52 @@
           <p class="detail-papers-none">暂无数据</p>
         </div>
       </div>
-    </div>
-    <div class="detail-analysis" v-else>
-      <grade-analysis
-        :question-id="filter.questionId"
-        :subject-id="subjectId"
-        ref="GradeAnalysis"
-        v-if="filter.questionId && subjectId"
-      ></grade-analysis>
+      <!-- detail-aciton -->
+      <div
+        :class="[
+          'detail-action',
+          { 'detail-action-fullscreen': isFullscreenMarking }
+        ]"
+        v-show="!multipleGradingList.length"
+      >
+        <grade-action
+          :cur-paper-or-task="curPaper"
+          :levels="levels"
+          :params-set="paramsSet"
+          @on-leader-level="leaderSelectLevel"
+          @on-code-search="serachPaperByCode"
+          ref="GradeAction"
+          v-if="curPaper.id"
+        ></grade-action>
+      </div>
+      <!-- 占位 -->
+      <div class="detail-action" v-if="isFullscreenMarking"></div>
+      <!-- multiple grading action -->
+      <div class="detail-action" v-show="multipleGradingList.length">
+        <div class="grade-action">
+          <div class="action-paper-state">
+            <p class="paper-state-cont">批量操作</p>
+          </div>
+          <div class="action-grade-list">
+            <div
+              class="action-grade-item"
+              v-for="(level, index) in levels"
+              :key="index"
+            >
+              <div
+                :class="[
+                  'action-grade-item-content',
+                  { 'action-item-content-disabled': multiplebtnClicked }
+                ]"
+                @click="multipleSelectLevel(level)"
+              >
+                <p>{{ level.name }}</p>
+                <p>{{ level.minScore }}~{{ level.maxScore }}</p>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
     </div>
 
     <!-- image-preview -->
@@ -202,14 +161,6 @@
       @canceled="leaderGradingCancel"
       ref="ModifyLeaderGrading"
     ></modify-leader-grading>
-    <!-- grade-analysis-export -->
-    <grade-analysis-export
-      ref="GradeAnalysisExport"
-      :chart-data="renderChartData"
-      :page-info="renderPageInfo"
-      @on-exported="exportOver"
-      v-if="renderExportPage"
-    ></grade-analysis-export>
   </div>
 </template>
 
@@ -217,7 +168,6 @@
 import {
   paperList,
   levelStatData,
-  areaList,
   workLevelList,
   taskSnSearch,
   subjectDetail,
@@ -226,13 +176,12 @@ import {
   leaderGradingPaper
 } from "@/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
+import GradeFilter from "./components/GradeFilter";
 import GradeStep from "./components/GradeStep";
 import GradeStandardPaper from "./components/GradeStandardPaper";
 import GradeHistoryPaper from "./components/GradeHistoryPaper";
 import GradeAction from "./components/GradeAction";
-import GradeAnalysis from "./components/GradeAnalysis";
 import ModifyLeaderGrading from "./components/ModifyLeaderGrading";
-import GradeAnalysisExport from "./components/GradeAnalysisExport";
 // 三种情况:
 // 管理员(ADMIN),科组长(MARK_LEADER),评卷员(MARKER)
 // 管理员:标准卷,试卷列表,操作盘
@@ -245,13 +194,12 @@ export default {
   name: "grading-detail",
   components: {
     SimpleImagePreview,
+    GradeFilter,
     GradeStep,
     GradeHistoryPaper,
     GradeStandardPaper,
     GradeAction,
-    GradeAnalysis,
-    ModifyLeaderGrading,
-    GradeAnalysisExport
+    ModifyLeaderGrading
   },
   data() {
     return {
@@ -273,16 +221,17 @@ export default {
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subject: "",
+      workSubject: {},
       curSubject: {},
       curUserRoleType: "MARKER",
       current: 1,
       size: 6,
       total: 0,
       totalPage: 1,
-      curStep: { type: "analysis", name: "analysis" },
+      curStep: { type: "", name: "" },
       steps: {},
       levels: [],
-      areas: [],
+      curArea: {},
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
@@ -297,17 +246,16 @@ export default {
       isFullscreenMarking: false,
       // multiple grading
       multiplebtnClicked: false,
-      multipleGradingList: [],
-      // export
-      renderExportPage: false,
-      renderChartData: {},
-      renderPageInfo: {},
-      isDownload: false
+      multipleGradingList: []
     };
   },
   computed: {
     compClasses() {
-      return ["grading-detail", { "grading-operation": this.IS_MARK_LEADER }];
+      return [
+        "page-container-flex",
+        "grading-detail",
+        { "grading-operation": this.IS_MARK_LEADER }
+      ];
     },
     detailPapersClasses() {
       return ["detail-papers", `detail-papers-col-${1 + this.size / 2}`];
@@ -337,22 +285,21 @@ export default {
         : "grading-operation-image-preview";
     }
   },
-  mounted() {
+  created() {
     this.subject = this.subjectId.split("-")[1];
+    this.workSubject = {
+      workId: this.workId,
+      subject: this.subject
+    };
     this.curUserRoleType = this.$ls.get("user", { role: "" }).role;
     this.initData();
   },
   methods: {
     async initData() {
-      this.getParamsSetInfo();
+      await this.getParamsSetInfo();
       await this.getSubjectDetail();
       // 获取档位列表
       this.getWorkLevels();
-      // 获取考区列表,一个考区对应一个questionId
-      await this.getAreaList();
-      this.filter.questionId = this.areas[0].id;
-      // 获取顶部档位导航
-      this.getStepLevels();
     },
     async getParamsSetInfo() {
       this.paramsSet = await getParamsSet(this.workId);
@@ -425,6 +372,10 @@ export default {
         };
       });
       this.steps = { levelStep, otherStep };
+
+      if (!this.curStep.type) {
+        this.curStep = levelStep[0];
+      }
     },
     async getWorkLevels() {
       const data = await workLevelList(this.workId);
@@ -437,22 +388,8 @@ export default {
         };
       });
     },
-    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 stepChange(step) {
       this.curStep = step;
-      if (step.type === "analysis") return;
 
       this.current = 1;
       await this.getList();
@@ -462,15 +399,11 @@ export default {
         this.curPaper = {};
       }
     },
-    areaChange() {
-      this.getStepLevels();
-      if (this.curStep.type === "analysis") {
-        this.$nextTick(() => {
-          this.$refs.GradeAnalysis.initData();
-        });
-      } else {
-        this.toPage(1);
-      }
+    async areaChange(curArea) {
+      this.curArea = curArea;
+      this.filter.questionId = curArea.id;
+      await this.getStepLevels();
+      this.toPage(1);
     },
     // selectMultiplePaper
     selectMultiplePaper(paper) {
@@ -680,29 +613,6 @@ export default {
     standardPaperChange(curPaper) {
       if (!this.isFullscreenMarking) return;
       this.curPaper = { ...curPaper };
-    },
-    // export
-    toExport() {
-      this.isDownload = true;
-      const curArea = this.areas.find(
-        item => item.id === this.filter.questionId
-      );
-      this.renderPageInfo = {
-        subjectName: this.$parent.curSubject.name,
-        areaName: curArea.areaName
-      };
-      this.renderChartData = {
-        levelData: this.$refs.GradeAnalysis.levelData,
-        lineChartData: this.$refs.GradeAnalysis.lineChartData
-      };
-      this.renderExportPage = true;
-    },
-    exportOver(result) {
-      if (!result) {
-        this.$Message.error("导出失败,请重新尝试!");
-      }
-      this.renderExportPage = false;
-      this.isDownload = false;
     }
   }
 };

+ 139 - 174
src/modules/grading/GradingOperation.vue

@@ -2,171 +2,149 @@
   <div class="grading-operation home">
     <view-header></view-header>
     <div class="home-body">
-      <div class="home-main grading-detail">
-        <div class="part-box-head grading-head">
-          <div class="part-box-head-left">
-            <Form ref="FilterForm" label-position="left" inline>
-              <FormItem>
-                <Select
-                  v-model="filter.questionId"
-                  @on-change="areaChange"
-                  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>
-        </div>
-        <grade-step
-          :steps="steps"
-          :init-step="curStep"
-          :show-analysis="false"
-          @on-change="stepChange"
-          ref="GradeStep"
-          v-if="steps.levelStep"
-        ></grade-step>
-        <div class="detail-body clear-float">
-          <!-- detail-aciton -->
-          <div
-            :class="[
-              'detail-action',
-              { 'detail-action-fullscreen': isFullscreenMarking }
-            ]"
-            v-show="!multipleGradingList.length"
-          >
-            <grade-action
-              :cur-paper-or-task="curPaper"
-              :levels="levels"
-              :params-set="paramsSet"
-              @on-select-level="gradeCurPaper"
-              @on-pass="passCurPaper"
-              ref="GradeAction"
-              v-if="curPaper.id"
-            ></grade-action>
-          </div>
-          <!-- multiple grading action -->
-          <div class="detail-action" v-show="multipleGradingList.length">
-            <div class="grade-action">
-              <div class="action-paper-state">
-                <p class="paper-state-cont">批量分档</p>
+      <div class="home-main">
+        <div class="grading-detail page-container-flex">
+          <grade-filter
+            ref="GradeFilter"
+            :data="workSubject"
+            @change="areaChange"
+          ></grade-filter>
+          <grade-step
+            :steps="steps"
+            :init-step="curStep"
+            @on-change="stepChange"
+            ref="GradeStep"
+            v-if="steps.levelStep"
+          ></grade-step>
+          <div class="detail-body">
+            <!-- detail-papers -->
+            <div :class="detailPapersClasses">
+              <div class="detail-papers-carousel">
+                <grade-standard-paper
+                  :levels="levels"
+                  :question-id="filter.questionId"
+                  @on-paper-click="
+                    (index, papers) => {
+                      toViewCarouselPaper(index, papers, 'sample');
+                    }
+                  "
+                  @on-paper-change="standardPaperChange"
+                  v-if="levels.length && filter.questionId"
+                  ref="GradeStandardPaper"
+                ></grade-standard-paper>
+                <grade-history-paper
+                  :question-id="filter.questionId"
+                  @on-paper-click="
+                    (index, papers) => {
+                      toViewCarouselPaper(index, papers, 'history');
+                    }
+                  "
+                  v-if="filter.questionId"
+                  ref="GradeHistoryPaper"
+                ></grade-history-paper>
               </div>
-              <div class="action-grade-list">
-                <div
-                  class="action-grade-item"
-                  v-for="(level, index) in levels"
-                  :key="index"
-                >
+              <div class="detail-papers-list" v-if="papers.length">
+                <div :class="imageViewClasses">
                   <div
                     :class="[
-                      'action-grade-item-content',
-                      { 'action-item-content-disabled': multiplebtnClicked }
+                      'image-view',
+                      {
+                        'image-view-act':
+                          curPaperIndex === index || image.selected
+                      }
                     ]"
-                    @click="multipleSelectLevel(level)"
+                    v-for="(image, index) in papers"
+                    :key="index"
                   >
-                    <p>{{ level.name }}</p>
-                    <p>{{ level.minScore }}~{{ level.maxScore }}</p>
+                    <div class="image-view-container">
+                      <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">
+                        <div
+                          :class="[
+                            'image-view-multibar',
+                            { 'image-view-selected': image.selected },
+                            { 'image-view-disabled': image.sample }
+                          ]"
+                          :title="image.sample ? '标准卷' : '选中批量分档'"
+                          @click="selectMultiplePaper(image)"
+                        ></div>
+                      </div>
+                    </div>
                   </div>
                 </div>
+                <div class="part-page">
+                  <Page
+                    :current="current"
+                    :total="total"
+                    :page-size="size"
+                    show-total
+                    show-elevator
+                    show-sizer
+                    :page-size-opts="[4, 6, 8]"
+                    @on-page-size-change="pageSizeChange"
+                    @on-change="toPage"
+                  ></Page>
+                </div>
+              </div>
+              <div class="detail-papers-list" v-else>
+                <p class="detail-papers-none">暂无数据</p>
               </div>
             </div>
-          </div>
-          <!-- detail-papers -->
-          <div :class="detailPapersClasses">
-            <div class="detail-papers-carousel">
-              <grade-standard-paper
+            <!-- detail-aciton -->
+            <div
+              :class="[
+                'detail-action',
+                { 'detail-action-fullscreen': isFullscreenMarking }
+              ]"
+              v-show="!multipleGradingList.length"
+            >
+              <grade-action
+                :cur-paper-or-task="curPaper"
                 :levels="levels"
-                :question-id="filter.questionId"
-                @on-paper-click="
-                  (index, papers) => {
-                    toViewCarouselPaper(index, papers, 'sample');
-                  }
-                "
-                @on-paper-change="standardPaperChange"
-                v-if="levels.length && filter.questionId"
-                ref="GradeStandardPaper"
-              ></grade-standard-paper>
-              <div class="detail-papers-carousel-split"></div>
-              <grade-history-paper
-                :question-id="filter.questionId"
-                @on-paper-click="
-                  (index, papers) => {
-                    toViewCarouselPaper(index, papers, 'history');
-                  }
-                "
-                v-if="filter.questionId"
-                ref="GradeHistoryPaper"
-              ></grade-history-paper>
+                :params-set="paramsSet"
+                @on-select-level="gradeCurPaper"
+                @on-pass="passCurPaper"
+                ref="GradeAction"
+                v-if="curPaper.id"
+              ></grade-action>
             </div>
-            <div class="detail-papers-list" v-if="papers.length">
-              <div :class="imageViewClasses">
-                <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">
+            <!-- 占位 -->
+            <div class="detail-action" v-if="isFullscreenMarking"></div>
+            <!-- multiple grading action -->
+            <div class="detail-action" v-show="multipleGradingList.length">
+              <div class="grade-action">
+                <div class="action-paper-state">
+                  <p class="paper-state-cont">批量分档</p>
+                </div>
+                <div class="action-grade-list">
+                  <div
+                    class="action-grade-item"
+                    v-for="(level, index) in levels"
+                    :key="index"
+                  >
                     <div
                       :class="[
-                        'image-view-multibar',
-                        { 'image-view-selected': image.selected },
-                        { 'image-view-disabled': image.sample }
+                        'action-grade-item-content',
+                        { 'action-item-content-disabled': multiplebtnClicked }
                       ]"
-                      :title="image.sample ? '标准卷' : '选中批量分档'"
-                      @click="selectMultiplePaper(image)"
-                    ></div>
+                      @click="multipleSelectLevel(level)"
+                    >
+                      <p>{{ level.name }}</p>
+                      <p>{{ level.minScore }}~{{ level.maxScore }}</p>
+                    </div>
                   </div>
                 </div>
               </div>
-              <div class="part-page">
-                <Page
-                  :current="current"
-                  :total="total"
-                  :page-size="size"
-                  show-total
-                  show-elevator
-                  show-sizer
-                  :page-size-opts="[4, 6, 8]"
-                  @on-page-size-change="pageSizeChange"
-                  @on-change="toPage"
-                ></Page>
-              </div>
-            </div>
-            <div class="detail-papers-list" v-else>
-              <p class="detail-papers-none">暂无数据</p>
             </div>
           </div>
         </div>
-
-        <view-footer></view-footer>
       </div>
     </div>
 
@@ -196,15 +174,14 @@
 import {
   markerTaskList,
   markerLevelTotalStatData,
-  areaList,
   getParamsSet,
   workLevelList,
-  subjectDetail,
   paperSelectLevelOrScore,
   paperSelectLevelBatch,
   paperTaskPass
 } from "@/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
+import GradeFilter from "./components/GradeFilter";
 import GradeStep from "./components/GradeStep";
 import GradeStandardPaper from "./components/GradeStandardPaper";
 import GradeHistoryPaper from "./components/GradeHistoryPaper";
@@ -221,6 +198,7 @@ export default {
   name: "grading-operation",
   components: {
     SimpleImagePreview,
+    GradeFilter,
     GradeStep,
     GradeHistoryPaper,
     GradeStandardPaper,
@@ -246,6 +224,7 @@ export default {
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subject: "",
+      workSubject: {},
       curSubject: {},
       curUserRoleType: "MARKER",
       current: 1,
@@ -254,9 +233,9 @@ export default {
       totalPage: 1,
       curStep: null,
       curStandardGradeId: "",
-      steps: [],
+      steps: {},
       levels: [],
-      areas: [],
+      curArea: {},
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
@@ -279,25 +258,22 @@ export default {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
     }
   },
-  mounted() {
+  created() {
     this.subject = this.subjectId.split("-")[1];
+    this.workSubject = {
+      workId: this.workId,
+      subject: this.subject
+    };
     this.initData();
   },
   methods: {
     async initData() {
-      this.getParamsSetInfo();
-      this.getWorkLevels();
-
-      await this.getAreaList();
-      this.filter.questionId = this.areas[0].id;
-      this.getStepLevels();
+      await this.getParamsSetInfo();
+      await this.getWorkLevels();
     },
     async getParamsSetInfo() {
       this.paramsSet = await getParamsSet(this.workId);
     },
-    async getSubjectDetail() {
-      this.curSubject = await subjectDetail(this.subjectId);
-    },
     async getList() {
       this.multipleGradingList = [];
       const datas = {
@@ -409,19 +385,6 @@ export default {
         };
       });
     },
-    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
-        };
-      });
-    },
     pageSizeChange(size) {
       this.size = size;
       this.toPage(1);
@@ -439,8 +402,10 @@ export default {
         this.curPaper = {};
       }
     },
-    areaChange() {
-      this.getStepLevels();
+    async areaChange(curArea) {
+      this.curArea = curArea;
+      this.filter.questionId = curArea.id;
+      await this.getStepLevels();
       this.toPage(1);
       this.updateHistory();
     },

+ 23 - 24
src/modules/grading/GradingStandardPaperManage.vue

@@ -47,33 +47,32 @@
     <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 }
-          ]"
+          :class="['image-view']"
           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">
-            <Button
-              type="error"
-              size="small"
-              @click="cancelPaper(image)"
-              :disabled="image.loading"
-              v-if="canCancel"
-              >取消</Button
-            >
-            <Button type="primary" size="small" @click="toChangePaper(image)"
-              >修改</Button
-            >
+          <div class="image-view-container">
+            <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">
+              <Button
+                type="error"
+                size="small"
+                @click="cancelPaper(image)"
+                :disabled="image.loading"
+                v-if="canCancel"
+                >取消</Button
+              >
+              <Button type="primary" size="small" @click="toChangePaper(image)"
+                >修改</Button
+              >
+            </div>
           </div>
         </div>
       </div>

+ 94 - 0
src/modules/grading/components/GradeFilter.vue

@@ -0,0 +1,94 @@
+<template>
+  <div
+    :class="['grade-filter', { 'grade-filter-select': selectIsShow }]"
+    title="点击切换考区"
+  >
+    <div class="detail-area" @click="selectIsShow = true">
+      <span>{{ curArea.areaName }}</span>
+      <Icon type="md-arrow-dropdown" />
+    </div>
+    <Form
+      class="grade-filter-form"
+      ref="FilterForm"
+      label-position="left"
+      inline
+    >
+      <FormItem>
+        <Select v-model="questionId" placeholder="选择考区" transfer>
+          <Option
+            v-for="area in areas"
+            :key="area.id"
+            :value="area.id"
+            :label="area.areaName"
+          ></Option>
+        </Select>
+      </FormItem>
+      <FormItem>
+        <Button size="small" type="primary" @click="confrim">查询</Button>
+      </FormItem>
+      <FormItem>
+        <Button size="small" @click="cancel">取消</Button>
+      </FormItem>
+    </Form>
+  </div>
+</template>
+
+<script>
+import { areaList } from "@/api";
+
+export default {
+  name: "grade-filter",
+  props: {
+    data: {
+      type: Object,
+      default() {
+        return {
+          workId: "",
+          subject: ""
+        };
+      }
+    }
+  },
+  data() {
+    return {
+      questionId: "",
+      areas: [],
+      curArea: {},
+      selectIsShow: false
+    };
+  },
+  mounted() {
+    this.getAreaList();
+  },
+  methods: {
+    async getAreaList() {
+      const data = await areaList({
+        workId: this.data.workId,
+        subject: this.data.subject
+      });
+      this.areas = data.map(item => {
+        return {
+          id: item.id,
+          areaName: item.areaName,
+          areaCode: item.areaCode
+        };
+      });
+
+      if (!this.curArea.id) {
+        this.curArea = this.areas[0];
+        this.questionId = this.curArea.id;
+        this.confrim();
+      }
+    },
+    confrim() {
+      const curArea = this.areas.find(item => item.id === this.questionId);
+      this.curArea = curArea;
+      this.selectIsShow = false;
+      this.$emit("change", this.curArea);
+    },
+    cancel() {
+      this.selectIsShow = false;
+    }
+  }
+};
+</script>

+ 0 - 17
src/modules/grading/components/GradeStep.vue

@@ -22,16 +22,6 @@
       </div>
     </div>
     <div class="grade-step-level">
-      <div
-        class="step-item"
-        v-if="showAnalysis"
-        :class="['step-analysis', { 'step-act': curStep.name === 'analysis' }]"
-        @click="selectAnalysis"
-      >
-        <p>&nbsp;</p>
-        <p class="step-name">图表</p>
-        <p>&nbsp;</p>
-      </div>
       <div
         v-for="(step, sindex) in steps.levelStep"
         :key="sindex"
@@ -62,10 +52,6 @@
 export default {
   name: "grade-step",
   props: {
-    showAnalysis: {
-      type: Boolean,
-      default: true
-    },
     steps: {
       type: Object,
       default() {
@@ -91,9 +77,6 @@ export default {
     selectStep(step) {
       this.curStep = { ...step };
       this.$emit("on-change", this.curStep);
-    },
-    selectAnalysis() {
-      this.selectStep({ type: "analysis", name: "analysis" });
     }
   }
 };

+ 3 - 0
src/modules/grading/components/ModifyGradingUser.vue

@@ -102,6 +102,7 @@
       >
         <Select
           v-model="modalForm.leaderConfirm"
+          size="large"
           placeholder="请选择"
           @on-change="leaderConfirmChange"
         >
@@ -123,6 +124,7 @@
             v-for="(val, key) in MARK_LEADER_RIGHTS"
             :key="key"
             :label="key"
+            style="line-height: 40px;"
           >
             {{ val.name }}
           </Checkbox>
@@ -132,6 +134,7 @@
             v-for="(val, key) in MARK_LEADER_RIGHTS"
             :key="key"
             :label="key"
+            style="line-height: 40px;"
             >{{ val.name }}</Radio
           >
         </RadioGroup>

+ 1 - 1
src/modules/inspection/Inspection.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="inspection home">
     <view-header>
-      <div class="home-navs" slot="navTop">
+      <div class="home-navs" slot="navSub">
         <ul>
           <li
             :class="{ act: curNav.name === nav.name }"

+ 38 - 33
src/modules/inspection/InspectionGrading.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="inspection-grading">
+  <div class="inspection-grading page-container-flex">
     <div class="part-box part-box-filter">
       <Form ref="FilterForm" label-position="left" inline>
         <FormItem>
@@ -69,6 +69,41 @@
     </div>
 
     <div class="check-grade" v-if="papers.length">
+      <!-- paper-list -->
+      <div class="check-grade-body part-box">
+        <div class="check-grade-list image-view-list image-view-list-4">
+          <div
+            :class="[
+              'image-view',
+              { 'image-view-act': curPaperIndex === index }
+            ]"
+            v-for="(image, index) in papers"
+            :key="index"
+          >
+            <div class="image-view-container">
+              <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>
+          </div>
+        </div>
+        <div class="part-page" v-if="total > size">
+          <Page
+            :current="current"
+            :total="total"
+            :page-size="size"
+            show-total
+            show-elevator
+            @on-change="toPage"
+          ></Page>
+        </div>
+      </div>
+      <!-- action -->
       <div
         :class="[
           'check-grade-action',
@@ -110,38 +145,8 @@
           >
         </div>
       </div>
-
-      <div class="check-grade-body part-box">
-        <div class="check-grade-list image-view-list image-view-list-4">
-          <div
-            :class="[
-              'image-view',
-              { 'image-view-act': curPaperIndex === index }
-            ]"
-            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>
-        </div>
-        <div class="part-page" v-if="total > size">
-          <Page
-            :current="current"
-            :total="total"
-            :page-size="size"
-            show-total
-            show-elevator
-            @on-change="toPage"
-          ></Page>
-        </div>
-      </div>
+      <!-- 占位 -->
+      <div class="check-grade-action" v-if="isFullscreenMarking"></div>
     </div>
     <div class="check-grade" v-else>
       <p class="check-grade-none">暂无数据</p>

+ 1 - 1
src/modules/main/ClientMonitor.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="client-monitor">
+  <div class="client-monitor page-container-flex">
     <div class="page-reload" @click="getList"><Icon type="md-refresh" /></div>
 
     <div class="image-view-list image-view-list-5">

+ 1 - 1
src/modules/main/Main.vue

@@ -26,7 +26,7 @@
       <div class="home-main">
         <router-view />
 
-        <view-footer></view-footer>
+        <!-- <view-footer></view-footer> -->
       </div>
     </div>
   </div>

+ 12 - 7
src/modules/main/PaperManage.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="papers">
+  <div class="paper-manage page-container-flex">
     <div class="part-box part-box-filter">
       <Form ref="FilterForm" label-position="left" inline>
         <FormItem>
@@ -123,7 +123,7 @@ import ImageActionList from "./components/ImageActionList";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 
 export default {
-  name: "papers",
+  name: "paper-manage",
   components: { ImageActionList, SimpleImagePreview },
   data() {
     return {
@@ -136,11 +136,12 @@ export default {
         subject: "",
         sortBy: "",
         isManual: null,
-        missing: null
+        missing: null,
+        isRelate: null
       },
       SORT_RULE_TYPE,
       CAFA_EXCEPTION_TYPE: {},
-      paperType: "2",
+      paperType: "9",
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
@@ -153,7 +154,7 @@ export default {
     };
   },
   mounted() {
-    this.CAFA_EXCEPTION_TYPE = { ...CAFA_EXCEPTION_TYPE, 2: "全部" };
+    this.CAFA_EXCEPTION_TYPE = { ...CAFA_EXCEPTION_TYPE, 9: "全部" };
     this.initData();
   },
   methods: {
@@ -229,17 +230,21 @@ export default {
     },
     typeChange() {
       if (this.paperType === "2") {
-        // TODO:
-        // 关联考号,调原图
+        this.filter.isManual = null;
+        this.filter.missing = null;
+        this.filter.isRelate = true;
       } else if (this.paperType === "1") {
         this.filter.isManual = true;
         this.filter.missing = null;
+        this.filter.isRelate = null;
       } else if (this.paperType === "0") {
         this.filter.isManual = null;
         this.filter.missing = true;
+        this.filter.isRelate = null;
       } else {
         this.filter.isManual = null;
         this.filter.missing = null;
+        this.filter.isRelate = null;
       }
     },
     // paper view

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

@@ -1,6 +1,6 @@
 <template>
   <div class="quality-analysis">
-    <div class="part-box part-box-head">
+    <div class="part-box part-box-filter part-box-head">
       <div class="part-box-head-left">
         <Form label-position="left" inline>
           <FormItem>

+ 1 - 1
src/modules/main/StudentScore.vue

@@ -97,7 +97,7 @@
       <div class="score-content-body">
         <image-action-list
           :data="curStudent.scores"
-          :column-number="3"
+          :column-number="curStudent.scores.length"
           loop
           ref="ImageActionList"
         ></image-action-list>

+ 34 - 31
src/modules/main/WorkManage.vue

@@ -1,40 +1,42 @@
 <template>
-  <div class="work home">
+  <div class="home">
     <view-header class="home-header" :show-reset-pwd="false"></view-header>
 
     <div class="home-body">
       <div class="home-main">
-        <div class="part-box-head">
-          <Form label-position="left" inline>
-            <FormItem>
-              <Input
-                v-model.trim="modalForm.name"
-                placeholder="工作名称"
-                clearable
-              ></Input>
-            </FormItem>
-            <FormItem :label-width="0">
-              <Button
-                size="small"
-                type="success"
-                icon="recode-white icon"
-                shape="circle"
-                @click="toAdd"
-                >新增工作文件</Button
-              >
-            </FormItem>
-          </Form>
+        <div class="work-manage">
+          <div class="part-box-head">
+            <Form label-position="left" inline>
+              <FormItem>
+                <Input
+                  v-model.trim="modalForm.name"
+                  placeholder="工作名称"
+                  clearable
+                ></Input>
+              </FormItem>
+              <FormItem :label-width="0">
+                <Button
+                  size="small"
+                  type="success"
+                  icon="recode-white icon"
+                  shape="circle"
+                  @click="toAdd"
+                  >新增工作文件</Button
+                >
+              </FormItem>
+            </Form>
+          </div>
+          <Table
+            ref="TableList"
+            :columns="columns"
+            :data="works"
+            :row-class-name="rowClassName"
+            disabled-hover
+            border
+          ></Table>
         </div>
-        <Table
-          ref="TableList"
-          :columns="columns"
-          :data="works"
-          :row-class-name="rowClassName"
-          disabled-hover
-          border
-        ></Table>
 
-        <view-footer></view-footer>
+        <!-- <view-footer></view-footer> -->
       </div>
     </div>
   </div>
@@ -42,8 +44,9 @@
 
 <script>
 import { workList, createWork, activeWork, deleteWork } from "@/api";
+
 export default {
-  name: "work",
+  name: "work-manage",
   data() {
     return {
       modalForm: {

+ 11 - 1
src/modules/main/components/ImageActionList.vue

@@ -3,10 +3,17 @@
     <div class="image-view" v-for="(image, index) in data" :key="image.id">
       <div class="image-view-container">
         <h5 class="image-view-title">{{ image.title }}</h5>
-        <div class="image-view-contain" :style="image.styles">
+        <image-view-contain
+          v-if="canRotate"
+          :ref="`image${image.id}`"
+          :image="image"
+          @to-review="toReview(index)"
+        ></image-view-contain>
+        <div v-else class="image-view-contain">
           <img
             :src="image.thumbSrc"
             :alt="image.title"
+            :style="image.styles"
             @click="toReview(index)"
           />
         </div>
@@ -43,9 +50,11 @@
 
 <script>
 import { rotatePaper, absentPaper } from "@/api";
+import ImageViewContain from "../../../components/ImageViewContain";
 
 export default {
   name: "image-action-list",
+  components: { ImageViewContain },
   props: {
     data: {
       type: Array,
@@ -96,6 +105,7 @@ export default {
       image.styles = {
         transform: `rotate(${image.deg}deg)`
       };
+      this.$refs[`image${image.id}`][0].resizeImage(image.deg);
     },
     async toSaveRotate(image) {
       if (this.saving) return;

+ 54 - 88
src/modules/mark/MarkDetail.vue

@@ -1,42 +1,10 @@
 <template>
   <div :class="compClasses">
-    <div class="part-box-head">
-      <Form
-        class="part-box-head-left"
-        ref="FilterForm"
-        label-position="left"
-        inline
-      >
-        <FormItem>
-          <Select
-            v-model="filter.questionId"
-            @on-change="areaChange"
-            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">
-        <Button icon="upload icon" shape="circle" @click="toExport"
-          >导出改档信息</Button
-        >
-      </div>
-    </div>
+    <grade-filter
+      ref="GradeFilter"
+      :data="workSubject"
+      @change="areaChange"
+    ></grade-filter>
     <mark-step
       :steps="steps"
       :init-step="curStep"
@@ -45,23 +13,6 @@
       v-if="steps.levelStep"
     ></mark-step>
     <div class="detail-body clear-float">
-      <!-- detail-aciton -->
-      <div
-        :class="[
-          'detail-action',
-          { 'detail-action-fullscreen': isFullscreenMarking }
-        ]"
-      >
-        <mark-action
-          :cur-paper-or-task="curPaper"
-          :levels="levels"
-          @on-leader-level="leaderSelectLevel"
-          @on-code-search="serachPaperByCode"
-          @on-grade-change-search="searchGradeChangeList"
-          v-if="curPaper.id"
-          ref="MarkAction"
-        ></mark-action>
-      </div>
       <!-- detail-papers -->
       <div :class="detailPapersClasses">
         <div class="detail-papers-carousel" v-if="!IS_ADMIN">
@@ -83,16 +34,20 @@
               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)"
-                />
-                <span class="image-info" v-if="image.score || image.score === 0"
-                  >{{ image.score }}分</span
-                >
+              <div class="image-view-container">
+                <h5 class="image-view-title">{{ image.title }}</h5>
+                <div class="image-view-contain">
+                  <img
+                    :src="image.thumbSrc"
+                    :alt="image.title"
+                    @click="toReview(index)"
+                  />
+                  <span
+                    class="image-info"
+                    v-if="image.score || image.score === 0"
+                    >{{ image.score }}分</span
+                  >
+                </div>
               </div>
             </div>
           </div>
@@ -111,6 +66,25 @@
           <p class="detail-papers-none">暂无数据</p>
         </div>
       </div>
+      <!-- detail-aciton -->
+      <div
+        :class="[
+          'detail-action',
+          { 'detail-action-fullscreen': isFullscreenMarking }
+        ]"
+      >
+        <mark-action
+          :cur-paper-or-task="curPaper"
+          :levels="levels"
+          @on-leader-level="leaderSelectLevel"
+          @on-code-search="serachPaperByCode"
+          @on-grade-change-search="searchGradeChangeList"
+          v-if="curPaper.id"
+          ref="MarkAction"
+        ></mark-action>
+      </div>
+      <!-- 占位 -->
+      <div class="detail-action" v-if="isFullscreenMarking"></div>
     </div>
 
     <!-- image-preview -->
@@ -139,13 +113,13 @@ import {
   paperList,
   changeLevelPaperList,
   scoreStatData,
-  areaList,
   workLevelList,
   taskSnSearch,
   markStepChangeLevel
 } from "@/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import MarkStep from "./components/MarkStep";
+import GradeFilter from "../grading/components/GradeFilter";
 import GradeHistoryPaper from "../grading/components/GradeHistoryPaper";
 import MarkAction from "./components/MarkAction";
 // 三种情况:
@@ -161,6 +135,7 @@ export default {
   components: {
     SimpleImagePreview,
     MarkStep,
+    GradeFilter,
     GradeHistoryPaper,
     MarkAction
   },
@@ -173,16 +148,17 @@ export default {
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subject: "",
+      workSubject: {},
       curUserRoleType: "",
       applyChangeLevelStatus: 1, // 改档申请处理状态
       current: 1,
       size: 6,
       total: 0,
       totalPage: 1,
-      curStep: null,
+      curStep: { type: "", name: "" },
       steps: [],
       levels: [],
-      areas: [],
+      curArea: {},
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
@@ -195,6 +171,7 @@ export default {
   computed: {
     compClasses() {
       return [
+        "page-container-flex",
         "mark-detail",
         "grading-detail",
         { "grading-operation": this.IS_MARK_LEADER }
@@ -230,19 +207,19 @@ export default {
         : "grading-operation-image-preview";
     }
   },
-  mounted() {
+  created() {
     this.subject = this.subjectId.split("-")[1];
+    this.workSubject = {
+      workId: this.workId,
+      subject: this.subject
+    };
     this.curUserRoleType = this.$ls.get("user", { role: "" }).role;
     if (this.curUserRoleType === "ADMIN") this.size = 8;
     this.initData();
   },
   methods: {
-    async initData() {
+    initData() {
       this.getWorkLevels();
-
-      await this.getAreaList();
-      this.filter.questionId = this.areas[0].id;
-      this.getStepLevels();
     },
     async getList() {
       let data = [];
@@ -321,19 +298,6 @@ export default {
         };
       });
     },
-    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 stepChange(step) {
       this.applyChangeLevelStatus = 1;
       this.curStep = step;
@@ -345,8 +309,10 @@ export default {
         this.curPaper = {};
       }
     },
-    areaChange() {
-      this.getStepLevels();
+    async areaChange(curArea) {
+      this.curArea = curArea;
+      this.filter.questionId = curArea.id;
+      await this.getStepLevels();
       this.toPage(1);
     },
     toReview(index) {

+ 2 - 2
src/modules/mark/MarkHome.vue

@@ -28,7 +28,7 @@
       </div>
     </view-header>
     <view-header key="2" v-else>
-      <div class="home-navs" slot="navTop">
+      <div class="home-navs" slot="navSub">
         <ul>
           <li
             :class="{ act: curNav.name === nav.name }"
@@ -53,7 +53,7 @@
       <div class="home-main">
         <router-view />
 
-        <view-footer></view-footer>
+        <!-- <view-footer></view-footer> -->
       </div>
     </div>
   </div>

+ 97 - 131
src/modules/mark/MarkOperation.vue

@@ -3,115 +3,97 @@
     <view-header> </view-header>
     <div class="home-body">
       <div class="home-main grading-detail">
-        <div class="part-box-head grading-head">
-          <Form ref="FilterForm" label-position="left" inline>
-            <FormItem>
-              <Select
-                v-model="filter.questionId"
-                @on-change="areaChange"
-                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>
-        <mark-step
-          :steps="steps"
-          :init-step="curStep"
-          :show-top-number="false"
-          @on-change="stepChange"
-          ref="MarkStep"
-          v-if="steps.levelStep"
-        ></mark-step>
-        <div class="detail-body clear-float">
-          <!-- detail-aciton -->
-          <div
-            :class="[
-              'detail-action',
-              { 'detail-action-fullscreen': isFullscreenMarking }
-            ]"
-          >
-            <mark-action
-              :cur-paper-or-task="curPaper"
-              :levels="levels"
-              @on-leader-level="gradingCurPaper"
-              @on-select-score="scoreCurPaper"
-              @on-pass="passCurPaper"
-              ref="GradeAction"
-              v-if="curPaper.id"
-            ></mark-action>
-          </div>
-          <!-- detail-papers -->
-          <div :class="detailPapersClasses">
-            <div class="detail-papers-carousel">
-              <grade-history-paper
-                :question-id="filter.questionId"
-                stage="SCORE"
-                @on-paper-click="toViewCarouselPaper"
-                v-if="filter.questionId"
-                ref="GradeHistoryPaper"
-              ></grade-history-paper>
-            </div>
-            <div class="detail-papers-list" v-if="papers.length">
-              <div :class="imageViewClasses">
-                <div
-                  :class="[
-                    'image-view',
-                    { 'image-view-act': curPaperIndex === index }
-                  ]"
-                  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)"
-                    />
-                    <span
-                      class="image-info"
-                      v-if="image.score || image.score === 0"
-                      >{{ image.score }}分</span
-                    >
+        <div class="grading-detail page-container-flex">
+          <grade-filter
+            ref="GradeFilter"
+            :data="workSubject"
+            @change="areaChange"
+          ></grade-filter>
+          <mark-step
+            :steps="steps"
+            :init-step="curStep"
+            :show-top-number="false"
+            @on-change="stepChange"
+            ref="MarkStep"
+            v-if="steps.levelStep"
+          ></mark-step>
+          <div class="detail-body clear-float">
+            <!-- detail-papers -->
+            <div :class="detailPapersClasses">
+              <div class="detail-papers-carousel">
+                <grade-history-paper
+                  :question-id="filter.questionId"
+                  stage="SCORE"
+                  @on-paper-click="toViewCarouselPaper"
+                  v-if="filter.questionId"
+                  ref="GradeHistoryPaper"
+                ></grade-history-paper>
+              </div>
+              <div class="detail-papers-list" v-if="papers.length">
+                <div :class="imageViewClasses">
+                  <div
+                    :class="[
+                      'image-view',
+                      { 'image-view-act': curPaperIndex === index }
+                    ]"
+                    v-for="(image, index) in papers"
+                    :key="index"
+                  >
+                    <div class="image-view-container">
+                      <h5 class="image-view-title">{{ image.title }}</h5>
+                      <div class="image-view-contain">
+                        <img
+                          :src="image.thumbSrc"
+                          :alt="image.title"
+                          @click="toReview(index)"
+                        />
+                        <span
+                          class="image-info"
+                          v-if="image.score || image.score === 0"
+                          >{{ image.score }}分</span
+                        >
+                      </div>
+                    </div>
                   </div>
                 </div>
+                <div class="part-page" v-if="total > size">
+                  <Page
+                    :current="current"
+                    :total="total"
+                    :page-size="size"
+                    show-total
+                    show-elevator
+                    :page-size-opts="[4, 6, 8]"
+                    @on-page-size-change="pageSizeChange"
+                    @on-change="toPage"
+                  ></Page>
+                </div>
               </div>
-              <div class="part-page" v-if="total > size">
-                <Page
-                  :current="current"
-                  :total="total"
-                  :page-size="size"
-                  show-total
-                  show-elevator
-                  :page-size-opts="[4, 6, 8]"
-                  @on-page-size-change="pageSizeChange"
-                  @on-change="toPage"
-                ></Page>
+              <div class="detail-papers-list" v-else>
+                <p class="detail-papers-none">暂无数据</p>
               </div>
             </div>
-            <div class="detail-papers-list" v-else>
-              <p class="detail-papers-none">暂无数据</p>
+            <!-- detail-aciton -->
+            <div
+              :class="[
+                'detail-action',
+                { 'detail-action-fullscreen': isFullscreenMarking }
+              ]"
+            >
+              <mark-action
+                :cur-paper-or-task="curPaper"
+                :levels="levels"
+                @on-leader-level="gradingCurPaper"
+                @on-select-score="scoreCurPaper"
+                @on-pass="passCurPaper"
+                ref="GradeAction"
+                v-if="curPaper.id"
+              ></mark-action>
             </div>
+            <!-- 占位 -->
+            <div class="detail-action" v-if="isFullscreenMarking"></div>
           </div>
         </div>
-
-        <view-footer></view-footer>
       </div>
     </div>
 
@@ -143,14 +125,13 @@ import {
   markerTaskList,
   markerChangeLevelPaperList,
   markerScoreTotalStatData,
-  areaList,
   workLevelList,
-  subjectDetail,
   paperSelectLevelOrScore,
   paperTaskPass
 } from "@/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import MarkStep from "./components/MarkStep";
+import GradeFilter from "../grading/components/GradeFilter";
 import GradeHistoryPaper from "../grading/components/GradeHistoryPaper";
 import MarkAction from "./components/MarkAction";
 // 三种情况:
@@ -166,6 +147,7 @@ export default {
   components: {
     SimpleImagePreview,
     MarkStep,
+    GradeFilter,
     GradeHistoryPaper,
     MarkAction
   },
@@ -197,6 +179,7 @@ export default {
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subject: "",
+      workSubject: {},
       curSubject: {},
       curUserRoleType: "MARKER",
       changeStage: 0, // 是否显示改档及改档打分
@@ -208,7 +191,7 @@ export default {
       curStandardGradeId: "",
       steps: [],
       levels: [],
-      areas: [],
+      curArea: {},
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
@@ -226,23 +209,17 @@ export default {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
     }
   },
-  mounted() {
+  created() {
     this.subject = this.subjectId.split("-")[1];
+    this.workSubject = {
+      workId: this.workId,
+      subject: this.subject
+    };
     this.initData();
   },
   methods: {
-    async initData() {
-      // this.getSubjectDetail();
+    initData() {
       this.getWorkLevels();
-
-      await this.getAreaList();
-      this.filter.questionId = this.areas[0].id;
-      await this.getParamsSetInfo();
-
-      this.getStepLevels();
-    },
-    async getSubjectDetail() {
-      this.curSubject = await subjectDetail(this.subjectId);
     },
     async getParamsSetInfo() {
       const data = await getParamsSet(this.workId);
@@ -358,19 +335,6 @@ export default {
         };
       });
     },
-    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
-        };
-      });
-    },
     pageSizeChange(size) {
       this.size = size;
       this.toPage(1);
@@ -387,8 +351,10 @@ export default {
         this.curPaper = {};
       }
     },
-    areaChange() {
-      this.getStepLevels();
+    async areaChange(curArea) {
+      this.curArea = curArea;
+      this.filter.questionId = curArea.id;
+      await this.getStepLevels();
       this.toPage(1);
       this.updateHistory();
     },

+ 120 - 120
src/modules/quality/Quality.vue

@@ -4,129 +4,129 @@
 
     <div class="home-body">
       <div class="home-main">
-        <div class="part-box part-box-filter">
-          <Form ref="FilterForm" label-position="left" inline>
-            <FormItem>
-              <Select
-                v-model="filter.workId"
-                @on-change="workChange"
-                placeholder="工作文件夹"
-                style="width: 150px"
-              >
-                <Option
-                  v-for="(work, windex) in works"
-                  :key="windex"
-                  :value="work.id"
-                  :label="work.name"
-                ></Option>
-              </Select>
-            </FormItem>
-            <FormItem>
-              <Select
-                v-model="filter.subject"
-                @on-change="subjectChange"
-                placeholder="科目"
-              >
-                <Option
-                  v-for="subject in subjects"
-                  :key="subject.id"
-                  :value="subject.subject"
-                  :label="subject.name"
-                ></Option>
-              </Select>
-            </FormItem>
-            <FormItem>
-              <Select v-model="filter.areaCode" placeholder="考区">
-                <Option
-                  v-for="area in areas"
-                  :key="area.id"
-                  :value="area.areaCode"
-                  :label="area.areaName"
-                ></Option>
-              </Select>
-            </FormItem>
-            <FormItem>
-              <InputNumber
-                v-model="filter.startNumber"
-                :precision="0"
-                :min="1"
-                placeholder="输入起始编号"
-                clearable
-              ></InputNumber>
-            </FormItem>
-            <FormItem>
-              <InputNumber
-                v-model="filter.endNumber"
-                :min="filter.startNumber"
-                :precision="0"
-                :active-change="false"
-                placeholder="输入终止编号"
-                clearable
-              ></InputNumber>
-            </FormItem>
-            <FormItem>
-              <Select
-                v-model="paperType"
-                @on-change="typeChange"
-                placeholder="类型"
-              >
-                <Option
-                  v-for="(val, key) in CAFA_EXCEPTION_TYPE"
-                  :key="key"
-                  :value="key"
-                  :label="val"
-                ></Option>
-              </Select>
-            </FormItem>
-            <FormItem>
-              <Input
-                v-model.trim="filter.studentName"
-                placeholder="输入姓名"
-                clearable
-              ></Input>
-            </FormItem>
-            <FormItem>
-              <Select v-model="filter.sortBy" placeholder="排序方式">
-                <Option
-                  v-for="(val, key) in SORT_RULE_TYPE"
-                  :key="key"
-                  :value="key"
-                  :label="val"
-                ></Option>
-              </Select>
-            </FormItem>
-            <FormItem>
-              <Button
-                class="btn-form-search"
-                size="small"
-                type="primary"
-                @click="toPage(1)"
-                >查询</Button
-              >
-            </FormItem>
-          </Form>
-        </div>
+        <div class="page-container-flex">
+          <div class="part-box part-box-filter">
+            <Form ref="FilterForm" label-position="left" inline>
+              <FormItem>
+                <Select
+                  v-model="filter.workId"
+                  @on-change="workChange"
+                  placeholder="工作文件夹"
+                  style="width: 150px"
+                >
+                  <Option
+                    v-for="(work, windex) in works"
+                    :key="windex"
+                    :value="work.id"
+                    :label="work.name"
+                  ></Option>
+                </Select>
+              </FormItem>
+              <FormItem>
+                <Select
+                  v-model="filter.subject"
+                  @on-change="subjectChange"
+                  placeholder="科目"
+                >
+                  <Option
+                    v-for="subject in subjects"
+                    :key="subject.id"
+                    :value="subject.subject"
+                    :label="subject.name"
+                  ></Option>
+                </Select>
+              </FormItem>
+              <FormItem>
+                <Select v-model="filter.areaCode" placeholder="考区">
+                  <Option
+                    v-for="area in areas"
+                    :key="area.id"
+                    :value="area.areaCode"
+                    :label="area.areaName"
+                  ></Option>
+                </Select>
+              </FormItem>
+              <FormItem>
+                <InputNumber
+                  v-model="filter.startNumber"
+                  :precision="0"
+                  :min="1"
+                  placeholder="输入起始编号"
+                  clearable
+                ></InputNumber>
+              </FormItem>
+              <FormItem>
+                <InputNumber
+                  v-model="filter.endNumber"
+                  :min="filter.startNumber"
+                  :precision="0"
+                  :active-change="false"
+                  placeholder="输入终止编号"
+                  clearable
+                ></InputNumber>
+              </FormItem>
+              <FormItem>
+                <Select
+                  v-model="paperType"
+                  @on-change="typeChange"
+                  placeholder="类型"
+                >
+                  <Option
+                    v-for="(val, key) in CAFA_EXCEPTION_TYPE"
+                    :key="key"
+                    :value="key"
+                    :label="val"
+                  ></Option>
+                </Select>
+              </FormItem>
+              <FormItem>
+                <Input
+                  v-model.trim="filter.studentName"
+                  placeholder="输入姓名"
+                  clearable
+                ></Input>
+              </FormItem>
+              <FormItem>
+                <Select v-model="filter.sortBy" placeholder="排序方式">
+                  <Option
+                    v-for="(val, key) in SORT_RULE_TYPE"
+                    :key="key"
+                    :value="key"
+                    :label="val"
+                  ></Option>
+                </Select>
+              </FormItem>
+              <FormItem>
+                <Button
+                  class="btn-form-search"
+                  size="small"
+                  type="primary"
+                  @click="toPage(1)"
+                  >查询</Button
+                >
+              </FormItem>
+            </Form>
+          </div>
 
-        <image-action-list
-          :data="papers"
-          :column-number="4"
-          :actions="imageListActions"
-          @on-review="toReview"
-          ref="ImageActionList"
-        ></image-action-list>
+          <image-action-list
+            :data="papers"
+            :column-number="4"
+            :actions="imageListActions"
+            @on-review="toReview"
+            ref="ImageActionList"
+          ></image-action-list>
 
-        <div class="part-page" v-if="total > size">
-          <Page
-            :current="current"
-            :total="total"
-            :page-size="size"
-            show-total
-            show-elevator
-            @on-change="toPage"
-          ></Page>
+          <div class="part-page" v-if="total > size">
+            <Page
+              :current="current"
+              :total="total"
+              :page-size="size"
+              show-total
+              show-elevator
+              @on-change="toPage"
+            ></Page>
+          </div>
         </div>
-
-        <view-footer></view-footer>
       </div>
     </div>
 

+ 2 - 1
src/plugins/axios.js

@@ -15,6 +15,7 @@ const errorCallback = error => {
   let content = "";
   if (error.response) {
     content = error.response.data && error.response.data.message;
+    console.log(content);
 
     if (error.response.status === 401) {
       if (unauthMsgBoxIsShow) return error;
@@ -39,7 +40,7 @@ const errorCallback = error => {
     return error;
   }
 
-  content = content.indexOf("###") === -1 || !content ? "服务错误" : content;
+  content = content.indexOf("###") !== -1 || !content ? "服务错误" : content;
   content = content.length > 100 ? content.slice(0, 100) + "..." : content;
   ViewUI.Notice.error({ title: "错误提示", desc: content });
   return error;

+ 9 - 0
src/routers/grading.js

@@ -2,6 +2,7 @@
 import Grading from "../modules/grading/Grading";
 import GradingProgress from "../modules/grading/GradingProgress";
 import GradingDetail from "../modules/grading/GradingDetail";
+import GradingAnalysis from "../modules/grading/GradingAnalysis";
 import GradingUserManage from "../modules/grading/GradingUserManage";
 import GradingGroupManage from "../modules/grading/GradingGroupManage";
 import ExamPaperView from "../modules/main/ExamPaperView";
@@ -27,6 +28,14 @@ const gradingRoutes = [
       title: "分档详情"
     }
   },
+  {
+    path: "grading-analysis",
+    name: "GradingAnalysis",
+    component: GradingAnalysis,
+    meta: {
+      title: "分档统计"
+    }
+  },
   {
     path: "grading-user-manage",
     name: "GradingUserManage",