Browse Source

字典修改

zhangjie 3 years ago
parent
commit
768687c4d6

BIN
public/temps/classTemplate.xlsx


+ 0 - 0
public/temps/课程导入模板.xlsx → public/temps/courseTemplate.xlsx


+ 0 - 0
public/temps/命题任务导入模板.xlsx → public/temps/examTaskTemplate.xlsx


BIN
public/temps/studentTemplate.xlsx


+ 0 - 0
public/temps/用户导入模板.xlsx → public/temps/userTemplate.xlsx


BIN
public/temps/学生导入模板.xlsx


+ 15 - 0
src/components/MultipleFilterSelect.vue

@@ -0,0 +1,15 @@
+<template>
+  <div class="multiple-filter-select">
+    multiple-filter-select
+  </div>
+</template>
+
+<script>
+export default {
+  name: "multiple-filter-select",
+  data() {
+    return {};
+  },
+  methods: {}
+};
+</script>

+ 5 - 0
src/constants/navs.js

@@ -191,6 +191,11 @@ const navs = [
             name: "课程管理",
             url: "CourseManage",
             isRouter: true
+          },
+          {
+            name: "班级管理",
+            url: "ClazzManage",
+            isRouter: true
           }
         ]
       }

+ 14 - 0
src/modules/base/api.js

@@ -168,6 +168,20 @@ export const updateStudent = datas => {
   return $post("/api/admin/basic/student/save", datas);
 };
 
