Kaynağa Gözat

快捷分档导航与接口调试

zhangjie 2 yıl önce
ebeveyn
işleme
c57df141c7

+ 1 - 1
src/api.js

@@ -158,7 +158,7 @@ export const updateLevelParams = datas => {
   return $post("/api/param/level", datas);
 };
 export const enableSubjectUsers = subjectId => {
-  return $post(`/api/marksubjects/${subjectId}/updateUserEnable`, {});
+  return $post(`/api/marksubjects/${subjectId}/updateLocking`, {});
 };
 // update-paper
 // grading-rule-set

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

@@ -473,7 +473,12 @@
     }
   }
 }
-
+.grading-rule-set{
+  .part-box {
+    height: 100%;
+    margin-bottom: 0;;
+  }
+}
 // export-paper
 .export-paper {
   .part-box {

+ 97 - 1
src/assets/styles/marker.less

@@ -133,6 +133,46 @@
       }
     }
   }
+
+  .fast-nav{
+    padding: 5px 10px;
+
+    &-list{
+      font-size: 0;
+    }
+
+    &-item{
+      display: inline-block;
+      vertical-align: middle;
+      min-width: 30px;
+      text-align: center;
+      padding: 0 8px;
+      border-radius: 5px;
+      height: 30px;
+      line-height: 30px;
+      margin: 0 5px;
+      background: @color-background;
+      font-size: 14px;
+      cursor: pointer;
+
+      &.is-active,
+      &:hover {
+        background-color: @color-act1;
+        color: @color-text-act;
+      }
+
+      &.is-danger:hover{
+        background-color: @color-act2;
+      }
+    }
+
+    &-close{
+      border-radius: 50%;
+      padding: 0;
+      margin-left: 20px;
+    }
+
+  }
 }
 .header-step-dropdown {
   .header-step-item {
@@ -496,7 +536,7 @@
   top: 0;
   height: 100%;
   z-index: 8;
-  padding: 60px 10px 20px;
+  padding: 60px 0 50px;
   background-color: @color-background-light;
   color: @color-text;
   overflow-y: auto;
@@ -506,6 +546,13 @@
     z-index: 2000;
   }
 
+  .grade-action {
+    padding: 0 10px;
+    height: 100%;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+
   .action-search {
     border-top: 1px dashed @color-text;
   }
@@ -626,6 +673,38 @@
     color: @color-text;
   }
 }
+.grade-ribbon {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  z-index: 8;
+  padding: 10px;
+  background-color: #3d3f55;
+
+  .ribbon-list {
+    font-size: 0;
+    text-align: right;
+    height: 30px;
+  }
+
+  .ribbon-item {
+    display: inline-block;
+    vertical-align: middle;
+    text-align: center;
+    width: 30px;
+    height: 30px;
+    line-height: 30px;
+    font-size: 20px;
+    cursor: pointer;
+    transition: all linear 0.1s;
+
+    &:hover {
+      color: #bec3d1;
+      transform: scale(1.1, 1.1);
+    }
+  }
+}
 
 // marker-history
 .marker-history {
@@ -842,3 +921,20 @@
     border-color: shade(@color-act1, 10%);
   }
 }
+
+
+.ribbon-set-dialog {
+  .ribbon-set-form {
+    padding-bottom: 30px;
+  }
+  .ivu-form-item {
+    margin-bottom: 5px;
+  }
+  .ivu-form-item-label {
+    color: #9d9c9c;
+  }
+  .ivu-switch-checked {
+    border-color: @color-act1;
+    background-color: @color-act1;
+  }
+}

+ 9 - 14
src/modules/grading-set/GradingRuleSet.vue

@@ -2,7 +2,7 @@
   <div class="grading-rule-set">
     <Row :gutter="20" type="flex">
       <Col span="12">
-        <div class="part-box mb-0">
+        <div class="part-box">
           <Form
             ref="modalFormComp"
             :model="modalForm"
@@ -149,7 +149,7 @@
             </FormItem>
             <FormItem label="是否允许任务数累加:">
               <Select
-                v-model="modalForm.taskCumsum"
+                v-model="modalForm.allowTaskOverlay"
                 :disabled="!modalFormCanEdit"
                 placeholder="请选择"
               >
