From 089bf5d2378b3c4a61d795b2a92bede2c193b771 Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:22:58 +0800
Subject: [PATCH] 1

---
 src/views/main-navbar.vue |  616 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 616 insertions(+), 0 deletions(-)

diff --git a/src/views/main-navbar.vue b/src/views/main-navbar.vue
new file mode 100644
index 0000000..581ab64
--- /dev/null
+++ b/src/views/main-navbar.vue
@@ -0,0 +1,616 @@
+<template>
+  <nav class="site-navbar" :class="'site-navbar--' + navbarLayoutType">
+    <div class="site-navbar__header">
+      <h1
+        style="float: left"
+        class="site-navbar__brand"
+        @click="$router.push({ name: 'home' })"
+      >
+        <img
+          src="../assets/img/logo.png"
+          alt=""
+          style="float: left; width: 54px; margin-left: 4px"
+        />
+        <a class="site-navbar__brand-lg" href="javascript:;"> 管理系统</a>
+      </h1>
+    </div>
+    <div class="site-navbar__body clearfix" style="height: auto;">
+      <el-menu class="site-navbar__menu" mode="horizontal">
+        <!-- 收缩菜单 -->
+        <!-- <el-menu-item
+          class="site-navbar__switch"
+          index="0"
+          @click="sidebarFold = !sidebarFold"
+        >
+          <icon-svg name="zhedie"></icon-svg>
+        </el-menu-item> -->
+
+        <!-- 顶部导航 -->
+
+        <!-- <el-menu-item index="1">处理中心</el-menu-item> -->
+        <!-- <el-submenu index="2">
+          <template slot="title">我的工作台</template>
+          <el-menu-item index="2-1">选项1</el-menu-item>
+          <el-menu-item index="2-2">选项2</el-menu-item>
+          <el-menu-item index="2-3">选项3</el-menu-item>
+          <el-submenu index="2-4">
+            <template slot="title">选项4</template>
+            <el-menu-item index="2-4-1">选项1</el-menu-item>
+            <el-menu-item index="2-4-2">选项2</el-menu-item>
+            <el-menu-item index="2-4-3">选项3</el-menu-item>
+          </el-submenu>
+        </el-submenu> -->
+        <!-- <el-menu-item index="3" disabled>消息中心</el-menu-item>
+        <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item> -->
+        <div
+        class="site-navbar__menu site-navbar__menu--right"
+        mode="horizontal"
+        style="display: flex"
+      >
+        <!-- 模糊搜索 -->
+        <el-autocomplete
+          v-model="state"
+          :fetch-suggestions="querySearchAsync"
+          placeholder="请输入菜单名称"
+          suffix-icon="el-icon-search"
+          clearable
+          @select="handleSelect"
+          class="searchInput"
+        ></el-autocomplete>
+        <!-- <el-menu-item class="site-navbar__avatar" index="3"> -->
+        <div v-if="!isShowKefu" style="width: 10px"></div>
+        <div
+          v-if="isShowKefu"
+          @click="showChat()"
+          class="isPng"
+          style="
+            width: 31px;
+            float: left;
+            padding: 10px 0px;
+            margin-right: 10px;
+            margin-left: 10px;
+          "
+        >
+        </div>
+        <el-badge
+          v-if="isShowKefu"
+          :value="countNum('.unread')"
+          v-show="countNum('.unread') > 0"
+          style="
+            align-items: center;
+            display: flex;
+            padding-top: 15px;
+            padding-right: 15px;
+          "
+        ></el-badge>
+        <!-- <el-button stype="info" icon="el-icon-s-comment" style="margin-right: 0px;border: none;" @click="showChat()"></el-button> -->
+        <div
+          style="width: 20px; display: flex; padding: 20px 5px"
+          v-if="kefuInfo.isOnline == true"
+        >
+          <img
+            src="~@/assets/image/online.png"
+            width="10px"
+            height="10px"
+            style="align-items: center; display: flex"
+          />
+        </div>
+        <div
+          style="width: 20px; display: flex; padding: 20px 5px"
+          v-if="kefuInfo.isOnline == false"
+        >
+          <div
+            style="
+              width: 10px;
+              height: 10px;
+              background: #dedede;
+              border-radius: 5px;
+            "
+          ></div>
+        </div>
+        <div style="align-items: center; display: flex">
+          <el-dropdown
+            :show-timeout="0"
+            placement="bottom"
+            class="ddd1"
+            @visible-change="visibleChange"
+            style="align-items: center"
+          >
+            <!-- <img src="~@/assets/image/online.png" width="10px" height="10px"/> -->
+            <span class="el-dropdown-link">
+              {{ userName }}
+              <i
+                class="el-icon-arrow-down el-icon--right"
+                v-show="!dropdownVisiable"
+              ></i>
+              <i
+                class="el-icon-arrow-up el-icon--right"
+                v-show="dropdownVisiable"
+              ></i>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item @click.native="customerCentor()" v-show="isKeFu"
+                ><span class="el-icon-edit"></span> 客服中心</el-dropdown-item
+              >
+              <el-dropdown-item @click.native="updatePasswordHandle()"
+                ><span class="el-icon-edit"></span>
+                修改登录密码</el-dropdown-item
+              >
+              <el-dropdown-item @click.native="updatePassmoneyHandle()"
+                ><span class="el-icon-coin"></span
+                >修改资金密码</el-dropdown-item
+              >
+              <!-- <el-dropdown-item v-if="isAuth('sys:user:update')" @click.native="message()">谷歌验证器</el-dropdown-item> -->
+              <el-dropdown-item @click.native="logoutHandle()"
+                ><span class="el-icon-switch-button"></span
+                >退出登录</el-dropdown-item
+              >
+            </el-dropdown-menu>
+          </el-dropdown>
+        </div>
+
+        <!-- </el-menu-item> -->
+      </div>
+
+        <!-- 以下是顶部导航 -->
+        <main-navbar-sub-menu
+          v-for="item in menuListArr"
+          :key="item.menuId"
+          :menu="item"
+          :dynamicMenuRoutes="dynamicMenuRoutes"
+          :type="0"
+        >
+        </main-navbar-sub-menu>
+      </el-menu>
+
+    </div>
+    <!-- 弹窗, 修改密码,资金密码,谷歌验证器 main-navbar-update-googleAuthCode-->
+    <customer-centor
+      v-if="customerCentorVisible"
+      ref="customerCentor"
+    ></customer-centor>
+    <update-password
+      v-if="updatePassowrdVisible"
+      ref="updatePassowrd"
+    ></update-password>
+    <update-passmoney
+      v-if="updatePassmoneyVisible"
+      ref="updatePassmoney"
+    ></update-passmoney>
+    <update-Passgoogle
+      v-if="googleAuthCode"
+      ref="updatePassgoogle"
+    ></update-Passgoogle>
+  </nav>
+</template>
+
+<script>
+import CustomerCentor from "./main-navbar-customerCentor";
+import UpdatePassword from "./main-navbar-update-password";
+import UpdatePassmoney from "./main-navbar-update-passmoney";
+import UpdatePassgoogle from "./main-navbar-update-googleAuthCode";
+import MainNavbarSubMenu from "./main-navbar-sub-menu";
+import { clearLoginInfo } from "@/utils";
+import { unreadNewAdminOnlineChatAction } from "@/api/chat";
+export default {
+  data() {
+    return {
+      customerCentorVisible: false,
+      updatePassowrdVisible: false,
+      updatePassmoneyVisible: false,
+      googleAuthCode: false,
+      dynamicMenuRoutes: [],
+      dropdownVisiable: false,
+      isKeFu: false,
+      restaurants: [],
+      state: "",
+      timeout: null,
+      kefuInfo: {},
+      unreadNum: 0,
+      isShowKefu: false,
+    };
+  },
+  components: {
+    CustomerCentor,
+    UpdatePassword,
+    UpdatePassmoney,
+    UpdatePassgoogle,
+    MainNavbarSubMenu,
+  },
+  computed: {
+    navbarLayoutType: {
+      get() {
+        return this.$store.state.common.navbarLayoutType;
+      },
+    },
+    sidebarFold: {
+      get() {
+        return this.$store.state.common.sidebarFold;
+      },
+      set(val) {
+        this.$store.commit("common/updateSidebarFold", val);
+      },
+    },
+    mainTabs: {
+      get() {
+        return this.$store.state.common.mainTabs;
+      },
+      set(val) {
+        this.$store.commit("common/updateMainTabs", val);
+      },
+    },
+    userName: {
+      get() {
+        return this.$store.state.user.name;
+      },
+    },
+    googleAuthBind: {
+      get() {
+        return this.$store.state.user.googleAuthBind;
+      },
+    },
+    menuListArr: {
+      get() {
+        return this.$store.state.common.menuListArr;
+      },
+      set(val) {
+        this.$store.commit("common/updateMenuTopList", val);
+      }, //重新存过滤后的数组updateMenuTopList
+    },
+    // kefuInfo: {
+    //   get () {
+    //     return this.$store.state.common.kefuInfo
+    //   },
+    //   set (val) { this.$store.commit('common/updateKefuInfo', val) }
+    // },
+  },
+  created() {
+    let menuListArr = [];
+    if (
+        sessionStorage.getItem("menuList") &&
+        sessionStorage.getItem("menuList") != `"[]"`
+      ) {
+        menuListArr = JSON.parse(sessionStorage.getItem("menuList"));
+      }
+    if(menuListArr.length > 0){
+      this.menuListArr = menuListArr.filter(
+      (item) => item.orderNum < 24 && item.orderNum > 0
+    );
+    }
+   
+    // console.log("menuListArr = " + JSON.stringify(this.menuListArr))
+    this.dynamicMenuRoutes = JSON.parse(
+      sessionStorage.getItem("dynamicMenuRoutes") || "[]"
+    );
+
+    // 获取当前管理员信息
+    this.$http({
+      url: this.$http.adornUrl("/sys/user/info"),
+      method: "get",
+      params: this.$http.adornParams(),
+    }).then(({ data }) => {
+      this.$login = true;
+    });
+    // if (!this.IS_DEBUG) {
+    //   let timer = setTimeout(() => {
+    //     clearTimeout(timer);
+    //     this.unreadNumCall();
+    //   }, 2000);
+    // }
+  },
+  mounted() {
+    //let searchAll = JSON.parse(sessionStorage.getItem("menuList") || "[]");
+    //   this.restaurants = searchAll.filter(
+    //   (item) => item.list
+    // );
+    //console.log(this.restaurants)
+    this.filterMenuList();
+
+    this.$bus.$on("updateKefuInfo", (data) => {
+      console.log("updateKefuInfo = " + JSON.stringify(data));
+      this.kefuInfo = data;
+    });
+
+    this.$bus.$on("isShowKefu", (data) => {
+      this.isShowKefu = data;
+      console.log("显示客服");
+    });
+  },
+  beforeDestroy() {
+    this.$bus.$off("updateKefuInfo");
+    this.$bus.$off("isShowKefu");
+  },
+  methods: {
+    countNum(name) {
+      let num = this.main.tips[name];
+      if (isNaN(num)) {
+        num = 0;
+      }
+      return num;
+    },
+    unreadNumCall() {
+      //
+      if (this.$login) {
+        unreadNewAdminOnlineChatAction(
+          {},
+          (data) => {
+            console.log(
+              "unreadNewAdminOnlineChatAction = " + JSON.stringify(data)
+            );
+            this.unreadNum = data.data;
+          },
+          (err) => {
+            console.log("err => " + JSON.stringify(err));
+            this.$login = false;
+          }
+        );
+      }
+      //
+      let timer = setTimeout(() => {
+        clearTimeout(timer);
+        this.unreadNumCall();
+      }, 5000);
+      //
+    },
+    // filterMenuList() {
+    //   let searchAll = JSON.parse(sessionStorage.getItem("menuList") || "[]");
+    //   // 过滤数组并生成新的数组对象
+    //   this.restaurants = searchAll.flatMap(menuItem => {
+    //     return menuItem.list?.map(item => ({
+    //       value: item.name,
+    //       url: item.url,
+    //     })) || [];
+    //   });
+    // },
+    // 路由操作
+    routeHandle(route) {
+      if (route.meta.isTab) {
+        // tab选中, 不存在先添加
+        var tab = this.mainTabs.filter((item) => item.name === route.name)[0];
+        if (!tab) {
+          if (route.meta.isDynamic) {
+            route = this.dynamicMenuRoutes.filter(
+              (item) => item.name === route.name
+            )[0];
+            if (!route) {
+              return console.error("未能找到可用标签页!");
+            }
+          }
+          tab = {
+            menuId: route.meta.menuId || route.name,
+            name: route.name,
+            title: route.meta.title,
+            type: isURL(route.meta.iframeUrl) ? "iframe" : "module",
+            iframeUrl: route.meta.iframeUrl || "",
+          };
+          this.mainTabs = this.mainTabs.concat(tab);
+        }
+        this.menuActiveName = tab.menuId + "";
+        this.mainTabsActiveName = tab.name;
+      }
+    },
+    // 客服中心
+    customerCentor() {
+      this.customerCentorVisible = true;
+      this.$nextTick(() => {
+        this.$refs.customerCentor.init();
+      });
+    },
+    // 修改密码
+    updatePasswordHandle() {
+      this.updatePassowrdVisible = true;
+      this.$nextTick(() => {
+        this.$refs.updatePassowrd.init();
+      });
+    },
+    // 修改资金密码
+    updatePassmoneyHandle() {
+      this.updatePassmoneyVisible = true;
+      this.$nextTick(() => {
+        this.$refs.updatePassmoney.init();
+      });
+    },
+    // 谷歌验证码绑定
+    updategoogleAuthCode() {
+      if (this.googleAuthBind) {
+        this.$confirm("谷歌验证器已绑定", "谷歌验证器", {
+          //是否已绑定
+          distinguishCancelAndClose: true,
+          confirmButtonText: "确定",
+          cancelButtonText: "解绑",
+          type: "success",
+        })
+          .then(() => {
+            this.$message({
+              type: "success",
+            });
+          })
+          .catch((action) => {
+            if (action === "cancel") {
+              this.googleAuthCode = true;
+              this.$nextTick(() => {
+                this.$refs.updatePassgoogle.init();
+              });
+            }
+          });
+      } else {
+        this.googleAuthCode = true;
+        this.$nextTick(() => {
+          this.$refs.updatePassgoogle.init();
+        });
+      }
+    },
+    // 退出
+    logoutHandle() {
+      this.$confirm(`确定进行[退出]操作?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$http({
+            url: this.$http.adornUrl("/logOut"),
+            method: "post",
+            data: this.$http.adornData(),
+          }).then(({ data }) => {
+            //
+            this.$login = false;
+            Vue.prototype.$login = false;
+            console.log("/logOut");
+            this.$bus.$emit("tabsCloseAllHandle", {});
+            this.$router.push({ path: "/login" });
+            clearLoginInfo();
+
+            console.log("this.$login  = " + this.$login);
+            //this.$router.push({ name: 'login' })
+          });
+        })
+        .catch(() => {});
+    },
+    showChat() {
+      // this.main.isShowService = !this.main.isShowService;
+      //this.$router.push({ name: "message" });
+      if (this.$route.name !== "message") {
+        // 如果当前路由不是 "message",则跳转到 "message" 路由
+        this.$router.push({ name: "message" });
+      } else {
+        // 如果当前路由已经是 "message",则返回到上一个路由
+        this.$router.go(-1);
+      }
+    },
+    visibleChange(flag) {
+      this.isKeFu = Vue.prototype.$isKefu;
+      this.dropdownVisiable = flag;
+
+      console.log(" this.isKeFu= " + this.isKeFu);
+    },
+    message() {
+      this.$router.push({ name: "message" });
+    },
+    querySearchAsync(queryString, cb) {
+      // 模糊搜索
+      var restaurants = this.restaurants;
+      var results = queryString
+        ? restaurants.filter(this.createStateFilter(queryString))
+        : restaurants;
+
+      clearTimeout(this.timeout);
+      this.timeout = setTimeout(() => {
+        cb(results);
+      }, 2000 * Math.random());
+    },
+    createStateFilter(queryString) {
+      // 模糊搜索
+      return (state) => {
+        return (
+          state.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+        );
+      };
+    },
+    handleSelect(item) {
+      // 模糊搜索
+      const modifiedUrl = item.url.replace(/\//g, "-");
+      this.$router.push({ path: modifiedUrl });
+    },
+    filterMenuList() {
+      let searchAll = [];
+
+      if (
+        sessionStorage.getItem("menuList") &&
+        sessionStorage.getItem("menuList") != `"[]"`
+      ) {
+        searchAll = JSON.parse(sessionStorage.getItem("menuList"));
+      }
+      // 过滤数组并生成新的数组对象
+      //console.log(searchAll);
+      if (searchAll.length > 0) {
+        this.restaurants = searchAll.flatMap((menuItem) => {
+          return menuItem.orderNum > 0 && menuItem.list
+            ? menuItem.list
+                .filter((item) => item.url.trim() !== "")
+                .map((item) => ({
+                  value: item.name,
+                  url: item.url,
+                }))
+            : [];
+        });
+      }
+    },
+  },
+};
+</script>
+<style scoped>
+::v-deep .el-menu-item {
+  background: none !important;
+}
+/* 顶部颜色 */
+::v-deep .site-navbar__body { 
+  background: #263238 !important;
+  min-height: 100px;
+}
+::v-deep .el-submenu__title:hover {
+  background-color: #0030ff;
+}
+.site-navbar {
+  background-color: #263238;
+}
+.el-dropdown {
+  color: #fff;
+}
+::v-deep .el-menu--horizontal {
+  border: none !important;
+}
+.mnbuton {
+  width: 0px;
+  height: 0px;
+  border: none;
+}
+
+.el-dropdown-link {
+  cursor: pointer;
+  color: #fff;
+}
+.el-icon-arrow-down {
+  font-size: 12px;
+  color: #fff;
+}
+
+.el-icon-arrow-up {
+  font-size: 12px;
+  color: #fff;
+}
+</style>
+
+<style lang="scss" scoped>
+.ddd {
+  ::v-deep .el-submenu__title {
+    color: #fff;
+  }
+  ::v-deep .el-submenu__icon-arrow {
+    right: 5px;
+    top: 56%;
+    color: #fff;
+  }
+}
+.searchInput {
+  float: left;
+  width: 200px;
+  margin-top: 5px;
+}
+.el-popper[x-placement^="bottom"] .popper__arrow::after {
+  border-bottom-color: white !important;
+}
+.isPng{
+  background: url(../assets/img/Vector.png)  center no-repeat;
+  background-size: 100%;
+  transition: background-image 0.3s ease-in-out,box-shadow 0.2s ease-in-out; /* 添加过渡效果 */
+  cursor: pointer;
+}
+.isPng:hover {
+  background-image: url(../assets/img/VectorM.png); /* 鼠标悬停时改变背景图片 */
+}
+.isImg:active {
+  background-image: url(../assets/img/VectorM.png); /* 点击时改变背景图片 */
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); /* 添加阴影效果 */
+}
+</style>

--
Gitblit v1.9.3