Navbar.vue 4.3 KB

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