Pārlūkot izejas kodu

用户管理接口调整,新增请假管理,轨迹管理界面

hzj18279462576@163.com 2 gadi atpakaļ
vecāks
revīzija
a2a3c1b481

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 6 - 0
src/assets/icons/leave.svg


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 6 - 0
src/assets/icons/leave_s.svg


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4 - 0
src/assets/icons/track.svg


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4 - 0
src/assets/icons/track_s.svg


BIN
src/assets/trackImg.jpg


+ 59 - 12
src/layout/sidebar/SidevarItem.vue

@@ -118,32 +118,54 @@
           <svg-icon v-else iconName="safety" class="iconClass"></svg-icon>
           <span>{{ item.meta.title }}</span>
         </el-menu-item>
-        <!-- 访客预约 -->
+        <!-- 请假管理 -->
         <el-menu-item
           :index="`/wanzai/${item.name}`"
-          v-if="item.name == 'caller'"
+          v-if="item.name == 'leave'"
         >
           <svg-icon
-            v-if="activeIndex == '/wanzai/caller'"
-            iconName="caller_s"
+            v-if="activeIndex == '/wanzai/leave'"
+            iconName="leave_s"
             class="iconClass"
           ></svg-icon>
-          <svg-icon v-else iconName="caller" class="iconClass"></svg-icon>
+          <svg-icon v-else iconName="leave" class="iconClass"></svg-icon>
           <span>{{ item.meta.title }}</span>
         </el-menu-item>
-        <!-- 成绩管理 -->
+        <!-- 访客预约 -->
         <el-menu-item
           :index="`/wanzai/${item.name}`"
-          v-if="item.name == 'grade'"
+          v-if="item.name == 'caller'"
         >
           <svg-icon
-            v-if="activeIndex == '/wanzai/grade'"
-            iconName="grade_s"
+            v-if="activeIndex == '/wanzai/caller'"
+            iconName="caller_s"
             class="iconClass"
           ></svg-icon>
-          <svg-icon v-else iconName="grade" class="iconClass"></svg-icon>
+          <svg-icon v-else iconName="caller" class="iconClass"></svg-icon>
           <span>{{ item.meta.title }}</span>
         </el-menu-item>
+        <!-- 轨迹管理 -->
+        <el-sub-menu :index="item.name" v-if="item.name == 'track'">
+          <template #title>
+            <svg-icon
+              v-if="
+                activeIndex == '/wanzai/trackSearch' ||
+                activeIndex == '/wanzai/trafficRecord' ||
+                activeIndex == '/wanzai/attendanceRecord' ||
+                activeIndex == '/wanzai/safety'
+              "
+              iconName="track_s"
+              class="iconClass"
+            ></svg-icon>
+            <svg-icon v-else iconName="track" class="iconClass"></svg-icon>
+            <span>{{ item.meta.title }}</span>
+          </template>
+          <el-menu-item v-for="i in item.children" :index="`/wanzai/${i.name}`">
+            <template #title>
+              <span>{{ i.meta.title }}</span>
+            </template>
+          </el-menu-item>
+        </el-sub-menu>
         <!-- 综合素质评价 -->
         <el-sub-menu :index="item.name" v-if="item.name == 'evaluate'">
           <template #title>
@@ -307,6 +329,7 @@ const roleListChange = async () => {
       console.log("能监听到", roleList.value);
       {
         let classArr = [];
+        let trackArr = [];
         let evaluateArr = [];
         let dataExchangeArr = [];
         let systemArr = [];
@@ -324,9 +347,21 @@ const roleListChange = async () => {
               name: item.routeName,
               meta: { isAuth: true, title: item.name },
             });
-          } else if (
+          }else if (
+            item.routeName == "trackSearch" ||
+            item.routeName == "trafficRecord" ||
+            item.routeName == "attendanceRecord" ||
+            item.routeName == "safety"
+          ) {
+            trackArr.push({
+              name: item.routeName,
+              meta: { isAuth: true, title: item.name },
+            });
+          }
+           else if (
             item.routeName == "teacher" ||
-            item.routeName == "student"
+            item.routeName == "student" ||
+            item.routeName == "grade"
           ) {
             evaluateArr.push({
               name: item.routeName,
@@ -374,6 +409,18 @@ const roleListChange = async () => {
             children: classArr,
           });
         }
+        if (trackArr.length != 0) {
+          // arr.push({
+          //   name: "classGrade",
+          //   meta: { isAuth: true, title: "年级管理" },
+          //   children: classArr,
+          // });
+          arr.splice(8, 0, {
+            name: "track",
+            meta: { isAuth: true, title: "轨迹管理" },
+            children: trackArr,
+          });
+        }
         if (evaluateArr.length != 0) {
           arr.push({
             name: "evaluate",

+ 6 - 0
src/router/index.js

@@ -107,6 +107,12 @@ const routes = [
       //   meta: { isAuth: true, title: "成绩管理" },
       //   component: () => import("@/views/grade/grade.vue"),
       // },
+      {
+        path: "leave",
+        name: "leave",
+        meta: { isAuth: true, title: "请假管理" },
+        component: () => import("@/views/leave/leave.vue"),
+      },
       // {
       //   path: "teacher",
       //   name: "teacher",

+ 21 - 3
src/store/modules/user.js

@@ -78,10 +78,24 @@ const state = {
       name: "caller",
       meta: { isAuth: true, title: "访客预约" },
     },
-    // 成绩管理
+    // 轨迹管理
     {
-      name: "grade",
-      meta: { isAuth: true, title: "成绩管理" },
+      name: "evaluate",
+      meta: { isAuth: true, title: "综合素质评价" },
+      children: [
+        {
+          name: "teacher",
+          meta: { isAuth: true, title: "教师" },
+        },
+        {
+          name: "student",
+          meta: { isAuth: true, title: "学生" },
+        },// 成绩管理
+        {
+          name: "grade",
+          meta: { isAuth: true, title: "成绩管理" },
+        },
+      ],
     },
     // 综合素质评价
     {
@@ -95,6 +109,10 @@ const state = {
         {
           name: "student",
           meta: { isAuth: true, title: "学生" },
+        },// 成绩管理
+        {
+          name: "grade",
+          meta: { isAuth: true, title: "成绩管理" },
         },
       ],
     },

+ 978 - 0
src/views/attendanceRecord/attendanceRecord.vue

@@ -0,0 +1,978 @@
+<template>
+  <div class="content-box">
+    <div class="left">
+      <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
+      <span class="cameratxt">考勤记录</span>
+    </div>
+    <el-tabs v-model="recordType" class="demo-tabs" @tab-click="handleClick">
+      <el-tab-pane label="学生" :name="1">学生</el-tab-pane>
+      <el-tab-pane label="教师" :name="2">教师</el-tab-pane>
+    </el-tabs>
+    <div class="scrollId" v-if="recordType == 1">
+      <div class="middle">
+        <div class="filter">
+          <div class="condition">
+            <el-input
+              :clearable="true"
+              @blur="searchBtn"
+              @clear="searchBtn"
+              v-model.trim="searchInput.keyWord"
+              class="sel"
+              placeholder="请输入学生姓名或学号"
+            />
+          </div>
+          <el-button
+            color="rgba(0, 97, 255, 1)"
+            type="primary"
+            class="search"
+            @click="searchBtn"
+          >
+            <!-- <el-icon>
+              <Search />
+            </el-icon> -->
+            查询</el-button
+          >
+          <!-- 年级 -->
+          <div class="condition">
+            <span class="title">年级 : </span>
+            <el-select
+              v-model="searchInput.grade"
+              placeholder="请选择年级"
+              style="width: 160px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in gradeData"
+                :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-select
+              v-model="searchInput.department"
+              placeholder="请选择部门"
+              style="width: 160px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in departmentData"
+                :label="i.name"
+                :value="i.id"
+              />
+            </el-select>
+          </div>
+          <!-- 识别分组 -->
+          <div class="condition">
+            <span class="title">识别分组 : </span>
+            <el-select
+              v-model="searchInput.recognition"
+              placeholder="请选择识别分组"
+              style="width: 160px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in recognitionData"
+                :label="i.name"
+                :value="i.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <!-- 通行状态 -->
+          <div class="condition">
+            <span class="title">通行状态 : </span>
+            <el-select
+              v-model="searchInput.passType"
+              placeholder="请选择通行状态"
+              style="width: 160px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in passTypeData"
+                :label="i.name"
+                :value="i.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <!-- 时间 -->
+          <div class="condition">
+            <span class="title">时间 : </span>
+            <el-date-picker
+              v-model="searchInput.createTime"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="起始时间"
+              end-placeholder="结束时间"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              :prefix-icon="Calendar"
+              placeholder="请选择日期"
+              style="width: 280px"
+              @change="searchBtn"
+            />
+          </div>
+        </div>
+        <!-- 按钮列表 -->
+        <div class="gongneng">
+          <el-button
+            type="primary"
+            color="rgba(0, 97, 255, 1)"
+            plain
+            @click="addClick"
+            >记录导出</el-button
+          >
+        </div>
+      </div>
+      <div class="footer" v-loading="loading">
+        <el-table
+          :row-class-name="tableRowClassName"
+          :data="tableData.list"
+          @selection-change="handleSelectionChange"
+          style="width: 100%"
+          :header-cell-style="{
+            background: 'rgba(240, 243, 247, 1)',
+            height: '50px',
+            border: 0,
+          }"
+        >
+          <el-table-column
+            align="center"
+            type="index"
+            label="序号"
+            width="80"
+          />
+          <el-table-column align="center" prop="name" label="姓名" />
+          <el-table-column align="center" prop="grade" label="年级" />
+          <el-table-column align="center" prop="subjectStr" label="班级" />
+          <el-table-column align="center" prop="schoolClass" label="学号" />
+          <el-table-column align="center" prop="cardNo" label="图像" />
+          <el-table-column align="center" prop="examTypeStr" label="日期" />
+          <el-table-column align="center" prop="score" label="班次" />
+          <el-table-column align="center" prop="score" label="打卡时间" />
+          <el-table-column align="center" prop="score" label="状态" />
+          <!-- <el-table-column align="center" prop="status" label="操作">
+            <template #default="scope">
+              <div class="look" @click="editClick(scope.row)">编辑</div>
+            </template>
+          </el-table-column> -->
+        </el-table>
+      </div>
+
+      <!-- 分页组件 -->
+      <div class="pageSize">
+        <span></span>
+        <el-pagination
+          background
+          :current-page="studentData.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="studentData.pageSize"
+          layout="total, prev, pager, next, jumper, slot"
+          :total="studentData.total"
+          @update:page-size="handleSizeChange"
+          @update:current-page="handleCurrentChange"
+        />
+      </div>
+    </div>
+    <div class="scrollId" v-if="recordType == 2">
+      <div class="middle">
+        <div class="filter">
+          <div class="condition">
+            <el-input
+              :clearable="true"
+              @blur="searchBtn"
+              @clear="searchBtn"
+              v-model.trim="searchInput.keyWord"
+              class="sel"
+              placeholder="请输入姓名或工号"
+            />
+          </div>
+          <el-button
+            color="rgba(0, 97, 255, 1)"
+            type="primary"
+            class="search"
+            @click="searchBtn"
+          >
+            <!-- <el-icon>
+              <Search />
+            </el-icon> -->
+            查询</el-button
+          >
+          <!-- 部门 -->
+          <div class="condition">
+            <span class="title">部门 : </span>
+            <el-select
+              v-model="searchInput.department"
+              placeholder="请选择部门"
+              style="width: 160px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in departmentData"
+                :label="i.name"
+                :value="i.id"
+              />
+            </el-select>
+          </div>
+          <!-- 状态 -->
+          <div class="condition">
+            <span class="title">状态 : </span>
+            <el-select
+              v-model="searchInput.passType"
+              placeholder="请选择状态"
+              style="width: 160px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in passTypeData"
+                :label="i.name"
+                :value="i.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <!-- 时间 -->
+          <div class="condition">
+            <span class="title">时间 : </span>
+            <el-date-picker
+              v-model="searchInput.createTime"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="起始时间"
+              end-placeholder="结束时间"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              :prefix-icon="Calendar"
+              placeholder="请选择日期"
+              style="width: 280px"
+              @change="searchBtn"
+            />
+          </div>
+        </div>
+        <!-- 按钮列表 -->
+        <div class="gongneng">
+          <el-button
+            type="primary"
+            color="rgba(0, 97, 255, 1)"
+            plain
+            @click="addClick"
+            >记录导出</el-button
+          >
+        </div>
+      </div>
+      <div class="footer" v-loading="loading">
+        <el-table
+          :row-class-name="tableRowClassName"
+          :data="tableData.list"
+          @selection-change="handleSelectionChange"
+          style="width: 100%"
+          :header-cell-style="{
+            background: 'rgba(240, 243, 247, 1)',
+            height: '50px',
+            border: 0,
+          }"
+        >
+          <el-table-column
+            align="center"
+            type="index"
+            label="序号"
+            width="80"
+          />
+          <el-table-column align="center" prop="name" label="姓名" />
+          <el-table-column align="center" prop="grade" label="考勤组" />
+          <el-table-column align="center" prop="subjectStr" label="部门" />
+          <el-table-column align="center" prop="schoolClass" label="工号" />
+          <el-table-column align="center" prop="cardNo" label="职位" />
+          <el-table-column align="center" prop="examTypeStr" label="日期" />
+          <el-table-column align="center" prop="score" label="班次" />
+          <el-table-column align="center" prop="score" label="打卡时间" />
+          <el-table-column align="center" prop="score" label="状态" />
+          <!-- <el-table-column align="center" prop="status" label="操作">
+            <template #default="scope">
+              <div class="look" @click="editClick(scope.row)">编辑</div>
+            </template>
+          </el-table-column> -->
+        </el-table>
+      </div>
+
+      <!-- 分页组件 -->
+      <div class="pageSize">
+        <span></span>
+        <el-pagination
+          background
+          :current-page="teacherData.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="teacherData.pageSize"
+          layout="total, prev, pager, next, jumper, slot"
+          :total="teacherData.total"
+          @update:page-size="teacherSizeChange"
+          @update:current-page="teacherPageChange"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  reactive,
+  watch,
+  nextTick,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import vidiconsApi from "@/api/vidicons.js";
+import { dayjs } from "element-plus";
+import eds from "@/utils/eds.js";
+import lodash from "lodash";
+import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
+const router = useRouter();
+// 表格数据
+const loading = ref(false);
+const tableData = reactive({
+  list: [],
+});
+const gradeData = ref(); //年级下拉数据
+const classsData = ref(); //班级下拉数据
+const departmentData = ref([{ name: "发财部", id: 1 }]); //部门下拉数据
+const recognitionData = ref([
+  { name: "全部", id: 1 },
+  { name: "其他组", id: 2 },
+]); //识别分组数据
+const passTypeData = ref([{ name: "正常通行", id: 1 }]); //通行状态数据
+
+const searchInput = reactive({
+  keyWord: "",
+  grade: "", // 年级
+  class: "", // 班级
+  department: "", // 部门
+  recognition: "", // 识别分组
+  passType: "", // 通行状态
+  createTime: "", // 时间
+}); // 搜索按钮数据
+
+const studentData = reactive({
+  currentPage: ref(1), // 当前页
+  pageSize: ref(10),
+  total: ref(5), // 当前总数
+});
+
+const recordType = ref(2); // 判断是学生还是教师界面
+
+// 教师(------------------------------------------------------------)
+const teacherData = reactive({
+  keyWord: ref(''),
+  department: ref(''), // 部门
+  passType: ref(''), // 通行状态
+  createTime: ref(''), // 时间
+  currentPage: ref(1), // 当前页
+  pageSize: ref(10),
+  total: ref(5), // 当前总数
+});
+
+// 年级数据下拉
+const classDataList = async () => {
+  let grade = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartGrade/querySmartGrades",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    // params: data,
+  });
+  console.log(
+    grade,
+    JSON.parse(eds.decryptDes(grade.data.data)),
+    "年级下拉数据"
+  );
+  gradeData.value = JSON.parse(eds.decryptDes(grade.data.data));
+  // classInfoList()// 班级下拉数据
+};
+// 改变年级选择
+const yearClassChange = async (value) => {
+  console.log(value);
+  editRuleForm.class = "";
+  let arr = value.split("-");
+  classInfoList(arr[1]);
+};
+// 班级数据下拉
+const classInfoList = async (value) => {
+  let data = {
+    gradeId: value,
+  };
+  let classs = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartClass/querySmartClasss",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+
+  if (classs.data.code == 200) {
+    console.log(
+      classs,
+      JSON.parse(eds.decryptDes(classs.data.data)),
+      "班级下拉数据"
+    );
+    classsData.value = JSON.parse(eds.decryptDes(classs.data.data));
+  } else {
+    classsData.value = [];
+  }
+};
+// 部门下拉数据数据
+const departmentList = async (value) => {
+  if (searchInput.grade) {
+    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: value,
+      },
+    });
+    console.log(value);
+
+    console.log(
+      examType,
+      JSON.parse(eds.decryptDes(examType.data.data)),
+      "考试类型下拉数据"
+    );
+    if (examType.data.code == 200) {
+      examTypeData.value = JSON.parse(eds.decryptDes(examType.data.data));
+    }
+  } else {
+    examTypeData.value = [];
+  }
+};
+// 识别分组数据数据
+const recognitionList = async (value) => {
+  if (searchInput.grade) {
+    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: value,
+      },
+    });
+    console.log(value);
+
+    console.log(
+      examType,
+      JSON.parse(eds.decryptDes(examType.data.data)),
+      "考试类型下拉数据"
+    );
+    if (examType.data.code == 200) {
+      examTypeData.value = JSON.parse(eds.decryptDes(examType.data.data));
+    }
+  } else {
+    examTypeData.value = [];
+  }
+};
+// 通行状态数据
+const passTypeList = async (value) => {
+  if (searchInput.grade) {
+    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: value,
+      },
+    });
+    console.log(value);
+
+    console.log(
+      examType,
+      JSON.parse(eds.decryptDes(examType.data.data)),
+      "考试类型下拉数据"
+    );
+    if (examType.data.code == 200) {
+      examTypeData.value = JSON.parse(eds.decryptDes(examType.data.data));
+    }
+  } else {
+    examTypeData.value = [];
+  }
+};
+
+// 获取成绩分页数据 (----------------------------------------------------------------)
+const getList = async () => {
+  loading.value = true;
+  if (searchInput.grade) {
+    classInfoList(searchInput.grade.split("-")[1]);
+  } else {
+    searchInput.class = "";
+    classsData.value = [];
+  }
+  let data = {
+    currentPage: studentData.currentPage,
+    pageCount: studentData.pageSize,
+    name: searchInput.keyWord, // 用户名称
+  };
+  if (searchInput.grade) {
+    data.grade = searchInput.grade.split("-")[0];
+  }
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartScore/querySmartScorePage",
+    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) {
+    loading.value = false;
+    tableData.list = JSON.parse(eds.decryptDes(res.data.data)).list;
+    studentData.total = JSON.parse(eds.decryptDes(res.data.data)).totalCount;
+  } else {
+    loading.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+
+// 搜索功能
+const searchBtn = lodash.debounce(async () => {
+  getList();
+}, 300);
+// 搜索 清除年级数据时
+const nianJiClear = () => {
+  if (searchInput.grade) {
+    classInfoList(searchInput.grade.split("-")[1]);
+    getList();
+  } else {
+    classsData.value = [];
+  }
+};
+
+//导出功能 (-----------------------------------------------------------------)
+const importExcel = async () => {
+  let data = {
+    name: searchInput.keyWord,
+    semester: searchInput.semester,
+    grade: searchInput.grade,
+    schoolClass: searchInput.class,
+    subject: searchInput.subject,
+    examType: searchInput.examType,
+    MinScore: searchInput.gradeLow,
+    MaxScore: searchInput.gradeHigh,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartScore/smartUserExport",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+    responseType: "blob",
+  });
+  console.log(res, "导出用户");
+  if (res.status == 200) {
+    let name = `成绩表信息`;
+    var content = res.data;
+    var datas = new Blob([content]);
+    var downloadUrl = window.URL.createObjectURL(datas);
+    var anchor = document.createElement("a");
+    anchor.href = downloadUrl;
+    anchor.download = name + ".xlsx";
+    anchor.click();
+    window.URL.revokeObjectURL(datas);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: "导出成功",
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: "导出失败",
+      center: true,
+    });
+  }
+};
+
+// 表格斑马纹颜色修改
+const tableRowClassName = ({ row, rowIndex }) => {
+  if (rowIndex % 2 === 0) {
+    return "even";
+  } else if (rowIndex % 2 !== 0) {
+    return "odd";
+  }
+  return "";
+};
+const handleSizeChange=(value)=>{
+  studentData.pageSize=value
+  getList()
+}
+// 分页
+const handleCurrentChange = (value) => {
+  studentData.currentPage = value;
+  getList();
+};
+
+const teacherSizeChange=(value)=>{
+  teacherData.pageSize=value
+  getList()
+}
+// 分页
+const teacherPageChange = (value) => {
+  teacherData.currentPage = value;
+  getList();
+};
+
+onBeforeMount(async () => {
+  api.value = store.state.user.api;
+  getList();
+  classDataList();
+});
+onUnmounted(() => {
+  // document.removeEventListener("keyup", Enters);
+});
+</script>
+
+<style scoped lang="scss">
+.content-box {
+  min-width: 500px;
+  width: calc(100vw - 260px);
+  height: calc(100vh - 105px);
+  margin: 20px auto;
+  background-color: #fff;
+  color: #fff;
+  display: flex;
+  flex-direction: column;
+  box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
+
+  .left {
+    // width: calc(100wh - 40px);
+    display: flex;
+    align-items: center;
+    height: 60px;
+    margin: 0 30px;
+    border-bottom: 1px solid #ccc;
+    color: rgb(0, 0, 0);
+    font-size: 18px;
+    font-weight: 600;
+
+    span {
+      height: 60px;
+      display: block;
+      line-height: 60px;
+      margin-right: 20px;
+    }
+
+    .is_active {
+      color: rgba(111, 182, 184, 1);
+    }
+  }
+  :deep(.el-tabs) {
+    margin: 0 30px;
+    .el-tabs__header {
+      margin: 0;
+    }
+    .el-tabs__content {
+      display: none;
+    }
+  }
+  .scrollId {
+    overflow: auto;
+    height: calc(100% - 100px);
+    display: flex;
+    flex-direction: column;
+    .middle {
+      width: 96%;
+      margin: 0 auto;
+
+      color: #000;
+
+      // border-bottom: 1px solid rgb(231, 231, 231);
+      .filter {
+        display: flex;
+        flex-wrap: wrap;
+        align-items: center;
+        margin: 10px 0 0 0;
+
+        .search {
+          color: #fff;
+        }
+
+        .condition {
+          display: flex;
+          align-items: center;
+          margin: 10px 20px 10px 0;
+
+          :deep(.el-input .el-input__inner) {
+            font-size: 14px;
+          }
+          .title {
+            padding: 0 25px 0 0;
+          }
+        }
+        .grade {
+          .el-input {
+            :deep(.el-input__wrapper) {
+              box-shadow: none;
+            }
+          }
+          .grade_left {
+            border-top: 1px solid #dcdfe6;
+            border-bottom: 1px solid #dcdfe6;
+            border-left: 1px solid #dcdfe6;
+            border-top-left-radius: 4px;
+            border-bottom-left-radius: 4px;
+          }
+          .line {
+            display: block;
+            height: 32px;
+            line-height: 32px;
+            padding: 0 8px;
+            border-top: 1px solid #dcdfe6;
+            border-bottom: 1px solid #dcdfe6;
+          }
+          .grade_right {
+            border-top: 1px solid #dcdfe6;
+            border-bottom: 1px solid #dcdfe6;
+            border-right: 1px solid #dcdfe6;
+            border-top-right-radius: 4px;
+            border-bottom-right-radius: 4px;
+          }
+        }
+        .search {
+          margin-right: 20px;
+        }
+      }
+
+      .gongneng {
+        margin: 10px 0 10px 0;
+
+        span {
+          color: #fff;
+        }
+        .el-button {
+          margin-right: 10px;
+        }
+      }
+
+    }
+
+    .footer {
+      width: 96%;
+      flex: 1;
+      min-height: 300px;
+      margin: 10px auto 0;
+
+      .el-table--fit {
+        height: 100%;
+
+        :deep(.el-table__header-wrapper) {
+          background-color: #000;
+          font-size: 14px;
+
+          tr {
+            // color: #000;
+          }
+        }
+
+        :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;
+          border: 0;
+          .normal {
+            background-color: rgba(139, 195, 74, 1);
+            color: #fff;
+            padding: 4px;
+          }
+        }
+
+        .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;
+        // }
+      }
+    }
+
+    .pageSize {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      margin: 20px 30px;
+
+      span {
+        color: #000;
+      }
+
+      .el-pagination {
+        // width: 1600px;
+        :deep(.el-pagination__total) {
+          color: #000;
+        }
+
+        :deep(.el-pagination__goto) {
+          color: #000;
+        }
+
+        :deep(.el-pagination__classifier) {
+          color: #000;
+        }
+
+        :deep(.el-input__wrapper) {
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          box-shadow: none;
+        }
+
+        :deep(.el-pager li) {
+          margin: 0 5px;
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          background-color: transparent;
+        }
+
+        :deep(.el-pager li.is-active) {
+          // background-color: rgba(0, 97, 255, 0.8);
+          border: 1px solid rgba(0, 97, 255, 1);
+          color: rgba(0, 97, 255, 1);
+        }
+
+        :deep(.btn-prev) {
+          margin-right: 5px;
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          background-color: transparent;
+        }
+
+        :deep(.btn-next) {
+          margin-left: 5px;
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          background-color: transparent;
+        }
+      }
+    }
+  }
+}
+
+.el-input {
+  width: 192px;
+}
+</style>
+<style lang="scss">
+//添加成员 联系人下拉框样式
+.gradeSelect {
+  // border: 1px solid red;
+  .el-select-dropdown__wrap {
+    height: 200px;
+    // border: 1px solid red;
+  }
+}
+.el-popper {
+  .addStudentMore {
+    text-align: center;
+  }
+}
+</style>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1039 - 273
src/views/caller/caller.vue


