App.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { computed, defineComponent, onMounted, onUnmounted } from 'vue';
  2. import { NConfigProvider, zhCN, dateZhCN, NModal } from 'naive-ui';
  3. import { AppProvider } from './components/Application';
  4. import { RouterView } from 'vue-router';
  5. import setting from './settings/designSetting';
  6. import { lighten } from './utils';
  7. // import RouterError from './components/RouterError';
  8. import { useRegisterSW } from 'virtual:pwa-register/vue';
  9. import { useUserStore } from './store/modules/users';
  10. import UpdateTips from './update-tips';
  11. export default defineComponent({
  12. name: 'App',
  13. setup() {
  14. // const { needRefresh, offlineReady, updateServiceWorker } = useRegisterSW({
  15. // onRegistered(r: any) {
  16. // console.log(r, 'registered');
  17. // // if (r) {
  18. // // setInterval(() => {
  19. // // r.update(); // 手动触发更新检查
  20. // // }, 30000); // 每 30 秒检查一次
  21. // // }
  22. // },
  23. // onNeedRefresh() {
  24. // console.log('新版本可用!');
  25. // alert('新版本可用!');
  26. // },
  27. // onOfflineReady() {
  28. // console.log('离线功能就绪。');
  29. // }
  30. // });
  31. const { needRefresh, updateServiceWorker } = useRegisterSW({
  32. onRegistered(r) {
  33. console.log(r, 'Service Worker 已注册');
  34. // 你可以在这里使用定时器手动检查更新
  35. if (r) {
  36. setInterval(() => {
  37. r.update(); // 每 30 秒检查一次更新
  38. }, 30000);
  39. }
  40. },
  41. onNeedRefresh() {
  42. console.log('onNeedRefresh 事件触发');
  43. console.log('needRefresh 状态:', needRefresh); // 确认 needRefresh 是否为 true
  44. },
  45. onOfflineReady() {
  46. console.log('离线功能已就绪');
  47. }
  48. });
  49. // const isIOSChrome = ref();
  50. // const showModalMask = ref(false);
  51. const getThemeOverrides = computed(() => {
  52. const appTheme = setting.appTheme;
  53. const lightenStr = lighten(setting.appTheme, 6);
  54. return {
  55. common: {
  56. primaryColor: appTheme,
  57. primaryColorHover: lightenStr,
  58. primaryColorPressed: lightenStr,
  59. errorColor: '#F51C08',
  60. errorColorHover: '#F51C08',
  61. errorColorPressed: '#F51C08'
  62. },
  63. LoadingBar: {
  64. colorLoading: appTheme
  65. }
  66. };
  67. });
  68. const handleOpen = (e: MessageEvent) => {
  69. if (e.data?.api === 'onLogin') {
  70. const userStore = useUserStore();
  71. // const router = useRouter();
  72. const documentDom: any = document;
  73. documentDom.exitFullscreen
  74. ? documentDom.exitFullscreen()
  75. : documentDom.mozCancelFullScreen
  76. ? documentDom.mozCancelFullScreen()
  77. : documentDom.webkitExitFullscreen
  78. ? documentDom.webkitExitFullscreen()
  79. : '';
  80. userStore.logout();
  81. history.go(0);
  82. }
  83. };
  84. onMounted(() => {
  85. window.addEventListener('message', handleOpen);
  86. // window.addEventListener('resize', resize);
  87. // 禁用右键菜单
  88. document.addEventListener('contextmenu', function (event) {
  89. event.preventDefault();
  90. });
  91. // 禁用浏览器快捷键
  92. document.addEventListener('keydown', function (event) {
  93. // 屏蔽 F12 和 Ctrl+Shift+I
  94. if (
  95. event.key === 'F12' ||
  96. (event.ctrlKey && event.shiftKey && event.key === 'I') ||
  97. (event.metaKey && event.altKey && event.key === 'I')
  98. ) {
  99. event.preventDefault();
  100. }
  101. });
  102. });
  103. onUnmounted(() => {
  104. // window.removeEventListener('resize', resize);
  105. window.removeEventListener('message', handleOpen);
  106. });
  107. return () => (
  108. <div>
  109. <NConfigProvider
  110. locale={zhCN}
  111. themeOverrides={getThemeOverrides.value}
  112. // :theme="getDarkTheme"
  113. // :theme-overrides="getThemeOverrides"
  114. dateLocale={dateZhCN}>
  115. <AppProvider>
  116. <RouterView />
  117. {/* <RouterError /> */}
  118. </AppProvider>
  119. </NConfigProvider>
  120. <NModal maskClosable={false} v-model:show={needRefresh.value}>
  121. <UpdateTips
  122. onConfirm={() => {
  123. needRefresh.value = false;
  124. updateServiceWorker(true)
  125. .then(() => {
  126. console.log('Service Worker updated');
  127. // 添加手动触发skipWaiting的逻辑
  128. if (navigator.serviceWorker.controller) {
  129. navigator.serviceWorker.controller.postMessage({
  130. type: 'SKIP_WAITING'
  131. });
  132. }
  133. setTimeout(() => {
  134. window.location.reload();
  135. }, 17);
  136. })
  137. .catch((err: any) => {
  138. console.error('Update failed:', err);
  139. });
  140. }}
  141. />
  142. </NModal>
  143. {/* <NModal
  144. show={showModal.value}
  145. closeOnEsc={false}
  146. closable={false}
  147. maskClosable={false}
  148. preset="dialog"
  149. title="确认"
  150. content={showModalMsg.value}
  151. positive-text="确认"
  152. onPositiveClick={submitCallback}></NModal> */}
  153. </div>
  154. );
  155. }
  156. });