@@ -181,8 +181,8 @@
         </div>
       </Col>
       <Col span="12">
-        <div class="part-box mb-0">
-          <h2 class="part-title">账号启用/禁用</h2>
+        <div class="part-box">
+          <h2 class="part-title">账号解锁/锁定</h2>
           <table class="table" style="width: 200px">
             <tr v-for="(subject, index) in subjects" :key="index">
               <td>
@@ -193,7 +193,7 @@
                   type="text"
                   :class="[
                     'icon ivu-icon',
-                    subject.enable ? 'ivu-icon-enable' : 'ivu-icon-disable'
+                    !subject.locking ? 'ivu-icon-enable' : 'ivu-icon-disable'
                   ]"
                   @click="toAble(subject)"
                 >
@@ -237,7 +237,7 @@ export default {
         showPaperCount: 1,
         propDenominator: 1,
         showSample: 1,
-        taskCumsum: 0
+        allowTaskOverlay: 0
       },
       modalFormCanEdit: false,
       modalForm: {},
@@ -276,20 +276,15 @@ export default {
     },
     async getSubjectList() {
       const data = await subjectList(this.workId);
-      this.subjects = data.map(item => {
-        return {
-          ...item,
-          enable: true
-        };
-      });
+      this.subjects = data;
     },
     toAble(row) {
-      const actionName = row.enable ? "禁用" : "启用";
+      const actionName = !row.locking ? "锁定" : "解锁";
       this.$Modal.confirm({
         content: `确定要${actionName}${row.name}科目下所有账号吗?`,
         onOk: async () => {
           await enableSubjectUsers(row.id);
-          row.enable = !row.enable;
+          row.locking = !row.locking;
         }
       });
     }

+ 34 - 0
src/modules/grading/components/GradeRibbon.vue

@@ -0,0 +1,34 @@
+<template>
+  <div class="grade-ribbon">
+    <div class="ribbon-list">
+      <div class="ribbon-item" title="设置" @click="toSet">
+        <Icon type="md-settings" />
+      </div>
+    </div>
+
+    <!-- RibbonSetDialog -->
+    <ribbon-set-dialog ref="RibbonSetDialog"></ribbon-set-dialog>
+  </div>
+</template>
+
+<script>
+import RibbonSetDialog from "./RibbonSetDialog";
+
+export default {
+  name: "grade-ribbon",
+  components: {
+    RibbonSetDialog
+  },
+  data() {
+    return {};
+  },
+  methods: {
+    toNotice() {
+      this.$refs.NoticeDialog.open();
+    },
+    toSet() {
+      this.$refs.RibbonSetDialog.open();
+    }
+  }
+};
+</script>

+ 74 - 0
src/modules/grading/components/RibbonSetDialog.vue

