index.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <div ref="pageShellRef" class="page-shell">
  3. <Header
  4. v-if="showDesktopHeader && !isFullScreen"
  5. :is-logged-in="Boolean(WEBSID)"
  6. :user-avatar="userInfo?.completeImgUrl ?? defaultAvatar"
  7. @login="openLoginDialog"
  8. />
  9. <div class="page-main">
  10. <router-view></router-view>
  11. </div>
  12. </div>
  13. <Login
  14. v-if="loginVisable && route.name !== 'login'"
  15. @save-user="(data) => saveUserInfo(data)"
  16. />
  17. </template>
  18. <script setup>
  19. import { computed, nextTick, onBeforeMount, ref, watch } from "vue";
  20. import Header from "@/components/pcHeader.vue";
  21. import Login from "@/components/login.vue";
  22. import globalStore from "@/store/modules/global";
  23. import { useRoute, useRouter } from "vue-router";
  24. import { getMenuPromission } from "@/api/login";
  25. import { IsPC } from "@/utils/common";
  26. import { ensureMcpToken } from "@/utils/mcpToken";
  27. const isPC = IsPC();
  28. const route = useRoute();
  29. const router = useRouter();
  30. const global = globalStore();
  31. const pageShellRef = ref(null);
  32. const WEBSID = computed(() => global.WEBSID);
  33. const loginVisable = computed(() => global.loginVisable);
  34. const defaultAvatar =
  35. "https://cdntest.eiacloud.com/ai/approval/icons/avatar.png";
  36. const userInfo = computed(() => global.userInfo);
  37. const isFullScreen = computed(() => Boolean(route.meta?.fullScreen));
  38. const showDesktopHeader = computed(() => isPC);
  39. const scrollPageToTop = () => {
  40. nextTick(() => {
  41. if (pageShellRef.value) {
  42. pageShellRef.value.scrollTop = 0;
  43. }
  44. window.scrollTo(0, 0);
  45. document.documentElement.scrollTop = 0;
  46. document.body.scrollTop = 0;
  47. });
  48. };
  49. watch(
  50. () => route.fullPath,
  51. () => {
  52. scrollPageToTop();
  53. },
  54. );
  55. const openLoginDialog = () => {
  56. if (route.name === "login") return;
  57. router.push({
  58. name: "login",
  59. query: { redirect: route.fullPath || "/" },
  60. });
  61. };
  62. const saveUserInfo = async (userInfo) => {
  63. global.setUserInfo(userInfo.data);
  64. global.setWebsid(userInfo?.extraMap?.WEBSID ?? "");
  65. global.setUserId(userInfo?.data?.id ?? "");
  66. global.setYundian(userInfo?.ydCount);
  67. const res = await getMenuPromission();
  68. globalStore().promission = res?.data ?? [];
  69. await ensureMcpToken();
  70. };
  71. onBeforeMount(async () => {
  72. const res = await getMenuPromission();
  73. globalStore().promission = res?.data ?? [];
  74. });
  75. </script>
  76. <style scoped lang="less">
  77. .page-shell {
  78. display: flex;
  79. flex-direction: column;
  80. height: 100%;
  81. min-height: 0;
  82. overflow-y: auto;
  83. }
  84. .page-main {
  85. flex: 0 0 auto;
  86. min-height: 0;
  87. background-color: transparent;
  88. }
  89. </style>