App.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <n-config-provider :theme-overrides="themeOverrides">
  3. <n-dialog-provider>
  4. <router-view></router-view>
  5. <HomeModal
  6. :show="showModal"
  7. :content="modalContent"
  8. ></HomeModal>
  9. </n-dialog-provider>
  10. </n-config-provider>
  11. </template>
  12. <script lang="ts">
  13. export default {
  14. name: 'MainApp',
  15. };
  16. </script>
  17. <script lang="ts" setup>
  18. import { isMobile } from 'billd-utils';
  19. import { GlobalThemeOverrides, NConfigProvider } from 'naive-ui';
  20. import { onMounted, ref, watch } from 'vue';
  21. import { useRoute } from 'vue-router';
  22. import { fetchSettingsList } from '@/api/settings';
  23. import { THEME_COLOR, appBuildInfo } from '@/constant';
  24. import { useCheckUpdate } from '@/hooks/use-common';
  25. import { loginMessage } from '@/hooks/use-login';
  26. import { useCacheStore } from '@/store/cache';
  27. import { useUserStore } from '@/store/user';
  28. import { getHostnameUrl } from '@/utils';
  29. import { getLastBuildDate, setLastBuildDate } from '@/utils/localStorage/app';
  30. import { getToken } from '@/utils/localStorage/user';
  31. import { fetchAreaList } from './api/area';
  32. import { fetchGlobalMsgMyList } from './api/globalMsg';
  33. import { useTip } from './hooks/use-tip';
  34. import { useAppStore } from './store/app';
  35. import { initAdsbygoogle } from './utils/google-ad';
  36. const { checkUpdate } = useCheckUpdate();
  37. const appStore = useAppStore();
  38. const cacheStore = useCacheStore();
  39. const userStore = useUserStore();
  40. const route = useRoute();
  41. const showModal = ref(false);
  42. const modalContent = ref('');
  43. const themeOverrides: GlobalThemeOverrides = {
  44. common: {
  45. primaryColor: THEME_COLOR,
  46. primaryColorHover: THEME_COLOR,
  47. },
  48. };
  49. watch(
  50. () => userStore.userInfo,
  51. (newval) => {
  52. if (newval) {
  53. handleGlobalMsgMyList();
  54. }
  55. },
  56. {
  57. immediate: true,
  58. }
  59. );
  60. onMounted(() => {
  61. initAdsbygoogle();
  62. initGlobalData();
  63. checkUpdate({
  64. htmlUrl: getHostnameUrl(),
  65. });
  66. handleUpdate();
  67. loginMessage();
  68. cacheStore.muted = true;
  69. cacheStore.volume = 0;
  70. const token = getToken();
  71. if (token) {
  72. userStore.getUserInfo();
  73. }
  74. // 启用vconsole
  75. // import('vconsole')
  76. // .then((VConsole) => {
  77. // // eslint-disable-next-line
  78. // new VConsole.default();
  79. // })
  80. // .catch(() => {});
  81. if (isMobile()) {
  82. const metaEl = document.querySelector('meta[name="viewport"]');
  83. metaEl?.setAttribute(
  84. 'content',
  85. 'width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no'
  86. );
  87. }
  88. });
  89. async function handleGlobalMsgMyList() {
  90. const res = await fetchGlobalMsgMyList({});
  91. if (res.code === 200) {
  92. const data = res.data.rows[0];
  93. if (data) {
  94. useTip({
  95. content: data.content!,
  96. hiddenCancel: true,
  97. hiddenClose: true,
  98. });
  99. }
  100. }
  101. }
  102. function initSettings() {
  103. setTimeout(async () => {
  104. if (route.path !== '/') {
  105. return;
  106. }
  107. const res = await fetchSettingsList({});
  108. if (res.code === 200) {
  109. const allowHomeModal = res.data.rows.find(
  110. (v) => v.key === 'allow_home_modal'
  111. );
  112. const homeModalContent = res.data.rows.find(
  113. (v) => v.key === 'home_modal_content'
  114. );
  115. if (allowHomeModal?.value === '1' && homeModalContent?.value) {
  116. showModal.value = true;
  117. modalContent.value = homeModalContent.value;
  118. }
  119. }
  120. }, 500);
  121. }
  122. async function getAreaList() {
  123. const res = await fetchAreaList({ orderName: 'priority', orderBy: 'desc' });
  124. if (res.code === 200) {
  125. appStore.areaList = res.data.rows;
  126. }
  127. }
  128. function initGlobalData() {
  129. getAreaList();
  130. initSettings();
  131. }
  132. function handleUpdate() {
  133. const old = getLastBuildDate();
  134. if (appBuildInfo.lastBuildDate !== old) {
  135. localStorage.clear();
  136. }
  137. setLastBuildDate(appBuildInfo.lastBuildDate);
  138. }
  139. </script>
  140. <style lang="scss">
  141. body {
  142. font-size: 16px;
  143. // naive的message会影响全局line-height
  144. line-height: initial;
  145. }
  146. </style>
  147. <style lang="scss" scoped></style>