@@ -0,0 +1,74 @@
+<template>
+  <Modal
+    class="ribbon-set-dialog marker-modal"
+    v-model="modalIsShow"
+    title="设置"
+    :mask-closable="false"
+    @on-visible-change="visibleChange"
+  >
+    <Form
+      ref="modalFormComp"
+      class="ribbon-set-form"
+      :model="ribbonSetModal"
+      :label-width="140"
+    >
+      <FormItem label="显示快捷档位导航">
+        <i-switch v-model="ribbonSetModal.fastLevelNav"></i-switch>
+      </FormItem>
+    </Form>
+
+    <div slot="footer">
+      <Button shape="circle" type="primary" @click="submit">确认</Button>
+      <Button shape="circle" @click="cancel">取消</Button>
+    </div>
+  </Modal>
+</template>
+
+<script>
+import { mapState, mapMutations } from "vuex";
+
+export default {
+  name: "ribbon-set-dialog",
+  data() {
+    return {
+      modalIsShow: false,
+      ribbonSetModal: {}
+    };
+  },
+  computed: {
+    ...mapState("marker", ["ribbonSet"])
+  },
+  mounted() {
+    const userId = this.$ls.get("user", { id: "" }).id;
+    const cacheRibbonSet = window.localStorage.getItem("ribbonSet");
+    const ribbonSet = cacheRibbonSet ? JSON.parse(cacheRibbonSet) : {};
+    if (ribbonSet[userId]) this.setRibbonSet(ribbonSet[userId]);
+  },
+  methods: {
+    ...mapMutations("marker", ["setRibbonSet"]),
+    initData() {
+      this.ribbonSetModal = { ...this.ribbonSet };
+    },
+    visibleChange(visible) {
+      if (visible) {
+        this.initData();
+      }
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    submit() {
+      const userId = this.$ls.get("user", { id: "" }).id;
+      const cacheRibbonSet = window.localStorage.getItem("ribbonSet");
+      const ribbonSet = cacheRibbonSet ? JSON.parse(cacheRibbonSet) : {};
+      ribbonSet[userId] = this.ribbonSetModal;
+      this.setRibbonSet(this.ribbonSetModal);
+      window.localStorage.setItem("ribbonSet", JSON.stringify(ribbonSet));
+      this.cancel();
+    }
+  }
+};
+</script>

+ 4 - 1
src/modules/grading/leader/LeaderGrading.vue

@@ -33,6 +33,7 @@
         ref="GradeAction"
         v-if="curPaper.id"
       ></grade-action>
+      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
     <!-- multiple grading action -->
     <div class="marker-action" v-show="multipleGradingList.length">
@@ -162,6 +163,7 @@ import LeaderStatistics from "./LeaderStatistics";
 import GradeAction from "../components/GradeAction";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import ModifyLeaderGrading from "../components/ModifyLeaderGrading";
+import GradeRibbon from "../components/GradeRibbon";
 
 import {
   paperList,
@@ -186,7 +188,8 @@ export default {
     LeaderStatistics,
     GradeAction,
     SimpleImagePreview,
-    ModifyLeaderGrading
+    ModifyLeaderGrading,
+    GradeRibbon
   },
   data() {
     return {

+ 4 - 1
src/modules/grading/marker/MarkerGrading.vue

@@ -27,6 +27,7 @@
         ref="GradeAction"
         v-if="curPaper.id"
       ></grade-action>
+      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
     <!-- multiple grading action -->
     <div class="marker-action" v-show="multipleGradingList.length">
@@ -137,6 +138,7 @@ import MarkerStandard from "./MarkerStandard";
 import MarkerStatistics from "./MarkerStatistics";
 import GradeAction from "../components/GradeAction";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
+import GradeRibbon from "../components/GradeRibbon";
 
 import {
   markerTaskList,
@@ -158,7 +160,8 @@ export default {
     MarkerStandard,
     MarkerStatistics,
     GradeAction,
-    SimpleImagePreview
+    SimpleImagePreview,
+    GradeRibbon
   },
   data() {
     return {

+ 49 - 4
src/modules/grading/marker/MarkerHeader.vue

@@ -1,7 +1,43 @@
 <template>
   <div class="marker-header">
+    <!-- fast-level-nav -->
+    <div v-if="ribbonSet.fastLevelNav" class="header-group fast-nav">
+      <div class="fast-nav-list">
+        <div
+          v-for="step in steps.levelStep"
+          :key="step.name"
+          :class="[
+            'fast-nav-item',
+            { 'is-active': curStep.name === step.name }
+          ]"
+          @click="stepClick(step.name)"
+        >
+          {{ step.name
+          }}<span v-if="showPaperRelateCount">({{ step.count }})</span>
+        </div>
+        <div
+          v-for="step in steps.otherStep"
+          :key="step.name"
+          :class="[
+            'fast-nav-item',
+            { 'is-active': curStep.name === step.name }
+          ]"
+          @click="stepClick(step.name)"
+        >
+          {{ step.name }}
+          <span v-if="showPaperRelateCount">({{ step.count }})</span>
+        </div>
+        <div
+          class="fast-nav-item fast-nav-close is-danger"
+          title="关闭快捷档位导航"
+          @click="closeFastNav"
+        >
+          <Icon type="md-close" :size="18" />
+        </div>
+      </div>
+    </div>
     <!-- left action -->
-    <div class="header-group">
+    <div v-if="!ribbonSet.fastLevelNav" class="header-group">
       <div class="header-part">
         <Dropdown
           v-if="areas.length > 1"
@@ -30,7 +66,7 @@
       </div>
     </div>
     <!-- header-page -->
-    <div class="header-group header-page">
+    <div v-if="!ribbonSet.fastLevelNav" class="header-group header-page">
       <div v-if="showPaperRelateCount" class="page-total">
         共{{ page.total }}张
       </div>
@@ -319,7 +355,8 @@ export default {
       "curArea",
       "curSubject",
       "areas",
-      "IS_MARK_LEADER"
+      "IS_MARK_LEADER",
+      "ribbonSet"
     ]),
     stageName() {
       return this.curSubject.stage === "LEVEL" ? "分档" : "打分";
@@ -349,7 +386,7 @@ export default {
       .filter(item => item.key !== "examNumber");
   },
   methods: {
-    ...mapMutations("marker", ["setPage", "setAreas"]),
+    ...mapMutations("marker", ["setPage", "setAreas", "setRibbonSet"]),
     async getAreaList() {
       const data = await areaList(this.filter);
       const areas = data.map(item => {
@@ -479,6 +516,14 @@ export default {
         params: this.markFilter
       });
     },
+    closeFastNav() {
+      const userId = this.$ls.get("user", { id: "" }).id;
+      const cacheRibbonSet = window.localStorage.getItem("ribbonSet");
+      const ribbonSet = cacheRibbonSet ? JSON.parse(cacheRibbonSet) : {};
+      ribbonSet[userId] = { fastLevelNav: false };
+      this.setRibbonSet(ribbonSet[userId]);
+      window.localStorage.setItem("ribbonSet", JSON.stringify(ribbonSet));
+    },
     userClick(name) {
       if (!name) return;
       this[name]();

+ 5 - 1
src/modules/grading/marker/store.js

@@ -13,7 +13,8 @@ const state = {
   curSubject: {},
   curUserRoleType: "",
   IS_MARKER: false,
-  IS_MARK_LEADER: false
+  IS_MARK_LEADER: false,
+  ribbonSet: { fastLevelNav: false }
 };
 const mutations = {
   setParamSet(state, paramsSet) {
@@ -48,6 +49,9 @@ const mutations = {
     state.IS_MARKER = curUserRoleType === "MARKER";
     state.IS_MARK_LEADER = curUserRoleType === "MARK_LEADER";
   },
+  setRibbonSet(state, ribbonSet) {
+    state.ribbonSet = ribbonSet;
+  },
   clearState(state) {
     state.paramsSet = {};
     state.page = {

+ 4 - 1
src/modules/mark/leader/LeaderMarking.vue

@@ -29,6 +29,7 @@
         v-if="curPaper.id"
         ref="GradeAction"
       ></mark-action>
+      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
 
     <div class="marker-body">
@@ -97,6 +98,7 @@ import SimpleImagePreview from "@/components/SimpleImagePreview";
 import LeaderProgress from "../../grading/leader/LeaderProgress";
 import MarkerImageView from "../../grading/marker/MarkerImageView";
 import MarkerHistory from "../../grading/marker/MarkerHistory";
+import GradeRibbon from "../../grading/components/GradeRibbon";
 
 import {
   paperList,
@@ -120,7 +122,8 @@ export default {
     // MarkerStatistics,
     LeaderProgress,
     MarkAction,
-    SimpleImagePreview
+    SimpleImagePreview,
+    GradeRibbon
   },
   data() {
     return {

+ 4 - 1
src/modules/mark/marker/MarkerMarking.vue

@@ -29,6 +29,7 @@
         ref="GradeAction"
         v-if="curPaper.id"
       ></mark-action>
+      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
 
     <div class="marker-body">
@@ -114,6 +115,7 @@ import MarkAction from "../components/MarkAction";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import MarkerImageView from "../../grading/marker/MarkerImageView";
 import MarkerHistory from "../../grading/marker/MarkerHistory";
+import GradeRibbon from "../../grading/components/GradeRibbon";
 
 import {
   getParamsSet,
@@ -134,7 +136,8 @@ export default {
     MarkerImageView,
     MarkerHistory,
     MarkAction,
-    SimpleImagePreview
+    SimpleImagePreview,
+    GradeRibbon
   },
   data() {
     return {