Przeglądaj źródła

完成第一版校车预约登记

hzj18279462576@163.com 3 lat temu
rodzic
commit
bc78dc9ed5

BIN
dist.zip


+ 4 - 0
src/App.vue

@@ -18,5 +18,9 @@ const router = useRouter();
   margin: 0;
   padding: 0;
   text-align: unset;
+  // width: 100%;
+  // height: 100%;
+  // margin: 0;
+  // padding: 0;
 }
 </style>

BIN
src/assets/back.png


BIN
src/assets/blacklist.png


BIN
src/assets/blacklistA.png


BIN
src/assets/news1.png


BIN
src/assets/path.png


BIN
src/assets/pathA.png


BIN
src/assets/system.png


BIN
src/assets/system111.png


BIN
src/assets/systemA.png


+ 160 - 2
src/layout/index.vue

@@ -13,11 +13,140 @@ import { ref, reactive, onBeforeMount, onMounted, watch } from "vue";
 import Navbar from "./sidebar/Navbar.vue";
 import SidevarItem from "./sidebar/SidevarItem.vue";
 import { useStore } from "vuex";
+import axios from "axios";
 import { useRouter } from "vue-router";
 const store = useStore();
 const router = useRouter();
+const api = ref("");
+watch(
+  () => router.currentRoute.value.fullPath,
+  (newValue, oldValue) => {
+    // console.log(newValue);
+    if (newValue == "/schoolBus/statement") {
+      store.commit("indexUp", 1);
+      sessionStorage.setItem("sidevarItem", 1);
+    }
+    if (newValue == "/schoolBus/staff") {
+      store.commit("indexUp", 2);
+      sessionStorage.setItem("sidevarItem", 2);
+    }
+    if (newValue == "/schoolBus/account") {
+      store.commit("indexUp", 3);
+      sessionStorage.setItem("sidevarItem", 3);
+    }
+    if (newValue == "/schoolBus/bus") {
+      store.commit("indexUp", 4);
+      sessionStorage.setItem("sidevarItem", 4);
+    }
+    if (newValue == "/schoolBus/classes") {
+      store.commit("indexUp", 6);
+      sessionStorage.setItem("sidevarItem", 6);
+    }
+    if (newValue == "/schoolBus/buspath") {
+      store.commit("indexUp", 5);
+      sessionStorage.setItem("sidevarItem", 5);
+    }
+
+    if (newValue == "/schoolBus/waiting") {
+      store.commit("indexUp", 8);
+      sessionStorage.setItem("sidevarItem", 8);
+    }
+    if (newValue == "/schoolBus/blacklist") {
+      store.commit("indexUp", 7);
+      sessionStorage.setItem("sidevarItem", 7);
+    }
+    if (newValue == "/schoolBus/news") {
+      store.commit("indexUp", 0);
+      sessionStorage.setItem("sidevarItem", 0);
+    }
+  }
+);
+const tableData = reactive({
+  list: [],
+});
+onBeforeMount(async () => {
+  api.value = store.state.user.api;
 
-onBeforeMount(() => {});
+  {
+    let data = new FormData();
+    data.set("page", 1);
+    data.set("rows", 100);
+    let res = await axios({
+      method: "post",
+      url: store.state.user.api + "/carBook/routelist.action",
+      headers: {
+        token: sessionStorage.getItem("token"),
+      },
+      data: data,
+    });
+    console.log(res, "路线管理");
+    if (res.status == 200) {
+      tableData.list = res.data.rows;
+      tableData.list.forEach((item) => {
+        // item.route2 = item.route;
+        // item.route_end2 = item.route_end;
+        item.path_start = item.route.split("-")[0];
+        item.path_end = item.route.split("-")[1];
+        if (item.is_repair == "" || item.is_repair == 0) {
+          item.state = false;
+        } else if (item.is_repair == 1) {
+          item.state = true;
+        }
+      });
+      let obj = {};
+      var reduce = tableData.list.reduce((curr, next) => {
+        /*判断对象中是否已经有该属性  没有的话 push 到 curr数组*/
+        obj[next.route_end] ? "" : (obj[next.route_end] = curr.push(next));
+        return curr;
+      }, []);
+      sessionStorage.setItem("route_endSelect", JSON.stringify(reduce));
+      let obj2 = {};
+      var reduce2 = tableData.list.reduce((curr, next) => {
+        /*判断对象中是否已经有该属性  没有的话 push 到 curr数组*/
+        obj2[next.route] ? "" : (obj2[next.route] = curr.push(next));
+        return curr;
+      }, []);
+      sessionStorage.setItem("pathSelect", JSON.stringify(reduce2));
+    } else {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    }
+  }
+  {
+    let data = new FormData();
+    data.set("page", 1);
+    data.set("rows", 100); //前面的key记得对应!
+    // let res = await adminApi.adminLogin(data);
+    let res = await axios({
+      method: "post",
+      url: store.state.user.api + "/carBook/cinfolist.action",
+      headers: {
+        token: sessionStorage.getItem("token"),
+      },
+      data: data,
+    });
+    console.log(res, "车辆管理");
+    if (res.status == 200) {
+      sessionStorage.setItem("busSelect", JSON.stringify(res.data.rows));
+    } else {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+      if (res.data.message == "token错误") {
+        router.push({
+          path: `/login`,
+        });
+      }
+    }
+  }
+});
 </script>
 
 <style scoped lang="scss">
@@ -25,7 +154,7 @@ onBeforeMount(() => {});
   display: flex;
   .content {
     // min-width: 1740px;
-    max-width: calc(1920px - 78px);
+    max-width: calc(100vw - 200px);
     width: 100%;
     height: calc(100vh);
     background-color: rgba(238, 238, 238, 1);
@@ -49,6 +178,7 @@ onBeforeMount(() => {});
     }
     .el-button--primary:hover {
       background-color: rgb(119, 133, 239);
+      border: 0.5px solid rgb(119, 133, 239);
     }
   }
 }
@@ -59,4 +189,32 @@ onBeforeMount(() => {});
     }
   }
 }
+.pw {
+  .el-dialog__body {
+    .el-form {
+      .el-form-item {
+        .queding {
+          background-color: rgba(61, 81, 232, 1);
+          border: 0.5px solid rgba(61, 81, 232, 1);
+        }
+        .queding:hover {
+          background-color: rgb(119, 133, 239);
+          border: 0.5px solid rgb(119, 133, 239);
+        }
+      }
+    }
+  }
+}
+#notification_1 {
+  .el-notification__group {
+    .el-notification__title {
+      color: red;
+    }
+    .el-notification__content {
+      p {
+        // color: red;
+      }
+    }
+  }
+}
 </style>

+ 128 - 6
src/layout/sidebar/Navbar.vue

@@ -28,10 +28,20 @@
     </div>
     <div class="login">
       <span class="dateTime">{{ dateTime }}</span>
+      <el-badge :value="titlenumber" class="item" v-if="titlenumber">
+        <img
+          src="@/assets/news.png"
+          @click="newsClick"
+          style="width: 20px; height: 20px; cursor: pointer"
+          alt=""
+        />
+        <!-- <el-icon><Bell /></el-icon> -->
+      </el-badge>
       <img
+        v-else
         src="@/assets/news.png"
         @click="newsClick"
-        style="width: 20px; height: 20px; padding: 0 20px 0 0; cursor: pointer"
+        style="width: 20px; height: 20px; cursor: pointer"
         alt=""
       />
       <div class="flex flex-wrap items-center" style="cursor: pointer">
@@ -57,6 +67,7 @@
                 width="30%"
                 :before-close="uppasswordClose"
                 align-center
+                :close-on-click-modal="false"
               >
                 <el-form
                   ref="ruleFormRef"
@@ -72,12 +83,14 @@
                     <el-input
                       v-model="ruleForm.oldpass"
                       placeholder="请输入原密码"
+                      clearable
                     />
                   </el-form-item>
                   <el-form-item label="新密码" prop="nowpass">
                     <el-input
                       v-model="ruleForm.nowpass"
                       placeholder="请输入新密码"
+                      clearable
                     />
                   </el-form-item>
                   <el-form-item
@@ -91,6 +104,7 @@
                     <el-input
                       v-model="ruleForm.correctpass"
                       placeholder="请再次输入新密码"
+                      clearable
                     />
                   </el-form-item>
 
@@ -126,20 +140,23 @@
           </template>
         </el-dropdown>
       </div>
-      <span class="name">admin</span>
+      <span class="name">{{ username }}</span>
     </div>
   </el-menu>
 </template>
 
 <script setup>
 import { ref, reactive, onBeforeMount, onMounted, watch } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
+import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
 import { useStore } from "vuex";
 import { useRouter } from "vue-router";
 import { dayjs } from "element-plus";
+import axios from "axios";
 
 const store = useStore();
 const router = useRouter();
+const username = ref(); // 账号名称
+const titlenumber = ref(1); //  消息条数
 const activeIndex = ref(); // 路由路径
 const loginOutDialogVisible = ref(false); // 退出按钮
 const menuclose = ref(false); // 左边状态栏展开按钮状态
