zhangjie 3 жил өмнө
parent
commit
01e8fa50eb

+ 64 - 0
src/components/base/CampusSelect.vue

@@ -0,0 +1,64 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="campus-select"
+    placeholder="请选择"
+    :style="styles"
+    filterable
+    :clearable="clearable"
+    :disabled="disabled"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    >
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { campusQuery } from "../../modules/base/api";
+
+export default {
+  name: "campus-select",
+  props: {
+    disabled: { type: Boolean, default: false },
+    value: { type: [Number, String], default: "" },
+    styles: { type: String, default: "" },
+    clearable: { type: Boolean, default: true }
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: ""
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      }
+    }
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      const res = await campusQuery();
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

+ 64 - 0
src/components/base/PrintRoomSelect.vue

@@ -0,0 +1,64 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="campus-select"
+    placeholder="请选择"
+    :style="styles"
+    filterable
+    :clearable="clearable"
+    :disabled="disabled"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    >
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { printRoomQuery } from "../../modules/base/api";
+
+export default {
+  name: "campus-select",
+  props: {
+    disabled: { type: Boolean, default: false },
+    value: { type: [Number, String], default: "" },
+    styles: { type: String, default: "" },
+    clearable: { type: Boolean, default: true }
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: ""
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      }
+    }
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      const res = await printRoomQuery();
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

+ 64 - 0
src/components/base/StaffRoomSelect.vue

@@ -0,0 +1,64 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="campus-select"
+    placeholder="请选择"
+    :style="styles"
+    filterable
+    :clearable="clearable"
+    :disabled="disabled"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    >
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { staffRoomQuery } from "../../modules/base/api";
+
+export default {
+  name: "campus-select",
+  props: {
+    disabled: { type: Boolean, default: false },
+    value: { type: [Number, String], default: "" },
+    styles: { type: String, default: "" },
+    clearable: { type: Boolean, default: true }
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: ""
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      }
+    }
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      const res = await staffRoomQuery();
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

+ 44 - 1
src/modules/base/api.js

@@ -3,6 +3,7 @@ import { $postParam, $post } from "@/plugins/axios";
 export const questionTeatherUserQuery = ({ courseCode, param }) => {
   return $postParam("/api/admin/sys/user/user_list", { courseCode, param });
 };
