Преглед на файлове

第三方登录跳转与基础配置

zhangjie преди 3 години
родител
ревизия
a7ce2a7b61
променени са 23 файла, в които са добавени 2513 реда и са изтрити 2113 реда
  1. 510 507
      src/assets/styles/base.scss
  2. 1128 1074
      src/assets/styles/pages.scss
  3. 43 42
      src/assets/styles/variables.scss
  4. 30 3
      src/modules/analysis/api.js
  5. 4 5
      src/modules/analysis/components/ModifyBaseConfig.vue
  6. 14 2
      src/modules/analysis/components/baseConfig/BlueprintConfig.vue
  7. 10 29
      src/modules/analysis/components/baseConfig/CommentAbility.vue
  8. 205 2
      src/modules/analysis/components/baseConfig/CommentConfig.vue
  9. 3 27
      src/modules/analysis/components/baseConfig/CommentKnowledge.vue
  10. 105 40
      src/modules/analysis/components/baseConfig/DiagnoseConfig.vue
  11. 14 2
      src/modules/analysis/components/baseConfig/DimensionConfig.vue
  12. 1 1
      src/modules/analysis/components/baseConfig/DimensionKnowledgeList.vue
  13. 11 11
      src/modules/analysis/components/baseConfig/ModifyAbilityComment.vue
  14. 2 2
      src/modules/analysis/components/baseConfig/ModifyAbilityDim.vue
  15. 8 8
      src/modules/analysis/components/baseConfig/ModifyKnowledgeComment.vue
  16. 2 2
      src/modules/analysis/components/baseConfig/ModifyKnowledgeDim.vue
  17. 9 9
      src/modules/analysis/components/baseConfig/ProficiencyEdit.vue
  18. 62 54
      src/modules/analysis/components/baseConfig/defaultComment.js
  19. 6 0
      src/modules/analysis/router.js
  20. 63 0
      src/modules/analysis/views/AnalysisReportView.vue
  21. 6 15
      src/modules/analysis/views/DataInitManage.vue
  22. 216 216
      src/modules/base/views/RoleManage.vue
  23. 61 62
      src/modules/stmms/views/MarkerLogin.vue

+ 510 - 507
src/assets/styles/base.scss

