Browse Source

修改一些bug,用户管理批量添加 教师模板和学生模板下载

hzj18279462576@163.com 2 years ago
parent
commit
c9606678e4

+ 5 - 0
src/layout/sidebar/SidevarItem.vue

@@ -297,6 +297,11 @@ const roleListChange = async () => {
         let list = item.route.split("/");
         item.routeName = list[2];
       });
+      let flag = roleList.some((item) => {
+        return item.route == "/wanzai/home";
+      });
+      let address = roleList[0].route;
+      console.log(flag, address);
       sessionStorage.setItem("roleList", JSON.stringify(roleList));
       store.commit("ROLELIST", "");
       console.log("能监听到", roleList.value);

+ 7 - 6
src/store/modules/user.js

@@ -286,7 +286,8 @@ const mutations = {
   },
   indexUp: (state, value) => {
     state.activeIndex = value;
-    sessionStorage.setItem('sidevarItem',value);
+    console.log(value);
+    sessionStorage.setItem("sidevarItem", value);
   },
   userName: (state, value) => {
     state.username = value;
@@ -323,11 +324,11 @@ const mutations = {
         };
         router.addRoute("wanzai", arr);
       });
-      router.addRoute("wanzai",  {
-        path: '/:pathMatch(.*)*',
-        name: 'notFound',
-        component: () => import("@/views/notFound/notFound.vue")
-      })
+      router.addRoute("wanzai", {
+        path: "/:pathMatch(.*)*",
+        name: "notFound",
+        component: () => import("@/views/notFound/notFound.vue"),
+      });
     }
   },
 };

+ 73 - 58
src/views/grade/grade.vue

@@ -283,15 +283,18 @@
               v-model="editRuleForm.name"
               popper-class="gradeSelect"
               filterable
+              remote
               :remote-method="studentMethod"
               placeholder="请选择姓名"
               style="width: 400px"
               @change="changeName"
+              clearable
             >
               <el-option
                 v-for="item in studentData"
                 :label="`${item.name}·${item.id}`"
                 :value="`${item.name}·${item.id}`"
+                :key="item.id"
               >
                 <span style="float: left">{{ item.name }}</span>
                 <span
@@ -509,6 +512,11 @@
       </el-carousel>
     </div>
   </div>
+  <div v-for="item in msgList">
+    <div v-for="i in item.list">
+      {{ i.name }}
+    </div>
+  </div>
 </template>
 
 <script setup>
@@ -600,7 +608,7 @@ const selectData = reactive({ list: [] }); // 表格勾选的数据
 // 新增成绩中的学生分页列表
 const studentData = ref();
 const studentCurrentPage = ref(1);
-const studentPageSize = ref(30);
+const studentPageSize = ref(50);
 const studentTotalPage = ref(); // 学生分页总共多少页,判断滚动到底是否还要加载
 const studentInput = ref(); // 学生分页下拉框中的搜索字段
 const studentExamTypeDatas = ref(); // 编辑中的考试类型数据
