zhangjie il y a 3 ans
Parent
commit
1ac2144cd8

BIN
public/favicon.ico


+ 2 - 1
src/components/base/ExamSelect.vue

@@ -25,7 +25,7 @@ export default {
   name: "exam-select",
   props: {
     disabled: { type: Boolean, default: false },
-    placeholder: { type: String, default: "请选择考试" },
+    placeholder: { type: String, default: "请选择考试类型" },
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
     semesterId: { type: String, default: "" }
@@ -56,6 +56,7 @@ export default {
   },
   methods: {
     async search() {
+      if (!this.semesterId) return;
       this.optionList = [];
 
       const res = await examQuery({

+ 16 - 2
src/components/base/SchoolSelect.vue

@@ -25,9 +25,13 @@ export default {
   name: "school-select",
   props: {
     disabled: { type: Boolean, default: false },
-    placeholder: { type: String, default: "请选择" },
+    placeholder: { type: String, default: "请选择学校" },
     value: { type: [Number, String], default: "" },
-    clearable: { type: Boolean, default: true }
+    clearable: { type: Boolean, default: true },
+    selectDefault: {
+      type: Boolean,
+      default: false
+    }
   },
   data() {
     return {
@@ -50,6 +54,10 @@ export default {
     async search() {
       const res = await schoolList();
       this.optionList = res;
+
+      if (this.selectDefault) {
+        this.emitDefault();
+      }
     },
     select() {
       this.$emit("input", this.selected);
@@ -57,6 +65,12 @@ export default {
         "change",
         this.optionList.find(item => item.id === this.selected)
       );
+    },
+    emitDefault() {
+      if (!this.optionList.length) return;
+
+      this.selected = this.optionList[0].id;
+      this.select();
     }
   }
 };

+ 6 - 4
src/components/base/SemesterSelect.vue

@@ -19,7 +19,7 @@
 </template>
 
 <script>
-import { unitQueryByType } from "../../modules/base/api";
+import { semesterQuery } from "../../modules/base/api";
 
 export default {
   name: "semester-select",
@@ -27,7 +27,8 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择学期" },
     value: { type: [Number, String], default: "" },
-    clearable: { type: Boolean, default: true }
+    clearable: { type: Boolean, default: true },
+    schoolId: { type: String, default: "" }
   },
   data() {
     return {
@@ -55,9 +56,10 @@ export default {
   },
   methods: {
     async search() {
-      this.optionList = [];
+      if (!this.schoolId) return;
 
-      const res = await unitQueryByType({}, "SEMESTER");
+      this.optionList = [];
+      const res = await semesterQuery({ schoolId: this.schoolId });
       this.optionList = res;
     },
     select() {

+ 0 - 211
src/constants/enumerate.js

@@ -25,220 +25,9 @@ export const AUDITING_RESULT = {
   NOT_PASS: "未通过",
   PASS: "通过"
 };
-export const TASK_AUDIT_RESULT = {
-  REJECT: "驳回",
-  PASS: "通过"
-};
 
 // 权限类型
 export const PRIVILEGE_TYPE = {
   MENU: "菜单",
   URL: "操作"
 };
-
-// 基础 -------------->
-// 机构
-export const ORG_TYPE = {
-  COLLEGE: "学院",
-  FACULTY: "院系",
-  TEACHING_ROOM: "教研室",
-  PRINTING_HOUSE: "印刷室"
-};
-// 角色
-export const ROLE_TYPE = {
-  SCHOOL_ADMIN: "管理员",
-  EXAM_TEACHER: "考务老师",
-  QUESTION_TEACHER: "命题老师",
-  CUSTOMER: "客服人员",
-  PRINT: "印刷人员",
-  CUSTOM: "自定义"
-};
-
-export const SMS_TYPE = {
-  SCHOOL_ADMIN: "管理员",
-  EXAM_TEACHER: "考务老师"
-};
-
-// 通用题卡规则id
-export const COMMON_CARD_RULE_ID = "-1";
-
-export const CARD_CREATE_METHOD_TYPE = {
-  UPLOAD: "上传文件",
-  STANDARD: "标准模式",
-  FREE: "自由模式"
-};
-export const CARD_TYPE = {
-  GENERIC: "通卡",
-  CUSTOM: "自定义专卡"
-};
-
-// 模板类型
-export const TEMPLATE_TYPE = {
-  GENERIC: "通卡模板",
-  VARIABLE: "变量印品模板",
-  ORDINARY: "普通印品模板"
-};
-
-// 提交印刷方式
-export const CONFIRM_PRINT_TYPE = {
-  MANUAL: "手动",
-  AUTO: "自动"
-};
-
-// 印刷计划推送状态
-export const SYNC_PRINT_STATUS = {
-  INIT: "未开始",
-  START_SYNC: "同步中", // 开始同步
-  EXAM_FINISH: "同步中", // 考试同步成功
-  STUDENT_FINISH: "同步中", // 考生同步成功
-  FINISH: "已结束"
-};
-
-// 考试
-export const EXAM_TYPE = {
-  OFFLINE: "线下考试",
-  ONLINE: "线上考试"
-};
-
-export const EXAM_MODE_TYPE = {
-  MODEL1: "模式1:电子交卷环节需要提交考务数据",
-  MODEL2: "模式2:电子交卷环节不需要提交考务数据,只输入印刷份数即可",
-  MODEL3: "模式3:电子交卷环节不需要提交考务数据"
-};
-
-export const FLOW_TYPE = {
-  ELECTRON_FLOW: "电子交卷审核"
-  // QUESTION_ELECTRON_FLOW: "题库试题提交审核",
-  // PAPER_ELECTRON_FLOW: "题库试卷审核"
-};
-export const FLOW_MODEL_TYPE = {
-  USER_FIXED: "管理员指定",
-  APPROVE_SET: "发起人自选"
-};
-
-export const FLOW_APPROVE_OPERATION_TYPE = {
-  SUBMIT: "提交",
-  APPROVE: "审批",
-  EXCHANGE: "转他人审批",
-  REJECT: "驳回",
-  END: "终止"
-};
-
-// 命题 -------------->
-// 待办任务警告时间
-export const TASK_WARNING_TIME = 3 * 24 * 60 * 60 * 1000;
-
-// 题卡
-// 条码类型
-export const EXAM_NUMBER_STYLE = {
-  PRINT: "印刷条码",
-  PASTE: "粘贴条码",
-  FILL: "考号填涂"
-};
-// 试卷类型方式
-export const PAPER_TYPE = {
-  PRINT: "印刷"
-  // FILL: "填涂"
-};
-
-// 命题任务状态
-export const EXAM_TASK_STATUS = {
-  DRAFT: "新建",
-  STAGE: "待命题",
-  AUDITING: "审核中",
-  REJECT: "驳回",
-  FINISH: "已完成"
-};
-
-// 题卡创建方式
-export const CARD_SOURCE_TYPE = {
-  SELECT: "选择已有答题卡",
-  SELF: "自助创建",
-  CUST: "申请客服制卡"
-};
-
-// 模板类型
-export const TEMPLATE_CLASSIFY = {
-  SIGN: "签到表",
-  PACKAGE: "卷袋贴",
-  CHECK_IN: "考试情况登记表"
-};
-
-// 数据管理
-export const DATA_TASK_STATUS = {
-  INIT: "未开始",
-  RUNNING: "进行中",
-  FINISH: "已完成"
-};
-export const DATA_TASK_TYPE = {
-  QUESTION_MISSION_BATCH_CREATE: "批量新建命题任务",
-  SAMPLE_EXPORT: "导出审核样本",
-  EXAMINATION_IMPORT: "考务数据导入",
-  EXAMINATION_EXPORT: "考务数据导出",
-  PRINT_PDF_DOWNLOAD: "批量下载pdf",
-  CREATE_PDF: "生成pdf",
-  USER_IMPORT: "用户导入",
-  STUDENT_IMPORT: "学生导入",
-  COURSE_IMPORT: "课程导入",
-  PAPER_AND_CARD_PDF_DOWNLOAD: "卷库查询管理试卷、空白题卡批量下载pdf",
-  STATISTICS_IMPORT: "命题统计导入",
-  SCORE_EXPORT: "成绩导出",
-  SCORE_DOWNLOAD: "成绩轨迹下载"
-};
-export const DATA_TASK_RESULT = {
-  SUCCESS: "成功",
-  ERROR: "失败"
-};
-
-// 印刷 -------------->
-// 印刷计划状态
-export const PRINT_PLAN_STATUS = {
-  NEW: "新建",
-  READY: "就绪",
-  PRINTING: "印刷中",
-  PRINT_FINISH: "印刷完成",
-  END: "已结束"
-};
-// 印刷计划相关
-export const DRAW_RULE_TYPE = {
-  ONE: "只抽取一次",
-  CIRCLE: "可反复抽取"
-};
-export const PRINT_BACKUP_TYPE = {
-  ROOM: "每考场"
-  // STUDENT: "每考生"
-};
-export const PAPER_BACKUP_TYPE = {
-  ROOM: "每考场"
-  // PLACE: "每考点"
-};
-export const PRINT_CONTENT_TYPE = {
-  PAPER: "试卷",
-  CARD: "题卡"
-};
-
-// 印刷任务状态
-export const PRINT_TASK_STATUS = {
-  NEW: "新建",
-  READY: "就绪",
-  WAITING: "待印刷",
-  PRINTING: "印刷中",
-  FINISH: "已完成"
-};
-// pdf文件类型
-export const PRINT_PDF_TYPE = {
-  ALL_A3: "试卷题卡合并文件",
-  CARD_A3: "题卡合并文件"
-};
-
-// stmms
-export const MARK_TASK_SYNC_STATUS = {
-  INIT: "未同步",
-  FINISH: "已同步"
-};
-export const STMMS_SYNC_TYPE = {
-  USER_PUSH: "用户推送",
-  EXAM_PUSH: "考试、考生、题卡推送",
-  STRUCTURE_PUSH: "试卷结构推送",
-  SCORE_PUSH: "成绩推送"
-};

+ 2 - 2
src/constants/menus-data.js

@@ -3,14 +3,14 @@ export default [
     id: "1",
     parentId: "-1",
     name: "数据对接",
-    url: "exam",
+    url: "data",
     type: "MENU"
   },
   {
     id: "2",
     parentId: "1",
     name: "考务数据对接",
-    url: "work",
+    url: "business",
     type: "MENU"
   },
   {

+ 10 - 0
src/constants/privilege.js

@@ -0,0 +1,10 @@
+export default {
+  ADMIN: ["data", "business", "UserManage"],
+  IMPLEMENT: [
+    "data",
+    "business",
+    "TimeTaskManage",
+    "BusinessDataManage",
+    "DownloadManage"
+  ]
+};

+ 22 - 35
src/modules/base/api.js

@@ -1,50 +1,37 @@
 import { $postParam, $post } from "@/plugins/axios";
 
-export const questionTeatherUserQuery = ({ courseCode, param }) => {
-  return $postParam("/api/admin/sys/user/user_list", { courseCode, param });
-};
-export const unitQueryByType = (datas, dictionaryEnum) => {
-  // dictionaryEnum: SEMESTER("学期"),COLLEGE("学院"),MAJOR("专业"),CLAZZ("班级"),STUDENT("学生")
-  return $postParam("/api/admin/common/get_dictionary", {
-    ...datas,
-    dictionaryEnum
-  });
-};
-export const enumsByType = type => {
-  // type: PUSH_TYPE_ENUM("同步类型"),
-  return $postParam("/api/admin/common/get_enums", {
-    type
-  });
+export const semesterQuery = datas => {
+  return $postParam("/api/exam_semester/list", datas);
 };
-
-// exam-manage
 export const examQuery = datas => {
-  return $postParam("/api/admin/basic/exam/query", datas);
+  return $postParam("/api/exam_type/list", datas);
 };
 
 // user --------------------------------->
 // user-manage
 export const userListPage = datas => {
-  return $postParam("/api/admin/sys/user/list", datas);
+  return $postParam("/api/sys_user/page", datas);
 };
 export const updateUser = datas => {
-  return $post("/api/admin/sys/user/save", datas);
+  return $post("/api/sys_user/save", datas);
 };
 export const ableUser = ({ id, enable }) => {
-  return $post("/api/admin/sys/user/enable", { id, enable });
+  return $post("/api/sys_user/enable", { id, enable });
 };
 export const resetPwd = id => {
-  return $post("/api/admin/sys/user/reset_password", { id });
+  return $post("/api/sys_user/reset_password", { id });
+};
+export const userRoleListPage = () => {
+  return $postParam("/api/sys_role/list", {});
 };
+
 export const updatePwd = datas => {
   return $post("/api/admin/sys/user/update_password", datas);
 };
 export const userBindRoles = ({ id, roleIds }) => {
   return $post("/api/admin/sys/user/bind_roles", { id, roleIds });
 };
-export const userRoleListPage = () => {
-  return $postParam("/api/admin/sys/role/list_to_user", {});
-};
+
 export const syncUserToEcs = () => {
   return $postParam("/api/admin/sys/user/push", {});
 };
@@ -105,28 +92,28 @@ export const deleteOrganization = id => {
 // setting --------------------------------->
 // time-task
 export const timeTaskList = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+  return $postParam("/api/exam_schedule_task/page", datas);
 };
 export const updateTimeTask = datas => {
-  return $post("/api/admin/sys/org/save", datas);
-};
-export const ableTimeTask = ({ id, enable }) => {
-  return $post("/api/admin/sys/org/enable", { id, enable });
+  return $post("/api/exam_schedule_task/save", datas);
 };
 
 // business-data
 export const businessDataList = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+  return $postParam("/api/exam_sync_total/page", datas);
 };
-export const downloadBusinessData = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+export const downloadBusinessData = id => {
+  return $postParam("/api/exam_sync_total/download", { id });
+};
+export const useSceneList = datas => {
+  return $postParam("/api/exam_download_record/list_use_scene", datas);
 };
 // download-manage
 export const downloadList = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+  return $postParam("/api/exam_download_record/page", datas);
 };
 export const signPurpose = datas => {
-  return $postParam("/api/admin/sys/org/list", datas);
+  return $postParam("/api/exam_download_record/used", datas);
 };
 
 // common

+ 23 - 5
src/modules/base/components/ModifyTask.vue

@@ -3,7 +3,7 @@
     class="modify-template"
     :visible.sync="modalIsShow"
     :title="title"
-    top="10px"
+    top="10vh"
     width="600px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
@@ -18,8 +18,11 @@
     >
       <el-form-item prop="schoolId" label="学校:">
         <school-select
+          ref="SchoolSelect"
           v-model="modalForm.schoolId"
           class="width-400"
+          select-default
+          @change="schoolChange"
         ></school-select>
       </el-form-item>
       <el-form-item prop="semesterId" label="学期:">
@@ -27,13 +30,15 @@
           v-model="modalForm.semesterId"
           class="width-400"
           :school-id="modalForm.schoolId"
+          @change="semesterChange"
         ></semester-select>
       </el-form-item>
-      <el-form-item prop="examId" label="考试:">
+      <el-form-item prop="examTypeId" label="考试类型:">
         <exam-select
-          v-model="modalForm.examId"
+          v-model="modalForm.examTypeId"
           class="width-400"
           :semester-id="modalForm.semesterId"
+          @change="examTypeChange"
         ></exam-select>
       </el-form-item>
       <el-form-item prop="startTime" label="定时任务时间:">
@@ -69,8 +74,11 @@ import pickerOptions from "@/constants/datePickerOptions";
 const initModalForm = {
   id: null,
   schoolId: null,
+  schoolName: null,
   semesterId: null,
-  examId: null,
+  semesterName: null,
+  examTypeId: null,
+  examTypeName: null,
   startTime: "",
   endTime: ""
 };
@@ -115,7 +123,7 @@ export default {
             trigger: "change"
           }
         ],
-        examId: [
+        examTypeId: [
           {
             required: true,
             message: "请选择考试",
@@ -140,6 +148,7 @@ export default {
       } else {
         this.modalForm = { ...initModalForm };
         this.createTime = [];
+        this.$refs.SchoolSelect && this.$refs.SchoolSelect.emitDefault();
       }
     },
     visibleChange() {
@@ -158,6 +167,15 @@ export default {
         this.modalForm.endTime = "";
       }
     },
+    schoolChange(val) {
+      this.modalForm.schoolName = val.name;
+    },
+    semesterChange(val) {
+      this.modalForm.semesterName = val.name;
+    },
+    examTypeChange(val) {
+      this.modalForm.examTypeName = val.name;
+    },
     cancel() {
       this.modalIsShow = false;
     },

+ 11 - 14
src/modules/base/components/ModifyUser.vue

@@ -37,12 +37,11 @@
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item prop="roleIds" label="角色:">
+      <el-form-item prop="roleId" label="角色:">
         <el-select
           style="width:100%;"
-          v-model="modalForm.roleIds"
+          v-model="modalForm.roleId"
           placeholder="请选择角色"
-          multiple
         >
           <el-option
             v-for="item in roles"
@@ -84,7 +83,7 @@ const initModalForm = {
   realName: "",
   password: "",
   mobileNumber: "",
-  roleIds: [],
+  roleId: "",
   enable: 1
 };
 
@@ -113,13 +112,6 @@ export default {
     }
   },
   data() {
-    const roleIdsValidator = (rule, value, callback) => {
-      if (!value || !value.length) {
-        callback(new Error("请选择角色"));
-      } else {
-        callback();
-      }
-    };
     const mobileNumberValidator = (rule, value, callback) => {
       if (/^1\d{10}$/.test(value)) {
         return callback();
@@ -153,10 +145,10 @@ export default {
             trigger: "change"
           }
         ],
-        roleIds: [
+        roleId: [
           {
             required: true,
-            validator: roleIdsValidator,
+            message: "请选择角色",
             trigger: "change"
           }
         ],
@@ -170,9 +162,12 @@ export default {
     initData(val) {
       if (val.id) {
         this.modalForm = this.$objAssign(initModalForm, val);
-        this.modalForm.roleIds = val.roles.map(item => item.id);
+        this.modalForm.enable = val.enable ? 1 : 0;
       } else {
         this.modalForm = { ...initModalForm };
+        const defRole = this.roles.find(item => item.type === "IMPLEMENT");
+        this.modalForm.roleId = defRole ? defRole.id : null;
+
         this.$nextTick(() => {
           this.$refs.modalFormComp.clearValidate();
         });
@@ -195,6 +190,8 @@ export default {
       this.isSubmit = true;
 
       const datas = { ...this.modalForm };
+      datas.enable = !!datas.enable;
+      datas.loginName = datas.mobileNumber;
       const data = await updateUser(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 22 - 12
src/modules/base/components/SignDownloadData.vue

@@ -14,7 +14,7 @@
       ref="modalFormComp"
       :model="modalForm"
       :rules="rules"
-      label-width="70px"
+      label-width="100px"
     >
       <el-form-item prop="used" label="是否使用:">
         <el-radio-group v-model="modalForm.used">
@@ -26,13 +26,17 @@
           >
         </el-radio-group>
       </el-form-item>
-      <el-form-item label="下载用途:">
-        <el-select v-model="modalForm.useType" placeholder="下载用途" clearable>
+      <el-form-item prop="useScene" label="下载用途:">
+        <el-select
+          v-model="modalForm.useScene"
+          placeholder="下载用途"
+          clearable
+        >
           <el-option
-            v-for="(val, key) in USE_TYPE"
-            :key="key"
-            :value="key"
-            :label="val"
+            v-for="item in useScenes"
+            :key="item.name"
+            :value="item.name"
+            :label="item.desc"
           ></el-option>
         </el-select>
       </el-form-item>
@@ -47,12 +51,12 @@
 </template>
 
 <script>
-import { USE_TYPE, BOOLEAN_TYPE } from "../../../constants/enumerate";
+import { BOOLEAN_TYPE } from "../../../constants/enumerate";
 import { signPurpose } from "../api";
 
 const initModalForm = {
   used: 1,
-  useType: null
+  useScene: ""
 };
 
 export default {
@@ -63,13 +67,18 @@ export default {
       default() {
         return [];
       }
+    },
+    useScenes: {
+      type: Array,
+      default() {
+        return [];
+      }
     }
   },
   data() {
     return {
       modalIsShow: false,
       isSubmit: false,
-      USE_TYPE,
       BOOLEAN_TYPE,
       modalForm: {},
       rules: {
@@ -80,7 +89,7 @@ export default {
             trigger: "change"
           }
         ],
-        useType: [
+        useScene: [
           {
             required: true,
             message: "请选择下载用途",
@@ -107,7 +116,8 @@ export default {
       if (this.isSubmit) return;
       this.isSubmit = true;
 
-      const datas = { ...this.modalForm, ids: this.ids };
+      const datas = { ...this.modalForm, id: this.ids.join() };
+      datas.used = !!datas.used;
       const data = await signPurpose(datas).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 19 - 15
src/modules/base/views/BusinessDataManage.vue

@@ -4,7 +4,7 @@
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <el-form-item label="同步日期:">
           <el-date-picker
-            v-model="filter.syncTime"
+            v-model="filter.syncDate"
             type="date"
             value-format="timestamp"
           >
@@ -27,21 +27,24 @@
 
     <div class="part-box part-box-pad">
       <el-table ref="TableList" :data="dataList">
-        <el-table-column prop="syncTime" label="同步日期">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="syncDate" label="同步日期">
           <span slot-scope="scope">{{
-            scope.row.syncTime | timestampFilter
+            scope.row.syncDate | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column prop="schoolName" label="学校" width="80">
-        </el-table-column>
-        <el-table-column prop="totalSubjects" label="学期" width="80">
-        </el-table-column>
-        <el-table-column prop="totalPackages" label="考试类型" width="100">
-        </el-table-column>
-        <el-table-column prop="createName" label="学院数量"></el-table-column>
-        <el-table-column prop="createName" label="科目门数"></el-table-column>
-        <el-table-column prop="createName" label="考试科次"></el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="120px">
+        <el-table-column prop="schoolName" label="学校"></el-table-column>
+        <el-table-column prop="semesterName" label="学期"></el-table-column>
+        <el-table-column prop="examTypeName" label="考试类型"></el-table-column>
+        <el-table-column prop="colleges" label="学院数量"></el-table-column>
+        <el-table-column prop="subjects" label="科目门数"></el-table-column>
+        <el-table-column prop="students" label="考试科次"></el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="100px">
           <template slot-scope="scope">
             <el-button
               class="btn-primary"
@@ -59,6 +62,7 @@
           :current-page="current"
           :total="total"
           :page-size="size"
+          :page-sizes="[20, 50, 100]"
           @current-change="toPage"
         >
         </el-pagination>
@@ -75,7 +79,7 @@ export default {
   data() {
     return {
       filter: {
-        syncTime: ""
+        syncDate: ""
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -85,7 +89,7 @@ export default {
     };
   },
   mounted() {
-    // this.search();
+    this.search();
   },
   methods: {
     async getList() {

+ 49 - 22
src/modules/base/views/DownloadManage.vue

@@ -4,7 +4,7 @@
       <el-form ref="FilterForm" label-position="left" label-width="90px" inline>
         <el-form-item label="下载时间:">
           <el-date-picker
-            v-model="filter.downloadTime"
+            v-model="filter.operateDate"
             type="date"
             placeholder="下载时间"
             value-format="timestamp"
@@ -22,12 +22,12 @@
           </el-select>
         </el-form-item>
         <el-form-item label="下载用途:">
-          <el-select v-model="filter.useType" placeholder="下载用途" clearable>
+          <el-select v-model="filter.useScene" placeholder="下载用途" clearable>
             <el-option
-              v-for="(val, key) in USE_TYPE"
-              :key="key"
-              :value="key"
-              :label="val"
+              v-for="item in useScenes"
+              :key="item.name"
+              :value="item.name"
+              :label="item.desc"
             ></el-option>
           </el-select>
         </el-form-item>
@@ -55,21 +55,33 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="downloadTime" label="下载时间">
+        <el-table-column prop="operateDate" label="下载时间">
           <span slot-scope="scope">{{
-            scope.row.downloadTime | timestampFilter
+            scope.row.operateDate | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column prop="studentCode" label="下载人员"></el-table-column>
-        <el-table-column prop="campusName" label="文件"></el-table-column>
-        <el-table-column prop="collegeName" label="学校"></el-table-column>
-        <el-table-column prop="collegeName" label="学期"></el-table-column>
-        <el-table-column prop="majorName" label="考试类型"></el-table-column>
-        <el-table-column prop="clazz" label="学院数量"></el-table-column>
-        <el-table-column prop="clazz" label="科目门数"></el-table-column>
-        <el-table-column prop="clazz" label="考试科次"></el-table-column>
-        <el-table-column prop="clazz" label="是否使用"></el-table-column>
-        <el-table-column prop="clazz" label="下载使用"></el-table-column>
+        <el-table-column prop="userName" label="下载人员"></el-table-column>
+        <el-table-column prop="fileName" label="文件" min-width="200">
+          <template slot-scope="scope">
+            <div
+              class="cont-link"
+              title="点击下载文件"
+              @click="toDownloadFile(scope.row)"
+            >
+              {{ scope.row.fileName }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="schoolName" label="学校"></el-table-column>
+        <el-table-column prop="semesterName" label="学期"></el-table-column>
+        <el-table-column prop="examTypeName" label="考试类型"></el-table-column>
+        <el-table-column prop="colleges" label="学院数量"></el-table-column>
+        <el-table-column prop="subjects" label="科目门数"></el-table-column>
+        <el-table-column prop="students" label="考试科次"></el-table-column>
+        <el-table-column prop="used" label="是否使用">
+          <span slot-scope="scope">{{ scope.row.used | booleanFilter }}</span>
+        </el-table-column>
+        <el-table-column prop="useSceneStr" label="下载用途"></el-table-column>
       </el-table>
       <div class="part-page">
         <el-pagination
@@ -78,6 +90,7 @@
           :current-page="current"
           :total="total"
           :page-size="size"
+          :page-sizes="[20, 50, 100]"
           @current-change="toPage"
         >
         </el-pagination>
@@ -88,6 +101,7 @@
     <sign-download-data
       ref="SignDownloadData"
       :ids="multipleSelection"
+      :useScenes="useScenes"
       @modified="getList"
     ></sign-download-data>
   </div>
@@ -95,7 +109,7 @@
 
 <script>
 import { USE_TYPE, BOOLEAN_TYPE } from "../../../constants/enumerate";
-import { downloadList } from "../api";
+import { downloadList, useSceneList } from "../api";
 import SignDownloadData from "../components/SignDownloadData.vue";
 
 export default {
@@ -104,14 +118,15 @@ export default {
   data() {
     return {
       filter: {
-        downloadTime: "",
+        operateDate: "",
         used: null,
-        useType: null
+        useScene: null
       },
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
       dataList: [],
+      useScenes: [],
       curRow: {},
       BOOLEAN_TYPE,
       USE_TYPE,
@@ -120,8 +135,13 @@ export default {
   },
   mounted() {
     this.getList();
+    this.getUseSences();
   },
   methods: {
+    async getUseSences() {
+      const res = await useSceneList();
+      this.useScenes = res || [];
+    },
     async getList() {
       const datas = {
         ...this.filter,
@@ -139,7 +159,7 @@ export default {
       this.getList();
     },
     handleSelectionChange(val) {
-      this.multipleSelection = val;
+      this.multipleSelection = val.map(item => item.id);
     },
     toSign() {
       if (!this.multipleSelection.length) {
@@ -147,6 +167,13 @@ export default {
         return;
       }
       this.$refs.SignDownloadData.open();
+    },
+    toDownloadFile(row) {
+      if (!row.filePath) {
+        this.$message.error("文件路径不存在!");
+        return;
+      }
+      window.open(row.filePath);
     }
   }
 };

+ 22 - 21
src/modules/base/views/TimeTaskManage.vue

@@ -1,9 +1,12 @@
 <template>
-  <div class="template-manage">
+  <div class="time-task-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 prop="schoolId" label="学校:">
-          <school-select v-model="filter.schoolId"></school-select>
+          <school-select
+            v-model="filter.schoolId"
+            select-default
+          ></school-select>
         </el-form-item>
         <el-form-item prop="semesterId" label="学期:">
           <semester-select
@@ -11,9 +14,9 @@
             :school-id="filter.schoolId"
           ></semester-select>
         </el-form-item>
-        <el-form-item prop="examId" label="考试:">
+        <el-form-item prop="examTypeId" label="考试:">
           <exam-select
-            v-model="filter.examId"
+            v-model="filter.examTypeId"
             :semester-id="filter.semesterId"
           ></exam-select>
         </el-form-item>
@@ -52,26 +55,26 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="name" label="学校"></el-table-column>
-        <el-table-column prop="name" label="学期"></el-table-column>
-        <el-table-column prop="name" label="考试类型"></el-table-column>
-        <el-table-column prop="createTime" label="定时任务开始时间" width="180">
+        <el-table-column prop="schoolName" label="学校"></el-table-column>
+        <el-table-column prop="semesterName" label="学期"></el-table-column>
+        <el-table-column prop="examTypeName" label="考试类型"></el-table-column>
+        <el-table-column prop="startTime" label="定时任务开始时间" width="180">
           <span slot-scope="scope">{{
             scope.row.startTime | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column prop="createTime" label="定时任务截止时间" width="180">
+        <el-table-column prop="endTime" label="定时任务截止时间" width="180">
           <span slot-scope="scope">{{
             scope.row.endTime | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column prop="operateUser" label="操作人"> </el-table-column>
-        <el-table-column prop="operateTime" label="操作时间">
+        <el-table-column prop="userName" label="操作人"> </el-table-column>
+        <el-table-column prop="createTime" label="操作时间">
           <span slot-scope="scope">{{
-            scope.row.operateTime | timestampFilter
+            scope.row.createTime | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="160">
+        <el-table-column class-name="action-column" label="操作" width="100">
           <template slot-scope="scope">
             <el-button
               class="btn-primary"
@@ -89,6 +92,7 @@
           :current-page="current"
           :total="total"
           :page-size="size"
+          :page-sizes="[20, 50, 100]"
           @current-change="toPage"
         >
         </el-pagination>
@@ -109,16 +113,16 @@ import { timeTaskList } from "../api";
 import ModifyTask from "../components/ModifyTask";
 
 export default {
-  name: "template-manage",
+  name: "time-task-manage",
   components: {
     ModifyTask
   },
   data() {
     return {
       filter: {
-        schoolId: null,
-        semesterId: null,
-        examId: "",
+        schoolId: "",
+        semesterId: "",
+        examTypeId: "",
         startTime: "",
         endTime: ""
       },
@@ -148,10 +152,7 @@ export default {
       }
 
       const data = await timeTaskList(datas);
-      this.dataList = data.records.map(item => {
-        item.orgNames = item.orgs.map(org => org.name);
-        return item;
-      });
+      this.dataList = data.records;
       this.total = data.total;
     },
     toPage(page) {

+ 7 - 11
src/modules/base/views/UserManage.vue

@@ -56,21 +56,16 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="id" label="ID"></el-table-column>
         <el-table-column prop="mobileNumber" label="手机号"></el-table-column>
-        <el-table-column
-          prop="realName"
-          label="姓名"
-          width="120"
-        ></el-table-column>
+        <el-table-column prop="realName" label="姓名"></el-table-column>
         <el-table-column prop="enable" label="状态" width="100">
           <template slot-scope="scope">
             {{ scope.row.enable | enableFilter }}
           </template>
         </el-table-column>
-        <el-table-column prop="enable" label="更新时间" width="100">
+        <el-table-column prop="updateTime" label="更新时间" width="180">
           <template slot-scope="scope">
-            {{ scope.row.enable | timestampFilter }}
+            {{ scope.row.updateTime | timestampFilter }}
           </template>
         </el-table-column>
         <el-table-column class-name="action-column" label="操作" width="200px">
@@ -103,6 +98,7 @@
           :current-page="current"
           :total="total"
           :page-size="size"
+          :page-sizes="[20, 50, 100]"
           @current-change="toPage"
         >
         </el-pagination>
@@ -147,14 +143,14 @@ export default {
     };
   },
   mounted() {
-    // this.getRoleList();
-    // this.getList();
+    this.getRoleList();
+    this.getList();
   },
   methods: {
     async getRoleList() {
       const data = await userRoleListPage();
       this.roles = data || [];
-      this.roles = this.roles.filter(item => item.type !== "ADMIN");
+      // this.roles = this.roles.filter(item => item.type !== "ADMIN");
     },
     async getList() {
       const datas = {

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

@@ -1,7 +1,7 @@
 import { $post, $postParam } from "@/plugins/axios";
 
 export const login = datas => {
-  return $post("/api/admin/common/login", datas);
+  return $post("/api/common/login", datas);
 };
 export const getSmsCode = datas => {
   return $post("/api/admin/common/get_verify_code", datas);
@@ -32,7 +32,7 @@ export const getEnums = type => {
   return $postParam("/api/admin/common/get_enums", { type });
 };
 export const schoolList = () => {
-  return $postParam("/api/admin/common/school/list", {});
+  return $postParam("/api/basic_school/list", {});
 };
 export const getSchoolInfo = code => {
   return $postParam("/api/admin/common/school/query_by_school_code", { code });

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

@@ -49,7 +49,7 @@
 </template>
 
 <script>
-import { password } from "@/plugins/formRules";
+import { password, phone } from "@/plugins/formRules";
 import { login } from "../api";
 import { Base64 } from "@/plugins/crypto";
 import fetchSmsMixins from "../fetchSmsMixins";
@@ -61,18 +61,12 @@ export default {
     return {
       schoolLogo: "",
       loginModel: {
-        loginName: "",
-        password: ""
+        loginName: "19945020704",
+        password: "123456"
       },
       loginRules: {
         password,
-        loginName: [
-          {
-            required: true,
-            message: "请输入用户名",
-            trigger: "change"
-          }
-        ]
+        loginName: phone
       },
       userInfo: {},
       isSubmit: false

+ 2 - 93
src/plugins/filters.js

@@ -1,26 +1,4 @@
 import Vue from "vue";
-import {
-  TEMPLATE_CLASSIFY,
-  EXAM_TASK_STATUS,
-  AUDITING_STATUS,
-  AUDITING_RESULT,
-  PRINT_PLAN_STATUS,
-  PRINT_TASK_STATUS,
-  DATA_TASK_STATUS,
-  DATA_TASK_TYPE,
-  DATA_TASK_RESULT,
-  ORG_TYPE,
-  CARD_SOURCE_TYPE,
-  MARK_TASK_SYNC_STATUS,
-  STMMS_SYNC_TYPE,
-  SYNC_PRINT_STATUS,
-  PRINT_PDF_TYPE,
-  EXAM_TYPE,
-  CARD_TYPE,
-  CARD_CREATE_METHOD_TYPE,
-  FLOW_APPROVE_OPERATION_TYPE,
-  FLOW_TYPE
-} from "../constants/enumerate";
 import { formatDate } from "../plugins/utils";
 
 const DEFAULT_FIELD = "--";
@@ -31,80 +9,11 @@ Vue.filter("defaultFieldFilter", function(val) {
 Vue.filter("enableFilter", function(val) {
   return val ? "启用" : "禁用";
 });
-Vue.filter("templateClassifyFilter", function(val) {
-  return TEMPLATE_CLASSIFY[val] || DEFAULT_FIELD;
-});
-Vue.filter("orgsFilter", function(val) {
-  return val.map(item => item.name).join(",");
-});
-Vue.filter("rolesFilter", function(val) {
-  return val.map(item => item.name).join(",");
-});
-Vue.filter("coursesFilter", function(val) {
-  return val.map(item => `${item.name}(${item.code})`).join(",");
-});
-Vue.filter("examTaskStatusFilter", function(val) {
-  return EXAM_TASK_STATUS[val] || DEFAULT_FIELD;
-});
-Vue.filter("auditStatusFilter", function(val) {
-  return AUDITING_STATUS[val] || DEFAULT_FIELD;
-});
-Vue.filter("reviewStatusFilter", function(val) {
-  return AUDITING_RESULT[val] || DEFAULT_FIELD;
-});
-Vue.filter("printPlanStatusFilter", function(val) {
-  return PRINT_PLAN_STATUS[val] || DEFAULT_FIELD;
-});
-Vue.filter("printTaskStatusFilter", function(val) {
-  return PRINT_TASK_STATUS[val] || DEFAULT_FIELD;
-});
-Vue.filter("dataTaskTypeFilter", function(val) {
-  return DATA_TASK_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("dataTaskStatusFilter", function(val) {
-  return DATA_TASK_STATUS[val] || DEFAULT_FIELD;
-});
-Vue.filter("dataTaskResultFilter", function(val) {
-  return DATA_TASK_RESULT[val] || DEFAULT_FIELD;
-});
-Vue.filter("orgTypeFilter", function(val) {
-  return ORG_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("cardSourceTypeFilter", function(val) {
-  return CARD_SOURCE_TYPE[val] || DEFAULT_FIELD;
+Vue.filter("booleanFilter", function(val) {
+  return val ? "是" : "否";
 });
 Vue.filter("timestampFilter", function(val) {
   return val
     ? formatDate("YYYY-MM-DD HH:mm:ss", new Date(val * 1))
     : DEFAULT_FIELD;
 });
-Vue.filter("flowTaskNameFilter", function(val) {
-  return val ? val.replace(/\(.+?\)/g, "") : DEFAULT_FIELD;
-});
-Vue.filter("markTaskSyncStatusFilter", function(val) {
-  return MARK_TASK_SYNC_STATUS[val] || "失败";
-});
-Vue.filter("stmmsSyncTypeFilter", function(val) {
-  return STMMS_SYNC_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("syncPrintStatusFilter", function(val) {
-  return SYNC_PRINT_STATUS[val] || DEFAULT_FIELD;
-});
-Vue.filter("printPdfTypeFilter", function(val) {
-  return PRINT_PDF_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("examTypeFilter", function(val) {
-  return EXAM_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("cardTypeFilter", function(val) {
-  return CARD_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("cardCreateMethodTypeFilter", function(val) {
-  return CARD_CREATE_METHOD_TYPE[val] || DEFAULT_FIELD;
-});
-Vue.filter("flowApproveOperationTypeFilter", function(val) {
-  return FLOW_APPROVE_OPERATION_TYPE[val] || "";
-});
-Vue.filter("flowTypeFilter", function(val) {
-  return FLOW_TYPE[val] || "";
-});

+ 20 - 5
src/views/Home.vue

@@ -90,17 +90,16 @@
 
 <script>
 import localMenus from "@/constants/menus-data";
+import rolePrivilege from "@/constants/privilege";
 import { logout } from "../modules/login/api";
 import ResetPwd from "../modules/base/components/ResetPwd";
-import { SYS_ADMIN_NAME } from "@/constants/enumerate";
-import { deepCopy } from "../plugins/utils";
 
 export default {
   name: "home",
   components: { ResetPwd },
   data() {
-    const user = this.$ls.get("user", { id: "", realName: "", roleList: [] });
-    const IS_SUPER_ADMIN = user.loginName === SYS_ADMIN_NAME;
+    const user = this.$ls.get("user", { id: "", roleList: [] });
+    const IS_SUPER_ADMIN = user.roleList.includes("ADMIN");
 
     return {
       privileges: [],
@@ -128,7 +127,7 @@ export default {
   },
   methods: {
     initData() {
-      this.privileges = deepCopy(localMenus);
+      this.getPrivileges(localMenus);
       this.menus = this.getMenu();
       if (this.$route.name === "Home") {
         this.toMenu(this.menus[0]);
@@ -148,6 +147,22 @@ export default {
       );
       this.menuChange(curMenu);
     },
+    getPrivileges() {
+      let privsSet = new Set();
+      this.userRoles.forEach(role => {
+        const privInfo = rolePrivilege[role];
+        privInfo.forEach(item => {
+          privsSet.add(item);
+        });
+      });
+
+      const privsList = Array.from(privsSet);
+      this.privileges = localMenus
+        .filter(menu => privsList.includes(menu.url))
+        .map(item => {
+          return { ...item };
+        });
+    },
     transformMenu(list) {
       return list.map(item => {
         return {