index.vue 4.5 KB

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