index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <script setup lang="ts">
  2. import { useNav } from "@/layout/hooks/useNav";
  3. import LaySearch from "../lay-search/index.vue";
  4. import LayNotice from "../lay-notice/index.vue";
  5. import LayNavMix from "../lay-sidebar/NavMix.vue";
  6. import { useTranslationLang } from "@/layout/hooks/useTranslationLang";
  7. import LaySidebarFullScreen from "../lay-sidebar/components/SidebarFullScreen.vue";
  8. import LaySidebarBreadCrumb from "../lay-sidebar/components/SidebarBreadCrumb.vue";
  9. import LaySidebarTopCollapse from "../lay-sidebar/components/SidebarTopCollapse.vue";
  10. import GlobalizationIcon from "@/assets/svg/globalization.svg?component";
  11. import AccountSettingsIcon from "~icons/ri/user-settings-line";
  12. import LogoutCircleRLine from "~icons/ri/logout-circle-r-line";
  13. import Setting from "~icons/ri/settings-3-line";
  14. import Check from "~icons/ep/check";
  15. import { ref } from "vue";
  16. const {
  17. layout,
  18. device,
  19. logout,
  20. onPanel,
  21. pureApp,
  22. uid,
  23. userAvatar,
  24. avatarsStyle,
  25. toggleSideBar,
  26. toAccountSettings,
  27. getDropdownItemStyle,
  28. getDropdownItemClass
  29. } = useNav();
  30. const { t, locale, translationCh, translationEn } = useTranslationLang();
  31. const swEnable = ref(false);
  32. </script>
  33. <template>
  34. <div class="navbar bg-[#fff] shadow-xs shadow-[rgba(0,21,41,0.08)]">
  35. <LaySidebarTopCollapse
  36. v-if="device === 'mobile'"
  37. class="hamburger-container"
  38. :is-active="pureApp.sidebar.opened"
  39. @toggleClick="toggleSideBar"
  40. />
  41. <LaySidebarBreadCrumb
  42. v-if="layout !== 'mix' && device !== 'mobile'"
  43. class="breadcrumb-container"
  44. />
  45. <LayNavMix v-if="layout === 'mix'" />
  46. <div v-if="layout === 'vertical'" class="vertical-header-right">
  47. <!-- 菜单搜索 -->
  48. <LaySearch id="header-search" />
  49. <!-- 国际化 -->
  50. <el-dropdown v-if="swEnable" id="header-translation" trigger="click">
  51. <GlobalizationIcon
  52. class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-hidden"
  53. />
  54. <template #dropdown>
  55. <el-dropdown-menu class="translation">
  56. <el-dropdown-item
  57. :style="getDropdownItemStyle(locale, 'zh')"
  58. :class="['dark:text-white!', getDropdownItemClass(locale, 'zh')]"
  59. @click="translationCh"
  60. >
  61. <IconifyIconOffline
  62. v-show="locale === 'zh'"
  63. class="check-zh"
  64. :icon="Check"
  65. />
  66. 简体中文
  67. </el-dropdown-item>
  68. <el-dropdown-item
  69. :style="getDropdownItemStyle(locale, 'en')"
  70. :class="['dark:text-white!', getDropdownItemClass(locale, 'en')]"
  71. @click="translationEn"
  72. >
  73. <span v-show="locale === 'en'" class="check-en">
  74. <IconifyIconOffline :icon="Check" />
  75. </span>
  76. English
  77. </el-dropdown-item>
  78. </el-dropdown-menu>
  79. </template>
  80. </el-dropdown>
  81. <!-- 全屏 -->
  82. <LaySidebarFullScreen id="full-screen" />
  83. <!-- 消息通知 -->
  84. <!-- <LayNotice id="header-notice" /> -->
  85. <!-- 退出登录 -->
  86. <el-dropdown trigger="click">
  87. <span class="el-dropdown-link navbar-bg-hover select-none">
  88. <img :src="userAvatar" :style="avatarsStyle" />
  89. <p v-if="uid" class="dark:text-white">{{ uid }}</p>
  90. </span>
  91. <template #dropdown>
  92. <el-dropdown-menu class="logout">
  93. <!-- <el-dropdown-item @click="toAccountSettings">
  94. <IconifyIconOffline
  95. :icon="AccountSettingsIcon"
  96. style="margin: 5px"
  97. />
  98. {{ t("buttons.pureAccountSettings") }}
  99. </el-dropdown-item> -->
  100. <el-dropdown-item @click="logout">
  101. <IconifyIconOffline
  102. :icon="LogoutCircleRLine"
  103. style="margin: 5px"
  104. />
  105. {{ t("buttons.pureLoginOut") }}
  106. </el-dropdown-item>
  107. </el-dropdown-menu>
  108. </template>
  109. </el-dropdown>
  110. <span
  111. class="set-icon navbar-bg-hover"
  112. :title="t('buttons.pureOpenSystemSet')"
  113. @click="onPanel"
  114. >
  115. <IconifyIconOffline :icon="Setting" />
  116. </span>
  117. </div>
  118. </div>
  119. </template>
  120. <style lang="scss" scoped>
  121. .navbar {
  122. width: 100%;
  123. height: 48px;
  124. overflow: hidden;
  125. .hamburger-container {
  126. float: left;
  127. height: 100%;
  128. line-height: 48px;
  129. cursor: pointer;
  130. }
  131. .vertical-header-right {
  132. display: flex;
  133. align-items: center;
  134. justify-content: flex-end;
  135. min-width: 280px;
  136. height: 48px;
  137. color: #000000d9;
  138. .el-dropdown-link {
  139. display: flex;
  140. align-items: center;
  141. justify-content: space-around;
  142. height: 48px;
  143. padding: 10px;
  144. color: #000000d9;
  145. cursor: pointer;
  146. p {
  147. font-size: 14px;
  148. }
  149. img {
  150. width: 22px;
  151. height: 22px;
  152. border-radius: 50%;
  153. }
  154. }
  155. }
  156. .breadcrumb-container {
  157. float: left;
  158. margin-left: 16px;
  159. }
  160. }
  161. .translation {
  162. ::v-deep(.el-dropdown-menu__item) {
  163. padding: 5px 40px;
  164. }
  165. .check-zh {
  166. position: absolute;
  167. left: 20px;
  168. }
  169. .check-en {
  170. position: absolute;
  171. left: 20px;
  172. }
  173. }
  174. .logout {
  175. width: 120px;
  176. ::v-deep(.el-dropdown-menu__item) {
  177. display: inline-flex;
  178. flex-wrap: wrap;
  179. min-width: 100%;
  180. }
  181. }
  182. </style>