浏览代码

base api完成

zhangjie 4 年之前
父节点
当前提交
443770f56f
共有 33 个文件被更改,包括 476 次插入379 次删除
  1. 7 0
      src/assets/styles/pages.scss
  2. 2 2
      src/components/UploadFileView.vue
  3. 3 10
      src/components/base/PaperNumberSelect.vue
  4. 3 8
      src/components/base/PlaceSelect.vue
  5. 0 2
      src/components/base/PrintPlanSelect.vue
  6. 0 2
      src/components/base/QuestionTeacherSelect.vue
  7. 3 8
      src/components/base/RoomSelect.vue
  8. 1 1
      src/constants/enumerate.js
  9. 5 5
      src/modules/base/api.js
  10. 9 4
      src/modules/base/components/CardTitleRuleEdit.vue
  11. 13 18
      src/modules/base/components/ModifyCardRule.vue
  12. 1 1
      src/modules/base/components/ModifyCourse.vue
  13. 4 3
      src/modules/base/components/ModifyMenu.vue
  14. 5 14
      src/modules/base/components/ModifyOrganization.vue
  15. 13 23
      src/modules/base/components/ModifyRole.vue
  16. 21 13
      src/modules/base/components/ModifyTemplate.vue
  17. 63 20
      src/modules/base/components/ModifyUser.vue
  18. 10 10
      src/modules/base/components/ResetPwd.vue
  19. 34 81
      src/modules/base/components/RuleBusiness.vue
  20. 41 31
      src/modules/base/components/SelectOrgs.vue
  21. 62 28
      src/modules/base/views/CardRuleManage.vue
  22. 1 1
      src/modules/base/views/CourseManage.vue
  23. 1 1
      src/modules/base/views/MenuManage.vue
  24. 41 24
      src/modules/base/views/RoleManage.vue
  25. 78 16
      src/modules/base/views/TemplateManage.vue
  26. 34 23
      src/modules/base/views/UserManage.vue
  27. 3 2
      src/modules/exam/views/ExamTaskManage.vue
  28. 4 4
      src/modules/login/api.js
  29. 4 8
      src/modules/login/views/Login.vue
  30. 2 2
      src/plugins/axios.js
  31. 7 6
      src/plugins/crypto.js
  32. 0 4
      src/plugins/filters.js
  33. 1 4
      src/views/Home.vue

+ 7 - 0
src/assets/styles/pages.scss

@@ -151,6 +151,13 @@
       background-color: $--color-primary;
       color: #fff !important;
     }
+    &-disabled {
+      cursor: not-allowed;
+
+      &:hover {
+        color: $--color-text-primary;
+      }
+    }
   }
   .field-textarea {
     border-radius: $--border-radius;

+ 2 - 2
src/components/UploadFileView.vue

@@ -132,7 +132,7 @@ export default {
       }
 
       const md5 = await fileMD5(file);
-      this.headers["md5"] = md5;
+      this.uploadDataDict["md5"] = md5;
 
       return this.autoUpload;
     },
@@ -151,7 +151,7 @@ export default {
     handleSuccess(response) {
       this.canUpload = false;
       this.loading = false;
-      if (response.code === "200") {
+      if (response.code === 200) {
         this.res = {
           success: true,
           message: "导入成功!"

+ 3 - 10
src/components/base/PaperNumberSelect.vue

@@ -9,12 +9,8 @@
     :disabled="disabled"
     @change="select"
   >
-    <el-option
-      v-for="(item, index) in optionList"
-      :key="index"
-      :value="item.pageNumber"
-    >
-      <span>{{ item.pageNumber }}</span>
+    <el-option v-for="(item, index) in optionList" :key="index" :value="item">
+      <span>{{ item }}</span>
     </el-option>
   </el-select>
 </template>
@@ -54,10 +50,7 @@ export default {
     },
     select() {
       this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.pageNumber === this.selected)
-      );
+      this.$emit("change", this.selected);
     }
   }
 };

+ 3 - 8
src/components/base/PlaceSelect.vue

@@ -12,8 +12,8 @@
     <el-option
       v-for="(item, index) in optionList"
       :key="index"
-      :value="item.examPlace"
-      :label="item.examPlace"
+      :value="item"
+      :label="item"
     >
     </el-option>
   </el-select>
@@ -54,13 +54,8 @@ export default {
     },
     select() {
       this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.examPlace === this.selected)
-      );
+      this.$emit("change", this.selected);
     }
   }
 };
 </script>
-
-<style></style>

+ 0 - 2
src/components/base/PrintPlanSelect.vue

@@ -62,5 +62,3 @@ export default {
   }
 };
 </script>
-
-<style></style>

+ 0 - 2
src/components/base/QuestionTeacherSelect.vue

@@ -72,5 +72,3 @@ export default {
   }
 };
 </script>
-
-<style></style>

+ 3 - 8
src/components/base/RoomSelect.vue

@@ -12,8 +12,8 @@
     <el-option
       v-for="(item, index) in optionList"
       :key="index"
-      :value="item.examRoom"
-      :label="item.examRoom"
+      :value="item"
+      :label="item"
     >
     </el-option>
   </el-select>
@@ -54,13 +54,8 @@ export default {
     },
     select() {
       this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.examRoom === this.selected)
-      );
+      this.$emit("change", this.selected);
     }
   }
 };
 </script>
-
-<style></style>

+ 1 - 1
src/constants/enumerate.js

