main.vue 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <el-main class="layout-main"
  3. :style="isFixedHeader ? `height: calc(100% - ${setMainHeight})` : `minHeight: calc(100% - ${setMainHeight})`">
  4. <el-scrollbar ref="layoutMainScrollbarRef" class="layout-main-scroll layout-backtop-header-fixed"
  5. wrap-class="layout-main-scroll" view-class="layout-main-scroll">
  6. <LayoutParentView />
  7. <LayoutFooter v-if="isFooter" />
  8. </el-scrollbar>
  9. <el-backtop :target="setBacktopClass" />
  10. </el-main>
  11. </template>
  12. <script setup lang="ts" name="layoutMain">
  13. import { defineAsyncComponent, onMounted, computed, ref, nextTick } from 'vue';
  14. import { useRoute } from 'vue-router';
  15. import { storeToRefs } from 'pinia';
  16. import { useTagsViewRoutes } from '@/stores/tagsViewRoutes';
  17. import { useThemeConfig } from '@/stores/themeConfig';
  18. import { useUserInfo } from '@/stores/userInfo';
  19. import { NextLoading } from '@/utils/loading';
  20. import mittBus from '@/utils/mitt';
  21. import signalR from '@/utils/signalR';
  22. // 引入组件
  23. const LayoutParentView = defineAsyncComponent(() => import('@/layout/routerView/parent.vue'));
  24. const LayoutFooter = defineAsyncComponent(() => import('@/layout/footer/index.vue'));
  25. // 定义变量内容
  26. const layoutMainScrollbarRef = ref<RefType>();
  27. const route = useRoute();
  28. const storesTagsViewRoutes = useTagsViewRoutes();
  29. const storesThemeConfig = useThemeConfig();
  30. const { themeConfig } = storeToRefs(storesThemeConfig);
  31. const { isTagsViewCurrenFull } = storeToRefs(storesTagsViewRoutes);
  32. const storesUserInfo = useUserInfo();
  33. const { userInfos } = storeToRefs(storesUserInfo);
  34. // 设置 footer 显示/隐藏
  35. const isFooter = computed(() => {
  36. return themeConfig.value.isFooter && !route.meta.isIframe;
  37. });
  38. // 设置 header 固定
  39. const isFixedHeader = computed(() => {
  40. return themeConfig.value.isFixedHeader;
  41. });
  42. // 设置主内容区的高度
  43. const setMainHeight = computed(() => {
  44. if (isTagsViewCurrenFull.value) return '0px';
  45. const { isTagsview, layout } = themeConfig.value;
  46. const { showTelControl } = userInfos.value;
  47. if (isTagsview && layout !== 'classic' && showTelControl) {
  48. return '85px';
  49. } else if (isTagsview && layout !== 'classic' && !showTelControl) {
  50. return '85px';
  51. } else {
  52. return '51px';
  53. }
  54. });
  55. // 设置 Backtop 回到顶部
  56. const setBacktopClass = computed(() => {
  57. if (themeConfig.value.isFixedHeader) return `.layout-backtop-header-fixed .el-scrollbar__wrap`;
  58. else return `.layout-backtop .el-scrollbar__wrap`;
  59. });
  60. // 页面加载前
  61. onMounted( async () => {
  62. NextLoading.done(600);
  63. // 监听页面需要滚动事件
  64. mittBus.on('scrollTopEmit', (res: any) => {
  65. layoutMainScrollbarRef.value?.scrollTo(res.top ? res.top : 0, res.left ? res.left : 0)// 滚动到一组特定坐标(x,y)
  66. });
  67. await nextTick();
  68. await signalR.joinGroup('CallCenter'); // 加入分组
  69. });
  70. // 暴露变量
  71. defineExpose({
  72. layoutMainScrollbarRef,
  73. });
  74. </script>