Răsfoiți Sursa

课程教师管理

zhangjie 2 ani în urmă
părinte
comite
35d8e59d0a

+ 76 - 57
src/modules/base/api.js

@@ -197,22 +197,21 @@ export const exportCourse = datas => {
     responseType: "blob"
   });
 };
-// course-simple-manage
-export const courseSimpleListPage = datas => {
-  return $postParam("/api/admin/teach/course/page", datas);
-};
-export const courseSimpleQuery = datas => {
-  return $postParam("/api/admin/teach/course/find_basic_course", datas);
+
+// clazz-manage
+export const clazzListQuery = datas => {
+  return $postParam("/api/admin/basic/clazz/query", datas);
 };
-export const deleteCourseSimple = idList => {
-  return $postParam("/api/admin/teach/course/delete", { idList });
+export const deleteClazz = idList => {
+  return $postParam("/api/admin/basic/clazz/delete_batch", { idList });
 };
-export const updateCourseSimple = datas => {
-  return $post("/api/admin/teach/course/create", datas);
+export const updateClazz = datas => {
+  return $post("/api/admin/basic/clazz/save", datas);
 };
-export const batchAddCourseSimple = datas => {
-  return $post("/api/admin/teach/course/create", datas);
+export const clazzQuery = datas => {
+  return $postParam("/api/admin/basic/clazz/datasource", datas);
 };
+
 // flow-manage
 export const flowListPage = datas => {
   return $postParam("/api/admin/custom/flow/list", datas);
@@ -279,51 +278,6 @@ export const deleteFilterStudent = datas => {
 export const updateStudent = datas => {
   return $post("/api/admin/basic/student/save", datas);
 };
-export const studentSimpleListQuery = datas => {
-  return $postParam("/api/admin/teach/student/page", datas);
-};
-export const deleteStudentSimple = idList => {
-  return $postParam("/api/admin/teach/student/delete", { idList });
-};
-export const updateStudentSimple = datas => {
-  return $post("/api/admin/teach/student/create", datas);
-};
-export const batchAddStudentSimple = datas => {
-  return $post("/api/admin/teach/student/create_batch", datas);
-};
-export const exportStudent = datas => {
-  return $postParam("/api/admin/basic/student/export", datas, {
-    responseType: "blob"
-  });
-};
-
-// 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 = datas => {
-  return $postParam("/api/admin/basic/clazz/datasource", datas);
-};
-
-// clazz-simple-manage
-export const clazzSimpleListPage = datas => {
-  return $postParam("/api/admin/teach/clazz/page", datas);
-};
-export const clazzTeachCourseQuery = datas => {
-  return $postParam("/api/admin/teach/clazz/find_teach_course", datas);
-};
-export const deleteClazzSimple = idList => {
-  return $postParam("/api/admin/teach/clazz/delete", { idList });
-};
-export const updateClazzSimple = datas => {
-  return $post("/api/admin/teach/clazz/edit", datas);
-};
 
 // semester-manage
 export const semesterListQuery = datas => {
@@ -459,3 +413,68 @@ export const uploadFile = datas => {
 export const getCode = type => {
   return $postParam("/api/admin/common/get_code", { type });
 };
+
+// simple --------------->
+// course-simple-manage
+export const courseSimpleListPage = datas => {
+  return $postParam("/api/admin/teach/course/page", datas);
+};
+export const courseSimpleQuery = datas => {
+  return $postParam("/api/admin/teach/course/find_basic_course", datas);
+};
+export const deleteCourseSimple = idList => {
+  return $postParam("/api/admin/teach/course/delete", { idList });
+};
+export const updateCourseSimple = datas => {
+  return $post("/api/admin/teach/course/create", datas);
+};
+export const batchAddCourseSimple = datas => {
+  return $post("/api/admin/teach/course/create", datas);
+};
+
+// clazz-simple-manage
+export const clazzSimpleListPage = datas => {
+  return $postParam("/api/admin/teach/clazz/page", datas);
+};
+export const clazzTeachCourseQuery = datas => {
+  return $postParam("/api/admin/teach/clazz/find_teach_course", datas);
+};
+export const deleteClazzSimple = idList => {
+  return $postParam("/api/admin/teach/clazz/delete", { idList });
+};
+export const updateClazzSimple = datas => {
+  return $post("/api/admin/teach/clazz/edit", datas);
+};
+
+// student-simple-manage
+export const studentSimpleListQuery = datas => {
+  return $postParam("/api/admin/teach/student/page", datas);
+};
+export const deleteStudentSimple = idList => {
+  return $postParam("/api/admin/teach/student/delete", { idList });
+};
+export const updateStudentSimple = datas => {
+  return $post("/api/admin/teach/student/create", datas);
+};
+export const batchAddStudentSimple = datas => {
+  return $post("/api/admin/teach/student/create_batch", datas);
+};
+export const exportStudent = datas => {
+  return $postParam("/api/admin/basic/student/export", datas, {
+    responseType: "blob"
+  });
+};
+
+// teacher-simple-manage
+export const teacherSimpleListQuery = datas => {
+  return $postParam("/api/admin/teach/teacher/page", datas);
+};
+export const deleteTeacherSimple = idList => {
+  return $postParam("/api/admin/teach/teacher/delete", { idList });
+};
+export const updateTeacherSimple = datas => {
+  return $post("/api/admin/teach/teacher/create", datas);
+};
+export const batchAddTeacherSimple = datas => {
+  return $post("/api/admin/teach/teacher/create_batch", datas);
+};

+ 1 - 1
src/modules/base/components/course-simple/ModifyCourseSimple.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    class="modify-course"
+    class="modify-course-simple"
     :visible.sync="modalIsShow"
     title="添加课程"
     top="10px"

+ 219 - 0
src/modules/base/components/course-simple/ModifyTeacherSimple.vue

@@ -0,0 +1,219 @@
+<template>
+  <el-dialog
+    class="modify-teacher-simple"
+    :visible.sync="modalIsShow"
+    title="添加教师"
+    top="10px"
+    width="800px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <div class="mb-4 tab-btns">
+      <el-button
+        v-for="tab in tabs"
+        :key="tab.val"
+        size="medium"
+        :type="curTab == tab.val ? 'primary' : 'default'"
+        @click="selectMenu(tab.val)"
+        >{{ tab.name }}
+      </el-button>
+    </div>
+    <!-- input -->
+    <div v-if="curTab === 'input'" class="tab-body">
+      <el-form
+        ref="modalFormComp"
+        :model="modalForm"
+        :rules="rules"
+        :key="modalForm.id"
+        label-position="top"
+      >
+        <el-form-item prop="loginName" label="姓名:">
+          <el-input
+            v-model.trim="modalForm.loginName"
+            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>
+    <!-- select -->
+    <div v-if="curTab === 'select'" class="tab-body">
+      <select-simple-teacher
+        ref="SelectSimpleTeacher"
+        v-model="selectedTeacherIds"
+      ></select-simple-teacher>
+    </div>
+    <!-- import -->
+    <div v-if="curTab === 'import'" class="tab-body">
+      <el-button type="success" icon="el-icon-download"
+        ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
+      >
+      <upload-button
+        btn-icon="el-icon-circle-plus-outline"
+        btn-content="批量导入"
+        btn-type="success"
+        :upload-url="uploadUrl"
+        :upload-data="uploadData"
+        :format="['xls', 'xlsx']"
+        accept=".xls,.xlsx"
+        @valid-error="validError"
+        @upload-success="uploadSuccess"
+      >
+      </upload-button>
+    </div>
+    <div v-if="!IS_IMPORT" slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateTeacherSimple, batchAddTeacherSimple } from "../../api";
+import UploadButton from "@/components/UploadButton";
+import SelectSimpleTeacher from "./SelectSimpleTeacher.vue";
+
+const initModalForm = {
+  id: null,
+  loginName: "",
+  code: ""
+};
+
+export default {
+  name: "modify-teacher-simple",
+  components: { UploadButton, SelectSimpleTeacher },
+  computed: {
+    IS_IMPORT() {
+      return this.curTab === "import";
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      curTab: "select",
+      tabs: [
+        {
+          name: "手动添加",
+          val: "input"
+        },
+        {
+          name: "教师库添加",
+          val: "select"
+        },
+        {
+          name: "批量导入",
+          val: "import"
+        }
+      ],
+      modalForm: { ...initModalForm },
+      courses: [],
+      rules: {
+        loginName: [
+          {
+            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"
+          }
+        ]
+      },
+      selectedTeacherIds: [],
+      // import
+      uploadData: {},
+      uploadUrl: "/api/admin/teach/course/import",
+      downloadUrl: "/temps/courseSimpleTemplate.xlsx",
+      dfilename: "教学课程导入模板.xlsx"
+    };
+  },
+  methods: {
+    visibleChange() {
+      this.modalForm = { ...initModalForm };
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    selectMenu(tab) {
+      this.curTab = tab;
+    },
+    submit() {
+      const submitFunc = {
+        input: this.submitInput,
+        select: this.submitSelect
+      };
+      submitFunc[this.curTab]();
+    },
+    async submitInput() {
+      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 updateTeacherSimple(datas).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    },
+    async submitSelect() {
+      if (!this.selectedTeacherIds.length) {
+        this.$message.error("请选择教师");
+        return;
+      }
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const data = await batchAddTeacherSimple({
+        basicTeacherIdSet: this.selectedTeacherIds
+      }).catch(() => {});
+      this.isSubmit = false;
+
+      if (!data) return;
+
+      this.$message.success("添加成功!");
+      this.$emit("modified");
+      this.selectedTeacherIds = [];
+      this.$refs.SelectSimpleTeacher.clearSelection();
+    },
+    // import
+    validError(errorData) {
+      this.$message.error(errorData.message);
+    },
+    uploadSuccess(data) {
+      this.$message.success(data.data || "教师导入成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 1 - 1
src/modules/base/components/course-simple/SelectSimpleCourse.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="select-class-student">
+  <div class="select-simple-course">
     <el-form ref="FilterForm" label-position="left" inline label-width="0px">
       <el-form-item>
         <org-select

+ 123 - 0
src/modules/base/components/course-simple/SelectSimpleTeacher.vue

@@ -0,0 +1,123 @@
+<template>
+  <div class="select-simple-teacher">
+    <el-form ref="FilterForm" label-position="left" inline label-width="0px">
+      <el-form-item>
+        <org-select
+          v-model="filter.belongOrgId"
+          placeholder="选择学院"
+        ></org-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" :disabled="!canSearch" @click="toPage(1)"
+          >查询</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <div class="box-justify mb-2">
+      <p>
+        全部共<span class="mlr-1">{{ dataList.length }}</span
+        >人
+      </p>
+      <p>
+        已选<span class="mlr-1">{{ multipleSelection.length }}</span
+        >人
+      </p>
+    </div>
+    <el-table
+      ref="TableList"
+      :data="dataList"
+      border
+      max-height="440px"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column
+        type="selection"
+        width="55"
+        align="center"
+      ></el-table-column>
+      <el-table-column
+        type="index"
+        label="序号"
+        width="70"
+        :index="indexMethod"
+      ></el-table-column>
+      <el-table-column
+        prop="realName"
+        label="姓名"
+        min-width="120"
+      ></el-table-column>
+      <el-table-column
+        prop="code"
+        label="工号"
+        min-width="120"
+      ></el-table-column>
+      <el-table-column
+        prop="orgName"
+        label="所在机构"
+        min-width="120"
+      ></el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import { courseListPage } from "../../api";
+
+export default {
+  name: "select-simple-teacher",
+  props: {
+    value: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      filter: {
+        belongOrgId: "",
+        enable: true,
+        pageNumber: 1,
+        pageSize: 1000
+      },
+      dataList: [],
+      multipleSelection: []
+    };
+  },
+  computed: {
+    canSearch() {
+      return this.filter.belongOrgId;
+    }
+  },
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter
+      };
+      const data = await courseListPage(datas);
+      this.dataList = data.records || [];
+    },
+    toPage(page) {
+      if (!this.canSearch) return;
+
+      this.current = page;
+      this.getList();
+      this.multipleSelection = [];
+      this.emitChange();
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val.map(item => item.id);
+      this.emitChange();
+    },
+    emitChange() {
+      this.$emit("input", this.multipleSelection);
+      this.$emit("change", this.multipleSelection);
+    },
+    clearSelection() {
+      this.$refs.TableList.clearSelection();
+    }
+  }
+};
+</script>

+ 7 - 15
src/modules/base/components/course-simple/TeacherSimpleManage.vue

@@ -4,7 +4,7 @@
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <el-form-item>
           <el-input
-            v-model.trim="filter.teachClazzName"
+            v-model.trim="filter.paramName"
             placeholder="请输入姓名或工号"
             clearable
           ></el-input>
@@ -89,7 +89,7 @@
 </template>
 
 <script>
-import { clazzSimpleListPage, deleteClazzSimple } from "../../api";
+import { teacherSimpleListQuery, deleteTeacherSimple } from "../../api";
 import ModifyTeacherSimple from "../components/ModifyTeacherSimple";
 
 export default {
@@ -107,7 +107,7 @@ export default {
     return {
       filter: {
         teachCourseId: "",
-        teachClazzName: ""
+        paramName: ""
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -131,7 +131,7 @@ export default {
         pageNumber: this.current,
         pageSize: this.size
       };
-      const data = await clazzSimpleListPage(datas);
+      const data = await teacherSimpleListQuery(datas);
       this.dataList = data.records;
       this.total = data.total;
     },
@@ -146,17 +146,9 @@ export default {
       this.curRow = { teachCourseId: this.filter.teachCourseId };
       this.$refs.ModifyTeacherSimple.open();
     },
-    toEdit(row) {
-      this.curRow = row;
-      this.$refs.ModifyTeacherSimple.open();
-    },
-    toEditStudent(row) {
-      this.curRow = row;
-      this.$refs.ModifyClazzSimpleStudent.open();
-    },
     async toDelete(row) {
       const confirm = await this.$confirm(
-        `确定要删除班级【${row.teachClazzName}】吗?`,
+        `确定要删除教师【${row.teachClazzName}】吗?`,
         "提示",
         {
           type: "warning"
@@ -164,7 +156,7 @@ export default {
       ).catch(() => {});
       if (confirm !== "confirm") return;
 
-      await deleteClazzSimple([row.id]);
+      await deleteTeacherSimple([row.id]);
       this.$message.success("删除成功!");
       this.deletePageLastItem();
     },
@@ -183,7 +175,7 @@ export default {
       ).catch(() => {});
       if (confirm !== "confirm") return;
 
-      await deleteClazzSimple(this.multipleSelection);
+      await deleteTeacherSimple(this.multipleSelection);
       this.$message.success("删除成功!");
       this.deletePageLastItem(this.multipleSelection.length);
       this.multipleSelection = [];