@@ -170,7 +170,7 @@ export const PAPER_BACKUP_TYPE = {
 };
 
 export const ROLE_TYPE = {
-  ADMIN: "管理员",
+  SCHOOL_ADMIN: "管理员",
   EXAM_TEACHER: "考务老师",
   QUESTION_TEACHER: "命题老师",
   CUSTOMER: "客服人员",

+ 5 - 5
src/modules/base/api.js

@@ -30,8 +30,8 @@ export const ableRole = ({ id, enable }) => {
 export const updateRole = datas => {
   return $post("/api/sys/role/save", datas);
 };
-export const deleteRole = datas => {
-  return $post("/api/sys/role/remove", datas);
+export const deleteRole = id => {
+  return $post("/api/sys/role/remove", { id });
 };
 export const userBoundRoles = userId => {
   return $get("/api/sys/role/get_user_roles", { userId });
@@ -43,8 +43,8 @@ export const menuList = datas => {
 export const updateMenu = datas => {
   return $post("/api/sys/privilege/save", datas);
 };
-export const deleteMenu = datas => {
-  return $post("/api/sys/privilege/remove", datas);
+export const deleteMenu = id => {
+  return $post("/api/sys/privilege/remove", { id });
 };
 export const roleBoundPrivileges = roleId => {
   return $get("/api/sys/privilege/get_role_privileges", { roleId });
@@ -111,7 +111,7 @@ export const courseList = datas => {
   return $get("/api/basic/course/list", datas);
 };
 export const deleteCourse = id => {
-  return $get("/api/basic/course/remove", { id });
+  return $post("/api/basic/course/remove", { id });
 };
 export const updateCourse = datas => {
   return $post("/api/basic/course/save", datas);

+ 9 - 4
src/modules/base/components/CardTitleRuleEdit.vue

@@ -4,20 +4,24 @@
       <div
         v-for="field in fields"
         :key="field.code"
-        :class="['field-item', { 'field-item-act': field.selected }]"
+        :class="[
+          'field-item',
+          { 'field-item-act': field.selected, 'field-item-disabled': disabled }
+        ]"
         @mousedown="event => selectField(field, event)"
       >
         {{ field.name }}({{ field.code }})
       </div>
     </div>
     <el-input
+      ref="FieldTextarea"
+      v-model="content"
       type="textarea"
       resize="none"
       :rows="2"
       placeholder="请输入内容"
-      v-model="content"
+      :disabled="disabled"
       @input="contentChange"
-      ref="FieldTextarea"
     >
     </el-input>
   </div>
@@ -63,7 +67,7 @@ export default {
     value: {
       immediate: true,
       handler(val) {
-        if (!val) return;
+        // if (!val) return;
         this.content = val;
         this.updateFieldStatus();
       }
@@ -106,6 +110,7 @@ export default {
       });
     },
     selectField(field, event) {
+      if (this.disabled) return;
       event.preventDefault();
       field.selected = !field.selected;
       if (field.selected) {

+ 13 - 18
src/modules/base/components/ModifyCardRule.vue

@@ -90,7 +90,7 @@
           <h4 class="part-box-tips">题卡版头变量印刷字段配置:</h4>
           <el-form-item label="必选字段:" label-width="115px" required>
             <el-checkbox
-              v-for="column in requiredFields"
+              v-for="column in modalForm.requiredFields"
               :key="column.code"
               v-model="column.enable"
               disabled
@@ -99,7 +99,7 @@
           </el-form-item>
           <el-form-item label="扩展字段:" label-width="115px">
             <el-checkbox
-              v-for="column in extendFields"
+              v-for="column in modalForm.extendFields"
               :key="column.code"
               v-model="column.enable"
               :disabled="!editable"
@@ -180,8 +180,8 @@ const initModalForm = {
   paperType: "",
   examAbsent: true,
   writeSign: true,
-  requiredFields: "",
-  extendFields: "",
+  requiredFields: [],
+  extendFields: [],
   titleRule: "",
   attention: "",
   objectiveAttention: "",
@@ -218,21 +218,20 @@ export default {
       return this.editType !== "PREVIEW";
     },
     fieldSourses() {
-      return [...this.requiredFields, ...this.extendFields].filter(
-        item => item.enable
-      );
+      return [
+        ...this.modalForm.requiredFields,
+        ...this.modalForm.extendFields
+      ].filter(item => item.enable);
     }
   },
   data() {
     return {
       modalIsShow: false,
       isSubmit: false,
-      modalForm: {},
+      modalForm: { ...initModalForm },
       EXAM_NUMBER_STYLE,
       PAPER_TYPE,
       dataReady: false,
-      requiredFields: [],
-      extendFields: [],
       rules: {
         name: [
           {
@@ -324,12 +323,10 @@ export default {
   methods: {
     initData(val) {
       this.modalForm = this.$objAssign(initModalForm, val);
-      this.requiredFields = val.requiredFields;
-      this.extendFields = val.extendFields;
 
       if (val.id) {
-        this.modalForm.examAbsent = Boolean(val.examAbsent);
-        this.modalForm.writeSign = Boolean(val.writeSign);
+        this.modalForm.requiredFields = JSON.parse(val.requiredFields);
+        this.modalForm.extendFields = JSON.parse(val.extendFields);
         this.modalForm.orgIds = val.orgs.map(item => item.id);
       }
     },
@@ -358,10 +355,8 @@ export default {
       let modals = {
         ...this.modalForm
       };
-      modals.requiredFields = JSON.stringify(this.requiredFields);
-      modals.extendFields = JSON.stringify(this.extendFields);
-      modals.examAbsent = Number(modals.examAbsent);
-      modals.writeSign = Number(modals.writeSign);
+      modals.requiredFields = JSON.stringify(modals.requiredFields);
+      modals.extendFields = JSON.stringify(modals.extendFields);
       const data = await saveCardRule(modals).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 1 - 1
src/modules/base/components/ModifyCourse.vue

@@ -45,7 +45,7 @@
 import { updateCourse } from "../api";
 
 const initModalForm = {
-  id: "",
+  id: null,
   name: "",
   code: ""
 };

+ 4 - 3
src/modules/base/components/ModifyMenu.vue

@@ -81,7 +81,7 @@ const initModalForm = {
   url: "",
   parentId: null,
   parentName: "",
-  sortNum: 1,
+  sortNumber: 1,
   type: "M",
   remark: ""
 };
@@ -122,8 +122,9 @@ export default {
         url: [
           {
             required: true,
-            pattern: /^[a-zA-Z_\-[](){}]{3,30}$/,
-            message: "URL地址只能由字母短横线括号组成,长度在3-30之间",
+            pattern: /^[0-9a-zA-Z_-]{3,30}$/,
+            message:
+              "URL地址只能由字母、数字、短横线和下划线组成,长度在3-30之间",
             trigger: "change"
           }
         ]

+ 5 - 14
src/modules/base/components/ModifyOrganization.vue

@@ -41,18 +41,12 @@
           ></el-input>
         </el-form-item>
         <el-form-item label="启用/禁用:">
-          <el-select
+          <el-switch
             v-model="modalForm.enable"
-            style="width: 100px;"
-            placeholder="请选择"
+            active-color="#23c4b9"
+            inactive-color="#dcdfe6"
           >
-            <el-option
-              v-for="(val, key) in ABLE_TYPE"
-              :key="key"
-              :value="key * 1"
-              :label="val"
-            ></el-option>
-          </el-select>
+          </el-switch>
         </el-form-item>
       </el-form>
     </div>
@@ -66,7 +60,6 @@
 </template>
 
 <script>
-import { ABLE_TYPE } from "@/constants/enumerate";
 import { updateOrganization } from "../api";
 
 const initModalForm = {
@@ -75,7 +68,7 @@ const initModalForm = {
   code: "",
   parentId: null,
   parentName: "",
-  enable: 1
+  enable: true
 };
 
 export default {
@@ -101,7 +94,6 @@ export default {
       modalIsShow: false,
       isSubmit: false,
       modalForm: {},
-      ABLE_TYPE,
       rules: {
         name: [
           {
@@ -145,7 +137,6 @@ export default {
       if (this.isSubmit) return;
       this.isSubmit = true;
       const datas = { ...this.modalForm };
-      datas.enable = !!datas.enable;
       const data = await updateOrganization(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 13 - 23
src/modules/base/components/ModifyRole.vue

@@ -32,7 +32,7 @@
             placeholder="请选择"
           >
             <el-option
-              v-for="(val, key) in ROLE_TYPE"
+              v-for="(val, key) in roleTypes"
               :key="key"
               :value="key"
               :label="val"
@@ -71,8 +71,6 @@
 
 <script>
 import { updateRole, roleBoundPrivileges } from "../api";
-import { getEnums } from "../../login/api";
-import { ROLE_TYPE } from "../../../constants/enumerate";
 
 const initModalForm = {
   id: null,
@@ -95,6 +93,12 @@ export default {
       default() {
         return [];
       }
+    },
+    roleTypes: {
+      type: Object,
+      default() {
+        return {};
+      }
     }
   },
   computed: {
@@ -112,14 +116,12 @@ export default {
       defaultProps: {
         label: "name"
       },
-      ROLE_TYPE,
-      // ROLE_TYPE: {},
       rules: {
         name: [
           {
             required: true,
-            pattern: /^[\u4E00-\u9FA5]{1,10}$/,
-            message: "角色名称只能输入汉字,长度不能超过10",
+            pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,10}$/,
+            message: "角色名称只能输入汉字、字母和数字,长度不能超过10",
             trigger: "change"
           }
         ],
@@ -146,26 +148,15 @@ export default {
       }
     };
   },
-  mounted() {
-    // this.getRoleTypes();
-  },
   methods: {
-    async getRoleTypes() {
-      const data = await getEnums("ROLE_TYPE");
-      let ROLE_TYPE = {};
-      data.forEach(element => {
-        ROLE_TYPE[element.name] = element.desc;
-      });
-      this.ROLE_TYPE = ROLE_TYPE;
-    },
     async visibleChange() {
-      if (this.instance.id) {
+      if (this.instance.id && this.instance.type === "CUSTOM") {
         this.modalForm = this.$objAssign(initModalForm, this.instance);
         let privilegeIds = await roleBoundPrivileges(this.instance.id);
         let checkedIds = [];
         const getCheckedIds = list => {
           list.forEach(item => {
-            if (item["children"]) {
+            if (item["children"] && item["children"].length) {
               getCheckedIds(item.children);
             } else {
               const isChecked = privilegeIds.includes(item.id);
@@ -174,7 +165,6 @@ export default {
           });
         };
         getCheckedIds(this.menus);
-        console.log(checkedIds);
         this.$refs.MenuTree.setCheckedKeys(checkedIds);
         this.modalForm.privilegeIds = checkedIds;
       } else {
@@ -206,12 +196,12 @@ export default {
         ...this.$refs.MenuTree.getCheckedKeys(),
         ...this.$refs.MenuTree.getHalfCheckedKeys()
       ];
-      datas.privilegeIds = privilegeIds.join();
+      datas.privilegeIds = privilegeIds;
       const data = await updateRole(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;
 
-      this.$emit("confirm", this.modalForm);
+      this.$emit("modified", this.modalForm);
       this.cancel();
     }
   }

+ 21 - 13
src/modules/base/components/ModifyTemplate.vue

@@ -40,7 +40,7 @@
           ></el-input>
         </el-form-item>
         <el-form-item
-          v-if="modalForm.templateType !== 'GENERIC'"
+          v-if="modalForm.type !== 'GENERIC'"
           prop="classify"
           label="分类:"
         >
@@ -48,6 +48,7 @@
             v-model="modalForm.classify"
             style="width: 439px;"
             placeholder="请选择"
+            :disabled="!editable"
             clearable
           >
             <el-option
@@ -62,14 +63,15 @@
           <upload-file-view
             :upload-url="uploadUrl"
             :disabled="!editable"
+            :format="format"
             @upload-error="uplaodError"
             @upload-success="uploadSuccess"
             ref="UploadFileView"
           ></upload-file-view>
         </el-form-item>
-        <el-form-item prop="orgs" label="适用学院范围:">
+        <el-form-item prop="orgIds" label="适用学院范围:">
           <select-orgs
-            v-model="modalForm.orgs"
+            v-model="modalForm.orgIds"
             ref="SelectOrgs"
             :disabled="!editable"
           ></select-orgs>
@@ -99,11 +101,11 @@ import SelectOrgs from "./SelectOrgs";
 const initModalForm = {
   id: null,
   name: "",
-  templateType: "GENERIC",
+  type: "GENERIC",
   remark: "",
   classify: "",
   attachmentId: "",
-  orgs: []
+  orgIds: []
 };
 
 const TEMPLATE_CLASSIFY = {
@@ -140,7 +142,15 @@ export default {
       return this.editType !== "PREVIEW";
     },
     categories() {
-      return TEMPLATE_CLASSIFY[this.modalForm.templateType] || {};
+      return TEMPLATE_CLASSIFY[this.modalForm.type] || {};
+    },
+    format() {
+      const formats = {
+        GENERIC: ["pdf"],
+        VARIABLE: ["pdf"],
+        ORDINARY: ["pdf"]
+      };
+      return formats[this.modalForm.type];
     }
   },
   data() {
@@ -172,7 +182,7 @@ export default {
             trigger: "change"
           }
         ],
-        orgs: [
+        orgIds: [
           {
             required: true,
             validator: (rule, value, callback) => {
@@ -187,15 +197,14 @@ export default {
         ]
       },
       // upload
-      uploadUrl: "/api/exam/file/upload"
+      uploadUrl: "/api/common/file/upload"
     };
   },
-  mounted() {},
   methods: {
     initData(val) {
       this.modalForm = this.$objAssign(initModalForm, val);
       if (val.id) {
-        this.modalForm.orgs = val.orgs.map(item => item.id);
+        this.modalForm.orgIds = val.orgs.map(item => item.id);
         this.getAttachment();
       } else {
         this.$nextTick(() => {
@@ -208,9 +217,7 @@ export default {
       this.attachment = data;
 
       this.$nextTick(() => {
-        this.$refs.UploadFileView.setAttachmentName(
-          `${data.fileName}${data.fileType}`
-        );
+        this.$refs.UploadFileView.setAttachmentName(`${data.name}${data.type}`);
       });
     },
     visibleChange() {
@@ -235,6 +242,7 @@ export default {
       let datas = {
         ...this.modalForm
       };
+      if (datas.type === "GENERIC") datas.classify = "CARD";
       const data = await updateTemplate(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 63 - 20
src/modules/base/components/ModifyUser.vue

@@ -22,7 +22,7 @@
             style="width:100%;"
             v-model.trim="modalForm.loginName"
             placeholder="请输入用户名"
-            clearable
+            disabled
           ></el-input>
         </el-form-item>
         <el-form-item prop="realName" label="姓名:">
@@ -47,6 +47,7 @@
             v-model="modalForm.roleIds"
             placeholder="请选择角色"
             multiple
+            @change="rolesChange"
           >
             <el-option
               v-for="item in roles"
@@ -58,26 +59,33 @@
           </el-select>
         </el-form-item>
         <el-form-item
-          prop="courseCodes"
+          prop="courseIds"
           label="课程:"
-          v-if="modalForm.roleIds === 'QUESTION_TEACHER'"
+          v-if="IS_QUESTION_TEACHER"
         >
           <el-select
             style="width:100%;"
-            v-model="modalForm.courseCodes"
+            v-model="modalForm.courseIds"
             placeholder="请选择课程"
             multiple
             filterable
           >
             <el-option
               v-for="item in courses"
-              :key="item.code"
-              :value="item.code"
+              :key="item.id"
+              :value="item.id"
               :label="item.name"
             >
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item prop="orgId" label="所属学院:">
+          <select-orgs
+            ref="SelectOrgs"
+            v-model="modalForm.orgId"
+            :multiple="false"
+          ></select-orgs>
+        </el-form-item>
       </el-form>
     </div>
     <div slot="footer">
@@ -93,6 +101,7 @@
 import { updateUser, courseQuery } from "../api";
 import { logout } from "../../login/api";
 import { phone } from "@/plugins/formRules";
+import SelectOrgs from "./SelectOrgs";
 
 const initModalForm = {
   id: "",
@@ -100,11 +109,13 @@ const initModalForm = {
   realName: "",
   mobileNumber: "",
   roleIds: [],
-  courseCodes: []
+  courseIds: [],
+  orgId: []
 };
 
 export default {
   name: "modify-user",
+  components: { SelectOrgs },
   props: {
     instance: {
       type: Object,
@@ -125,6 +136,9 @@ export default {
     },
     title() {
       return (this.isEdit ? "编辑" : "新增") + "用户";
+    },
+    IS_QUESTION_TEACHER() {
+      return this.roleTypes.includes("QUESTION_TEACHER");
     }
   },
   data() {
@@ -135,13 +149,20 @@ export default {
         callback();
       }
     };
-    const courseCodesValidator = (rule, value, callback) => {
+    const courseIdsValidator = (rule, value, callback) => {
       if (!value || !value.length) {
         callback(new Error("请选择课程"));
       } else {
         callback();
       }
     };
+    const orgIdValidator = (rule, value, callback) => {
+      if (!value || !value.length) {
+        callback(new Error("请选择所属学院"));
+      } else {
+        callback();
+      }
+    };
 
     return {
       modalIsShow: false,
@@ -149,14 +170,14 @@ export default {
       modalForm: {},
       rules: {
         mobileNumber: phone,
-        name: [
+        loginName: [
           {
             required: true,
             message: "请输入用户名",
             trigger: "change"
           }
         ],
-        loginName: [
+        realName: [
           {
             required: true,
             message: "请输入姓名",
@@ -170,27 +191,37 @@ export default {
             trigger: "change"
           }
         ],
-        courseCodes: [
+        courseIds: [
           {
             required: true,
-            validator: courseCodesValidator,
+            validator: courseIdsValidator,
+            trigger: "change"
+          }
+        ],
+        orgId: [
+          {
+            required: true,
+            validator: orgIdValidator,
             trigger: "change"
           }
         ]
       },
       user: {},
-      courses: []
+      courses: [],
+      roleTypes: []
     };
   },
   created() {
-    // this.getCourseList();
+    this.getCourseList();
   },
   methods: {
     initData(val) {
       if (val.id) {
         this.modalForm = this.$objAssign(initModalForm, val);
         this.modalForm.roleIds = val.roles.map(item => item.id);
-        this.modalForm.courseCodes = val.courses.map(item => item.code);
+        this.modalForm.courseIds = val.courses.map(item => item.id);
+        this.modalForm.orgId = [val.orgId];
+        this.roleTypes = val.roles.map(role => role.type);
       } else {
         this.modalForm = { ...initModalForm };
       }
@@ -205,9 +236,14 @@ export default {
       this.modalIsShow = true;
     },
     async getCourseList() {
-      const data = await courseQuery();
+      const data = await courseQuery("");
       this.courses = data;
     },
+    rolesChange(roleIds) {
+      this.roleTypes = this.roles
+        .filter(role => roleIds.includes(role.id))
+        .map(role => role.type);
+    },
     async submit() {
       const valid = await this.$refs.modalFormComp.validate().catch(() => {});
       if (!valid) return;
@@ -216,24 +252,31 @@ export default {
       this.isSubmit = true;
 
       const datas = { ...this.modalForm };
-      // TODO:
-      if (datas.roleIds !== "QUESTION_TEACHER") delete datas.courseCodes;
+      if (!this.IS_QUESTION_TEACHER) delete datas.courseIds;
+      datas.orgId = datas.orgId.join();
       const data = await updateUser(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;
 
       this.$message.success("修改成功!");
+      this.cancel();
 
       // 自己把自己的角色改了之后要重新登录,重新获取权限
-      // TODO:
+      const oldRoleIds = this.instance.roles
+        .map(item => item.id)
+        .sort((a, b) => a - b)
+        .join();
+      const newRoleIds = datas.roleIds.sort((a, b) => a - b).join();
       if (
-        this.instance.roleIds !== this.modalForm.roleIds &&
+        oldRoleIds !== newRoleIds &&
         this.$ls.get("user").id === this.instance.id
       ) {
         await logout(this.$ls.get("user", { id: "" }).id);
         this.$ls.clear();
         this.$router.push({ name: "Login" });
         this.$message.info("您的权限已经变更,请重新登录系统!");
+      } else {
+        this.$emit("modified");
       }
     }
   }

+ 10 - 10
src/modules/base/components/ResetPwd.vue

@@ -17,20 +17,20 @@
         :rules="resetRules"
         label-width="100px"
       >
-        <el-form-item prop="password" label="旧密码:">
+        <el-form-item prop="oldPassword" label="旧密码:">
           <el-input
             size="large"
             type="password"
-            v-model="resetModel.password"
+            v-model="resetModel.oldPassword"
             placeholder="请输入旧密码"
             clearable
           ></el-input>
         </el-form-item>
-        <el-form-item prop="newPassword" label="新密码:">
+        <el-form-item prop="password" label="新密码:">
           <el-input
             size="large"
             type="password"
-            v-model="resetModel.newPassword"
+            v-model="resetModel.password"
             placeholder="请输入新密码"
             clearable
           ></el-input>
@@ -62,8 +62,8 @@ import { AES } from "@/plugins/crypto";
 
 const initModalForm = {
   id: "",
+  oldPassword: "",
   password: "",
-  newPassword: "",
   rePassword: ""
 };
 export default {
@@ -75,7 +75,7 @@ export default {
   },
   data() {
     const equalToPswd = (rule, value, callback) => {
-      if (value !== this.resetModel.newPassword) {
+      if (value !== this.resetModel.password) {
         callback(new Error("两次输入的密码不一致"));
       } else {
         callback();
@@ -86,8 +86,8 @@ export default {
       isSubmit: false,
       resetModel: { ...initModalForm },
       resetRules: {
+        oldPassword: password,
         password,
-        newPassword: password,
         rePassword: [
           ...password,
           {
@@ -101,7 +101,7 @@ export default {
   methods: {
     initData(val) {
       this.resetModel = { ...initModalForm };
-      this.resetModel.password = this.userPassword || "";
+      this.resetModel.oldPassword = this.userPassword || "";
       this.resetModel.id = this.$ls.get("user", { id: "" }).id;
     },
     visibleChange() {
@@ -121,8 +121,8 @@ export default {
       this.isSubmit = true;
       const datas = {
         id: this.resetModel.id,
-        password: AES(this.resetModel.password),
-        newPassword: AES(this.resetModel.newPassword)
+        oldPassword: AES(this.resetModel.oldPassword),
+        password: AES(this.resetModel.password)
       };
       const data = await updatePwd(datas).catch(() => {
         this.isSubmit = false;

+ 34 - 81
src/modules/base/components/RuleBusiness.vue

@@ -1,22 +1,17 @@
 <template>
   <div class="rule-business part-box part-box-pad part-box-border">
     <h4 class="part-box-tips">变量印刷考务字段配置:</h4>
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules"
-      label-width="170px"
-    >
-      <el-form-item prop="requiredFields" label="必选字段:">
+    <el-form ref="modalFormComp" :model="modalForm" label-width="170px">
+      <el-form-item label="必选字段:" required>
         <el-checkbox
           v-for="field in modalForm.requiredFields"
           :key="field.code"
           v-model="field.enable"
-          @change="validateRequiredFields"
+          disabled
           >{{ field.name }}</el-checkbox
         >
       </el-form-item>
-      <el-form-item prop="extendFields" label="扩展字段:">
+      <el-form-item label="扩展字段:">
         <div class="part-box part-box-pad part-box-border">
           <div class="label-edit">
             <div
@@ -44,34 +39,28 @@
         </div>
       </el-form-item>
       <el-form-item label="是否启用入库审核:" required>
-        <el-radio-group v-model="modalForm.review">
-          <el-radio
-            v-for="(val, key) in ABLE_TYPE"
-            :key="key"
-            :label="key * 1"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
+        <el-switch
+          v-model="modalForm.review"
+          active-color="#23c4b9"
+          inactive-color="#dcdfe6"
+        >
+        </el-switch>
       </el-form-item>
       <el-form-item label="入库强制包含试卷:" required>
-        <el-radio-group v-model="modalForm.includePaper">
-          <el-radio
-            v-for="(val, key) in ABLE_TYPE"
-            :key="key"
-            :label="key * 1"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
+        <el-switch
+          v-model="modalForm.includePaper"
+          active-color="#23c4b9"
+          inactive-color="#dcdfe6"
+        >
+        </el-switch>
       </el-form-item>
       <el-form-item label="是否启用客服制卡:" required>
-        <el-radio-group v-model="modalForm.customCard">
-          <el-radio
-            v-for="(val, key) in ABLE_TYPE"
-            :key="key"
-            :label="key * 1"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
+        <el-switch
+          v-model="modalForm.customCard"
+          active-color="#23c4b9"
+          inactive-color="#dcdfe6"
+        >
+        </el-switch>
       </el-form-item>
       <el-form-item label="提交印刷方式:" required>
         <el-radio-group v-model="modalForm.printMethod">
@@ -97,18 +86,18 @@
 
 <script>
 import ModifyField from "../components/ModifyField";
-import { ABLE_TYPE, CONFIRM_PRINT_TYPE } from "@/constants/enumerate";
+import { CONFIRM_PRINT_TYPE } from "@/constants/enumerate";
 import { commonRuleDetail, saveCommonBusinessRule } from "../api";
 import { getEnums } from "../../login/api";
 
 const initModalForm = {
   id: null,
-  review: 1,
-  includePaper: 1,
-  customCard: 1,
+  review: true,
+  includePaper: true,
+  customCard: true,
   printMethod: "AUTO",
-  requiredFields: [],
-  extendFields: []
+  requiredFields: "[]",
+  extendFields: "[]"
 };
 
 export default {
@@ -118,37 +107,6 @@ export default {
     return {
       modalForm: { ...initModalForm },
       isSubmit: false,
-      rules: {
-        requiredFields: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              const selected = value.some(item => item.enable);
-              if (selected) {
-                callback();
-              } else {
-                callback(new Error("请选择必选字段"));
-              }
-            },
-            trigger: "change"
-          }
-        ],
-        extendFields: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              const selected = value.some(item => item.enable);
-              if (selected) {
-                callback();
-              } else {
-                callback(new Error("请选择扩展字段"));
-              }
-            },
-            trigger: "change"
-          }
-        ]
-      },
-      ABLE_TYPE,
       CONFIRM_PRINT_TYPE
     };
   },
@@ -158,18 +116,16 @@ export default {
   methods: {
     async init() {
       const requiredFields = await getEnums("REQUIRED_FIELDS");
-      let commonRule = await commonRuleDetail();
-      commonRule.requiredFields = requiredFields.map(item => {
+      const commonRule = await commonRuleDetail();
+      this.modalForm = Object.assign(initModalForm, commonRule || {});
+      this.modalForm.requiredFields = requiredFields.map(item => {
         return {
           code: item.code,
           name: item.desc,
-          enable: commonRule.requiredFields.includes(item.code)
+          enable: true
         };
       });
-      this.modalForm = Object.assign(initModalForm, commonRule);
-      this.modalForm.review = Number(commonRule.review);
-      this.modalForm.includePaper = Number(commonRule.includePaper);
-      this.modalForm.customCard = Number(commonRule.customCard);
+      this.modalForm.extendFields = JSON.parse(this.modalForm.extendFields);
     },
     validateRequiredFields() {
       this.$refs.modalFormComp.validateField("requiredFields");
@@ -181,7 +137,7 @@ export default {
       this.$refs.ModifyField.open();
     },
     addField(field) {
-      this.extendFields.push({ ...field });
+      this.modalForm.extendFields.push({ ...field });
     },
     deleteField(field) {
       const index = this.modalForm.extendFields.findIndex(
@@ -201,9 +157,6 @@ export default {
       };
       datas.requiredFields = JSON.stringify(datas.requiredFields);
       datas.extendFields = JSON.stringify(datas.extendFields);
-      datas.review = Boolean(datas.review);
-      datas.includePaper = Boolean(datas.includePaper);
-      datas.customCard = Boolean(datas.customCard);
       const data = await saveCommonBusinessRule(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 41 - 31
src/modules/base/components/SelectOrgs.vue

@@ -1,24 +1,24 @@
 <template>
-  <div :class="['select-orgs', { 'select-orgs-disabled': disabled }]">
-    <div class="part-box part-box-pad part-box-border" v-if="isTree">
-      <el-tree
-        :data="orgs"
-        show-checkbox
-        default-expand-all
-        node-key="id"
-        ref="MenuTree"
-        :props="defaultProps"
-        check-on-click-node
-        :expand-on-click-node="false"
-        @check-change="checkChange"
-      >
-      </el-tree>
-    </div>
-    <el-checkbox-group v-model="selectedOrgs" @change="selectChange" v-else>
-      <el-checkbox v-for="item in orgs" :key="item.id" :label="item.id">{{
-        item.name
-      }}</el-checkbox>
-    </el-checkbox-group>
+  <div
+    :class="[
+      'select-orgs part-box part-box-pad part-box-border',
+      { 'select-orgs-disabled': disabled }
+    ]"
+  >
+    <el-tree
+      :data="orgs"
+      show-checkbox
+      default-expand-all
+      node-key="id"
+      ref="MenuTree"
+      :props="defaultProps"
+      :check-strictly="!multiple"
+      check-on-click-node
+      :expand-on-click-node="false"
+      @check="checkClick"
+      @check-change="checkChange"
+    >
+    </el-tree>
   </div>
 </template>
 
@@ -34,6 +34,10 @@ export default {
         return [];
       }
     },
+    multiple: {
+      type: Boolean,
+      default: true
+    },
     disabled: {
       type: Boolean,
       default: false
@@ -44,7 +48,6 @@ export default {
       selectedOrgs: [],
       // orgs: [],
       orgs: [],
-      isTree: false,
       defaultProps: {
         label: "name"
       }
@@ -55,28 +58,30 @@ export default {
   },
   watch: {
     value(val, oldVal) {
-      if (this.isTree && val.join() !== oldVal.join()) this.setCheckedNode(val);
+      if (val.join() !== oldVal.join()) this.setCheckedNode(val);
     }
   },
   methods: {
     async getList() {
       this.orgs = await organizationList();
-      this.isTree = !!this.orgs[0]["children"];
 
-      if (this.isTree) {
-        this.$nextTick(() => {
-          this.setCheckedNode(this.value);
-        });
-      }
+      this.$nextTick(() => {
+        this.setCheckedNode(this.value);
+      });
     },
     setCheckedNode(selectedIds) {
       const selectedOrgs = this.$refs.MenuTree.getCheckedKeys();
       if (selectedOrgs.join() === selectedIds.join()) return;
 
+      if (!this.multiple) {
+        this.$refs.MenuTree.setCheckedKeys(selectedIds);
+        return;
+      }
+
       let checkedIds = [];
       const getCheckedIds = list => {
         list.forEach(item => {
-          if (item["children"]) {
+          if (item["children"] && item["children"].length) {
             getCheckedIds(item.children);
           } else {
             const isChecked = selectedIds.includes(item.id);
@@ -88,11 +93,16 @@ export default {
       this.$refs.MenuTree.setCheckedKeys(checkedIds);
     },
     checkChange() {
+      if (!this.multiple) return;
       const selectedOrgs = this.$refs.MenuTree.getCheckedKeys();
       this.emitChange(selectedOrgs);
     },
-    selectChange() {
-      this.emitChange(this.selectedOrgs);
+    checkClick(data) {
+      if (this.multiple) return;
+
+      const selectedOrgs = [data.id];
+      this.$refs.MenuTree.setCheckedKeys([data.id]);
+      this.emitChange(selectedOrgs);
     },
     emitChange(vals) {
       this.$emit("input", vals);

+ 62 - 28
src/modules/base/views/CardRuleManage.vue

@@ -29,7 +29,7 @@
             <el-option
               v-for="(val, key) in ABLE_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></el-option>
           </el-select>
@@ -154,7 +154,8 @@ export default {
       rules: [],
       curRule: {},
       editType: "ADD",
-      commonRule: {},
+      cardRequiredFields: [],
+      cardExtendFields: [],
       ABLE_TYPE
     };
   },
@@ -164,16 +165,32 @@ export default {
   },
   methods: {
     async getCommonRuleDetail() {
-      const requiredFields = await getEnums("REQUIRED_FIELDS");
+      const examRequiredFields = await getEnums("REQUIRED_FIELDS");
+      this.cardRequiredFields = await getEnums("CARD_REQUIRED_FIELDS");
+      const cardRequiredFieldCodes = this.cardRequiredFields.map(
+        item => item.code
+      );
+      const extendFields = examRequiredFields
+        .filter(field => !cardRequiredFieldCodes.includes(field.code))
+        .map(item => {
+          return {
+            code: item.code,
+            name: item.desc
+          };
+        });
       let commonRule = await commonRuleDetail();
-      commonRule.requiredFields = requiredFields.map(item => {
-        return {
-          code: item.code,
-          name: item.desc,
-          enable: commonRule.requiredFields.includes(item.code)
-        };
-      });
-      this.commonRule = commonRule;
+      if (!commonRule) {
+        this.$notify.error({
+          title: "错误",
+          message: "请先设置通用考务规则配置"
+        });
+        return;
+      }
+
+      this.cardExtendFields = [
+        ...extendFields,
+        ...JSON.parse(commonRule.extendFields).filter(item => item.enable)
+      ];
     },
     async getList() {
       const datas = {
@@ -181,7 +198,8 @@ export default {
         pageNumber: this.current,
         pageSize: this.size
       };
-      datas.enable = !!datas.enable;
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
       const data = await cardRuleListPage(datas);
       this.rules = data.records;
       this.total = data.total;
@@ -192,15 +210,20 @@ export default {
     },
     toAdd() {
       this.curRule = {
-        requiredFields: this.commonRule.requiredFields.filter(
-          item => item.enable
-        ),
-        extendFields: this.commonRule.extendFields
-          .filter(item => item.enable)
-          .map(item => {
-            item.enable = false;
-            return item;
-          })
+        requiredFields: this.cardRequiredFields.map(item => {
+          return {
+            code: item.code,
+            name: item.desc,
+            enable: true
+          };
+        }),
+        extendFields: this.cardExtendFields.map(item => {
+          return {
+            code: item.code,
+            name: item.name,
+            enable: false
+          };
+        })
       };
       this.editType = "ADD";
       this.$refs.ModifyCardRule.open();
@@ -215,13 +238,24 @@ export default {
       this.editType = "PREVIEW";
       this.$refs.ModifyCardRule.open();
     },
-    async toEnable(row) {
-      const enable = !row.enable;
-      await ableCardRule({
-        id: row.id,
-        enable
-      });
-      row.enable = enable;
+    toEnable(row) {
+      const action = row.enable ? "禁用" : "启用";
+
+      this.$confirm(`确定要${action}题卡规则【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableCardRule({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
     }
   }
 };

+ 1 - 1
src/modules/base/views/CourseManage.vue

@@ -121,7 +121,7 @@ export default {
       this.$refs.ModifyCourse.open();
     },
     toDelete(row) {
-      this.$confirm("确定要删除当前课程吗?", "提示", {
+      this.$confirm(`确定要删除课程【${row.name}】吗?`, "提示", {
         cancelButtonClass: "el-button--danger is-plain",
         confirmButtonClass: "el-button--primary",
         type: "warning"

+ 1 - 1
src/modules/base/views/MenuManage.vue

@@ -114,7 +114,7 @@ export default {
       this.curMenu = {
         parentId: data.id,
         parentName: data.name,
-        sortNum: node.parent.childNodes.length + 1
+        sortNumber: node.parent.childNodes.length + 1
       };
       this.$refs.ModifyMenu.open();
     }

+ 41 - 24
src/modules/base/views/RoleManage.vue

@@ -20,7 +20,7 @@
             <el-option
               v-for="(val, key) in ABLE_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></el-option>
           </el-select>
@@ -49,7 +49,7 @@
         <el-table-column prop="name" label="角色名称"></el-table-column>
         <el-table-column prop="type" label="角色类型">
           <template slot-scope="scope">
-            {{ scope.row.type | roleTypeFilter }}
+            {{ ROLE_TYPE[scope.row.type] || "--" }}
           </template>
         </el-table-column>
         <el-table-column prop="enable" label="启用/禁用">
@@ -114,14 +114,16 @@
       ref="ModifyRole"
       :instance="curRole"
       :menus="menus"
+      :role-types="ROLE_TYPE"
       @modified="getList"
     ></modify-role>
   </div>
 </template>
 
 <script>
-import { ABLE_TYPE, TEMPLATE_TYPE } from "@/constants/enumerate";
+import { ABLE_TYPE } from "@/constants/enumerate";
 import { menuList, roleListPage, ableRole, deleteRole } from "../api";
+import { getEnums } from "../../login/api";
 import ModifyRole from "../components/ModifyRole";
 
 export default {
@@ -129,15 +131,6 @@ export default {
   components: {
     ModifyRole
   },
-  props: {
-    templateType: {
-      type: String,
-      default: "GENERIC",
-      validator(val) {
-        return Object.keys(TEMPLATE_TYPE).indexOf(val) !== -1;
-      }
-    }
-  },
   data() {
     return {
       filter: {
@@ -150,25 +143,38 @@ export default {
       roles: [],
       curRole: {},
       ABLE_TYPE,
-      // menus: [],
+      ROLE_TYPE: {},
       menus: []
     };
   },
   created() {
-    this.getList();
-    this.getMenus();
+    this.init();
   },
   methods: {
+    async init() {
+      await this.getRoleTypes();
+      await this.getList();
+      await this.getMenus();
+    },
     async getMenus() {
       this.menus = await menuList();
     },
+    async getRoleTypes() {
+      const data = await getEnums("ROLE_TYPE");
+      let ROLE_TYPE = {};
+      data.forEach(element => {
+        ROLE_TYPE[element.name] = element.desc;
+      });
+      this.ROLE_TYPE = ROLE_TYPE;
+    },
     async getList() {
       const datas = {
         ...this.filter,
         pageNumber: this.current,
         pageSize: this.size
       };
-      datas.enable = !!datas.enable;
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
       const data = await roleListPage(datas);
       this.roles = data.records;
       this.total = data.total;
@@ -186,7 +192,7 @@ export default {
       this.$refs.ModifyRole.open();
     },
     toDelete(row) {
-      this.$confirm("确定要删除当前角色吗?", "提示", {
+      this.$confirm(`确定要删除角色【${row.name}】吗?`, "提示", {
         cancelButtonClass: "el-button--danger is-plain",
         confirmButtonClass: "el-button--primary",
         type: "warning"
@@ -198,13 +204,24 @@ export default {
         })
         .catch(() => {});
     },
-    async toEnable(row) {
-      const enable = !row.enable;
-      await ableRole({
-        id: row.id,
-        enable
-      });
-      row.enable = enable;
+    toEnable(row) {
+      const action = row.enable ? "禁用" : "启用";
+
+      this.$confirm(`确定要${action}角色【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableRole({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
     }
   }
 };

+ 78 - 16
src/modules/base/views/TemplateManage.vue

@@ -11,12 +11,24 @@
           ></el-input>
         </el-form-item>
         <el-form-item label="创建时间:">
-          <el-date-picker
+          <!-- <el-date-picker
             v-model="filter.createTime"
             type="date"
             value-format="timestamp"
             placeholder="选择日期时间"
           >
+          </el-date-picker> -->
+          <el-date-picker
+            v-model="createTime"
+            type="datetimerange"
+            :picker-options="pickerOptions"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="timestamp"
+            align="right"
+            unlink-panels
+          >
           </el-date-picker>
         </el-form-item>
         <el-form-item label="启用/禁用:" label-width="90px">
@@ -29,7 +41,7 @@
             <el-option
               v-for="(val, key) in ABLE_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></el-option>
           </el-select>
@@ -163,7 +175,8 @@ export default {
       filter: {
         enable: null,
         name: "",
-        createTime: null
+        startTime: "",
+        endTime: ""
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -171,7 +184,40 @@ export default {
       templates: [],
       curTemplate: {},
       editType: "ADD",
-      ABLE_TYPE
+      ABLE_TYPE,
+      // date-picker
+      createTime: [],
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", [start, end]);
+            }
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            }
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            }
+          }
+        ]
+      }
     };
   },
   created() {
@@ -181,11 +227,16 @@ export default {
     async getList() {
       const datas = {
         ...this.filter,
-        templateType: this.templateType,
+        type: this.templateType,
         pageNumber: this.current,
         pageSize: this.size
       };
-      datas.enable = !!datas.enable;
+      if (this.createTime) {
+        datas.startTime = this.createTime[0];
+        datas.endTime = this.createTime[1];
+      }
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
       const data = await templateListPage(datas);
       this.templates = data.records;
       this.total = data.total;
@@ -195,27 +246,38 @@ export default {
       this.getList();
     },
     toAdd() {
-      this.curTemplate = { templateType: this.templateType };
+      this.curTemplate = { type: this.templateType };
       this.editType = "ADD";
       this.$refs.ModifyTemplate.open();
     },
     toEdit(row) {
-      this.curTemplate = { ...row, templateType: this.templateType };
+      this.curTemplate = { ...row, type: this.templateType };
       this.editType = "EDIT";
       this.$refs.ModifyTemplate.open();
     },
     toDetail(row) {
-      this.curTemplate = { ...row, templateType: this.templateType };
+      this.curTemplate = { ...row, type: this.templateType };
       this.editType = "PREVIEW";
       this.$refs.ModifyTemplate.open();
     },
-    async toEnable(row) {
-      const enable = !row.enable;
-      await ableTemplate({
-        id: row.id,
-        enable
-      });
-      row.enable = enable;
+    toEnable(row) {
+      const action = row.enable ? "禁用" : "启用";
+
+      this.$confirm(`确定要${action}模板【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableTemplate({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
     }
   }
 };

+ 34 - 23
src/modules/base/views/UserManage.vue

@@ -2,10 +2,10 @@
   <div class="user-manage">
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <el-form-item label="用户名:" label-width="75px">
+        <el-form-item label="名:" label-width="75px">
           <el-input
             style="width: 142px;"
-            v-model.trim="filter.loginName"
+            v-model.trim="filter.realName"
             placeholder="请输入内容"
             clearable
           ></el-input>
@@ -15,6 +15,7 @@
             v-model="filter.roleId"
             style="width: 142px;"
             placeholder="请选择"
+            filterable
             clearable
           >
             <el-option
@@ -25,7 +26,7 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="状态:" label-width="55px">
+        <el-form-item label="启用/禁用:" label-width="90px">
           <el-select
             v-model="filter.enable"
             style="width: 142px;"
@@ -35,7 +36,7 @@
             <el-option
               v-for="(val, key) in ABLE_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></el-option>
           </el-select>
@@ -156,7 +157,7 @@
 import UploadButton from "@/components/UploadButton";
 import ModifyUser from "../components/ModifyUser";
 import { ABLE_TYPE } from "@/constants/enumerate";
-import { userListPage, ableUser, updatePwd, roleListPage } from "../api";
+import { userListPage, ableUser, resetPwd, roleListPage } from "../api";
 import { logout } from "@/modules/login/api";
 
 export default {
@@ -164,9 +165,8 @@ export default {
   components: { UploadButton, ModifyUser },
   data() {
     return {
-      isInit: false,
       filter: {
-        loginName: "",
+        realName: "",
         roleId: "",
         enable: ""
       },
@@ -202,7 +202,8 @@ export default {
         pageNumber: this.current,
         pageSize: this.size
       };
-      datas.enable = !!datas.enable;
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
       const data = await userListPage(datas);
       this.users = data.records;
       this.total = data.total;
@@ -211,20 +212,37 @@ export default {
       this.current = page;
       this.getList();
     },
-    async toEnable(row) {
-      const enable = !row.enable;
-      await ableUser({
-        id: row.id,
-        enable
-      });
-      row.enable = enable;
+    toEnable(row) {
+      // 自己不可以启用/禁用自己
+      const userId = this.$ls.get("user", { id: "" }).id;
+      if (row.id === userId) {
+        this.$message.error("不可以启用/禁用自己!");
+        return;
+      }
+
+      const action = row.enable ? "禁用" : "启用";
+      this.$confirm(`确定要${action}用户【${row.realName}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableUser({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
     },
     toEdit(row) {
       this.curUser = row;
       this.$refs.ModifyUser.open();
     },
     async toResetPwd(row) {
-      await updatePwd(row.id);
+      await resetPwd(row.id);
       this.$message.success("密码重置成功!");
 
       // 修改自己时,会强制重新登录
@@ -245,13 +263,6 @@ export default {
       this.$message.success("上传成功!");
       this.getList();
     }
-  },
-  activated() {
-    if (this.isInit) {
-      this.toPage(this.current);
-    } else {
-      this.isInit = true;
-    }
   }
 };
 </script>

+ 3 - 2
src/modules/exam/views/ExamTaskManage.vue

@@ -65,7 +65,7 @@
             <el-option
               v-for="(val, key) in ABLE_TYPE"
               :key="key"
-              :value="key"
+              :value="key * 1"
               :label="val"
             ></el-option>
           </el-select>
@@ -272,7 +272,8 @@ export default {
         pageNumber: this.current,
         pageSize: this.size
       };
-      datas.enable = !!datas.enable;
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
       if (this.createTime) {
         datas.startTime = this.createTime[0];
         datas.endTime = this.createTime[1];

+ 4 - 4
src/modules/login/api.js

@@ -3,14 +3,14 @@ import { $post, $get } from "@/plugins/axios";
 export const login = datas => {
   return $post("/api/common/login", datas);
 };
-export const getSmsCode = datas => {
-  return $post("/api/print/basic/user/getVerifyCode", datas);
+export const getSmsCode = mobileNumber => {
+  return $post("/api/common/get_verify_code", { mobileNumber });
 };
 export const logout = userId => {
-  return $get("/api/print/basic/sys/logout", { userId });
+  return $post("/api/common/logout", { userId });
 };
 export const sysMenu = () => {
-  return $get("/api/print/basic/sys/getMenu", {});
+  return $get("/api/common/get_menu", {});
 };
 export const attachmentPreview = id => {
   return $get("/api/common/file/get_one", { id });

+ 4 - 8
src/modules/login/views/Login.vue

@@ -140,15 +140,11 @@ export default {
       this.isSubmit = false;
       if (!data) return;
 
-      data.account.roleIds = data.account.roles
-        .map(item => item.roleIds)
-        .join();
-
-      this.$ls.set("schoolId", data.account.schoolId, this.GLOBAL.authTimeout);
-      this.$ls.set("user", data.account, this.GLOBAL.authTimeout);
+      this.$ls.set("schoolId", data.user.schoolId, this.GLOBAL.authTimeout);
+      this.$ls.set("user", data.user, this.GLOBAL.authTimeout);
 
       // if (
-      //   data.account.roleCode.includes("QUESTION_TEACHER") &&
+      //   data.user.roleCode.includes("QUESTION_TEACHER") &&
       //   !data.account.pwChangedCount
       // ) {
       //   this.$refs.ResetPwd.open();
@@ -156,7 +152,7 @@ export default {
       // }
 
       this.$ls.set("token", data.token, this.GLOBAL.authTimeout);
-      this.$store.commit("setUser", data.account);
+      this.$store.commit("setUser", data.user);
       this.$router.push({
         name: "Home"
       });

+ 2 - 2
src/plugins/axios.js

@@ -46,7 +46,7 @@ const errorDataCallback = error => {
   let message = error.message || "数据错误";
   message = message.indexOf("###") !== -1 ? "参数错误" : message;
 
-  if (error.code === "106") {
+  if (error.code === 106) {
     if (unauthMsgBoxIsShow) return error;
     unauthMsgBoxIsShow = true;
     message = "身份验证失效,请重新登录";
@@ -83,7 +83,7 @@ const errorDataCallback = error => {
  * @param {Object} data Response中的data信息
  */
 const successCallback = data => {
-  if (data.code === "200") {
+  if (data.code === 200) {
     return data.data;
   } else {
     throw new Error(errorDataCallback(data));

+ 7 - 6
src/plugins/crypto.js

@@ -1,14 +1,15 @@
 const CryptoJS = require("crypto-js");
 
 export const AES = content => {
-  const key = CryptoJS.enc.Utf8.parse("1234567890123456");
+  return content;
+  // const key = CryptoJS.enc.Utf8.parse("1234567890123456");
 
-  const enstr = CryptoJS.AES.encrypt(content + "", key, {
-    mode: CryptoJS.mode.ECB,
-    padding: CryptoJS.pad.Pkcs7
-  }).toString();
+  // const enstr = CryptoJS.AES.encrypt(content + "", key, {
+  //   mode: CryptoJS.mode.ECB,
+  //   padding: CryptoJS.pad.Pkcs7
+  // }).toString();
 
-  return enstr;
+  // return enstr;
 };
 
 /**

+ 0 - 4
src/plugins/filters.js

@@ -5,7 +5,6 @@ import {
   AUDITING_STATUS,
   AUDITING_RESULT,
   PRINT_PLAN_STATUS,
-  ROLE_TYPE,
   PRINT_STATUS
 } from "../constants/enumerate";
 import { formatDate } from "../plugins/utils";
@@ -39,9 +38,6 @@ Vue.filter("reviewStatusFilter", function(val) {
 Vue.filter("printPlanStatusFilter", function(val) {
   return PRINT_PLAN_STATUS[val] || DEFAULT_FIELD;
 });
-Vue.filter("roleTypeFilter", function(val) {
-  return ROLE_TYPE[val] || DEFAULT_FIELD;
-});
 Vue.filter("printStatusFilter", function(val) {
   return PRINT_STATUS[val] || DEFAULT_FIELD;
 });

+ 1 - 4
src/views/Home.vue

@@ -102,10 +102,7 @@
 
         <!-- home-view: page detail -->
         <div class="home-view">
-          <!-- <router-view /> -->
-          <keep-alive>
-            <router-view />
-          </keep-alive>
+          <router-view />
         </div>
       </div>
     </div>