index.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <template>
  2. <Header :class="getHeaderClass">
  3. <!-- left start -->
  4. <div :class="`${prefixCls}-left`">
  5. <!-- logo -->
  6. <AppLogo
  7. v-if="(getShowHeaderLogo || getIsMobile) && !getIsTopLeft"
  8. :class="`${prefixCls}-logo`"
  9. :theme="getHeaderTheme"
  10. :style="getLogoWidth"
  11. />
  12. <LayoutTrigger
  13. v-if="
  14. (getShowContent &&
  15. getShowHeaderTrigger &&
  16. !getSplit &&
  17. !getIsMixSidebar &&
  18. !getIsTopLeft) ||
  19. getIsMobile
  20. "
  21. :theme="getHeaderTheme"
  22. :sider="false"
  23. />
  24. <LayoutBreadcrumb v-if="getShowContent && getShowBread" :theme="getHeaderTheme" />
  25. <!-- menu start -->
  26. <div :class="`${prefixCls}-menu`" v-if="getShowTopMenu && !getIsMobile">
  27. <LayoutMenu
  28. :isHorizontal="true"
  29. :theme="getHeaderTheme"
  30. :splitType="getSplitType"
  31. :menuMode="getMenuMode"
  32. />
  33. </div>
  34. <!-- menu-end -->
  35. <div class="menu-name"> 驼人新城人民医院 </div>
  36. </div>
  37. <!-- left end -->
  38. <!-- action -->
  39. <div :class="`${prefixCls}-action`">
  40. <Notify v-if="getShowNotice" :class="`${prefixCls}-action__item notify-item`" />
  41. <UserDropDown :theme="getHeaderTheme" />
  42. <MoreDropdown :theme="getHeaderTheme" />
  43. </div>
  44. </Header>
  45. </template>
  46. <script lang="ts">
  47. import { defineComponent, unref, computed } from 'vue'; // , inject
  48. import { propTypes } from '/@/utils/propTypes';
  49. import { Layout } from 'ant-design-vue';
  50. import { AppLogo } from '/@/components/Application';
  51. import LayoutMenu from '../menu/index.vue';
  52. import LayoutTrigger from '../trigger/index.vue';
  53. import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
  54. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  55. import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  56. import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
  57. import { SettingButtonPositionEnum } from '/@/enums/appEnum';
  58. import { UserDropDown, MoreDropdown, LayoutBreadcrumb, Notify } from './components';
  59. import { useAppInject } from '/@/hooks/web/useAppInject';
  60. import { useDesign } from '/@/hooks/web/useDesign';
  61. export default defineComponent({
  62. name: 'LayoutHeader',
  63. components: {
  64. // eslint-disable-next-line vue/no-reserved-component-names
  65. Header: Layout.Header,
  66. AppLogo,
  67. LayoutTrigger,
  68. LayoutBreadcrumb,
  69. LayoutMenu,
  70. UserDropDown,
  71. MoreDropdown,
  72. Notify,
  73. },
  74. props: {
  75. fixed: propTypes.bool,
  76. },
  77. setup(props) {
  78. const { prefixCls } = useDesign('layout-header');
  79. const {
  80. getShowTopMenu,
  81. getShowHeaderTrigger,
  82. getSplit,
  83. getIsMixMode,
  84. // getMenuWidth,
  85. getLogoContentWidth,
  86. getIsMixSidebar,
  87. getIsTopLeft,
  88. } = useMenuSetting();
  89. const { getUseErrorHandle, getShowSettingButton, getSettingButtonPosition } =
  90. useRootSetting();
  91. const {
  92. getHeaderTheme,
  93. getShowFullScreen,
  94. getShowNotice,
  95. getShowContent,
  96. getShowBread,
  97. getShowHeaderLogo,
  98. getShowHeader,
  99. getShowSearch,
  100. } = useHeaderSetting();
  101. const { getIsMobile } = useAppInject();
  102. // 进入页面后, 打开 websocket;
  103. // const socket = inject('useWebSocketFn') as any;
  104. // socket.open();
  105. const getHeaderClass = computed(() => {
  106. const theme = unref(getHeaderTheme);
  107. return [
  108. prefixCls,
  109. {
  110. [`${prefixCls}--fixed`]: props.fixed,
  111. [`${prefixCls}--mobile`]: unref(getIsMobile),
  112. [`${prefixCls}--${theme}`]: theme,
  113. },
  114. ];
  115. });
  116. const getShowSetting = computed(() => {
  117. if (!unref(getShowSettingButton)) {
  118. return false;
  119. }
  120. const settingButtonPosition = unref(getSettingButtonPosition);
  121. if (settingButtonPosition === SettingButtonPositionEnum.AUTO) {
  122. return unref(getShowHeader);
  123. }
  124. return settingButtonPosition === SettingButtonPositionEnum.HEADER;
  125. });
  126. const getLogoWidth = computed(() => {
  127. if (!unref(getIsMixMode) || unref(getIsMobile)) {
  128. return {};
  129. }
  130. let width = 'auto' as string | number;
  131. if (unref(getLogoContentWidth) == 0) {
  132. return { width };
  133. }
  134. width = unref(getLogoContentWidth) < 180 ? 180 : unref(getLogoContentWidth);
  135. return { width: `${width}px` };
  136. });
  137. const getSplitType = computed(() => {
  138. return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
  139. });
  140. const getMenuMode = computed(() => {
  141. return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
  142. });
  143. return {
  144. prefixCls,
  145. getHeaderClass,
  146. getShowHeaderLogo,
  147. getHeaderTheme,
  148. getShowHeaderTrigger,
  149. getIsMobile,
  150. getShowBread,
  151. getShowContent,
  152. getSplitType,
  153. getSplit,
  154. getMenuMode,
  155. getShowTopMenu,
  156. getShowFullScreen,
  157. getShowNotice,
  158. getUseErrorHandle,
  159. getLogoWidth,
  160. getIsMixSidebar,
  161. getShowSettingButton,
  162. getShowSetting,
  163. getShowSearch,
  164. getIsTopLeft,
  165. };
  166. },
  167. });
  168. </script>
  169. <style lang="less">
  170. @import url('./index.less');
  171. .menu-name {
  172. font-size: 18px;
  173. font-weight: normal;
  174. color: #0d2f4f;
  175. line-height: 21px;
  176. }
  177. </style>