@@ -1072,65 +1080,72 @@ const changeName = async (value) => {
   editRuleForm.subject = "";
   editRuleForm.examType = "";
   editRuleForm.grade = "";
-  let data = { id: value.split("·")[1] };
-  let res = await axios({
-    method: "get",
-    url: api.value + "/wanzai/api/smartUser/queryUserData",
-    headers: {
-      token: sessionStorage.getItem("token"),
-      user_head: sessionStorage.getItem("userhead"),
-    },
-    params: data,
-  });
-  if (res.data.code == 200) {
-    console.log(
-      JSON.parse(eds.decryptDes(res.data.data)),
-      "切换id获取学生信息"
-    );
-    let data = JSON.parse(eds.decryptDes(res.data.data));
-    editRuleForm.yearClass = data.grade + "-" + data.gradeId;
-    classInfoList(data.gradeId);
-    editRuleForm.class = data.schoolClass + "-" + data.schoolClassId;
-    editRuleForm.schoolNum = data.cardNo;
-  }
+  editRuleForm.yearClass = "";
+  editRuleForm.class = "";
+  editRuleForm.schoolNum = "";
+  if (value) {
+    let data = { id: value.split("·")[1] };
+    let res = await axios({
+      method: "get",
+      url: api.value + "/wanzai/api/smartUser/queryUserData",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: data,
+    });
+    if (res.data.code == 200) {
+      console.log(
+        JSON.parse(eds.decryptDes(res.data.data)),
+        "切换id获取学生信息"
+      );
+      let data = JSON.parse(eds.decryptDes(res.data.data));
+      editRuleForm.yearClass = data.grade + "-" + data.gradeId;
+      classInfoList(data.gradeId);
+      editRuleForm.class = data.schoolClass + "-" + data.schoolClassId;
+      editRuleForm.schoolNum = data.cardNo;
+    }
 
-  let examType = await axios({
-    method: "get",
-    url: api.value + "/wanzai/api/smartScore/queryExamTypes",
-    headers: {
-      token: sessionStorage.getItem("token"),
-      user_head: sessionStorage.getItem("userhead"),
-    },
-    params: {
-      gradeId: editRuleForm.yearClass.split("-")[1],
-    },
-  });
-  if (examType.data.code == 200) {
-    studentExamTypeDatas.value = JSON.parse(eds.decryptDes(examType.data.data));
-  } else {
-    studentExamTypeDatas.value = [];
-  }
+    let examType = await axios({
+      method: "get",
+      url: api.value + "/wanzai/api/smartScore/queryExamTypes",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: {
+        gradeId: editRuleForm.yearClass.split("-")[1],
+      },
+    });
+    if (examType.data.code == 200) {
+      studentExamTypeDatas.value = JSON.parse(
+        eds.decryptDes(examType.data.data)
+      );
+    } else {
+      studentExamTypeDatas.value = [];
+    }
 
-  let subject = await axios({
-    method: "get",
-    url: api.value + "/wanzai/api/smartScore/querySubjects",
-    headers: {
-      token: sessionStorage.getItem("token"),
-      user_head: sessionStorage.getItem("userhead"),
-    },
-    params: {
-      gradeId: editRuleForm.yearClass.split("-")[1],
-    },
-  });
-  console.log(
-    subject,
-    JSON.parse(eds.decryptDes(subject.data.data)),
-    "学科下拉数据"
-  );
-  if (subject.data.code == 200) {
-    studentSubDatas.value = JSON.parse(eds.decryptDes(subject.data.data));
-  } else {
-    studentSubDatas.value = [];
+    let subject = await axios({
+      method: "get",
+      url: api.value + "/wanzai/api/smartScore/querySubjects",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: {
+        gradeId: editRuleForm.yearClass.split("-")[1],
+      },
+    });
+    console.log(
+      subject,
+      JSON.parse(eds.decryptDes(subject.data.data)),
+      "学科下拉数据"
+    );
+    if (subject.data.code == 200) {
+      studentSubDatas.value = JSON.parse(eds.decryptDes(subject.data.data));
+    } else {
+      studentSubDatas.value = [];
+    }
   }
 };
 // 确定编辑

+ 7 - 0
src/views/home/home.vue

@@ -241,6 +241,7 @@ import {
   nextTick,
   onUnmounted,
   onMounted,
+  onBeforeMount,
   markRaw,
 } from "vue";
 import { useRouter } from "vue-router";
@@ -1139,9 +1140,15 @@ onMounted(async () => {
       let address = roleList[0].route;
       console.log(flag, address);
       if (!flag) {
+        store.commit("indexUp", address);
         router.push({
           path: `${address}`,
         });
+      } else {
+        store.commit("indexUp", "/wanzai/home");
+        router.push({
+          path: `/wanzai/home`,
+        });
       }
     } else {
       ElMessage({

+ 1 - 0
src/views/notFound/notFound.vue

@@ -23,6 +23,7 @@ onBeforeMount(() => {
   let address = roleList[0].route;
   console.log(flag, address);
   if (!flag) {
+    store.commit("indexUp", address);
     router.push({
       path: `${address}`,
     });

+ 10 - 7
src/views/roles/roles.vue

@@ -202,7 +202,7 @@
       :close-on-press-escape="false"
       title="编辑管理组权限"
       align-center
-      width="950"
+      width="1200"
       :before-close="cancelManagement"
     >
       <!-- <div class="searchInp">
@@ -237,7 +237,7 @@
         >
           <el-table-column align="center" prop="cardNo" label="学号" />
           <el-table-column align="center" prop="name" label="姓名" />
-          <el-table-column prop="lookRoles" label="查看权限" width="250">
+          <el-table-column prop="lookRoles" label="查看权限" width="350">
             <template #default="{ row }">
               <div
                 class="selBM"
@@ -257,7 +257,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column prop="roles" label="管理权限" width="250">
+          <el-table-column prop="roles" label="管理权限" width="350">
             <template #default="{ row }">
               <div
                 class="selBM"
@@ -335,9 +335,9 @@
             ref="editMemberTree"
             :data="departmentTreeData"
             node-key="id"
-            default-expand-all
             :expand-on-click-node="false"
             show-checkbox
+            :default-expanded-keys="[2, 3,16]"
             @check="editMemberCheckChange"
           >
             <template #default="{ node, data }">
@@ -1188,7 +1188,10 @@ const cancelEditMember = () => {
 };
 // 勾选查看部门
 const editMemberCheckChange = (data, nodes) => {
-  // console.log(nodes.checkedNodes, "勾选部门");
+  // console.log(nodes, "勾选部门");
+  console.log(editMemberTree.value.getCheckedNodes(),"勾选的所有部门");
+  console.log(editMemberTree.value.getHalfCheckedNodes(),"勾选的所有部门");
+  
   lookEditMemberData.value = [];
   // 选中勾选的房间赋值给count
   nodes.checkedNodes.forEach((item, index) => {
@@ -1601,8 +1604,8 @@ const treMemberClick = async (row) => {
   }
 };
 // 勾选人员
-const checkTreList = (data, nodes) => {
-  // console.log(nodes);
+const checkTreList = (data, nodes,list) => {
+  console.log(list);
   menuList.value = [];
   // 选中勾选的房间赋值给count
   nodes.checkedNodes.forEach((item, index) => {

+ 179 - 172
src/views/teacher/teacher.vue

@@ -5,124 +5,124 @@
         <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
         <span class="cameratxt">教师综合素质评价</span>
       </div>
-      <div class="scroll">
-        <div class="middle">
-          <div class="filter">
-            <div class="condition">
-              <el-input
-                :clearable="true"
-                @clear="searchBtn"
-                v-model.trim="searchInput.keyWord"
-                class="sel"
-                placeholder="请输入教师姓名或学工号"
-              /><el-button
-                color="rgba(0, 97, 255, 1)"
-                type="primary"
-                class="search"
-                @click="searchBtn"
-                >查询</el-button
+      <div class="middle">
+        <div class="filter">
+          <div class="condition">
+            <el-input
+              :clearable="true"
+              @clear="searchBtn"
+              v-model.trim="searchInput.keyWord"
+              class="sel"
+              placeholder="请输入教师姓名或学工号"
+            /><el-button
+              color="rgba(0, 97, 255, 1)"
+              type="primary"
+              class="search"
+              @click="searchBtn"
+              >查询</el-button
+            >
+          </div>
+          <div class="condition">
+            <span class="title">学期 :</span>
+            <el-select
+              v-model="searchInput.semester"
+              class="sel"
+              placeholder="请选择学期"
+              style="width: 250px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                :label="i.name"
+                :value="i.id"
+                v-for="i in semesterData"
+              />
+            </el-select>
+          </div>
+
+          <div class="condition">
+            <span class="title">年级 :</span>
+            <el-select
+              v-model="searchInput.grade"
+              placeholder="请选择年级"
+              style="width: 160px"
+              @change="yearClassChange"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in gradeData"
+                :label="i.name"
+                :value="`${i.name}-${i.id}`"
               >
-            </div>
-            <div class="condition">
-              <span class="title">学期 :</span>
+              </el-option>
+            </el-select>
+          </div>
+          <div class="condition">
+            <span class="title">班级 :</span>
+            <el-tooltip
+              class="box-item"
+              effect="dark"
+              content="请先选择年级"
+              placement="top"
+            >
               <el-select
-                v-model="searchInput.semester"
-                class="sel"
-                placeholder="请选择学期"
-                style="width: 250px"
+                v-model="searchInput.class"
+                placeholder="请选择班级"
+                style="width: 160px"
                 @change="searchBtn"
                 :clearable="true"
               >
                 <el-option
+                  v-for="i in classsData"
                   :label="i.name"
-                  :value="i.id"
-                  v-for="i in semesterData"
+                  :value="i.name"
                 />
               </el-select>
-            </div>
-
-            <div class="condition">
-              <span class="title">年级 :</span>
+            </el-tooltip>
+          </div>
+          <div class="condition">
+            <span class="title">教学学科 :</span>
+            <el-tooltip
+              class="box-item"
+              effect="dark"
+              content="请先选择年级"
+              placement="top"
+            >
               <el-select
-                v-model="searchInput.grade"
-                placeholder="请选择年级"
+                v-model="searchInput.subject"
+                class="sel"
+                placeholder="请选择学科"
                 style="width: 160px"
-                @change="yearClassChange"
+                @change="searchBtn"
                 :clearable="true"
               >
                 <el-option
-                  v-for="i in gradeData"
+                  v-for="i in subjectData"
                   :label="i.name"
-                  :value="`${i.name}-${i.id}`"
-                >
-                </el-option>
-              </el-select>
-            </div>
-            <div class="condition">
-              <span class="title">班级 :</span>
-              <el-tooltip
-                class="box-item"
-                effect="dark"
-                content="请先选择年级"
-                placement="top"
-              >
-                <el-select
-                  v-model="searchInput.class"
-                  placeholder="请选择班级"
-                  style="width: 160px"
-                  @change="searchBtn"
-                  :clearable="true"
-                >
-                  <el-option
-                    v-for="i in classsData"
-                    :label="i.name"
-                    :value="i.name"
-                  />
-                </el-select>
-              </el-tooltip>
-            </div>
-            <div class="condition">
-              <span class="title">教学学科 :</span>
-              <el-tooltip
-                class="box-item"
-                effect="dark"
-                content="请先选择年级"
-                placement="top"
-              >
-                <el-select
-                  v-model="searchInput.subject"
-                  class="sel"
-                  placeholder="请选择学科"
-                  style="width: 160px"
-                  @change="searchBtn"
-                  :clearable="true"
-                >
-                  <el-option
-                    v-for="i in subjectData"
-                    :label="i.name"
-                    :value="i.name"
-                  /> </el-select
-              ></el-tooltip>
-            </div>
+                  :value="i.name"
+                /> </el-select
+            ></el-tooltip>
           </div>
-          <!-- 按钮列表 -->
-          <div class="gongneng">
-            <el-button
-              type="primary"
-              color="rgba(0, 97, 255, 1)"
-              plain
-              @click="scoringItemsClick"
-              >评分项管理</el-button
-            >
-            <!-- <el-button
+        </div>
+        <!-- 按钮列表 -->
+        <div class="gongneng">
+          <el-button
+            type="primary"
+            color="rgba(0, 97, 255, 1)"
+            plain
+            @click="scoringItemsClick"
+            >评分项管理</el-button
+          >
+          <!-- <el-button
               type="primary"
               color="rgba(0, 97, 255, 1)"
               @click="importExcel"
               plain
               >导出</el-button
             > -->
-          </div>
         </div>
+      </div>
+      <div class="scroll">
         <div class="footer" v-loading="loading">
           <el-table
             :row-class-name="tableRowClassName"
@@ -1195,7 +1195,7 @@ const goScore = async (row) => {
     },
     data: formData,
   });
-  console.log(res, "评分列表");
+  console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "评分列表");
   if (res.data.code == 200) {
     scoreData.list = JSON.parse(
       eds.decryptDes(res.data.data)
@@ -1224,6 +1224,8 @@ const goScoreChange = (value, row) => {
   let sum = 0; // 表示满评分多少
   totalScore.value = 0;
   lowingScore.value = 0;
+  console.log(scoreData.list);
+  goScoreFlag.value = true;
   scoreData.list.forEach((item) => {
     // console.log(item);
     sum += Number(item.scoreNum); // 计算满评分
@@ -1234,6 +1236,7 @@ const goScoreChange = (value, row) => {
         if (reg.test(i.ownNum)) {
           if (i.ownNum > i.scoreNum) {
             // i.ownNum = 0;
+            i.ownNum = i.scoreNum;
             goScoreFlag.value = false;
             ElMessage({
               type: "error",
@@ -1242,7 +1245,6 @@ const goScoreChange = (value, row) => {
               center: true,
             });
           } else {
-            goScoreFlag.value = true;
             smallTotalScore += Number(i.ownNum);
             totalScore.value += Number(i.ownNum); // 计算总得分
           }
@@ -1262,6 +1264,7 @@ const goScoreChange = (value, row) => {
     console.log(smallTotalScore, "单独项的评分和");
     item.ownNum = smallTotalScore;
   });
+  console.log(goScoreFlag.value, "判断是否能保存");
   lowingScore.value = sum - totalScore.value;
 };
 
@@ -1274,6 +1277,8 @@ const cancelScore = () => {
 
 // 确定去评分
 const confirmGoScore = async () => {
+  console.log(goScoreFlag.value, "判断是否能保存");
+
   if (goScoreFlag.value) {
     let data = {
       id: goScoreId.value, // 该条数据ID,用户信息ID
@@ -1700,6 +1705,8 @@ onUnmounted(() => {
   .pageIndex {
     width: 100%;
     height: 100%;
+    display: flex;
+    flex-direction: column;
   }
   .left {
     // width: calc(100wh - 40px);
@@ -1723,15 +1730,87 @@ onUnmounted(() => {
     }
   }
   .scroll {
-    height: calc(100% - 61px);
+    // height: calc(100% - 61px);
+    flex: 1;
     overflow: auto;
+    .footer {
+      width: 96%;
+      height: calc(100% - 70px);
+      margin: 10px auto 10px;
+
+      .el-table--fit {
+        height: 100%;
+
+        :deep(.el-table__header-wrapper) {
+          background-color: #000;
+          font-size: 14px;
+        }
+
+        :deep(.el-table__row) {
+          height: 50px;
+          font-size: 14px;
+          // color: #000;
+
+          &:hover {
+            td {
+              background-color: rgba(223, 236, 254, 1);
+            }
+          }
+        }
+
+        :deep(.el-table__row td) {
+          padding: 0;
+          .normal {
+            cursor: pointer;
+            color: rgba(0, 97, 255, 1);
+          }
+        }
+
+        .el-button--primary {
+          margin-left: 5px;
+        }
+
+        :deep(.el-table__body .even) {
+          background-color: #fff;
+        }
+
+        :deep(.el-table__body .odd) {
+          background-color: rgba(240, 243, 247, 1);
+        }
+
+        :deep(.edit) {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          color: rgba(111, 182, 184, 1);
+        }
+
+        :deep(.look) {
+          padding: 0 10px;
+          cursor: pointer;
+          color: rgba(30, 125, 251, 1);
+        }
+
+        .del {
+          padding: 0 10px;
+          color: rgba(212, 48, 48, 1);
+          cursor: pointer;
+        }
+
+        // :deep(.look):hover {
+        //   color: red;
+        // }
+        // :deep(.del):hover {
+        //   color: red;
+        // }
+      }
+    }
   }
   .middle {
     width: 96%;
-    margin: 0 auto;
 
+    margin: 0 auto;
     color: #000;
-
     // border-bottom: 1px solid rgb(231, 231, 231);
     .filter {
       display: flex;
@@ -1781,78 +1860,6 @@ onUnmounted(() => {
       margin-left: 20px;
     }
   }
-  .footer {
-    width: 96%;
-    height: calc(100% - 210px);
-    margin: 10px auto 30px;
-
-    .el-table--fit {
-      height: 100%;
-
-      :deep(.el-table__header-wrapper) {
-        background-color: #000;
-        font-size: 14px;
-      }
-
-      :deep(.el-table__row) {
-        height: 50px;
-        font-size: 14px;
-        // color: #000;
-
-        &:hover {
-          td {
-            background-color: rgba(223, 236, 254, 1);
-          }
-        }
-      }
-
-      :deep(.el-table__row td) {
-        padding: 0;
-        .normal {
-          cursor: pointer;
-          color: rgba(0, 97, 255, 1);
-        }
-      }
-
-      .el-button--primary {
-        margin-left: 5px;
-      }
-
-      :deep(.el-table__body .even) {
-        background-color: #fff;
-      }
-
-      :deep(.el-table__body .odd) {
-        background-color: rgba(240, 243, 247, 1);
-      }
-
-      :deep(.edit) {
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        color: rgba(111, 182, 184, 1);
-      }
-
-      :deep(.look) {
-        padding: 0 10px;
-        cursor: pointer;
-        color: rgba(30, 125, 251, 1);
-      }
-
-      .del {
-        padding: 0 10px;
-        color: rgba(212, 48, 48, 1);
-        cursor: pointer;
-      }
-
-      // :deep(.look):hover {
-      //   color: red;
-      // }
-      // :deep(.del):hover {
-      //   color: red;
-      // }
-    }
-  }
 
   // 教师综合素质评价
   .teacherInfo {

+ 419 - 96
src/views/user/user.vue

@@ -16,6 +16,7 @@
       <el-tree
         :data="dataSource"
         node-key="id"
+        :default-expanded-keys="[2, 3, 16]"
         :expand-on-click-node="false"
       >
         <template #default="{ node, data }">
@@ -93,7 +94,7 @@
               type="primary"
               color="rgba(0, 97, 255, 1)"
               @click="addMemberClick"
-              :disabled="isManage!=1"
+              :disabled="isManage != 1"
               plain
               >添加成员</el-button
             >
@@ -101,21 +102,25 @@
               type="primary"
               color="rgba(0, 97, 255, 1)"
               @click="moveMemberClick"
-              :disabled="isManage!=1"
+              :disabled="isManage != 1"
               plain
               >移动成员</el-button
             >
 
-            <el-dropdown >
+            <el-dropdown>
               <el-button color="rgba(0, 97, 255, 1)" plain>批量操作</el-button>
               <template #dropdown>
                 <el-dropdown-menu>
-                  <el-dropdown-item :disabled="isManage!=1" @click="addBatchClick"
+                  <el-dropdown-item
+                    :disabled="isManage != 1"
+                    @click="addBatchClick"
                     >批量导入</el-dropdown-item
                   >
-                  <!-- <el-dropdown-item @click="delBatchClick"
-                    >批量删除</el-dropdown-item
-                  > -->
+                  <el-dropdown-item
+                    :disabled="isManage != 1"
+                    @click="updateBatchClick"
+                    >批量更新</el-dropdown-item
+                  >
                 </el-dropdown-menu>
               </template>
             </el-dropdown>
@@ -130,7 +135,7 @@
               type="primary"
               color="rgba(0, 97, 255, 1)"
               @click="delDelClick"
-              :disabled="isManage!=1"
+              :disabled="isManage != 1"
               plain
               >勾选删除</el-button
             >
@@ -144,7 +149,7 @@
                 type="primary"
                 color="rgba(0, 97, 255, 1)"
                 @click="importExcel"
-                :disabled="isManage!=1"
+                :disabled="isManage != 1"
                 plain
                 >导出用户</el-button
               >
@@ -153,7 +158,7 @@
               type="primary"
               color="rgba(0, 97, 255, 1)"
               @click="DelRecordClick"
-              :disabled="isManage!=1"
+              :disabled="isManage != 1"
               plain
               >删除记录</el-button
             >
@@ -177,14 +182,19 @@
             <el-table-column align="center" prop="department" label="部门" />
             <el-table-column align="center" prop="cardNo" label="学号" />
             <el-table-column align="center" prop="img" label="人脸照片">
-              <template #default="{ row }" >
+              <template #default="{ row }">
                 <div class="img">
-                  <img @click="imgClick(row)" :src="row.headImage" alt="" />
+                  <img
+                    v-if="row.headImage"
+                    @click="imgClick(row)"
+                    :src="row.headImage"
+                    alt=""
+                  />
                 </div>
               </template>
             </el-table-column>
             <el-table-column align="center" label="操作" width="200">
-              <template #default="scope" v-if="isManage==1">
+              <template #default="scope" v-if="isManage == 1">
                 <div class="edit">
                   <div class="look" @click="editClick(scope.row)">编辑</div>
                 </div>
@@ -231,7 +241,10 @@
               <img src="@/assets/images/basicInfo.png" alt="" />
               <span>基本信息</span>
             </div>
-            <el-form-item label="学号 :" :prop="addMemberRuleForm.identity == 1? '': 'serialNumber'">
+            <el-form-item
+              label="学号 :"
+              :prop="addMemberRuleForm.identity == 1 ? '' : 'serialNumber'"
+            >
               <el-input
                 :disabled="addMemberTitle == '编辑成员' ? true : false"
                 v-model="addMemberRuleForm.serialNumber"
@@ -289,7 +302,10 @@
                 
               </el-tooltip> -->
             </el-form-item>
-            <el-form-item label="身份证号 :" :prop="addMemberRuleForm.identity == 1? '': 'icCard'">
+            <el-form-item
+              label="身份证号 :"
+              :prop="addMemberRuleForm.identity == 1 ? '' : 'icCard'"
+            >
               <el-input
                 v-model="addMemberRuleForm.icCard"
                 placeholder="请输入身份证号"
@@ -324,7 +340,10 @@
                 clearable
               />
             </el-form-item>
-            <el-form-item label="人脸照片 :" :prop="addMemberRuleForm.identity == 1 ? '' : 'facePhoto'">
+            <el-form-item
+              label="人脸照片 :"
+              :prop="addMemberRuleForm.identity == 1 ? '' : 'facePhoto'"
+            >
               <div class="facePhoto">
                 <div v-if="addMemberRuleForm.facePhoto">
                   <img
@@ -406,8 +425,7 @@
             <el-form-item
               v-if="addMemberRuleForm.identity != 3"
               label="时间组 :"
-              :prop="
-                addMemberRuleForm.identity == 1? '': 'timeGroupId'"
+              :prop="addMemberRuleForm.identity == 1 ? '' : 'timeGroupId'"
             >
               <el-select
                 v-model="addMemberRuleForm.timeGroupId"
@@ -593,16 +611,19 @@
       </div>
     </div>
     <!-- 批量添加 -->
-    <div class="addMember" v-if="addBatchShow">
+    <div
+      class="addMember"
+      v-if="addBatchShow"
+      v-loading="startImprot"
+      element-loading-text="人员信息导入中..."
+    >
       <div class="left">
         <img src="@/assets/images/close.png" alt="" @click="addBatchConcel" />
         <span class="add">批量添加</span>
       </div>
       <div class="content">
         <div class="form">
-          <div
-            class="imgUpload"
-          >
+          <div class="imgUpload">
             <el-upload
               style="width: 500px"
               class="upload-demo"
@@ -630,8 +651,8 @@
             </template> -->
             </el-upload>
             <el-upload
-            v-loading="imgLoading"
-            element-loading-text="图片导入中..."
+              v-loading="imgLoading"
+              element-loading-text="图片导入中..."
               style="width: 500px"
               class="img-upload-demo"
               drag
@@ -666,15 +687,31 @@
           /> -->
           <div class="startImport">
             <el-button
-           
+              v-if="!imgLoading && upload2File && uploadImgList"
               type="primary"
               color="rgba(0, 97, 255, 1)"
               @click="bulkImport"
               plain
-              :disabled="allImgShow"
               >开始导入</el-button
             >
             <span
+              v-else
+              type="primary"
+              color="rgba(236, 245, 255, 1)"
+              style="
+                display: inline-block;
+                width: 500px;
+                height: 42px;
+                text-align: center;
+                line-height: 42px;
+                color: rgb(160, 207, 255);
+                border: 1px solid #dcdfe6;
+                border-radius: 4px;
+              "
+              plain
+              >开始导入</span
+            >
+            <span
               style="
                 width: 120px;
                 margin-left: 20px;
@@ -684,7 +721,12 @@
               @click="resetImport"
               >重置</span
             >
-            <span class="downLoad" @click="downLoadtempAdd">下载模板</span>
+            <span class="downLoad" @click="downLoadtempAdd(1)"
+              >下载学生模板</span
+            >
+            <span class="downLoad" @click="downLoadtempAdd(2)"
+              >下载教师模板</span
+            >
           </div>
           <!-- <div class="tableTitle">导入历史</div>
           <div class="footer">
@@ -745,6 +787,97 @@
         </div>
       </div>
     </div>
+    <!-- 批量更新 -->
+    <div
+      class="addMember"
+      v-if="updateBatchShow"
+      v-loading="startUpdate"
+      element-loading-text="人员信息更新中..."
+    >
+      <div class="left">
+        <img
+          src="@/assets/images/close.png"
+          alt=""
+          @click="updateBatchConcel"
+        />
+        <span class="add">批量更新</span>
+      </div>
+      <div class="content">
+        <div class="form">
+          <div class="imgUpload">
+            <el-upload
+              style="width: 500px"
+              class="upload-demo"
+              ref="batchUpload"
+              drag
+              action="#"
+              :on-preview="handlePreviewUpdate"
+              :on-remove="handleRemoveUpdate"
+              :on-change="handleChangeUpdate"
+              :http-request="handleUploadUpdate"
+              :before-upload="beforeAvatarUploadUpdate"
+              :limit="1"
+              :on-exceed="handleExceedUpdate"
+            >
+              <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+              <div class="el-upload__text">
+                <span style="font-size: 20px">点击上传或拖拽文件</span><br />
+                <em>请按照标准模板填写信息</em><br />
+                <em>&nbsp;</em>
+              </div>
+              <!-- <template #tip>
+              <div class="el-upload__tip">
+                jpg/png files with a size less than 500kb
+              </div>
+            </template> -->
+            </el-upload>
+            <!-- <el-upload
+              v-loading="imgLoading"
+              element-loading-text="图片导入中..."
+              style="width: 500px"
+              class="img-upload-demo"
+              drag
+              action="#"
+              multiple
+              ref="allImgUpload"
+              :on-preview="handlePreviewImgUpload"
+              :on-remove="handleRemoveImgUpload"
+              :on-change="handleChangeImgUpload"
+              :http-request="handleUploadImgUpload"
+              :before-upload="beforeAvatarUploadImgUpload"
+              :on-success="handleSuccessImgUpload"
+            >
+              <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+              <div class="el-upload__text">
+                <span style="font-size: 20px">点击上传图片文件夹</span><br />
+                <em> 图片格式为jpeg/jpg/png格式且每张图片不能超过2MB </em><br />
+                <em> 上传文件夹中照片不要超过1000张 </em>
+              </div>
+            </el-upload> -->
+          </div>
+          <div class="startImport">
+            <el-button
+              type="primary"
+              color="rgba(0, 97, 255, 1)"
+              @click="bulkUpdateImport"
+              plain
+              >开始更新</el-button
+            >
+            <!-- <span
+              style="
+                width: 120px;
+                margin-left: 20px;
+                cursor: pointer;
+                color: rgba(0, 97, 255, 1);
+              "
+              @click="resetImport"
+              >重置</span
+            > -->
+            <span class="downLoad" @click="downLoadtempUpdate">下载模板</span>
+          </div>
+        </div>
+      </div>
+    </div>
     <!-- 删除记录页面 -->
     <div class="delRecord" v-if="delRecordShow">
       <div class="left">
@@ -1250,7 +1383,7 @@ const dataSource = ref([
 // 被点击的树形节点 id
 const treeNodeId = ref();
 const treeNodeName = ref();
-const isManage=ref()// 判断当前节点是否是编辑权限
+const isManage = ref(); // 判断当前节点是否是编辑权限
 
 // 主页面数据(----------------------------------------------)
 // 表格数据
@@ -1451,11 +1584,19 @@ const addBatch_pageSize = ref(7);
 const addBatch_total = ref(8); // 当前总数
 const upload2 = ref(); // ref 导入文件ref
 const allImgUpload = ref(); // ref 导入图片ref
-const allImgShow = ref(true) // 导入时判断图片和文件是否都有
-const imgLoading=ref(false)// 导入时判断图片全部导入成功
+
+const imgLoading = ref(false); // 导入时判断图片全部导入成功
+const startImprot = ref(false); // 开始导入时全屏加载
+
 const upload2File = ref(); // 批量导入的文件
 const uploadImgList = ref(); // 批量导入的图片列表
 
+// 批量更新 (-----------------------------------------)
+const updateBatchShow = ref(false);
+const batchUpload = ref(); // ref 更新文件ref
+const startUpdate = ref(false); // 开始更新时全屏加载
+const batchUpdateFile = ref(); // 批量更新的文件
+
 // 批量删除(--------------------------------------------)
 const delBatchShow = ref(false);
 const delBatchData = reactive({
@@ -1542,6 +1683,7 @@ const getList = async () => {
     departmentId: treeNodeId.value,
     name: searchInput.keyWord,
   };
+  // api.value='/smartApi'
   let res = await axios({
     method: "get",
     url: api.value + "/wanzai/api/smartUser/queryPageSmartUser",
@@ -1591,9 +1733,9 @@ const getDepartment = async () => {
     loading.value = false;
     if (treeNodeId.value && treeNodeName.value) {
     } else {
-        treeNodeId.value = JSON.parse(eds.decryptDes(res.data.data))[0].id;
-        treeNodeName.value = JSON.parse(eds.decryptDes(res.data.data))[0].name;
-        isManage.value=JSON.parse(eds.decryptDes(res.data.data))[0].isManage
+      treeNodeId.value = JSON.parse(eds.decryptDes(res.data.data))[0].id;
+      treeNodeName.value = JSON.parse(eds.decryptDes(res.data.data))[0].name;
+      isManage.value = JSON.parse(eds.decryptDes(res.data.data))[0].isManage;
       getList();
     }
     dataSource.value = JSON.parse(eds.decryptDes(res.data.data));
@@ -1617,7 +1759,7 @@ const getDepartment = async () => {
 const nodeClick = (node, data) => {
   treeNodeId.value = data.id;
   treeNodeName.value = data.name;
-  isManage.value=data.isManage
+  isManage.value = data.isManage;
   getList();
   console.log(data);
 };
@@ -2283,7 +2425,6 @@ const addBatchClick = () => {
   addBatchShow.value = true;
   homeShow.value = false;
   delRecordShow.value = false;
-  allImgShow.value=true // 将开始导入按钮禁用
   nextTick(() => {
     const Ele = document.querySelector(".img-upload-demo .el-upload__input");
     Ele["webkitdirectory"] = true;
@@ -2295,55 +2436,63 @@ const addBatchConcel = () => {
   delRecordShow.value = false;
   upload2File.value = "";
   uploadImgList.value = "";
-  allImgShow.value=true
   allImgUpload.value.clearFiles();
   upload2.value.clearFiles();
 };
 
-// 打开删除记录页面
-const DelRecordClick = async () => {
-  delRecordShow.value = true;
-  delBatchShow.value = false;
+// 批量更新 (------------------------------------------------------)
+const updateBatchClick = () => {
   homeShow.value = false;
-  addMemberTitle.value = "删除记录";
-  let data = {
-    currentPage: delRecordCurrentPage.value,
-    pageCount: delRecordPageSize.value,
-  };
-  let res = await axios({
-    method: "get",
-    url: api.value + "/wanzai/api/smartUser/queryUserDeletePage",
-    headers: {
-      token: sessionStorage.getItem("token"),
-      user_head: sessionStorage.getItem("userhead"),
-    },
-    params: data,
-  });
-  console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "删除记录分页");
-  if (res.data.code == 200) {
-    delRecordDatas.value = JSON.parse(eds.decryptDes(res.data.data)).list;
-    delRecordTotal.value = JSON.parse(eds.decryptDes(res.data.data)).totalCount;
-  } else {
-    ElMessage({
-      type: "error",
-      showClose: true,
-      message: res.data.message,
-      center: true,
-    });
-  }
-};
-// 关闭删除记录页面
-const delRecordClose = () => {
+  updateBatchShow.value = true;
   delRecordShow.value = false;
-  delBatchShow.value = false;
+};
+const updateBatchConcel = () => {
+  updateBatchShow.value = false;
   homeShow.value = true;
+  delRecordShow.value = false;
+  batchUpdateFile.value = "";
+  batchUpload.value.clearFiles();
 };
-
-// 批量导入模板下载
-const downLoadtempAdd = async () => {
+// 添加文件信息
+const handleChangeUpdate = async (file, fileLists) => {
+  console.log(file, "1111");
+  batchUpdateFile.value = file.raw;
+};
+// 可以获取文件参数
+const handleUploadUpdate = async (file) => {
+  console.log(file, "22222222");
+};
+// 上传文件时覆盖上一个文件
+const handleExceedUpdate = (files) => {
+  batchUpload.value.clearFiles();
+  const file = files[0];
+  file.uid = genFileId();
+  batchUpload.value.handleStart(file);
+};
+// 移出文件
+const handleRemoveUpdate = (uploadFile, uploadFiles) => {
+  batchUpdateFile.value = "";
+};
+// 更新时限制上传文件的大小
+const beforeAvatarUploadUpdate = (rawFile) => {
+  console.log(rawFile.type, "文件类型");
+  if (
+    rawFile.type !==
+    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+  ) {
+    ElMessage.error("文件格式必须为xlsx格式!");
+    return false;
+  } else if (rawFile.size / 1024 / 1024 > 100) {
+    ElMessage.error("文件的大小不能超过100MB!");
+    return false;
+  }
+  return true;
+};
+// 批量更新模板下载
+const downLoadtempUpdate = async () => {
   let res = await axios({
     method: "get",
-    url: api.value + "/wanzai/api/smartUser/downloadUserExcel",
+    url: api.value + "/wanzai/api/smartUser/downloadUpdateUserExcel",
     headers: {
       token: sessionStorage.getItem("token"),
       user_head: sessionStorage.getItem("userhead"),
@@ -2353,7 +2502,7 @@ const downLoadtempAdd = async () => {
   console.log(
     res,
     JSON.parse(eds.decryptDes(res.data.data)),
-    "批量导入模板下载"
+    "批量更新模板下载"
   );
 
   if (res.data.code == 200) {
@@ -2383,6 +2532,173 @@ const downLoadtempAdd = async () => {
     });
   }
 };
+// 开始批量更新按钮
+const bulkUpdateImport = async () => {
+  startUpdate.value = true;
+  console.log(batchUpdateFile.value, "更新文件");
+
+  const formData = new FormData();
+  formData.append("file", batchUpdateFile.value);
+
+  let res = await axios({
+    method: "post",
+    url: api.value + "/wanzai/api/smartUser/importExcelUpdateUsers",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: formData,
+  });
+  console.log(res, "确定批量更新");
+  if (res.data.code == 200) {
+    getList();
+    batchUpdateFile.value = "";
+    batchUpload.value.clearFiles();
+    startUpdate.value = false;
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    startUpdate.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+
+// 打开删除记录页面 (--------------------------------------------------)
+const DelRecordClick = async () => {
+  delRecordShow.value = true;
+  delBatchShow.value = false;
+  homeShow.value = false;
+  addMemberTitle.value = "删除记录";
+  let data = {
+    currentPage: delRecordCurrentPage.value,
+    pageCount: delRecordPageSize.value,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartUser/queryUserDeletePage",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "删除记录分页");
+  if (res.data.code == 200) {
+    delRecordDatas.value = JSON.parse(eds.decryptDes(res.data.data)).list;
+    delRecordTotal.value = JSON.parse(eds.decryptDes(res.data.data)).totalCount;
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+// 关闭删除记录页面
+const delRecordClose = () => {
+  delRecordShow.value = false;
+  delBatchShow.value = false;
+  homeShow.value = true;
+};
+
+// 批量导入模板下载 (-------------------------------------------------)
+const downLoadtempAdd = async (flag) => {
+  if (flag == 1) {
+    let res = await axios({
+      method: "get",
+      url: api.value + "/wanzai/api/smartUser/downloadUserExcel",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      // params: data,
+    });
+    console.log(
+      res,
+      JSON.parse(eds.decryptDes(res.data.data)),
+      "批量导入学生模板下载"
+    );
+
+    if (res.data.code == 200) {
+      var downloadPath = JSON.parse(eds.decryptDes(res.data.data));
+      // window.open(downloadPath);
+      window.location.href = downloadPath;
+      var downloadLink = document.createElement("a");
+      downloadLink.style.display = "none"; // 使其隐藏
+      downloadLink.href = downloadPath;
+      downloadLink.download = "";
+      downloadLink.click();
+      document.body.appendChild(downloadLink);
+      document.body.removeChild(downloadLink);
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    } else {
+      loading.value = false;
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    }
+  } else {
+    let res = await axios({
+      method: "get",
+      url: api.value + "/wanzai/api/smartUser/downloadTeacherExcel",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      // params: data,
+    });
+    console.log(
+      res,
+      JSON.parse(eds.decryptDes(res.data.data)),
+      "批量导入教师模板下载"
+    );
+
+    if (res.data.code == 200) {
+      var downloadPath = JSON.parse(eds.decryptDes(res.data.data));
+      // window.open(downloadPath);
+      window.location.href = downloadPath;
+      var downloadLink = document.createElement("a");
+      downloadLink.style.display = "none"; // 使其隐藏
+      downloadLink.href = downloadPath;
+      downloadLink.download = "";
+      downloadLink.click();
+      document.body.appendChild(downloadLink);
+      document.body.removeChild(downloadLink);
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    } else {
+      loading.value = false;
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    }
+  }
+};
 // 移出照片
 const handleRemove2 = (uploadFile, uploadFiles) => {
   // console.log(uploadFile.uid, uploadFiles);
@@ -2524,20 +2840,18 @@ const handleUploadImgUpload = async (file) => {
         uploadImgList.value =
           uploadImgList.value + "," + "https://" + data.Location;
         // 成功
-        successAllImg()
+        successAllImg();
       }
     }
   );
 };
-const successAllImg=()=>{
-  imgLoading.value=true
-  allImgShow.value=true
+const successAllImg = () => {
+  imgLoading.value = true;
   clearTimeout(timer);
-  timer =setInterval(()=>{
-    imgLoading.value=false
-    allImgShow.value=false
-  },1000)
-}
+  timer = setInterval(() => {
+    imgLoading.value = false;
+  }, 1000);
+};
 // 文件上传成功时的钩子
 const handleSuccessImgUpload = (response, uploadFile, uploadFiles) => {
   // console.log(response,uploadFile,uploadFiles,"上传成功");
@@ -2554,16 +2868,17 @@ const resetImport = () => {
 };
 // 批量导入按钮
 const bulkImport = async () => {
-  if (upload2File.value && uploadImgList.value) {
-  } else {
-    ElMessage({
-      type: "warning",
-      showClose: true,
-      message: "上传文件或图片不能为空",
-      center: true,
-    });
-    return false;
-  }
+  // if (upload2File.value && uploadImgList.value) {
+  // } else {
+  //   ElMessage({
+  //     type: "warning",
+  //     showClose: true,
+  //     message: "上传文件或图片不能为空",
+  //     center: true,
+  //   });
+  //   return false;
+  // }
+  startImprot.value = true;
   // uploadImgList.value = uploadImgList.value.slice(1);
   console.log(uploadImgList.value, "拼接好的图片地址");
   console.log(upload2File.value, "导入的文件");
@@ -2588,6 +2903,7 @@ const bulkImport = async () => {
     uploadImgList.value = "";
     allImgUpload.value.clearFiles();
     upload2.value.clearFiles();
+    startImprot.value = false;
     ElMessage({
       type: "success",
       showClose: true,
@@ -2595,6 +2911,7 @@ const bulkImport = async () => {
       center: true,
     });
   } else {
+    startImprot.value = false;
     ElMessage({
       type: "error",
       showClose: true,
@@ -2966,15 +3283,21 @@ const handleCurrentChange = (value) => {
   currentPage.value = value;
   getList();
 };
-
+const Enters = (e) => {
+  // console.log("按键:", e.key);
+  if (e.key == "Enter") {
+    searchBtn();
+  }
+};
 onBeforeMount(async () => {
+  document.addEventListener("keyup", Enters);
   api.value = store.state.user.api;
   getDepartment(); // 左边部门树形结构
   classDataList(); // 添加成员中 获取身份数据下拉、年级数据下拉、班级数据下拉
   postList(); // 职务数据
 });
 onUnmounted(() => {
-  // document.removeEventListener("keyup", Enters);
+  document.removeEventListener("keyup", Enters);
 });
 </script>