Navbar.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <div class="navbar">
  3. <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
  4. <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
  5. <div class="right-menu">
  6. <template v-if="device !== 'mobile'">
  7. <!-- <search id="header-search" class="right-menu-item" />
  8. <error-log class="errLog-container right-menu-item hover-effect" />-->
  9. <Screenfull id="screenfull" class="right-menu-item hover-effect" />
  10. <template v-if="true">
  11. <el-tooltip content="布局大小" effect="dark" placement="bottom">
  12. <SizeSelect id="size-select" class="right-menu-item hover-effect" />
  13. </el-tooltip>
  14. <LangSelect class="right-menu-item hover-effect" />
  15. </template>
  16. </template>
  17. <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click" size="default">
  18. <div class="avatar-wrapper">
  19. <span class="nickname">{{ user.nickname || '' }}</span>
  20. <img v-if="user.avatar" :src="user.avatar" class="user-avatar" />
  21. <ArrowDown style="width: 0.6em; height: 0.6em; margin-left: 5px; font-size: 24px;" />
  22. </div>
  23. <template #dropdown>
  24. <el-dropdown-menu>
  25. <!-- <router-link to="/">
  26. <el-dropdown-item>{{ $t('navbar.dashboard') }}</el-dropdown-item>
  27. </router-link>-->
  28. <el-dropdown-item @click="logout">
  29. {{ $t('navbar.logout') }}
  30. </el-dropdown-item>
  31. </el-dropdown-menu>
  32. </template>
  33. </el-dropdown>
  34. </div>
  35. </div>
  36. </template>
  37. <script setup lang="ts">
  38. import { computed } from 'vue'
  39. import { useRoute, useRouter } from 'vue-router'
  40. import { ElMessageBox } from 'element-plus'
  41. import useStore from '@/store'
  42. // import { ls } from '@/utils'
  43. // 组件依赖
  44. import Breadcrumb from '@/components/Breadcrumb/index.vue'
  45. import Hamburger from '@/components/Hamburger/index.vue'
  46. import Screenfull from '@/components/Screenfull/index.vue'
  47. import SizeSelect from '@/components/SizeSelect/index.vue'
  48. import LangSelect from '@/components/LangSelect/index.vue'
  49. // 图标依赖
  50. import { ArrowDown } from '@element-plus/icons-vue'
  51. const { app, user } = useStore()
  52. const route = useRoute()
  53. const router = useRouter()
  54. const sidebar = computed(() => app.sidebar)
  55. const device = computed(() => app.device)
  56. function toggleSideBar() {
  57. app.toggleSidebar()
  58. }
  59. function logout() {
  60. ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
  61. confirmButtonText: '确定',
  62. cancelButtonText: '取消',
  63. type: 'warning'
  64. }).then(() => {
  65. user.logout().then(() => {
  66. router.push(`/login?redirect=${route.fullPath}`)
  67. })
  68. })
  69. }
  70. </script>
  71. <style lang="scss" scoped>
  72. ul {
  73. list-style: none;
  74. margin: 0;
  75. padding: 0;
  76. }
  77. .navbar {
  78. height: 50px;
  79. display: flex;
  80. align-items: center;
  81. overflow: hidden;
  82. position: relative;
  83. background: #fff;
  84. box-shadow: 0 1px 2px #00152914;
  85. .hamburger-container {
  86. line-height: 46px;
  87. height: 100%;
  88. float: left;
  89. cursor: pointer;
  90. transition: background 0.3s;
  91. -webkit-tap-highlight-color: transparent;
  92. &:hover {
  93. background: rgba(0, 0, 0, 0.025);
  94. }
  95. }
  96. .breadcrumb-container {
  97. flex: 1;
  98. }
  99. .right-menu {
  100. flex: 1 1 0;
  101. display: flex;
  102. align-items: center;
  103. justify-content: flex-end;
  104. height: 100%;
  105. line-height: 50px;
  106. &:focus {
  107. outline: none;
  108. }
  109. .right-menu-item {
  110. padding: 0 8px;
  111. height: 100%;
  112. font-size: 18px;
  113. color: #5a5e66;
  114. &.hover-effect {
  115. cursor: pointer;
  116. transition: background 0.3s;
  117. &:hover {
  118. background: rgba(0, 0, 0, 0.025);
  119. }
  120. }
  121. }
  122. .avatar-container {
  123. .avatar-wrapper {
  124. display: flex;
  125. align-items: center;
  126. white-space: nowrap;
  127. .nickname {
  128. font-size: 14px;
  129. }
  130. .user-avatar {
  131. cursor: pointer;
  132. width: 26px;
  133. height: 26px;
  134. border-radius: 50%;
  135. margin-left: 8px;
  136. }
  137. .el-icon-caret-bottom {
  138. cursor: pointer;
  139. font-size: 12px;
  140. }
  141. }
  142. }
  143. }
  144. }
  145. </style>