+ 781 - 0
src/views/grade/grade.vue

@@ -185,6 +185,13 @@
             @click="addClick"
             >新增成绩</el-button
           >
+          <el-button
+            type="primary"
+            color="rgba(0, 97, 255, 1)"
+            plain
+            @click="subsectionClick"
+            >分段设置</el-button
+          >
           <el-button type="danger" @click="delClick" plain>勾选删除</el-button>
         </div>
       </div>
@@ -235,6 +242,223 @@
         />
       </div>
 
+      <!-- 分段设置 -->
+      <el-dialog
+        class="subsectionDialog"
+        v-model="subsectionVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        title="分段设置"
+        align-center
+        width="1100"
+        :before-close="cancelSubsection"
+      >
+        <div class="selObject">
+          <el-button
+            type="primary"
+            color="rgba(0, 97, 255, 1)"
+            plain
+            @click="subsectionAddClick"
+            >添加分段</el-button
+          >
+        </div>
+        <el-table
+          :row-class-name="tableRowClassName"
+          :data="subsectionData.list"
+          :header-cell-style="{
+            background: 'rgba(240, 243, 247, 1)',
+            height: '50px',
+          }"
+        >
+          <el-table-column
+            width="80"
+            align="center"
+            type="index"
+            label="序号"
+          />
+          <el-table-column
+            width="160"
+            align="center"
+            prop="gradeName"
+            label="年级"
+          />
+          <el-table-column align="center" prop="termName" label="学期" />
+          <el-table-column
+            align="center"
+            prop="examTypesName"
+            label="考试类型"
+          />
+          <el-table-column align="center" prop="createTime" label="创建时间" />
+          <el-table-column align="center" prop="status" label="操作">
+            <template #default="{ index, row }">
+              <div class="option">
+                <div class="edit" @click="subsectionEditClick(row)">编辑</div>
+                <div class="edit" @click="subsectionDel(row)">删除</div>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="pageSize">
+          <span></span>
+          <el-pagination
+            background
+            :current-page="subsectionPage"
+            :page-size="subsectionSize"
+            layout="total, prev, pager, next, jumper, slot"
+            :total="subsectionTotal"
+            @update:current-page="subsectionCurrentChange"
+          />
+        </div>
+      </el-dialog>
+
+      <!-- 分段设置中的 添加分段 -->
+      <el-dialog
+        class="addSubsectionDialog"
+        v-model="addSubsectionVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :title="addSubsectionTitle"
+        align-center
+        width="680"
+        :before-close="cancelAddSubsection"
+      >
+        <div class="criterion">
+          <el-form
+            ref="addSubsectionRef"
+            :model="addSubsectionRuleForm"
+            :rules="addSubsectionRules"
+            label-width="90px"
+            class="demo-ruleForm"
+            :size="formSize"
+            label-position="right"
+            status-icon
+          >
+            <el-form-item label="年级 :" prop="grade">
+              <el-select
+                v-model="addSubsectionRuleForm.grade"
+                :reserve-keyword="false"
+                placeholder="请选择年级"
+                style="width: 400px"
+                @change="addSubsectionGradeChange"
+              >
+                <el-option
+                  :label="i.name"
+                  :value="i.id"
+                  v-for="i in subsectionGradeData"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="学期 :" prop="term">
+              <el-select
+                v-model="addSubsectionRuleForm.term"
+                placeholder="请选择学期"
+                style="width: 400px"
+              >
+                <el-option
+                  :label="i.name"
+                  :value="i.id"
+                  v-for="i in subsectionSemesterData"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="考试类型 :" prop="type">
+              <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="请先选择年级"
+                placement="bottom"
+              >
+                <el-select
+                  v-model="addSubsectionRuleForm.type"
+                  placeholder="请先选择考试类型"
+                  multiple
+                  style="width: 400px"
+                >
+                  <el-option
+                    :label="i.name"
+                    :value="i.id"
+                    v-for="i in subsectionExamTypeData"
+                  />
+                </el-select>
+              </el-tooltip>
+              <span style="margin-left: 10px; font-size: 12px">多选</span>
+            </el-form-item>
+            <div class="selObject">
+              <div class="slider-demo-block">
+                <span class="demonstration">及格线 :</span>
+                <el-slider v-model="addSubsectionRuleForm.passScore" />
+                <span class="percent"
+                  >≥ {{ addSubsectionRuleForm.passScore }} %</span
+                >
+              </div>
+            </div>
+            <div class="selObject">
+              <div class="slider-demo-block">
+                <span class="demonstration">良好线 :</span>
+                <el-slider v-model="addSubsectionRuleForm.good" />
+                <span class="percent"
+                  >≥ {{ addSubsectionRuleForm.good }} %</span
+                >
+              </div>
+            </div>
+            <div class="selObject">
+              <div class="slider-demo-block">
+                <span class="demonstration">优秀线 :</span>
+                <el-slider v-model="addSubsectionRuleForm.excellent" />
+                <span class="percent"
+                  >≥ {{ addSubsectionRuleForm.excellent }} %</span
+                >
+              </div>
+            </div>
+            <el-table
+              :row-class-name="tableRowClassName"
+              :data="subsectionSubjectData"
+              :header-cell-style="{
+                background: 'rgba(240, 243, 247, 1)',
+                height: '50px',
+              }"
+            >
+              <el-table-column
+                align="center"
+                type="index"
+                label="序号"
+                width="80"
+              />
+              <el-table-column align="center" prop="subjectName" label="科目">
+              </el-table-column>
+              <el-table-column align="center" prop="score" label="分制">
+                <template #default="{ row, index }">
+                  <el-input
+                    :clearable="true"
+                    @clear="searchBtn"
+                    v-model.trim="row.score"
+                    class="grade_left"
+                    placeholder="输入分数"
+                    style="width: 150px"
+                  />
+                </template>
+              </el-table-column>
+              <!-- <el-table-column align="center" prop="status" label="操作">
+              <template #default="{ index, row }">
+                <div class="edit" @click="editScoreScope(index, row)">编辑</div>
+              </template>
+            </el-table-column> -->
+            </el-table>
+            <el-form-item class="options">
+              <el-button
+                color="rgba(41, 109, 227, 1)"
+                class="queding"
+                type="primary"
+                @click="confirmAddSubsection(addSubsectionRef)"
+              >
+                确认
+              </el-button>
+              <el-button @click="cancelAddSubsection">取消</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-dialog>
+
       <!-- 编辑按钮 -->
       <el-dialog
         class="editDialog"
@@ -614,6 +838,40 @@ const studentInput = ref(); // 学生分页下拉框中的搜索字段
 const studentExamTypeDatas = ref(); // 编辑中的考试类型数据
 const studentSubDatas = ref(); // 编辑中的学科数据
 
+// 分段设置
+const subsectionVisible = ref(false);
+const subsectionData = reactive({ list: [] });
+const subsectionPage = ref(1);
+const subsectionSize = ref(8);
+const subsectionTotal = ref(12);
+
+// 分段设置中的 添加分段
+const addSubsectionRef = ref();
+const addSubsectionTitle = ref("添加分段");
+const addSubsectionVisible = ref(false);
+const addSubsectionData = reactive({
+  list: [{}, {}, {}],
+}); // 分段学科数据
+const subsectionGradeData = ref(); // 年级数据
+const subsectionSemesterData = ref(); // 学期数据
+const subsectionExamTypeData = ref(); // 考试类型数据
+const subsectionSubjectData = ref(); // 学科数据
+const addSubsectionRuleForm = reactive({
+  grade: "", // 考核年级
+  term: "", // 考核学期
+  type: "", // 考核考试类型
+  passScore: 0, // 及格线
+  good: 0, // 良好
+  excellent: 0, // 优秀线
+  id: "",
+});
+// 表单验证
+const addSubsectionRules = reactive({
+  grade: [{ required: true, message: "年级不能为空", trigger: "blur" }],
+  term: [{ required: true, message: "学期不能为空", trigger: "blur" }],
+  type: [{ required: true, message: "考试类型不能为空", trigger: "blur" }],
+});
+
 // 编辑功能
 const titleDialog = ref("");
 const editVisible = ref(false);
@@ -912,6 +1170,329 @@ const gradeClear = () => {
   getList();
 };
 
