zhangjie 5 lat temu
rodzic
commit
78721d4a38

+ 8 - 8
src/api.js

@@ -51,7 +51,7 @@ export const clientMonitorList = datas => {
 export const studentPageList = datas => {
   return $get("/api/students", datas);
 };
-export const uploadStudent = datas => {
+export const updateStudent = datas => {
   if (datas.id) {
     return $put(`/api/students/${datas.id}`, datas);
   } else {
@@ -67,7 +67,7 @@ export const deleteStudent = studentId => {
 export const clientUserPageList = datas => {
   return $get("/api/admin/users/collect", datas);
 };
-export const uploadClientUser = datas => {
+export const updateClientUser = datas => {
   if (datas.id) {
     return $put(`/api/admin/users/collect/${datas.id}`, datas);
   } else {
@@ -81,7 +81,7 @@ export const deleteClientUser = userId => {
 export const inspectionUserPageList = datas => {
   return $get("/api/admin/users/collect", datas);
 };
-export const uploadInspectionUser = datas => {
+export const updateInspectionUser = datas => {
   if (datas.id) {
     return $put(`/api/admin/users/collect/${datas.id}`, datas);
   } else {
@@ -101,7 +101,7 @@ export const subjectDetail = subjectId => {
   // return $get("/api/admin/subjects", datas);
   return Promise.resolve({ id: subjectId, name: "素描" });
 };
-export const uploadSubject = datas => {
+export const updateSubject = datas => {
   if (datas.id) {
     return $put(`/api/admin/subject/${datas.id}`, datas);
   } else {
@@ -117,7 +117,7 @@ export const deleteSubject = subjectId => {
 export const levelList = workId => {
   return $get(`/api/admin/works/${workId}`, {});
 };
-export const uploadLevel = datas => {
+export const updateLevel = datas => {
   return $put(`/api/admin/works/${datas.id}`, datas);
 };
 // grading-rule-set
@@ -130,9 +130,9 @@ export const saveGradingRule = datas => {
   // TODO:
   return $post(`/api/admin/works/${datas.id}`, datas);
 };
-// upload-paper
+// update-paper
 // grading-rule-set
-export const uploadPaperDetail = () => {
+export const updatePaperDetail = () => {
   // TODO:
   return Promise.resolve({});
   // return $get(`/api/admin/works/${workId}`, {});
@@ -169,7 +169,7 @@ export const studentScoreList = datas => {
 export const gradingUserList = datas => {
   return $get("/api/admin/users", datas);
 };
-export const uploadGradingUser = datas => {
+export const updateGradingUser = datas => {
   if (datas.id) {
     return $put(`/api/admin/users/${datas.id}`, datas);
     // TODO:跟新之后没有返回任何东西,需要改一下

+ 7 - 2
src/assets/styles/base.less

@@ -193,13 +193,13 @@ body {
   }
 }
 .table th {
-  padding: 10px;
+  padding: 8px;
   line-height: 20px;
   letter-spacing: 1px;
   border: 1px solid @shadowGray;
 }
 .table td {
-  padding: 10px;
+  padding: 8px;
   line-height: 20px;
   border: 1px solid @shadowGray;
 }
@@ -210,6 +210,11 @@ body {
 tr.row-active td {
   color: @mainColor;
 }
+tr.tr-tips-error td {
+  padding: 2px 10px;
+  font-size: 13px;
+  color: @pink;
+}
 
 /* list */
 .list-lr-right {

+ 17 - 22
src/constants/enumerate.js

@@ -1,25 +1,3 @@
-// 性别
-export const SEX = {
-  M: "男",
-  W: "女"
-};
-
-// 年级
-export const GRADE = {
-  1: "一年级",
-  2: "二年级",
-  3: "三年级",
-  4: "四年级",
-  5: "五年级",
-  6: "六年级",
-  7: "初一",
-  8: "初二",
-  9: "初三",
-  10: "高一",
-  11: "高二",
-  12: "高三"
-};
-
 // 启用/禁用
 export const ABLE_TYPE = {
   DISABLE: "禁用",
@@ -99,3 +77,20 @@ export const ACTION_TYPE = {
   12: "手动打回",
   13: "档位落差"
 };
+
+// image-name-type
+export const IMAGE_NAME_TYPE = {
+  0: "按考号命名",
+  1: "随机码命名"
+};
+// paper-level-known-type
+export const PAPER_LEVEL_KNOWN_TYPE = {
+  0: "未知",
+  1: "已知"
+};
+
+// score-handle-type
+export const SCORE_HANDLE_TYPE = {
+  0: "四舍五入",
+  1: "非零进一"
+};

+ 2 - 2
src/modules/client-set/ClientAccountSet.vue

@@ -34,7 +34,7 @@
 </template>
 
 <script>
-import { clientUserPageList, deleteClientUser, uploadClientUser } from "@/api";
+import { clientUserPageList, deleteClientUser, updateClientUser } from "@/api";
 import ModifyClientUser from "./components/ModifyClientUser";
 
 export default {
@@ -123,7 +123,7 @@ export default {
       this.$refs.ModifyClientUser.open();
     },
     async toAble(row) {
-      await uploadClientUser({
+      await updateClientUser({
         id: row.id,
         loginName: row.loginName,
         enabled: !row.enabled

+ 102 - 39
src/modules/client-set/ClientParamSet.vue

@@ -8,30 +8,50 @@
             <Button type="success" icon="md-add" @click="toAdd">新增</Button>
           </div>
 
-          <table class="table">
+          <table class="table table-noborder">
             <tr>
               <th>序号</th>
               <th>科目名称</th>
               <th>科目代码</th>
               <th>操作</th>
             </tr>
-            <tr v-for="(subject, index) in subjects" :key="index">
-              <td>{{ index + 1 }}</td>
-              <td>
-                <Input v-model="subject.subjectName" clearable></Input>
-              </td>
-              <td>
-                <Input v-model="subject.subjectCode" clearable></Input>
-              </td>
-              <td>
-                <Button size="small" type="primary" @click="toSave(subject)"
-                  >保存</Button
-                >
-                <Button size="small" type="error" @click="toDelete(index)"
-                  >删除</Button
-                >
-              </td>
-            </tr>
+            <template v-for="(subject, index) in subjects">
+              <tr :key="index">
+                <td>{{ index + 1 }}</td>
+                <td>
+                  <Input
+                    v-model="subject.subjectName"
+                    @on-blur="checkSubjectValidate(subject)"
+                    clearable
+                  ></Input>
+                </td>
+                <td>
+                  <Input
+                    v-model="subject.subjectCode"
+                    @on-blur="checkSubjectValidate(subject)"
+                    clearable
+                  ></Input>
+                </td>
+                <td style="width: 120px;">
+                  <Button size="small" type="primary" @click="toSave(subject)"
+                    >保存</Button
+                  >
+                  <Button size="small" type="error" @click="toDelete(index)"
+                    >删除</Button
+                  >
+                </td>
+              </tr>
+              <tr
+                class="tr-tips-error"
+                v-if="subject.errors"
+                :key="index + '1'"
+              >
+                <td></td>
+                <td>{{ subject.errors.subjectName }}</td>
+                <td>{{ subject.errors.subjectCode }}</td>
+                <td></td>
+              </tr>
+            </template>
           </table>
         </div>
       </Col>
@@ -44,7 +64,7 @@
                 <Radio
                   v-for="(val, key) in BOOLEAN_TYPE"
                   :key="key"
-                  :label="key"
+                  :label="key * 1"
                   style="margin-right: 50px;"
                   >{{ val }}</Radio
                 >
@@ -55,7 +75,7 @@
                 <Radio
                   v-for="(val, key) in BOOLEAN_TYPE"
                   :key="key"
-                  :label="key"
+                  :label="key * 1"
                   style="margin-right: 50px;"
                   >{{ val }}</Radio
                 >
@@ -66,7 +86,12 @@
                 v-model="modalForm.imageNameRule"
                 placeholder="请选择图片命名规则"
               >
-                <Option value=""></Option>
+                <Option
+                  v-for="(val, key) in IMAGE_NAME_TYPE"
+                  :key="key"
+                  :value="key * 1"
+                  :label="val"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem prop="paperGrading" label="试卷档位:">
@@ -74,7 +99,12 @@
                 v-model="modalForm.imageNameRule"
                 placeholder="请选择试卷档位"
               >
-                <Option value=""></Option>
+                <Option
+                  v-for="(val, key) in PAPER_LEVEL_KNOWN_TYPE"
+                  :key="key"
+                  :value="key * 1"
+                  :label="val"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem>
@@ -88,8 +118,14 @@
 </template>
 
 <script>
-import { subjectList, uploadSubject, deleteSubject } from "@/api";
-import { BOOLEAN_TYPE } from "@/constants/enumerate";
+import { subjectList, updateSubject, deleteSubject } from "@/api";
+import {
+  BOOLEAN_TYPE,
+  IMAGE_NAME_TYPE,
+  PAPER_LEVEL_KNOWN_TYPE
+} from "@/constants/enumerate";
+import schema from "async-validator";
+schema.warning = function() {};
 
 const initSubject = {
   id: "",
@@ -103,13 +139,15 @@ export default {
   data() {
     return {
       BOOLEAN_TYPE,
+      IMAGE_NAME_TYPE,
+      PAPER_LEVEL_KNOWN_TYPE,
       subjects: [],
       // other param
       modalForm: {
-        isScanPackage: "0",
-        isImageEncryption: "1",
-        imageNameRule: "",
-        paperGrading: ""
+        isScanPackage: 0,
+        isImageEncryption: 0,
+        imageNameRule: 0,
+        paperGrading: 0
       }
     };
   },
@@ -130,18 +168,43 @@ export default {
     toAdd() {
       this.subjects.push({ ...initSubject });
     },
+    checkSubjectValidate(subject) {
+      const descriptor = {
+        subjectName: [
+          {
+            required: true,
+            min: 2,
+            max: 20,
+            message: "科目名称长度只能介于2到20之间"
+          }
+        ],
+        subjectCode: [
+          {
+            required: true,
+            pattern: /^[a-zA-Z0-9_]{3,20}$/,
+            message: "科目代码只能由数字、字母和下划线组成,长度2-20个字符"
+          }
+        ]
+      };
+      return new schema(descriptor)
+        .validate(subject)
+        .then(() => {
+          if (subject.errors) subject.errors = null;
+        })
+        .catch(({ errors, fields }) => {
+          let errorMsgs = {};
+          errors.map(error => {
+            errorMsgs[error.field] = error.message;
+          });
+          this.$set(subject, "errors", errorMsgs);
+          return { errors };
+        });
+    },
     async toSave(row) {
-      if (!row.subjectName || row.subjectName.length > 20) {
-        this.$Message.error("必须输入科目名称,且科目名称长度不能超过20个字符");
-        return;
-      }
-      if (!row.subjectCode.match(new RegExp(`^[a-zA-Z0-9_]{3,20}$`))) {
-        this.$Message.error(
-          "当前科目代码只能由数字、字母和下划线组成,长度2-20个字符"
-        );
-        return;
-      }
-      await uploadSubject(row);
+      const result = await this.checkSubjectValidate(row);
+      if (result) return;
+
+      await updateSubject(row);
       this.$Message.success("保存成功!");
       this.getList();
     },

+ 7 - 0
src/modules/client-set/ClientSet.vue

@@ -27,6 +27,13 @@ export default {
       curNav: {}
     };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actCurNav(val);
+      }
+    }
+  },
   mounted() {
     this.actCurNav(this.$route);
   },

+ 2 - 2
src/modules/client-set/InspectionAccountSet.vue

@@ -42,7 +42,7 @@
 import {
   inspectionUserPageList,
   deleteInspectionUser,
-  uploadInspectionUser
+  updateInspectionUser
 } from "@/api";
 
 const initModalForm = {
@@ -92,7 +92,7 @@ export default {
         );
         return;
       }
-      await uploadInspectionUser({
+      await updateInspectionUser({
         id: row.id,
         loginName: row.loginName,
         password: "123456"

+ 2 - 2
src/modules/client-set/components/ModifyClientUser.vue

@@ -36,7 +36,7 @@
 </template>
 
 <script>
-import { uploadClientUser } from "@/api";
+import { updateClientUser } from "@/api";
 import { password } from "@/plugins/formRules";
 
 const initModalForm = {
@@ -106,7 +106,7 @@ export default {
 
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await uploadClientUser(this.modalForm).catch(() => {
+      const data = await updateClientUser(this.modalForm).catch(() => {
         this.isSubmit = false;
       });
 

+ 221 - 72
src/modules/grading-set/GradingLevelSet.vue

@@ -4,7 +4,7 @@
       <Button type="success" icon="md-add" @click="toAdd">新增</Button>
     </div>
     <div class="part-box">
-      <table class="table">
+      <table class="table table-noborder">
         <tr>
           <th>档位</th>
           <th>最低分</th>
@@ -17,75 +17,121 @@
           <th>占比阀值%</th>
           <th>操作</th>
         </tr>
-        <tr v-for="(level, index) in levels" :key="index">
-          <td>
-            <Input
-              v-model="level.code"
-              style="width: 60px"
-              @on-blur="codeChange"
-            ></Input>
-          </td>
-          <td>
-            <InputNumber
-              v-model="level.minScore"
-              :min="0"
-              :max="200"
-            ></InputNumber>
-          </td>
-          <td>
-            <InputNumber
-              v-model="level.maxScore"
-              :min="level.minScore + 1"
-              :max="200"
-            ></InputNumber>
-          </td>
-          <td style="min-width: 100px">
-            <InputNumber
-              v-model="level.intervalScore"
-              :min="1"
-              :max="100"
-              v-if="level.levelType === 'ADMITED'"
-            ></InputNumber>
-          </td>
-          <td>
-            <InputNumber
-              v-model="level.weight"
-              :min="1"
-              :max="100"
-            ></InputNumber>
-          </td>
-          <td>
-            <Select
-              v-model="level.levelType"
-              @on-change="levelTypeChange(level)"
-              style="width: 120px"
-            >
-              <Option
-                v-for="(val, key) in LEVEL_TYPE"
-                :key="key"
-                :value="key"
-                >{{ val }}</Option
+        <template v-for="(level, index) in levels">
+          <tr :key="index">
+            <td>
+              <Input
+                v-model="level.code"
+                style="width: 60px"
+                @on-blur="codeChange(level)"
+              ></Input>
+            </td>
+            <td>
+              <InputNumber
+                v-model="level.minScore"
+                :min="0"
+                :max="200"
+                @on-blur="checkLevelValidate(level)"
+              ></InputNumber>
+            </td>
+            <td>
+              <InputNumber
+                v-model="level.maxScore"
+                :min="1"
+                :max="200"
+                @on-blur="checkLevelValidate(level)"
+              ></InputNumber>
+            </td>
+            <td style="min-width: 100px">
+              <InputNumber
+                v-model="level.intervalScore"
+                :min="1"
+                :max="100"
+                :precision="0"
+                @on-blur="checkLevelValidate(level)"
+                v-if="level.levelType === 'ADMITED'"
+              ></InputNumber>
+            </td>
+            <td>
+              <InputNumber
+                v-model="level.weight"
+                :min="1"
+                :max="100"
+                @on-blur="checkLevelValidate(level)"
+              ></InputNumber>
+            </td>
+            <td>
+              <Select
+                v-model="level.levelType"
+                @on-change="levelTypeChange(level)"
+                style="width: 120px"
               >
-            </Select>
-          </td>
-          <td style="min-width: 140px">
-            <Input
-              v-model="level.scoreList"
-              v-if="level.levelType === 'UNADMIT'"
-            ></Input>
-          </td>
-          <td>
-            <Input v-model="level.kdpt" :min="1" :max="100"></Input>
-          </td>
-          <td>
-            <Input v-model="level.pt" :min="1" :max="100"></Input>
-          </td>
-          <td>
-            <Button size="small" type="error" @click="toDelete(index)"
-              >删除</Button
-            >
-          </td>
-        </tr>
+                <Option
+                  v-for="(val, key) in LEVEL_TYPE"
+                  :key="key"
+                  :value="key"
+                  >{{ val }}</Option
+                >
+              </Select>
+            </td>
+            <td style="min-width: 140px">
+              <Input
+                v-model="level.scoreList"
+                @on-blur="checkLevelValidate(level)"
+                v-if="level.levelType === 'UNADMIT'"
+              ></Input>
+            </td>
+            <td>
+              <InputNumber
+                v-model="level.kdpt"
+                :min="1"
+                :max="100"
+                @on-blur="checkLevelValidate(level)"
+              ></InputNumber>
+            </td>
+            <td>
+              <InputNumber
+                v-model="level.pt"
+                :min="1"
+                :max="100"
+                @on-blur="checkLevelValidate(level)"
+              ></InputNumber>
+            </td>
+            <td>
+              <Button size="small" type="error" @click="toDelete(index)"
+                >删除</Button
+              >
+            </td>
+          </tr>
+          <tr class="tr-tips-error" v-if="level.errors" :key="index + '1'">
+            <td>
+              {{ level.errors.code }}
+            </td>
+            <td>
+              {{ level.errors.minScore }}
+            </td>
+            <td>
+              {{ level.errors.maxScore }}
+            </td>
+            <td>
+              {{ level.errors.intervalScore }}
+            </td>
+            <td>
+              {{ level.errors.weight }}
+            </td>
+            <td></td>
+            <td>
+              {{ level.errors.scoreList }}
+            </td>
+            <td>
+              {{ level.errors.kdpt }}
+            </td>
+            <td>
+              {{ level.errors.pt }}
+            </td>
+            <td></td>
+          </tr>
+        </template>
       </table>
 
       <div class="text-center">
@@ -98,8 +144,10 @@
 </template>
 
 <script>
-import { levelList, uploadLevel } from "@/api";
+import { levelList, updateLevel } from "@/api";
 import { LEVEL_TYPE } from "@/constants/enumerate";
+import schema from "async-validator";
+schema.warning = function() {};
 
 const initLevel = {
   id: null,
@@ -171,7 +219,8 @@ export default {
         level.intervalScore = null;
       }
     },
-    codeChange() {
+    codeChange(level) {
+      level.code = level.code.toUpperCase();
       this.levels.sort((a, b) => {
         if (
           !a.code ||
@@ -185,6 +234,7 @@ export default {
           this.letterRelateNumber[a.code] - this.letterRelateNumber[b.code]
         );
       });
+      this.checkLevelValidate(level);
     },
     getNextLevelCode() {
       const codeNumbers = this.levels.map(
@@ -207,7 +257,106 @@ export default {
     toDelete(index) {
       this.levels.splice(index, 1);
     },
+    checkLevelValidate(level) {
+      const descriptor = {
+        code: {
+          type: "string",
+          required: true,
+          pattern: /^[A-Z]{1}$/,
+          message: "请输入单个大写字母"
+        },
+        minScore: {
+          type: "number",
+          required: true,
+          message: "请输入最低分"
+        },
+        maxScore: {
+          type: "number",
+          required: true,
+          validator: (rule, value, callback) => {
+            if (!value || value < level.minScore) {
+              callback(new Error("最高分不得小于最低分"));
+            } else {
+              callback();
+            }
+          }
+        },
+        intervalScore: {
+          type: "number",
+          validator: (rule, value, callback) => {
+            if (level.levelType === "ADMITED" && !value) {
+              callback(new Error("请输入给分间隔"));
+            } else {
+              callback();
+            }
+          }
+        },
+        weight: {
+          type: "number",
+          required: true,
+          message: "请输入典型值"
+        },
+        scoreList: {
+          type: "string",
+          validator: (rule, value, callback) => {
+            if (level.levelType !== "UNADMIT") return callback();
+
+            if (level.levelType === "UNADMIT" && !value) {
+              return callback(new Error("请输入给分项"));
+            }
+            if (!value.match(/^[0-9,]+$/)) {
+              return callback(new Error("给分项只能包含数字和英文逗号"));
+            }
+            const unvalid = value
+              .split(",")
+              .filter(item => item)
+              .some(item => {
+                const num = item * 1;
+                return num < level.minScore || num > level.maxScore;
+              });
+            if (unvalid) {
+              return callback(
+                new Error("给分项包含的分值只能介于最低分和最高分之间")
+              );
+            }
+
+            callback();
+          }
+        },
+        pt: {
+          type: "number",
+          required: true,
+          message: "请输入占比阀值"
+        },
+        kdpt: {
+          type: "number",
+          required: true,
+          message: "请输入考点阀值"
+        }
+      };
+      return new schema(descriptor)
+        .validate(level)
+        .then(() => {
+          if (level.errors) level.errors = null;
+        })
+        .catch(({ errors, fields }) => {
+          let errorMsgs = {};
+          errors.map(error => {
+            errorMsgs[error.field] = error.message;
+          });
+          this.$set(level, "errors", errorMsgs);
+          return { errors };
+        });
+    },
     async toSubmit() {
+      const validatorAll = this.levels.map(level =>
+        this.checkLevelValidate(level)
+      );
+      const result = await Promise.all(validatorAll);
+      const hasUnvalidate = result.some(item => !!item);
+
+      if (hasUnvalidate) return;
+
       if (!this.checkLevelCodeIsContinuous()) {
         this.$Message.error("请保持档位连续!");
         return;
@@ -215,7 +364,7 @@ export default {
 
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await uploadLevel(this.worKDetail).catch(() => {
+      const data = await updateLevel(this.worKDetail).catch(() => {
         this.isSubmit = false;
       });
 

+ 13 - 10
src/modules/grading-set/GradingRuleSet.vue

@@ -4,20 +4,19 @@
       ref="modalFormComp"
       :model="modalForm"
       :rules="rules"
-      :label-width="120"
-      style="width: 600px;"
+      :label-width="200"
     >
-      <FormItem prop="name" label="仲裁档位差:">
+      <FormItem prop="arbitrateGradeIntervel" label="仲裁档位差:">
         <InputNumber
-          v-model.trim="modalForm.arbitrateGradeIntervel"
+          v-model="modalForm.arbitrateGradeIntervel"
           :min="1"
           :max="100"
           style="width: 160px;"
         ></InputNumber>
       </FormItem>
-      <FormItem prop="name" label="打回累计误差:">
+      <FormItem prop="refuseTotalCount" label="打回累计误差:">
         <InputNumber
-          v-model.trim="modalForm.refuseTotalCount"
+          v-model="modalForm.refuseTotalCount"
           :min="1"
           :max="100"
           style="width: 160px;"
@@ -28,7 +27,7 @@
           <Radio
             v-for="(val, key) in BOOLEAN_TYPE"
             :key="key"
-            :label="key"
+            :label="key * 1"
             style="margin-right: 50px;"
             >{{ val }}</Radio
           >
@@ -39,7 +38,7 @@
           <Radio
             v-for="(val, key) in BOOLEAN_TYPE"
             :key="key"
-            :label="key"
+            :label="key * 1"
             style="margin-right: 50px;"
             >{{ val }}</Radio
           >
@@ -50,7 +49,7 @@
           <Radio
             v-for="(val, key) in BOOLEAN_TYPE"
             :key="key"
-            :label="key"
+            :label="key * 1"
             style="margin-right: 50px;"
             >{{ val }}</Radio
           >
@@ -68,6 +67,7 @@
 <script>
 import { gradingRuleDetail, saveGradingRule } from "@/api";
 import { BOOLEAN_TYPE } from "@/constants/enumerate";
+import { numberValidator } from "@/plugins/formRules";
 
 export default {
   name: "grading-rule-set",
@@ -84,7 +84,10 @@ export default {
         isShowAllPaper: 0
       },
       modalForm: {},
-      rules: {}
+      rules: {
+        arbitrateGradeIntervel: numberValidator("请输入打回累计误差"),
+        refuseTotalCount: numberValidator("请输入仲裁档位差")
+      }
     };
   },
   mounted() {

+ 7 - 0
src/modules/grading-set/GradingSet.vue

@@ -27,6 +27,13 @@ export default {
       curNav: {}
     };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actCurNav(val);
+      }
+    }
+  },
   mounted() {
     this.actCurNav(this.$route);
   }

+ 2 - 2
src/modules/grading-set/UploadPaper.vue

@@ -30,7 +30,7 @@
 
 <script>
 import UploadButton from "@/components/UploadButton";
-import { uploadPaperDetail } from "@/api";
+import { updatePaperDetail } from "@/api";
 
 export default {
   name: "upload-paper",
@@ -115,7 +115,7 @@ export default {
   },
   methods: {
     async getData() {
-      const data = await uploadPaperDetail(this.workId);
+      const data = await updatePaperDetail(this.workId);
       this.papers = data.map(area => {
         area.subjects = area.subjects.map(subject => {
           subject.uploadUrl = ``;

+ 7 - 0
src/modules/grading/Grading.vue

@@ -42,6 +42,13 @@ export default {
       curSubject: { name: "色彩" }
     };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actSubNav();
+      }
+    }
+  },
   mounted() {
     this.buildNavs();
     this.actSubNav();

+ 11 - 2
src/modules/grading/components/ModifyFormalGradingTask.vue

@@ -49,7 +49,7 @@
 
 <script>
 import { createTryGradingTask } from "@/api";
-// import { password } from "@/plugins/formRules";
+import { numberValidator } from "@/plugins/formRules";
 
 const initModalForm = {
   areaCode: "",
@@ -63,7 +63,16 @@ export default {
       modalIsShow: false,
       isSubmit: false,
       modalForm: { ...initModalForm },
-      rules: {}
+      rules: {
+        areaCode: [
+          {
+            required: true,
+            message: "请选择考区",
+            trigger: "change"
+          }
+        ],
+        taskCount: numberValidator("请输入分配任务数量")
+      }
     };
   },
   methods: {

+ 24 - 7
src/modules/grading/components/ModifyGradingUser.vue

@@ -94,8 +94,8 @@
 </template>
 
 <script>
-import { uploadGradingUser } from "@/api";
-import { password } from "@/plugins/formRules";
+import { updateGradingUser } from "@/api";
+import { commonCode, password, numberValidator } from "@/plugins/formRules";
 import { ROLE_TYPE, MARKER_RIGHT_TYPE } from "@/constants/enumerate";
 
 const initModalForm = {
@@ -139,15 +139,32 @@ export default {
       MARKER_RIGHT_TYPE,
       modalForm: { ...initModalForm },
       rules: {
-        loginName: [
+        loginName: commonCode({ prop: "账号" }),
+        password,
+        name: [
           {
             required: true,
-            pattern: /^[a-zA-Z0-9_-]{2,19}$/,
-            message: "账号只能包含字母、数字、下划线以及短横线,长度3-20位",
+            min: 2,
+            max: 20,
+            message: "请输入姓名,长度2-20个字符",
             trigger: "change"
           }
         ],
-        password
+        role: [
+          {
+            required: true,
+            message: "请选择角色",
+            trigger: "change"
+          }
+        ],
+        markRight: [
+          {
+            required: true,
+            message: "请选择权限",
+            trigger: "change"
+          }
+        ],
+        weight: numberValidator("请输入权重")
       }
     };
   },
@@ -176,7 +193,7 @@ export default {
 
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await uploadGradingUser(this.modalForm).catch(() => {
+      const data = await updateGradingUser(this.modalForm).catch(() => {
         this.isSubmit = false;
       });
 

+ 2 - 2
src/modules/grading/components/ModifyUnformalGradingTask.vue

@@ -38,7 +38,7 @@
 </template>
 
 <script>
-import { uploadGradingUser } from "@/api";
+import { updateGradingUser } from "@/api";
 import UploadButton from "@/components/UploadButton";
 
 export default {
@@ -88,7 +88,7 @@ export default {
 
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await uploadGradingUser(this.modalForm).catch(() => {
+      const data = await updateGradingUser(this.modalForm).catch(() => {
         this.isSubmit = false;
       });
 

+ 8 - 2
src/modules/inspection/Inspection.vue

@@ -35,9 +35,15 @@ export default {
   data() {
     return { navs, curNav: {} };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actCurNav(val);
+      }
+    }
+  },
   mounted() {
     this.actCurNav(this.$route);
-  },
-  methods: {}
+  }
 };
 </script>

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

@@ -52,7 +52,7 @@
             <Option
               v-for="(val, key) in ACTION_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></Option>
           </Select>

+ 0 - 2
src/modules/inspection/InspectionCollectLogs.vue

@@ -102,7 +102,6 @@ import {
   workList,
   clientUserPageList
 } from "@/api";
-import { ACTION_TYPE } from "@/constants/enumerate";
 
 export default {
   name: "inspection-collect-logs",
@@ -117,7 +116,6 @@ export default {
         startTime: null,
         endTime: null
       },
-      ACTION_TYPE,
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,

+ 16 - 3
src/modules/main/Main.vue

@@ -41,10 +41,23 @@ export default {
       curNav: {}
     };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actMainNav();
+      }
+    }
+  },
   mounted() {
-    const router = this.$route.matched.filter(item => item.name !== "Main")[0];
-    this.actCurNav(router);
+    this.actMainNav();
   },
-  methods: {}
+  methods: {
+    actMainNav() {
+      const router = this.$route.matched.filter(
+        item => item.name !== "Main"
+      )[0];
+      this.actCurNav(router);
+    }
+  }
 };
 </script>

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

@@ -31,7 +31,7 @@
             <Option
               v-for="(val, key) in CAFA_EXCEPTION_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></Option>
           </Select>

+ 2 - 2
src/modules/main/components/ModifyStudent.vue

@@ -51,7 +51,7 @@
 </template>
 
 <script>
-import { uploadStudent } from "@/api";
+import { updateStudent } from "@/api";
 
 const initModalForm = {
   id: "",
@@ -149,7 +149,7 @@ export default {
 
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await uploadStudent(this.modalForm).catch(() => {
+      const data = await updateStudent(this.modalForm).catch(() => {
         this.isSubmit = false;
       });
 

+ 11 - 5
src/modules/mark-set/MarkRuleSet.vue

@@ -3,15 +3,20 @@
     <Form ref="modalFormComp" :model="modalForm" :label-width="180">
       <FormItem label="分数处理方式:">
         <Select v-model="modalForm.scoreRule" style="width: 200px">
-          <Option value="">12</Option>
+          <Option
+            v-for="(val, key) in SCORE_HANDLE_TYPE"
+            :key="key"
+            :value="key * 1"
+            >{{ val }}</Option
+          >
         </Select>
       </FormItem>
-      <FormItem label="改档及改档打分:">
+      <FormItem label="是否显示改档及改档打分:">
         <RadioGroup v-model="modalForm.changeGradeMarkType">
           <Radio
             v-for="(val, key) in BOOLEAN_TYPE"
             :key="key"
-            :label="key"
+            :label="key * 1"
             style="margin-right: 50px;"
             >{{ val }}</Radio
           >
@@ -22,7 +27,7 @@
           <Radio
             v-for="(val, key) in BOOLEAN_TYPE"
             :key="key"
-            :label="key"
+            :label="key * 1"
             style="margin-right: 50px;"
             >{{ val }}</Radio
           >
@@ -39,7 +44,7 @@
 
 <script>
 import { markRuleDetail, saveMarkRule } from "@/api";
-import { BOOLEAN_TYPE } from "@/constants/enumerate";
+import { BOOLEAN_TYPE, SCORE_HANDLE_TYPE } from "@/constants/enumerate";
 
 export default {
   name: "mark-rule-set",
@@ -48,6 +53,7 @@ export default {
       isSubmit: false,
       workId: this.$route.params.workId,
       BOOLEAN_TYPE,
+      SCORE_HANDLE_TYPE,
       initModalForm: {
         scoreRule: "",
         changeGradeMarkType: 0,

+ 7 - 0
src/modules/mark-set/MarkSet.vue

@@ -27,6 +27,13 @@ export default {
       curNav: {}
     };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actCurNav(val);
+      }
+    }
+  },
   mounted() {
     this.actCurNav(this.$route);
   }

+ 7 - 0
src/modules/mark/MarkHome.vue

@@ -44,6 +44,13 @@ export default {
       curSubject: { name: "素描" }
     };
   },
+  watch: {
+    $route: {
+      handler(val) {
+        this.actSubNav();
+      }
+    }
+  },
   mounted() {
     this.buildNavs();
     this.actSubNav();

+ 10 - 6
src/modules/mark/MarkTaskManage.vue

@@ -27,11 +27,11 @@
           <td>{{ task.finished }}</td>
           <td>{{ task.unfinished }}</td>
           <td>
-            <Select v-model="task.sortRule">
+            <Select v-model="task.sortRule" @on-change="sortRuleChange(task)">
               <Option
                 v-for="(val, key) in SORT_ORDER_TYPE"
                 :key="key"
-                :value="key"
+                :value="key * 1"
                 :label="val"
               ></Option>
             </Select>
@@ -41,7 +41,7 @@
               <Option
                 v-for="(val, key) in BOOLEAN_TYPE"
                 :key="key"
-                :value="key"
+                :value="key * 1"
                 :label="val"
               ></Option>
             </Select>
@@ -52,6 +52,7 @@
               :min="0"
               :max="task.unfinished"
               :precision="0"
+              :disabled="!task.unfinished"
             ></InputNumber>
           </td>
         </tr>
@@ -96,15 +97,15 @@ export default {
   methods: {
     initData() {
       this.taskList = "ABCDEFGHIJK".split("").map(item => {
-        const sum = Math.floor(Math.random() * 1000);
+        const sum = Math.floor(Math.random() * 20);
         const finished = Math.floor(sum * Math.random());
         return {
           grade: item,
           sum,
           finished,
           unfinished: sum - finished,
-          sortRule: "0",
-          showSerialNo: "0",
+          sortRule: 0,
+          showSerialNo: 0,
           taskCount: 0
         };
       });
@@ -113,6 +114,9 @@ export default {
       const data = await markTaskInfo(this.subjectId);
       console.log(data);
     },
+    sortRuleChange(task) {
+      if (!task.sortRule) task.showSerialNo = 0;
+    },
     async submit() {
       if (this.isSubmit) return;
       this.isSubmit = true;

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

@@ -50,7 +50,7 @@
               <Option
                 v-for="(val, key) in CAFA_EXCEPTION_TYPE"
                 :key="key"
-                :value="key"
+                :value="key * 1"
                 :label="val"
               ></Option>
             </Select>

+ 3 - 3
src/plugins/formRules.js

@@ -14,8 +14,8 @@ const commonCode = ({ prop, min = 3, max = 20 }) => {
   return [
     {
       required: true,
-      pattern: new RegExp(`^[a-zA-Z0-9_]{${min},${max}}$`),
-      message: `${prop}只能由数字、字母和下划线组成,长度${min}-${max}个字符`,
+      pattern: new RegExp(`^[a-zA-Z0-9_-]{${min},${max}}$`),
+      message: `${prop}只能由数字、字母、下划线和短横线组成,长度${min}-${max}个字符`,
       trigger: "change"
     }
   ];
@@ -62,7 +62,7 @@ const numberValidator = message => {
     {
       required: true,
       validator: (rule, value, callback) => {
-        if (!value && value !== 0) {
+        if (value === null) {
           callback(new Error(message));
         } else {
           callback();