@@ -1,507 +1,510 @@
-/* reset */
-body,
-div,
-ul,
-ol,
-li,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-input,
-p,
-tr,
-th,
-td,
-span,
-a,
-header,
-footer,
-i {
-  margin: 0;
-  padding: 0;
-  box-sizing: border-box;
-  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
-}
-li {
-  list-style: none;
-}
-em,
-i,
-u {
-  font-style: normal;
-}
-input {
-  outline: none;
-  border: none;
-  background: rgba(245, 245, 245, 1);
-  font-family: $--font-family;
-}
-input::-webkit-input-placeholder,
-input::-moz-placeholder,
-input:-ms-input-placeholder,
-input:-moz-placeholder {
-  font-size: 12px;
-  font-weight: bold;
-  color: $--color-text-gray-4;
-}
-button,
-textarea {
-  font-family: $--font-family;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  font-size: 100%;
-}
-fieldset,
-img {
-  border: 0;
-}
-abbr {
-  border: 0;
-  font-variant: normal;
-}
-a {
-  text-decoration: none;
-  color: inherit;
-  *color: $--color-text-gray-3;
-}
-img {
-  vertical-align: middle;
-}
-
-/* common-style */
-input:-webkit-autofill {
-  box-shadow: 0 0 0 1000px white inset;
-}
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="number"]:focus,
-textarea:focus {
-  box-shadow: 0 0 0 1000px white inset;
-}
-
-/* browse style */
-::-webkit-scrollbar {
-  width: 8px;
-  height: 8px;
-  background: transparent;
-}
-::-webkit-scrollbar-button {
-  display: none;
-}
-::-webkit-scrollbar-track {
-  background: transparent;
-}
-::-webkit-scrollbar-thumb {
-  border-radius: 8px;
-  background: #666;
-}
-::-webkit-scrollbar-corner {
-  background: transparent;
-}
-::-webkit-scrollbar-resizer {
-  background: transparent;
-}
-
-body {
-  font-family: $--font-family;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  font-size: $--font-size-base;
-  color: $--color-text-dark-1;
-}
-
-/* part */
-.part-box {
-  margin-bottom: 20px;
-  background-color: #fff;
-  border-radius: $--border-radius;
-
-  &-border {
-    border: 1px solid $--color-border;
-  }
-  &-pad {
-    padding: 20px;
-  }
-
-  &-filter {
-    padding: 20px 20px 5px 20px;
-
-    .el-form-item {
-      margin-bottom: 15px;
-    }
-    .el-form-item__label {
-      display: none;
-    }
-  }
-  &-gray {
-    background-color: $--color-text-gray-7;
-  }
-
-  &-flex {
-    display: flex;
-    align-items: stretch;
-    justify-content: space-between;
-  }
-
-  &-action {
-    padding-bottom: 15px;
-    white-space: nowrap;
-    display: flex;
-    align-items: flex-end;
-  }
-  &-tips {
-    font-size: 16px;
-    line-height: 25px;
-    color: $--color-text-dark-1;
-    margin-bottom: 15px;
-  }
-
-  &-head {
-    display: flex;
-    align-items: stretch;
-    justify-content: space-between;
-    min-height: 30px;
-    margin: -10px 0 10px -10px;
-    color: $--color-text-dark;
-
-    > h3 {
-      font-size: 17px;
-    }
-    .el-icon-question {
-      margin-left: 10px;
-      font-size: 16px;
-      color: $--color-text-gray-5;
-      cursor: pointer;
-
-      &:hover {
-        color: #fe8652;
-      }
-    }
-  }
-}
-.part-title {
-  font-size: 16px;
-  font-weight: bold;
-  padding: 15px 20px;
-  line-height: 30px;
-  overflow: hidden;
-
-  h2 {
-    float: left;
-  }
-  &-infos {
-    float: right;
-  }
-}
-.part-body {
-  padding: 25px;
-}
-.part-page {
-  margin-top: 15px;
-  text-align: right;
-}
-.part-none {
-  padding: 100px;
-  font-size: 20px;
-  color: $--color-text-gray-3;
-  text-align: center;
-}
-// box-justify
-.box-justify {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-}
-
-// page-head
-.page-head {
-  margin-bottom: 20px;
-  color: $--color-text-dark;
-  &-flex {
-    display: flex;
-    align-items: stretch;
-    justify-content: space-between;
-  }
-
-  > h2 {
-    font-size: 20px;
-  }
-  .el-icon-question {
-    margin-left: 10px;
-    font-size: 16px;
-    color: $--color-text-gray-5;
-    cursor: pointer;
-
-    &:hover {
-      color: #fe8652;
-    }
-  }
-}
-
-/* table */
-.table {
-  width: 100%;
-  border-spacing: 0;
-  border-collapse: collapse;
-  text-align: left;
-
-  &.table-white {
-    background-color: #fff;
-  }
-
-  th {
-    padding: 12px;
-    line-height: 1.2;
-    letter-spacing: 1px;
-    color: $--color-text-gray-2;
-    border: 1px solid $--color-border;
-  }
-  td {
-    padding: 14px;
-    line-height: 1.2;
-    color: $--color-text-dark;
-    border: 1px solid $--color-border;
-
-    &.td-link {
-      span {
-        cursor: pointer;
-        &:hover {
-          color: $--color-text-gray;
-        }
-      }
-    }
-  }
-  .td-th {
-    font-weight: 600;
-    color: $--color-text-gray;
-  }
-
-  &--border {
-    border: 1px solid $--color-border;
-    border-radius: 10px;
-    th {
-      background-color: #fcfcfd;
-      border: none;
-      border-bottom: 1px solid $--color-border;
-    }
-    td {
-      border: none;
-      border-bottom: 1px solid $--color-border;
-    }
-  }
-}
-
-/* list */
-.list-lr-right {
-  float: right;
-  width: 300px;
-}
-.list-lr-left {
-  margin-right: 320px;
-}
-
-.vlcode {
-  height: 36px;
-}
-.vlcode-left {
-  margin-right: 135px;
-}
-.vlcode-right {
-  float: right;
-  width: 120px;
-}
-
-// color
-.color-primary {
-  color: $--color-primary !important;
-}
-.color-success {
-  color: $--color-success;
-}
-.color-warning {
-  color: $--color-warning;
-}
-.color-danger {
-  color: $--color-danger;
-}
-.color-info {
-  color: $--color-text-gray-1;
-}
-.color-dark {
-  color: $--color-dark;
-}
-.color-gray {
-  color: $--color-text-gray;
-}
-.color-gray-2 {
-  color: $--color-text-gray-2;
-}
-.color-white {
-  color: #fff;
-}
-
-// text
-.text-center {
-  text-align: center;
-}
-.text-left {
-  text-align: left;
-}
-.text-right {
-  text-align: right;
-}
-.text-prewrap {
-  white-space: pre-wrap;
-}
-
-// other
-.btn-danger {
-  &.el-button--text:not(.is-disabled) {
-    color: $--color-danger !important;
-
-    &:hover {
-      font-weight: 600;
-      color: mix(#000, $--color-danger, 20%) !important;
-    }
-  }
-  &.is-disabled {
-    color: $--color-text-gray-4;
-  }
-}
-.btn-primary {
-  &.el-button--text:not(.is-disabled) {
-    color: $--color-text-dark-1 !important;
-    &:hover {
-      font-weight: 600;
-      color: $--color-primary !important;
-    }
-  }
-}
-
-.btn-white {
-  background-color: #fff !important;
-  color: #999 !important;
-}
-.font-bold {
-  font-weight: bold;
-}
-.table-head-bg {
-  th {
-    background-color: #f6f6f6;
-    color: $--color-text-gray;
-  }
-}
-
-.tab-btns {
-  .el-button {
-    border-bottom-right-radius: 0;
-    border-bottom-left-radius: 0;
-
-    &:first-child {
-      border-bottom-left-radius: 8px;
-    }
-
-    &:last-child {
-      border-bottom-right-radius: 8px;
-    }
-  }
-
-  .el-button + .el-button {
-    margin-left: 10px;
-  }
-}
-
-.cont-link {
-  color: $--color-primary;
-  cursor: pointer;
-  &:hover {
-    color: $--color-success;
-  }
-}
-.ml-1 {
-  margin-left: 5px;
-}
-.ml-2 {
-  margin-left: 10px;
-}
-.mr-1 {
-  margin-right: 5px;
-}
-.mr-2 {
-  margin-right: 10px;
-}
-.mr-4 {
-  margin-right: 20px;
-}
-.mb-0 {
-  margin-bottom: 0;
-}
-.mb-1 {
-  margin-bottom: 5px;
-}
-.mb-2 {
-  margin-bottom: 10px;
-}
-.mb-4 {
-  margin-bottom: 20px;
-}
-.mlr-1 {
-  margin-left: 5px;
-  margin-right: 5px;
-}
-.width-full {
-  width: 100%;
-}
-.width-400 {
-  width: 400px;
-}
-.width-80 {
-  width: 80px;
-}
-.width-200 {
-  width: 200px;
-}
-
-// other
-.tips-info {
-  font-size: 14px;
-  line-height: 20px;
-  color: $--color-text-gray-2;
-}
-.tips-dark {
-  color: $--color-text-gray;
-}
-.tips-error {
-  color: $--color-danger;
-}
-.tips-icon {
-  display: inline-block;
-  vertical-align: middle;
-  color: $--color-text-gray-3;
-  font-size: 18px;
-  margin: 0 10px;
-  cursor: pointer;
-}
-.form-item-content {
-  color: $--color-text-gray-2;
-}
-.inline-block {
-  display: inline-block;
-  vertical-align: top;
-}
-.custom-tree-node {
-  flex: 1;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  font-size: 12px;
-  padding-right: 8px;
-}
+/* reset */
+body,
+div,
+ul,
+ol,
+li,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+input,
+p,
+tr,
+th,
+td,
+span,
+a,
+header,
+footer,
+i {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
+}
+li {
+  list-style: none;
+}
+em,
+i,
+u {
+  font-style: normal;
+}
+input {
+  outline: none;
+  border: none;
+  background: rgba(245, 245, 245, 1);
+  font-family: $--font-family;
+}
+input::-webkit-input-placeholder,
+input::-moz-placeholder,
+input:-ms-input-placeholder,
+input:-moz-placeholder {
+  font-size: 12px;
+  font-weight: bold;
+  color: $--color-text-gray-4;
+}
+button,
+textarea {
+  font-family: $--font-family;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-size: 100%;
+}
+fieldset,
+img {
+  border: 0;
+}
+abbr {
+  border: 0;
+  font-variant: normal;
+}
+a {
+  text-decoration: none;
+  color: inherit;
+  *color: $--color-text-gray-3;
+}
+img {
+  vertical-align: middle;
+}
+
+/* common-style */
+input:-webkit-autofill {
+  box-shadow: 0 0 0 1000px white inset;
+}
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="number"]:focus,
+textarea:focus {
+  box-shadow: 0 0 0 1000px white inset;
+}
+
+/* browse style */
+::-webkit-scrollbar {
+  width: 8px;
+  height: 8px;
+  background: transparent;
+}
+::-webkit-scrollbar-button {
+  display: none;
+}
+::-webkit-scrollbar-track {
+  background: transparent;
+}
+::-webkit-scrollbar-thumb {
+  border-radius: 8px;
+  background: #666;
+}
+::-webkit-scrollbar-corner {
+  background: transparent;
+}
+::-webkit-scrollbar-resizer {
+  background: transparent;
+}
+
+body {
+  font-family: $--font-family;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  font-size: $--font-size-base;
+  color: $--color-text-dark-1;
+}
+
+/* part */
+.part-box {
+  margin-bottom: 20px;
+  background-color: #fff;
+  border-radius: $--border-radius;
+
+  &-border {
+    border: 1px solid $--color-border;
+  }
+  &-border-bold {
+    border: 1px solid $--color-border-bold;
+  }
+  &-pad {
+    padding: 20px;
+  }
+
+  &-filter {
+    padding: 20px 20px 5px 20px;
+
+    .el-form-item {
+      margin-bottom: 15px;
+    }
+    .el-form-item__label {
+      display: none;
+    }
+  }
+  &-gray {
+    background-color: $--color-text-gray-7;
+  }
+
+  &-flex {
+    display: flex;
+    align-items: stretch;
+    justify-content: space-between;
+  }
+
+  &-action {
+    padding-bottom: 15px;
+    white-space: nowrap;
+    display: flex;
+    align-items: flex-end;
+  }
+  &-tips {
+    font-size: 16px;
+    line-height: 25px;
+    color: $--color-text-dark-1;
+    margin-bottom: 15px;
+  }
+
+  &-head {
+    display: flex;
+    align-items: stretch;
+    justify-content: space-between;
+    min-height: 30px;
+    margin: -10px 0 10px -10px;
+    color: $--color-text-dark;
+
+    > h3 {
+      font-size: 17px;
+    }
+    .el-icon-question {
+      margin-left: 10px;
+      font-size: 16px;
+      color: $--color-text-gray-5;
+      cursor: pointer;
+
+      &:hover {
+        color: #fe8652;
+      }
+    }
+  }
+}
+.part-title {
+  font-size: 16px;
+  font-weight: bold;
+  padding: 15px 20px;
+  line-height: 30px;
+  overflow: hidden;
+
+  h2 {
+    float: left;
+  }
+  &-infos {
+    float: right;
+  }
+}
+.part-body {
+  padding: 25px;
+}
+.part-page {
+  margin-top: 15px;
+  text-align: right;
+}
+.part-none {
+  padding: 100px;
+  font-size: 20px;
+  color: $--color-text-gray-3;
+  text-align: center;
+}
+// box-justify
+.box-justify {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+// page-head
+.page-head {
+  margin-bottom: 20px;
+  color: $--color-text-dark;
+  &-flex {
+    display: flex;
+    align-items: stretch;
+    justify-content: space-between;
+  }
+
+  > h2 {
+    font-size: 20px;
+  }
+  .el-icon-question {
+    margin-left: 10px;
+    font-size: 16px;
+    color: $--color-text-gray-5;
+    cursor: pointer;
+
+    &:hover {
+      color: #fe8652;
+    }
+  }
+}
+
+/* table */
+.table {
+  width: 100%;
+  border-spacing: 0;
+  border-collapse: collapse;
+  text-align: left;
+
+  &.table-white {
+    background-color: #fff;
+  }
+
+  th {
+    padding: 12px;
+    line-height: 1.2;
+    letter-spacing: 1px;
+    color: $--color-text-gray-2;
+    border: 1px solid $--color-border;
+  }
+  td {
+    padding: 14px;
+    line-height: 1.2;
+    color: $--color-text-dark;
+    border: 1px solid $--color-border;
+
+    &.td-link {
+      span {
+        cursor: pointer;
+        &:hover {
+          color: $--color-text-gray;
+        }
+      }
+    }
+  }
+  .td-th {
+    font-weight: 600;
+    color: $--color-text-gray;
+  }
+
+  &--border {
+    border: 1px solid $--color-border;
+    border-radius: 10px;
+    th {
+      background-color: #fcfcfd;
+      border: none;
+      border-bottom: 1px solid $--color-border;
+    }
+    td {
+      border: none;
+      border-bottom: 1px solid $--color-border;
+    }
+  }
+}
+
+/* list */
+.list-lr-right {
+  float: right;
+  width: 300px;
+}
+.list-lr-left {
+  margin-right: 320px;
+}
+
+.vlcode {
+  height: 36px;
+}
+.vlcode-left {
+  margin-right: 135px;
+}
+.vlcode-right {
+  float: right;
+  width: 120px;
+}
+
+// color
+.color-primary {
+  color: $--color-primary !important;
+}
+.color-success {
+  color: $--color-success;
+}
+.color-warning {
+  color: $--color-warning;
+}
+.color-danger {
+  color: $--color-danger;
+}
+.color-info {
+  color: $--color-text-gray-1;
+}
+.color-dark {
+  color: $--color-dark;
+}
+.color-gray {
+  color: $--color-text-gray;
+}
+.color-gray-2 {
+  color: $--color-text-gray-2;
+}
+.color-white {
+  color: #fff;
+}
+
+// text
+.text-center {
+  text-align: center;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-prewrap {
+  white-space: pre-wrap;
+}
+
+// other
+.btn-danger {
+  &.el-button--text:not(.is-disabled) {
+    color: $--color-danger !important;
+
+    &:hover {
+      font-weight: 600;
+      color: mix(#000, $--color-danger, 20%) !important;
+    }
+  }
+  &.is-disabled {
+    color: $--color-text-gray-4;
+  }
+}
+.btn-primary {
+  &.el-button--text:not(.is-disabled) {
+    color: $--color-text-dark-1 !important;
+    &:hover {
+      font-weight: 600;
+      color: $--color-primary !important;
+    }
+  }
+}
+
+.btn-white {
+  background-color: #fff !important;
+  color: #999 !important;
+}
+.font-bold {
+  font-weight: bold;
+}
+.table-head-bg {
+  th {
+    background-color: #f6f6f6;
+    color: $--color-text-gray;
+  }
+}
+
+.tab-btns {
+  .el-button {
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0;
+
+    &:first-child {
+      border-bottom-left-radius: 8px;
+    }
+
+    &:last-child {
+      border-bottom-right-radius: 8px;
+    }
+  }
+
+  .el-button + .el-button {
+    margin-left: 10px;
+  }
+}
+
+.cont-link {
+  color: $--color-primary;
+  cursor: pointer;
+  &:hover {
+    color: $--color-success;
+  }
+}
+.ml-1 {
+  margin-left: 5px;
+}
+.ml-2 {
+  margin-left: 10px;
+}
+.mr-1 {
+  margin-right: 5px;
+}
+.mr-2 {
+  margin-right: 10px;
+}
+.mr-4 {
+  margin-right: 20px;
+}
+.mb-0 {
+  margin-bottom: 0;
+}
+.mb-1 {
+  margin-bottom: 5px;
+}
+.mb-2 {
+  margin-bottom: 10px;
+}
+.mb-4 {
+  margin-bottom: 20px;
+}
+.mlr-1 {
+  margin-left: 5px;
+  margin-right: 5px;
+}
+.width-full {
+  width: 100%;
+}
+.width-400 {
+  width: 400px;
+}
+.width-80 {
+  width: 80px;
+}
+.width-200 {
+  width: 200px;
+}
+
+// other
+.tips-info {
+  font-size: 14px;
+  line-height: 20px;
+  color: $--color-text-gray-2;
+}
+.tips-dark {
+  color: $--color-text-gray;
+}
+.tips-error {
+  color: $--color-danger;
+}
+.tips-icon {
+  display: inline-block;
+  vertical-align: middle;
+  color: $--color-text-gray-3;
+  font-size: 18px;
+  margin: 0 10px;
+  cursor: pointer;
+}
+.form-item-content {
+  color: $--color-text-gray-2;
+}
+.inline-block {
+  display: inline-block;
+  vertical-align: top;
+}
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 12px;
+  padding-right: 8px;
+}

+ 1128 - 1074
src/assets/styles/pages.scss

@@ -1,1074 +1,1128 @@
-.task-apply-steps {
-  min-height: 90px;
-  margin-bottom: 20px;
-  margin-top: -32px;
-  .el-step__title {
-    font-size: 14px;
-    line-height: 30px;
-  }
-}
-.task-exam-room {
-  background-color: #fff;
-  border-radius: $--border-radius;
-  margin-bottom: 10px;
-}
-// task-detail
-.task-detail {
-  .table {
-    border-radius: $--border-radius;
-    color: $--color-text-dark-1;
-    border: 1px solid $--color-border;
-    border-bottom: 0;
-    border-right: 0;
-    border-collapse: separate;
-    overflow: hidden;
-
-    th {
-      border-left: 0;
-      border-top: 0;
-      color: $--color-text-gray-2;
-      padding: 15px;
-    }
-    td {
-      border-left: 0;
-      border-top: 0;
-      padding: 10px 15px;
-
-      i {
-        display: inline-block;
-        vertical-align: middle;
-      }
-    }
-  }
-  .icon {
-    margin-right: 8px;
-  }
-
-  .task-action {
-    margin-top: 50px;
-    text-align: center;
-  }
-  .task-audit {
-    padding-top: 15px;
-    border-top: 2px dashed $--color-border;
-    margin-top: 20px;
-  }
-  // .task-audit-history {
-  // }
-
-  .image-item {
-    display: inline-block;
-    vertical-align: top;
-    width: 80px;
-    height: 80px;
-    margin: 0 10px 10px 0;
-    border: 1px solid $--color-text-gray-4;
-    position: relative;
-    border-radius: 5px;
-    overflow: hidden;
-
-    img {
-      position: absolute;
-      margin: auto;
-      max-width: 100%;
-      max-height: 100%;
-      top: 0;
-      left: 0;
-      right: 0;
-      bottom: 0;
-      z-index: auto;
-      cursor: pointer;
-    }
-
-    .image-delete {
-      display: none;
-      position: absolute;
-      z-index: 99;
-      width: 100%;
-      height: 30px;
-      line-height: 30px;
-      text-align: center;
-      font-size: 20px;
-      bottom: 0;
-      left: 0;
-      background-color: rgba($color: #000000, $alpha: 0.3);
-      color: $--color-danger;
-      cursor: pointer;
-    }
-
-    &:hover {
-      .image-delete {
-        display: block;
-      }
-    }
-  }
-  .image-add {
-    font-size: 40px;
-    line-height: 1;
-    padding: 19px;
-    text-align: center;
-    border-radius: 5px;
-    border-style: dashed;
-    overflow: hidden;
-    cursor: pointer;
-    color: $--color-text-gray-5;
-
-    &:hover {
-      color: $--color-text-gray-3;
-    }
-  }
-  .image-list-none {
-    color: $--color-text-gray-2;
-    margin-bottom: 10px;
-  }
-}
-// apply-audit-history
-.apply-audit-history {
-  .audit-result {
-    margin: 10px 0;
-  }
-}
-// task-list
-.task-head {
-  font-size: 16px;
-
-  i {
-    cursor: pointer;
-
-    &:hover {
-      color: $--color-primary;
-    }
-  }
-}
-.task-list {
-  .task-item {
-    margin-bottom: 15px;
-    padding: 15px;
-    border-radius: $--border-radius;
-    background-color: $--color-background;
-
-    p {
-      line-height: 1.5;
-      margin-bottom: 5px;
-      > span:first-child {
-        color: $--color-text-dark-1;
-      }
-    }
-  }
-  .task-action {
-    cursor: pointer;
-    &:hover {
-      color: $--color-primary;
-    }
-  }
-}
-// create-exam-and-print-task
-.create-exam-and-print-task {
-  .apply-body {
-    width: 1000px;
-    margin: 0 auto 30px;
-  }
-  .apply-part {
-    padding: 20px 30px;
-    border-radius: 20px;
-    border: 1px solid $--color-text-gray-5;
-    margin-bottom: 20px;
-
-    &-title {
-      font-weight: 600;
-      font-size: 18px;
-      line-height: 1;
-      margin-bottom: 30px;
-    }
-  }
-}
-// flow-timeline
-.flow-timeline {
-  margin-top: 10px;
-  padding: 15px;
-  border: 1px solid $--color-text-gray-6;
-  border-radius: 10px;
-  background-color: $--color-text-gray-7;
-  .el-timeline {
-    padding: 0 10px;
-    &-item__tail {
-      border-color: #ddd;
-    }
-  }
-  .timeline-item-stop {
-    .el-timeline-item__tail {
-      border-left-style: dashed;
-    }
-  }
-
-  .el-timeline-item__node--success {
-    background-color: $--color-success;
-  }
-
-  .flow-item {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-
-    &-time {
-      color: #909399;
-      line-height: 1;
-      font-size: 13px;
-      margin-bottom: 8px;
-      padding-top: 4px;
-    }
-    &-title {
-      font-size: 16px;
-      line-height: 1;
-      margin-bottom: 5px;
-    }
-    &-desc {
-      color: $--color-text-gray;
-
-      > span:not(:first-child) {
-        margin-left: 10px;
-      }
-    }
-
-    &-attachment {
-      .btn-primary {
-        &:hover {
-          font-weight: normal;
-        }
-
-        & + .btn-primary {
-          position: relative;
-          margin-left: 20px;
-
-          &::before {
-            content: "";
-            display: block;
-            position: absolute;
-            width: 0;
-            height: 14px;
-            border-left: 1px solid $--color-text-gray-4;
-            left: -10px;
-            top: 50%;
-            margin-top: -7px;
-          }
-        }
-      }
-    }
-
-    &-action {
-      text-align: center;
-    }
-
-    // action
-    .user-select {
-      width: 40px;
-      height: 40px;
-      padding: 10px;
-      font-size: 18px;
-      line-height: 1;
-    }
-  }
-}
-
-// wait-task
-.wait-task {
-  .wait-module {
-    height: 100%;
-  }
-}
-// card-title-rule-edit
-.card-title-rule-edit {
-  .field-item {
-    display: inline-block;
-    vertical-align: top;
-    margin: 0 10px 10px 0;
-    padding: 8px 10px;
-    border-radius: 4px;
-    line-height: 1;
-    background-color: $--color-background;
-    cursor: pointer;
-
-    &:hover {
-      color: $--color-primary;
-    }
-    &-act {
-      background-color: $--color-primary;
-      color: #fff !important;
-    }
-    &-disabled {
-      cursor: not-allowed;
-
-      &:hover {
-        color: $--color-text-dark;
-      }
-    }
-  }
-  .field-textarea {
-    border-radius: $--border-radius;
-    border: 1px solid $--color-text-gray-4;
-    min-height: 60px;
-    padding: 2px;
-    overflow: hidden;
-
-    &:focus {
-      border-color: $--color-primary;
-    }
-
-    span.var-field {
-      display: inline-block;
-      vertical-align: middle;
-      padding: 3px 5px;
-      background-color: $--color-primary;
-      color: $--color-white;
-      line-height: 1;
-      border-radius: 3px;
-    }
-  }
-}
-
-// page-preview
-.preview-frame {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 99;
-}
-// label-edit
-.label-edit {
-  min-height: 60px;
-  .label-item {
-    display: inline-block;
-    vertical-align: top;
-    border: 1px solid $--color-text-gray-6;
-    border-radius: $--border-radius;
-    padding: 5px 40px 5px 10px;
-    position: relative;
-    margin: 0 10px 10px 0;
-    line-height: 21px;
-  }
-  .label-item-content {
-    margin: 0;
-    line-height: 21px;
-    vertical-align: middle;
-  }
-  .label-item-delete {
-    position: absolute;
-    right: 10px;
-    top: 50%;
-    transform: translateY(-50%);
-    z-index: 99;
-    font-size: 16px;
-    color: $--color-text-gray-5;
-    cursor: pointer;
-    &:hover {
-      color: $--color-danger;
-    }
-  }
-  .label-add {
-    display: inline-block;
-    vertical-align: top;
-    border: 1px solid $--color-text-gray-6;
-    border-radius: $--border-radius;
-    padding: 0 10px;
-    color: $--color-text-gray-2;
-    cursor: pointer;
-    &:hover {
-      border-color: $--color-primary;
-      color: $--color-primary;
-    }
-  }
-}
-
-// rule-exam
-
-// select-orgs
-.select-orgs {
-  position: relative;
-
-  &-disabled {
-    &::before {
-      content: "";
-      position: absolute;
-      top: 0;
-      left: 0;
-      right: 0;
-      bottom: 0;
-      z-index: 99;
-      background-color: #f5f7fa;
-      opacity: 0.3;
-      cursor: not-allowed;
-    }
-  }
-
-  .el-checkbox.is-disabled + span.el-tree-node__label {
-    color: $--color-text-gray-4;
-  }
-}
-// privilege-set
-.privilege-set {
-  .cell-check-list {
-    text-align: left;
-    padding-left: 20px;
-  }
-}
-// organization-manage
-.organization-manage {
-  .org-tree-head {
-    height: 40px;
-    line-height: 40px;
-    color: $--color-text-gray-2;
-    border-bottom: 1px solid $--color-border;
-    padding: 0 8px;
-
-    > div {
-      float: right;
-      font-weight: 500;
-      &:first-child {
-        float: left;
-      }
-
-      &:nth-of-type(2) {
-        width: 200px;
-        text-align: right;
-      }
-      &:nth-of-type(3) {
-        width: 100px;
-      }
-    }
-  }
-  .el-tree-node__content {
-    height: auto;
-    padding: 4px 0;
-    border-bottom: 1px solid $--color-border;
-  }
-  .org-edit {
-    .org-type {
-      width: 100px;
-      display: inline-block;
-    }
-    .org-actions {
-      width: 200px;
-      display: inline-block;
-      text-align: right;
-    }
-    .el-button--text:hover {
-      transform: scale(1.1);
-    }
-  }
-}
-// modify-print-plan
-.modify-print-plan {
-  .part-box {
-    margin-bottom: 40px;
-  }
-}
-
-// paper-track-preview-dialog
-.paper-track-preview-dialog {
-  .paper-preview {
-    overflow: auto;
-    canvas {
-      display: block;
-      margin: 0 auto;
-    }
-  }
-  .preview-loading {
-    position: absolute;
-    top: 100px;
-    width: 100%;
-    z-index: auto;
-    font-size: 100px;
-    text-align: center;
-    color: #aaa;
-  }
-  .el-dialog__body {
-    padding: 70px 20px 80px !important;
-  }
-  .el-dialog__footer {
-    position: fixed;
-    width: 100%;
-    left: 0;
-    bottom: 0;
-    z-index: 9;
-    padding: 15px 20px;
-    border-top: 1px solid #eff0f5;
-    background-color: #fff;
-    .el-button {
-      float: none;
-    }
-  }
-}
-
-// marker-login
-.marker-login {
-  .part-box {
-    padding: 100px 50px;
-    text-align: center;
-  }
-  .auth-item {
-    padding: 80px;
-    margin: 0 20px;
-    font-size: 40px;
-  }
-}
-
-// modify-exam
-.modify-exam {
-  .tips-info {
-    font-size: 14px;
-  }
-  .el-radio-v {
-    display: block;
-    margin-bottom: 8px;
-  }
-}
-// modify-exam-config
-
-// modify-flow-detail
-.modify-flow-detail {
-  .flow-box {
-    display: flex;
-    justify-content: space-between;
-    align-items: stretch;
-  }
-  .flow-property {
-    width: 300px;
-    min-height: 400px;
-    flex-grow: 0;
-    flex-shrink: 0;
-    border: 1px solid $--color-text-gray-5;
-    border-radius: 10px;
-    padding: 15px;
-    background-color: #fff;
-
-    &-title {
-      font-size: 16px;
-      line-height: 1;
-      padding-bottom: 10px;
-      margin-bottom: 10px;
-      border-bottom: 1px solid $--color-text-gray-5;
-    }
-  }
-  .property-part {
-    margin-bottom: 15px;
-    padding-bottom: 15px;
-    border-bottom: 1px solid $--color-text-gray-5;
-
-    &-title {
-      font-size: 14px;
-      line-height: 1;
-      margin-bottom: 10px;
-    }
-  }
-  .property-desc {
-    margin-bottom: 10px;
-  }
-  .flow-radio-v {
-    .el-radio {
-      display: block;
-      margin-bottom: 8px;
-    }
-  }
-  .flow-users {
-    margin-top: 10px;
-  }
-  .user-list {
-    margin-top: 10px;
-
-    .el-tag {
-      margin: 3px;
-    }
-  }
-  .user-clear {
-    padding: 5px 10px;
-    width: 68px;
-    margin: 3px;
-  }
-
-  .flow-content {
-    margin-right: 20px;
-    flex-grow: 1;
-    border: 1px solid $--color-text-gray-5;
-    border-radius: 10px;
-    padding: 10px;
-    position: relative;
-    background-color: #fff;
-  }
-  .flow-main {
-    width: 200px;
-    margin: 30px auto 0;
-  }
-  .flow-node {
-    position: relative;
-    box-shadow: 0 0 0 1px #ccc;
-    border-radius: 10px;
-    margin-bottom: 60px;
-    cursor: pointer;
-
-    &:hover {
-      opacity: 0.9;
-    }
-    &.is-active {
-      opacity: 1;
-      box-shadow: 0 0 0 2px $--color-blue;
-    }
-
-    &-title {
-      padding: 8px 10px;
-      border-bottom: 1px solid #ccc;
-      background-color: $--color-blue;
-      color: #fff;
-      border-top-left-radius: 10px;
-      border-top-right-radius: 10px;
-    }
-    &-content {
-      padding: 10px;
-      min-height: 40px;
-    }
-  }
-  .node-start {
-    cursor: default;
-    .flow-node-content {
-      background-color: mix(#fff, $--color-success, 20%);
-      text-align: center;
-      font-size: 18px;
-      border-radius: 10px;
-      color: #fff;
-    }
-  }
-  .node-end {
-    cursor: default;
-
-    .flow-node-content {
-      background-color: mix(#fff, $--color-danger, 20%);
-      text-align: center;
-      font-size: 18px;
-      border-radius: 10px;
-      color: #fff;
-    }
-  }
-  .flow-link {
-    position: absolute;
-    width: 30px;
-    left: 50%;
-    margin-left: -15px;
-    height: 52px;
-    bottom: -56px;
-
-    &::before {
-      content: "";
-      display: block;
-      position: absolute;
-      border-left: 2px solid $--color-text-gray-2;
-      top: 0;
-      bottom: 2px;
-      left: 50%;
-      margin-left: -1px;
-      z-index: 8;
-    }
-    &::after {
-      content: "";
-      display: block;
-      position: absolute;
-      width: 0;
-      height: 0;
-      border-width: 8px;
-      border-style: solid;
-      border-color: $--color-text-gray-2 transparent transparent transparent;
-      left: 50%;
-      margin-left: -8px;
-      bottom: -8px;
-      z-index: 9;
-    }
-
-    .node-add {
-      position: absolute;
-      width: 24px;
-      height: 24px;
-      top: 50%;
-      left: 50%;
-      transform: translate(-50%, -50%);
-      border-radius: 50%;
-      z-index: 99;
-      background-color: $--color-primary;
-      color: #fff;
-      font-size: 16px;
-      line-height: 25px;
-      text-align: center;
-      cursor: pointer;
-
-      &:hover {
-        background-color: mix(#000, $--color-primary, 10%);
-      }
-    }
-  }
-}
-.select-user-dialog {
-  .user-search {
-    margin-bottom: 5px;
-  }
-  .user-types {
-    font-size: 0;
-    margin-bottom: 5px;
-  }
-  .user-type {
-    display: inline-block;
-    vertical-align: top;
-    font-size: 14px;
-    height: 28px;
-    width: 50%;
-    padding: 0 10px;
-    line-height: 26px;
-    border: 1px solid #e0e0e0;
-    text-align: center;
-    cursor: pointer;
-    &:hover {
-      border-color: $--color-primary;
-      color: $--color-primary;
-    }
-
-    &.is-active {
-      background-color: $--color-primary;
-      border-color: $--color-primary;
-      color: #fff;
-    }
-  }
-  .user-tree {
-    padding: 5px;
-    border: 1px solid #e0e0e0;
-    height: 300px;
-    overflow: auto;
-  }
-  .user-part-title {
-    height: 28px;
-    line-height: 26px;
-    border-radius: 5px;
-    background-color: #f0f0f0;
-    border: 1px solid #e0e0e0;
-    text-align: center;
-    margin-bottom: 5px;
-  }
-  .user-list {
-    border: 1px solid #e0e0e0;
-    padding: 5px;
-    height: 333px;
-    overflow: auto;
-  }
-  .user-item {
-    margin: 3px 0;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    background-color: #f0f0f0;
-    border-radius: 3px;
-  }
-  .user-cont {
-    line-height: 20px;
-    padding: 4px 6px;
-  }
-  .user-delete {
-    padding: 0;
-    color: $--color-danger;
-
-    &:hover {
-      color: mix(#000, $--color-danger, 10%);
-    }
-  }
-}
-
-// card-manage
-.card-create-type {
-  .card-types {
-    font-size: 0;
-    text-align: center;
-  }
-  .card-type {
-    display: inline-block;
-    vertical-align: top;
-    font-size: 20px;
-    margin: 0 5px;
-    height: 70px;
-    width: 150px;
-    line-height: 1;
-    padding: 25px 0;
-    border-radius: $--border-radius;
-    color: #fff;
-    cursor: pointer;
-
-    &:hover {
-      opacity: 0.8;
-    }
-
-    &:nth-of-type(1) {
-      background-color: $--color-primary;
-    }
-    &:nth-of-type(2) {
-      background-color: $--color-success;
-    }
-    &:nth-of-type(3) {
-      background-color: $--color-cyan;
-    }
-  }
-}
-// modify-card
-.modify-card {
-  .el-dialog.is-fullscreen {
-    border: none;
-    .el-dialog__body {
-      border: none;
-      padding: 0;
-    }
-  }
-}
-// modify-mark-params
-.modify-mark-params {
-  .mark-body {
-    margin: 40px 0;
-  }
-  .structure-desc {
-    margin-bottom: 10px;
-  }
-  .expand-btn {
-    display: inline-block;
-    width: 20px;
-    height: 20px;
-    line-height: 19px;
-    font-size: 13px;
-    border: 1px solid #6f7482;
-    border-radius: 3px;
-    text-align: center;
-    cursor: pointer;
-
-    &:hover {
-      color: $--color-primary;
-      border-color: $--color-primary;
-    }
-
-    &-unexpand {
-      background-color: #ebeffc;
-    }
-  }
-  .total-info {
-    text-align: right;
-    padding-top: 10px;
-    padding-right: 210px;
-    > span {
-      color: $--color-danger;
-      font-weight: 600;
-      margin: 0 2px;
-    }
-  }
-  .row-unexpand-sub {
-    display: none;
-  }
-  .marker-header {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    margin-bottom: 10px;
-  }
-}
-// modify-marker-question
-.modify-marker-question {
-  .el-dialog {
-    width: 900px;
-    margin: 0 auto;
-
-    &__header,
-    &__footer {
-      display: none;
-    }
-    &__body {
-      padding: 20px;
-    }
-  }
-
-  .marker-box {
-    height: 600px;
-    background-color: $--color-background;
-    border-radius: $--border-radius;
-    padding: 15px;
-    display: flex;
-    flex-direction: column;
-
-    &-uq {
-      display: block;
-      height: 100%;
-      overflow: auto;
-      background-color: #fff;
-      border: 1px solid $--color-background;
-
-      .el-tag {
-        margin: 3px;
-      }
-    }
-  }
-  .user-title {
-    margin-bottom: 10px;
-    flex-grow: 0;
-  }
-  .user-search {
-    margin-bottom: 10px;
-    flex-grow: 0;
-  }
-  .user-tree {
-    padding: 10px;
-    border-radius: 4px;
-    background-color: #fff;
-    overflow: auto;
-    flex-grow: 2;
-  }
-
-  .marker-footer {
-    margin-top: 15px;
-    text-align: center;
-  }
-}
-// modify-student-simple
-.modify-student-simple {
-  .tab-body {
-    min-height: 300px;
-  }
-}
-// modify-mark-area
-.modify-mark-area {
-  .el-dialog__body {
-    background-color: $--color-background;
-    position: relative;
-    z-index: 3;
-  }
-  .el-dialog__footer {
-    display: none;
-  }
-}
-.area-cropper {
-  position: relative;
-  border: 1px solid #e0e0e0;
-  background-color: #fff;
-  margin: 10px 0;
-
-  .cropper-img img {
-    display: block;
-    width: 100%;
-    height: auto;
-  }
-  .cropper-areas {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    z-index: 9;
-  }
-
-  .area-selection {
-    position: absolute;
-    z-index: 999;
-    border: 1px solid $--color-blue;
-    background-color: rgba($color: #000000, $alpha: 0.2);
-  }
-
-  .element-item-body {
-    position: absolute;
-    background-color: rgba($color: #000000, $alpha: 0.2);
-  }
-  .element-delete {
-    position: absolute;
-    height: 20px;
-    width: 20px;
-    top: 0;
-    right: -20px;
-    line-height: 20px;
-    text-align: center;
-    font-size: 18px;
-    display: none;
-    z-index: 9;
-    color: $--color-danger;
-    cursor: pointer;
-    &:hover {
-      color: mix(#fff, $--color-danger, 20%);
-    }
-  }
-
-  .element-resize {
-    background-color: transparent;
-    > .resize-control {
-      > .control-point,
-      > .control-line {
-        display: none;
-      }
-    }
-
-    &:hover {
-      > .resize-control {
-        > .control-line {
-          display: block;
-        }
-      }
-    }
-
-    &-act {
-      > .resize-control {
-        > .control-point,
-        > .control-line {
-          display: block;
-        }
-      }
-      .element-delete {
-        display: block;
-      }
-    }
-  }
-  .element-resize-compact {
-    > .resize-control {
-      > .control-line {
-        display: block;
-      }
-    }
-
-    &:hover {
-      > .resize-control {
-        > .control-line {
-          border-color: $--color-primary;
-        }
-      }
-    }
-
-    &.element-resize-act {
-      > .resize-control {
-        > .control-line {
-          border-color: $--color-primary;
-          &-left,
-          &-right {
-            border-left-style: solid;
-          }
-          &-top,
-          &-bottom {
-            border-top-style: solid;
-          }
-        }
-      }
-    }
-  }
-}
-// answer-popover
-.answer-popover {
-  line-height: 24px;
-  padding: 15px;
-
-  .answer-divider {
-    margin: 10px 0;
-    height: 1px;
-    border-bottom: 1px dashed $--color-text-gray-5;
-  }
-  .el-checkbox__label,
-  .el-radio__label {
-    width: 24px;
-    text-align: center;
-  }
-  .el-radio__label {
-    display: inline-block;
-  }
-}
+.task-apply-steps {
+  min-height: 90px;
+  margin-bottom: 20px;
+  margin-top: -32px;
+  .el-step__title {
+    font-size: 14px;
+    line-height: 30px;
+  }
+}
+.task-exam-room {
+  background-color: #fff;
+  border-radius: $--border-radius;
+  margin-bottom: 10px;
+}
+// task-detail
+.task-detail {
+  .table {
+    border-radius: $--border-radius;
+    color: $--color-text-dark-1;
+    border: 1px solid $--color-border;
+    border-bottom: 0;
+    border-right: 0;
+    border-collapse: separate;
+    overflow: hidden;
+
+    th {
+      border-left: 0;
+      border-top: 0;
+      color: $--color-text-gray-2;
+      padding: 15px;
+    }
+    td {
+      border-left: 0;
+      border-top: 0;
+      padding: 10px 15px;
+
+      i {
+        display: inline-block;
+        vertical-align: middle;
+      }
+    }
+  }
+  .icon {
+    margin-right: 8px;
+  }
+
+  .task-action {
+    margin-top: 50px;
+    text-align: center;
+  }
+  .task-audit {
+    padding-top: 15px;
+    border-top: 2px dashed $--color-border;
+    margin-top: 20px;
+  }
+  // .task-audit-history {
+  // }
+
+  .image-item {
+    display: inline-block;
+    vertical-align: top;
+    width: 80px;
+    height: 80px;
+    margin: 0 10px 10px 0;
+    border: 1px solid $--color-text-gray-4;
+    position: relative;
+    border-radius: 5px;
+    overflow: hidden;
+
+    img {
+      position: absolute;
+      margin: auto;
+      max-width: 100%;
+      max-height: 100%;
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      z-index: auto;
+      cursor: pointer;
+    }
+
+    .image-delete {
+      display: none;
+      position: absolute;
+      z-index: 99;
+      width: 100%;
+      height: 30px;
+      line-height: 30px;
+      text-align: center;
+      font-size: 20px;
+      bottom: 0;
+      left: 0;
+      background-color: rgba($color: #000000, $alpha: 0.3);
+      color: $--color-danger;
+      cursor: pointer;
+    }
+
+    &:hover {
+      .image-delete {
+        display: block;
+      }
+    }
+  }
+  .image-add {
+    font-size: 40px;
+    line-height: 1;
+    padding: 19px;
+    text-align: center;
+    border-radius: 5px;
+    border-style: dashed;
+    overflow: hidden;
+    cursor: pointer;
+    color: $--color-text-gray-5;
+
+    &:hover {
+      color: $--color-text-gray-3;
+    }
+  }
+  .image-list-none {
+    color: $--color-text-gray-2;
+    margin-bottom: 10px;
+  }
+}
+// apply-audit-history
+.apply-audit-history {
+  .audit-result {
+    margin: 10px 0;
+  }
+}
+// task-list
+.task-head {
+  font-size: 16px;
+
+  i {
+    cursor: pointer;
+
+    &:hover {
+      color: $--color-primary;
+    }
+  }
+}
+.task-list {
+  .task-item {
+    margin-bottom: 15px;
+    padding: 15px;
+    border-radius: $--border-radius;
+    background-color: $--color-background;
+
+    p {
+      line-height: 1.5;
+      margin-bottom: 5px;
+      > span:first-child {
+        color: $--color-text-dark-1;
+      }
+    }
+  }
+  .task-action {
+    cursor: pointer;
+    &:hover {
+      color: $--color-primary;
+    }
+  }
+}
+// create-exam-and-print-task
+.create-exam-and-print-task {
+  .apply-body {
+    width: 1000px;
+    margin: 0 auto 30px;
+  }
+  .apply-part {
+    padding: 20px 30px;
+    border-radius: 20px;
+    border: 1px solid $--color-text-gray-5;
+    margin-bottom: 20px;
+
+    &-title {
+      font-weight: 600;
+      font-size: 18px;
+      line-height: 1;
+      margin-bottom: 30px;
+    }
+  }
+}
+// flow-timeline
+.flow-timeline {
+  margin-top: 10px;
+  padding: 15px;
+  border: 1px solid $--color-text-gray-6;
+  border-radius: 10px;
+  background-color: $--color-text-gray-7;
+  .el-timeline {
+    padding: 0 10px;
+    &-item__tail {
+      border-color: #ddd;
+    }
+  }
+  .timeline-item-stop {
+    .el-timeline-item__tail {
+      border-left-style: dashed;
+    }
+  }
+
+  .el-timeline-item__node--success {
+    background-color: $--color-success;
+  }
+
+  .flow-item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+
+    &-time {
+      color: #909399;
+      line-height: 1;
+      font-size: 13px;
+      margin-bottom: 8px;
+      padding-top: 4px;
+    }
+    &-title {
+      font-size: 16px;
+      line-height: 1;
+      margin-bottom: 5px;
+    }
+    &-desc {
+      color: $--color-text-gray;
+
+      > span:not(:first-child) {
+        margin-left: 10px;
+      }
+    }
+
+    &-attachment {
+      .btn-primary {
+        &:hover {
+          font-weight: normal;
+        }
+
+        & + .btn-primary {
+          position: relative;
+          margin-left: 20px;
+
+          &::before {
+            content: "";
+            display: block;
+            position: absolute;
+            width: 0;
+            height: 14px;
+            border-left: 1px solid $--color-text-gray-4;
+            left: -10px;
+            top: 50%;
+            margin-top: -7px;
+          }
+        }
+      }
+    }
+
+    &-action {
+      text-align: center;
+    }
+
+    // action
+    .user-select {
+      width: 40px;
+      height: 40px;
+      padding: 10px;
+      font-size: 18px;
+      line-height: 1;
+    }
+  }
+}
+
+// wait-task
+.wait-task {
+  .wait-module {
+    height: 100%;
+  }
+}
+// card-title-rule-edit
+.card-title-rule-edit {
+  .field-item {
+    display: inline-block;
+    vertical-align: top;
+    margin: 0 10px 10px 0;
+    padding: 8px 10px;
+    border-radius: 4px;
+    line-height: 1;
+    background-color: $--color-background;
+    cursor: pointer;
+
+    &:hover {
+      color: $--color-primary;
+    }
+    &-act {
+      background-color: $--color-primary;
+      color: #fff !important;
+    }
+    &-disabled {
+      cursor: not-allowed;
+
+      &:hover {
+        color: $--color-text-dark;
+      }
+    }
+  }
+  .field-textarea {
+    border-radius: $--border-radius;
+    border: 1px solid $--color-text-gray-4;
+    min-height: 60px;
+    padding: 2px;
+    overflow: hidden;
+
+    &:focus {
+      border-color: $--color-primary;
+    }
+
+    span.var-field {
+      display: inline-block;
+      vertical-align: middle;
+      padding: 3px 5px;
+      background-color: $--color-primary;
+      color: $--color-white;
+      line-height: 1;
+      border-radius: 3px;
+    }
+  }
+}
+
+// page-preview
+.preview-frame {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 99;
+}
+// label-edit
+.label-edit {
+  min-height: 60px;
+  .label-item {
+    display: inline-block;
+    vertical-align: top;
+    border: 1px solid $--color-text-gray-6;
+    border-radius: $--border-radius;
+    padding: 5px 40px 5px 10px;
+    position: relative;
+    margin: 0 10px 10px 0;
+    line-height: 21px;
+  }
+  .label-item-content {
+    margin: 0;
+    line-height: 21px;
+    vertical-align: middle;
+  }
+  .label-item-delete {
+    position: absolute;
+    right: 10px;
+    top: 50%;
+    transform: translateY(-50%);
+    z-index: 99;
+    font-size: 16px;
+    color: $--color-text-gray-5;
+    cursor: pointer;
+    &:hover {
+      color: $--color-danger;
+    }
+  }
+  .label-add {
+    display: inline-block;
+    vertical-align: top;
+    border: 1px solid $--color-text-gray-6;
+    border-radius: $--border-radius;
+    padding: 0 10px;
+    color: $--color-text-gray-2;
+    cursor: pointer;
+    &:hover {
+      border-color: $--color-primary;
+      color: $--color-primary;
+    }
+  }
+}
+
+// rule-exam
+
+// select-orgs
+.select-orgs {
+  position: relative;
+
+  &-disabled {
+    &::before {
+      content: "";
+      position: absolute;
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      z-index: 99;
+      background-color: #f5f7fa;
+      opacity: 0.3;
+      cursor: not-allowed;
+    }
+  }
+
+  .el-checkbox.is-disabled + span.el-tree-node__label {
+    color: $--color-text-gray-4;
+  }
+}
+// privilege-set
+.privilege-set {
+  .cell-check-list {
+    text-align: left;
+    padding-left: 20px;
+  }
+}
+// organization-manage
+.organization-manage {
+  .org-tree-head {
+    height: 40px;
+    line-height: 40px;
+    color: $--color-text-gray-2;
+    border-bottom: 1px solid $--color-border;
+    padding: 0 8px;
+
+    > div {
+      float: right;
+      font-weight: 500;
+      &:first-child {
+        float: left;
+      }
+
+      &:nth-of-type(2) {
+        width: 200px;
+        text-align: right;
+      }
+      &:nth-of-type(3) {
+        width: 100px;
+      }
+    }
+  }
+  .el-tree-node__content {
+    height: auto;
+    padding: 4px 0;
+    border-bottom: 1px solid $--color-border;
+  }
+  .org-edit {
+    .org-type {
+      width: 100px;
+      display: inline-block;
+    }
+    .org-actions {
+      width: 200px;
+      display: inline-block;
+      text-align: right;
+    }
+    .el-button--text:hover {
+      transform: scale(1.1);
+    }
+  }
+}
+// modify-print-plan
+.modify-print-plan {
+  .part-box {
+    margin-bottom: 40px;
+  }
+}
+
+// paper-track-preview-dialog
+.paper-track-preview-dialog {
+  .paper-preview {
+    overflow: auto;
+    canvas {
+      display: block;
+      margin: 0 auto;
+    }
+  }
+  .preview-loading {
+    position: absolute;
+    top: 100px;
+    width: 100%;
+    z-index: auto;
+    font-size: 100px;
+    text-align: center;
+    color: #aaa;
+  }
+  .el-dialog__body {
+    padding: 70px 20px 80px !important;
+  }
+  .el-dialog__footer {
+    position: fixed;
+    width: 100%;
+    left: 0;
+    bottom: 0;
+    z-index: 9;
+    padding: 15px 20px;
+    border-top: 1px solid #eff0f5;
+    background-color: #fff;
+    .el-button {
+      float: none;
+    }
+  }
+}
+
+// marker-login
+.marker-login {
+  .part-box {
+    padding: 100px 50px;
+    text-align: center;
+  }
+  .auth-item {
+    padding: 80px;
+    margin: 0 20px;
+    font-size: 40px;
+  }
+}
+
+// modify-exam
+.modify-exam {
+  .tips-info {
+    font-size: 14px;
+  }
+  .el-radio-v {
+    display: block;
+    margin-bottom: 8px;
+  }
+}
+// modify-exam-config
+
+// modify-flow-detail
+.modify-flow-detail {
+  .flow-box {
+    display: flex;
+    justify-content: space-between;
+    align-items: stretch;
+  }
+  .flow-property {
+    width: 300px;
+    min-height: 400px;
+    flex-grow: 0;
+    flex-shrink: 0;
+    border: 1px solid $--color-text-gray-5;
+    border-radius: 10px;
+    padding: 15px;
+    background-color: #fff;
+
+    &-title {
+      font-size: 16px;
+      line-height: 1;
+      padding-bottom: 10px;
+      margin-bottom: 10px;
+      border-bottom: 1px solid $--color-text-gray-5;
+    }
+  }
+  .property-part {
+    margin-bottom: 15px;
+    padding-bottom: 15px;
+    border-bottom: 1px solid $--color-text-gray-5;
+
+    &-title {
+      font-size: 14px;
+      line-height: 1;
+      margin-bottom: 10px;
+    }
+  }
+  .property-desc {
+    margin-bottom: 10px;
+  }
+  .flow-radio-v {
+    .el-radio {
+      display: block;
+      margin-bottom: 8px;
+    }
+  }
+  .flow-users {
+    margin-top: 10px;
+  }
+  .user-list {
+    margin-top: 10px;
+
+    .el-tag {
+      margin: 3px;
+    }
+  }
+  .user-clear {
+    padding: 5px 10px;
+    width: 68px;
+    margin: 3px;
+  }
+
+  .flow-content {
+    margin-right: 20px;
+    flex-grow: 1;
+    border: 1px solid $--color-text-gray-5;
+    border-radius: 10px;
+    padding: 10px;
+    position: relative;
+    background-color: #fff;
+  }
+  .flow-main {
+    width: 200px;
+    margin: 30px auto 0;
+  }
+  .flow-node {
+    position: relative;
+    box-shadow: 0 0 0 1px #ccc;
+    border-radius: 10px;
+    margin-bottom: 60px;
+    cursor: pointer;
+
+    &:hover {
+      opacity: 0.9;
+    }
+    &.is-active {
+      opacity: 1;
+      box-shadow: 0 0 0 2px $--color-blue;
+    }
+
+    &-title {
+      padding: 8px 10px;
+      border-bottom: 1px solid #ccc;
+      background-color: $--color-blue;
+      color: #fff;
+      border-top-left-radius: 10px;
+      border-top-right-radius: 10px;
+    }
+    &-content {
+      padding: 10px;
+      min-height: 40px;
+    }
+  }
+  .node-start {
+    cursor: default;
+    .flow-node-content {
+      background-color: mix(#fff, $--color-success, 20%);
+      text-align: center;
+      font-size: 18px;
+      border-radius: 10px;
+      color: #fff;
+    }
+  }
+  .node-end {
+    cursor: default;
+
+    .flow-node-content {
+      background-color: mix(#fff, $--color-danger, 20%);
+      text-align: center;
+      font-size: 18px;
+      border-radius: 10px;
+      color: #fff;
+    }
+  }
+  .flow-link {
+    position: absolute;
+    width: 30px;
+    left: 50%;
+    margin-left: -15px;
+    height: 52px;
+    bottom: -56px;
+
+    &::before {
+      content: "";
+      display: block;
+      position: absolute;
+      border-left: 2px solid $--color-text-gray-2;
+      top: 0;
+      bottom: 2px;
+      left: 50%;
+      margin-left: -1px;
+      z-index: 8;
+    }
+    &::after {
+      content: "";
+      display: block;
+      position: absolute;
+      width: 0;
+      height: 0;
+      border-width: 8px;
+      border-style: solid;
+      border-color: $--color-text-gray-2 transparent transparent transparent;
+      left: 50%;
+      margin-left: -8px;
+      bottom: -8px;
+      z-index: 9;
+    }
+
+    .node-add {
+      position: absolute;
+      width: 24px;
+      height: 24px;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -50%);
+      border-radius: 50%;
+      z-index: 99;
+      background-color: $--color-primary;
+      color: #fff;
+      font-size: 16px;
+      line-height: 25px;
+      text-align: center;
+      cursor: pointer;
+
+      &:hover {
+        background-color: mix(#000, $--color-primary, 10%);
+      }
+    }
+  }
+}
+.select-user-dialog {
+  .user-search {
+    margin-bottom: 5px;
+  }
+  .user-types {
+    font-size: 0;
+    margin-bottom: 5px;
+  }
+  .user-type {
+    display: inline-block;
+    vertical-align: top;
+    font-size: 14px;
+    height: 28px;
+    width: 50%;
+    padding: 0 10px;
+    line-height: 26px;
+    border: 1px solid #e0e0e0;
+    text-align: center;
+    cursor: pointer;
+    &:hover {
+      border-color: $--color-primary;
+      color: $--color-primary;
+    }
+
+    &.is-active {
+      background-color: $--color-primary;
+      border-color: $--color-primary;
+      color: #fff;
+    }
+  }
+  .user-tree {
+    padding: 5px;
+    border: 1px solid #e0e0e0;
+    height: 300px;
+    overflow: auto;
+  }
+  .user-part-title {
+    height: 28px;
+    line-height: 26px;
+    border-radius: 5px;
+    background-color: #f0f0f0;
+    border: 1px solid #e0e0e0;
+    text-align: center;
+    margin-bottom: 5px;
+  }
+  .user-list {
+    border: 1px solid #e0e0e0;
+    padding: 5px;
+    height: 333px;
+    overflow: auto;
+  }
+  .user-item {
+    margin: 3px 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: #f0f0f0;
+    border-radius: 3px;
+  }
+  .user-cont {
+    line-height: 20px;
+    padding: 4px 6px;
+  }
+  .user-delete {
+    padding: 0;
+    color: $--color-danger;
+
+    &:hover {
+      color: mix(#000, $--color-danger, 10%);
+    }
+  }
+}
+
+// card-manage
+.card-create-type {
+  .card-types {
+    font-size: 0;
+    text-align: center;
+  }
+  .card-type {
+    display: inline-block;
+    vertical-align: top;
+    font-size: 20px;
+    margin: 0 5px;
+    height: 70px;
+    width: 150px;
+    line-height: 1;
+    padding: 25px 0;
+    border-radius: $--border-radius;
+    color: #fff;
+    cursor: pointer;
+
+    &:hover {
+      opacity: 0.8;
+    }
+
+    &:nth-of-type(1) {
+      background-color: $--color-primary;
+    }
+    &:nth-of-type(2) {
+      background-color: $--color-success;
+    }
+    &:nth-of-type(3) {
+      background-color: $--color-cyan;
+    }
+  }
+}
+// modify-card
+.modify-card {
+  .el-dialog.is-fullscreen {
+    border: none;
+    .el-dialog__body {
+      border: none;
+      padding: 0;
+    }
+  }
+}
+// modify-mark-params
+.modify-mark-params {
+  .mark-body {
+    margin: 40px 0;
+  }
+  .structure-desc {
+    margin-bottom: 10px;
+  }
+  .expand-btn {
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+    line-height: 19px;
+    font-size: 13px;
+    border: 1px solid #6f7482;
+    border-radius: 3px;
+    text-align: center;
+    cursor: pointer;
+
+    &:hover {
+      color: $--color-primary;
+      border-color: $--color-primary;
+    }
+
+    &-unexpand {
+      background-color: #ebeffc;
+    }
+  }
+  .total-info {
+    text-align: right;
+    padding-top: 10px;
+    padding-right: 210px;
+    > span {
+      color: $--color-danger;
+      font-weight: 600;
+      margin: 0 2px;
+    }
+  }
+  .row-unexpand-sub {
+    display: none;
+  }
+  .marker-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 10px;
+  }
+}
+// modify-marker-question
+.modify-marker-question {
+  .el-dialog {
+    width: 900px;
+    margin: 0 auto;
+
+    &__header,
+    &__footer {
+      display: none;
+    }
+    &__body {
+      padding: 20px;
+    }
+  }
+
+  .marker-box {
+    height: 600px;
+    background-color: $--color-background;
+    border-radius: $--border-radius;
+    padding: 15px;
+    display: flex;
+    flex-direction: column;
+
+    &-uq {
+      display: block;
+      height: 100%;
+      overflow: auto;
+      background-color: #fff;
+      border: 1px solid $--color-background;
+
+      .el-tag {
+        margin: 3px;
+      }
+    }
+  }
+  .user-title {
+    margin-bottom: 10px;
+    flex-grow: 0;
+  }
+  .user-search {
+    margin-bottom: 10px;
+    flex-grow: 0;
+  }
+  .user-tree {
+    padding: 10px;
+    border-radius: 4px;
+    background-color: #fff;
+    overflow: auto;
+    flex-grow: 2;
+  }
+
+  .marker-footer {
+    margin-top: 15px;
+    text-align: center;
+  }
+}
+// modify-student-simple
+.modify-student-simple {
+  .tab-body {
+    min-height: 300px;
+  }
+}
+// modify-mark-area
+.modify-mark-area {
+  .el-dialog__body {
+    background-color: $--color-background;
+    position: relative;
+    z-index: 3;
+  }
+  .el-dialog__footer {
+    display: none;
+  }
+}
+.area-cropper {
+  position: relative;
+  border: 1px solid #e0e0e0;
+  background-color: #fff;
+  margin: 10px 0;
+
+  .cropper-img img {
+    display: block;
+    width: 100%;
+    height: auto;
+  }
+  .cropper-areas {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 9;
+  }
+
+  .area-selection {
+    position: absolute;
+    z-index: 999;
+    border: 1px solid $--color-blue;
+    background-color: rgba($color: #000000, $alpha: 0.2);
+  }
+
+  .element-item-body {
+    position: absolute;
+    background-color: rgba($color: #000000, $alpha: 0.2);
+  }
+  .element-delete {
+    position: absolute;
+    height: 20px;
+    width: 20px;
+    top: 0;
+    right: -20px;
+    line-height: 20px;
+    text-align: center;
+    font-size: 18px;
+    display: none;
+    z-index: 9;
+    color: $--color-danger;
+    cursor: pointer;
+    &:hover {
+      color: mix(#fff, $--color-danger, 20%);
+    }
+  }
+
+  .element-resize {
+    background-color: transparent;
+    > .resize-control {
+      > .control-point,
+      > .control-line {
+        display: none;
+      }
+    }
+
+    &:hover {
+      > .resize-control {
+        > .control-line {
+          display: block;
+        }
+      }
+    }
+
+    &-act {
+      > .resize-control {
+        > .control-point,
+        > .control-line {
+          display: block;
+        }
+      }
+      .element-delete {
+        display: block;
+      }
+    }
+  }
+  .element-resize-compact {
+    > .resize-control {
+      > .control-line {
+        display: block;
+      }
+    }
+
+    &:hover {
+      > .resize-control {
+        > .control-line {
+          border-color: $--color-primary;
+        }
+      }
+    }
+
+    &.element-resize-act {
+      > .resize-control {
+        > .control-line {
+          border-color: $--color-primary;
+          &-left,
+          &-right {
+            border-left-style: solid;
+          }
+          &-top,
+          &-bottom {
+            border-top-style: solid;
+          }
+        }
+      }
+    }
+  }
+}
+// answer-popover
+.answer-popover {
+  line-height: 24px;
+  padding: 15px;
+
+  .answer-divider {
+    margin: 10px 0;
+    height: 1px;
+    border-bottom: 1px dashed $--color-text-gray-5;
+  }
+  .el-checkbox__label,
+  .el-radio__label {
+    width: 24px;
+    text-align: center;
+  }
+  .el-radio__label {
+    display: inline-block;
+  }
+}
+
+// modify-base-config
+.modify-base-config {
+  &.el-dialog {
+    background-color: $--color-background;
+
+    .el-dialog__body {
+      padding-top: 70px;
+    }
+  }
+  .config-footer {
+    margin-top: 40px;
+    text-align: center;
+  }
+}
+.proficiency-edit {
+  .el-form-item__content {
+    margin-bottom: 5px;
+  }
+}
+.rate-input {
+  .el-input-number {
+    width: 60px;
+    margin: 0 10px;
+
+    .el-input__inner {
+      padding-left: 10px;
+      padding-right: 20px;
+    }
+
+    .el-input::after {
+      content: "%";
+      display: block;
+      position: absolute;
+      right: 10px;
+      top: 50%;
+      margin-top: -8px;
+      font-size: 14px;
+      line-height: 1;
+      z-index: 9;
+    }
+  }
+  &-offset-left {
+    padding-left: 87px;
+  }
+}
+
+.analysis-report-view {
+  .auth-item {
+    padding: 80px;
+    margin: 0 20px;
+    font-size: 40px;
+  }
+}

+ 43 - 42
src/assets/styles/variables.scss

@@ -1,42 +1,43 @@
-// color ------------------->
-$--color-text-dark: #1f2230 !default;
-$--color-text-dark-1: #434656 !default;
-$--color-text-gray: #6f7482 !default;
-$--color-text-gray-1: #7a7c87 !default;
-$--color-text-gray-2: #8b8fa1 !default;
-$--color-text-gray-3: #aaa !default;
-$--color-text-gray-4: #ccc !default;
-$--color-text-gray-5: #d3d5e0 !default;
-$--color-text-gray-6: #e0e1eb !default;
-$--color-text-gray-7: #f2f4fa !default;
-$--color-border: #eff0f5;
-$--color-background: #eff0f5;
-// status
-$--color-primary: #3a5ae5 !default;
-$--color-primary-light: mix(#fff, $--color-primary, 20%) !default;
-$--color-success: #3fcb98 !default;
-$--color-success-light: #32cf8a !default;
-$--color-warning: #ff9427 !default;
-$--color-danger: #fe5d4e !default;
-$--color-cyan: #2abcff !default;
-$--color-cyan-light: #5fc9fa !default;
-$--color-blue: #556dff !default;
-$--color-blue-white: #4f79ff !default;
-$--color-blue-dark: #172666 !default;
-$--color-purple: #9877ff !default;
-$--color-white: #ffffff;
-$--color-dark: #1f2230;
-
-// shadow
-$--shadow-light: 0 0 1px rgba(0, 0, 0, 0.15) !default;
-
-// size ------------------->
-$--font-size-base: 14px !default;
-$--font-size-medium: 16px !default;
-$--font-size-large: 18px !default;
-$--border-radius: 8px;
-$--border-radius-large: 12px;
-$--border-radius-huge: 20px;
-// font-family
-$--font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
-  "Microsoft YaHei", Arial, sans-serif;
+// color ------------------->
+$--color-text-dark: #1f2230 !default;
+$--color-text-dark-1: #434656 !default;
+$--color-text-gray: #6f7482 !default;
+$--color-text-gray-1: #7a7c87 !default;
+$--color-text-gray-2: #8b8fa1 !default;
+$--color-text-gray-3: #aaa !default;
+$--color-text-gray-4: #ccc !default;
+$--color-text-gray-5: #d3d5e0 !default;
+$--color-text-gray-6: #e0e1eb !default;
+$--color-text-gray-7: #f2f4fa !default;
+$--color-border: #eff0f5;
+$--color-border-bold: #e6e6e6;
+$--color-background: #eff0f5;
+// status
+$--color-primary: #3a5ae5 !default;
+$--color-primary-light: mix(#fff, $--color-primary, 20%) !default;
+$--color-success: #3fcb98 !default;
+$--color-success-light: #32cf8a !default;
+$--color-warning: #ff9427 !default;
+$--color-danger: #fe5d4e !default;
+$--color-cyan: #2abcff !default;
+$--color-cyan-light: #5fc9fa !default;
+$--color-blue: #556dff !default;
+$--color-blue-white: #4f79ff !default;
+$--color-blue-dark: #172666 !default;
+$--color-purple: #9877ff !default;
+$--color-white: #ffffff;
+$--color-dark: #1f2230;
+
+// shadow
+$--shadow-light: 0 0 1px rgba(0, 0, 0, 0.15) !default;
+
+// size ------------------->
+$--font-size-base: 14px !default;
+$--font-size-medium: 16px !default;
+$--font-size-large: 18px !default;
+$--border-radius: 8px;
+$--border-radius-large: 12px;
+$--border-radius-huge: 20px;
+// font-family
+$--font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
+  "Microsoft YaHei", Arial, sans-serif;

+ 30 - 3
src/modules/analysis/api.js

@@ -2,10 +2,32 @@ import { $postParam, $post } from "@/plugins/axios";
 
 // data-init-manage
 export const dataInitList = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+  return $postParam("/api/admin/grade/paper/initialize", datas);
 };
-export const updateKnowledgeDimension = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+// dimension
+export const paperDimensionList = datas => {
+  return $postParam("/api/admin/grade/paper/dimension/list", datas);
+};
+export const updatePaperDimension = datas => {
+  return $post("/api/admin/grade/paper/dimension/save", datas);
+};
+export const paperStructList = datas => {
+  return $postParam("/api/admin/grade/paper/struct/list", datas);
+};
+export const updatePaperStruct = datas => {
+  return $post("/api/admin/grade/paper/struct/save", datas);
+};
+export const paperDefineList = datas => {
+  return $postParam("/api/admin/grade/paper/paper_define", datas);
+};
+export const updatePaperDefine = datas => {
+  return $post("/api/admin/grade/paper/save_define", datas);
+};
+export const moduleEvaluationList = datas => {
+  return $postParam("/api/admin/grade/module/evaluation/list", datas);
+};
+export const updateModuleEvaluation = datas => {
+  return $post("/api/admin/grade/module/evaluation/save", datas);
 };
 
 // analysis-course-manage
@@ -30,3 +52,8 @@ export const deleteAnalysisBatchPaper = idList => {
 export const analysisPaperList = datas => {
   return $postParam("/api/admin/grade/batch/paper/able", datas);
 };
+
+// analysis-report-view
+export const ssoAnalysisLogin = datas => {
+  return $postParam("/api/admin/exam/sso/analysis_login", datas);
+};

+ 4 - 5
src/modules/analysis/components/ModifyBaseConfig.vue

@@ -1,8 +1,7 @@
 <template>
   <el-dialog
-    custom-class="modify-base-config"
+    class="modify-base-config page-dialog"
     :visible.sync="modalIsShow"
-    title="基础配置"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
@@ -13,7 +12,7 @@
       基础配置<span class="color-gray-2 ml-2">{{ insCont }}</span>
     </div>
     <div class="part-box part-box-pad">
-      <el-steps :active="curStep" align-center>
+      <el-steps :active="curStep" align-center finish-status="success">
         <el-step v-for="(item, ind) in steps" :key="item.val">
           <el-button
             slot="title"
@@ -56,7 +55,7 @@ export default {
   },
   data() {
     return {
-      modalIsShow: true,
+      modalIsShow: false,
       isSubmit: false,
       curStep: 0,
       steps: [
@@ -89,7 +88,7 @@ export default {
       return `${stepVal}-config`;
     },
     insCont() {
-      return `${this.instance.semester}-${this.instance.examName}-${this.instance.courseName}(${this.instance.courseCode})`;
+      return `${this.instance.semesterName}-${this.instance.examName}-${this.instance.courseName}(${this.instance.courseCode})`;
     }
   },
   methods: {

+ 14 - 2
src/modules/analysis/components/baseConfig/BlueprintConfig.vue

@@ -55,6 +55,16 @@
       </el-table>
     </div>
 
+    <div class="config-footer">
+      <el-button
+        class="width-200"
+        type="primary"
+        :loading="loading"
+        @click="toSubmit"
+        >保存</el-button
+      >
+    </div>
+
     <import-file
       ref="ImportFile"
       title="上传文件"
@@ -79,8 +89,9 @@ export default {
       dataList: [],
       knowledgeList: [],
       abilityList: [],
+      loading: false,
       // upload
-      uploadUrl: "yourUploadPath",
+      uploadUrl: "/api/admin/grade/paper/struct/import",
       downloadUrl: "",
       downloadFilename: ""
     };
@@ -90,7 +101,8 @@ export default {
     toImport() {
       this.$refs.ImportFile.open();
     },
-    fileUploaded() {}
+    fileUploaded() {},
+    toSubmit() {}
   }
 };
 </script>

+ 10 - 29
src/modules/analysis/components/baseConfig/CommentAbility.vue

@@ -1,8 +1,12 @@
 <template>
   <div class="comment-ability">
     <el-table ref="TableList" :data="dataList">
-      <el-table-column prop="level" label="等级" width="60"></el-table-column>
-      <el-table-column prop="level" label="划分规划" width="300">
+      <el-table-column
+        prop="levelCode"
+        label="等级"
+        width="60"
+      ></el-table-column>
+      <el-table-column label="划分规划" width="300">
         <div
           slot-scope="scope"
           :class="[
@@ -39,12 +43,12 @@
         </div>
       </el-table-column>
       <el-table-column
-        prop="levelDesc"
+        prop="levelName"
         label="水平层次"
         width="140"
       ></el-table-column>
       <el-table-column prop="result" label="诊断结果"></el-table-column>
-      <el-table-column prop="suggest" label="学习建议"></el-table-column>
+      <el-table-column prop="advice" label="学习建议"></el-table-column>
       <el-table-column
         class-name="action-column"
         label="操作"
@@ -58,7 +62,6 @@
         </template>
       </el-table-column>
     </el-table>
-    <p v-if="errorMsg" class="tips-info tips-error">{{ errorMsg }}</p>
 
     <!-- ModifyAbilityComment -->
     <modify-ability-comment
@@ -70,7 +73,6 @@
 </template>
 
 <script>
-import { initAbilityList } from "./defaultComment";
 import ModifyAbilityComment from "./ModifyAbilityComment.vue";
 
 export default {
@@ -92,8 +94,7 @@ export default {
     };
   },
   mounted() {
-    const data = this.rates.length ? this.rates : initAbilityList;
-    this.dataList = data.map(item => {
+    this.dataList = this.rates.map(item => {
       return { ...item };
     });
   },
@@ -107,27 +108,7 @@ export default {
       this.dataList[ind] = this.$objAssign(this.dataList[ind], data);
     },
     rateChange() {
-      const isEmpty = num => !num && num !== 0;
-
-      if (
-        this.dataList.some(
-          item => isEmpty(item.startRate) || isEmpty(item.endRate)
-        )
-      ) {
-        this.errorMsg = "请完成划分规则";
-        return;
-      }
-
-      for (let i = 0; i < this.dataList.length; i++) {
-        const item = this.dataList[i];
-        if (i) {
-          const prevItem = this.dataList[i - 1];
-          if (prevItem.endRate + 1 !== item.startRate) {
-            this.errorMsg = "请保证区间连续";
-            return;
-          }
-        }
-      }
+      this.$emit("data-change", this.dataList);
     }
   }
 };

+ 205 - 2
src/modules/analysis/components/baseConfig/CommentConfig.vue

@@ -11,13 +11,30 @@
       </el-button>
     </div>
 
-    <component :is="compName" :course="course"></component>
+    <component
+      :is="compName"
+      :course="course"
+      @data-change="dataChange"
+    ></component>
+    <p v-if="errorMsg" class="tips-info tips-error">{{ errorMsg }}</p>
+
+    <div class="config-footer">
+      <el-button
+        class="width-200"
+        type="primary"
+        :loading="loading"
+        @click="toSubmit"
+        >保存</el-button
+      >
+    </div>
   </div>
 </template>
 
 <script>
 import CommentKnowledge from "./CommentKnowledge.vue";
 import CommentAbility from "./CommentAbility.vue";
+import { initKnowledgeList, initAbilityList } from "./defaultComment";
+import { updateModuleEvaluation } from "../../api";
 
 export default {
   name: "comment-config",
@@ -28,6 +45,12 @@ export default {
       default() {
         return {};
       }
+    },
+    configs: {
+      type: Object,
+      default() {
+        return {};
+      }
     }
   },
   data() {
@@ -42,7 +65,11 @@ export default {
           name: "能力维度",
           val: "ability"
         }
-      ]
+      ],
+      loading: false,
+      knowledgeList: [],
+      abilityList: [],
+      errorMsg: ""
     };
   },
   computed: {
@@ -50,9 +77,185 @@ export default {
       return `comment-${this.curTab}`;
     }
   },
+  created() {
+    this.initData();
+  },
   methods: {
+    initData() {
+      const { evaluationList } = this.configs;
+      this.parseKnowledgeList(evaluationList);
+      this.parseAbilityList(evaluationList);
+    },
+    parseKnowledgeList(evaluationList) {
+      const rateList = evaluationList.filter(
+        item => item.moduleType === "KNOWLEDGE"
+      );
+      if (rateList.length) {
+        this.knowledgeList = rateList.map(item => {
+          return {
+            levelCode: item.levelCode,
+            levelName: item.levelName,
+            result: item.result,
+            advice: item.advice,
+            startRate: item.min * 100,
+            endRate: item.max * 100
+          };
+        });
+      } else {
+        this.knowledgeList = initKnowledgeList.map(item => {
+          return { ...item };
+        });
+      }
+    },
+    parseAbilityList(evaluationList) {
+      const rateList = evaluationList.filter(
+        item => item.moduleType === "ABILITY"
+      );
+      if (rateList.length) {
+        this.abilityList = rateList.map(item => {
+          return {
+            levelCode: item.levelCode,
+            levelName: item.levelName,
+            result: item.result,
+            advice: item.advice,
+            startRate: item.min,
+            endRate: item.max
+          };
+        });
+      } else {
+        this.abilityList = initAbilityList.map(item => {
+          return { ...item };
+        });
+      }
+    },
     selectMenu(tab) {
       this.curTab = tab;
+    },
+    dataChange(data) {
+      if (this.curTab === "knowledge") {
+        this.knowledgeList = data;
+      } else {
+        this.abilityList = data;
+      }
+      this.checkData();
+    },
+    checkData() {
+      return this.checkKnowledgeList() && this.checkAbilityList();
+    },
+    checkKnowledgeList() {
+      const isEmpty = num => !num && num !== 0;
+
+      if (
+        this.knowledgeList.some(
+          item => isEmpty(item.startRate) || isEmpty(item.endRate)
+        )
+      ) {
+        this.errorMsg = "请完成知识维度划分规则";
+        return;
+      }
+
+      for (let i = 0; i < this.knowledgeList.length; i++) {
+        const item = this.knowledgeList[i];
+        if (i) {
+          const prevItem = this.knowledgeList[i - 1];
+          if (prevItem.startRate - 1 !== item.endRate) {
+            this.errorMsg = "请保证知识维度划分规则区间连续";
+            return;
+          }
+        }
+      }
+
+      return true;
+    },
+    checkAbilityList() {
+      const isEmpty = num => !num && num !== 0;
+
+      if (
+        this.abilityList.some(
+          item => isEmpty(item.startRate) || isEmpty(item.endRate)
+        )
+      ) {
+        this.errorMsg = "请完成能力维度划分规则";
+        return;
+      }
+
+      for (let i = 0; i < this.abilityList.length; i++) {
+        const item = this.abilityList[i];
+        if (i) {
+          const prevItem = this.abilityList[i - 1];
+          if (prevItem.endRate !== item.startRate) {
+            this.errorMsg = "请保证能力维度划分规则区间连续";
+            return;
+          }
+        }
+      }
+
+      return true;
+    },
+    getData() {
+      let data = [];
+      this.knowledgeList.forEach(item => {
+        const min = item.startRate / 100;
+        const max = item.endRate / 100;
+        let scopeStr = "";
+        if (item.endRate === 100) {
+          scopeStr = `[${min},${max}]`;
+        } else if (item.startRate === 0) {
+          scopeStr = `[${min},${max})`;
+        } else {
+          scopeStr = `[${min},${max})`;
+        }
+
+        data.push({
+          advice: item.advice,
+          formula: "PERSONAL_SCORE_RATE",
+          scope: scopeStr,
+          result: item.result,
+          levelCode: item.levelCode,
+          moduleType: "KNOWLEDGE",
+          levelName: item.levelName
+        });
+      });
+
+      this.abilityList.forEach(item => {
+        let scopeStr = "";
+        if (item.levelCode === "A") {
+          scopeStr = `[${item.startRate},${item.endRate}]`;
+        } else if (item.startRate === 0) {
+          scopeStr = `[${item.startRate},${item.endRate})`;
+        } else {
+          scopeStr = `[${item.startRate},${item.endRate})`;
+        }
+
+        data.push({
+          advice: item.advice,
+          formula: "PERCENTILE_RANK",
+          scope: scopeStr,
+          result: item.result,
+          levelCode: item.levelCode,
+          moduleType: "ABILITY",
+          levelName: item.levelName
+        });
+      });
+
+      return data;
+    },
+    async toSubmit() {
+      if (!this.checkData()) return;
+
+      if (this.loading) return;
+      this.loading = true;
+      const gradeModuleEvaluationDatasourceList = this.getData();
+      const data = await updateModuleEvaluation({
+        paperNumber: this.configs.base.paperNumber,
+        paperName: this.configs.base.paperName,
+        paperType: this.configs.base.paperType,
+        gradeModuleEvaluationDatasourceList
+      }).catch(() => {});
+      this.loading = false;
+      if (!data) return;
+
+      this.$emit("modified");
     }
   }
 };

+ 3 - 27
src/modules/analysis/components/baseConfig/CommentKnowledge.vue

@@ -59,7 +59,6 @@
         </template>
       </el-table-column>
     </el-table>
-    <p v-if="errorMsg" class="tips-info tips-error">{{ errorMsg }}</p>
     <!-- ModifyKnowledgeComment -->
     <modify-knowledge-comment
       ref="ModifyKnowledgeComment"
@@ -70,7 +69,6 @@
 </template>
 
 <script>
-import { initKnowledgeList } from "./defaultComment";
 import ModifyKnowledgeComment from "./ModifyKnowledgeComment.vue";
 
 export default {
@@ -87,13 +85,11 @@ export default {
   data() {
     return {
       dataList: [],
-      curRow: {},
-      errorMsg: ""
+      curRow: {}
     };
   },
   mounted() {
-    const data = this.rates.length ? this.rates : initKnowledgeList;
-    this.dataList = data.map(item => {
+    this.dataList = this.rates.map(item => {
       return { ...item };
     });
   },
@@ -107,27 +103,7 @@ export default {
       this.dataList[ind] = this.$objAssign(this.dataList[ind], data);
     },
     rateChange() {
-      const isEmpty = num => !num && num !== 0;
-
-      if (
-        this.dataList.some(
-          item => isEmpty(item.startRate) || isEmpty(item.endRate)
-        )
-      ) {
-        this.errorMsg = "请完成划分规则";
-        return;
-      }
-
-      for (let i = 0; i < this.dataList.length; i++) {
-        const item = this.dataList[i];
-        if (i) {
-          const prevItem = this.dataList[i - 1];
-          if (prevItem.startRate - 1 !== item.endRate) {
-            this.errorMsg = "请保证区间连续";
-            return;
-          }
-        }
-      }
+      this.$emit("data-change", this.dataList);
     }
   }
 };

+ 105 - 40
src/modules/analysis/components/baseConfig/DiagnoseConfig.vue

@@ -6,44 +6,34 @@
       :rules="rules"
       label-width="180px"
     >
-      <el-form-item prop="knowledgeTitle" label="知识:">
+      <el-form-item prop="knowledgeInterpret" label="知识:">
         <el-input
-          v-model.trim="modalForm.knowledgeTitle"
+          v-model.trim="modalForm.knowledgeInterpret"
           placeholder="知识"
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item prop="rateSet" label="二级维度的精熟度定义:">
+      <el-form-item
+        prop="gradeModuleDefineParamList"
+        label="二级维度的精熟度定义:"
+      >
         <div class="part-box part-box-pad part-box-border-bold">
           <proficiency-edit
-            :rates="modalForm.rateSet"
-            @data-change="rateSetChange"
+            :rates="modalForm.gradeModuleDefineParamList"
+            @data-change="paramChange"
           ></proficiency-edit>
         </div>
       </el-form-item>
-      <el-form-item prop="abilityTitle" label="能力:">
+      <el-form-item prop="abilityInterpret" label="能力:">
         <el-input
-          v-model.trim="modalForm.abilityTitle"
+          v-model.trim="modalForm.abilityInterpret"
           placeholder="能力"
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item prop="isfuf" label="是否呈现赋分:">
-        <el-radio-group v-model="modalForm.isfuf">
-          <el-radio
-            v-for="(val, key) in BOOLEAN_TYPE"
-            :key="key"
-            :label="key * 1"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
-        <p class="tips-info">
-          说明:若选择“是”,则考后需提供学生的赋分成绩(学号、总分),报告中的分值显示赋分后的成绩分数;若选择“否”,则报告中的分值显示卷面原始分。
-        </p>
-      </el-form-item>
-      <el-form-item prop="fullScore" label="满分:">
+      <el-form-item prop="totalScore" label="满分:">
         <el-input-number
-          v-model="modalForm.fullScore"
+          v-model="modalForm.totalScore"
           placeholder="请输入满分,如100"
           :min="1"
           :max="9999"
@@ -70,25 +60,41 @@
         </p>
       </el-form-item>
     </el-form>
+
+    <div class="config-footer">
+      <el-button
+        class="width-200"
+        type="primary"
+        :loading="loading"
+        @click="toSubmit"
+        >保存</el-button
+      >
+    </div>
   </div>
 </template>
 
 <script>
-import { BOOLEAN_TYPE } from "@/constants/enumerate";
 import ProficiencyEdit from "./ProficiencyEdit.vue";
+import { updatePaperDefine } from "../../api";
 
 const initModalForm = {
-  id: "",
-  knowledgeTitle: "课程标准规定的学科内容",
-  abilityTitle: "经学习与训练内化而成的心理结构",
-  isfuf: 0,
-  fullScore: 100,
+  knowledgeInterpret: "课程标准规定的学科内容",
+  abilityInterpret: "经学习与训练内化而成的心理结构",
+  totalScore: 100,
   passScore: 100,
-  rateSet: []
+  gradeModuleDefineParamList: []
 };
 
 export default {
   name: "diagnose-config",
+  props: {
+    configs: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
   components: { ProficiencyEdit },
   data() {
     const isEmpty = num => !num && num !== 0;
@@ -104,7 +110,7 @@ export default {
         const item = value[i];
         if (i) {
           const prevItem = value[i - 1];
-          if (prevItem.startRate - 1 !== item.endRate)
+          if (prevItem.startRate !== item.endRate)
             return callback(new Error("请保证区间连续"));
         }
       }
@@ -113,9 +119,8 @@ export default {
     };
     return {
       modalForm: { ...initModalForm },
-      BOOLEAN_TYPE,
       rules: {
-        knowledgeTitle: [
+        knowledgeInterpret: [
           {
             required: true,
             message: "请输入知识",
@@ -127,7 +132,7 @@ export default {
             trigger: "change"
           }
         ],
-        abilityTitle: [
+        abilityInterpret: [
           {
             required: true,
             message: "请输入能力",
@@ -139,7 +144,7 @@ export default {
             trigger: "change"
           }
         ],
-        fullScore: [
+        totalScore: [
           {
             required: true,
             message: "请输入满分",
@@ -153,22 +158,82 @@ export default {
             trigger: "change"
           }
         ],
-        rateSet: [
+        gradeModuleDefineParamList: [
           {
             validator: rateSetValidator,
             trigger: "change"
           }
         ]
-      }
+      },
+      loading: false
     };
   },
+  created() {
+    const { paperDefineInfo } = this.configs;
+    if (!paperDefineInfo) return;
+
+    this.modalForm = this.$objAssign(initModalForm, paperDefineInfo);
+    this.modalForm.gradeModuleDefineParamList = paperDefineInfo.gradeModuleDefineParamList.map(
+      item => {
+        return {
+          level: item.level,
+          title: item.define.split(":")[0],
+          startRate: item.min,
+          endRate: item.max
+        };
+      }
+    );
+  },
   methods: {
     getList() {},
-    rateSetChange(data) {
-      this.modalForm.rateSet = data;
-      this.$refs.modalFormComp.validateField("rateSet");
+    paramChange(data) {
+      this.modalForm.gradeModuleDefineParamList = data;
+      this.$refs.modalFormComp.validateField("gradeModuleDefineParamList");
     },
-    async submit() {}
+    async toSubmit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+      const datas = {
+        ...this.modalForm,
+        paperNumber: this.configs.base.paperNumber,
+        paperName: this.configs.base.paperName,
+        paperType: this.configs.base.paperType
+      };
+      datas.gradeModuleDefineParamList = this.modalForm.gradeModuleDefineParamList.map(
+        item => {
+          const min = item.min / 100;
+          const max = item.max / 100;
+          let scopeStr = "",
+            defineStr = "";
+          if (item.max === 100) {
+            scopeStr = `[${min},${max}]`;
+            defineStr = `${item.title}:个人得分率≥${item.min}%`;
+          } else if (item.min === 0) {
+            scopeStr = `[${min},${max})`;
+            defineStr = `${item.title}:个人得分率<${item.max}%`;
+          } else {
+            scopeStr = `[${min},${max})`;
+            defineStr = `${item.title}:${item.min}≤个人得分率<${item.max}%`;
+          }
+
+          return {
+            level: item.level,
+            min,
+            max,
+            scope: scopeStr,
+            define: defineStr
+          };
+        }
+      );
+      const data = await updatePaperDefine(datas).catch(() => {});
+      this.loading = false;
+      if (!data) return;
+
+      this.$emit("modified");
+    }
   }
 };
 </script>

+ 14 - 2
src/modules/analysis/components/baseConfig/DimensionConfig.vue

@@ -12,6 +12,16 @@
     </div>
 
     <component :is="compName" :course="course"></component>
+
+    <div class="config-footer">
+      <el-button
+        class="width-200"
+        type="primary"
+        :loading="loading"
+        @click="toSubmit"
+        >保存</el-button
+      >
+    </div>
   </div>
 </template>
 
@@ -42,7 +52,8 @@ export default {
           name: "能力维度",
           val: "ability"
         }
-      ]
+      ],
+      loading: false
     };
   },
   computed: {
@@ -53,7 +64,8 @@ export default {
   methods: {
     selectMenu(tab) {
       this.curTab = tab;
-    }
+    },
+    toSubmit() {}
   }
 };
 </script>

+ 1 - 1
src/modules/analysis/components/baseConfig/DimensionKnowledgeList.vue

@@ -104,7 +104,7 @@ export default {
       curRow: {},
       loading: false,
       // upload
-      uploadUrl: "yourUploadPath",
+      uploadUrl: "/api/admin/grade/paper/dimension/import",
       downloadUrl: "/path/要下载的文件.xls",
       downloadFilename: "要下载的文件.xls",
       uploadData: {}

+ 11 - 11
src/modules/analysis/components/baseConfig/ModifyAbilityComment.vue

@@ -17,13 +17,13 @@
       label-width="100px"
     >
       <el-form-item label="等级:">
-        {{ modalForm.level }}
+        {{ modalForm.levelCode }}
       </el-form-item>
       <el-form-item label="水平层次:">
-        {{ modalForm.levelDesc }}
+        {{ modalForm.levelName }}
       </el-form-item>
       <el-form-item label="划分规则:">
-        <p v-if="modalForm.level === 'A'">
+        <p v-if="modalForm.levelCode === 'A'">
           百分位等级TOP≤{{ modalForm.endRate }}%
         </p>
         <p v-else>
@@ -40,9 +40,9 @@
           show-word-limit
         ></el-input>
       </el-form-item>
-      <el-form-item prop="suggest" label="学习建议:">
+      <el-form-item prop="advice" label="学习建议:">
         <el-input
-          v-model.trim="modalForm.suggest"
+          v-model.trim="modalForm.advice"
           type="textarea"
           :autosize="{ minRows: 3, maxRows: 5 }"
           placeholder="请输入学习建议"
@@ -63,12 +63,12 @@
 <script>
 const initModalForm = {
   id: null,
-  level: "",
-  levelDesc: "",
-  startRate: "",
-  endRate: "",
+  levelCode: "",
+  levelName: "",
+  startRate: null,
+  endRate: null,
   result: "",
-  suggest: ""
+  advice: ""
 };
 
 export default {
@@ -102,7 +102,7 @@ export default {
             trigger: "change"
           }
         ],
-        suggest: [
+        advice: [
           {
             required: true,
             message: "请输入学习建议",

+ 2 - 2
src/modules/analysis/components/baseConfig/ModifyAbilityDim.vue

@@ -67,7 +67,7 @@
 </template>
 
 <script>
-import { updateKnowledgeDimension } from "../../api";
+import { updatePaperDimension } from "../../api";
 
 const initModalForm = {
   id: null,
@@ -201,7 +201,7 @@ export default {
       if (this.isSubmit) return;
       this.isSubmit = true;
       const datas = { ...this.modalForm };
-      const data = await updateKnowledgeDimension(datas).catch(() => {});
+      const data = await updatePaperDimension(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;
 

+ 8 - 8
src/modules/analysis/components/baseConfig/ModifyKnowledgeComment.vue

@@ -17,10 +17,10 @@
       label-width="100px"
     >
       <el-form-item label="等级:">
-        {{ modalForm.level }}
+        {{ modalForm.levelCode }}
       </el-form-item>
       <el-form-item label="水平层次:">
-        {{ modalForm.levelDesc }}
+        {{ modalForm.levelName }}
       </el-form-item>
       <el-form-item label="划分规则:">
         <p v-if="modalForm.startRate === 0">
@@ -43,9 +43,9 @@
           show-word-limit
         ></el-input>
       </el-form-item>
-      <el-form-item prop="suggest" label="学习建议:">
+      <el-form-item prop="advice" label="学习建议:">
         <el-input
-          v-model.trim="modalForm.suggest"
+          v-model.trim="modalForm.advice"
           type="textarea"
           :autosize="{ minRows: 3, maxRows: 5 }"
           placeholder="请输入学习建议"
@@ -66,12 +66,12 @@
 <script>
 const initModalForm = {
   id: null,
-  level: "",
-  levelDesc: "",
+  levelCode: "",
+  levelName: "",
   startRate: "",
   endRate: "",
   result: "",
-  suggest: ""
+  advice: ""
 };
 
 export default {
@@ -105,7 +105,7 @@ export default {
             trigger: "change"
           }
         ],
-        suggest: [
+        advice: [
           {
             required: true,
             message: "请输入学习建议",

+ 2 - 2
src/modules/analysis/components/baseConfig/ModifyKnowledgeDim.vue

@@ -83,7 +83,7 @@
 </template>
 
 <script>
-import { updateKnowledgeDimension } from "../../api";
+import { updatePaperDimension } from "../../api";
 
 const initModalForm = {
   id: null,
@@ -290,7 +290,7 @@ export default {
       if (this.isSubmit) return;
       this.isSubmit = true;
       const datas = { ...this.modalForm };
-      const data = await updateKnowledgeDimension(datas).catch(() => {});
+      const data = await updatePaperDimension(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;
 

+ 9 - 9
src/modules/analysis/components/baseConfig/ProficiencyEdit.vue

@@ -48,26 +48,31 @@
 <script>
 const initRateSet = [
   {
+    level: "A",
     title: "熟练掌握",
     startRate: null,
     endRate: 100
   },
   {
+    level: "B",
     title: "较好掌握",
     startRate: null,
     endRate: null
   },
   {
+    level: "C",
     title: "基本掌握",
     startRate: null,
     endRate: null
   },
   {
+    level: "D",
     title: "部分掌握",
     startRate: null,
     endRate: null
   },
   {
+    level: "E",
     title: "没有掌握,需从头再学",
     startRate: 0,
     endRate: null
@@ -90,15 +95,10 @@ export default {
     };
   },
   mounted() {
-    if (!this.rates.length) {
-      this.modalForm = initRateSet.map(item => {
-        return { ...item };
-      });
-    } else {
-      this.modalForm = this.rates.map(item => {
-        return { ...item };
-      });
-    }
+    const defRates = this.rates.length ? this.rates : initRateSet;
+    this.modalForm = defRates.map(item => {
+      return { ...item };
+    });
   },
   methods: {
     rateChange() {

+ 62 - 54
src/modules/analysis/components/baseConfig/defaultComment.js

@@ -1,95 +1,103 @@
 export const initKnowledgeList = [
   {
-    level: "A",
+    levelCode: "A",
     startRate: 90,
     endRate: 100,
-    levelDesc: "表现优秀水平",
+    levelName: "表现优秀水平",
     result:
       "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+    advice:
+      "希望你在后续课程的的学习中能够继续保持这种学习的态度和热情,戒骄戒躁,不忘初心,进一步拓宽知识面,进行个性化的深入学习,相信你一定会取得更优秀的成绩。"
   },
   {
-    level: "B",
+    levelCode: "B",
     startRate: 75,
-    endRate: 89,
-    levelDesc: "表现良好水平",
+    endRate: 90,
+    levelName: "表现良好水平",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "作答结果反映你在本次测验中处于良好水平。你能理解并基本掌握本学期的绝大部分知识点,能够将所学的物理知识用于解决相关的物理问题。但可能在知识体系上还存在漏洞,对某些知识点掌握的还不够熟练,或者是综合分析的能力还不够强。总之你还有进步的空间。",
+    advice:
+      "建议你根据本次报告的反馈,进行有针对性的强化学习,逐个攻破曾困扰你的难题,加深对所学知识、概念的理解、进一步提高灵活应用能力和综合分析能力。相信你在下一次的测评中能够更上一层楼。"
   },
   {
-    level: "C",
+    levelCode: "C",
     startRate: 55,
-    endRate: 74,
-    levelDesc: "中等水平",
+    endRate: 75,
+    levelName: "中等水平",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "作答结果反映你在本次测验中处于中等水平。你能够理解并掌握本学期所学的大部分知识点,但是还没有形成完整的知识体系,对某些知识点还不能够真正理解并掌握,对于有关物理规律、概念和公式的记忆还不够深刻、运用不够熟练,或者是综合分析能力还有待进一步提高。",
+    advice:
+      "希望你能够通过本次测试,能够找出自己的知识漏洞,进行有针对性的强化学习和能力训练,形成自己完整的知识体系,进一步提高自己的综合分析能力,相信你在下一次测评中能够取得理想成绩。"
   },
   {
-    level: "D",
+    levelCode: "D",
     startRate: 40,
-    endRate: 54,
-    levelDesc: "有待提高水平",
+    endRate: 55,
+    levelName: "有待提高水平",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "作答结果反映你在本次测验中表现不佳,需要重考或重修本课程。你能够对本课程中所学的知识有初步认识,有一定的了解和记忆,但知识点可能有断层,对部分概念、规律的理解还不够透彻,运用不够熟练,综合分析能力和整体水平还有待提高。",
+    advice:
+      "胜不骄,败不馁。建议你端正学习态度,破而后立,总结经验,及时补差,相信你在下一次测评中一定能够有较大幅度的进步。"
   },
   {
-    level: "E",
+    levelCode: "E",
     startRate: 0,
-    endRate: 39,
-    levelDesc: "本课程没有学好",
+    endRate: 40,
+    levelName: "本课程没有学好",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "作答结果反映你对本课程没有用心学习。对所学的大部分知识点、基本概念、基本原理和基本规律都没有弄明白、含混不清,或考前没有好好复习,把平时学的都忘了。",
+    advice:
+      "建议你首先端正学习态度,然后将本课程从头开始学习,并做好知识点的梳理、归纳和总结、形成完整系统的知识框架。相信你在重修或重考时能够考出一个满意的成绩。"
   }
 ];
 
 export const initAbilityList = [
   {
-    level: "A",
-    startRate: 0,
-    endRate: 20,
-    levelDesc: "优秀",
-    result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+    levelCode: "A",
+    startRate: 80,
+    endRate: 100,
+    levelName: "优秀",
+    result: "你在本课程的学习中表现优秀,学习成绩处于班级中前20%的领先水平。",
+    advice:
+      "能取得这样的成绩,既要有天赋还要足够勤奋,两者缺一不可。建议你继续保持勤奋学习的干劲和态度,充分发挥你的天赋,再接再厉,继续名列前茅。"
   },
   {
-    level: "B",
-    startRate: 21,
-    endRate: 40,
-    levelDesc: "良好",
+    levelCode: "B",
+    startRate: 60,
+    endRate: 80,
+    levelName: "良好",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "你在本课程的学习中表现良好,学习成绩处于班级中前21%-前40&的中上游水平",
+    advice:
+      "天才等于勤奋加努力。希望你能更加勤奋、更加努力地学习,争取下次考试能挤进班上前20%的领先水平。"
   },
   {
-    level: "C",
-    startRate: 41,
+    levelCode: "C",
+    startRate: 40,
     endRate: 60,
-    levelDesc: "中等",
+    levelName: "中等",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "你的成绩在本课堂中处于中游水平,或许你还没有把你的学习潜能充分发挥出来。",
+    advice:
+      "你还有较大的上升空间,相信自己,只要足够努力就能进入班上的中上游水平,甚至领先水平。"
   },
   {
-    level: "D",
-    startRate: 61,
-    endRate: 80,
-    levelDesc: "中等偏下",
-    result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+    levelCode: "D",
+    startRate: 20,
+    endRate: 40,
+    levelName: "中等偏下",
+    result: "你的成绩在本课堂中处于班上前61%-80%中等偏下的水平。",
+    advice:
+      "建议你能通过本次测试发现自己的问题,向班里优秀的同学学习,你的上升空间很大,相信自己,只要努力一定有进步。"
   },
   {
-    level: "E",
-    startRate: 81,
-    endRate: 100,
-    levelDesc: "表现不佳",
+    levelCode: "E",
+    startRate: 0,
+    endRate: 20,
+    levelName: "表现不佳",
     result:
-      "作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。",
-    suggest: "希望你在后续课程的的学习中能够继续保持"
+      "你本次考试的成绩处于班上最后20%的水平,表现不佳。或许你已经尽力了,或许你不够努力,太放松自己了,只有你自己明白。",
+    advice:
+      "如果你已经尽力了,不必灰心,高手过招,不管输赢,都是高手;如果你还不够努力,请努力追赶,下次一定有进步!"
   }
 ];

+ 6 - 0
src/modules/analysis/router.js

@@ -1,6 +1,7 @@
 // user
 import DataInitManage from "./views/DataInitManage.vue";
 import AnalysisBatchManage from "./views/AnalysisBatchManage.vue";
+import AnalysisReportView from "./views/AnalysisReportView.vue";
 
 export default [
   {
@@ -12,5 +13,10 @@ export default [
     path: "/analysis/analysis-batch-manage",
     name: "AnalysisBatchManage",
     component: AnalysisBatchManage
+  },
+  {
+    path: "/analysis/analysis-report-view",
+    name: "AnalysisReportView",
+    component: AnalysisReportView
   }
 ];

+ 63 - 0
src/modules/analysis/views/AnalysisReportView.vue

@@ -0,0 +1,63 @@
+<template>
+  <div class="analysis-report-view">
+    <div class="part-box part-box-pad">
+      <el-button
+        v-for="item in roles"
+        :key="item.roleId"
+        type="primary"
+        class="auth-item"
+        :disabled="loading"
+        @click="toAuth(item)"
+        >{{ item.roleName }}</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { autoSubmitForm } from "@/plugins/utils";
+import { ssoAnalysisLogin } from "../api";
+
+export default {
+  name: "analysis-report-view",
+  data() {
+    return {
+      user: {},
+      roles: [],
+      loading: false
+    };
+  },
+  created() {
+    this.user = this.$ls.get("user", {
+      roleSource: [],
+      loginName: "",
+      role: "",
+      orgName: ""
+    });
+    this.roles = this.user.roleSource.filter(
+      item => item.roleSource === "ANALYSIS"
+    );
+  },
+  methods: {
+    async toAuth(item) {
+      if (this.loading) return;
+      this.loading = true;
+
+      const params = {
+        loginName: this.user.loginName,
+        role: item.roleCode,
+        orgName: this.user.orgInfo.name,
+        returnUrl: window.location.href
+      };
+      const data = await ssoAnalysisLogin(params).catch(() => {});
+      this.loading = false;
+      if (!data) return;
+
+      console.log(data);
+      // if (data) return;
+
+      autoSubmitForm(data.redirectUrl, data);
+    }
+  }
+};
+</script>

+ 6 - 15
src/modules/analysis/views/DataInitManage.vue

@@ -4,22 +4,20 @@
       <el-form ref="FilterForm" label-position="left" label-width="55px" inline>
         <el-form-item label="学期:">
           <semester-select
-            v-model="filter.semester"
+            v-model="filter.semesterId"
             placeholder="学期"
           ></semester-select>
         </el-form-item>
         <el-form-item label="考试:">
           <exam-select
             v-model="filter.examId"
-            :semester-id="filter.semester"
+            :semester-id="filter.semesterId"
             placeholder="考试"
           ></exam-select>
         </el-form-item>
         <el-form-item label="课程:">
           <course-select
             v-model="filter.courseCode"
-            :exam-id="filter.examId"
-            inspect
             placeholder="课程"
           ></course-select>
         </el-form-item>
@@ -37,7 +35,7 @@
           width="50"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="semester" label="学期"></el-table-column>
+        <el-table-column prop="semesterName" label="学期"></el-table-column>
         <el-table-column prop="examName" label="考试"> </el-table-column>
         <el-table-column prop="courseCode" label="课程(代码)" min-width="120">
           <span slot-scope="scope">
@@ -55,7 +53,6 @@
             <el-button
               class="btn-primary"
               type="text"
-              :disabled="loading"
               @click="toConfig(scope.row)"
               >基础配置</el-button
             >
@@ -99,26 +96,20 @@ export default {
   data() {
     return {
       filter: {
-        semester: "",
+        semesterId: "",
         examId: "",
         courseCode: ""
       },
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
-      dataList: [
-        {
-          id: "1",
-          semester: "第一学期",
-          examName: "期中考试"
-        }
-      ],
+      dataList: [],
       curRow: {},
       loading: false
     };
   },
   mounted() {
-    // this.toPage(1);
+    this.toPage(1);
   },
   methods: {
     async getList() {

+ 216 - 216
src/modules/base/views/RoleManage.vue

@@ -1,216 +1,216 @@
-<template>
-  <div class="role-manage">
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <el-form-item label="角色名称:">
-            <el-input
-              style="width: 200px;"
-              v-model.trim="filter.name"
-              placeholder="角色名称"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <!-- <el-form-item label="启用/禁用:" label-width="90px">
-          <el-select
-            v-model="filter.enable"
-            style="width: 120px;"
-            placeholder="请选择"
-            clearable
-          >
-            <el-option
-              v-for="(val, key) in ABLE_TYPE"
-              :key="key"
-              :value="key * 1"
-              :label="val"
-            ></el-option>
-          </el-select>
-        </el-form-item> -->
-        </template>
-        <el-form-item>
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="toPage(1)"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action">
-        <el-button
-          v-if="checkPrivilege('button', 'add')"
-          type="primary"
-          icon="el-icon-circle-plus-outline"
-          @click="toAdd"
-          >添加角色</el-button
-        >
-      </div>
-    </div>
-    <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="roles">
-        <el-table-column
-          type="index"
-          label="序号"
-          width="70"
-          :index="indexMethod"
-        ></el-table-column>
-        <el-table-column prop="name" label="角色名称"></el-table-column>
-        <!-- <el-table-column prop="enable" label="启用/禁用">
-          <template slot-scope="scope">
-            {{ scope.row.enable | enableFilter }}
-          </template>
-        </el-table-column> -->
-        <el-table-column prop="createTime" label="创建时间">
-          <span slot-scope="scope">{{
-            scope.row.createTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="180px">
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'edit')"
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              >编辑</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'Manager')"
-              class="btn-primary"
-              type="text"
-              @click="toEditUser(scope.row)"
-              >人员管理</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'delete')"
-              class="btn-danger"
-              type="text"
-              @click="toDelete(scope.row)"
-              >删除</el-button
-            >
-            <!-- <el-button
-              v-if="checkPrivilege('link', 'enable')"
-              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
-              type="text"
-              @click="toEnable(scope.row)"
-              >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
-            > -->
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total,prev, pager, next"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-        >
-        </el-pagination>
-      </div>
-    </div>
-    <!-- ModifyRole -->
-    <modify-role
-      ref="ModifyRole"
-      :instance="curRole"
-      @modified="getList"
-    ></modify-role>
-    <!-- ModifyRoleUser -->
-    <modify-role-user ref="ModifyRoleUser" :role="curRole"></modify-role-user>
-  </div>
-</template>
-
-<script>
-import { ABLE_TYPE } from "@/constants/enumerate";
-import { roleListPage, ableRole, deleteRole } from "../api";
-import ModifyRole from "../components/ModifyRole";
-import ModifyRoleUser from "../components/ModifyRoleUser";
-
-export default {
-  name: "role-manage",
-  components: {
-    ModifyRole,
-    ModifyRoleUser
-  },
-  data() {
-    return {
-      filter: {
-        enable: null,
-        name: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      roles: [],
-      curRole: {},
-      ABLE_TYPE,
-      ROLE_TYPE: {}
-    };
-  },
-  mounted() {
-    this.toPage(1);
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (datas.enable !== null && datas.enable !== "")
-        datas.enable = !!datas.enable;
-      const data = await roleListPage(datas);
-      this.roles = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toAdd() {
-      this.curRole = {};
-      this.$refs.ModifyRole.open();
-    },
-    toEdit(row) {
-      this.curRole = row;
-      this.$refs.ModifyRole.open();
-    },
-    toEditUser(row) {
-      console.log(row);
-      this.curRole = row;
-      this.$refs.ModifyRoleUser.open();
-    },
-    toDelete(row) {
-      this.$confirm(`确定要删除角色【${row.name}】吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await deleteRole(row.id);
-          this.$message.success("删除成功!");
-          this.deletePageLastItem();
-        })
-        .catch(() => {});
-    },
-    toEnable(row) {
-      const action = row.enable ? "禁用" : "启用";
-
-      this.$confirm(`确定要${action}角色【${row.name}】吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const enable = !row.enable;
-          await ableRole({
-            id: row.id,
-            enable
-          });
-          row.enable = enable;
-          this.$message.success("操作成功!");
-        })
-        .catch(() => {});
-    }
-  }
-};
-</script>
+<template>
+  <div class="role-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <template v-if="checkPrivilege('condition', 'condition')">
+          <el-form-item label="角色名称:">
+            <el-input
+              style="width: 200px;"
+              v-model.trim="filter.name"
+              placeholder="角色名称"
+              clearable
+            ></el-input>
+          </el-form-item>
+          <!-- <el-form-item label="启用/禁用:" label-width="90px">
+          <el-select
+            v-model="filter.enable"
+            style="width: 120px;"
+            placeholder="请选择"
+            clearable
+          >
+            <el-option
+              v-for="(val, key) in ABLE_TYPE"
+              :key="key"
+              :value="key * 1"
+              :label="val"
+            ></el-option>
+          </el-select>
+        </el-form-item> -->
+        </template>
+        <el-form-item>
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >添加角色</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="roles">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="name" label="角色名称"></el-table-column>
+        <!-- <el-table-column prop="enable" label="启用/禁用">
+          <template slot-scope="scope">
+            {{ scope.row.enable | enableFilter }}
+          </template>
+        </el-table-column> -->
+        <el-table-column prop="createTime" label="创建时间">
+          <span slot-scope="scope">{{
+            scope.row.createTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="180px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'edit') && !scope.row.defaultRole"
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'Manager')"
+              class="btn-primary"
+              type="text"
+              @click="toEditUser(scope.row)"
+              >人员管理</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'delete') && !scope.row.defaultRole"
+              class="btn-danger"
+              type="text"
+              @click="toDelete(scope.row)"
+              >删除</el-button
+            >
+            <!-- <el-button
+              v-if="checkPrivilege('link', 'enable')"
+              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
+              type="text"
+              @click="toEnable(scope.row)"
+              >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
+            > -->
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+    <!-- ModifyRole -->
+    <modify-role
+      ref="ModifyRole"
+      :instance="curRole"
+      @modified="getList"
+    ></modify-role>
+    <!-- ModifyRoleUser -->
+    <modify-role-user ref="ModifyRoleUser" :role="curRole"></modify-role-user>
+  </div>
+</template>
+
+<script>
+import { ABLE_TYPE } from "@/constants/enumerate";
+import { roleListPage, ableRole, deleteRole } from "../api";
+import ModifyRole from "../components/ModifyRole";
+import ModifyRoleUser from "../components/ModifyRoleUser";
+
+export default {
+  name: "role-manage",
+  components: {
+    ModifyRole,
+    ModifyRoleUser
+  },
+  data() {
+    return {
+      filter: {
+        enable: null,
+        name: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      roles: [],
+      curRole: {},
+      ABLE_TYPE,
+      ROLE_TYPE: {}
+    };
+  },
+  mounted() {
+    this.toPage(1);
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
+      const data = await roleListPage(datas);
+      this.roles = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toAdd() {
+      this.curRole = {};
+      this.$refs.ModifyRole.open();
+    },
+    toEdit(row) {
+      this.curRole = row;
+      this.$refs.ModifyRole.open();
+    },
+    toEditUser(row) {
+      console.log(row);
+      this.curRole = row;
+      this.$refs.ModifyRoleUser.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除角色【${row.name}】吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteRole(row.id);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    },
+    toEnable(row) {
+      const action = row.enable ? "禁用" : "启用";
+
+      this.$confirm(`确定要${action}角色【${row.name}】吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableRole({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
+    }
+  }
+};
+</script>

+ 61 - 62
src/modules/stmms/views/MarkerLogin.vue

@@ -1,62 +1,61 @@
-<template>
-  <div class="marker-login">
-    <div class="part-box part-box-pad">
-      <el-button
-        v-for="item in roles"
-        :key="item.type"
-        type="primary"
-        class="auth-item"
-        :disabled="loading"
-        @click="toAuth(item)"
-        >{{ item.name }}</el-button
-      >
-    </div>
-  </div>
-</template>
-
-<script>
-import { userSysRoles, yptAuth } from "../api";
-import { autoSubmitForm } from "@/plugins/utils";
-
-export default {
-  name: "marker-login",
-  data() {
-    return {
-      roles: [],
-      loading: false,
-      roleNames: {
-        MARKER: "评卷员",
-        SUBJECT_HEADER: "科组长"
-      }
-    };
-  },
-  mounted() {
-    this.getRoles();
-  },
-  methods: {
-    async getRoles() {
-      this.roles = [];
-      const data = await userSysRoles();
-      this.roles = data.map(type => {
-        return {
-          type,
-          name: this.roleNames[type]
-        };
-      });
-    },
-    async toAuth(item) {
-      if (this.loading) return;
-      this.loading = true;
-      const data = await yptAuth(item.type).catch(() => {
-        this.loading = false;
-      });
-
-      if (!data) return;
-      const url = data.redirectUrl;
-      const params = { ...data, returnUrl: window.location.href };
-      delete params.redirectUrl;
-      autoSubmitForm(url, params);
-    }
-  }
-};
-</script>
+<template>
+  <div class="marker-login">
+    <div class="part-box part-box-pad">
+      <el-button
+        v-for="item in roles"
+        :key="item.type"
+        type="primary"
+        class="auth-item"
+        :disabled="loading"
+        @click="toAuth(item)"
+        >{{ item.name }}</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { userSysRoles, yptAuth } from "../api";
+import { autoSubmitForm } from "@/plugins/utils";
+
+export default {
+  name: "marker-login",
+  data() {
+    return {
+      roles: [],
+      loading: false,
+      roleNames: {
+        MARKER: "评卷员",
+        SUBJECT_HEADER: "科组长"
+      }
+    };
+  },
+  mounted() {
+    this.getRoles();
+  },
+  methods: {
+    async getRoles() {
+      this.roles = [];
+      const data = await userSysRoles();
+      this.roles = data.map(type => {
+        return {
+          type,
+          name: this.roleNames[type]
+        };
+      });
+    },
+    async toAuth(item) {
+      if (this.loading) return;
+      this.loading = true;
+      const data = await yptAuth(item.type).catch(() => {});
+      this.loading = false;
+
+      if (!data) return;
+      const url = data.redirectUrl;
+      const params = { ...data, returnUrl: window.location.href };
+      delete params.redirectUrl;
+      autoSubmitForm(url, params);
+    }
+  }
+};
+</script>