+// 分段设置 (-----------------------------------------------------)
+// 分段表格数据
+const subsectionreqData = async () => {
+  let data = {
+    currentPage: subsectionPage.value,
+    pageCount: subsectionSize.value,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartSection/queryPageSmartUser",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "分段数据");
+  if (res.data.code == 200) {
+    res.data.data.list.forEach((i) => {
+      let examTypesName = [];
+      i.examTypes.forEach((item) => {
+        examTypesName.push(item.name);
+      });
+      i.examTypesName = examTypesName.join(",");
+    });
+    subsectionData.list = res.data.data.list;
+    subsectionTotal.value = res.data.data.totalCount;
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+const subsectionClick = async () => {
+  subsectionVisible.value = true;
+  subsectionreqData();
+};
+const cancelSubsection = () => {
+  subsectionVisible.value = false;
+};
+// 分页
+const subsectionCurrentChange = (value) => {
+  // console.log(value);
+  subsectionPage.value = value;
+};
+// 分段设置中 添加分段 (-------------------------------------------------)
+// 获取学期下拉
+const subsectionSemesterList = async () => {
+  let semester = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartScore/querySmartSemesters",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    // params: data,
+  });
+  console.log(
+    semester,
+    JSON.parse(eds.decryptDes(semester.data.data)),
+    "学期下拉数据"
+  );
+  subsectionSemesterData.value = JSON.parse(eds.decryptDes(semester.data.data));
+};
+// 年级数据下拉
+const subsectionClassDataList = async () => {
+  let grade = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartGrade/querySmartGrades",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    // params: data,
+  });
+  console.log(
+    grade,
+    JSON.parse(eds.decryptDes(grade.data.data)),
+    "年级下拉数据"
+  );
+  subsectionGradeData.value = JSON.parse(eds.decryptDes(grade.data.data));
+  // classInfoList()// 班级下拉数据
+};
+// 考试类型数据
+const subsectionExamTypeList = async (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: value,
+    },
+  });
+  if (examType.data.code == 200) {
+    let data = eds.decryptDes(examType.data.data);
+    subsectionExamTypeData.value = JSON.parse(data);
+    console.log(JSON.parse(data), "考试类型下拉数据");
+  }
+};
+// 学科数据
+const subsectionSubjectList = async (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: value,
+    },
+  });
+
+  if (subject.data.code == 200) {
+    let data = JSON.parse(eds.decryptDes(subject.data.data));
+    data.forEach((item) => {
+      item.score = "";
+      item.subjectName = item.name;
+    });
+    subsectionSubjectData.value = data;
+    console.log(data, "学科下拉数据");
+  }
+};
+// 改变年级 改变考试类型
+const addSubsectionGradeChange = async (value) => {
+  addSubsectionRuleForm.type = [];
+  subsectionExamTypeList(value);
+  subsectionSubjectList(value);
+};
+// 添加分段
+const subsectionAddClick = () => {
+  addSubsectionTitle.value = "添加分段";
+  addSubsectionVisible.value = true;
+  addSubsectionRuleForm.grade = "";
+  addSubsectionRuleForm.term = "";
+  addSubsectionRuleForm.type = "";
+  addSubsectionRuleForm.passScore = 0;
+  addSubsectionRuleForm.good = 0;
+  addSubsectionRuleForm.excellent = 0;
+  addSubsectionRuleForm.id = 0;
+  subsectionSubjectData.value=[]// 新增的时候将学科数据置空
+  subsectionClassDataList(); // 年级数据
+  subsectionSemesterList(); // 学期数据
+};
+// 分段设置中 编辑分段
+const subsectionEditClick = (row) => {
+  addSubsectionTitle.value = "编辑分段";
+  addSubsectionVisible.value = true;
+  console.log(row, "编辑分段");
+  subsectionClassDataList(); // 年级数据
+  subsectionSemesterList(); // 学期数据
+  addSubsectionRuleForm.grade = row.gradeId;
+  subsectionExamTypeList(row.gradeId); // 考试类型
+  addSubsectionRuleForm.term = row.termId;
+  let examId = [];
+  row.examTypes.forEach((item) => {
+    examId.push(Number(item.id));
+  });
+  addSubsectionRuleForm.type = examId;
+  addSubsectionRuleForm.passScore = row.passLine;
+  addSubsectionRuleForm.good = row.goodLine;
+  addSubsectionRuleForm.excellent = row.excellentLine;
+  subsectionSubjectData.value = row.details;
+  addSubsectionRuleForm.id = row.id;
+};
+// 确定编辑
+const confirmAddSubsection = (formEl) => {
+  if (!formEl) return;
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let arr = [];
+      if (subsectionSubjectData.value) {
+        subsectionSubjectData.value.forEach((item) => {
+          arr.push({
+            subjectId: item.id,
+            subjectName: item.subjectName,
+            score: item.score,
+          });
+        });
+        let nameArr = [];
+        let flag = false;
+        arr.forEach((item) => {
+          if (!item.score) {
+            flag = true;
+            nameArr.push(item.subjectName);
+          }
+        });
+        if (flag) {
+          let str = nameArr.join(",");
+          ElMessage({
+            type: "warning",
+            showClose: true,
+            message: `${str}分数不能为空`,
+            center: true,
+          });
+          return false;
+        }
+      }
+      let data = {
+        gradeId: addSubsectionRuleForm.grade,
+        termId: addSubsectionRuleForm.term,
+        examTypes: addSubsectionRuleForm.type,
+        passLine: addSubsectionRuleForm.passScore,
+        goodLine: addSubsectionRuleForm.good,
+        excellentLine: addSubsectionRuleForm.excellent,
+        details: arr,
+      };
+      if (addSubsectionRuleForm.id) {
+        data.id=addSubsectionRuleForm.id
+        console.log(data, "编辑分段参数");
+        let res = await axios({
+          method: "post",
+          url: api.value + "/wanzai/api/smartSection/updateSection",
+          headers: {
+            token: sessionStorage.getItem("token"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        console.log(res, "编辑分段");
+        if (res.data.code == 200) {
+          addSubsectionVisible.value = false;
+          addSubsectionRef.value.resetFields();
+          subsectionreqData();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      } else {
+        console.log(data, "添加分段参数");
+        let res = await axios({
+          method: "post",
+          url: api.value + "/wanzai/api/smartSection/insertSection",
+          headers: {
+            token: sessionStorage.getItem("token"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        console.log(res, "新增分段");
+        if (res.data.code == 200) {
+          addSubsectionVisible.value = false;
+          addSubsectionRef.value.resetFields();
+          subsectionreqData();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      }
+    }
+  });
+};
+// 分段设置中 删除分段
+const subsectionDel =async (row) => {
+  let data = {
+    id:row.id,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartSection/deleteSmartSection",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "删除分段成功");
+  if (res.data.code == 200) {
+    if (
+      subsectionData.list.length==1 &&
+      subsectionPage.value != 1
+    ) {
+      subsectionPage.value = subsectionPage.value - 1;
+    }
+    subsectionreqData()
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+// 分段设置中 取消分段
+const cancelAddSubsection = () => {
+  addSubsectionVisible.value = false;
+  addSubsectionRef.value.resetFields();
+  addSubsectionRuleForm.id = "";
+};
+
 // 添加按钮 (-------------------------------------------)
 const addClick = async () => {
   titleDialog.value = "新增成绩";
@@ -1764,6 +2345,206 @@ onUnmounted(() => {
       // }
     }
   }
+  // 分段设置
+  :deep(.subsectionDialog) {
+    border-radius: 11px;
+    .el-dialog__header {
+      border-radius: 11px 11px 0 0;
+      background: rgba(237, 241, 245, 1);
+      font-weight: 600;
+      margin: 0;
+      .el-dialog__headerbtn {
+        outline: none;
+      }
+    }
+    .el-dialog__body {
+      padding: 0 30px 20px;
+      .selObject {
+        padding: 10px 0;
+      }
+      .el-table--fit {
+        height: 500px;
+        .el-table__header-wrapper {
+          font-size: 14px;
+          .cell {
+            color: #000;
+          }
+        }
+
+        .el-table__row {
+          height: 50px;
+          font-size: 14px;
+          color: #000;
+
+          td {
+            padding: 0;
+          }
+          .option {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            .edit {
+              color: rgba(0, 97, 255, 1);
+              cursor: pointer;
+              padding-right: 10px;
+            }
+          }
+        }
+      }
+      .pageSize {
+        margin-top: 15px;
+      }
+      .options {
+        margin: 30px 20px 0 0;
+        width: 100%;
+        display: flex;
+        flex-direction: row-reverse;
+
+        .queding {
+          color: #fff;
+          margin-left: 15px;
+        }
+      }
+    }
+  }
+
+  // 分段设置 中的 添加分段
+  :deep(.addSubsectionDialog) {
+    //   height: 420px;
+    border-radius: 11px;
+    .el-dialog__header {
+      border-radius: 11px 11px 0 0;
+      background: rgba(237, 241, 245, 1);
+      font-weight: 600;
+      margin: 0;
+      .el-dialog__headerbtn {
+        outline: none;
+      }
+    }
+    .el-dialog__body {
+      padding: 15px 30px 30px 30px;
+      .criterion {
+        .selObject {
+          .slider-demo-block {
+            max-width: 600px;
+            display: flex;
+            align-items: center;
+          }
+          .slider-demo-block .el-slider {
+            margin-top: 0;
+            margin-left: 12px;
+          }
+          .slider-demo-block .demonstration {
+            font-size: 14px;
+            color: #606266;
+            line-height: 44px;
+            width: 80px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            margin-bottom: 0;
+          }
+          .slider-demo-block .demonstration + .el-slider {
+            flex: 0 0 60%;
+          }
+          .slider-demo-block .percent {
+            font-size: 14px;
+            color: var(--el-text-color-secondary);
+            line-height: 44px;
+            flex: 1;
+            margin-left: 20px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            margin-bottom: 0;
+          }
+        }
+        .el-table--fit {
+          height: 360px;
+          .el-table__header-wrapper {
+            font-size: 14px;
+            tr {
+              th {
+                height: 40px !important;
+              }
+            }
+            .cell {
+              color: #000;
+            }
+          }
+
+          .el-table__row {
+            height: 40px;
+            font-size: 14px;
+            color: #000;
+
+            td {
+              padding: 0;
+              border-right: 1px solid rgba(230, 230, 230, 1);
+              &:nth-child(1) {
+                border-left: 1px solid rgba(230, 230, 230, 1);
+              }
+            }
+            .edit {
+              color: rgba(0, 97, 255, 1);
+              cursor: pointer;
+            }
+            .grade {
+              display: flex;
+              justify-content: center;
+              .el-input {
+                .el-input__wrapper {
+                  box-shadow: none;
+                }
+              }
+              .grade_left {
+                border-top: 1px solid #dcdfe6;
+                border-bottom: 1px solid #dcdfe6;
+                border-left: 1px solid #dcdfe6;
+                border-top-left-radius: 4px;
+                border-bottom-left-radius: 4px;
+              }
+              .line {
+                display: block;
+                height: 32px;
+                line-height: 32px;
+                padding: 0 8px;
+                border-top: 1px solid #dcdfe6;
+                border-bottom: 1px solid #dcdfe6;
+              }
+              .grade_right {
+                border-top: 1px solid #dcdfe6;
+                border-bottom: 1px solid #dcdfe6;
+                border-right: 1px solid #dcdfe6;
+                border-top-right-radius: 4px;
+                border-bottom-right-radius: 4px;
+              }
+            }
+            &:hover {
+              td {
+                // background-color: rgba(223, 236, 254, 0.6);
+                background-color: transparent;
+              }
+            }
+          }
+        }
+      }
+      .options {
+        margin: 30px 20px 0 0;
+        width: 100%;
+        display: flex;
+        flex-direction: row-reverse;
+        .el-form-item__content {
+          flex: none;
+        }
+        .queding {
+          color: #fff;
+          margin-left: 15px;
+        }
+      }
+    }
+  }
+
   // 编辑按钮
   :deep(.editDialog) {
     //   height: 420px;

+ 64 - 49
src/views/home/home.vue

@@ -435,39 +435,66 @@ const cartogram = async () => {
 };
 // 能耗趋势图(----------------------------)
 const cartogram2 = async () => {
-  // let data = {
-  //   state: tabIndex2.value,
-  // };
-  // let res = await axios({
-  //   method: "get",
-  //   url: api.value + "/repairRecord/repairTrend",
-  //   headers: {
-  //     token: sessionStorage.getItem("token"),
-  //     user_head: sessionStorage.getItem("userhead"),
-  //   },
-  //   params: data,
-  // });
-  // console.log(res, "折现 报修趋势分析");
-  // let dayData = []; // 年份
-  // let newTitle = ""; // 年比(今年标题)
-  // let oldTitle = ""; // 年比(去年标题)
-  // // 月份
-  // let monthData = [];
-  // for (let j = 1; j <= 31; j++) {
-  //   monthData.push(j);
-  // }
-  // let oldData = []; // 上-级数据
-  // let newData = []; // 当前数据
-  // let xname = "";
-  // if (res.data.code == 200) {
-  // } else {
-  //   ElMessage({
-  //     type: "error",
-  //     showClose: true,
-  //     message: res.data.message,
-  //     center: true,
-  //   });
-  // }
+  let eleData=[]
+  let water=[]
+  let name=[]
+ {
+  let data=new FormData();
+  data.append('type',0)
+  let res = await axios({
+    method: "post",
+    url: api.value + "/wanzai/api/driver/getEnergyDay",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data:data
+  });
+  console.log(res, "水 能耗趋势");
+  if (res.data.code == 200) {
+    res.data.data.forEach(item=>{
+      water.push(item.data[0].num)
+      name.push(item.date)
+    })
+    console.log(water,name);
+    
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+ }
+ {
+  let data=new FormData();
+  data.append('type',1)
+  let res = await axios({
+    method: "post",
+    url: api.value + "/wanzai/api/driver/getEnergyDay",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data:data
+  });
+  console.log(res, "电 能耗趋势");
+  if (res.data.code == 200) {
+    res.data.data.forEach(item=>{
+      eleData.push(item.data[0].num)
+    })
+    console.log(water,name);
+    
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+ }
   // 折现统计图
   echarts2.value = markRaw(echarts.init(document.getElementById("broken")));
   echarts2.value.setOption({
@@ -521,19 +548,7 @@ const cartogram2 = async () => {
           type: "solid",
         },
       },
-      data: [
-        "11.20",
-        "11.21",
-        "11.22",
-        "11.23",
-        "11.24",
-        "11.25",
-        "11.26",
-        "11.27",
-        "11.28",
-        "11.29",
-        "11.30",
-      ],
+      data: name,
     },
     yAxis: [
       {
@@ -604,7 +619,7 @@ const cartogram2 = async () => {
         areaStyle: {
           color: "rgba(111, 182, 184, 0.2)",
         },
-        data: [10, 20, 70, 10, 23, 50, 6, 30, 20, 14, 22],
+        data: water,
       },
       {
         name: "电",
@@ -625,7 +640,7 @@ const cartogram2 = async () => {
         areaStyle: {
           color: "rgba(30, 125, 251, 0.2)",
         },
-        data: [15, 20, 19, 30, 11, 20, 11, 9, 12, 32, 10],
+        data: eleData,
       },
     ],
   });
@@ -1210,7 +1225,7 @@ onUnmounted(() => {
       // 应用入口
       .apply {
         width: 100%;
-        min-width: 1240px;
+     
         height: 165px;
         border-radius: 8px;
         background-color: #fff;

+ 859 - 0
src/views/leave/leave.vue

@@ -0,0 +1,859 @@
+<template>
+  <div class="content-box">
+    <div class="left">
+      <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
+      <div class="left_title">请假管理</div>
+    </div>
+    <div class="middle">
+      <div class="filter">
+        <div class="condition">
+          <span>姓名&nbsp;&nbsp;</span>
+          <el-input
+            :clearable="true"
+            @clear="searchBtn"
+            v-model="searchInput.keyWord"
+            style="width: 180px"
+            placeholder="请输入姓名"
+          />
+        </div>
+        <div class="condition">
+          <span>学号&nbsp;&nbsp;</span>
+          <el-input
+            :clearable="true"
+            @clear="searchBtn"
+            v-model="searchInput.studentId"
+            style="width: 180px"
+            placeholder="请输入学号"
+          />
+        </div>
+        <el-button
+          color="rgba(0, 97, 255, 1)"
+          type="primary"
+          class="search condition"
+          @click="searchBtn"
+        >
+          查询</el-button
+        >
+        <div class="condition">
+          <span>班级&nbsp;&nbsp;</span>
+          <el-select
+            v-model="searchInput.class"
+            placeholder="请选择班级"
+            style="width: 190px"
+            filterable
+            remote
+            remote-show-suffix
+            :remote-method="classDataMethod"
+            @change="searchBtn"
+            :clearable="true"
+          >
+            <el-option
+              v-for="i in classData"
+              :label="`${i.className}`"
+              :value="i.id"
+            />
+          </el-select>
+        </div>
+        <div class="condition">
+          <span>状态&nbsp;&nbsp;</span>
+          <el-select
+            v-model="searchInput.type"
+            placeholder="请选择状态"
+            style="width: 160px"
+            @change="searchBtn"
+            :clearable="true"
+          >
+            <el-option label="全部" value="" />
+            <el-option label="未核销" value="0" />
+            <el-option label="已核销" value="1" />
+          </el-select>
+        </div>
+        <div class="condition">
+          <span>创建时间&nbsp;&nbsp;</span>
+          <el-date-picker
+            v-model="searchInput.createTime"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="起始时间"
+            end-placeholder="结束时间"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            :prefix-icon="Calendar"
+            placeholder="请选择日期"
+            style="width: 280px"
+            @change="searchBtn"
+          />
+        </div>
+      </div>
+      <!-- 按钮列表 -->
+      <div class="gongneng">
+        <el-button
+          type="primary"
+          plain
+          color="rgba(0, 97, 255, 1)"
+          @click="editClick"
+          ><span>请假配置</span></el-button
+        >
+      </div>
+    </div>
+    <div class="scroll">
+      <div class="footer" v-loading="loading">
+        <el-table
+          :row-class-name="tableRowClassName"
+          :data="tableData.list"
+          @selection-change="handleSelectionChange"
+          style="width: 100%"
+          :header-cell-style="{
+            background: 'rgba(240, 243, 247, 1)',
+            height: '50px',
+            border: 0,
+          }"
+        >
+          <!-- <el-table-column align="center" fixed type="selection" /> -->
+          <el-table-column
+            align="center"
+            width="80"
+            label="序号"
+            type="index"
+          />
+          <el-table-column align="center" prop="userName" label="头像">
+            <template #default="{ row }">
+              <img @click="imgClick(row)" style="width: 60px; height: 60px" :src="row.image" alt="" />
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="className" label="班级" />
+          <el-table-column
+            align="center"
+            prop="xwUserName"
+            label="请假人姓名"
+          />
+          <el-table-column align="center" prop="cardNo" label="学号" />
+          <!-- <el-table-column align="center"  prop="userName" label="请假类型" /> -->
+          <el-table-column
+            align="center"
+            width="320"
+            prop="time"
+            label="请假时间"
+          />
+          <el-table-column
+            align="center"
+            show-overflow-tooltip
+            width="200"
+            prop="reason"
+            label="请假说明"
+          />
+          <el-table-column align="center" prop="userName" label="状态">
+            <template #default="{ row }">
+              {{ row.ifVerification == 0 ? "未核销" : "已核销" }}
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="createTime" label="创建时间" />
+          <el-table-column
+            align="center"
+            fixed="right"
+            label="操作"
+            width="120"
+          >
+            <template #default="scope">
+              <div class="edit">
+                <div class="look" v-if="scope.row.ifVerification == 0" @click="editClick(scope.row)">核销</div>
+                <!-- <el-popconfirm
+                    width="220"
+                    confirm-button-text="确认"
+                    cancel-button-text="取消"
+                    :icon="InfoFilled"
+                    icon-color="#f89626"
+                    title="删除后数据将无法恢复,确定对选中的访问数据进行删除吗?"
+                    @confirm="del(scope.row)"
+                    @cancel="cancelEvent"
+                  >
+                    <template #reference>
+                      <div class="del">删除</div>
+                    </template>
+                  </el-popconfirm> -->
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <!-- 分页组件 -->
+      <div class="pageSize">
+        <span></span>
+        <el-pagination
+          background
+          :current-page="currentPage"
+          :page-size="pageSize"
+          layout="total, prev, pager, next, jumper, slot"
+          :total="total"
+          @update:current-page="handleCurrentChange"
+        />
+      </div>
+
+      <!-- 请假配置 -->
+      <el-dialog
+        class="editDialog"
+        v-model="editVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        title="请假配置"
+        align-center
+        width="500"
+        :before-close="editCancel"
+      >
+        <div class="switch">
+          <span>是否需要核销 </span>
+          <el-switch
+            style="--el-switch-on-color: rgba(41, 109, 227, 1)"
+            v-model="editSwitch"
+            :active-value="1"
+            :inactive-value="0"
+          />
+        </div>
+        <span class="attention"
+          >注:如规则设为否,之前有预约单需要核销,自动变为已完成。</span
+        >
+        <div class="options">
+          <el-button
+            color="rgba(41, 109, 227, 1)"
+            class="queding"
+            type="primary"
+            @click="editConfirm"
+          >
+            确认
+          </el-button>
+          <el-button @click="editCancel">取消</el-button>
+        </div>
+      </el-dialog>
+
+      <div class="bgImg" v-if="bgImg">
+        <el-carousel
+          @click="bgImg = false"
+          ref="bgImgs"
+          indicator-position
+          arrow="always"
+          :autoplay="false"
+          trigger
+        >
+          <el-carousel-item>
+            <img :src="showImg" alt="" />
+          </el-carousel-item>
+        </el-carousel>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  reactive,
+  watch,
+  nextTick,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import vidiconsApi from "@/api/vidicons.js";
+import { dayjs } from "element-plus";
+import lodash from "lodash";
+import axios from "axios";
+import eds from "@/utils/eds.js";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
+const router = useRouter();
+// 表格数据
+const loading = ref(false);
+const tableData = reactive({
+  list: [],
+});
+const userType = ref(); // 判断为班主任 还是 超级管理员
+const classData = ref();
+const searchInput = reactive({
+  keyWord: "",
+  studentId: "",
+  type: "0",
+  class: "",
+  type: "",
+  createTime: "", // 创建时间
+}); // 搜索按钮数据
+
+const currentPage = ref(1); // 当前页
+const pageCount = ref(10);
+const total = ref(4); // 当前总数
+
+// 请假配置////////////////////////////////////
+const editVisible = ref(false);
+const editSwitch = ref(1);
+const editSwitchId = ref(1);
+
+// 预约记录分页数据
+const getList = async () => {
+  // loading.value = true;
+  let data = {
+    currentPage: currentPage.value,
+    pageCount: pageCount.value,
+    cardNo: searchInput.studentId,
+    keyWord: searchInput.keyWord,
+    ifVerification: searchInput.type,
+    classId: searchInput.class,
+  };
+  if (searchInput.createTime) {
+    data.startTime = searchInput.createTime[0];
+    data.endTime = searchInput.createTime[1];
+  }
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartAttendance/askForLeavePage",
+    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) {
+    loading.value = false;
+    let data = JSON.parse(eds.decryptDes(res.data.data));
+    data.list.forEach((i) => {
+      i.time = `${dayjs(i.startTime).format("YYYY-MM-DD HH:mm:ss")} - ${dayjs(
+        i.endTime
+      ).format("YYYY-MM-DD HH:mm:ss")}`;
+      i.createTime = dayjs(i.initiateTime).format("YYYY-MM-DD HH:mm:ss");
+    });
+    tableData.list = data.list;
+    total.value = data.totalCount;
+    // 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 userTypeChange = async (value) => {
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartAuthorGroup/getClassById",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: {
+      userHead: sessionStorage.getItem("userhead"),
+    },
+  });
+  console.log(res, JSON.parse(eds.decryptDes(res.data.data)));
+  if (res.data.code == 200) {
+    userType.value = JSON.parse(eds.decryptDes(res.data.data)).schoolClass;
+    classList();
+  }
+};
+// 班级数据
+const classList = async (val = "") => {
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartClass/getSchoolClasses",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: {
+      schoolClass: userType.value,
+      className: val,
+    },
+  });
+  console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "班级数据");
+  classData.value = JSON.parse(eds.decryptDes(res.data.data));
+};
+const classDataMethod = async (query) => {
+  if (query) {
+    classList(query);
+  } else {
+    classList();
+  }
+};
+// 搜索功能
+const searchBtn = lodash.debounce(async () => {
+  getList();
+}, 300);
+
+// 请假配置 (-------------------------------------------)
+const editClick =async () => {
+  editVisible.value = true;
+  let res = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartAskForLeaveConfig/list",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+  });
+  console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "请假配置");
+  let data = JSON.parse(eds.decryptDes(res.data.data))
+  editSwitch.value=data.config
+  editSwitchId.value=data.id
+};
+const editConfirm = async () => {
+  let data = {
+    "id":editSwitchId.value, //id
+    "config":editSwitch.value //0:需要核销,1:不需要核销
+  }
+  let res = await axios({
+     method: "post",
+     url: api.value + "/wanzai/api/smartAskForLeaveConfig/update",
+     headers: {
+       token: sessionStorage.getItem("token"),
+       user_head: sessionStorage.getItem("userhead"),
+     },
+     data: data,
+   });
+   console.log(res, "修改配置");
+  if (res.data.code == 200) {
+    getList()
+    editVisible.value = false;
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+const editCancel = () => {
+  editVisible.value = false;
+};
+
+// 多选框功能
+const handleSelectionChange = (val) => {
+  console.log(val);
+  // selectData.list = val;
+};
+//导出功能
+// const importExcel = async () => {
+//   if (searchInput.createTime == null) {
+//     searchInput.createTime = "";
+//   }
+//   let data = new FormData();
+//   data.set("car_number", searchInput.carnumber);
+//   data.set("create_time", searchInput.createTime);
+//   let res = await axios({
+//     method: "post",
+//     url: api.value + "/carBook/cinfotoExcel.action",
+//     headers: {
+//        token: sessionStorage.getItem("token"),
+// user_head: sessionStorage.getItem("userhead"),
+//     },
+//     data: data,
+//   });
+//   // console.log(res, "导出账号");
+//   if (res.data.code == 200) {
+//     // const elt = document.createElement("a");
+//     // elt.setAttribute(
+//     //   "href",
+//     //   "https://chtech.ncjti.edu.cn/carstop" + res.data.downurl
+//     // );
+//     // elt.setAttribute("download", "file.png");
+//     // elt.style.display = "none";
+//     // document.body.appendChild(elt);
+//     // elt.click();
+//     var downloadPath = "https://chtech.ncjti.edu.cn/carstop" + res.data.downurl;
+//     console.log("获得地址数据:", 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 {
+//     ElMessage({
+//       type: "error",
+//       showClose: true,
+//       message: res.data.message,
+//       center: true,
+//     });
+//   }
+// };
+// 表格斑马纹颜色修改
+const tableRowClassName = ({ row, rowIndex }) => {
+  if (rowIndex % 2 === 0) {
+    return "even";
+  } else if (rowIndex % 2 !== 0) {
+    return "odd";
+  }
+  return "";
+};
+
+// 查看表格图片 (----------------------------------------------)
+const bgImg = ref(false);
+const showImg = ref();
+const imgClick = (row) => {
+  console.log(typeof row);
+  if (typeof row == "string") {
+    bgImg.value = true;
+    showImg.value = row;
+  } else {
+    bgImg.value = true;
+    showImg.value = row.image;
+  }
+};
+
+// 分页
+const handleCurrentChange = (value) => {
+  // console.log(value);
+  currentPage.value = value;
+  getList();
+};
+
+onBeforeMount(async () => {
+  api.value = store.state.user.api;
+  getList();
+  userTypeChange();
+});
+onUnmounted(() => {
+  // document.removeEventListener("keyup", Enters);
+});
+</script>
+
+<style scoped lang="scss">
+.content-box {
+  min-width: 1000px;
+  width: calc(100vw - 260px);
+  height: calc(100vh - 105px);
+  margin: 20px auto;
+  background-color: #fff;
+  color: #fff;
+  display: flex;
+  flex-direction: column;
+  box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
+
+  .left {
+    // width: calc(100wh - 40px);
+    display: flex;
+    align-items: center;
+    height: 60px;
+    margin: 0 30px;
+    border-bottom: 1px solid #ccc;
+    color: rgb(0, 0, 0);
+    font-size: 18px;
+    font-weight: 600;
+    .left_title {
+      height: 60px;
+      line-height: 60px;
+    }
+  }
+  .scroll {
+    overflow: auto;
+    flex: 1;
+  }
+  .middle {
+    width: calc(100% - 60px);
+    margin: 0 auto;
+
+    color: #000;
+
+    // border-bottom: 1px solid rgb(231, 231, 231);
+    .filter {
+      display: flex;
+      flex-wrap: wrap;
+      align-items: center;
+
+      .search {
+        color: #fff;
+      }
+
+      .condition {
+        display: flex;
+        align-items: center;
+        margin: 10px 25px 10px 0;
+
+        :deep(.el-input .el-input__inner) {
+          font-size: 14px;
+        }
+
+        span {
+          margin: 0 10px 0 0;
+        }
+      }
+    }
+
+    .gongneng {
+      margin: 10px 0 10px 0;
+    }
+
+    :deep(.cont) {
+      width: 60%;
+      margin: 20px auto;
+    }
+
+    :deep(.download) {
+      display: flex;
+      align-items: center;
+      margin: 10px;
+    }
+
+    :deep(.download span) {
+      font-size: 16px;
+      margin-left: 20px;
+    }
+
+    :deep(.cont .el-button) {
+      margin-left: 60px;
+      margin-bottom: 30px;
+    }
+
+    :deep(.cont .accomplish) {
+      width: 100%;
+      display: flex;
+      justify-content: center;
+    }
+
+    :deep(.cont .accomplish .el-button) {
+      width: 50%;
+      margin: 0;
+    }
+  }
+
+  .footer {
+    width: calc(100% - 60px);
+    height: calc(100% - 80px);
+    margin: 10px auto 20px;
+
+    .el-table--fit {
+      height: 100%;
+
+      :deep(.el-table__header-wrapper) {
+        background-color: #000;
+        font-size: 14px;
+
+        tr {
+          // color: #000;
+        }
+      }
+      :deep(.el-table__row):nth-child(2n) {
+        // .el-table-fixed-column--left {
+        //   background-color: rgba(240, 243, 247, 1);
+        // }
+        // .el-table-fixed-column--right {
+        //   background-color: rgba(240, 243, 247, 1);
+        // }
+        td {
+          background-color: rgba(240, 243, 247, 1);
+        }
+      }
+
+      :deep(.el-table__row) {
+        height: 50px;
+        font-size: 14px;
+        // color: #000;
+        td {
+          padding: 0;
+          // border: 0;
+        }
+        &:hover {
+          td {
+            background-color: rgba(223, 236, 254, 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);
+        // .el-table_1_column_1 {
+        //   background-color: rgba(240, 243, 247, 1);
+        // }
+        // .el-table_1_column_2 {
+        //   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;
+      // }
+    }
+  }
+  // 家长访客配置
+  :deep(.editDialog) {
+    //   height: 420px;
+    border-radius: 11px;
+    .el-dialog__header {
+      border-radius: 11px 11px 0 0;
+      background: rgba(237, 241, 245, 1);
+      font-weight: 600;
+      margin: 0;
+      .el-dialog__headerbtn {
+        outline: none;
+      }
+    }
+    .el-dialog__body {
+      padding: 20px 30px;
+      height: 300px;
+      .switch {
+        margin: 10px 0;
+        span {
+          font-size: 17px;
+          margin-right: 10px;
+        }
+      }
+      .attention {
+        color: rgb(238, 190, 119);
+      }
+      .options {
+        margin: 190px 20px 20px 0;
+        width: 100%;
+        display: flex;
+        flex-direction: row-reverse;
+        .queding {
+          color: #fff;
+          margin-left: 15px;
+        }
+      }
+    }
+  }
+
+  .pageSize {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin: 0 30px;
+
+    span {
+      color: #000;
+    }
+
+    .el-pagination {
+      // width: 1600px;
+      :deep(.el-pagination__total) {
+        color: #000;
+      }
+
+      :deep(.el-pagination__goto) {
+        color: #000;
+      }
+
+      :deep(.el-pagination__classifier) {
+        color: #000;
+      }
+
+      :deep(.el-input__wrapper) {
+        border: 1px solid rgba(0, 0, 0, 1);
+        border-radius: 5px;
+        box-shadow: none;
+      }
+
+      :deep(.el-pager li) {
+        margin: 0 5px;
+        border: 1px solid rgba(0, 0, 0, 1);
+        border-radius: 5px;
+        background-color: transparent;
+      }
+
+      :deep(.el-pager li.is-active) {
+        // background-color: rgba(0, 97, 255, 0.8);
+        border: 1px solid rgba(0, 97, 255, 1);
+        color: rgba(0, 97, 255, 1);
+      }
+
+      :deep(.btn-prev) {
+        margin-right: 5px;
+        border: 1px solid rgba(0, 0, 0, 1);
+        border-radius: 5px;
+        background-color: transparent;
+      }
+
+      :deep(.btn-next) {
+        margin-left: 5px;
+        border: 1px solid rgba(0, 0, 0, 1);
+        border-radius: 5px;
+        background-color: transparent;
+      }
+    }
+  }
+
+  .bgImg {
+    position: absolute;
+    left: 0;
+    top: 0;
+    z-index: 99999999;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(255, 255, 255, 0.8);
+
+    // border-radius: 50px;
+    :deep(.el-carousel__container) {
+      width: 100%;
+      height: calc(100vh);
+
+      .el-carousel__item {
+        display: flex;
+        justify-content: center;
+
+        img {
+          height: 100%;
+        }
+      }
+    }
+  }
+}
+
+.el-input {
+  width: 192px;
+}
+</style>

+ 186 - 507
src/views/log/log.vue

@@ -1,21 +1,9 @@
 <template>
   <div class="content-box">
     <div class="left">
-      <span
-        :class="taskTabVisible == true ? 'cameratxt' : 'cameratxt-grey'"
-        @click="tabHandler(1)"
-        >任务日志</span
-      >
-      <span
-        :class="businessTabVisible == true ? 'cameratxt' : 'cameratxt-grey'"
-        @click="tabHandler(2)"
-        >业务日志</span
-      >
-      <span
-        :class="debugTabVisible == true ? 'cameratxt' : 'cameratxt-grey'"
-        @click="tabHandler(3)"
-        >调试日志</span
-      >
+      <span :class="taskTabVisible == true ? 'cameratxt' : 'cameratxt-grey'" @click="tabHandler(1)">任务日志</span>
+      <span :class="businessTabVisible == true ? 'cameratxt' : 'cameratxt-grey'" @click="tabHandler(2)">业务日志</span>
+      <span :class="debugTabVisible == true ? 'cameratxt' : 'cameratxt-grey'" @click="tabHandler(3)">调试日志</span>
     </div>
     <!-- 任务日志 -->
     <div v-show="taskTabVisible" class="scrollContent">
@@ -23,40 +11,18 @@
         <div class="middle">
           <div class="filter">
             <div class="condition">
-              <el-select
-                v-model="mPage.selectTaskValue"
-                clearable
-                class="sel"
-                placeholder="任务名称"
-                style="width: 180px"
-                @clear="mPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in mPage.selectTaskOptions"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
+              <el-select v-model="mPage.selectTaskValue" clearable class="sel" placeholder="任务名称" style="width: 180px"
+                @clear="mPage.searchBtn">
+                <el-option v-for="item in mPage.selectTaskOptions" :key="item.value" :label="item.label"
+                  :value="item.value" />
               </el-select>
-              <el-select
-                v-model="mPage.tkLogAutoManualValue"
-                clearable
-                style="width: 120px"
-                class="sel"
-                placeholder="执行标识"
-                @clear="mPage.searchBtn"
-              >
+              <el-select v-model="mPage.tkLogAutoManualValue" clearable style="width: 120px" class="sel"
+                placeholder="执行标识" @clear="mPage.searchBtn">
                 <el-option label="自动执行" value="0" />
                 <el-option label="手动执行" value="1" />
               </el-select>
-              <el-select
-                v-model="mPage.tkLogExeStatusValue"
-                class="sel"
-                style="width: 130px"
-                clearable
-                placeholder="执行状态"
-                @clear="mPage.searchBtn"
-              >
+              <el-select v-model="mPage.tkLogExeStatusValue" class="sel" style="width: 130px" clearable
+                placeholder="执行状态" @clear="mPage.searchBtn">
                 <el-option label="执行中" value="1" />
                 <el-option label="执行成功" value="2" />
                 <el-option label="部分数据异常" value="3" />
@@ -64,44 +30,18 @@
                 <el-option label="执行跳过" value="5" />
                 <el-option label="执行失败" value="6" />
               </el-select>
-              <el-select
-                v-model="mPage.selectDsSourceValue"
-                class="sel"
-                clearable
-                placeholder="来源数据源"
-                style="width: 180px"
-                @clear="mPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in mPage.selectDsSourceOptions"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
+              <el-select v-model="mPage.selectDsSourceValue" class="sel" clearable placeholder="来源数据源"
+                style="width: 180px" @clear="mPage.searchBtn">
+                <el-option v-for="item in mPage.selectDsSourceOptions" :key="item.value" :label="item.label"
+                  :value="item.value" />
               </el-select>
-              <el-select
-                v-model="mPage.selectDsDestinationValue"
-                class="sel"
-                clearable
-                placeholder="目的数据源"
-                style="width: 180px"
-                @clear="mPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in mPage.selectDsDestinationOptions"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
+              <el-select v-model="mPage.selectDsDestinationValue" class="sel" clearable placeholder="目的数据源"
+                style="width: 180px" @clear="mPage.searchBtn">
+                <el-option v-for="item in mPage.selectDsDestinationOptions" :key="item.value" :label="item.label"
+                  :value="item.value" />
               </el-select>
-              <el-select
-                v-model="mPage.tkLogCostTimeValue"
-                class="sel"
-                style="width: 130px"
-                clearable
-                placeholder="耗时过滤"
-                @clear="mPage.searchBtn"
-              >
+              <el-select v-model="mPage.tkLogCostTimeValue" class="sel" style="width: 130px" clearable
+                placeholder="耗时过滤" @clear="mPage.searchBtn">
                 <el-option label="1分钟内" value="1" />
                 <el-option label="1-5分钟" value="2" />
                 <el-option label="5-10分钟" value="3" />
@@ -109,137 +49,51 @@
                 <el-option label="30分钟以上" value="5" />
               </el-select>
               <div class="sel">
-                <el-date-picker
-                  v-model="mPage.searchDateTimeVale"
-                  type="datetimerange"
-                  start-placeholder="开始时间"
-                  end-placeholder="结束时间"
-                  :shortcuts="mPage.shortcuts"
-                  value-format="YYYY-MM-DD HH:mm:ss"
-                  style="width: 260px; margin-right: 10px"
-                />
+                <el-date-picker v-model="mPage.searchDateTimeVale" type="datetimerange" start-placeholder="开始时间"
+                  end-placeholder="结束时间" :shortcuts="mPage.shortcuts" value-format="YYYY-MM-DD HH:mm:ss"
+                  style="width: 360px; margin-right: 10px" />
               </div>
-              <el-button
-                color="rgba(0, 97, 255, 1)"
-                type="primary"
-                class="search sel"
-                @click="mPage.searchBtn"
-                ><el-icon>
+              <el-button color="rgba(0, 97, 255, 1)" type="primary" class="search sel"
+                @click="mPage.searchBtn"><el-icon>
                   <Search />
                 </el-icon>
-                <span>查询</span></el-button
-              >
+                <span>查询</span></el-button>
             </div>
           </div>
         </div>
         <div class="footer" v-loading="mPage.loading">
-          <el-table
-            :row-class-name="mPage.tableRowClassName"
-            :data="mPage.tableData"
-            border
-            style="width: 100%"
+          <el-table :row-class-name="mPage.tableRowClassName" :data="mPage.tableData" border style="width: 100%"
             :header-cell-style="{
               background: 'rgba(240, 243, 247, 1)',
               height: '50px',
-            }"
-          >
+            }">
             <!-- <el-table-column align="center" type="selection" width="55" /> -->
-            <el-table-column
-              width="68"
-              align="center "
-              prop="xuhao"
-              label="序号"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogTaskName"
-              label="任务名称"
-            />
+            <el-table-column width="68" align="center " prop="xuhao" label="序号" />
+            <el-table-column align="center" prop="tkLogTaskName" label="任务名称" />
             <!-- <el-table-column align="center" prop="department" label="业务部门" /> -->
-            <el-table-column
-              align="center"
-              prop="tkLogDsSourceName"
-              label="来源库"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogDsDestinationName"
-              label="目的库"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogDestTable"
-              label="目的表"
-            />
+            <el-table-column align="center" prop="tkLogDsSourceName" label="来源库" />
+            <el-table-column align="center" prop="tkLogDsDestinationName" label="目的库" />
+            <el-table-column align="center" prop="tkLogDestTable" label="目的表" width="150" />
             <!-- <el-table-column align="center" prop="interchangerName" label="交换机名称" /> -->
-            <el-table-column
-              align="center"
-              prop="tkLogAutoManual"
-              label="执行标识"
-              width="80"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogExeType"
-              label="执行方式"
-              width="80"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogExeStatus"
-              label="执行状态"
-            >
+            <el-table-column align="center" prop="tkLogAutoManual" label="执行标识" width="86" />
+            <el-table-column align="center" prop="tkLogExeType" label="执行方式" width="86" />
+            <el-table-column align="center" prop="tkLogExeStatus" label="执行状态" width="100">
               <template #default="scope">
-                <span
-                  v-if="
-                    scope.row.tkLogExeStatus == '执行成功' ||
-                    scope.row.tkLogExeStatus == '执行中'
-                  "
-                  class="normal"
-                  >{{ scope.row.tkLogExeStatus }}</span
-                >
+                <span v-if="scope.row.tkLogExeStatus == '执行成功' ||
+                  scope.row.tkLogExeStatus == '执行中'
+                " class="normal">{{ scope.row.tkLogExeStatus }}</span>
                 <span v-else class="err-text">{{
                   scope.row.tkLogExeStatus
-                }}</span>
+                  }}</span>
               </template>
             </el-table-column>
-            <el-table-column
-              align="center"
-              prop="tkLogStartTime"
-              label="执行开始时间"
-              width="90"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogEndTime"
-              label="执行结束时间"
-              width="90"
-            />
-            <el-table-column align="center" prop="tkLogCostTime" label="耗时" />
-            <el-table-column
-              align="center"
-              prop="tkLogReadRows"
-              label="读取数据量"
-              width="80"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogInsertRows"
-              label="增加数据量"
-              width="80"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogUpdateRows"
-              label="更新数据量"
-              width="80"
-            />
-            <el-table-column
-              align="center"
-              prop="tkLogErrRows"
-              label="错误数据量"
-              width="80"
-            />
+            <el-table-column align="center" prop="tkLogStartTime" label="执行开始时间" width="110" />
+            <el-table-column align="center" prop="tkLogEndTime" label="执行结束时间" width="110" />
+            <el-table-column align="center" prop="tkLogCostTime" label="耗时" width="90" />
+            <el-table-column align="center" prop="tkLogReadRows" label="读取(条)" width="80" />
+            <el-table-column align="center" prop="tkLogInsertRows" label="增加(条)" width="80" />
+            <el-table-column align="center" prop="tkLogUpdateRows" label="更新(条)" width="80" />
+            <el-table-column align="center" prop="tkLogErrRows" label="错误(条)" width="80" />
             <el-table-column align="center" label="查看" width="80">
               <template #default="scope">
                 <div class="edit">
@@ -255,31 +109,16 @@
         <!-- 分页组件 -->
         <div class="pageSize" style="display: flex">
           <span></span>
-          <el-pagination
-            background
-            :current-page="mPage.currentPage"
-            :page-size="mPage.pageSize"
-            layout="total, prev, pager, next, jumper, slot"
-            :total="mPage.tableTotal"
-            @update:current-page="mPage.handleCurrentChange"
-          />
+          <el-pagination background :current-page="mPage.currentPage" :page-size="mPage.pageSize"
+            layout="total, prev, pager, next, jumper, slot" :total="mPage.tableTotal"
+            @update:current-page="mPage.handleCurrentChange" />
         </div>
       </div>
 
       <!-- 查看按钮 -->
-      <el-dialog
-        class="editDialog"
-        v-model="mPage.viewVisible"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        title="日志详情"
-        :show-close="false"
-        align-center
-        width="600"
-      >
-        <div>
-          {{ mPage.content }}
-        </div>
+      <el-dialog class="editDialog" v-model="mPage.viewVisible" :close-on-click-modal="false"
+        :close-on-press-escape="false" title="日志详情" :show-close="false" align-center width="600">
+        <div style="height: 500px; overflow-y: scroll;" v-html="mPage.content"></div>
         <div class="options">
           <el-button @click="mPage.viewVisible = false">关闭</el-button>
         </div>
@@ -291,161 +130,57 @@
         <div class="middle">
           <div class="filter">
             <div class="condition">
-              <el-select
-                v-model="bPage.actionNameValue"
-                filterable
-                clearable
-                style="width: 280px"
-                class="sel"
-                placeholder="操作名称"
-                @clear="bPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in bPage.actionName"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.label"
-                />
+              <el-select v-model="bPage.actionNameValue" filterable clearable style="width: 280px" class="sel"
+                placeholder="操作名称" @clear="bPage.searchBtn">
+                <el-option v-for="item in bPage.actionName" :key="item.value" :label="item.label" :value="item.label" />
               </el-select>
-              <el-select
-                v-model="bPage.actionPeopleValue"
-                filterable
-                clearable
-                style="width: 120px"
-                class="sel"
-                placeholder="操作人"
-                @clear="bPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in bPage.actionPeople"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.label"
-                />
+              <el-select v-model="bPage.actionPeopleValue" filterable clearable style="width: 120px" class="sel"
+                placeholder="操作人" @clear="bPage.searchBtn">
+                <el-option v-for="item in bPage.actionPeople" :key="item.value" :label="item.label"
+                  :value="item.label" />
               </el-select>
-              <el-select
-                v-model="bPage.actionModuleValue"
-                filterable
-                class="sel"
-                style="width: 350px"
-                clearable
-                placeholder="操作模块"
-                @clear="bPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in bPage.actionModule"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.label"
-                />
+              <el-select v-model="bPage.actionModuleValue" filterable class="sel" style="width: 350px" clearable
+                placeholder="操作模块" @clear="bPage.searchBtn">
+                <el-option v-for="item in bPage.actionModule" :key="item.value" :label="item.label"
+                  :value="item.label" />
               </el-select>
-              <el-select
-                v-model="bPage.actionBusinessValue"
-                filterable
-                class="sel"
-                style="width: 280px"
-                clearable
-                placeholder="业务名称"
-                @clear="bPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in bPage.actionBusiness"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.label"
-                />
+              <el-select v-model="bPage.actionBusinessValue" filterable class="sel" style="width: 280px" clearable
+                placeholder="业务名称" @clear="bPage.searchBtn">
+                <el-option v-for="item in bPage.actionBusiness" :key="item.value" :label="item.label"
+                  :value="item.label" />
               </el-select>
               <div class="elDatePicker sel">
-                <el-date-picker
-                  v-model="bPage.searchDateTimeVale"
-                  type="datetimerange"
-                  start-placeholder="操作开始时间"
-                  end-placeholder="操作结束时间"
-                  :shortcuts="bPage.shortcuts"
-                  value-format="YYYY-MM-DD HH:mm:ss"
-                  style="width: 360px !important; margin-right: 10px"
-                />
+                <el-date-picker v-model="bPage.searchDateTimeVale" type="datetimerange" start-placeholder="操作开始时间"
+                  end-placeholder="操作结束时间" :shortcuts="bPage.shortcuts" value-format="YYYY-MM-DD HH:mm:ss"
+                  style="width: 360px !important; margin-right: 10px" />
               </div>
-              <el-button
-                color="rgba(0, 97, 255, 1)"
-                type="primary"
-                class="search sel"
-                @click="bPage.searchBtn"
-                ><el-icon>
+              <el-button color="rgba(0, 97, 255, 1)" type="primary" class="search sel"
+                @click="bPage.searchBtn"><el-icon>
                   <Search />
                 </el-icon>
-                <span>查询</span></el-button
-              >
+                <span>查询</span></el-button>
             </div>
           </div>
         </div>
         <div class="footer" v-loading="bPage.loading">
-          <el-table
-            :row-class-name="bPage.tableRowClassName"
-            :data="bPage.tableData"
-            border
-            style="width: 100%"
+          <el-table :row-class-name="bPage.tableRowClassName" :data="bPage.tableData" border style="width: 100%"
             :header-cell-style="{
               background: 'rgba(240, 243, 247, 1)',
               height: '50px',
-            }"
-          >
-            <el-table-column
-              width="68"
-              align="center "
-              prop="xuhao"
-              label="序号"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionName"
-              label="操作名称"
-              width="230"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionPeople"
-              label="操作人"
-              width="100"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionModule"
-              label="操作模块"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionBusiness"
-              label="业务名称"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionHost"
-              label="操作主机ip"
-              width="120"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionRemote"
-              label="操作人ip"
-              width="120"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionClass"
-              label="操作类型"
-              width="120"
-            />
-            <el-table-column
-              align="center"
-              prop="logActionCreateTime"
-              label="操作时间"
-              width="160"
-            >
+            }">
+            <el-table-column width="68" align="center " prop="xuhao" label="序号" />
+            <el-table-column align="center" prop="logActionName" label="操作名称" width="230" />
+            <el-table-column align="center" prop="logActionPeople" label="操作人" width="100" />
+            <el-table-column align="center" prop="logActionModule" label="操作模块" />
+            <el-table-column align="center" prop="logActionBusiness" label="业务名称" />
+            <el-table-column align="center" prop="logActionHost" label="操作主机ip" width="128" />
+            <el-table-column align="center" prop="logActionRemote" label="操作人ip" width="128" />
+            <el-table-column align="center" prop="logActionClass" label="操作类型" width="128" />
+            <el-table-column align="center" prop="logActionCreateTime" label="操作时间" width="120">
               <template #default="{ row }">
                 <span>{{
                   dayjs(row.logActionCreateTime).format("YYYY-MM-DD HH:mm:ss")
-                }}</span>
+                  }}</span>
               </template>
             </el-table-column>
           </el-table>
@@ -454,124 +189,58 @@
         <!-- 分页组件 -->
         <div class="pageSize" style="display: flex">
           <span></span>
-          <el-pagination
-            background
-            :current-page="bPage.currentPage"
-            :page-size="bPage.pageSize"
-            layout="total, prev, pager, next, jumper, slot"
-            :total="bPage.tableTotal"
-            @update:current-page="bPage.handleCurrentChange"
-          />
+          <el-pagination background :current-page="bPage.currentPage" :page-size="bPage.pageSize"
+            layout="total, prev, pager, next, jumper, slot" :total="bPage.tableTotal"
+            @update:current-page="bPage.handleCurrentChange" />
         </div>
       </div>
     </div>
     <!-- 调试日志 -->
     <div v-show="debugTabVisible" class="scrollContent">
       <div class="scroll">
-        <div
-          class="middle"
-          style="
+        <div class="middle" style="
             display: flex;
             justify-content: space-between;
             align-items: center;
-          "
-        >
+          ">
           <div class="filter">
             <div class="condition">
-              <el-select
-                v-model="debugPage.taskIdValue"
-                filterable
-                clearable
-                style="width: 280px"
-                class="sel"
-                placeholder="任务名称"
-                @clear="debugPage.searchBtn"
-              >
-                <el-option
-                  v-for="item in debugPage.taskId"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
+              <el-select v-model="debugPage.taskIdValue" filterable clearable style="width: 280px" class="sel"
+                placeholder="任务名称" @clear="debugPage.searchBtn">
+                <el-option v-for="item in debugPage.taskId" :key="item.value" :label="item.label" :value="item.value" />
               </el-select>
               <div class="sel">
-                <el-date-picker
-                  v-model="debugPage.searchDateTimeVale"
-                  type="datetimerange"
-                  start-placeholder="开始时间"
-                  end-placeholder="结束时间"
-                  :shortcuts="debugPage.shortcuts"
-                  value-format="YYYY-MM-DD HH:mm:ss"
-                  style="width: 360px; margin-right: 10px"
-                />
+                <el-date-picker v-model="debugPage.searchDateTimeVale" type="datetimerange" start-placeholder="开始时间"
+                  end-placeholder="结束时间" :shortcuts="debugPage.shortcuts" value-format="YYYY-MM-DD HH:mm:ss"
+                  style="width: 360px; margin-right: 10px" />
               </div>
-              <el-button
-                color="rgba(0, 97, 255, 1)"
-                type="primary"
-                class="search sel"
-                @click="debugPage.searchBtn"
-                ><el-icon>
+              <el-button color="rgba(0, 97, 255, 1)" type="primary" class="search sel"
+                @click="debugPage.searchBtn"><el-icon>
                   <Search />
                 </el-icon>
-                <span>查询</span></el-button
-              >
+                <span>查询</span></el-button>
             </div>
           </div>
           <div class="sel">
-            <el-button
-              type="primary"
-              color="rgba(0, 97, 255, 1)"
-              plain
-              @click="debugPage.debugSet"
-              >启用调试</el-button
-            >
+            <el-button type="primary" color="rgba(0, 97, 255, 1)" plain @click="debugPage.debugSet">启用调试</el-button>
           </div>
         </div>
+        <div style="margin: 0 0 5px 30px;">
+          <el-button type="primary" color="rgba(0, 97, 255, 1)" :disabled="debugPage.ids === ''" plain
+            @click="debugPage.deleteDebugLog">删除勾选</el-button>
+        </div>
         <div class="footer" v-loading="debugPage.loading">
-          <el-table
-            :row-class-name="debugPage.tableRowClassName"
-            :data="debugPage.tableData"
-            border
-            style="width: 100%"
-            :header-cell-style="{
-              background: 'rgba(240, 243, 247, 1)',
-              height: '50px',
-            }"
-          >
-            <el-table-column
-              width="68"
-              align="center "
-              prop="xuhao"
-              label="序号"
-            />
-            <el-table-column
-              align="center"
-              prop="ETaskName"
-              label="任务名称"
-              width="150"
-            />
+          <el-table :row-class-name="debugPage.tableRowClassName" @selection-change="debugPage.handleSelectionChange"
+            :data="debugPage.tableData" border style="width: 100%;"
+            :header-cell-style="{ background: 'rgba(240, 243, 247, 1)', height: '50px', }">
+            <el-table-column type="selection" width="55"></el-table-column>
+            <el-table-column width="68" align="center " prop="xuhao" label="序号" />
+            <el-table-column align="center" prop="ETaskName" label="任务名称" width="150" />
             <el-table-column prop="EMsg" label="信息" header-align="center" />
-            <el-table-column
-              align="center"
-              prop="ENum"
-              label="次数"
-              width="88"
-            />
-            <el-table-column
-              align="center"
-              prop="EDateTime"
-              label="发生时间"
-              width="150"
-            />
-            <el-table-column
-              align="center"
-              prop="ECreateTime"
-              label="创建时间"
-              width="150"
-              ><template #default="{ row }">
-                <span>{{
-                  dayjs(row.ECreateTime).format("YYYY-MM-DD HH:mm:ss")
-                }}</span>
+            <el-table-column align="center" prop="ENum" label="次数" width="88" />
+            <el-table-column align="center" prop="EDateTime" label="发生时间" width="150" />
+            <el-table-column align="center" prop="ECreateTime" label="创建时间" width="150"><template #default="{ row }">
+                <span>{{ dayjs(row.ECreateTime).format("YYYY-MM-DD HH:mm:ss") }}</span>
               </template>
             </el-table-column>
           </el-table>
@@ -580,64 +249,30 @@
         <!-- 分页组件 -->
         <div class="pageSize" style="display: flex">
           <span></span>
-          <el-pagination
-            background
-            :current-page="debugPage.currentPage"
-            :page-size="debugPage.pageSize"
-            layout="total, prev, pager, next, jumper, slot"
-            :total="debugPage.tableTotal"
-            @update:current-page="debugPage.handleCurrentChange"
-          />
+          <el-pagination background :current-page="debugPage.currentPage" :page-size="debugPage.pageSize"
+            layout="total, prev, pager, next, jumper, slot" :total="debugPage.tableTotal"
+            @update:current-page="debugPage.handleCurrentChange" />
         </div>
       </div>
 
       <!-- 调试对话框 -->
-      <el-dialog
-        class="editDialog"
-        v-model="debugPage.debugSetVisible"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        title="开启调试"
-        :show-close="false"
-        align-center
-        width="500"
-      >
+      <el-dialog class="editDialog" v-model="debugPage.debugSetVisible" :close-on-click-modal="false"
+        :close-on-press-escape="false" title="开启调试" :show-close="false" align-center width="500">
         <div style="height: 540px; over-flow: hidden; scroll: auto">
-          <el-table
-            :row-class-name="debugPage.tableRowClassName"
-            :data="debugPage.debugTableData"
-            height="540"
-            border
-            style="width: 100%"
-            :header-cell-style="{
+          <el-table :row-class-name="debugPage.tableRowClassName" :data="debugPage.debugTableData" height="540" border
+            style="width: 100%" :header-cell-style="{
               background: 'rgba(240, 243, 247, 1)',
               height: '50px',
-            }"
-          >
-            <el-table-column
-              width="68"
-              align="center "
-              prop="xuhao"
-              label="序号"
-            />
+            }">
+            <el-table-column width="68" align="center " prop="xuhao" label="序号" />
             <el-table-column align="center" prop="tkName" label="任务名称" />
-            <el-table-column
-              align="center"
-              prop="tkDebugSql"
-              label="开关"
-              width="150"
-            >
+            <el-table-column align="center" prop="tkDebugSql" label="开关" width="150">
               <template #default="scope">
-                <el-switch
-                  v-model="scope.row.tkDebugSql"
-                  :active-value="1"
-                  :inactive-value="0"
-                  @change="debugPage.handleSwitchChange(scope.row)"
-                  style="
+                <el-switch v-model="scope.row.tkDebugSql" :active-value="1" :inactive-value="0"
+                  @change="debugPage.handleSwitchChange(scope.row)" style="
                     --el-switch-on-color: #13ce66;
                     --el-switch-off-color: #ff4949;
-                  "
-                />
+                  " />
               </template>
             </el-table-column>
           </el-table>
@@ -755,8 +390,9 @@ const debugPage = reactive({
   taskId: reactive([]), // 任务id列表对象
   startTime: reactive([]), // 开始时间
   currentPage: ref(1), // 当前页
-  pageSize: ref(10), // 每页显示条数
+  pageSize: ref(300), // 每页显示条数
   tableTotal: ref(0), // 当前总数
+  ids: "",
   // 获取任务列表
   getTaskList: async () => {
     let data = {
@@ -814,12 +450,11 @@ const debugPage = reactive({
       },
       params: data,
     });
-    console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "业务日志");
+    // console.log(res, "业务日志");
     if (res.data.code == 200) {
       debugPage.loading = false;
       debugPage.tableData = reactive([]);
-      debugPage.tableTotal =
-        JSON.parse(eds.decryptDes(res.data.data)).total || 0;
+      debugPage.tableTotal = JSON.parse(eds.decryptDes(res.data.data)).total || 0;
       let i = 1;
       JSON.parse(eds.decryptDes(res.data.data)).list.forEach((element) => {
         element.xuhao = (debugPage.currentPage - 1) * debugPage.pageSize + i;
@@ -850,7 +485,7 @@ const debugPage = reactive({
       },
       params: data,
     });
-    // console.log(res, "任务调试sql");
+    console.log(res, "任务调试sql");
     if (res.data.code == 200) {
       debugPage.debugTableData = reactive([]);
       let i = 1;
@@ -905,6 +540,47 @@ const debugPage = reactive({
       });
     }
   },
+  // 获取需要删除的调试日志ids
+  handleSelectionChange: (val) => {
+    let strids = '';
+    val.forEach((item) => {
+      strids += item.EId + ",";
+    });
+    debugPage.ids = strids.substring(0, strids.length - 1);
+  },
+  // 删除调试日志
+  deleteDebugLog: async () => {
+    let data = {
+      ids: debugPage.ids,
+      managerId: sessionStorage.getItem("token"),
+    };
+    let res = await axios({
+      method: "post",
+      url: api.value + "/wanzai/api/smartDataTask/delSmartDataTaskDebugByIds",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      data,
+    });
+    // console.log(res, "删除调试日志");
+    if (res.data.code == 200) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+      debugPage.getList();
+    } else {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    }
+  },
   // 表格斑马纹颜色修改
   tableRowClassName: ({ row, rowIndex }) => {
     if (rowIndex % 2 === 0) {
@@ -996,7 +672,7 @@ const bPage = reactive({
   actionBusiness: reactive([]), // 操作业务
   startTime: reactive([]), // 开始时间
   currentPage: ref(1), // 当前页
-  pageSize: ref(10), // 每页显示条数
+  pageSize: ref(30), // 每页显示条数
   tableTotal: ref(0), // 当前总数
   // 获取操作名称
   getActionName: async () => {
@@ -1310,6 +986,7 @@ const mPage = reactive({
         mPage.tableData.push(element);
         i++;
       });
+      console.log(mPage.tableData);
     } else {
       mPage.loading = false;
       ElMessage({
@@ -1369,8 +1046,7 @@ const mPage = reactive({
       },
       params: data,
     });
-    console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "获取数据源");
-
+    // console.log(res, "获取数据源");
     if (res.data.code == 200) {
       mPage.selectDsSourceOptions = reactive([]);
       mPage.selectDsDestinationOptions = reactive([]);
@@ -1396,7 +1072,7 @@ const mPage = reactive({
   //查看按钮
   editClick: async (row) => {
     mPage.viewVisible = true;
-    mPage.content = row.tkLogErrException;
+    mPage.content = row.tkLogErrException.replace(/\n/g, "<br/>");
   },
   // 表格斑马纹颜色修改
   tableRowClassName: ({ row, rowIndex }) => {
@@ -1421,7 +1097,7 @@ const mPage = reactive({
 watch(
   () => mPage.searchDateTimeVale,
   (newVal, oldVal) => {
-    console.log("监听时间:", newVal);
+    // console.log("监听时间:", newVal);
     if (newVal == null) {
       mPage.searchBtn();
     }
@@ -1431,7 +1107,7 @@ watch(
 watch(
   () => bPage.searchDateTimeVale,
   (newVal, oldVal) => {
-    console.log("监听时间:", newVal);
+    // console.log("监听时间:", newVal);
     if (newVal == null) {
       bPage.searchBtn();
     }
@@ -1441,7 +1117,7 @@ watch(
 watch(
   () => debugPage.searchDateTimeVale,
   (newVal, oldVal) => {
-    console.log("监听时间:", newVal);
+    // console.log("监听时间:", newVal);
     if (newVal == null) {
       debugPage.searchBtn();
     }
@@ -1578,10 +1254,12 @@ onUnmounted(() => {
     background-color: rgb(6, 88, 240);
     color: #ffffff;
   }
+
   .scrollContent {
     height: calc(100% - 70px);
     overflow: auto;
   }
+
   .scroll {
     height: 100%;
   }
@@ -1665,7 +1343,7 @@ onUnmounted(() => {
 
   .footer {
     width: calc(100% - 60px);
-    height: calc(100% - 150px);
+    height: calc(100% - 170px);
     margin: 0 auto 20px;
 
     .el-table--fit {
@@ -1910,6 +1588,7 @@ onUnmounted(() => {
     }
 
     .el-pagination {
+
       // width: 1600px;
       :deep(.el-pagination__total) {
         color: #000;

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

@@ -740,8 +740,14 @@ const getAllDataList = async () => {
     let data = JSON.parse(eds.decryptDes(res.data.data));
     // let data = res.data.data;
     dataSource.value = data;
-    authorGroupParentId.value = data[0].parentId;
-    authorGroupId.value = data[0].id;
+    if(sessionStorage.getItem('authorGroupParentId') && sessionStorage.getItem('authorGroupId')){
+      authorGroupParentId.value = sessionStorage.getItem('authorGroupParentId');
+      authorGroupId.value = sessionStorage.getItem('authorGroupId');
+    }else{
+      authorGroupParentId.value = data[0].parentId;
+      authorGroupId.value = data[0].id;
+    }
+
     // tagList.value = JSON.parse(data[0].userId).data; // 管理人员
     // menuList.value = JSON.parse(data[0].applyId).data; //菜单权限
     // appList.value = JSON.parse(data[0].applyId).data; //应用权限
@@ -834,6 +840,8 @@ const allRolesData = async () => {
 // 点击树状结构每一个节点触发的回调
 const handleNodeClick = async (data) => {
   headerValue.value = data.name;
+  sessionStorage.setItem('authorGroupParentId',data.parentId);
+  sessionStorage.setItem('authorGroupId', data.id);
   authorGroupParentId.value = data.parentId;
   authorGroupId.value = data.id;
   getUserAuthList(); // 所有用户权限数据

+ 86 - 340
src/views/source/source.vue

@@ -9,44 +9,19 @@
         <div class="search-manager">
           <div class="filter">
             <div class="condition">
-              <el-select
-                v-model="searchInput.dsClassValue"
-                class="sel"
-                placeholder="数据库类型"
-                clearable
-                @clear="searchBtn"
-              >
-                <el-option
-                  v-for="item in dsClass.list"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
+              <el-select v-model="searchInput.dsClassValue" class="sel" placeholder="数据库类型" clearable
+                @clear="searchBtn">
+                <el-option v-for="item in dsClass.list" :key="item.value" :label="item.label" :value="item.value" />
               </el-select>
-              <el-select
-                v-model="searchInput.connectStatus"
-                class="sel"
-                placeholder="连接状态"
-                clearable
-                @clear="searchBtn"
-              >
+              <el-select v-model="searchInput.connectStatus" class="sel" placeholder="连接状态" clearable
+                @clear="searchBtn">
                 <el-option label="正常" value="1" />
                 <el-option label="异常" value="0" />
               </el-select>
-              <el-input
-                :clearable="true"
-                @clear="searchBtn"
-                v-model="searchInput.keyWord"
-                class="sel"
-                placeholder="数据源名称"
-              />
+              <el-input :clearable="true" @clear="searchBtn" v-model="searchInput.keyWord" class="sel"
+                placeholder="数据源名称" />
             </div>
-            <el-button
-              color="rgba(0, 97, 255, 1)"
-              type="primary"
-              class="search"
-              @click="searchBtn"
-            >
+            <el-button color="rgba(0, 97, 255, 1)" type="primary" class="search" @click="searchBtn">
               <el-icon>
                 <Search />
               </el-icon>
@@ -54,54 +29,27 @@
             </el-button>
           </div>
           <div>
-            <el-button
-              type="primary"
-              color="rgba(0, 97, 255, 1)"
-              plain
-              @click="managerDSClass"
-              >数据源类别管理</el-button
-            >
+            <el-button type="primary" color="rgba(0, 97, 255, 1)" plain @click="managerDSClass">数据源类别管理</el-button>
           </div>
         </div>
         <!-- 按钮列表 -->
         <div class="gongneng">
-          <el-button
-            type="primary"
-            color="rgba(0, 97, 255, 1)"
-            plain
-            @click="addClick"
-            >新增</el-button
-          >
+          <el-button type="primary" color="rgba(0, 97, 255, 1)" plain @click="addClick">新增</el-button>
           <!-- <el-button type="primary" color="rgba(0, 97, 255, 1)" plain @click="editClick">编辑</el-button>
           <el-button type="primary" color="rgba(0, 97, 255, 1)" @click="delClick" plain>删除</el-button> -->
         </div>
       </div>
       <div class="footer" v-loading="loading">
-        <el-table
-          :row-class-name="tableRowClassName"
-          :data="tableData.list"
-          style="width: 100%"
-          :header-cell-style="{
-            background: 'rgba(240, 243, 247, 1)',
-            height: '50px',
-            border: 0,
-          }"
-        >
+        <el-table :row-class-name="tableRowClassName" :data="tableData.list" style="width: 100%" :header-cell-style="{
+          background: 'rgba(240, 243, 247, 1)',
+          height: '50px',
+          border: 0,
+        }">
           <!-- <el-table-column align="center" type="selection" width="80" /> -->
           <el-table-column align="center" prop="dsClsName" label="类型" />
           <el-table-column align="center" prop="dsName" label="名称" />
-          <el-table-column
-            align="center"
-            prop="dsUrl"
-            width="390"
-            label="连接地址"
-          />
-          <el-table-column
-            align="center"
-            prop="dsStatus"
-            width="60"
-            label="连接状态"
-          >
+          <el-table-column align="center" prop="dsUrl" width="390" label="连接地址" />
+          <el-table-column align="center" prop="dsStatus" width="60" label="连接状态">
             <template #default="scope">
               <span v-if="scope.row.dsStatus == 1" class="normal">正常</span>
               <span v-else class="abnormal">异常</span>
@@ -109,24 +57,14 @@
           </el-table-column>
           <el-table-column align="center" prop="dsDescrition" label="描述">
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="dsCreateTime"
-            label="创建时间"
-            width="150"
-          >
+          <el-table-column align="center" prop="dsCreateTime" label="创建时间" width="150">
             <template #default="{ row }">
               <span>{{
                 dayjs(row.dsCreateTime).format("YYYY-MM-DD HH:mm:ss")
               }}</span>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="dsUpdateTime"
-            label="修改时间"
-            width="150"
-            ><template #default="{ row }">
+          <el-table-column align="center" prop="dsUpdateTime" label="修改时间" width="150"><template #default="{ row }">
               <span>{{
                 dayjs(row.dsUpdateTime).format("YYYY-MM-DD HH:mm:ss")
               }}</span>
@@ -136,14 +74,8 @@
             <template #default="scope">
               <div class="edit">
                 <div class="look" @click="editClick(scope.row)">编辑</div>
-                <el-popconfirm
-                  width="220"
-                  confirm-button-text="确认"
-                  cancel-button-text="取消"
-                  icon-color="#f89626"
-                  title="是否删除此数据源?"
-                  @confirm="deleteClick(scope.row)"
-                >
+                <el-popconfirm width="220" confirm-button-text="确认" cancel-button-text="取消" icon-color="#f89626"
+                  title="是否删除此数据源?" @confirm="deleteClick(scope.row)">
                   <template #reference>
                     <div class="del">删除</div>
                   </template>
@@ -156,227 +88,88 @@
       <!-- 分页组件 -->
       <div class="pageSize">
         <div></div>
-        <el-pagination
-          background
-          :current-page="tableCurrentPage"
-          :page-size="tablePageSize"
-          layout="total, prev, pager, next, jumper, slot"
-          :total="tableTotal"
-          @update:current-page="handleCurrentChange"
-        />
+        <el-pagination background :current-page="tableCurrentPage" :page-size="tablePageSize"
+          layout="total, prev, pager, next, jumper, slot" :total="tableTotal"
+          @update:current-page="handleCurrentChange" />
       </div>
 
       <!-- 新增/编辑对话框 -->
-      <el-dialog
-        class="editDialog"
-        v-model="editVisible"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        :title="titleDialog"
-        align-center
-        width="900"
-        :before-close="cancelEdit"
-        :show-close="false"
-      >
-        <el-form
-          ref="editRef"
-          :model="editRuleForm"
-          :rules="editRules"
-          label-width="100px"
-          class="demo-ruleForm"
-          :size="formSize"
-          label-position="right"
-          status-icon
-          v-loading.fullscreen.lock="dialog_loading"
-          element-loading-text="正在验证数据源有效性,请等待..."
-        >
+      <el-dialog class="editDialog" v-model="editVisible" :close-on-click-modal="false" :close-on-press-escape="false"
+        :title="titleDialog" align-center width="900" :before-close="cancelEdit" :show-close="false">
+        <el-form ref="editRef" :model="editRuleForm" :rules="editRules" label-width="100px" class="demo-ruleForm"
+          :size="formSize" label-position="right" status-icon v-loading.fullscreen.lock="dialog_loading"
+          element-loading-text="正在验证数据源有效性,请等待...">
           <el-form-item label="类型 :" prop="dsClsId">
-            <el-select
-              v-model="editRuleForm.dsClsId"
-              placeholder="请选择类型"
-              style="width: 740px"
-              clearable
-            >
-              <el-option
-                v-for="item in dsClass.list"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
+            <el-select v-model="editRuleForm.dsClsId" placeholder="请选择类型" style="width: 740px" clearable>
+              <el-option v-for="item in dsClass.list" :key="item.value" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
           <el-form-item label="名称 :" prop="dsName">
-            <el-input
-              v-model="editRuleForm.dsName"
-              placeholder="数据源名称"
-              clearable
-              style="width: 740px"
-            />
+            <el-input v-model="editRuleForm.dsName" placeholder="数据源名称" clearable style="width: 740px" />
           </el-form-item>
-          <div
-            v-if="titleDialog == '新增'"
-            style="display: flex; justify-content: space-between"
-          >
+          <div v-if="titleDialog == '新增'" style="display: flex; justify-content: space-between">
             <!-- <span class="typeTitle">使用辅助选项请先选择类型</span> -->
             <el-form-item label="辅助选项 :" prop="ip">
-              <el-input
-                v-model="editRuleForm.ip"
-                placeholder="数据库服务IP地址"
-                clearable
-                @keyup="paramsChange"
-                @blur="paramsChange"
-                @clear="paramsChange"
-                ref="inputRef"
-                maxlength="15"
-              />
+              <el-input v-model="editRuleForm.ip" placeholder="数据库服务IP地址" clearable @keyup="paramsChange"
+                @blur="paramsChange" @clear="paramsChange" ref="inputRef" maxlength="15" />
             </el-form-item>
             <el-form-item label="端口:" prop="port" style="width: 270px">
-              <el-input
-                v-model="editRuleForm.port"
-                placeholder="数据库服务端口号"
-                clearable
-                @keyup="paramsChange"
-                @blur="paramsChange"
-                @clear="paramsChange"
-                maxlength="5"
-              />
+              <el-input v-model="editRuleForm.port" placeholder="数据库服务端口号" clearable @keyup="paramsChange"
+                @blur="paramsChange" @clear="paramsChange" maxlength="5" />
             </el-form-item>
-            <el-form-item
-              label="数据库名称:"
-              prop="dbname"
-              :label-width="'130px'"
-              style="width: 270px"
-            >
-              <el-input
-                v-model="editRuleForm.dbname"
-                placeholder="数据库名称"
-                clearable
-                @keyup="paramsChange"
-                @blur="paramsChange"
-                @clear="paramsChange"
-                maxlength="32"
-              />
+            <el-form-item label="数据库名称:" prop="dbname" :label-width="'130px'" style="width: 270px">
+              <el-input v-model="editRuleForm.dbname" placeholder="数据库名称" clearable @keyup="paramsChange"
+                @blur="paramsChange" @clear="paramsChange" maxlength="32" />
             </el-form-item>
           </div>
           <el-form-item label="连接地址 :" prop="dsUrl">
-            <el-input
-              v-model="editRuleForm.dsUrl"
-              placeholder="数据库连接地址"
-              :disabled="isDisabled"
-              clearable
-              style="width: 740px"
-            />
+            <el-input v-model="editRuleForm.dsUrl" placeholder="数据库连接地址" :disabled="isDisabled" clearable
+              style="width: 740px" />
           </el-form-item>
           <div class="account">
             <el-form-item label="数据库账号 :" prop="dsUser">
-              <el-input
-                v-model="editRuleForm.dsUser"
-                placeholder="请输入数据库账号"
-                clearable
-                maxlength="32"
-              />
+              <el-input v-model="editRuleForm.dsUser" placeholder="请输入数据库账号" clearable maxlength="32" />
             </el-form-item>
             <el-form-item label="数据库密码 :" prop="dsPassword">
-              <el-input
-                v-model="editRuleForm.dsPassword"
-                placeholder="请输入数据库密码"
-                clearable
-                maxlength="32"
-                type="password"
-              />
+              <el-input v-model="editRuleForm.dsPassword" placeholder="请输入数据库密码" clearable maxlength="32"
+                type="password" />
             </el-form-item>
           </div>
           <el-form-item label="描述 :" prop="dsDescrition">
-            <el-input
-              v-model="editRuleForm.dsDescrition"
-              placeholder="请输入该数据库相关简述"
-              clearable
-              type="textarea"
-              :rows="5"
-              maxlength="150"
-              show-word-limit
-              style="width: 740px"
-            />
+            <el-input v-model="editRuleForm.dsDescrition" placeholder="请输入该数据库相关简述" clearable type="textarea" :rows="5"
+              maxlength="150" show-word-limit style="width: 740px" />
           </el-form-item>
           <el-form-item class="options">
-            <el-button
-              color="rgba(41, 109, 227, 1)"
-              class="queding"
-              type="primary"
-              @click="confirmEdit(editRef)"
-              >确认</el-button
-            >
+            <el-button color="rgba(41, 109, 227, 1)" class="queding" type="primary"
+              @click="confirmEdit(editRef)">确认</el-button>
             <el-button @click="cancelEdit(editRef)">取消</el-button>
           </el-form-item>
         </el-form>
       </el-dialog>
 
       <!-- 数据源类别管理对话框 -->
-      <el-dialog
-        v-model="managerDialogVisible"
-        :row-class-name="tableRowClassName"
-        align-center
-        width="1000"
-        title="数据源类别管理"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        @close="getDsClass"
-        class="manager"
-      >
+      <el-dialog v-model="managerDialogVisible" :row-class-name="tableRowClassName" align-center width="1000"
+        title="数据源类别管理" :close-on-click-modal="false" :close-on-press-escape="false" @close="getDsClass"
+        class="manager">
         <div>
-          <div
-            style="
+          <div style="
               display: flex;
               justify-content: space-between;
               margin-bottom: 20px;
-            "
-          >
-            <el-button
-              type="primary"
-              color="rgba(0, 97, 255, 1)"
-              @click="dsAddModifyClass"
-              >增加</el-button
-            >
-            <el-input
-              v-model="dsClassSearch"
-              @change="dsClassNameSearch"
-              @keyup.enter="dsClassNameSearch"
-              size="small"
-              placeholder="搜索数据源类别名称"
-              style="width: 180px"
-              clearable
-            />
+            ">
+            <el-button type="primary" color="rgba(0, 97, 255, 1)" @click="dsAddModifyClass">增加</el-button>
+            <el-input v-model="dsClassSearch" @change="dsClassNameSearch" @keyup.enter="dsClassNameSearch" size="small"
+              placeholder="搜索数据源类别名称" style="width: 180px" clearable />
           </div>
-          <el-table
-            :data="dsClassTableData.list"
-            stripe
-            style="width: 100%"
-            v-loading="dsClassLoading"
-            element-loading-text="加载中..."
-            :header-cell-style="{
+          <el-table :data="dsClassTableData.list" stripe style="width: 100%; height: 450px;" v-loading="dsClassLoading"
+            element-loading-text="加载中..." :header-cell-style="{
               background: 'rgba(240, 243, 247, 1)',
               height: '50px',
               border: 0,
-            }"
-          >
-            <el-table-column
-              prop="dsClsName"
-              label="数据源类别名称"
-              width="180"
-              align="center"
-            />
-            <el-table-column
-              prop="dsClsDriver"
-              label="数据源驱动"
-              width="280"
-              align="center"
-            />
-            <el-table-column
-              prop="dsClsCreateTime"
-              width="180"
-              label="创建时间"
-              align="center"
-            >
+            }">
+            <el-table-column prop="dsClsName" label="数据源类别名称" width="180" align="center" />
+            <el-table-column prop="dsClsDriver" label="数据源驱动" width="280" align="center" />
+            <el-table-column prop="dsClsCreateTime" width="180" label="创建时间" align="center">
               <template #default="{ row }">
                 <span>{{
                   dayjs(row.dsClsCreateTime).format("YYYY-MM-DD HH:mm:ss")
@@ -384,12 +177,7 @@
               </template>
             </el-table-column>
 
-            <el-table-column
-              prop="dsClsUpdateTime"
-              width="180"
-              label="修改时间"
-              align="center"
-            >
+            <el-table-column prop="dsClsUpdateTime" width="180" label="修改时间" align="center">
               <template #default="{ row }">
                 <span>{{
                   dayjs(row.dsClsUpdateTime).format("YYYY-MM-DD HH:mm:ss")
@@ -399,17 +187,9 @@
             <el-table-column align="center" width="120" label="操作">
               <template #default="scope">
                 <div style="display: flex">
-                  <el-button size="small" @click="dsClassEditRow(scope.row)"
-                    >编辑</el-button
-                  >
-                  <el-popconfirm
-                    width="220"
-                    confirm-button-text="确认"
-                    cancel-button-text="取消"
-                    icon-color="#f89626"
-                    title="是否删除此数据源类别?"
-                    @confirm="dsClassDeleteRow(scope.row)"
-                  >
+                  <el-button size="small" @click="dsClassEditRow(scope.row)">编辑</el-button>
+                  <el-popconfirm width="220" confirm-button-text="确认" cancel-button-text="取消" icon-color="#f89626"
+                    title="是否删除此数据源类别?" @confirm="dsClassDeleteRow(scope.row)">
                     <template #reference>
                       <el-button size="small" type="danger">删除</el-button>
                     </template>
@@ -420,69 +200,30 @@
           </el-table>
           <div class="pageSize">
             <span></span>
-            <el-pagination
-              background
-              :current-page="dsClassCurrentPage"
-              :page-size="dsClassPageCount"
-              layout="total, prev, pager, next, jumper, slot"
-              :total="dsClassTableTotal"
-              @update:current-page="handleCurdsClassCurrentPageChangerentChange"
-              style="margin: 20px 0"
-            />
+            <el-pagination background :current-page="dsClassCurrentPage" :page-size="dsClassPageCount"
+              layout="total, prev, pager, next, jumper, slot" :total="dsClassTableTotal"
+              @update:current-page="handleCurdsClassCurrentPageChangerentChange" style="margin: 20px 0" />
           </div>
         </div>
       </el-dialog>
 
       <!-- 新增/编辑 数据源类别 -->
-      <el-dialog
-        v-model="managerAddModifyDialogVisible"
-        :row-class-name="tableRowClassName"
-        :title="dsAddModifyTitle"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        width="30%"
-        top="18vh"
-        class="editDialog"
-      >
-        <el-form
-          ref="dsClassForm"
-          :model="dsAddModifyRuleForm"
-          :rules="dsAddModifyRules"
-          label-width="100px"
-          class="demo-ruleForm"
-          :size="formSize"
-          label-position="right"
-          status-icon
-        >
+      <el-dialog v-model="managerAddModifyDialogVisible" :row-class-name="tableRowClassName" :title="dsAddModifyTitle"
+        :close-on-click-modal="false" :close-on-press-escape="false" width="30%" top="18vh" class="editDialog">
+        <el-form ref="dsClassForm" :model="dsAddModifyRuleForm" :rules="dsAddModifyRules" label-width="100px"
+          class="demo-ruleForm" :size="formSize" label-position="right" status-icon>
           <el-form-item label="名称 :" prop="dsClsName">
-            <el-input
-              v-model="dsAddModifyRuleForm.dsClsName"
-              maxlength="64"
-              placeholder="数据源类别名称"
-              clearable
-              style="width: 740px"
-            />
+            <el-input v-model="dsAddModifyRuleForm.dsClsName" maxlength="64" placeholder="数据源类别名称" clearable
+              style="width: 740px" />
           </el-form-item>
           <el-form-item label="驱动 :" prop="dsClsDriver">
-            <el-input
-              v-model="dsAddModifyRuleForm.dsClsDriver"
-              maxlength="128"
-              placeholder="数据源驱动"
-              clearable
-              style="width: 740px"
-            />
+            <el-input v-model="dsAddModifyRuleForm.dsClsDriver" maxlength="128" placeholder="数据源驱动" clearable
+              style="width: 740px" />
           </el-form-item>
           <el-form-item class="options">
-            <el-button
-              color="rgba(41, 109, 227, 1)"
-              class="queding"
-              type="primary"
-              @click="dsAddModifyConfirmEdit(dsClassForm)"
-              >确认</el-button
-            >
-            <el-button @click="dsAddModifyCancelEdit(dsClassForm)"
-              >取消</el-button
-            >
+            <el-button color="rgba(41, 109, 227, 1)" class="queding" type="primary"
+              @click="dsAddModifyConfirmEdit(dsClassForm)">确认</el-button>
+            <el-button @click="dsAddModifyCancelEdit(dsClassForm)">取消</el-button>
           </el-form-item>
         </el-form>
       </el-dialog>
@@ -1271,6 +1012,7 @@ onUnmounted(() => {
 
     .el-table--fit {
       height: 100%;
+
       :deep(.el-table__header-wrapper) {
         background-color: #000;
         font-size: 14px;
@@ -1385,9 +1127,11 @@ onUnmounted(() => {
           color: red;
           margin: 0 0 6px 100px;
         }
+
         .el-form-item {
           margin-bottom: 28px;
         }
+
         .account {
           display: flex;
           justify-content: space-between;
@@ -1494,6 +1238,7 @@ onUnmounted(() => {
 
       .el-table--fit {
         height: 100%;
+
         :deep(.el-table__header-wrapper) {
           background-color: #000;
           font-size: 14px;
@@ -1554,6 +1299,7 @@ onUnmounted(() => {
     }
 
     .el-pagination {
+
       // width: 1600px;
       :deep(.el-pagination__total) {
         color: #000;

+ 1 - 1
src/views/student/student.vue

@@ -293,7 +293,7 @@
           <el-form-item label="考试类型 :" prop="type">
             <el-select
               v-model="assessRuleForm.type"
-              placeholder="请先选择考核年级"
+              placeholder="请先选择考试类型"
               multiple
               style="width: 400px"
             >

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 227 - 690
src/views/task/task.vue


+ 717 - 0
src/views/trackSearch/trackSearch.vue

@@ -0,0 +1,717 @@
+<template>
+    <div class="content-box">
+      <div class="left">
+        <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
+        <div class="left_title">轨迹查询</div>
+      </div>
+      <div class="middle">
+        <div class="filter">
+          <div class="condition">
+            <el-select
+              v-model="searchInput.name"
+              placeholder="请选择学生"
+              style="width: 180px"
+              @change="searchBtn"
+              :clearable="true"
+            >
+              <el-option
+                v-for="i in gradeData"
+                :label="i.name"
+                :value="i.id"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="condition">
+            <el-date-picker
+              v-model="searchInput.createTime"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="起始时间"
+              end-placeholder="结束时间"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              :prefix-icon="Calendar"
+              placeholder="请选择日期"
+              style="width: 280px"
+              @change="searchBtn"
+            />
+          </div>
+        </div>
+      </div>
+      <div class="trackInfo">
+
+      </div>
+      <div class="scroll">
+        <div class="map"></div>
+        <!-- 家长访客配置 -->
+        <el-dialog
+          class="patriarchDialog"
+          v-model="patriarchVisible"
+          :close-on-click-modal="false"
+          :close-on-press-escape="false"
+          title="家长访客配置"
+          align-center
+          width="650"
+          :before-close="patriarchCancel"
+        >
+        <el-form
+          ref="patriarchRef"
+          :model="patriarchRuleForm"
+          :rules="patriarchRules"
+          label-width="90px"
+          class="demo-ruleForm"
+          :size="formSize"
+          label-position="left"
+          status-icon
+        >
+          <el-form-item label="年级 :" prop="grade">
+            <el-select
+               v-model="patriarchRuleForm.grade"
+               placeholder="请选择年级"
+               style="width: 500px"
+               clearable
+             >
+               <el-option
+                 v-for="i in gradeData"
+                 :label="i.name"
+                 :value="i.id"
+               />
+             </el-select>
+          </el-form-item>
+          <el-form-item label="班级 :" prop="class">
+            <el-select
+               v-model="patriarchRuleForm.class"
+               placeholder="请选择班级"
+               style="width: 500px"
+               clearable
+             >
+               <el-option
+                 v-for="i in classData"
+                 :label="i.name"
+                 :value="i.id"
+               />
+             </el-select>
+          </el-form-item>
+          <p class="title">小程序设置</p>
+          <el-form-item label="" prop="app1">
+            <el-radio-group v-model="patriarchRuleForm.app1">
+             <el-radio :value="3">需要审核</el-radio>
+             <el-radio :value="6">不需要审核</el-radio>
+           </el-radio-group>
+          </el-form-item>
+          <el-form-item label="" prop="app2">
+            <el-radio-group v-model="patriarchRuleForm.app2">
+             <el-radio :value="3">需要推送</el-radio>
+             <el-radio :value="6">不需要推送</el-radio>
+           </el-radio-group>
+          </el-form-item>
+          <el-form-item label="" prop="app3">
+            <el-radio-group v-model="patriarchRuleForm.app3">
+             <el-radio :value="3">需要注销</el-radio>
+             <el-radio :value="6">不需要注销</el-radio>
+           </el-radio-group>
+          </el-form-item>
+          <p class="title">大屏审批设置</p>
+          <el-form-item label="" prop="large1">
+            <el-radio-group v-model="patriarchRuleForm.large1">
+             <el-radio :value="3">需要审核</el-radio>
+             <el-radio :value="6">不需要审核</el-radio>
+           </el-radio-group>
+          </el-form-item>
+          <el-form-item label="" prop="large2">
+            <el-radio-group v-model="patriarchRuleForm.large2">
+             <el-radio :value="3">需要推送</el-radio>
+             <el-radio :value="6">不需要推送</el-radio>
+           </el-radio-group>
+          </el-form-item>
+          <el-form-item label="" prop="large3">
+            <el-radio-group v-model="patriarchRuleForm.large3">
+             <el-radio :value="3">需要注销</el-radio>
+             <el-radio :value="6">不需要注销</el-radio>
+           </el-radio-group>
+          </el-form-item>
+          <p class="title">是否和门禁车闸联动</p>
+          <el-form-item label="" prop="entrance">
+            <el-radio-group v-model="patriarchRuleForm.entrance">
+             <el-radio :value="3">是</el-radio>
+             <el-radio :value="6">否</el-radio>
+           </el-radio-group>
+          </el-form-item>
+        </el-form>
+          <div class="options">
+            <el-button
+              color="rgba(41, 109, 227, 1)"
+              class="queding"
+              type="primary"
+              @click="patriarchConfirm(patriarchMRef)"
+            >
+              确认
+            </el-button>
+            <el-button @click="patriarchCancel">取消</el-button>
+          </div>
+        </el-dialog>
+      </div>
+    </div>
+  </template>
+  
+  <script setup>
+  import {
+    ref,
+    reactive,
+    watch,
+    nextTick,
+    onBeforeMount,
+    onUnmounted,
+  } from "vue";
+  import { useRouter } from "vue-router";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import { Calendar } from "@element-plus/icons-vue";
+  import vidiconsApi from "@/api/vidicons.js";
+  import { dayjs } from "element-plus";
+  import lodash from "lodash";
+  import axios from "axios";
+  import eds from "@/utils/eds.js";
+  import { useStore } from "vuex";
+  const store = useStore();
+  const api = ref("");
+  const router = useRouter();
+  // 表格数据
+  const loading = ref(false);
+  const tableData = reactive({
+    list: [
+    ],
+  });
+  
+  const searchInput = reactive({
+    keyWord: "",
+    type: "0",
+    createTime: "", // 创建时间
+    visitorTime: "", // 来访时间
+  }); // 搜索按钮数据
+
+  const gradeData=ref([{name:'刘晓晓-七年级-学生',id:1}]) // 下拉学生数据
+
+  // 家长访客配置////////////////////////////////////
+  const patriarchVisible=ref(false)
+  const patriarchRef=ref()
+  const patriarchRuleForm=ref({
+    grade: "", // 年级
+    class: "", // 班级
+    app1: "", // 小程序设置1
+    app2: "", // 小程序设置2
+    app3: "", // 小程序设置3
+    large1: "", // 大屏审批设置1
+    large2: "", // 大屏审批设置2
+    large3: "", // 大屏审批设置3
+    entrance: "", // 是否和门禁车闸联动
+    id: "",
+  });
+  const patriarchRules=reactive({
+    grade: [
+      { required: true, message: "年级不能为空", trigger: "blur" },
+    ],
+    class: [
+      { required: true, message: "班级不能为空", trigger: "blur" },
+    ],
+    app1: [
+      { required: true, message: "当前选项不能为空", trigger: "blur" },
+    ],
+    app2: [
+      { required: true, message: "当前选项不能为空", trigger: "blur" },
+    ],
+    app3: [
+      { required: true, message: "当前选项不能为空", trigger: "blur" },
+    ],
+    large1: [
+      { required: true, message: "当前选项不能为空", trigger: "blur" },
+    ],
+    large2: [
+      { required: true, message: "当前选项不能为空", trigger: "blur" },
+    ],
+    large3: [
+      { required: true, message: "当前选项不能为空", trigger: "blur" },
+    ],
+    entrance: [
+      { required: true, message: "当前选择项不能为空", trigger: "blur" },
+    ],
+  });
+  
+  // 预约记录分页数据
+  const getList = async () => {
+    // loading.value = true;
+    let data = {
+      currentPage: currentPage.value,
+      pageCount: pageCount.value,
+      type: searchInput.type, //
+      keyWord: searchInput.keyWord,
+      // managerId: sessionStorage.getItem("token"),
+    };
+    if (searchInput.createTime) {
+      data.createStartTime = searchInput.createTime[0];
+      data.createEndTime = searchInput.createTime[1];
+    }
+    if (searchInput.visitorTime) {
+      data.visitorStartTime = searchInput.visitorTime[0];
+      data.visitorEndTime = searchInput.visitorTime[1];
+    }
+    let res = await axios({
+      method: "get",
+      url: api.value + "/wanzai/api/smartVisitor/appointmentPageRecord",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: data,
+    });
+    console.log(res, "轨迹查询");
+    if (res.data.code == 200) {
+      loading.value = false;
+      tableData.list = JSON.parse(eds.decryptDes(res.data.data)).list;
+      total.value = JSON.parse(eds.decryptDes(res.data.data)).totalCount;
+      // 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 searchBtn = lodash.debounce(async () => {
+  }, 300);
+  
+  // 家长访客配置 (-------------------------------------------)
+  const patriarchClick=()=>{
+    patriarchVisible.value=true
+  }
+  const patriarchConfirm = async (formEl) => {
+    if (!formEl) return;
+    await formEl.validate(async (valid, fields) => {
+      if (valid) {
+        // let data = {
+        // };
+        // let res = "";
+        // if (addMemberRuleForm.id) {
+        //   data.id = addMemberRuleForm.id;
+        //   res = await axios({
+        //     method: "post",
+        //     url: api.value + "/wanzai/api/smartUser/updateSmartUserById",
+        //     headers: {
+        //       token: sessionStorage.getItem("token"),
+        //       user_head: sessionStorage.getItem("userhead"),
+        //     },
+        //     data: data,
+        //   });
+        //   console.log(res, "编辑用户");
+        // } else {
+        //   res = await axios({
+        //     method: "post",
+        //     url: api.value + "/wanzai/api/smartUser/insertSmartUser",
+        //     headers: {
+        //       token: sessionStorage.getItem("token"),
+        //       user_head: sessionStorage.getItem("userhead"),
+        //     },
+        //     data: data,
+        //   });
+        //   console.log(res, "新增用户");
+        // }
+  
+        // if (res.data.code == 200) {
+        //   ElMessage({
+        //     type: "success",
+        //     showClose: true,
+        //     message: res.data.message,
+        //     center: true,
+        //   });
+        // } else {
+        //   ElMessage({
+        //     type: "error",
+        //     showClose: true,
+        //     message: res.data.message,
+        //     center: true,
+        //   });
+        // }
+      } else {
+        console.log("error submit!", fields);
+      }
+    });
+  };
+  const patriarchCancel=()=>{
+    patriarchVisible.value=false
+    patriarchRef.value.resetFields()
+  }
+   
+  //导出功能
+  // const importExcel = async () => {
+  //   if (searchInput.createTime == null) {
+  //     searchInput.createTime = "";
+  //   }
+  //   let data = new FormData();
+  //   data.set("car_number", searchInput.carnumber);
+  //   data.set("create_time", searchInput.createTime);
+  //   let res = await axios({
+  //     method: "post",
+  //     url: api.value + "/carBook/cinfotoExcel.action",
+  //     headers: {
+  //        token: sessionStorage.getItem("token"),
+  // user_head: sessionStorage.getItem("userhead"),
+  //     },
+  //     data: data,
+  //   });
+  //   // console.log(res, "导出账号");
+  //   if (res.data.code == 200) {
+  //     // const elt = document.createElement("a");
+  //     // elt.setAttribute(
+  //     //   "href",
+  //     //   "https://chtech.ncjti.edu.cn/carstop" + res.data.downurl
+  //     // );
+  //     // elt.setAttribute("download", "file.png");
+  //     // elt.style.display = "none";
+  //     // document.body.appendChild(elt);
+  //     // elt.click();
+  //     var downloadPath = "https://chtech.ncjti.edu.cn/carstop" + res.data.downurl;
+  //     console.log("获得地址数据:", 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 {
+  //     ElMessage({
+  //       type: "error",
+  //       showClose: true,
+  //       message: res.data.message,
+  //       center: true,
+  //     });
+  //   }
+  // };
+  // 表格斑马纹颜色修改
+ 
+  // 分页
+  
+  onBeforeMount(async () => {
+    api.value = store.state.user.api;
+    // getList();
+  });
+  onUnmounted(() => {
+    // document.removeEventListener("keyup", Enters);
+  });
+  </script>
+  
+  <style scoped lang="scss">
+  .content-box {
+    min-width: 1000px;
+    width: calc(100vw - 260px);
+    height: calc(100vh - 105px);
+    margin: 20px auto;
+    background-color: #fff;
+    color: #fff;
+    display: flex;
+    flex-direction: column;
+    box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
+    position: relative;
+
+    .left {
+      // width: calc(100wh - 40px);
+      display: flex;
+      align-items: center;
+      height: 60px;
+      margin: 0 20px;
+      border-bottom: 1px solid #ccc;
+      color: rgb(0, 0, 0);
+      font-size: 18px;
+      font-weight: 600;
+      .left_title {
+        height: 60px;
+        line-height: 60px;
+      }
+    }
+    
+    .middle {
+      width: calc(100% - 60px);
+      margin: 0 auto;
+      position: absolute;
+      top: 100px;
+      left: 50px;
+      color: #000;
+  
+      // border-bottom: 1px solid rgb(231, 231, 231);
+      .filter {
+        display: flex;
+        flex-wrap: wrap;
+        align-items: center;
+  
+        .search {
+          color: #fff;
+        }
+  
+        .condition {
+          display: flex;
+          align-items: center;
+          margin:0 25px 0 0;
+          :deep(.el-select){
+            .el-select__wrapper{
+              box-shadow:none;
+              background-color:rgba(133, 191, 242, 0.5);
+            }
+            .el-select__selected-item{
+              color: rgba(255,255,255,0.7);
+            }
+            .el-select__suffix{
+              .el-icon{
+                color: rgba(255,255,255,0.7);
+              }
+            }
+          }    
+          :deep(.el-date-editor){
+            background-color:rgba(133, 191, 242, 0.5);
+            box-shadow:none;
+            .el-icon{
+              color: rgba(255,255,255,0.7);
+            }
+            .el-range-input{
+              &::placeholder {
+                color: rgba(255,255,255,0.7); /* 更改为你想要的颜色代码 */
+              }
+            }
+            .el-range-separator{
+              color: rgba(255,255,255,0.7);
+            }
+          }      
+        }
+      }
+  
+      .gongneng {
+        margin: 10px 0 10px 0;
+      }
+    }
+    .trackInfo{
+      position: absolute;
+      width: 357px;
+      height: 400px;
+    }
+    .scroll {
+      width: calc(100% - 40px);
+      height: calc(100% - 61px);
+      margin: 0 auto;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      .map{
+        width: 100%;
+        height: calc(100% - 30px);
+        overflow: hidden;
+        background: url('@/assets/trackImg.jpg');
+        background-repeat:no-repeat; //是否平铺
+        background-position:70% 50%;//设置背景图像的起始位置
+        background-size:120% 140%;//规定背景图像的尺寸
+      }
+    }
+    // .footer {
+    //   width: calc(100% - 60px);
+    //   height: calc(100% - 80px);
+    //   margin: 10px auto 20px;
+  
+    //   .el-table--fit {
+    //     height: 100%;
+  
+    //     :deep(.el-table__header-wrapper) {
+    //       background-color: #000;
+    //       font-size: 14px;
+  
+    //       tr {
+    //         // color: #000;
+    //       }
+    //     }
+    //     :deep(.el-table__row):nth-child(2n) {
+    //       // .el-table-fixed-column--left {
+    //       //   background-color: rgba(240, 243, 247, 1);
+    //       // }
+    //       // .el-table-fixed-column--right {
+    //       //   background-color: rgba(240, 243, 247, 1);
+    //       // }
+    //       td {
+    //         background-color: rgba(240, 243, 247, 1);
+    //       }
+    //     }
+  
+    //     :deep(.el-table__row) {
+    //       height: 50px;
+    //       font-size: 14px;
+    //       // color: #000;
+    //       td {
+    //         padding: 0;
+    //         // border: 0;
+    //       }
+    //       &:hover {
+    //         td {
+    //           background-color: rgba(223, 236, 254, 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);
+    //       // .el-table_1_column_1 {
+    //       //   background-color: rgba(240, 243, 247, 1);
+    //       // }
+    //       // .el-table_1_column_2 {
+    //       //   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;
+    //     // }
+    //   }
+    // }
+    // 家长访客配置
+    :deep(.patriarchDialog) {
+      //   height: 420px;
+      border-radius: 11px;
+      .el-dialog__header {
+        border-radius: 11px 11px 0 0;
+        background: rgba(237, 241, 245, 1);
+        font-weight: 600;
+        margin: 0;
+        .el-dialog__headerbtn {
+          outline: none;
+        }
+      }
+      .el-dialog__body {
+        padding: 20px 30px;
+        .el-form{
+          .title{
+            color: #000;
+            font-weight: 800;
+          }
+          .el-form-item__content{
+            margin-left: 0 !important;
+          }
+        }
+        .options {
+          margin: 30px 20px 20px 0;
+          width: 100%;
+          display: flex;
+          flex-direction: row-reverse;
+          .queding {
+            color: #fff;
+            margin-left: 15px;
+          }
+        }
+      }
+    }
+  
+    .pageSize {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      margin: 0 30px;
+  
+      span {
+        color: #000;
+      }
+  
+      .el-pagination {
+        // width: 1600px;
+        :deep(.el-pagination__total) {
+          color: #000;
+        }
+  
+        :deep(.el-pagination__goto) {
+          color: #000;
+        }
+  
+        :deep(.el-pagination__classifier) {
+          color: #000;
+        }
+  
+        :deep(.el-input__wrapper) {
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          box-shadow: none;
+        }
+  
+        :deep(.el-pager li) {
+          margin: 0 5px;
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          background-color: transparent;
+        }
+  
+        :deep(.el-pager li.is-active) {
+          // background-color: rgba(0, 97, 255, 0.8);
+          border: 1px solid rgba(0, 97, 255, 1);
+          color: rgba(0, 97, 255, 1);
+        }
+  
+        :deep(.btn-prev) {
+          margin-right: 5px;
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          background-color: transparent;
+        }
+  
+        :deep(.btn-next) {
+          margin-left: 5px;
+          border: 1px solid rgba(0, 0, 0, 1);
+          border-radius: 5px;
+          background-color: transparent;
+        }
+      }
+    }
+  }
+  
+  .el-input {
+    width: 192px;
+  }
+  </style>
+  

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1675 - 0
src/views/trafficRecord/trafficRecord.vue


+ 190 - 46
src/views/user/user.vue

@@ -140,7 +140,7 @@
               >勾选删除</el-button
             >
            
-              <el-button-group class="ml-4">
+              <!-- <el-button-group class="ml-4">
                 <el-tooltip
               class="box-item"
               effect="dark"
@@ -157,15 +157,26 @@
               >
           </el-tooltip>
                 <el-button type="primary" @click="exportSettingsClick" style="border-left: 0px ;" plain color="rgba(0, 97, 255, 1)" :icon="Tools" />
-              </el-button-group>
-              <!-- <el-button
+              </el-button-group> -->
+              
+                <el-tooltip
+              class="box-item"
+              effect="dark"
+              content="根据当前选中的部门、查询中的用户姓名进行导出"
+              placement="top-start"
+            > <el-button
                 type="primary"
                 color="rgba(0, 97, 255, 1)"
-                @click="importExcel"
+                @click="exportSettingsClick"
                 :disabled="isManage != 1"
                 plain
+                style="margin-right: 0;border-right: 0px ;"
                 >导出用户</el-button
-              > -->
+              >
+          </el-tooltip>
+          <!-- <el-button-group class="ml-4">
+                <el-button type="primary" @click="exportSettingsClick" style="border-left: 0px ;" plain color="rgba(0, 97, 255, 1)" :icon="Tools" />
+              </el-button-group> -->
            
             <el-button
               type="primary"
@@ -196,7 +207,7 @@
               width="80"
             />
             <el-table-column align="center" prop="name" label="姓名" />
-            <el-table-column align="center" prop="name" label="时间组" />
+            <el-table-column align="center" prop="timeGroupName" label="时间组" />
             <el-table-column align="center" prop="identity" label="身份" />
             <el-table-column align="center" prop="department" label="部门" />
             <el-table-column
@@ -264,27 +275,6 @@
               <img src="@/assets/images/basicInfo.png" alt="" />
               <span>基本信息</span>
             </div>
-            <el-form-item
-              :key="addMemberRuleForm.identity"
-              label="学号 :"
-              :prop="addMemberRuleForm.identity == 1 ? '' : 'serialNumber'"
-            >
-              <el-input
-                :disabled="addMemberTitle == '编辑成员' ? true : false"
-                v-model="addMemberRuleForm.serialNumber"
-                placeholder="请输学号"
-                clearable
-                style="width: 500px"
-              />
-            </el-form-item>
-            <el-form-item label="姓名 :" prop="name">
-              <el-input
-                v-model="addMemberRuleForm.name"
-                placeholder="请输入姓名"
-                clearable
-                style="width: 500px"
-              />
-            </el-form-item>
             <el-form-item label="身份 :" prop="identity">
               <el-select
                 v-model="addMemberRuleForm.identity"
@@ -327,6 +317,28 @@
               </el-tooltip> -->
             </el-form-item>
             <el-form-item
+              :key="addMemberRuleForm.identity"
+              label="学号 :"
+              :prop="addMemberRuleForm.identity == 1 ? '' : 'serialNumber'"
+            >
+              <el-input
+                :disabled="addMemberTitle == '编辑成员' ? true : false"
+                v-model="addMemberRuleForm.serialNumber"
+                placeholder="请输学号"
+                clearable
+                style="width: 500px"
+              />
+            </el-form-item>
+            <el-form-item label="姓名 :" prop="name">
+              <el-input
+                v-model="addMemberRuleForm.name"
+                placeholder="请输入姓名"
+                clearable
+                style="width: 500px"
+              />
+            </el-form-item>
+         
+            <el-form-item
               label="身份证号 :"
               :prop="addMemberRuleForm.identity == 1 ? '' : ''"
             >
@@ -448,7 +460,8 @@
             </el-form-item>
             <el-form-item
               label="任课班级 :"
-              :prop="addMemberRuleForm.identity == 1 ? '' : 'timeGroupId'"
+              prop="teachingClass"
+              v-if="addMemberRuleForm.identity == 3"
             >
               <el-cascader
                 style="width: 500px"
@@ -458,6 +471,7 @@
                 :props="teachingClassProps"
                 @change="teachingClassChange"
                 clearable
+                ref='teachingClassRef'
               />
             </el-form-item>
             <el-form-item
@@ -1258,7 +1272,7 @@
       <div class="move">
         <el-transfer
          v-model="exportSettingsSel"
-         :titles="['未选择', '已选择']"
+         :titles="['未选择', '已选择导出字段']"
          :left-default-checked="leftChecked"
          :right-default-checked="rightChecked"
          :props="{
@@ -1276,7 +1290,7 @@
           type="primary"
           @click="confirmExportSettings"
         >
-          确认
+          确认导出
         </el-button>
         <el-button @click="cancelExportSettings">取消</el-button>
       </div>
@@ -1558,7 +1572,8 @@ const conteactListPageCount = ref(50); // 联系人下拉一页数据条数
 const conteactListTotalPage = ref(); // 联系人总共多少页,判断滚动到底是否还要加载
 const conteactListInput = ref(); // 联系人下拉框中的搜索字段
 const conteactLoading = ref(false); // 联系人下拉框搜索时加载
-const teachingClassProps = { multiple: true }; // 任课班级
+const teachingClassRef=ref()
+const teachingClassProps = { multiple: true,label:'name',value:'id',children:'children' }; // 任课班级
 const teachingClassData = ref([
   {
     value: 1,
@@ -1647,7 +1662,7 @@ const upload = ref(); // 人脸照片
 // 表单验证
 const checkPhone = (rule, value, callback) => {
   var reg =
-    /^(0|\+?86|17951)?(13[0-9]|15[012356789]|17[013678]|18[0-9]|14[57])[0-9]{8}$/;
+  /^[1][0-9]{10}$/;
   if (!reg.test(value)) {
     callback(new Error("手机号格式不对"));
   } else {
@@ -1677,6 +1692,7 @@ const addMemberRules = reactive({
   // institute: [{ required: true, message: "学院不能为空", trigger: "blur" }],
   // specialty: [{ required: true, message: "专业不能为空", trigger: "blur" }],
   class: [{ required: true, message: "班级不能为空", trigger: "change" }],
+  teachingClass:[{ required: true, message: "任课班级不能为空", trigger: "change" }],
   // school: [{ required: true, message: "校区不能为空", trigger: "blur" }],
   // dormitory: [{ required: true, message: "宿舍号不能为空", trigger: "blur" }],
   phone: [
@@ -1862,17 +1878,14 @@ const getList = async () => {
     },
     params: data,
   });
-  console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "用户列表");
+  // console.log(res);
+  console.log(res,JSON.parse(eds.decryptDes(res.data.data)), "用户列表");
+  
   if (res.data.code == 200) {
     loading.value = false;
-    tableData.list = JSON.parse(eds.decryptDes(res.data.data)).list;
-    total.value = JSON.parse(eds.decryptDes(res.data.data)).totalCount;
-    // ElMessage({
-    //   type: "success",
-    //   showClose: true,
-    //   message: res.data.message,
-    //   center: true,
-    // });
+    let datas=JSON.parse(eds.decryptDes(res.data.data))
+    tableData.list = datas.list;
+    total.value = datas.totalCount;
   } else {
     loading.value = false;
     ElMessage({
@@ -2181,6 +2194,27 @@ const postList = async () => {
     postData.value = [];
   }
 };
+// 任课班级数据
+const teachingClassList = async () => {
+  // let data = {
+  //   identityId: addMemberRuleForm.identity,
+  // };
+  let post = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartTeaching/queryTeachings",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    // params: data,
+  });
+  console.log(post,"任课班级数据");
+  if (post.data.code == 200) {
+    teachingClassData.value = post.data.data;
+  } else {
+    teachingClassData.value = [];
+  }
+};
 // 班级下拉数据
 const classsList = async () => {
   let data = {
@@ -2200,6 +2234,7 @@ const classsList = async () => {
     classsData.value = JSON.parse(eds.decryptDes(classs.data.data));
   }
 };
+
 // 改变身份加载职务数据
 const identityChange = () => {
   addMemberRuleForm.duty = "";
@@ -2315,6 +2350,7 @@ const addMemberClick = () => {
   addMemberRuleForm.facePhoto = "";
   addMemberRuleForm.compressFacePhoto = "";
   addMemberRuleForm.grade = "";
+  addMemberRuleForm.teachingClass = "";
   addMemberRuleForm.institute = "";
   addMemberRuleForm.specialty = "";
   addMemberRuleForm.class = "";
@@ -2335,6 +2371,7 @@ const addMemberClick = () => {
 };
 const teachingClassChange=(val)=>{
   console.log(val);
+  console.log(teachingClassRef.value.getCheckedNodes());
   
 }
 // 编辑成员弹窗
@@ -2365,6 +2402,7 @@ const editClick = (row) => {
   nextTick(() => {
     classsList();
   });
+  
   addMemberRuleForm.institute = row.college; // 学院
   addMemberRuleForm.specialty = row.speciality; // 专业
   addMemberRuleForm.class = row.schoolClass; // 班级
@@ -2381,6 +2419,26 @@ const editClick = (row) => {
   } else {
     addMemberRuleForm.contact = [];
   }
+  if(row.subjectVos){
+    let idArr=[]
+    // row.subjectVos.forEach(item=>{
+    //   item.children.forEach(is=>{
+    //     is.children.forEach(i=>{
+    //       idArr.push([item.id,is.id,i.id])
+    //     })
+    //   })
+    // })
+    // console.log(idArr,"任课班级数据重组");
+    row.subjectVos.forEach(item=>{
+      idArr.push(item.ids)
+    })
+    console.log(idArr,'任课班级数据重组');
+    
+    addMemberRuleForm.teachingClass=idArr
+  }else{
+    addMemberRuleForm.teachingClass=[]
+  }
+  
   addMemberRuleForm.jobName = row.title; // 职称
   addMemberRuleForm.houseAddress = row.address; // 家庭住址
   addMemberRuleForm.nation = row.nation; // 民族
@@ -2401,6 +2459,12 @@ const confirmAddMember = async (formEl) => {
         arr.push(index[1]);
       });
       console.log(arr);
+// 任课班级
+      let teachingClassArr=[]
+      addMemberRuleForm.teachingClass.forEach(item=>{
+        teachingClassArr.push({ids:item})
+      })
+
       let data = {
         cardNo: addMemberRuleForm.serialNumber, // 学号
         name: addMemberRuleForm.name, // 姓名
@@ -2428,6 +2492,7 @@ const confirmAddMember = async (formEl) => {
       let res = "";
       if (addMemberRuleForm.id) {
         data.id = addMemberRuleForm.id;
+        data.usr = teachingClassArr,// 任课班级
         res = await axios({
           method: "post",
           url: api.value + "/wanzai/api/smartUser/updateSmartUserById",
@@ -2439,6 +2504,7 @@ const confirmAddMember = async (formEl) => {
         });
         console.log(res, "编辑用户");
       } else {
+        data.isr = teachingClassArr,// 任课班级
         res = await axios({
           method: "post",
           url: api.value + "/wanzai/api/smartUser/insertSmartUser",
@@ -2788,6 +2854,33 @@ const delRecordClose = () => {
 };
 
 // 批量导入模板下载 (-------------------------------------------------)
+// 用户导出设置  数据
+const importSystemList=async ()=>{
+  let data = {
+    identityId: addMemberRuleForm.identity,
+  };
+  let post = await axios({
+    method: "get",
+    url: api.value + "/wanzai/api/smartUser/gauageOutfit",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(post,'用户导出设置  数据');
+  if (post.data.code == 200) {
+    exportSettingsData.value = post.data.data;
+    let arr=[]
+    post.data.data.forEach(item=>{
+      arr.push(item.id)
+    })
+    exportSettingsSel.value=arr
+    console.log(exportSettingsSel.value);
+  } else {
+    exportSettingsData.value = [];
+  }
+}
 const downLoadtempAdd = async (flag) => {
   if (flag == 1) {
     let res = await axios({
@@ -3326,12 +3419,58 @@ const exportSettingsChange=(
   direction,
   movedKeys
 ) => {
-  console.log(exportSettingsSel.value);
-  
+  // console.log(exportSettingsSel.value);
   console.log(value, direction, movedKeys)
 }
-const confirmExportSettings=()=>{
-  console.log("确定用户设置");
+const confirmExportSettings=async ()=>{
+  let arr=[]
+  exportSettingsData.value.forEach(item=>{
+    exportSettingsSel.value.forEach(i=>{
+      if(item.id==i){
+        arr.push(item)
+      }
+    })
+  })
+  let data = {
+    departmentId: treeNodeId.value,
+    name: searchInput.keyWord,
+    gauageOutfitVos:arr
+  };
+  let res = await axios({
+    method: "post",
+    url: api.value + "/wanzai/api/smartUser/smartUserExport",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: data,
+    responseType: "blob",
+  });
+  console.log(res, "导出用户1");
+  if (res.status == 200) {
+    let name = `用户信息表`;
+    var content = res.data;
+    var datas = new Blob([content]);
+    var downloadUrl = window.URL.createObjectURL(datas);
+    var anchor = document.createElement("a");
+    anchor.href = downloadUrl;
+    anchor.download = name + ".xlsx";
+    anchor.click();
+    window.URL.revokeObjectURL(datas);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: "导出成功",
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 }
 const cancelExportSettings=()=>{
   exportSettingsVisible.value=false
@@ -3491,6 +3630,8 @@ onBeforeMount(async () => {
   getDepartment(); // 左边部门树形结构
   classDataList(); // 添加成员中 获取身份数据下拉、年级数据下拉、班级数据下拉
   postList(); // 职务数据
+  teachingClassList() // 任课班级数据
+  importSystemList()// 导出设置列表
 });
 onUnmounted(() => {
   document.removeEventListener("keyup", Enters);
@@ -4347,7 +4488,10 @@ onUnmounted(() => {
           margin-top: 10px;
           height: 100%;
           .el-transfer-panel__body{
-            height: 450px;
+            height: 458px;
+            .el-checkbox-group{
+              height: 100%;
+            }
           }
         }
       }