Navbar.vue 4.3 KB

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