@@ -169,7 +186,7 @@ const rules = reactive({
   correctpass: [
     {
       required: true,
-      message: "确定新密码是否正确",
+      message: "两次密码是否输入正确",
       trigger: "blur",
     },
   ],
@@ -179,6 +196,7 @@ const rules = reactive({
 // 点击消息通知
 const newsClick = () => {
   store.commit("indexUp", 0);
+  sessionStorage.setItem("sidevarItem", 0);
   router.push({
     path: `/schoolBus/news`,
   });
@@ -201,6 +219,7 @@ const SpreadMenu = (flag) => {
 // 修改密码
 const uppassword = () => {
   uppasswordShow.value = true;
+  // ruleForm.oldpass = store.state.user.password;
 };
 const uppasswordClose = () => {
   uppasswordShow.value = false;
@@ -212,9 +231,84 @@ const uppasswordClose = () => {
 // 提交修改密码表单
 const submitForm = async (formEl) => {
   if (!formEl) return;
-  await formEl.validate((valid, fields) => {
+  await formEl.validate(async (valid, fields) => {
     if (valid) {
-      // console.log("submit!");
+      let data = new FormData();
+      data.set("page", 1);
+      data.set("rows", 2000); //前面的key记得对应!
+      let res = await axios({
+        method: "post",
+        url: "/api/carBook/adminlist.action",
+        headers: {
+          token: sessionStorage.getItem("token"),
+        },
+        data,
+      });
+      // console.log(res.data.rows);
+      let account = res.data.rows.filter((item) => {
+        return item.number == sessionStorage.getItem("username");
+      });
+      console.log(account);
+      let dataUpdata = {
+        name: account[0].name,
+        number: account[0].number,
+        password: ruleForm.correctpass,
+        id: account[0].id,
+      };
+      if (ruleForm.oldpass == account[0].password) {
+        if (ruleForm.nowpass == ruleForm.correctpass) {
+          let resUpdata = await axios({
+            method: "post",
+            url: "/api/carBook/adminupdate.action",
+            headers: {
+              "Content-Type": "application/json;charset=utf-8",
+              token: sessionStorage.getItem("token"),
+            },
+            data: dataUpdata,
+          });
+          console.log(resUpdata);
+          if (resUpdata.data.code == 200) {
+            ElMessage({
+              type: "success",
+              showClose: true,
+              message: resUpdata.data.message,
+              center: true,
+            });
+            sessionStorage.removeItem("token");
+            localStorage.removeItem("pass");
+            uppasswordShow.value = false;
+            ruleFormRef.value.resetFields();
+            ElNotification({
+              type: "warning",
+              title: "提示!!!",
+              message: "密码已修改,请重新登录页面",
+              // duration: 0,
+              // position: "top-right",
+            });
+          } else {
+            ElMessage({
+              type: "error",
+              showClose: true,
+              message: res.data.message,
+              center: true,
+            });
+          }
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: "两次密码输入不正确",
+            center: true,
+          });
+        }
+      } else {
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: "原密码输入错误",
+          center: true,
+        });
+      }
     } else {
       console.log("error submit!", fields);
     }
@@ -253,6 +347,13 @@ const loginOut = () => {
 
 onBeforeMount(() => {
   activeIndex.value = store.state.user.navbar;
+  if (sessionStorage.getItem("newsNum") == 0) {
+    titlenumber.value = "";
+  } else {
+    titlenumber.value = sessionStorage.getItem("newsNum");
+  }
+
+  username.value = sessionStorage.getItem("username");
   // handleSelect("vidicons");
   setInterval(() => {
     var week = ["日", "一", "二", "三", "四", "五", "六"];
@@ -295,6 +396,17 @@ onBeforeMount(() => {
     .dateTime {
       margin-right: 20px;
     }
+    .el-badge {
+      display: flex;
+      align-items: center;
+      :deep(.el-badge__content) {
+        width: 2px;
+        height: 14px;
+      }
+    }
+    .items-center {
+      margin-left: 20px;
+    }
     .name {
       height: 20px;
       line-height: 20px;
@@ -319,6 +431,16 @@ onBeforeMount(() => {
     background-color: rgba(67, 146, 249, 0.1);
   }
 }
+.el-dialog__body {
+  .options {
+    display: flex;
+    flex-direction: row-reverse;
+    :deep(.el-form-item__content) {
+      margin-left: 0 !important;
+      flex: none;
+    }
+  }
+}
 </style>
 <style lang="scss">
 .el-overlay {

+ 43 - 20
src/layout/sidebar/SidevarItem.vue

@@ -36,19 +36,34 @@
         <span>车辆管理</span>
       </el-menu-item>
       <el-menu-item :index="5">
-        <img v-if="activeIndex == 5" src="@/assets/classesA.png" alt="" />
-        <img v-else src="@/assets/classes.png" alt="" />
-        <span>班次管理</span>
+        <img v-if="activeIndex == 5" src="@/assets/pathA.png" alt="" />
+        <img v-else src="@/assets/path.png" alt="" />
+        <span>路线管理</span>
       </el-menu-item>
       <el-menu-item :index="6">
-        <img v-if="activeIndex == 6" src="@/assets/carnumberA.png" alt="" />
-        <img v-else src="@/assets/carnumber.png" alt="" />
-        <span>次管理</span>
+        <img v-if="activeIndex == 6" src="@/assets/classesA.png" alt="" />
+        <img v-else src="@/assets/classes.png" alt="" />
+        <span>次管理</span>
       </el-menu-item>
       <el-menu-item :index="7">
-        <img v-if="activeIndex == 7" src="@/assets/waitingA.png" alt="" />
-        <img v-else src="@/assets/waiting.png" alt="" />
-        <span>候补设置</span>
+        <img v-if="activeIndex == 7" src="@/assets/blacklistA.png" alt="" />
+        <img v-else src="@/assets/blacklist.png" alt="" />
+        <span>黑名单管理</span>
+      </el-menu-item>
+      <el-menu-item :index="8">
+        <img
+          v-if="activeIndex == 8"
+          src="@/assets/systemA.png"
+          alt=""
+          style="width: 20px; height: 20px"
+        />
+        <img
+          v-else
+          src="@/assets/system.png"
+          alt=""
+          style="width: 20px; height: 20px"
+        />
+        <span>系统设置</span>
       </el-menu-item>
     </el-menu>
   </div>
@@ -57,12 +72,7 @@
 <script setup>
 import { ref, onBeforeMount, onMounted, watch, reactive } from "vue";
 import { useStore } from "vuex";
-import {
-  Document,
-  Menu as IconMenu,
-  Location,
-  Setting,
-} from "@element-plus/icons-vue";
+
 import { useRouter } from "vue-router";
 
 const store = useStore();
@@ -110,21 +120,31 @@ const handleSelect = (key, keyPath) => {
       path: `/schoolBus/bus`,
     });
   }
-  if (activeIndex.value == 5) {
+  if (activeIndex.value == 6) {
     router.push({
       path: `/schoolBus/classes`,
     });
   }
-  if (activeIndex.value == 6) {
+  if (activeIndex.value == 5) {
     router.push({
-      path: `/schoolBus/busnumber`,
+      path: `/schoolBus/buspath`,
     });
   }
-  if (activeIndex.value == 7) {
+  if (activeIndex.value == 8) {
     router.push({
       path: `/schoolBus/waiting`,
     });
   }
+  if (activeIndex.value == 7) {
+    router.push({
+      path: `/schoolBus/blacklist`,
+    });
+  }
+  if (activeIndex.value == 0) {
+    router.push({
+      path: `/schoolBus/news`,
+    });
+  }
 };
 onBeforeMount(() => {
   // console.log("切换", Number(sessionStorage.getItem("sidevarItem")));
@@ -166,7 +186,10 @@ onBeforeMount(() => {
     padding: 0 10px;
   }
   .el-menu-item:hover {
-    background-color: #ccc;
+    background-color: rgba(255, 255, 255, 0.4);
+  }
+  .el-menu-item.is-active:hover {
+    background-color: #fff;
   }
   .el-menu-item img {
     width: 18px;

+ 13 - 13
src/router/index.js

@@ -1,7 +1,7 @@
 import { createRouter, createWebHistory, createWebHashHistory } from "vue-router";
 import Layout from "@/layout/index.vue";
 const router = createRouter({
-    history: createWebHashHistory(""),
+    history: createWebHashHistory("/carstop/dist6"),
     routes: [
         {
             path: "/login",
@@ -16,16 +16,6 @@ const router = createRouter({
             component: Layout,
             children: [
                 {
-                    path: "user",
-                    component: () => import("@/views/vidicons/user/index.vue"),
-                    meta: { title: "Dashboard", icon: "dashboard" },
-                },
-                {
-                    path: "vidicon",
-                    component: () => import("@/views/vidicons/vidicon/index.vue"),
-                    meta: { title: "Dashboard", icon: "dashboard" },
-                },
-                {
                     path: "news",
                     component: () => import("@/views/news/news.vue"),
                     meta: { title: "Dashboard", icon: "dashboard" },
@@ -56,8 +46,13 @@ const router = createRouter({
                     meta: { title: "Dashboard", icon: "dashboard" },
                 },
                 {
-                    path: "busnumber",
-                    component: () => import("@/views/busnumber/busnumber.vue"),
+                    path: "buspath",
+                    component: () => import("@/views/buspath/buspath.vue"),
+                    meta: { title: "Dashboard", icon: "dashboard" },
+                },
+                {
+                    path: "blacklist",
+                    component: () => import("@/views/blacklist/blacklist.vue"),
                     meta: { title: "Dashboard", icon: "dashboard" },
                 },
                 {
@@ -65,6 +60,11 @@ const router = createRouter({
                     component: () => import("@/views/waiting/waiting.vue"),
                     meta: { title: "Dashboard", icon: "dashboard" },
                 },
+                // {
+                //     path: "busquery",
+                //     component: () => import("@/views/busquery/busquery.vue"),
+                //     meta: { title: "Dashboard", icon: "dashboard" },
+                // },
             ],
         },
         

+ 11 - 1
src/store/modules/user.js

@@ -2,7 +2,11 @@
 // 声明变量
 const state = {
     collapse: false,
-    activeIndex:1
+    activeIndex:1,
+    username:'',
+    password:'',
+    api:'/carstop/carbook',
+
 };
 
 // 修改变量(state不能直接赋值修改,只能通过mutations)
@@ -13,6 +17,12 @@ const mutations = {
     indexUp: (state, value) => {
         state.activeIndex = value;
     },
+    userName:(state,value)=>{
+        state.username=value
+    },
+    passWord:(state,value)=>{
+        state.password=value
+    }
 };
 // mutations的值由actions传入(异步)
 const actions = {

+ 2 - 2
src/style.css

@@ -68,12 +68,12 @@ button:focus-visible {
   padding: 2em;
 }
 
-#app {
+/* #app {
   max-width: 1280px;
   margin: 0 auto;
   padding: 2rem;
   text-align: center;
-}
+} */
 
 @media (prefers-color-scheme: light) {
   :root {

+ 40 - 20
src/views/account/account.vue

@@ -77,7 +77,13 @@
         }"
       >
         <!-- <el-table-column align="center" type="selection" width="80" /> -->
-        <el-table-column width="150" align="center " type="index" index="1" />
+        <el-table-column
+          width="150"
+          align="center"
+          label="序号"
+          type="index"
+          index="1"
+        />
         <el-table-column align="center" prop="name" label="姓名" />
         <el-table-column align="center" prop="number" label="账号" />
         <el-table-column
@@ -181,11 +187,11 @@ import { ref, reactive, 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 admin from "@/api/admin.js";
+import { useStore } from "vuex";
+const store = useStore();
 const router = useRouter();
 // 表格数据
 const tableData = reactive({ list: [] });
@@ -202,7 +208,7 @@ const currentPage = ref(1); // 当前页
 const pageSize = ref(10);
 const total = ref(); // 当前总数
 const selectData = reactive({ list: [] }); // 多选框选择的数据
-
+const api = ref("");
 const addDialogVisible = ref(false); // 控制添加员工弹窗
 
 // 表单数据
@@ -219,7 +225,13 @@ const rules = reactive({
   account: [
     { required: true, message: "账号不能为空", trigger: "blur" },
     // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
+    {
+      pattern: /^[a-zA-z]\w{3,15}$/,
+      message: "请输入合法账号",
+      trigger: "blur",
+    },
   ],
+  // /^[a-zA-z]\w{3,15}$/
   pass: [
     {
       required: true,
@@ -238,7 +250,7 @@ const rules = reactive({
   // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
 });
 // 获取账户列表
-const getList = async () => {
+const getList = async (message) => {
   // let res = await vidiconsApi.queryCamera(data);
   let data = new FormData();
   if (searchInput.createTime == null) {
@@ -251,21 +263,23 @@ const getList = async () => {
   // let res = await adminApi.adminLogin(data);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/adminlist.action",
+    url: api.value + "/carBook/adminlist.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
     data: data,
   });
-  if (res.data.code == 200) {
-    // ElMessage({
-    //   type: "success",
-    //   showClose: true,
-    //   message: "请求数据成功",
-    //   center: true,
-    // });
+  if (res.status == 200) {
+    if (message) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: message,
+        center: true,
+      });
+    }
     tableData.list = res.data.rows;
-    currentPage.value = res.data.currentPage;
+    // currentPage.value = res.data.currentPage;
     total.value = res.data.total;
   } else {
     tableData.list = res.data.rows;
@@ -274,15 +288,20 @@ const getList = async () => {
     ElMessage({
       type: "error",
       showClose: true,
-      message: "暂无数据",
+      message: res.data.message,
       center: true,
     });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
   }
 };
 
 // 搜索功能
 const searchBtn = lodash.debounce(async () => {
-  getList();
+  getList("查询成功");
 }, 300);
 
 // 重置搜索
@@ -303,7 +322,7 @@ const importExcel = async () => {
   data.set("create_time", searchInput.createTime);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/admintoExcel.action",
+    url: api.value + "/carBook/admintoExcel.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
@@ -362,7 +381,7 @@ const submitAdd = async (formEl) => {
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/admininsert.action",
+          url: api.value + "/carBook/admininsert.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -399,7 +418,7 @@ const submitAdd = async (formEl) => {
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/adminupdate.action",
+          url: api.value + "/carBook/adminupdate.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -456,7 +475,7 @@ const del = (row) => {
       // let res = await adminApi.adminLogin(data);
       let res = await axios({
         method: "post",
-        url: "/api/carBook/admindel.action",
+        url: api.value + "/carBook/admindel.action",
         headers: {
           token: sessionStorage.getItem("token"),
         },
@@ -514,6 +533,7 @@ const handleCurrentChange = (value) => {
 };
 
 onBeforeMount(() => {
+  api.value = store.state.user.api;
   getList();
 });
 onUnmounted(() => {

+ 184 - 286
src/views/busnumber/busnumber.vue

@@ -2,17 +2,17 @@
   <div class="content-box">
     <div class="left">
       <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
-      <span class="cameratxt">车次管理</span>
+      <span class="cameratxt">黑名单管理</span>
     </div>
     <div class="middle">
       <div class="filter">
         <div class="condition">
-          <span>车牌 : </span>
+          <span>关键字 : </span>
           <el-input
             clearable
             v-model="searchInput.carnumber"
             class="w-50 m-2"
-            placeholder="请输入车牌号"
+            placeholder="请输入关键字查询"
             style="width: 150px"
           />
         </div>
@@ -45,24 +45,6 @@
           ><el-icon><Refresh /></el-icon><span>重置</span></el-button
         >
       </div>
-      <!-- 按钮列表 -->
-      <div class="gongneng">
-        <el-button type="primary" color="rgba(61, 81, 232, 1)" @click="addlist"
-          ><el-icon><CirclePlus /></el-icon><span>新增车次</span></el-button
-        >
-        <!-- <el-button
-          color="rgba(61, 81, 232, 1)"
-          class="import"
-          type="primary"
-          @click="resetInput"
-          ><img
-            src="@/assets/import.png"
-            style="width: 14px; height: 14px; margin-right: 4px"
-            alt=""
-          />
-          <span>导出表单</span></el-button
-        > -->
-      </div>
     </div>
     <div class="footer">
       <el-table
@@ -78,58 +60,36 @@
       >
         <!-- <el-table-column align="center" type="selection" width="80" /> -->
         <el-table-column
+          width="150"
           align="center"
-          prop="car_number"
-          width="180"
-          label="车牌"
+          label="序号"
+          type="index"
+          index="1"
         />
+        <el-table-column align="center" prop="user_name" label="姓名" />
+        <el-table-column align="center" prop="user_phone" label="手机" />
+        <el-table-column align="center" prop="contain" label="爽约次数" />
         <el-table-column
           align="center"
-          width="100"
-          prop="contain"
-          label="容量"
-        />
-        <el-table-column align="center " prop="ci_time" label="发车时间" />
-        <el-table-column align="center" prop="route" label="路线" width="200" />
-
-        <el-table-column
-          align="center"
-          prop="create_time"
-          width="250"
+          prop="yy_time"
           label="创建时间"
-        />
-        <el-table-column
-          align="center"
-          prop="ci_time"
-          label="截止时间"
-          width="120"
-        />
-        <el-table-column
-          align="center"
           width="250"
-          prop="work_duration"
-          label="生效日期"
-        />
-        <el-table-column
-          align="center"
-          prop="notice_time"
-          label="提前通知时间"
-          width="100"
         />
+
         <el-table-column align="center" label="操作" width="220">
           <template #default="scope">
-            <el-button link type="primary" @click="edit(scope.row)"
+            <!-- <el-button link type="primary" @click="edit(scope.row)"
               ><div class="look">编辑</div></el-button
-            >
+            > -->
             <el-button link type="primary" @click="del(scope.row)"
-              ><div class="look">删除</div></el-button
+              ><div class="look">移出</div></el-button
             >
           </template>
         </el-table-column>
       </el-table>
 
       <!-- 添加车辆弹窗 -->
-      <el-dialog
+      <!-- <el-dialog
         class="addStaff"
         v-model="addDialogVisible"
         :close-on-click-modal="false"
@@ -149,90 +109,37 @@
           label-position="left"
           status-icon
         >
-          <el-form-item label="车牌 :" prop="carnumber">
-            <el-select
-              v-model="ruleForm.carnumber"
-              class="m-2"
-              placeholder="请输入车牌"
-            >
-              <el-option label="赣A11111" value="赣A11111" />
-              <el-option label="赣A22222" value="赣A22222" />
-              <el-option label="赣A33333" value="赣A33333" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="容量 :" prop="contain">
+          <el-form-item label="账号 :" prop="account">
             <el-input
+              v-model="ruleForm.account"
+              placeholder="请输入账号"
               clearable
-              v-model="ruleForm.contain"
-              placeholder="请输入容量"
             />
           </el-form-item>
-          <el-form-item label="生效日期 :" prop="workduration">
-            <el-date-picker
-              v-model="ruleForm.workduration"
-              type="daterange"
-              format="YYYY-MM-DD"
-              value-format="YYYY-MM-DD"
-              :prefix-icon="Calendar"
-              start-placeholder="开始时间"
-              end-placeholder="结束时间"
+          <el-form-item label="密码 :" prop="pass">
+            <el-input
+              v-model="ruleForm.pass"
+              placeholder="请输入密码"
+              clearable
             />
           </el-form-item>
-          <el-form-item label="发车时间 :" prop="startytime">
-            <!-- <el-time-picker
-              v-model="ruleForm.startytime"
-              format="HH:mm"
-              value-format="HH:mm"
-              placeholder="请选择发车时间"
-            /> -->
-            <el-select
-              v-model="ruleForm.startytime"
-              class="m-2"
-              placeholder="请选择发车时间"
-            >
-              <el-option label="14:30" value="14:30" />
-              <el-option label="16:30" value="16:30" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="路线 :" prop="route">
-            <el-select
-              v-model="ruleForm.route"
-              class="m-2"
-              placeholder="请选择路线"
-            >
-              <el-option label="墨轩湖-黄家湖" value="墨轩湖-黄家湖" />
-              <el-option label="南昌校区" value="南昌校区" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="截止时间 :" prop="citime">
-            <el-select
-              v-model="ruleForm.citime"
-              class="m-2"
-              placeholder="请选择截止时间"
-            >
-              <el-option label="16:30" value="16:30" />
-              <el-option label="18:30" value="18:30" />
-            </el-select>
-          </el-form-item>
           <el-form-item
-            label="提前通知时间 :"
-            prop="noticetime"
-            type="Number"
+            label="昵称 :"
+            prop="name"
             style="
               padding-bottom: 40px;
               border-bottom: 1px solid rgba(230, 230, 230, 1);
             "
           >
-            <div class="informTime">
-              <el-input v-model="ruleForm.noticetime" clearable />
-              <span> 分钟</span>
-            </div>
+            <el-input
+              v-model="ruleForm.name"
+              placeholder="请输入昵称"
+              clearable
+            />
           </el-form-item>
 
           <el-form-item class="options">
-            <el-button class="congzhi" @click="cancelAdd(ruleFormRef)"
-              >取消</el-button
-            >
+            <el-button class="congzhi" @click="cancelAdd()">取消</el-button>
             <el-button
               color="rgba(61, 81, 232, 1)"
               class="queding"
@@ -243,7 +150,7 @@
             </el-button>
           </el-form-item>
         </el-form>
-      </el-dialog>
+      </el-dialog> -->
     </div>
 
     <!-- 分页组件 -->
@@ -263,21 +170,21 @@ import { ref, reactive, 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 { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
 const router = useRouter();
 // 表格数据
 const tableData = reactive({ list: [] });
 const activeIndex = ref(); // 默认跳转路由
-const dialongTitle = ref("新增车次"); // 弹窗标题
+const dialongTitle = ref("新增账号"); // 弹窗标题
 
 const searchInput = reactive({
   carnumber: "",
   createTime: "",
-  route: "",
-  citime: "",
 }); // 搜索按钮数据
 5;
 
@@ -292,91 +199,70 @@ const addDialogVisible = ref(false); // 控制添加员工弹窗
 const formSize = ref("default");
 const ruleFormRef = ref();
 const ruleForm = reactive({
-  carnumber: "",
-  contain: "",
-  citime: "",
-  route: "",
-  startytime: "",
-  workduration: "",
-  noticetime: "10",
+  name: "",
+  account: "",
+  pass: "",
   id: "",
 });
 // 表单验证
-const rules = reactive({
-  workduration: [
-    { required: true, message: "生效日期不能为空", trigger: "blur" },
-    // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
-  ],
-  carnumber: [
-    {
-      required: true,
-      message: "车牌号不能为空",
-      trigger: "change",
-    },
-  ],
-  contain: [
-    {
-      required: true,
-      message: "容量不能为空",
-      trigger: "blur",
-    },
-  ],
-  startytime: [
-    {
-      required: true,
-      message: "发车时间不能为空",
-      trigger: "change",
-    },
-  ],
-  route: [
-    {
-      required: true,
-      message: "路线不能为空",
-      trigger: "change",
-    },
-  ],
-  citime: [
-    {
-      required: true,
-      message: "截止时间不能为空",
-      trigger: "change",
-    },
-  ],
-  noticetime: [
-    {
-      required: true,
-      message: "提前通知时间不能为空",
-      trigger: "blur",
-    },
-    {
-      pattern: /^[1-720]*$/,
-      message: "请填写正确的时间 (整数)",
-      trigger: "blur",
-    },
-  ],
-});
-// 获取车次信息
-const getList = async () => {
+// const rules = reactive({
+//   account: [
+//     { required: true, message: "账号不能为空", trigger: "blur" },
+//     // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
+//     // {
+//     //   pattern: /^[a-zA-z]\w{3,15}$/,
+//     //   message: "请输入合法账号",
+//     //   trigger: "blur",
+//     // },
+//   ],
+//   // /^[a-zA-z]\w{3,15}$/
+//   pass: [
+//     {
+//       required: true,
+//       message: "密码不能为空",
+//       trigger: "blur",
+//     },
+//   ],
+//   name: [
+//     {
+//       required: true,
+//       message: "昵称不能为空",
+//       trigger: "blur",
+//     },
+//   ],
+
+//   // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
+// });
+// 获取账户列表
+const getList = async (message) => {
+  // let res = await vidiconsApi.queryCamera(data);
   let data = new FormData();
   if (searchInput.createTime == null) {
     searchInput.createTime = "";
   }
-  data.set("car_number", searchInput.carnumber);
-  data.set("ci_time", searchInput.citime);
-  data.set("route", searchInput.route);
-  data.set("create_time", searchInput.createTime);
+  data.set("user_name", searchInput.carnumber);
+  data.set("yy_date", searchInput.createTime); //前面的key记得对应!
   data.set("page", currentPage.value);
-  data.set("rows", pageSize.value);
+  data.set("rows", pageSize.value); //前面的key记得对应!
+  // let res = await adminApi.adminLogin(data);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/cclist.action",
+    url: api.value + "/carBook/breclist.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
     data: data,
   });
   console.log(res);
-  if (res.data.code == 200) {
+  if (res.status == 200) {
+    if (message) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: message,
+        center: true,
+      });
+    }
     // ElMessage({
     //   type: "success",
     //   showClose: true,
@@ -384,7 +270,7 @@ const getList = async () => {
     //   center: true,
     // });
     tableData.list = res.data.rows;
-    currentPage.value = res.data.currentPage;
+    // currentPage.value = res.data.currentPage;
     total.value = res.data.total;
   } else {
     tableData.list = res.data.rows;
@@ -396,71 +282,97 @@ const getList = async () => {
       message: "暂无数据",
       center: true,
     });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
   }
 };
 
 // 搜索功能
 const searchBtn = lodash.debounce(async () => {
+  getList("查询成功");
+}, 300);
+
+// 重置搜索
+const searchRefresh = lodash.debounce(async () => {
+  searchInput.carnumber = "";
+  searchInput.createTime = "";
+  currentPage.value = 1;
   getList();
 }, 300);
 
-// 添加车次
-const addlist = () => {
-  dialongTitle.value = "新增车次";
-  addDialogVisible.value = true;
-  ruleForm.carnumber = "";
-  ruleForm.contain = "";
-  ruleForm.citime = "";
-  ruleForm.route = "";
-  ruleForm.startytime = "";
-  ruleForm.workduration = "";
-  ruleForm.noticetime = "";
+//导出功能
+const importExcel = async () => {
+  if (searchInput.createTime == null) {
+    searchInput.createTime = "";
+  }
+  let data = new FormData();
+  data.set("number", searchInput.carnumber);
+  data.set("create_time", searchInput.createTime);
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/admintoExcel.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    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();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 };
-//编辑按钮
-const edit = (row) => {
-  dialongTitle.value = "编辑车次";
+// 添加员工
+const addlist = () => {
+  dialongTitle.value = "新增账号";
   addDialogVisible.value = true;
-  ruleForm.carnumber = row.car_number;
-  ruleForm.contain = row.contain;
-  ruleForm.citime = row.ci_time;
-  ruleForm.route = row.route;
-  ruleForm.startytime = row.starty_time;
-  ruleForm.workduration = row.work_duration.split("~");
-  ruleForm.noticetime = row.notice_time;
-  ruleForm.id = row.id;
+  ruleForm.name = "";
+  ruleForm.account = "";
+  ruleForm.pass = "";
 };
-// 取消添加车次
+// 取消添加员工
 const cancelAdd = () => {
   addDialogVisible.value = false;
   ruleFormRef.value.resetFields();
 };
-// 重置搜索
-const searchRefresh = lodash.debounce(async () => {
-  searchInput.carnumber = "";
-  searchInput.createTime = "";
-  currentPage.value = 1;
-  getList();
-}, 300);
-// 确认新增车次
+// 确认添加员工
 const submitAdd = async (formEl) => {
   if (!formEl) return;
   await formEl.validate(async (valid, fields) => {
     if (valid) {
-      if (dialongTitle.value == "新增车次") {
+      if (dialongTitle.value == "新增账号") {
         let data = {
-          car_number: ruleForm.carnumber,
-          contain: ruleForm.contain,
-          ci_time: ruleForm.citime,
-          route: ruleForm.route,
-          starty_time: ruleForm.startytime,
-          work_duration:
-            ruleForm.workduration[0] + "~" + ruleForm.workduration[1],
-          notice_time: ruleForm.noticetime,
+          name: ruleForm.name,
+          number: ruleForm.account,
+          password: ruleForm.pass,
         };
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/ccinsert.action",
+          url: api.value + "/carBook/admininsert.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -470,6 +382,7 @@ const submitAdd = async (formEl) => {
         // console.log(res, "添加账号");
         if (res.data.code == 200) {
           getList();
+
           ElMessage({
             type: "success",
             showClose: true,
@@ -488,20 +401,15 @@ const submitAdd = async (formEl) => {
         }
       } else {
         let data = {
-          car_number: ruleForm.carnumber,
-          contain: ruleForm.contain,
-          ci_time: ruleForm.citime,
-          route: ruleForm.route,
-          starty_time: ruleForm.startytime,
-          work_duration:
-            ruleForm.workduration[0] + "~" + ruleForm.workduration[1],
-          notice_time: ruleForm.noticetime,
+          name: ruleForm.name,
+          number: ruleForm.account,
+          password: ruleForm.pass,
           id: ruleForm.id,
         };
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/ccupdate.action",
+          url: api.value + "/carBook/adminupdate.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -534,21 +442,31 @@ const submitAdd = async (formEl) => {
     }
   });
 };
-
+//编辑按钮
+const edit = (row) => {
+  dialongTitle.value = "编辑信息";
+  addDialogVisible.value = true;
+  console.log(row);
+  ruleForm.pass = row.password;
+  ruleForm.name = row.name;
+  ruleForm.account = row.number;
+  ruleForm.id = row.id;
+};
 //删除按钮
 const del = (row) => {
-  ElMessageBox.confirm(`是否删除 ${row.car_number} 车次?`, "提示", {
+  console.log(row);
+  ElMessageBox.confirm(`是否将 ${row.user_name} 移出黑名单?`, "提示", {
     confirmButtonText: "确认",
     cancelButtonText: "取消",
     type: "warning",
   })
     .then(async () => {
       let data = new FormData();
-      data.set("id", row.id);
+      data.set("card_number", row.card_number);
       // let res = await adminApi.adminLogin(data);
       let res = await axios({
         method: "post",
-        url: "/api/carBook/ccdel.action",
+        url: api.value + "/carBook/brecremoveBlack.action",
         headers: {
           token: sessionStorage.getItem("token"),
         },
@@ -584,10 +502,10 @@ const del = (row) => {
 };
 
 // 多选框功能
-const handleSelectionChange = (val) => {
-  console.log(val);
-  selectData.list = val;
-};
+// const handleSelectionChange = (val) => {
+//   console.log(val);
+//   selectData.list = val;
+// };
 
 // 表格斑马纹颜色修改
 const tableRowClassName = ({ row, rowIndex }) => {
@@ -602,11 +520,12 @@ const tableRowClassName = ({ row, rowIndex }) => {
 const handleCurrentChange = (value) => {
   // console.log(value);
   currentPage.value = value;
-  getList(value);
+  getList();
 };
 
 onBeforeMount(() => {
-  getList(1);
+  api.value = store.state.user.api;
+  getList();
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);
@@ -648,7 +567,7 @@ onUnmounted(() => {
       display: flex;
       flex-wrap: wrap;
       align-items: center;
-      margin: 10px 0 0 0;
+      margin: 30px 0 20px 0;
       .search {
         margin-left: 0 !important;
       }
@@ -740,34 +659,13 @@ onUnmounted(() => {
       }
       .el-dialog__body {
         padding: 30px 20px 10px 20px;
-        .el-form-item {
-          label {
-            width: 120px !important;
-          }
-          .el-form-item__label {
-            width: 120px !important;
-          }
-          .informTime {
-            display: flex;
-            align-items: center;
-            .el-input {
-              width: 120px;
-              margin-right: 10px;
-              .el-input__inner {
-                text-align: center;
-              }
-            }
-          }
-        }
-        .el-form-item__content {
-          flex: none;
-          .el-input {
-            width: 370px;
-          }
-        }
         .el-input {
           width: 200px;
+          .el-input__suffix-inner {
+            color: rgba(61, 81, 232, 1);
+          }
         }
+
         .options {
           margin-left: 320px;
         }

+ 37 - 17
src/views/bus/bus.vue

@@ -198,6 +198,9 @@ import vidiconsApi from "@/api/vidicons.js";
 import { dayjs } from "element-plus";
 import lodash from "lodash";
 import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
 const router = useRouter();
 // 表格数据
 const tableData = reactive({ list: [] });
@@ -230,7 +233,11 @@ const ruleForm = reactive({
 const rules = reactive({
   serial: [
     { required: true, message: "序列号不能为空", trigger: "blur" },
-    // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
+    // {
+    //   pattern: /^[A-Za-z0-9]$/,
+    //   message: "请输入正确序列号",
+    //   trigger: "blur",
+    // },
   ],
   buslicence: [
     { required: true, message: "请输入车牌号", trigger: "blur" },
@@ -247,12 +254,17 @@ const rules = reactive({
       message: "容量不能为空",
       trigger: "blur",
     },
+    {
+      pattern: /^(0|[1-9][0-9]*)$/,
+      message: "请输入正确数字",
+      trigger: "blur",
+    },
   ],
 
   // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
 });
 // 查看车辆管理列表
-const getList = async () => {
+const getList = async (message) => {
   let data = new FormData();
   if (searchInput.createTime == null) {
     searchInput.createTime = "";
@@ -264,22 +276,24 @@ const getList = async () => {
   // let res = await adminApi.adminLogin(data);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/cinfolist.action",
+    url: api.value + "/carBook/cinfolist.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
     data: data,
   });
   console.log(res);
-  if (res.data.code == 200) {
-    // ElMessage({
-    //   type: "success",
-    //   showClose: true,
-    //   message: "请求数据成功",
-    //   center: true,
-    // });
+  if (res.status == 200) {
+    if (message) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: message,
+        center: true,
+      });
+    }
     tableData.list = res.data.rows;
-    currentPage.value = res.data.currentPage;
+    // currentPage.value = res.data.currentPage;
     total.value = res.data.total;
   } else {
     tableData.list = res.data.rows;
@@ -288,15 +302,20 @@ const getList = async () => {
     ElMessage({
       type: "error",
       showClose: true,
-      message: "暂无数据",
+      message: res.data.message,
       center: true,
     });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
   }
 };
 
 // 搜索功能
 const searchBtn = lodash.debounce(async () => {
-  getList();
+  getList("查询成功");
 }, 300);
 // 重置搜索
 const searchRefresh = lodash.debounce(async () => {
@@ -341,7 +360,7 @@ const submitAdd = async (formEl) => {
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/cinfoinsert.action",
+          url: api.value + "/carBook/cinfoinsert.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -377,7 +396,7 @@ const submitAdd = async (formEl) => {
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/cinfoupdate.action",
+          url: api.value + "/carBook/cinfoupdate.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -424,7 +443,7 @@ const del = (row) => {
       // let res = await adminApi.adminLogin(data);
       let res = await axios({
         method: "post",
-        url: "/api/carBook/cinfodel.action",
+        url: api.value + "/carBook/cinfodel.action",
         headers: {
           token: sessionStorage.getItem("token"),
         },
@@ -474,7 +493,7 @@ const importExcel = async () => {
   data.set("create_time", searchInput.createTime);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/cinfotoExcel.action",
+    url: api.value + "/carBook/cinfotoExcel.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
@@ -523,6 +542,7 @@ const handleCurrentChange = (value) => {
 };
 
 onBeforeMount(() => {
+  api.value = store.state.user.api;
   getList();
 });
 onUnmounted(() => {

+ 788 - 0
src/views/buspath/buspath.vue

@@ -0,0 +1,788 @@
+<template>
+  <div class="content-box">
+    <div class="left">
+      <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
+      <span class="cameratxt">路线管理</span>
+    </div>
+    <div class="middles">
+      <div class="middle">
+        <!-- 路线管理 -->
+        <div class="filter">
+          <!-- <div class="addRoute">
+            <el-button
+              type="primary"
+              color="rgba(61, 81, 232, 1)"
+              @click="addroute"
+              ><el-icon><CirclePlus /></el-icon><span>新增路线</span></el-button
+            >
+          </div> -->
+          <div class="route">
+            <div class="startRoute">
+              <div class="name">出发路线名称</div>
+            </div>
+            <div class="startRoute waiting">
+              <div class="name">是否候补</div>
+            </div>
+          </div>
+          <div class="routes">
+            <div class="route" v-for="item in pathNum.list">
+              <div class="startRoute">
+                <el-input
+                  clearable
+                  v-model="item.route"
+                  placeholder="请输入路线名称"
+                />
+              </div>
+              <div class="startRoute waiting">
+                <el-switch
+                  style="
+                    --el-switch-on-color: rgba(61, 81, 232, 1);
+                    /* --el-switch-off-color: rgba(61, 81, 232, 1); */
+                  "
+                  v-model="item.state"
+                  size="large"
+                />
+              </div>
+              <div class="startRoute save">
+                <el-button
+                  type="primary"
+                  color="rgba(61, 81, 232, 1)"
+                  @click="savePath(item.id)"
+                  ><span>保存</span></el-button
+                >
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="left">
+      <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
+      <span class="cameratxt">站点管理</span>
+    </div>
+    <div class="gongneng">
+      <el-button type="primary" color="rgba(61, 81, 232, 1)" @click="addlist"
+        ><el-icon><CirclePlus /></el-icon><span>新增站点</span></el-button
+      >
+    </div>
+    <!-- 站点管理 -->
+
+    <div class="footer">
+      <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: '45px',
+          border: 0,
+        }"
+      >
+        <!-- <el-table-column align="center" type="selection" width="80" /> -->
+        <el-table-column align="center" prop="route" label="路线名称" />
+        <el-table-column align="center" prop="route_end" label="路线终点" />
+        <el-table-column align="center" prop="create_time" label="创建时间" />
+
+        <el-table-column align="center" label="操作" width="220">
+          <template #default="scope">
+            <el-button link type="primary" @click="edit(scope.row)"
+              ><div class="look">编辑</div></el-button
+            >
+            <el-button link type="primary" @click="del(scope.row)"
+              ><div class="look">删除</div></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 添加路线弹窗 -->
+      <el-dialog
+        class="addStaff"
+        v-model="addDialogVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :title="dialongTitle"
+        align-center
+        width="609"
+        :before-close="cancelAdd"
+      >
+        <el-form
+          ref="ruleFormRef"
+          :model="ruleForm"
+          :rules="rules"
+          label-width="100px"
+          class="demo-ruleForm"
+          :size="formSize"
+          label-position="left"
+          status-icon
+        >
+          <el-form-item label="线路名称 :" prop="route">
+            <el-select
+              v-model="ruleForm.route"
+              class="m-2"
+              placeholder="请选择线路名称"
+            >
+              <el-option
+                :label="item.route"
+                :value="item.route"
+                v-for="item in pathNum.list"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="终点站 :" prop="route_end">
+            <el-input
+              clearable
+              v-model="ruleForm.route_end"
+              placeholder="请输入终点站"
+            />
+          </el-form-item>
+
+          <el-form-item class="options">
+            <el-button class="congzhi" @click="cancelAdd(ruleFormRef)"
+              >取消</el-button
+            >
+            <el-button
+              color="rgba(61, 81, 232, 1)"
+              class="queding"
+              type="primary"
+              @click="submitAdd(ruleFormRef)"
+            >
+              确定
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+    </div>
+
+    <!-- 分页组件 -->
+    <el-pagination
+      background
+      :current-page="currentPage"
+      :page-size="pageSize"
+      layout="total, prev, pager, next, jumper, slot"
+      :total="total"
+      @update:current-page="handleCurrentChange"
+    />
+  </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 { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
+const router = useRouter();
+// 表格数据
+const tableData = reactive({
+  list: [],
+});
+const activeIndex = ref(); // 默认跳转路由
+const dialongTitle = ref("新增路线"); // 弹窗标题
+
+const searchInput = reactive({
+  carnumber: "",
+  createTime: "",
+  route: "",
+  citime: "",
+}); // 搜索按钮数据
+
+const currentPage = ref(1); // 当前页
+const pageSize = ref(6);
+const total = ref(10); // 当前总数
+const selectData = reactive({
+  list: [],
+}); // 多选框选择的数据
+
+const addDialogVisible = ref(false); // 控制添加员工弹窗
+
+// 表单数据
+const formSize = ref("default");
+const ruleFormRef = ref();
+const ruleForm = reactive({
+  route: [],
+  route_end: "",
+  id: "",
+  is_repair: "",
+});
+const pathNum = reactive({ list: [] });
+// 表单验证
+const rules = reactive({
+  route: [{ required: true, message: "线路名称不能为空", trigger: "blur" }],
+  route_end: [
+    {
+      required: true,
+      message: "终点站不能为空",
+      trigger: "blur",
+    },
+  ],
+});
+// 获取车次信息
+const getList = async (message) => {
+  let data = new FormData();
+  if (searchInput.createTime == null) {
+    searchInput.createTime = "";
+  }
+  data.set("create_time", searchInput.createTime);
+  data.set("page", currentPage.value);
+  data.set("rows", pageSize.value);
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/routelist.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    data: data,
+  });
+  console.log(res);
+
+  if (res.status == 200) {
+    if (message) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: message,
+        center: true,
+      });
+    }
+
+    tableData.list = res.data.rows;
+    tableData.list.forEach((item) => {
+      item.route2 = item.route;
+      item.route_end2 = item.route_end;
+      item.path_start = item.route.split("-")[0];
+      item.path_end = item.route.split("-")[1];
+      if (item.is_repair == "" || item.is_repair == 0) {
+        item.state = false;
+      } else if (item.is_repair == 1) {
+        item.state = true;
+      }
+    });
+    // let pathSelect = tableData.list.filter((item) => {
+    //   return item.is_repair == 1;
+    // });
+    // console.log(pathSelect);
+    // pathNum.list = pathSelect;
+    total.value = res.data.total;
+  } else {
+    tableData.list = res.data.rows;
+    currentPage.value = 1;
+    total.value = res.data.total;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
+  }
+};
+
+// 修改路线
+const savePath = async (id) => {
+  let augment = pathNum.list.filter((item) => {
+    return item.id == id;
+  });
+  console.log(augment[0]);
+  console.log(augment[0].state);
+  if (augment[0].state == false) {
+    augment[0].is_repair = 0;
+  } else if (augment[0].state == true) {
+    augment[0].is_repair = 1;
+  }
+  let data = new FormData();
+  data.set("route", augment[0].route);
+  data.set("is_repair", augment[0].is_repair);
+
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/routeupdateState.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    data: data,
+  });
+  // console.log(res, "修改账号");
+  if (res.data.code == 200) {
+    sessionStorage.setItem("pathSelect", JSON.stringify(pathNum.list));
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+// 搜索功能
+const searchBtn = lodash.debounce(async () => {
+  getList("查询成功");
+}, 300);
+
+// 添加车次
+const addlist = () => {
+  dialongTitle.value = "新增路线";
+  addDialogVisible.value = true;
+  ruleForm.route = [];
+  ruleForm.route_end = "";
+};
+//编辑按钮
+const edit = (row) => {
+  dialongTitle.value = "编辑路线";
+  addDialogVisible.value = true;
+  ruleForm.route = row.route;
+  ruleForm.route_end = row.route_end;
+  ruleForm.id = row.id;
+  ruleForm.is_repair = row.is_repair;
+};
+// 取消添加车次
+const cancelAdd = () => {
+  addDialogVisible.value = false;
+  ruleFormRef.value.resetFields();
+};
+// 重置搜索
+const searchRefresh = lodash.debounce(async () => {
+  searchInput.createTime = "";
+  currentPage.value = 1;
+  getList();
+}, 300);
+// 确认新增车次
+const submitAdd = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      if (dialongTitle.value == "新增路线") {
+        let data = {
+          route: ruleForm.route,
+          route_end: ruleForm.route_end,
+        };
+        // let res = await admin.adminAdd(data);
+        let res = await axios({
+          method: "post",
+          url: api.value + "/carBook/routeinsert.action",
+          headers: {
+            "Content-Type": "application/json;charset=utf-8",
+            token: sessionStorage.getItem("token"),
+          },
+          data: data,
+        });
+        // console.log(res, "添加账号");
+        if (res.data.code == 200) {
+          getList();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+          addDialogVisible.value = false;
+          ruleFormRef.value.resetFields();
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      } else {
+        let data = {
+          route: ruleForm.route,
+          route_end: ruleForm.route_end,
+          id: ruleForm.id,
+          is_repair: ruleForm.is_repair,
+        };
+        // let res = await admin.adminAdd(data);
+        let res = await axios({
+          method: "post",
+          url: api.value + "/carBook/routeupdate.action",
+          headers: {
+            "Content-Type": "application/json;charset=utf-8",
+            token: sessionStorage.getItem("token"),
+          },
+          data: data,
+        });
+        // console.log(res, "修改账号");
+        if (res.data.code == 200) {
+          getList();
+
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+          addDialogVisible.value = false;
+          ruleFormRef.value.resetFields();
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      }
+    } else {
+      console.log("错误提交", fields);
+    }
+  });
+};
+
+//删除按钮
+const del = (row) => {
+  ElMessageBox.confirm(`是否删除 ${row.route} 这条路线?`, "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(async () => {
+      let data = new FormData();
+      data.set("id", row.id);
+      // let res = await adminApi.adminLogin(data);
+      let res = await axios({
+        method: "post",
+        url: api.value + "/carBook/routedel.action",
+        headers: {
+          token: sessionStorage.getItem("token"),
+        },
+        data: data,
+      });
+      if (res.data.code == 200) {
+        if (tableData.list.length == 1 && currentPage.value != 1) {
+          currentPage.value = currentPage.value - 1;
+        }
+
+        getList();
+        ElMessage({
+          type: "success",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      } else {
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      }
+      console.log(res);
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消删除",
+      });
+    });
+};
+
+// 多选框功能
+const handleSelectionChange = (val) => {
+  console.log(val);
+  selectData.list = val;
+};
+
+// 表格斑马纹颜色修改
+const tableRowClassName = ({ row, rowIndex }) => {
+  if (rowIndex % 2 === 0) {
+    return "even";
+  } else if (rowIndex % 2 !== 0) {
+    return "odd";
+  }
+  return "";
+};
+// 分页
+const handleCurrentChange = (value) => {
+  console.log(value);
+  currentPage.value = value;
+  getList();
+};
+
+onBeforeMount(() => {
+  pathNum.list = JSON.parse(sessionStorage.getItem("pathSelect"));
+  console.log(pathNum.list);
+  api.value = store.state.user.api;
+  getList();
+});
+onUnmounted(() => {
+  // document.removeEventListener("keyup", Enters);
+});
+</script>
+
+<style scoped lang="scss">
+::-webkit-scrollbar {
+  /* 对应纵向滚动条的宽度 */
+  width: 10px;
+  /* 对应横向滚动条的宽度 */
+  height: 10px;
+}
+
+/* 滚动条上的滚动滑块 */
+::-webkit-scrollbar-thumb {
+  background-color: rgba(61, 81, 232, 1);
+  border-radius: 32px;
+}
+
+/* 滚动条轨道 */
+::-webkit-scrollbar-track {
+  background-color: rgba(61, 81, 232, 0.2);
+  border-radius: 32px;
+}
+.content-box {
+  width: 97.5%;
+  height: 89%;
+  margin: 20px auto;
+  background-color: #fff;
+  color: #fff;
+  display: flex;
+  flex-direction: column;
+
+  .left {
+    // width: calc(100wh - 40px);
+    display: flex;
+    align-items: center;
+    height: 60px;
+    padding: 10px 0;
+    margin: 0 30px;
+    border-bottom: 1px solid #ccc;
+    color: #000;
+    font-size: 18px;
+    font-weight: 600;
+    .camera {
+      margin-right: 15px;
+      color: #4392f7;
+    }
+  }
+  .middles {
+    .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: 15px 0 0 0;
+        .route {
+          display: flex;
+          align-items: center;
+          margin: 10px 0 0 0;
+          .startRoute {
+            width: 200px;
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            .name {
+              margin: 10px 0;
+              font-size: 14px;
+            }
+          }
+          .waiting {
+            align-items: center;
+            margin: 0 40px;
+          }
+          .line {
+            // transform: translateY(48px);
+            padding: 0 20px;
+          }
+          .save {
+            .el-button {
+              width: 100px;
+            }
+          }
+        }
+        .routes {
+          height: 100px;
+          overflow: auto;
+        }
+      }
+
+      :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;
+      }
+    }
+  }
+
+  .gongneng {
+    margin: 20px 25px;
+  }
+  .footer {
+    width: 96%;
+    height: 550px;
+    margin: 10px auto 30px;
+    .el-table--fit {
+      height: 100%;
+      :deep(.el-table__header-wrapper) {
+        background-color: #000;
+      }
+      :deep(.el-table__row) {
+        height: 45px;
+      }
+      :deep(.el-table__row td) {
+        padding: 0;
+        border: 0;
+      }
+
+      .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(.look) {
+        padding: 5px 10px;
+        border-radius: 45px;
+        border: 0.74px solid rgba(30, 125, 251, 1);
+      }
+    }
+
+    // 添加员工弹窗样式
+    :deep(.addStaff) {
+      //   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: 30px 20px 10px 20px;
+        .el-form-item {
+          label {
+            width: 120px !important;
+          }
+          .el-form-item__label {
+            width: 120px !important;
+          }
+          .informTime {
+            display: flex;
+            align-items: center;
+            .el-input {
+              width: 120px;
+              margin-right: 10px;
+              .el-input__inner {
+                text-align: center;
+              }
+            }
+          }
+        }
+        .el-form-item__content {
+          flex: none;
+          .el-input {
+            width: 370px;
+          }
+        }
+        .el-input {
+          width: 200px;
+        }
+        .options {
+          margin-left: 320px;
+        }
+      }
+    }
+  }
+  .el-pagination {
+    // width: 1600px;
+    width: 96%;
+    margin: 0 auto 18px;
+    justify-content: flex-end;
+    :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(30, 125, 251, 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>

Plik diff jest za duży
+ 1049 - 0
src/views/busquery/busquery.vue


Plik diff jest za duży
+ 1111 - 145
src/views/classes/classes.vue


+ 12 - 4
src/views/login/index.vue

@@ -23,7 +23,7 @@
               letter-spacing: 0px;
               color: rgba(0, 0, 0, 1);
             "
-            >视频管理系统</span
+            >校车预约管理系统</span
           >
         </div>
         <el-form
@@ -81,8 +81,9 @@ import { JSEncrypt } from "jsencrypt"; // 加密密码
 import adminApi from "@/api/admin.js";
 import { useStore } from "vuex";
 import axios from "axios";
-const router = useRouter();
 
+const router = useRouter();
+const api = ref("");
 const store = useStore();
 const loading = ref(false);
 const ruleFormRef = ref();
@@ -118,7 +119,7 @@ const submitForm = (formEl) => {
       // let res = await adminApi.adminLogin(data);
       let res = await axios({
         method: "post",
-        url: "/api/carBook/adminlogin.action",
+        url: api.value + "/carBook/adminlogin.action",
         data: data,
       });
 
@@ -132,8 +133,11 @@ const submitForm = (formEl) => {
           localStorage.removeItem("pass", ruleForm.pass);
         }
         sessionStorage.setItem("token", res.data.access_token);
+        sessionStorage.setItem("username", res.data.data[0].number);
         sessionStorage.setItem("sidevarItem", 1);
         store.commit("indexUp", 1);
+        store.commit("userName", res.data.data[0].number);
+        store.commit("passWord", res.data.data[0].password);
         router.push({
           path: `/schoolBus/statement`,
         });
@@ -158,17 +162,21 @@ const submitForm = (formEl) => {
   });
 };
 const Enters = (e) => {
-  console.log("按键:", e.key);
+  // console.log("按键:", e.key);
   if (e.key == "Enter") {
     submitForm(ruleFormRef.value);
   }
 };
 onMounted(() => {
+  api.value = store.state.user.api;
   if (localStorage.getItem("pass") && localStorage.getItem("user")) {
     ruleForm.user = localStorage.getItem("user");
     ruleForm.pass = localStorage.getItem("pass");
     checked.value = true;
   }
+  if (localStorage.getItem("user")) {
+    ruleForm.user = localStorage.getItem("user");
+  }
   document.addEventListener("keyup", Enters);
 });
 onUnmounted(() => {

+ 164 - 117
src/views/news/news.vue

@@ -10,24 +10,23 @@
           <span>创建时间 : </span>
           <el-date-picker
             v-model="searchInput.createTime"
-            type="datetimerange"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            format="YYYY-MM-DD HH:mm:ss"
-            value-format="YYYY-MM-DD HH:mm:ss"
+            type="date"
+            placeholder="请选择时间"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
           />
         </div>
         <div class="condition">
           <span>状态 : </span>
           <el-select
             style="width: 120px"
-            v-model="searchInput.statu"
+            v-model="searchInput.state"
             class="m-2"
             placeholder="请选择状态"
           >
-            <el-option label="全部" value="0" />
+            <el-option label="全部" value="2" />
             <el-option label="已读" value="1" />
-            <el-option label="未读" value="2" />
+            <el-option label="未读" value="0" />
           </el-select>
         </div>
 
@@ -42,10 +41,10 @@
       </div>
       <!-- 按钮列表 -->
       <div class="gongneng">
-        <el-button type="primary" color="rgba(61, 81, 232, 1)" @click="addlist"
+        <el-button type="primary" color="rgba(61, 81, 232, 1)" @click="reset"
           ><el-icon><RefreshRight /></el-icon><span>刷新</span></el-button
         >
-        <el-button type="danger" @click="allDel" color="rgba(61, 81, 232, 1)">
+        <el-button type="danger" @click="allLook" color="rgba(61, 81, 232, 1)">
           <img
             src="@/assets/read.png"
             style="width: 14px; height: 14px; margin-right: 4px"
@@ -155,15 +154,20 @@
           border: 0,
         }"
       >
-        <el-table-column align="center" type="selection" width="80" />
+        <!-- <el-table-column align="center" type="selection" width="80" /> -->
         <el-table-column
           align="center"
-          prop="createTime"
+          prop="create_time"
           label="创建时间"
           width="250"
         />
-        <el-table-column align="center" prop="lastUpdateTime" label="消息" />
-        <el-table-column align="center" prop="statu" label="状态" width="200" />
+        <el-table-column align="center" prop="message" label="消息" />
+        <el-table-column align="center" prop="state" label="状态" width="200">
+          <template #default="scope">
+            <div v-if="scope.row.state == 1">已读</div>
+            <div v-else-if="scope.row.state == 0" style="color: red">未读</div>
+          </template> </el-table-column
+        >>
         <el-table-column align="center" label="操作" width="220">
           <template #default="scope">
             <el-button link type="primary" @click="look(scope.row)"
@@ -193,6 +197,10 @@ import { ElMessage, ElMessageBox } from "element-plus";
 import vidiconsApi from "@/api/vidicons.js";
 import { dayjs } from "element-plus";
 import lodash from "lodash";
+import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
 const router = useRouter();
 // 表格数据
 const tableData = reactive({ list: [] });
@@ -200,14 +208,14 @@ const activeIndex = ref(); // 默认跳转路由
 const dialongTitle = ref(""); // 弹窗标题
 
 const searchInput = reactive({
-  statu: "",
+  state: "全部",
   createTime: "",
 }); // 搜索按钮数据
 5;
 
 const currentPage = ref(1); // 当前页
 const pageSize = ref(10);
-const total = ref(); // 当前总数
+const total = ref(10); // 当前总数
 const selectData = reactive({ list: [] }); // 多选框选择的数据
 
 const centerDialogVisible = ref(false); // 控制新增或修改弹窗开关
@@ -296,120 +304,162 @@ const rules = reactive({
   // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
 });
 // 获取摄像头列表
-const getList = async (curPage) => {
-  let createTimeStart = "";
-  let createTimeEnd = "";
-  if (searchInput.createTime) {
-    createTimeStart = searchInput.createTime[0];
-    createTimeEnd = searchInput.createTime[1];
-  }
-  let lastUpdateTimeStart = "";
-  let lastUpdateTimeEnd = "";
-  if (searchInput.lastUpdateTime) {
-    lastUpdateTimeStart = searchInput.lastUpdateTime[0];
-    lastUpdateTimeEnd = searchInput.lastUpdateTime[1];
+const getList = async () => {
+  let data = new FormData();
+  console.log(searchInput.state === 0);
+
+  data.set("create_time", searchInput.createTime);
+  if (searchInput.state == 2 || searchInput.state == "全部") {
+  } else {
+    data.set("state", searchInput.state);
   }
-  let data = {
-    vendor: searchInput.vendor,
-    ip: searchInput.ip,
-    statu: searchInput.statu,
-    agreement: searchInput.agreement,
-    installationSite: searchInput.installationSite,
-    outputLink: searchInput.outputLink,
-    cameraCoding: searchInput.cameraCoding,
-    remark: searchInput.remark,
-    creater: searchInput.creater,
-    lastUpdater: searchInput.lastUpdater,
-    createTimeStart,
-    createTimeEnd,
-    lastUpdateTimeStart,
-    lastUpdateTimeEnd,
-    pageSize: 10,
-    curPage,
-  };
-  let res = await vidiconsApi.queryCamera(data);
-  res.data.list.forEach((item) => {
-    if (item.statu == 1) {
-      item.statu = "在线";
+  data.set("page", currentPage.value);
+  data.set("rows", pageSize.value); //前面的key记得对应!
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/userqueryMes.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    data: data,
+  });
+  console.log(res);
+  if (res.status == 200) {
+    tableData.list = res.data.rows;
+    if (res.data.currentPage) {
+      currentPage.value = res.data.currentPage;
     } else {
-      item.statu = "离线";
+      currentPage.value = 1;
     }
-  });
-  tableData.list = res.data.list;
-  total.value = res.data.totalCount;
-  // console.log(res);
+    if (tableData.list) {
+      let newsArr = tableData.list.filter((item) => {
+        return item.state == 0;
+      });
+      console.log(newsArr.length);
+      sessionStorage.setItem("newsNum", newsArr.length);
+    } else {
+      sessionStorage.setItem("newsNum", 0);
+    }
+    total.value = res.data.total;
+  } else {
+    tableData.list = res.data.rows;
+    currentPage.value = 1;
+    total.value = res.data.total;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
+  }
 };
-
-// 路由
-const handleSelect = (key, keyPath) => {
-  router.push({
-    path: `/vidicons/${key}`,
+// 刷新
+const reset = async () => {
+  searchInput.state = "全部";
+  searchInput.createTime = "";
+  let data = new FormData();
+  console.log(searchInput.state === 0);
+  data.set("page", currentPage.value);
+  data.set("rows", pageSize.value); //前面的key记得对应!
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/userqueryMes.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    data: data,
   });
+  console.log(res);
+  if (res.status == 200) {
+    tableData.list = res.data.rows;
+    if (res.data.currentPage) {
+      currentPage.value = res.data.currentPage;
+    } else {
+      currentPage.value = 1;
+    }
+    if (tableData.list) {
+      let newsArr = tableData.list.filter((item) => {
+        return item.state == 0;
+      });
+      console.log(newsArr.length);
+      sessionStorage.setItem("newsNum", newsArr.length);
+    } else {
+      sessionStorage.setItem("newsNum", 0);
+    }
+    total.value = res.data.total;
+  } else {
+    tableData.list = res.data.rows;
+    currentPage.value = 1;
+    total.value = res.data.total;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
+  }
 };
+// 路由
+const handleSelect = (key, keyPath) => {};
 // 搜索功能
 const searchBtn = lodash.debounce(async () => {
-  let createTimeStart = "";
-  let createTimeEnd = "";
-  if (searchInput.createTime) {
-    createTimeStart = searchInput.createTime[0];
-    createTimeEnd = searchInput.createTime[1];
-  }
-  let lastUpdateTimeStart = "";
-  let lastUpdateTimeEnd = "";
-  if (searchInput.lastUpdateTime) {
-    lastUpdateTimeStart = searchInput.lastUpdateTime[0];
-    lastUpdateTimeEnd = searchInput.lastUpdateTime[1];
-  }
-  let data = {
-    vendor: searchInput.vendor,
-    ip: searchInput.ip,
-    statu: searchInput.statu,
-    agreement: searchInput.agreement,
-    installationSite: searchInput.installationSite,
-    outputLink: searchInput.outputLink,
-    cameraCoding: searchInput.cameraCoding,
-    remark: searchInput.remark,
-    creater: searchInput.creater,
-    lastUpdater: searchInput.lastUpdater,
-    createTimeStart,
-    createTimeEnd,
-    lastUpdateTimeStart,
-    lastUpdateTimeEnd,
-    pageSize: 10,
-    curPage: 1,
-  };
-  let res = await vidiconsApi.queryCamera(data);
-  if (res.success) {
+  getList();
+}, 300);
+
+// 查看按钮
+const look = async (row) => {
+  let data = new FormData();
+  data.set("id", row.id);
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/userupdateMesState.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    data: data,
+  });
+  console.log(res);
+  if (res.status == 200) {
+  } else {
     ElMessage({
-      type: "success",
+      type: "error",
       showClose: true,
-      message: "搜索成功",
+      message: res.data.message,
       center: true,
     });
-    // console.log(res.data.list);
-    res.data.list.forEach((item) => {
-      if (item.statu == 1) {
-        item.statu = "在线";
-      } else {
-        item.statu = "离线";
-      }
-    });
-    currentPage.value = 1;
-    tableData.list = res.data.list;
-    total.value = res.data.totalCount;
+  }
+};
+// 查看按钮
+const allLook = async (row) => {
+  let data = new FormData();
+  let res = await axios({
+    method: "post",
+    url: api.value + "/carBook/userupdateAllMesState.action",
+    headers: {
+      token: sessionStorage.getItem("token"),
+    },
+    data: data,
+  });
+  console.log(res);
+  if (res.status == 200) {
   } else {
     ElMessage({
       type: "error",
       showClose: true,
-      message: "搜索失败",
+      message: res.data.message,
       center: true,
     });
   }
-}, 300);
-
-// 查看按钮
-const look = (row) => {
-  console.log(row);
 };
 
 // 多选框功能
@@ -428,14 +478,11 @@ const tableRowClassName = ({ row, rowIndex }) => {
   return "";
 };
 // 分页
-const handleCurrentChange = (value) => {
-  // console.log(value);
-  currentPage.value = value;
-  getList(value);
-};
+const handleCurrentChange = (value) => {};
 
 onBeforeMount(() => {
-  getList(1);
+  api.value = store.state.user.api;
+  getList();
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);

+ 35 - 16
src/views/staff/staff.vue

@@ -185,9 +185,7 @@
               class="m-2"
               placeholder="请选择职位"
             >
-              <el-option label="教师" value="教师" />
-              <el-option label="学生" value="学生" />
-              <el-option label="司机" value="司机" />
+              <el-option label="车队长" value="车队长" />
             </el-select>
           </el-form-item>
 
@@ -229,12 +227,14 @@ import vidiconsApi from "@/api/vidicons.js";
 import { dayjs } from "element-plus";
 import lodash from "lodash";
 import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
 const router = useRouter();
 // 表格数据
 const tableData = reactive({ list: [] });
 const activeIndex = ref(); // 默认跳转路由
 const dialongTitle = ref("新增员工"); // 弹窗标题
-
+const api = ref("");
 const searchInput = reactive({
   name: "",
   phone: "",
@@ -262,8 +262,13 @@ const ruleForm = reactive({
 const rules = reactive({
   name: [
     { required: true, message: "姓名不能为空", trigger: "blur" },
-    // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
+    {
+      pattern: /[\u4e00-\u9fa5]$/,
+      message: "请输入正确姓名",
+      trigger: "blur",
+    },
   ],
+  // /^[\u4E00-\u9FA5]$/
   cardnumber: [
     { required: true, message: "卡号不能为空", trigger: "blur" },
     // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
@@ -287,7 +292,7 @@ const rules = reactive({
   // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
 });
 // 获取摄像头列表
-const getList = async () => {
+const getList = async (message) => {
   let data = new FormData();
   if (searchInput.createTime == null) {
     searchInput.createTime = "";
@@ -300,22 +305,30 @@ const getList = async () => {
   // let res = await adminApi.adminLogin(data);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/userlist.action",
+    url: api.value + "/carBook/userlist.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
     data: data,
   });
   console.log(res);
-  if (res.data.code == 200) {
+  if (res.status == 200) {
+    if (message) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: message,
+        center: true,
+      });
+    }
     // ElMessage({
     //   type: "success",
     //   showClose: true,
-    //   message: "请求数据成功",
+    //   message: res.data.message,
     //   center: true,
     // });
     tableData.list = res.data.rows;
-    currentPage.value = res.data.currentPage;
+    // currentPage.value = res.data.currentPage;
     total.value = res.data.total;
   } else {
     tableData.list = res.data.rows;
@@ -324,16 +337,21 @@ const getList = async () => {
     ElMessage({
       type: "error",
       showClose: true,
-      message: "暂无数据",
+      message: res.data.message,
       center: true,
     });
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
   }
   // console.log(res);
 };
 
 // 搜索功能
 const searchBtn = lodash.debounce(async () => {
-  getList();
+  getList("查询成功");
 }, 300);
 // 重置搜索
 const searchRefresh = lodash.debounce(async () => {
@@ -382,7 +400,7 @@ const submitAdd = async (formEl) => {
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/userinsert.action",
+          url: api.value + "/carBook/userinsert.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -418,7 +436,7 @@ const submitAdd = async (formEl) => {
         // let res = await admin.adminAdd(data);
         let res = await axios({
           method: "post",
-          url: "/api/carBook/userupdate.action",
+          url: api.value + "/carBook/userupdate.action",
           headers: {
             "Content-Type": "application/json;charset=utf-8",
             token: sessionStorage.getItem("token"),
@@ -465,7 +483,7 @@ const del = (row) => {
       // let res = await adminApi.adminLogin(data);
       let res = await axios({
         method: "post",
-        url: "/api/carBook/userdel.action",
+        url: api.value + "/carBook/userdel.action",
         headers: {
           token: sessionStorage.getItem("token"),
         },
@@ -510,7 +528,7 @@ const importExcel = async () => {
   data.set("create_time", searchInput.createTime);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/usertoExcel.action",
+    url: api.value + "/carBook/usertoExcel.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
@@ -565,6 +583,7 @@ const handleCurrentChange = (value) => {
 };
 
 onBeforeMount(() => {
+  api.value = store.state.user.api;
   getList();
 });
 onUnmounted(() => {

Plik diff jest za duży
+ 579 - 385
src/views/statement/statement.vue


+ 0 - 983
src/views/vidicons/user/index.vue

@@ -1,983 +0,0 @@
-<template>
-  <div class="content-box">
-    <div class="left">
-      <el-icon :size="23" class="camera"><UserFilled /></el-icon>
-      <span class="cameratxt">用户管理</span>
-    </div>
-    <div class="middle">
-      <div class="filter">
-        <div class="condition">
-          <span>姓名 </span>
-          <el-input
-            clearable
-            v-model="searchData.input1"
-            class="w-50 m-2"
-            placeholder="请输入姓名"
-            style="width: 150px"
-          />
-        </div>
-        <div class="condition">
-          <span>账号 </span>
-          <el-input
-            clearable
-            v-model="searchData.input2"
-            class="w-50 m-2"
-            placeholder="请输入账号"
-            style="width: 150px"
-          />
-        </div>
-        <div class="condition">
-          <span>联系方式 </span>
-          <el-input
-            clearable
-            v-model="searchData.input3"
-            class="w-50 m-2"
-            placeholder="请输入联系方式"
-            style="width: 180px"
-          />
-        </div>
-        <div class="condition">
-          <span>角色 </span>
-          <el-select
-            style="width: 120px"
-            v-model="searchData.input4"
-            class="m-2"
-            placeholder="请选择角色"
-          >
-            <el-option label="管理员" value="2" />
-            <el-option label="超级管理员" value="1" />
-          </el-select>
-        </div>
-
-        <div class="condition">
-          <span>创建时间 </span>
-          <el-date-picker
-            v-model="searchData.input5"
-            type="datetimerange"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            format="YYYY-MM-DD HH:mm:ss"
-            value-format="YYYY-MM-DD HH:mm:ss"
-          />
-        </div>
-        <el-button type="primary" class="search" @click="search">搜索</el-button>
-        <el-button type="primary" plain @click="resetInput">重置</el-button>
-      </div>
-
-      <!-- 按钮列表 -->
-
-      <div class="gongneng">
-        <el-button type="primary" plain @click="addlist">新增</el-button>
-        <el-button type="success" plain @click="importExcel">导入</el-button>
-        <el-button type="warning" plain @click="downLoad">导出</el-button>
-        <el-button type="danger" plain @click="allDel">删除</el-button>
-      </div>
-
-      <!-- 编辑/新增管理员 -->
-      <el-dialog
-        v-model="centerDialogVisible"
-        :title="dialongTitle"
-        width="30%"
-        align-center
-        :before-close="editClose"
-      >
-        <el-form
-          ref="ruleFormRef"
-          :model="ruleForm"
-          :rules="rules"
-          label-width="120px"
-          class="demo-ruleForm"
-          :size="formSize"
-          status-icon
-        >
-          <el-form-item label="姓名" prop="name">
-            <el-input v-model="ruleForm.name" placeholder="请输入姓名" />
-          </el-form-item>
-          <el-form-item label="性别" prop="region">
-            <el-select
-              v-model="ruleForm.region"
-              style="width: 180px"
-              placeholder="请选择性别"
-            >
-              <el-option label="男" value="1" />
-              <el-option label="女" value="0" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="账号" prop="date1">
-            <el-input v-model="ruleForm.date1" placeholder="请输入账号" />
-          </el-form-item>
-          <el-form-item label="密码" prop="date2" v-show="dialongTitle == '新增用户'">
-            <el-input v-model="ruleForm.date2" placeholder="请输入密码" />
-          </el-form-item>
-          <el-form-item label="联系方式" prop="phone">
-            <el-input v-model="ruleForm.phone" placeholder="请输入联系方式"></el-input>
-          </el-form-item>
-          <el-form-item label="类别" prop="resource">
-            <el-select v-model="ruleForm.resource" placeholder="请选择类别">
-              <el-option label="超级管理员" value="1" />
-              <el-option label="管理员" value="2" />
-            </el-select>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="submitForm(ruleFormRef)"> 确定 </el-button>
-            <el-button @click="resetForm(ruleFormRef)">重置</el-button>
-          </el-form-item>
-        </el-form>
-      </el-dialog>
-      <!-- 导入用户按钮 -->
-      <el-dialog
-        v-model="importByExcelDialog"
-        title="导入用户信息"
-        width="45%"
-        align-center
-        custom-class="importExecl"
-      >
-        <el-steps :active="active" align-center finish-status="success">
-          <el-step title="下载模板 1" :icon="Pointer" />
-          <el-step title="执行上传 2" :icon="Upload" />
-          <el-step title="导入完成 3" :icon="Select" />
-        </el-steps>
-        <div class="cont">
-          <div class="download">
-            <el-icon :size="30"><Pointer /></el-icon><span>请按照数据模板导入数据</span>
-          </div>
-          <el-button type="primary">
-            <a href="/video/videoManage/userProfile.xlsx" style="color: #fff">下载模板</a>
-          </el-button>
-          <div class="upload">
-            <div class="download">
-              <el-icon :size="30"><Upload /></el-icon
-              ><span>将文件上传(用户上传的excel文件需要符合规定的格式)</span>
-            </div>
-            <el-upload
-              v-model:file-list="fileList"
-              class="upload-demo"
-              action="none"
-              :limit="1"
-              :multiple="false"
-              :auto-upload="false"
-              :on-change="changeUpload"
-              :before-remove="beforeRemove"
-            >
-              <el-button type="primary">选择文件</el-button>
-              <template #tip>
-                <div class="el-upload__tip">仅允许上传一个文件</div>
-              </template>
-            </el-upload>
-          </div>
-          <div class="accomplish">
-            <el-button
-              type="primary"
-              :disabled="active == 1"
-              style="margin-top: 12px"
-              @click="next"
-              >完成导入</el-button
-            >
-          </div>
-        </div>
-      </el-dialog>
-    </div>
-    <div class="footer">
-      <el-table
-        :row-class-name="tableRowClassName"
-        :data="tableData.list"
-        style="width: 100%"
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column align="center" type="selection" width="80" />
-        <el-table-column align="center" prop="name" label="姓名" width="100" />
-        <el-table-column align="center" width="100" prop="sex" label="性别" />
-        <el-table-column align="center" prop="username" label="用户名(账号)" />
-        <el-table-column align="center" prop="adminType" label="类别" />
-        <el-table-column align="center" prop="phone" label="手机号码" />
-        <el-table-column align="center" width="300" prop="createTime" label="创建时间" />
-        <el-table-column align="center" label="操作">
-          <template #default="scope">
-            <el-button link type="primary" size="small" @click="handleUp(scope.row)"
-              >编辑</el-button
-            >
-            <el-button link type="primary" size="small" @click="handleDel(scope.row)"
-              >删除</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-    <el-pagination
-      v-model:page-size="pageSize"
-      v-model:current-page="currentPage"
-      layout="total, prev, pager, next, jumper"
-      :total="total"
-      @current-change="handleCurrentChange"
-    />
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, onBeforeMount } from "vue";
-import { useRouter } from "vue-router";
-import { Select, Pointer, Upload } from "@element-plus/icons-vue";
-import { JSEncrypt } from "jsencrypt"; // 加密密码
-import { ElMessage, ElMessageBox } from "element-plus";
-import { dayjs } from "element-plus";
-import axios from "axios";
-import lodash from "lodash";
-import adminApi from "@/api/admin.js";
-const router = useRouter();
-
-// 搜索框数据
-const searchData = reactive({
-  input1: "",
-  input2: "",
-  input3: "",
-  input4: "",
-  input5: "",
-});
-// 表格数据
-const tableData = reactive({ list: [] });
-const dialongTitle = ref(""); // 弹窗标题
-const pageSize = ref(13);
-const currentPage = ref(1); // 当前页
-const total = ref(); // 当前总数
-const selectData = reactive({ list: [] }); // 多选框选择的数据
-const centerDialogVisible = ref(false); // 控制新增或修改弹窗开关
-
-const importByExcelDialog = ref(false); // 控制导入弹窗
-const active = ref(1); // 导入步骤计数
-const fileList = ref(); // 上传的文件
-
-// 表单数据
-const formSize = ref("default");
-const ruleFormRef = ref();
-
-const ruleForm = reactive({
-  name: "",
-  region: "",
-  date1: "",
-  date2: "",
-  phone: "",
-  resource: "",
-  id: "",
-});
-// 表单验证
-const rules = reactive({
-  region: [
-    {
-      required: true,
-      message: "请选择性别",
-      trigger: "blur",
-    },
-  ],
-  name: [
-    {
-      required: true,
-      message: "请输入姓名",
-      trigger: "blur",
-    },
-  ],
-  date1: [
-    {
-      required: true,
-      message: "请输入账号",
-      trigger: "blur",
-    },
-  ],
-  date2: [
-    {
-      required: true,
-      message: "请输入密码",
-      trigger: "blur",
-    },
-  ],
-  phone: [
-    {
-      required: true,
-      message: "请输入电话号码",
-      trigger: "blur",
-    },
-    {
-      validator: function (rule, value, callback) {
-        if (/^1[34578]\d{9}$/.test(value) == false) {
-          callback(new Error("请输入正确的手机号"));
-        } else {
-          callback();
-        }
-      },
-      trigger: "blur",
-    },
-  ],
-  resource: [
-    {
-      required: true,
-      message: "请选择类别",
-      trigger: "blur",
-    },
-  ],
-});
-// 路由
-const handleSelect = (key, keyPath) => {
-  router.push({
-    path: `/vidicons/${key}`,
-  });
-};
-// 获取管理员列表
-const getList = (curPage) => {
-  adminApi
-    .adminList({ pageSize: 13, curPage })
-    .then((res) => {
-      console.log(res);
-      total.value = res.data.totalCount;
-      res.data.list.forEach((item) => {
-        if (item.sex == 0) {
-          item.sex = "女";
-        } else if (item.sex == 1) {
-          item.sex = "男";
-        }
-        if (item.adminType == "1") {
-          item.adminType = "超级管理员";
-        } else if (item.adminType == "2") {
-          item.adminType = "管理员";
-        }
-      });
-
-      tableData.list = res.data.list;
-    })
-    .catch((err) => {
-      console.log(err);
-    });
-};
-
-// 搜索按钮
-const search = lodash.debounce(() => {
-  let startTime = "";
-  let endTime = "";
-  if (searchData.input5 == []) {
-    startTime = "";
-    endTime = "";
-  } else {
-    startTime = searchData.input5[0];
-    endTime = searchData.input5[1];
-  }
-
-  let data = {
-    pageSize: 13,
-    curPage: 1,
-    name: searchData.input1,
-    username: searchData.input2,
-    phone: searchData.input3,
-    adminType: searchData.input4,
-    startTime,
-    endTime,
-  };
-  adminApi
-    .adminList(data)
-    .then((res) => {
-      console.log(res);
-      total.value = res.data.totalCount;
-      res.data.list.forEach((item) => {
-        if (item.sex == 0) {
-          item.sex = "女";
-        } else {
-          item.sex = "男";
-        }
-        if (item.adminType == "1") {
-          item.adminType = "超级管理员";
-        } else {
-          item.adminType = "管理员";
-        }
-      });
-      ElMessage({
-        type: "success",
-        showClose: true,
-        message: "搜索成功",
-        center: true,
-      });
-      currentPage.value = 1;
-      tableData.list = res.data.list;
-    })
-    .catch((err) => {
-      console.log(err);
-      ElMessage({
-        type: "error",
-        showClose: true,
-        message: "搜索失败",
-        center: true,
-      });
-    });
-}, 300);
-// 重置搜索框
-const resetInput = lodash.debounce(() => {
-  searchData.input1 = "";
-  searchData.input2 = "";
-  searchData.input3 = "";
-  searchData.input4 = "";
-  searchData.input5 = "";
-  currentPage.value = 1;
-  getList(1);
-}, 300);
-// 多选框功能
-const handleSelectionChange = (val) => {
-  console.log(val);
-  selectData.list = val;
-};
-
-// 删除多选IP
-const allDel = () => {
-  console.log(selectData.list);
-  ElMessageBox.confirm("此操作将永久删除所选用户,是否继续?", "提示", {
-    confirmButtonText: "确认",
-    cancelButtonText: "取消",
-    type: "warning",
-  })
-    .then(async () => {
-      let idIP = [];
-      selectData.list.forEach((item) => {
-        idIP.push(item.id);
-      });
-      console.log(idIP);
-      let res = await adminApi.adminDel(idIP);
-      if (res.success) {
-        if (
-          tableData.list.length - selectData.list.length == 0 &&
-          currentPage.value != 1
-        ) {
-          currentPage.value = currentPage.value - 1;
-        }
-        ElMessage({
-          type: "success",
-          showClose: true,
-          message: "删除成功",
-          center: true,
-        });
-        getList(currentPage.value);
-      } else {
-        ElMessage({
-          type: "warning",
-          showClose: true,
-          message: "删除失败",
-          center: true,
-        });
-      }
-    })
-    .catch(() => {
-      ElMessage({
-        type: "info",
-        message: "取消删除",
-      });
-    });
-};
-
-// 重置表单
-const resetForm = (formEl) => {
-  formEl.resetFields();
-  console.log("重置表单");
-  ruleForm.phone = "";
-  ruleForm.date1 = "";
-  ruleForm.resource = "";
-  // ruleForm.password=,
-  ruleForm.region = "";
-  ruleForm.name = "";
-  ruleForm.date2 = "";
-  // if (!formEl) return;
-
-  // formEl.resetFields();
-};
-
-//新增按钮
-const addlist = () => {
-  dialongTitle.value = "新增用户";
-  ruleForm.phone = "";
-  ruleForm.date1 = "";
-  ruleForm.resource = "";
-  // ruleForm.password=,
-  ruleForm.region = "";
-  ruleForm.name = "";
-  ruleForm.date2 = "";
-  centerDialogVisible.value = true;
-};
-//修改按钮
-const handleUp = (row) => {
-  console.log(row);
-  ruleForm.id = row.id;
-  ruleForm.phone = row.phone;
-  ruleForm.date1 = row.username;
-  ruleForm.name = row.name;
-  ruleForm.date2 = row.password;
-  ruleForm.region = row.sex;
-  ruleForm.resource = row.adminType;
-  dialongTitle.value = "修改用户";
-  centerDialogVisible.value = true;
-};
-
-// 关闭新增/修改页面
-const editClose = (done) => {
-  ruleFormRef.value.resetFields();
-  ruleForm.phone = "";
-  ruleForm.date1 = "";
-  ruleForm.resource = "";
-  // ruleForm.password=,
-  ruleForm.region = "";
-  ruleForm.name = "";
-  ruleForm.date2 = "";
-  centerDialogVisible.value = false;
-  done();
-};
-// 确定表单
-const submitForm = async (formEl) => {
-  if (!formEl) return;
-  await formEl.validate((valid, fields) => {
-    if (valid) {
-      console.log("submit!");
-      if (dialongTitle.value == "新增用户") {
-        let publicKey =
-          "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB";
-        let encryptor = new JSEncrypt(); // 新建JSEncrypt对象
-        encryptor.setPublicKey(publicKey); // 设置公钥
-        let rsaPassWord = encryptor.encrypt(ruleForm.date2); // 对密码进行加密
-        let data = {
-          phone: ruleForm.phone,
-          username: ruleForm.date1,
-          adminType: ruleForm.resource,
-          password: rsaPassWord,
-          sex: ruleForm.region,
-          name: ruleForm.name,
-          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
-        };
-        if (data.sex == "女") {
-          data.sex = 0;
-        } else if (data.sex == "男") {
-          data.sex = 1;
-        }
-        if (data.adminType == "超级管理员") {
-          data.adminType = 1;
-        } else if (data.adminType == "管理员") {
-          data.adminType = 2;
-        }
-        adminApi
-          .adminAdd(data)
-          .then((res) => {
-            console.log(tableData.list.length);
-            if (res.success) {
-              if (tableData.list.length == 13) {
-                currentPage.value = currentPage.value + 1;
-              }
-              ElMessage({
-                type: "success",
-                showClose: true,
-                message: res.message,
-                center: true,
-              });
-              getList(currentPage.value);
-              ruleFormRef.value.resetFields();
-              centerDialogVisible.value = false;
-            } else {
-              ElMessage({
-                type: "warning",
-                showClose: true,
-                message: res.message,
-                center: true,
-              });
-            }
-          })
-          .catch((err) => {
-            console.log(err);
-            ElMessage({
-              type: "error",
-              showClose: true,
-              message: "添加失败",
-              center: true,
-            });
-          });
-      } else {
-        // let publicKey =
-        //   "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB";
-        // let encryptor = new JSEncrypt(); // 新建JSEncrypt对象
-        // encryptor.setPublicKey(publicKey); // 设置公钥
-        // let rsaPassWord = encryptor.encrypt(ruleForm.date2); // 对密码进行加密
-
-        let data = {
-          phone: ruleForm.phone,
-          username: ruleForm.date1,
-          adminType: ruleForm.resource,
-          sex: ruleForm.region,
-          name: ruleForm.name,
-          id: ruleForm.id,
-          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
-        };
-        if (data.sex == "女") {
-          data.sex = 0;
-        } else if (data.sex == "男") {
-          data.sex = 1;
-        }
-        if (data.adminType == "超级管理员") {
-          data.adminType = 1;
-        } else if (data.adminType == "管理员") {
-          data.adminType = 2;
-        }
-        adminApi
-          .adminUpdate(data)
-          .then((res) => {
-            console.log(res);
-            if (res.success) {
-              ElMessage({
-                type: "success",
-                showClose: true,
-                message: res.message,
-                center: true,
-              });
-              getList(currentPage.value);
-              ruleFormRef.value.resetFields();
-              centerDialogVisible.value = false;
-            } else {
-              ElMessage({
-                type: "warning",
-                showClose: true,
-                message: res.message,
-                center: true,
-              });
-            }
-          })
-          .catch((err) => {
-            console.log(err);
-            ElMessage({
-              type: "error",
-              showClose: true,
-              message: res.message,
-              center: true,
-            });
-          });
-      }
-    } else {
-      console.log("error submit!", fields);
-    }
-  });
-};
-// 删除按钮
-const handleDel = (row) => {
-  console.log("click");
-  ElMessageBox.confirm("此操作将永久删除所选中的IP,是否继续?", "提示", {
-    confirmButtonText: "确认",
-    cancelButtonText: "取消",
-    type: "warning",
-  })
-    .then(() => {
-      let idIP = [];
-      selectData.list.forEach((item) => {
-        idIP.push(item.id);
-      });
-      console.log(idIP);
-      adminApi
-        .adminDel([row.id])
-        .then((res) => {
-          console.log(tableData.list.length);
-          if (tableData.list.length == 1 && currentPage.value != 1) {
-            currentPage.value = currentPage.value - 1;
-          }
-          ElMessage({
-            type: "success",
-            showClose: true,
-            message: "删除成功",
-            center: true,
-          });
-          getList(currentPage.value);
-        })
-        .catch((err) => {
-          console.log(err);
-          ElMessage({
-            type: "warning",
-            showClose: true,
-            message: "删除失败",
-            center: true,
-          });
-        });
-    })
-    .catch(() => {
-      ElMessage({
-        type: "info",
-        message: "取消删除",
-      });
-    });
-};
-
-// 导出按钮
-const downLoad = lodash.debounce(() => {
-  let startTime = searchData.input5[0];
-  let endTime = searchData.input5[1];
-  let data = {
-    name: searchData.input1,
-    username: searchData.input2,
-    phone: searchData.input3,
-    adminType: searchData.input4,
-    startTime,
-    endTime,
-  };
-  adminApi
-    .download(data)
-    .then((res) => {
-      let name = "用户管理列表";
-      var content = res;
-      // var data = new Blob([content], { type: "application/octet-stream;charset=utf-8" });
-      var data = new Blob([content], { type: "application/vnd.ms-excel;charset=utf-8" });
-      var downloadUrl = window.URL.createObjectURL(data);
-      var anchor = document.createElement("a");
-      anchor.href = downloadUrl;
-      anchor.download = name + ".xlsx";
-      anchor.click();
-      window.URL.revokeObjectURL(data);
-      console.log(res);
-      ElMessage({
-        type: "success",
-        showClose: true,
-        message: "导出成功",
-        center: true,
-      });
-    })
-    .catch((err) => {
-      console.log(err);
-      ElMessage({
-        type: "error",
-        showClose: true,
-        message: "导出失败",
-        center: true,
-      });
-    });
-}, 300);
-// 导入按钮
-const importExcel = () => {
-  importByExcelDialog.value = true;
-};
-
-// 上传文件
-const changeUpload = (file, fileList) => {
-  // fileList.value = [];
-  if (file) {
-    fileList.value = file;
-  }
-  active.value = 2;
-};
-// 移出文件前的回调
-const beforeRemove = (file) => {
-  console.log(file);
-  active.value = 1;
-};
-
-// 步骤条功能
-const next = async () => {
-  console.log(fileList.value);
-  let formData = new FormData();
-  formData.append("file", fileList.value[0].raw);
-  let res = await axios({
-    method: "post",
-    url: "/video/transcoding/videoAdmin/importByExcel",
-    data: formData,
-    headers: {
-      admin_token: sessionStorage.getItem("admin_token"),
-    },
-  });
-  // console.log(res);
-  if (res.data.success) {
-    setTimeout(() => {
-      importByExcelDialog.value = false;
-      fileList.value = "";
-      active.value = 1;
-    }, 1000);
-    ElMessage({
-      type: "success",
-      showClose: true,
-      message: "导入成功",
-      center: true,
-    });
-    active.value = 3;
-    currentPage.value = 1;
-    getList(1);
-  } else {
-    ElMessage({
-      type: "warning",
-      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 handleCurrentChange = (value) => {
-  currentPage.value = value;
-  getList(value);
-};
-onBeforeMount(() => {
-  getList(1);
-});
-</script>
-
-<style scoped lang="scss">
-.content-box {
-  width: 97.5%;
-  height: 90%;
-  margin: 20px auto;
-  background-color: #fff;
-  color: #fff;
-  display: flex;
-  flex-direction: column;
-
-  .left {
-    width: calc(100wh - 40px);
-    display: flex;
-    align-items: center;
-    height: 60px;
-    margin: 0 30px;
-    border-bottom: 1px solid #ccc;
-    color: #000;
-    font-size: 18px;
-    font-weight: 600;
-    .camera {
-      margin-right: 15px;
-      color: #4392f7;
-    }
-  }
-  .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;
-      .condition {
-        display: flex;
-        align-items: center;
-        margin: 10px 30px 10px 0;
-        span {
-          margin: 0 10px 0 0;
-        }
-      }
-    }
-    .gongneng {
-      margin: 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: 96%;
-    height: 562px;
-    margin: 20px auto 30px;
-    .el-table--fit {
-      height: 100%;
-
-      :deep(.el-table__row) {
-        height: 40px;
-      }
-      :deep(.el-table__row td) {
-        padding: 0;
-      }
-      // 输出链接弹窗样式
-      :deep(.link .el-dialog__header) {
-        text-align: left;
-        font-size: 20px;
-        font-weight: 600;
-      }
-      :deep(.link .el-dialog__body) {
-        padding: 10px 20px;
-        height: 100px;
-        margin-bottom: 10px;
-      }
-      .link {
-        .linkcontent {
-          text-align: left;
-          height: 100px;
-          border: 1px solid #ccc;
-          p {
-            margin: 5px 10px;
-          }
-        }
-      }
-
-      :deep(.playVideo .el-dialog__header) {
-        text-align: left;
-        font-size: 20px;
-        font-weight: 600;
-        background-color: #ccc;
-        margin-right: 0;
-      }
-      :deep(.playVideo .el-dialog__body) {
-        height: 600px;
-      }
-
-      .el-button--primary {
-        margin-left: 5px;
-      }
-      :deep(.el-table__body .even) {
-        background-color: #fff;
-      }
-      :deep(.el-table__body .odd) {
-        background-color: #f5f8fc;
-      }
-    }
-  }
-  .el-pagination {
-    // width: 1600px;
-    width: 96%;
-    margin: 0 auto 18px;
-    justify-content: flex-end;
-    :deep(.el-pagination__total) {
-      color: #000;
-    }
-    :deep(.el-pagination__goto) {
-      color: #000;
-    }
-    :deep(.el-pagination__classifier) {
-      color: #000;
-    }
-
-    :deep(.el-pager li) {
-      margin: 0 3px;
-    }
-    :deep(.btn-prev) {
-      margin-right: 3px;
-    }
-    :deep(.btn-next) {
-      margin-left: 3px;
-    }
-  }
-}
-.el-input {
-  width: 192px;
-}
-</style>

Plik diff jest za duży
+ 0 - 1629
src/views/vidicons/vidicon/index.vue


+ 142 - 93
src/views/waiting/waiting.vue

@@ -2,62 +2,92 @@
   <div class="content-box">
     <div class="left">
       <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
-      <span class="cameratxt">候补设置</span>
+      <span class="cameratxt">系统设置</span>
     </div>
     <div class="middle">
       <div class="filter">
         <div class="condition">
-          <span>候补截止时间&nbsp;</span>
-
-          <el-time-picker
-            v-model="valueTime"
-            placeholder="请选择时间"
-            :disabled="valueSwich2"
-            format="HH:mm"
-            value-format="HH:mm"
-            @change="timeUpdata"
-          />
-
-          <span>
-            &nbsp;
-            &nbsp;后作为通行条件,上车时提示已通行,其他时间段提示未预约</span
-          >
-          <el-switch
-            v-model="valueSwich"
-            class="ml-2"
-            style="
-              --el-switch-on-color: rgba(61, 81, 232, 1);
-              --el-switch-off-color: #ccc;
-              margin-left: 10px;
-            "
-            @change="first"
-          />
+          <h3>开始时间段设置</h3>
+          <div>
+            <el-time-picker
+              v-model="ruleForm.yy_duration"
+              is-range
+              format="HH:mm"
+              value-format="HH:mm"
+              range-separator="-"
+              start-placeholder="开始时间"
+              end-placeholder="结束时间"
+              @change="timeUpdata"
+            />
+          </div>
         </div>
         <div class="condition">
-          <span>当天最晚发车时间段&nbsp;</span>
-
-          <el-time-picker
-            v-model="valueTime2"
-            placeholder="请选择时间"
-            :disabled="valueSwich"
-            format="HH:mm"
-            value-format="HH:mm"
-            @change="timeUpdata"
-          />
-          <span>
-            &nbsp;
-            &nbsp;后作为通行条件,上车时提示已通行,其他时间段提示未预约</span
-          >
-          <el-switch
-            v-model="valueSwich2"
-            class="ml-2"
-            style="
-              --el-switch-on-color: rgba(61, 81, 232, 1);
-              --el-switch-off-color: #ccc;
-              margin-left: 10px;
-            "
-            @change="second"
-          />
+          <h3>截止预约时间设置</h3>
+          <div>
+            <span>正常发车前</span>
+            <!-- <el-input
+              clearable
+              v-model="ruleForm.yy_end"
+              class="w-50 m-2"
+              style="width: 100px"
+            /> -->
+            <el-time-picker
+              v-model="ruleForm.hh_end"
+              format="HH:mm"
+              value-format="HH:mm"
+              @change="timeUpdata"
+            />
+            <!-- <span>&nbsp;&nbsp;分钟</span> -->
+          </div>
+        </div>
+        <div class="condition">
+          <h3>候补截止预约时间设置</h3>
+          <div>
+            <span>候补截止时间</span>
+            <!-- <el-time-picker
+              v-model="ruleForm.hh_end"
+              placeholder="请选择时间"
+              format="HH:mm"
+              value-format="HH:mm"
+              @change="timeUpdata"
+            /> -->
+            <el-input
+              clearable
+              v-model="ruleForm.yy_end"
+              class="w-50 m-2"
+              style="width: 100px"
+              @blur="timeUpdata"
+            />
+            <span>&nbsp;&nbsp;分钟</span>
+          </div>
+        </div>
+        <div class="condition">
+          <h3>黑名单设置</h3>
+          <div>
+            <span>爽约超过</span>
+            <el-input
+              clearable
+              v-model="ruleForm.black_count"
+              class="w-50 m-2"
+              style="width: 100px"
+              @blur="timeUpdata"
+            />
+            <span>&nbsp;&nbsp;次,锁定账号</span>
+          </div>
+        </div>
+        <div class="condition">
+          <h3>通知时间</h3>
+          <div>
+            <span>发车前提前</span>
+            <el-input
+              clearable
+              v-model="ruleForm.notice_time"
+              class="w-50 m-2"
+              style="width: 100px"
+              @blur="timeUpdata"
+            />
+            <span>&nbsp;&nbsp;分钟,发送通知</span>
+          </div>
         </div>
       </div>
     </div>
@@ -66,40 +96,58 @@
 </template>
 
 <script setup>
-import { ref, reactive, nextTick, onBeforeMount, onUnmounted } from "vue";
+import {
+  ref,
+  reactive,
+  watch,
+  nextTick,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
 import { useRouter } from "vue-router";
 import { ElMessage, ElMessageBox } from "element-plus";
-import vidiconsApi from "@/api/vidicons.js";
 import { dayjs } from "element-plus";
 import lodash from "lodash";
 import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
 const router = useRouter();
 // 表格数据
-const valueTime = ref(); // 截止时间参数
-const valueTime2 = ref(); //最晚发车时间
-const valueSwich = ref(true); // 滑块开关按钮
-const valueSwich2 = ref(false); // 滑块开关按钮
-const id = ref();
-const state = ref(1); //启用
+const ruleForm = reactive({
+  yy_duration: [], // 开始时间段设置
+  hh_end: "", //截止预约时间设置
+  yy_end: "", //候补截止预约时间设置
+  black_count: "", //黑名单设置次数
+  notice_time: "", //发车前提前
+  id: "",
+});
 const getlist = async (message) => {
   let res = await axios({
     method: "post",
-    url: "/api/carBook/cnqueryHb.action",
+    url: api.value + "/carBook/cnqueryHb.action",
     headers: {
       token: sessionStorage.getItem("token"),
     },
   });
   console.log(res);
   if (res.data.code == 200) {
-    valueTime.value = res.data.data.start_time;
-    valueTime2.value = res.data.data.end_time;
-    id.value = res.data.data.id;
-    ElMessage({
-      type: "success",
-      showClose: true,
-      message: message || res.data.message,
-      center: true,
-    });
+    console.log(res.data.data.yy_duration.split("~"));
+
+    ruleForm.yy_duration = res.data.data.yy_duration.split("~");
+    ruleForm.yy_end = res.data.data.yy_end; //
+    ruleForm.hh_end = res.data.data.hh_end; //
+    ruleForm.black_count = res.data.data.black_count;
+    ruleForm.notice_time = res.data.data.notice_time;
+    ruleForm.id = res.data.data.id;
+    if (message) {
+      ElMessage({
+        type: "success",
+        showClose: true,
+        message: message,
+        center: true,
+      });
+    }
   } else {
     ElMessage({
       type: "error",
@@ -107,35 +155,27 @@ const getlist = async (message) => {
       message: res.data.message,
       center: true,
     });
-  }
-};
-const first = (val) => {
-  if (val) {
-    valueSwich2.value = false;
-  } else {
-    valueSwich2.value = true;
-  }
-};
-const second = (val) => {
-  if (val) {
-    valueSwich.value = false;
-  } else {
-    valueSwich.value = true;
+    if (res.data.message == "token错误") {
+      router.push({
+        path: `/login`,
+      });
+    }
   }
 };
 
-const timeUpdata = async (val) => {
-  console.log(val);
+const timeUpdata = async () => {
   let data = {
-    state: state.value,
-    start_time: valueTime.value,
-    end_time: valueTime2.value,
-    id: id.value,
+    yy_duration: ruleForm.yy_duration.join("~"),
+    yy_end: ruleForm.yy_end,
+    hh_end: ruleForm.hh_end,
+    black_count: ruleForm.black_count,
+    notice_time: ruleForm.notice_time,
+    id: ruleForm.id,
   };
   // let res = await admin.adminAdd(data);
   let res = await axios({
     method: "post",
-    url: "/api/carBook/cnupdate.action",
+    url: api.value + "/carBook/cnupdate.action",
     headers: {
       "Content-Type": "application/json;charset=utf-8",
       token: sessionStorage.getItem("token"),
@@ -144,18 +184,26 @@ const timeUpdata = async (val) => {
   });
   console.log(res, "修改候补");
   if (res.data.code == 200) {
-    getlist(res.data.message);
+    // getlist();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
   } else {
+    getlist();
     ElMessage({
       type: "error",
       showClose: true,
-      message: res.data.message,
+      message: "修改失败",
       center: true,
     });
   }
 };
 
 onBeforeMount(() => {
+  api.value = store.state.user.api;
   getlist();
 });
 onUnmounted(() => {});
@@ -177,6 +225,7 @@ onUnmounted(() => {});
     align-items: center;
     height: 60px;
     margin: 0 30px;
+    padding: 20px 0;
     border-bottom: 1px solid #ccc;
     color: #000;
     font-size: 18px;
@@ -195,11 +244,11 @@ onUnmounted(() => {});
     .filter {
       display: flex;
       flex-wrap: wrap;
-      align-items: center;
+      flex-direction: column;
       margin: 10px 0 0 0;
       .condition {
         display: flex;
-        align-items: center;
+        flex-direction: column;
         margin: 10px 30px 10px 0;
         span {
           margin: 0 10px 0 0;

+ 3 - 11
vite.config.js

@@ -19,25 +19,17 @@ export default defineConfig({
   },
   server: {
     host: "0.0.0.0",
-    port: 8991,
+    port: 8990,
     // 是否开启 https
     // https: false,
     // 线上
     proxy: {
-      "/api": {
+      "/carstop/carbook": {
         target: "https://chtech.ncjti.edu.cn/carstop/carbook",
         changeOrigin: true,
-        rewrite: (path) => path.replace(/^\/api/, ""),
+        rewrite: (path) => path.replace(/^\/carstop\/carbook/, ""),
       },
     },
-    // 线下
-    // proxy: {
-    //   "/video/transcoding": {
-    //     target: "http://192.168.161.34:8082", //实际请求地址
-    //     changeOrigin: true,
-    //     rewrite: (path) => path.replace(/^\/video\/transcoding/, ""),
-    //   },
-    // },
   },
   publicDir: "public",
   base: "./",