+// user --------------------------------->
 // user-manage
 export const userListPage = datas => {
   return $postParam("/api/admin/sys/user/list", datas);
@@ -63,7 +64,7 @@ export const deleteOrganization = id => {
   return $post("/api/admin/sys/org/remove", { id });
 };
 
-// --------------------------------->
+// setting --------------------------------->
 // common-rule
 export const examRuleDetail = schoolId => {
   return $postParam("/api/admin/basic/exam_rule/list", { schoolId });
@@ -117,6 +118,48 @@ export const updateCourse = datas => {
   return $post("/api/admin/basic/course/save", datas);
 };
 
+// dict --------------------------------->
+// campus-manage
+export const campusQuery = () => {
+  return $postParam("/api/admin/basic/campus/list", {});
+};
+export const deleteCampus = id => {
+  return $post("/api/admin/basic/campus/remove", { id });
+};
+export const updateCampus = datas => {
+  return $post("/api/admin/basic/campus/save", datas);
+};
+// print-room-manage
+export const printRoomQuery = () => {
+  return $postParam("/api/admin/basic/print_room/list", {});
+};
+export const deletePrintRoom = id => {
+  return $post("/api/admin/basic/print_room/remove", { id });
+};
+export const updatePrintRoom = datas => {
+  return $post("/api/admin/basic/print_room/save", datas);
+};
+// staff-room-manage
+export const staffRoomQuery = () => {
+  return $postParam("/api/admin/basic/staff_room/list", {});
+};
+export const deleteStaffRoom = id => {
+  return $post("/api/admin/basic/staff_room/remove", { id });
+};
+export const updateStaffRoom = datas => {
+  return $post("/api/admin/basic/staff_room/save", datas);
+};
+// student-manage
+export const studentListQuery = () => {
+  return $postParam("/api/admin/basic/student/list", {});
+};
+export const deleteStudent = id => {
+  return $post("/api/admin/basic/student/remove", { id });
+};
+export const updateStudent = datas => {
+  return $post("/api/admin/basic/student/save", datas);
+};
+
 // common
 export const uploadFile = datas => {
   return $post("/api/admin/common/file/upload", datas);

+ 134 - 0
src/modules/base/components/ModifyCampus.vue

@@ -0,0 +1,134 @@
+<template>
+  <el-dialog
+    class="modify-campus"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="500px"
+    :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-width="100px"
+    >
+      <el-form-item prop="name" label="校区名称:">
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="请输入校区名称"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="code" label="校区编码:">
+        <el-input
+          v-model.trim="modalForm.code"
+          placeholder="请输入校区编码"
+          clearable
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateCampus } from "../api";
+
+const initModalForm = {
+  id: null,
+  name: "",
+  code: ""
+};
+
+export default {
+  name: "modify-campus",
+  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: {
+        name: [
+          {
+            required: true,
+            // pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,20}$/,
+            // message: "校区名称只能输入汉字、数字和字母,长度不能超过20",
+            message: "校区名称不能超过30个字",
+            max: 30,
+            trigger: "change"
+          }
+        ],
+        code: [
+          {
+            required: true,
+            pattern: /^[0-9a-zA-Z_-]{3,30}$/,
+            message: "校区编码只能由数字字母短横线组成,长度在3-30之间",
+            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;
+      const data = await updateCampus(this.modalForm).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

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

@@ -31,6 +31,12 @@
           clearable
         ></el-input>
       </el-form-item>
+      <el-form-item prop="staffRoomId" label="所属教研室:">
+        <staff-room-select
+          v-model.trim="modalForm.staffRoomId"
+          clearable
+        ></staff-room-select>
+      </el-form-item>
     </el-form>
     <div slot="footer">
       <el-button type="primary" :disabled="isSubmit" @click="submit"
@@ -47,7 +53,8 @@ import { updateCourse } from "../api";
 const initModalForm = {
   id: null,
   name: "",
-  code: ""
+  code: "",
+  staffRoomId: ""
 };
 
 export default {
@@ -91,6 +98,13 @@ export default {
             message: "课程编码只能由数字字母短横线组成,长度在3-30之间",
             trigger: "change"
           }
+        ],
+        staffRoomId: [
+          {
+            required: true,
+            message: "请选择所属教研室",
+            trigger: "change"
+          }
         ]
       }
     };

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

@@ -0,0 +1,136 @@
+<template>
+  <el-dialog
+    class="modify-print-room"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="500px"
+    :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-width="100px"
+    >
+      <el-form-item prop="name" label="印刷室名称:">
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="请输入印刷室名称"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="code" label="印刷室编码:">
+        <el-input
+          v-model.trim="modalForm.code"
+          placeholder="请输入印刷室编码"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="campus" label="所属校区:">
+        <campus-select v-model="modalForm.campusId"></campus-select>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updatePrintRoom } from "../api";
+
+const initModalForm = {
+  id: null,
+  name: "",
+  code: "",
+  campusId: ""
+};
+
+export default {
+  name: "modify-print-room",
+  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: {
+        name: [
+          {
+            required: true,
+            message: "印刷室名称不能超过30个字",
+            max: 30,
+            trigger: "change"
+          }
+        ],
+        code: [
+          {
+            required: true,
+            pattern: /^[0-9a-zA-Z_-]{3,30}$/,
+            message: "印刷室编码只能由数字字母短横线组成,长度在3-30之间",
+            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;
+      const data = await updatePrintRoom(this.modalForm).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 134 - 0
src/modules/base/components/ModifyStaffRoom.vue

@@ -0,0 +1,134 @@
+<template>
+  <el-dialog
+    class="modify-staff-room"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="500px"
+    :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-width="100px"
+    >
+      <el-form-item prop="name" label="教研室名称:">
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="请输入教研室名称"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="code" label="教研室编码:">
+        <el-input
+          v-model.trim="modalForm.code"
+          placeholder="请输入教研室编码"
+          clearable
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateStaffRoom } from "../api";
+
+const initModalForm = {
+  id: null,
+  name: "",
+  code: ""
+};
+
+export default {
+  name: "modify-staff-room",
+  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: {
+        name: [
+          {
+            required: true,
+            // pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,20}$/,
+            // message: "教研室名称只能输入汉字、数字和字母,长度不能超过20",
+            message: "教研室名称不能超过30个字",
+            max: 30,
+            trigger: "change"
+          }
+        ],
+        code: [
+          {
+            required: true,
+            pattern: /^[0-9a-zA-Z_-]{3,30}$/,
+            message: "教研室编码只能由数字字母短横线组成,长度在3-30之间",
+            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;
+      const data = await updateStaffRoom(this.modalForm).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 167 - 0
src/modules/base/components/ModifyStudent.vue

@@ -0,0 +1,167 @@
+<template>
+  <el-dialog
+    class="modify-student"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="500px"
+    :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-width="100px"
+    >
+      <el-form-item prop="name" label="姓名:">
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="请输入课程名称"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="studentNo" label="学号:">
+        <el-input
+          v-model.trim="modalForm.studentNo"
+          placeholder="请输入学号"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="phone" label="手机号:">
+        <el-input
+          v-model.trim="modalForm.phone"
+          placeholder="请输入手机号"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="campusId" label="校区:">
+        <campus-select
+          v-model.trim="modalForm.campus"
+          clearable
+        ></campus-select>
+      </el-form-item>
+      <el-form-item prop="orgs" label="组织架构:">
+        <!-- 学院-专业-班级 -->
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateStudent } from "../api";
+import { phone } from "@/plugins/formRules";
+
+const initModalForm = {
+  id: null,
+  name: "",
+  studentNo: "",
+  phone: "",
+  campusId: ""
+};
+
+export default {
+  name: "modify-student",
+  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: {
+        name: [
+          {
+            required: true,
+            message: "请输入姓名",
+            trigger: "change"
+          },
+          {
+            message: "姓名不能超过50个字",
+            max: 50,
+            trigger: "change"
+          }
+        ],
+        studentNo: [
+          {
+            required: true,
+            message: "请输入学号",
+            trigger: "change"
+          },
+          {
+            message: "学号不能超过50个字",
+            max: 50,
+            trigger: "change"
+          }
+        ],
+        phone,
+        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;
+      const data = await updateStudent(this.modalForm).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 101 - 0
src/modules/base/views/CampusManage.vue

@@ -0,0 +1,101 @@
+<template>
+  <div class="campus-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <div></div>
+      <div class="part-box-action">
+        <el-button
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增校区</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box">
+      <el-table ref="TableList" :data="dataList" border stripe>
+        <el-table-column prop="name" label="校区名称"></el-table-column>
+        <el-table-column prop="code" label="校区编码"></el-table-column>
+        <el-table-column label="操作" align="center" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-edit"
+              @click="toEdit(scope.row)"
+              title="编辑"
+            ></el-button>
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-delete"
+              @click="toDelete(scope.row)"
+              title="删除"
+            ></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-campus
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyCampus"
+    ></modify-campus>
+  </div>
+</template>
+
+<script>
+import { campusQuery, deleteCampus } from "../api";
+import ModifyCampus from "../components/ModifyCampus";
+
+export default {
+  name: "campus-manage",
+  components: { ModifyCampus },
+  data() {
+    return {
+      dataList: [],
+      curRow: {}
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      this.dataList = await campusQuery();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifyCampus.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyCampus.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除校区【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteCampus(row.id);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    }
+  }
+};
+</script>

+ 63 - 7
src/modules/base/views/CourseManage.vue

@@ -10,13 +10,26 @@
             clearable
           ></el-input>
         </el-form-item>
-        <el-form-item label="课程编码:">
-          <el-input
+        <el-form-item label="创建时间:">
+          <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="所属教研室:">
+          <staff-room-select
             style="width: 142px;"
-            v-model.trim="filter.code"
-            placeholder="请输入内容"
+            v-model.trim="filter.staffRoomId"
             clearable
-          ></el-input>
+          ></staff-room-select>
         </el-form-item>
         <el-form-item>
           <el-button type="primary" icon="el-icon-search" @click="toPage(1)"
@@ -31,12 +44,33 @@
           @click="toAdd"
           >新增课程</el-button
         >
+        <el-button
+          ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
+        >
+        <upload-button
+          btn-icon="el-icon-upload"
+          btn-content="批量导入"
+          btn-type="primary"
+          :upload-url="uploadUrl"
+          :format="['xls', 'xlsx']"
+          @upload-error="uplaodError"
+          @upload-success="uploadSuccess"
+          style="margin: 0;"
+        >
+        </upload-button>
       </div>
     </div>
     <div class="part-box">
       <el-table ref="TableList" :data="courses" border stripe>
         <el-table-column prop="name" label="课程名称"></el-table-column>
         <el-table-column prop="code" label="课程编码"></el-table-column>
+        <el-table-column prop="staffRoom" label="所属教研室"></el-table-column>
+        <el-table-column prop="code" 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="操作" align="center" width="120px">
           <template slot-scope="scope">
             <el-button
@@ -79,21 +113,32 @@
 
 <script>
 import { courseListPage, deleteCourse } from "../api";
+import pickerOptions from "@/constants/datePickerOptions";
 import ModifyCourse from "../components/ModifyCourse";
+import UploadButton from "../../../components/UploadButton";
 
 export default {
   name: "course-manage",
-  components: { ModifyCourse },
+  components: { ModifyCourse, UploadButton },
   data() {
     return {
       filter: {
         name: "",
-        code: ""
+        staffRoomId: "",
+        startTime: "",
+        endTime: ""
       },
+      pickerOptions,
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
       courses: [],
+      // import
+      uploadUrl: "/api/admin/basic/course/import",
+      downloadUrl: "/temps/课程导入模板.xlsx",
+      dfilename: "课程导入模板.xlsx",
+      // date-picker
+      createTime: [],
       curCourse: {}
     };
   },
@@ -107,6 +152,10 @@ export default {
         pageNumber: this.current,
         pageSize: this.size
       };
+      if (this.createTime) {
+        datas.startTime = this.createTime[0];
+        datas.endTime = this.createTime[1];
+      }
       const data = await courseListPage(datas);
       this.courses = data.records;
       this.total = data.total;
@@ -135,6 +184,13 @@ export default {
           this.deletePageLastItem();
         })
         .catch(() => {});
+    },
+    // import
+    uplaodError(errorData) {
+      this.$notify.error({ title: "错误提示", message: errorData.message });
+    },
+    uploadSuccess() {
+      this.getList();
     }
   }
 };

+ 102 - 0
src/modules/base/views/PrintRoomManage.vue

@@ -0,0 +1,102 @@
+<template>
+  <div class="print-room-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <div></div>
+      <div class="part-box-action">
+        <el-button
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增印刷室</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box">
+      <el-table ref="TableList" :data="dataList" border stripe>
+        <el-table-column prop="name" label="印刷室名称"></el-table-column>
+        <el-table-column prop="code" label="印刷室编码"></el-table-column>
+        <el-table-column prop="campus" label="所属校区"></el-table-column>
+        <el-table-column label="操作" align="center" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-edit"
+              @click="toEdit(scope.row)"
+              title="编辑"
+            ></el-button>
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-delete"
+              @click="toDelete(scope.row)"
+              title="删除"
+            ></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-print-room
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyPrintRoom"
+    ></modify-print-room>
+  </div>
+</template>
+
+<script>
+import { printRoomQuery, deletePrintRoom } from "../api";
+import ModifyPrintRoom from "../components/ModifyPrintRoom";
+
+export default {
+  name: "print-room-manage",
+  components: { ModifyPrintRoom },
+  data() {
+    return {
+      dataList: [],
+      curRow: {}
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      this.dataList = await printRoomQuery();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifyPrintRoom.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyPrintRoom.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除印刷室【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          await deletePrintRoom(row.id);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    }
+  }
+};
+</script>

+ 101 - 0
src/modules/base/views/StaffRoomManage.vue

@@ -0,0 +1,101 @@
+<template>
+  <div class="staff-room-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <div></div>
+      <div class="part-box-action">
+        <el-button
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增教研室</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box">
+      <el-table ref="TableList" :data="dataList" border stripe>
+        <el-table-column prop="name" label="教研室名称"></el-table-column>
+        <el-table-column prop="code" label="教研室编码"></el-table-column>
+        <el-table-column label="操作" align="center" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-edit"
+              @click="toEdit(scope.row)"
+              title="编辑"
+            ></el-button>
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-delete"
+              @click="toDelete(scope.row)"
+              title="删除"
+            ></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-staff-room
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyStaffRoom"
+    ></modify-staff-room>
+  </div>
+</template>
+
+<script>
+import { staffRoomQuery, deleteStaffRoom } from "../api";
+import ModifyStaffRoom from "../components/ModifyStaffRoom";
+
+export default {
+  name: "staff-room-manage",
+  components: { ModifyStaffRoom },
+  data() {
+    return {
+      dataList: [],
+      curRow: {}
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      this.dataList = await staffRoomQuery();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifyStaffRoom.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyStaffRoom.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除教研室【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteStaffRoom(row.id);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    }
+  }
+};
+</script>

+ 163 - 0
src/modules/base/views/StudentManage.vue

@@ -0,0 +1,163 @@
+<template>
+  <div class="student-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="姓名/学号:">
+          <el-input
+            style="width: 142px;"
+            v-model.trim="filter.name"
+            placeholder="姓名/学号"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增学生</el-button
+        >
+        <el-button
+          ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
+        >
+        <upload-button
+          btn-icon="el-icon-upload"
+          btn-content="批量导入"
+          btn-type="primary"
+          :upload-url="uploadUrl"
+          :format="['xls', 'xlsx']"
+          @upload-error="uplaodError"
+          @upload-success="uploadSuccess"
+          style="margin: 0;"
+        >
+        </upload-button>
+      </div>
+    </div>
+    <div class="part-box">
+      <el-table ref="TableList" :data="dataList" border stripe>
+        <el-table-column prop="name" label="姓名"></el-table-column>
+        <el-table-column prop="studentNo" label="学号"></el-table-column>
+        <el-table-column prop="phone" label="手机号"></el-table-column>
+        <el-table-column prop="campus" label="校区"></el-table-column>
+        <el-table-column prop="college" label="学院"></el-table-column>
+        <el-table-column prop="subject" label="专业"></el-table-column>
+        <el-table-column prop="className" label="班级"></el-table-column>
+        <el-table-column prop="status" label="状态"></el-table-column>
+        <el-table-column label="操作" align="center" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-edit"
+              @click="toEdit(scope.row)"
+              title="编辑"
+            ></el-button>
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-delete"
+              @click="toDelete(scope.row)"
+              title="禁用"
+            ></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-student
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyStudent"
+    ></modify-student>
+  </div>
+</template>
+
+<script>
+import { studentListQuery, deleteStudent } from "../api";
+import ModifyStudent from "../components/ModifyStudent";
+import UploadButton from "../../../components/UploadButton";
+
+export default {
+  name: "student-manage",
+  components: { ModifyStudent, UploadButton },
+  data() {
+    return {
+      filter: {
+        name: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      // import
+      uploadUrl: "/api/admin/basic/course/import",
+      downloadUrl: "/temps/学生导入模板.xlsx",
+      dfilename: "学生导入模板.xlsx"
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await studentListQuery(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifyStudent.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyStudent.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除学生【${row.name}】吗?`, "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteStudent(row.id);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    },
+    // import
+    uplaodError(errorData) {
+      this.$notify.error({ title: "错误提示", message: errorData.message });
+    },
+    uploadSuccess() {
+      this.getList();
+    }
+  }
+};
+</script>

+ 7 - 1
src/plugins/globalVuePlugins.js

@@ -12,6 +12,9 @@ import PaperNumberSelect from "../components/base/PaperNumberSelect.vue";
 import QuestionTeacherSelect from "../components/base/QuestionTeacherSelect.vue";
 import QuestionTeacherUserSelect from "../components/base/QuestionTeacherUserSelect.vue";
 import SchoolSelect from "../components/base/SchoolSelect.vue";
+import CampusSelect from "../components/base/CampusSelect.vue";
+import PrintRoomSelect from "../components/base/PrintRoomSelect.vue";
+import StaffRoomSelect from "../components/base/StaffRoomSelect.vue";
 
 const components = {
   ViewFooter,
@@ -23,7 +26,10 @@ const components = {
   PaperNumberSelect,
   QuestionTeacherSelect,
   QuestionTeacherUserSelect,
-  SchoolSelect
+  SchoolSelect,
+  CampusSelect,
+  PrintRoomSelect,
+  StaffRoomSelect
 };
 
 export default {