+// clazz-manage
+export const clazzListQuery = datas => {
+  return $postParam("/api/admin/basic/clazz/query", datas);
+};
+export const deleteClazz = idList => {
+  return $postParam("/api/admin/basic/clazz/delete_batch", { idList });
+};
+export const updateClazz = datas => {
+  return $post("/api/admin/basic/clazz/save", datas);
+};
+export const clazzQuery = () => {
+  return $post("/api/admin/basic/clazz/datasource", {});
+};
+
 // print-plan-push-manage
 export const printPlanPushListQuery = datas => {
   return $postParam("/api/admin/exam/print_sync/list_sync", datas);

+ 136 - 0
src/modules/base/components/ModifyClazz.vue

@@ -0,0 +1,136 @@
+<template>
+  <el-dialog
+    class="modify-clazz"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="448px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      :key="modalForm.id"
+      label-position="top"
+    >
+      <el-form-item prop="clazzName" label="班级名称:">
+        <el-input
+          v-model.trim="modalForm.clazzName"
+          placeholder="请输入班级名称"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="campusId" label="所属校区:">
+        <campus-select
+          v-model.trim="modalForm.campusId"
+          style="width:100%;"
+          clearable
+        ></campus-select>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateClazz } from "../api";
+
+const initModalForm = {
+  id: null,
+  clazzName: "",
+  campusId: ""
+};
+
+export default {
+  name: "modify-clazz",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "班级";
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: { ...initModalForm },
+      rules: {
+        clazzName: [
+          {
+            required: true,
+            message: "请输入班级名称",
+            trigger: "change"
+          },
+          {
+            max: 30,
+            message: "班级名称不能超过30个字",
+            trigger: "change"
+          }
+        ],
+        campusId: [
+          {
+            required: true,
+            message: "请选择所属校区",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      if (val.id) {
+        this.modalForm = this.$objAssign(initModalForm, val);
+      } else {
+        this.modalForm = { ...initModalForm };
+      }
+    },
+    visibleChange() {
+      this.initData(this.instance);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      let datas = { ...this.modalForm };
+      const data = await updateClazz(datas).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 36 - 13
src/modules/base/components/ModifyCourse.vue

@@ -4,7 +4,7 @@
     :visible.sync="modalIsShow"
     :title="title"
     top="10vh"
-    width="448px"
+    width="550px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
@@ -38,14 +38,23 @@
           clearable
         ></teaching-room-select>
       </el-form-item>
-      <el-form-item prop="clazz" label="授课班级:">
-        <el-input
-          v-model.trim="modalForm.clazz"
-          type="textarea"
-          placeholder="请输入授课班级"
+      <el-form-item prop="clazzIdList" label="授课班级:">
+        <el-select
+          v-model="modalForm.clazzIdList"
+          placeholder="请选择授课班级"
+          multiple
+          filterable
           clearable
-        ></el-input>
-        <p class="tips-info">提示:多个班级请用英文逗号分隔</p>
+          style="width:100%;"
+        >
+          <el-option
+            v-for="item in classList"
+            :key="item.id"
+            :value="item.id"
+            :label="item.name"
+          >
+          </el-option>
+        </el-select>
       </el-form-item>
     </el-form>
     <div slot="footer">
@@ -58,14 +67,14 @@
 </template>
 
 <script>
-import { updateCourse, getCode } from "../api";
+import { updateCourse, getCode, clazzQuery } from "../api";
 
 const initModalForm = {
   id: null,
   courseName: "",
   courseCode: "",
   teachingRoomId: "",
-  clazz: ""
+  clazzIdList: ""
 };
 
 export default {
@@ -90,6 +99,7 @@ export default {
     return {
       modalIsShow: false,
       isSubmit: false,
+      classList: [],
       modalForm: { ...initModalForm },
       rules: {
         courseName: [
@@ -117,25 +127,39 @@ export default {
             trigger: "change"
           }
         ],
-        clazz: [
+        clazzIdList: [
           {
             required: true,
-            message: "请输入授课班级",
+            validator: (rule, value, callback) => {
+              if (!value || !value.length) {
+                return callback(new Error("请选择授课班级"));
+              }
+
+              callback();
+            },
             trigger: "change"
           }
         ]
       }
     };
   },
+  created() {
+    this.getClassList();
+  },
   methods: {
     initData(val) {
       if (val.id) {
         this.modalForm = this.$objAssign(initModalForm, val);
+        this.modalForm.clazzIdList = val.clazzList.map(item => item.id);
       } else {
         this.modalForm = { ...initModalForm };
         this.createCode();
       }
     },
+    async getClassList() {
+      const data = await clazzQuery();
+      this.classList = data || [];
+    },
     async createCode() {
       this.modalForm.courseCode = await getCode("COURSE_CODE");
     },
@@ -155,7 +179,6 @@ export default {
       if (this.isSubmit) return;
       this.isSubmit = true;
       let datas = { ...this.modalForm };
-      datas.clazzList = datas.clazz.split(",");
       const data = await updateCourse(datas).catch(() => {
         this.isSubmit = false;
       });

+ 25 - 22
src/modules/base/components/ModifyStudent.vue

@@ -38,19 +38,22 @@
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item prop="campusId" label="校区:">
-        <campus-select
-          v-model.trim="modalForm.campusId"
-          style="width: 100%"
-          clearable
-        ></campus-select>
-      </el-form-item>
-      <el-form-item prop="clazz" label="班级信息:">
-        <el-input
-          v-model.trim="modalForm.clazz"
+      <el-form-item prop="clazzId" label="班级信息:">
+        <el-select
+          v-model="modalForm.clazzId"
           placeholder="请输入班级信息"
+          filterable
           clearable
-        ></el-input>
+          style="width:100%;"
+        >
+          <el-option
+            v-for="item in classList"
+            :key="item.id"
+            :value="item.id"
+            :label="item.name"
+          >
+          </el-option>
+        </el-select>
       </el-form-item>
     </el-form>
     <div slot="footer">
@@ -63,15 +66,14 @@
 </template>
 
 <script>
-import { updateStudent } from "../api";
+import { updateStudent, clazzQuery } from "../api";
 
 const initModalForm = {
   id: null,
   studentName: "",
   studentCode: "",
   phoneNumber: "",
-  campusId: "",
-  clazz: ""
+  clazzId: ""
 };
 
 export default {
@@ -96,6 +98,7 @@ export default {
     return {
       modalIsShow: false,
       isSubmit: false,
+      classList: [],
       modalForm: { ...initModalForm },
       rules: {
         studentName: [
@@ -130,14 +133,7 @@ export default {
             trigger: "change"
           }
         ],
-        campusId: [
-          {
-            required: true,
-            message: "请选择校区",
-            trigger: "change"
-          }
-        ],
-        clazz: [
+        clazzId: [
           {
             required: true,
             message: "请输入班级信息",
@@ -152,7 +148,14 @@ export default {
       }
     };
   },
+  created() {
+    this.getClassList();
+  },
   methods: {
+    async getClassList() {
+      const data = await clazzQuery();
+      this.classList = data || [];
+    },
     initData(val) {
       if (val.id) {
         this.modalForm = this.$objAssign(initModalForm, val);

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

@@ -15,6 +15,7 @@ import ApproveRecordManage from "./views/ApproveRecordManage.vue";
 import CampusManage from "./views/CampusManage.vue";
 import StudentManage from "./views/StudentManage.vue";
 import CourseManage from "./views/CourseManage.vue";
+import ClazzManage from "./views/ClazzManage.vue";
 
 export default [
   {
@@ -86,5 +87,10 @@ export default [
     path: "/base/student-manage",
     name: "StudentManage",
     component: StudentManage
+  },
+  {
+    path: "/base/clazz-manage",
+    name: "ClazzManage",
+    component: ClazzManage
   }
 ];

+ 173 - 0
src/modules/base/views/ClazzManage.vue

@@ -0,0 +1,173 @@
+<template>
+  <div class="clazz-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <template v-if="checkPrivilege('condition', 'condition')">
+          <el-form-item label="班级名称:">
+            <el-input
+              style="width: 142px;"
+              v-model.trim="filter.queryParams"
+              placeholder="班级名称"
+              clearable
+            ></el-input>
+          </el-form-item>
+        </template>
+        <el-form-item>
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          type="success"
+          icon="el-icon-download"
+          v-if="checkPrivilege('button', 'Import')"
+          ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
+        >
+        <upload-button
+          v-if="checkPrivilege('button', 'Import')"
+          btn-icon="el-icon-circle-plus-outline"
+          btn-content="批量导入"
+          btn-type="success"
+          :upload-url="uploadUrl"
+          :format="['xls', 'xlsx']"
+          @upload-error="uplaodError"
+          @upload-success="uploadSuccess"
+        >
+        </upload-button>
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增班级</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column prop="clazzName" label="班级名称"></el-table-column>
+        <el-table-column prop="campusName" label="所属校区"></el-table-column>
+        <el-table-column prop="createTime" label="创建日期">
+          <span slot-scope="scope">{{
+            scope.row.createTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column label="操作" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'edit')"
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'delete')"
+              class="btn-danger"
+              type="text"
+              @click="toDelete(scope.row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <modify-clazz
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyClazz"
+    ></modify-clazz>
+  </div>
+</template>
+
+<script>
+import { clazzListQuery, deleteClazz } from "../api";
+import ModifyClazz from "../components/ModifyClazz";
+import UploadButton from "../../../components/UploadButton";
+
+export default {
+  name: "clazz-manage",
+  components: { ModifyClazz, UploadButton },
+  data() {
+    return {
+      filter: {
+        queryParams: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      // import
+      uploadUrl: "/api/admin/basic/clazz/data_import",
+      downloadUrl: "/temps/classTemplate.xlsx",
+      dfilename: "班级导入模板.xlsx"
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await clazzListQuery(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifyClazz.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyClazz.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除班级【${row.clazzName}】吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteClazz([row.id]);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    },
+    // import
+    uplaodError(errorData) {
+      this.$notify.error({ title: "错误提示", message: errorData.message });
+    },
+    uploadSuccess() {
+      this.$message.success("文件上传成功,后台正在导入!");
+      this.getList();
+    }
+  }
+};
+</script>

+ 6 - 2
src/modules/base/views/CourseManage.vue

@@ -70,7 +70,11 @@
           prop="teachingRoomName"
           label="所属教研室"
         ></el-table-column>
-        <el-table-column prop="clazz" label="授课班级"></el-table-column>
+        <el-table-column prop="clazzList" label="授课班级">
+          <span slot-scope="scope">
+            {{ scope.row.clazzList.map(item => item.name).join(",") }}
+          </span>
+        </el-table-column>
         <el-table-column prop="createTime" label="创建日期">
           <span slot-scope="scope">{{
             scope.row.createTime | timestampFilter
@@ -139,7 +143,7 @@ export default {
       courses: [],
       // import
       uploadUrl: "/api/admin/basic/course/data_import",
-      downloadUrl: "/temps/课程导入模板.xlsx",
+      downloadUrl: "/temps/courseTemplate.xlsx",
       dfilename: "课程导入模板.xlsx",
       // date-picker
       createTime: [],

+ 6 - 2
src/modules/base/views/StudentManage.vue

@@ -50,7 +50,11 @@
       <el-table ref="TableList" :data="dataList">
         <el-table-column prop="studentName" label="姓名"></el-table-column>
         <el-table-column prop="studentCode" label="学号"></el-table-column>
-        <el-table-column prop="phoneNumber" label="手机号"></el-table-column>
+        <el-table-column prop="phoneNumber" label="手机号">
+          <span slot-scope="scope">{{
+            scope.row.phoneNumber | defaultFieldFilter
+          }}</span>
+        </el-table-column>
         <el-table-column prop="campusName" label="校区"></el-table-column>
         <el-table-column prop="clazz" label="班级"></el-table-column>
         <el-table-column label="操作" width="120px">
@@ -113,7 +117,7 @@ export default {
       curRow: {},
       // import
       uploadUrl: "/api/admin/basic/student/data_import",
-      downloadUrl: "/temps/学生导入模板.xlsx",
+      downloadUrl: "/temps/studentTemplate.xlsx",
       dfilename: "学生导入模板.xlsx"
     };
   },

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

@@ -197,7 +197,7 @@ export default {
       curUser: {},
       // import
       uploadUrl: "/api/admin/sys/user/import",
-      downloadUrl: "/temps/用户导入模板.xlsx",
+      downloadUrl: "/temps/userTemplate.xlsx",
       dfilename: "用户导入模板.xlsx"
     };
   },

+ 1 - 1
src/modules/exam/components/BatchAddExamTask.vue

@@ -145,7 +145,7 @@ export default {
           }
         ]
       },
-      downloadUrl: this.GLOBAL.domain + "/temps/命题任务导入模板.xlsx",
+      downloadUrl: "/temps/examTaskTemplate.xlsx",
       // import
       uploadExamTaskUrl: "/api/admin/exam/task/import"
     };

+ 17 - 0
src/modules/exam/components/CreatePrintTask.vue

@@ -65,6 +65,12 @@
           :controls="false"
         ></el-input-number>
       </el-form-item>
+      <el-form-item prop="campusId" label="校区:">
+        <campus-select
+          v-model="modalForm.campusId"
+          @change="campusChange"
+        ></campus-select>
+      </el-form-item>
       <el-form-item prop="printHouseId" label="印刷室:">
         <el-select
           v-model="modalForm.printHouseId"
@@ -197,6 +203,13 @@ export default {
             trigger: "change"
           }
         ],
+        campusId: [
+          {
+            required: true,
+            message: "请选择校区",
+            trigger: "change"
+          }
+        ],
         printHouseId: [
           {
             required: true,
@@ -273,6 +286,10 @@ export default {
         classes.map(item => item.studentCount)
       );
     },
+    campusChange(val) {
+      this.modalForm.printHouseId = val.printHouseId;
+      this.modalForm.printHouseName = val.printHouseName;
+    },
     printHouseChange(val) {
       const curHouse = this.printRooms.find(item => item.houseId === val);
       if (curHouse) {

+ 19 - 1
src/modules/exam/views/WaitTask.vue

@@ -69,10 +69,28 @@ export default {
     };
   },
   mounted() {
-    this.toPage(1);
+    this.initData();
   },
   methods: {
     ...mapActions("exam", ["updateWaitTaskCount"]),
+    async initData() {
+      const cachePageInfo = this.$ls.get("cachePageInfo");
+      if (cachePageInfo) {
+        this.current = cachePageInfo.page;
+        await this.getList();
+
+        this.$nextTick(() => {
+          const curRow = this.dataList.find(
+            item => item.id === cachePageInfo.curRowId
+          );
+          if (!curRow) return;
+          this.toDo(curRow);
+        });
+      } else {
+        this.toPage(1);
+      }
+      this.$ls.remove("cachePageInfo");
+    },
     async getList() {
       const datas = {
         pageNumber: this.current,