index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <template>
  2. <Header :class="getHeaderClass">
  3. <!-- left start -->
  4. <div :class="`${prefixCls}-left`">
  5. <!-- logo -->
  6. <AppLogo
  7. v-if="getShowHeaderLogo || getIsMobile"
  8. :class="`${prefixCls}-logo`"
  9. :theme="getHeaderTheme"
  10. :style="getLogoWidth"
  11. />
  12. <LayoutTrigger
  13. v-if="
  14. (getShowContent && getShowHeaderTrigger && !getSplit && !getIsMixSidebar) || getIsMobile
  15. "
  16. :theme="getHeaderTheme"
  17. :sider="false"
  18. />
  19. <LayoutBreadcrumb v-if="getShowContent && getShowBread" :theme="getHeaderTheme" />
  20. </div>
  21. <!-- left end -->
  22. <!-- menu start -->
  23. <div :class="`${prefixCls}-menu`" v-if="getShowTopMenu && !getIsMobile">
  24. <LayoutMenu
  25. :isHorizontal="true"
  26. :theme="getHeaderTheme"
  27. :splitType="getSplitType"
  28. :menuMode="getMenuMode"
  29. />
  30. </div>
  31. <!-- menu-end -->
  32. <!-- action -->
  33. <div :class="`${prefixCls}-action`">
  34. <AppSearch :class="`${prefixCls}-action__item `" />
  35. <ErrorAction v-if="getUseErrorHandle" :class="`${prefixCls}-action__item error-action`" />
  36. <LockItem v-if="getUseLockPage" :class="`${prefixCls}-action__item lock-item`" />
  37. <Notify v-if="getShowNotice" :class="`${prefixCls}-action__item notify-item`" />
  38. <FullScreen v-if="getShowFullScreen" :class="`${prefixCls}-action__item fullscreen-item`" />
  39. <UserDropDown :theme="getHeaderTheme" />
  40. <AppLocalePicker
  41. v-if="getShowLocale"
  42. :reload="true"
  43. :showText="false"
  44. :class="`${prefixCls}-action__item`"
  45. />
  46. </div>
  47. </Header>
  48. </template>
  49. <script lang="ts">
  50. import { defineComponent, unref, computed } from 'vue';
  51. import { propTypes } from '/@/utils/propTypes';
  52. import { Layout } from 'ant-design-vue';
  53. import { AppLogo } from '/@/components/Application';
  54. import LayoutMenu from '../menu';
  55. import LayoutTrigger from '../trigger/index.vue';
  56. import { AppSearch } from '/@/components/Application';
  57. import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
  58. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  59. import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  60. import { useLocaleSetting } from '/@/hooks/setting/useLocaleSetting';
  61. import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
  62. import { AppLocalePicker } from '/@/components/Application';
  63. import {
  64. UserDropDown,
  65. LayoutBreadcrumb,
  66. FullScreen,
  67. Notify,
  68. LockItem,
  69. ErrorAction,
  70. } from './components';
  71. import { useAppInject } from '/@/hooks/web/useAppInject';
  72. import { useDesign } from '/@/hooks/web/useDesign';
  73. export default defineComponent({
  74. name: 'LayoutHeader',
  75. components: {
  76. Header: Layout.Header,
  77. AppLogo,
  78. LayoutTrigger,
  79. LayoutBreadcrumb,
  80. LayoutMenu,
  81. UserDropDown,
  82. AppLocalePicker,
  83. FullScreen,
  84. Notify,
  85. LockItem,
  86. AppSearch,
  87. ErrorAction,
  88. },
  89. props: {
  90. fixed: propTypes.bool,
  91. },
  92. setup(props) {
  93. const { prefixCls } = useDesign('layout-header');
  94. const {
  95. getShowTopMenu,
  96. getShowHeaderTrigger,
  97. getSplit,
  98. getIsMixMode,
  99. getMenuWidth,
  100. getIsMixSidebar,
  101. } = useMenuSetting();
  102. const { getShowLocale } = useLocaleSetting();
  103. const { getUseErrorHandle } = useRootSetting();
  104. const {
  105. getHeaderTheme,
  106. getUseLockPage,
  107. getShowFullScreen,
  108. getShowNotice,
  109. getShowContent,
  110. getShowBread,
  111. getShowHeaderLogo,
  112. } = useHeaderSetting();
  113. const { getIsMobile } = useAppInject();
  114. const getHeaderClass = computed(() => {
  115. const theme = unref(getHeaderTheme);
  116. return [
  117. prefixCls,
  118. {
  119. [`${prefixCls}--fixed`]: props.fixed,
  120. [`${prefixCls}--mobile`]: unref(getIsMobile),
  121. [`${prefixCls}--${theme}`]: theme,
  122. },
  123. ];
  124. });
  125. const getLogoWidth = computed(() => {
  126. if (!unref(getIsMixMode) || unref(getIsMobile)) {
  127. return {};
  128. }
  129. const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);
  130. return { width: `${width}px` };
  131. });
  132. const getSplitType = computed(() => {
  133. return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
  134. });
  135. const getMenuMode = computed(() => {
  136. return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
  137. });
  138. return {
  139. prefixCls,
  140. getHeaderClass,
  141. getShowHeaderLogo,
  142. getHeaderTheme,
  143. getShowHeaderTrigger,
  144. getIsMobile,
  145. getShowBread,
  146. getShowContent,
  147. getSplitType,
  148. getSplit,
  149. getMenuMode,
  150. getShowTopMenu,
  151. getShowLocale,
  152. getShowFullScreen,
  153. getShowNotice,
  154. getUseLockPage,
  155. getUseErrorHandle,
  156. getLogoWidth,
  157. getIsMixSidebar,
  158. };
  159. },
  160. });
  161. </script>
  162. <style lang="less">
  163. @import './index.less';
  164. </style>