| | |
| | | <template> |
| | | <div class="navbar"> |
| | | <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" |
| | | @toggleClick="toggleSidebar" /> |
| | | |
| | | <breadcrumb id="breadcrumb-container" class="breadcrumb-container" /> |
| | | |
| | | <div class="right-menu"> |
| | | <template v-if="device !== 'mobile'"> |
| | | <screenfull id="screenfull" class="right-menu-item hover-effect" /> |
| | | </template> |
| | | |
| | | <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> |
| | | <div class="avatar-wrapper"> |
| | | <img :src="avatar + '?imageView2/1/w/80/h/80'" class="user-avatar" alt="" /> |
| | | <el-icon class="el-icon-caret-bottom" size="small"> |
| | | <CaretBottom /> |
| | | </el-icon> |
| | | </div> |
| | | <template #dropdown> |
| | | <el-dropdown-menu> |
| | | <router-link to="/"> |
| | | <el-dropdown-item>首页</el-dropdown-item> |
| | | </router-link> |
| | | <el-dropdown-item @click="logout"> |
| | | <span style="display:block;">退出登录</span> |
| | | </el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | </div> |
| | | </div> |
| | | <div class="navbar"> |
| | | <div class="sys-name-wrapper"> |
| | | <div class="sys-icon"> |
| | | <svg-icon icon-class="lock-hdw"></svg-icon> |
| | | </div> |
| | | <div class="sys-name">{{ title }}</div> |
| | | </div> |
| | | <div class="right-menu"> |
| | | <el-dropdown |
| | | class="avatar-container right-menu-item hover-effect" |
| | | trigger="click" |
| | | > |
| | | <div class="avatar-wrapper"> |
| | | <img |
| | | :src="avatar + '?imageView2/1/w/80/h/80'" |
| | | class="user-avatar" |
| | | alt="" |
| | | /> |
| | | <span>{{ uname }}</span> |
| | | <el-icon class="el-icon-caret-bottom" size="small"> |
| | | <CaretBottom /> |
| | | </el-icon> |
| | | </div> |
| | | <template #dropdown> |
| | | <el-dropdown-menu> |
| | | <router-link to="/"> |
| | | <el-dropdown-item>首页</el-dropdown-item> |
| | | </router-link> |
| | | <el-dropdown-item @click="logout"> |
| | | <span style="display: block">退出登录</span> |
| | | </el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { mapState } from 'pinia'; |
| | | import store from '@/store'; |
| | | import Breadcrumb from '@/components/Breadcrumb'; |
| | | import Hamburger from '@/components/Hamburger'; |
| | | import Screenfull from '@/components/Screenfull'; |
| | | import { defineComponent } from 'vue'; |
| | | import { CaretBottom } from '@element-plus/icons-vue'; |
| | | <script setup name="Navbar"> |
| | | import store from "@/store"; |
| | | import { computed, ref, watchEffect } from "vue"; |
| | | import { useRoute, useRouter } from "vue-router"; |
| | | import { CaretBottom } from "@element-plus/icons-vue"; |
| | | import SvgIcon from "@/components/SvgIcon/index.vue"; |
| | | import useWebSocket from "@/hooks/useWebSocket"; |
| | | import useElement from "@/hooks/useElement.js"; |
| | | const { message } = useWebSocket("loginCheck"); |
| | | |
| | | const { $alert, $loading, $message, $confirm } = useElement(); |
| | | |
| | | export default defineComponent({ |
| | | components: { |
| | | Breadcrumb, |
| | | Hamburger, |
| | | Screenfull, |
| | | CaretBottom |
| | | }, |
| | | computed: { |
| | | ...mapState(store.app, [ |
| | | 'sidebar', |
| | | 'device' |
| | | ]), |
| | | ...mapState(store.user, [ |
| | | 'avatar' |
| | | ]) |
| | | }, |
| | | methods: { |
| | | toggleSidebar() { |
| | | store.app().toggleSidebar(); |
| | | }, |
| | | async logout() { |
| | | await store.user().logout(); |
| | | this.$router.push(`/login?redirect=${this.$route.fullPath}`); |
| | | const router = useRouter(); |
| | | const route = useRoute(); |
| | | |
| | | const title = ref("鸿蒙智能电子锁管理平台"); |
| | | const sidebar = computed(() => store.app().sidebar); |
| | | const device = computed(() => store.app().device); |
| | | const avatar = computed(() => store.user().avatar); |
| | | const uname = computed(() => store.user().name); |
| | | |
| | | watchEffect(() => { |
| | | if (message.value) { |
| | | const { |
| | | code, |
| | | data: { checkLogin }, |
| | | } = JSON.parse(message.value); |
| | | if (!checkLogin.data) { |
| | | $message(checkLogin.msg); |
| | | logout(); |
| | | // localStorage.removeItem("uname"); |
| | | // localStorage.removeItem("uid"); |
| | | // setTimeout(() => { |
| | | // $router.push("/login"); |
| | | // location.reload(); |
| | | // }, 2000); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | |
| | | function toggleSidebar() { |
| | | store.app().toggleSidebar(); |
| | | } |
| | | async function logout() { |
| | | await store.user().logout(); |
| | | // console.log('logout', '============='); |
| | | |
| | | router.push(`/login?redirect=${route.fullPath}`); |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .navbar { |
| | | height: 50px; |
| | | overflow: hidden; |
| | | position: relative; |
| | | background: #fff; |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, .08); |
| | | .navbar { |
| | | height: 64px; |
| | | overflow: hidden; |
| | | position: relative; |
| | | background: #fff; |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); |
| | | .sys-name-wrapper { |
| | | display: inline-block; |
| | | line-height: 64px; |
| | | color: var(--light-color); |
| | | font-size: 24px; |
| | | width: 894px; |
| | | .sys-icon { |
| | | display: inline-block; |
| | | font-weight: 700; |
| | | margin-left: 16px; |
| | | margin-right: 8px; |
| | | } |
| | | .sys-name { |
| | | font-weight: 700; |
| | | display: inline-block; |
| | | } |
| | | } |
| | | .hamburger-container { |
| | | line-height: 46px; |
| | | height: 100%; |
| | | float: left; |
| | | cursor: pointer; |
| | | transition: background 0.3s; |
| | | -webkit-tap-highlight-color: transparent; |
| | | |
| | | .hamburger-container { |
| | | line-height: 46px; |
| | | height: 100%; |
| | | float: left; |
| | | cursor: pointer; |
| | | transition: background .3s; |
| | | -webkit-tap-highlight-color: transparent; |
| | | &:hover { |
| | | background: rgba(0, 0, 0, 0.025); |
| | | } |
| | | } |
| | | |
| | | &:hover { |
| | | background: rgba(0, 0, 0, .025) |
| | | } |
| | | } |
| | | .breadcrumb-container { |
| | | float: left; |
| | | } |
| | | |
| | | .breadcrumb-container { |
| | | float: left; |
| | | } |
| | | .errLog-container { |
| | | display: inline-block; |
| | | vertical-align: top; |
| | | } |
| | | |
| | | .errLog-container { |
| | | display: inline-block; |
| | | vertical-align: top; |
| | | } |
| | | .right-menu { |
| | | float: right; |
| | | height: 100%; |
| | | line-height: 64px; |
| | | |
| | | .right-menu { |
| | | float: right; |
| | | height: 100%; |
| | | line-height: 50px; |
| | | &:focus { |
| | | outline: none; |
| | | } |
| | | |
| | | &:focus { |
| | | outline: none; |
| | | } |
| | | .right-menu-item { |
| | | display: inline-block; |
| | | padding: 0 8px; |
| | | height: 100%; |
| | | line-height: 64px; |
| | | font-size: 18px; |
| | | color: #5a5e66; |
| | | vertical-align: text-bottom; |
| | | |
| | | .right-menu-item { |
| | | display: inline-block; |
| | | padding: 0 8px; |
| | | height: 100%; |
| | | line-height: 50px; |
| | | font-size: 18px; |
| | | color: #5a5e66; |
| | | vertical-align: text-bottom; |
| | | &.hover-effect { |
| | | cursor: pointer; |
| | | transition: background 0.3s; |
| | | |
| | | &.hover-effect { |
| | | cursor: pointer; |
| | | transition: background .3s; |
| | | &:hover { |
| | | background: rgba(0, 0, 0, 0.025); |
| | | } |
| | | } |
| | | } |
| | | |
| | | &:hover { |
| | | background: rgba(0, 0, 0, .025) |
| | | } |
| | | } |
| | | } |
| | | .avatar-container { |
| | | margin-right: 30px; |
| | | |
| | | .avatar-container { |
| | | margin-right: 30px; |
| | | .avatar-wrapper { |
| | | margin-top: 10px; |
| | | position: relative; |
| | | height: 45px; |
| | | display: flex; |
| | | align-items: center; |
| | | color: #fff; |
| | | |
| | | .avatar-wrapper { |
| | | margin-top: 5px; |
| | | position: relative; |
| | | height: 45px; |
| | | .user-avatar { |
| | | cursor: pointer; |
| | | width: 40px; |
| | | height: 40px; |
| | | border-radius: 10px; |
| | | margin-right: 10px; |
| | | } |
| | | |
| | | .user-avatar { |
| | | cursor: pointer; |
| | | width: 40px; |
| | | height: 40px; |
| | | border-radius: 10px; |
| | | } |
| | | |
| | | .el-icon-caret-bottom { |
| | | cursor: pointer; |
| | | position: absolute; |
| | | right: -20px; |
| | | top: 25px; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .el-icon-caret-bottom { |
| | | cursor: pointer; |
| | | position: absolute; |
| | | right: -20px; |
| | | // top: 25px; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |