GlobalHeader.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <script setup lang="ts">
  2. import { useMenuStore } from '@/stores/menu'
  3. import { useUserStore } from '@/stores/user'
  4. import config from '@/config/defaultSetting'
  5. import avatar from '@/assets/images/avatar.png'
  6. import { ElMessageBox } from 'element-plus'
  7. const iconSize = ref('22')
  8. // 菜单收缩展开切换
  9. const menuStore = useMenuStore()
  10. const [value, toggle] = useToggle()
  11. const handleToggle = () => {
  12. toggle()
  13. menuStore.setCollapse(value.value)
  14. }
  15. // 面包屑
  16. const route = useRoute()
  17. const matched = computed(() => route.matched)
  18. // 全屏切换
  19. const { toggle: toggleScreen, isFullscreen } = useFullscreen()
  20. // 用户信息
  21. const userStore = useUserStore()
  22. const user: any = userStore.user
  23. const logout = () => {
  24. ElMessageBox.confirm('您确定要退出登录吗', '提示', {
  25. type: 'info',
  26. closeOnClickModal: false,
  27. confirmButtonText: '确定'
  28. }).then(() => {
  29. userStore.logout()
  30. })
  31. }
  32. // 主题设置
  33. const settingVisible = ref(false)
  34. </script>
  35. <template>
  36. <header class="layout-header">
  37. <div class="logo flex items-center justify-center" :class="{ collapse: value }">
  38. <img :src="config.logo" class="h-36px" />
  39. <div class="ml-2" :class="{ hidden: value }">{{ config.title }}</div>
  40. </div>
  41. <div class="flex flex-grow items-center justify-between px-4">
  42. <el-space :size="20">
  43. <el-button link @click="handleToggle">
  44. <icon-menu-unfold-one :size="iconSize" v-if="!value" />
  45. <icon-menu-fold-one :size="iconSize" v-else />
  46. </el-button>
  47. <el-breadcrumb class="breadcrumb">
  48. <el-breadcrumb-item v-for="item in matched.slice(1, matched.length)" :key="item.path">
  49. {{ item.meta.title }}
  50. </el-breadcrumb-item>
  51. </el-breadcrumb>
  52. </el-space>
  53. <div class="flex items-center">
  54. <el-button link @click="toggleScreen">
  55. <icon-off-screen :size="iconSize" v-if="isFullscreen" />
  56. <icon-full-screen :size="iconSize" v-else />
  57. </el-button>
  58. <el-button link class="mr-4" @click="settingVisible = true">
  59. <icon-setting-two :size="iconSize" />
  60. </el-button>
  61. <el-avatar class="mr-10px" :src="user.photo">
  62. <img :src="avatar" alt="" />
  63. </el-avatar>
  64. <el-dropdown>
  65. <span class="el-dropdown-link">
  66. {{ user.name }}
  67. <el-icon class="el-icon--right">
  68. <arrow-down />
  69. </el-icon>
  70. </span>
  71. <template #dropdown>
  72. <el-dropdown-menu>
  73. <el-dropdown-item>
  74. <el-icon><icon-setting-two></icon-setting-two></el-icon>
  75. <div>个人设置</div>
  76. </el-dropdown-item>
  77. <el-dropdown-item @click="logout">
  78. <el-icon><icon-logout></icon-logout></el-icon>
  79. <div>退出登录</div>
  80. </el-dropdown-item>
  81. </el-dropdown-menu>
  82. </template>
  83. </el-dropdown>
  84. </div>
  85. </div>
  86. <GlobalSetting v-model="settingVisible"></GlobalSetting>
  87. </header>
  88. </template>
  89. <style scoped lang="scss">
  90. .layout-header {
  91. background-color: #fff;
  92. height: 100%;
  93. display: flex;
  94. justify-content: space-between;
  95. align-items: center;
  96. .logo {
  97. width: var(--menu-width);
  98. }
  99. .collapse {
  100. width: calc(var(--el-menu-icon-width) + var(--el-menu-base-level-padding) * 2);
  101. }
  102. }
  103. .hidden {
  104. display: none;
  105. }
  106. </style>