App.tsx 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import { computed, defineComponent, onMounted, ref, onUnmounted } from 'vue';
  2. import { NConfigProvider, zhCN, dateZhCN, NModal } from 'naive-ui';
  3. import { AppProvider } from './components/Application';
  4. import { RouterView, useRouter } 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. export function unregister() {
  11. if ('serviceWorker' in navigator) {
  12. // console.log('unregister - pwa');
  13. // navigator.serviceWorker.ready.then(registration => {
  14. // registration.unregister();
  15. // });
  16. // navigator.serviceWorker
  17. // .getRegistrations()
  18. // .then(registrations => {
  19. // for (const registration of registrations) {
  20. // registration.unregister().then(boolean => {
  21. // if (boolean) {
  22. // console.log('Service Worker unregistered successfully');
  23. // } else {
  24. // console.log('Service Worker unregistration failed');
  25. // }
  26. // });
  27. // }
  28. // })
  29. // .catch(error => {
  30. // console.error('Error getting Service Worker registrations:', error);
  31. // });
  32. } else {
  33. console.log('Service Workers are not supported in this browser');
  34. }
  35. }
  36. export default defineComponent({
  37. name: 'App',
  38. setup() {
  39. const isIOSChrome = ref();
  40. const getThemeOverrides = computed(() => {
  41. const appTheme = setting.appTheme;
  42. const lightenStr = lighten(setting.appTheme, 6);
  43. // errorColor: string;
  44. // errorColorHover: string;
  45. // errorColorPressed: string;
  46. // errorColorSuppl: string;
  47. return {
  48. common: {
  49. primaryColor: appTheme,
  50. primaryColorHover: lightenStr,
  51. primaryColorPressed: lightenStr,
  52. errorColor: '#F51C08',
  53. errorColorHover: '#F51C08',
  54. errorColorPressed: '#F51C08'
  55. },
  56. LoadingBar: {
  57. colorLoading: appTheme
  58. }
  59. };
  60. });
  61. // const showModal = ref(false);
  62. const showModalMsg = ref('');
  63. // 判断浏览器
  64. // 是否是360
  65. const check360 = () => {
  66. const result = false;
  67. for (const key in navigator.plugins) {
  68. // np-mswmp.dll只在360浏览器下存在
  69. if (navigator.plugins[key].filename == 'internal-nacl-plugin') {
  70. return !result;
  71. }
  72. }
  73. return result;
  74. };
  75. //
  76. const isChrome = () => {
  77. const isChromium = window.chrome,
  78. winNav = window.navigator,
  79. vendorName = winNav.vendor,
  80. isOpera = winNav.userAgent.indexOf('OPR') > -1,
  81. isIEedge = winNav.userAgent.indexOf('Edge') > -1,
  82. isIOSChrome = winNav.userAgent.match('CriOS'),
  83. // QQ
  84. isQQBriwser =
  85. winNav.userAgent.indexOf('QQBrowser') > -1 ||
  86. winNav.userAgent.indexOf('QQ') > -1,
  87. // 搜狗
  88. isSouggou =
  89. winNav.userAgent.indexOf('se 2.x') > -1 ||
  90. winNav.userAgent.indexOf('MetaSr') > -1,
  91. // 360
  92. is360 = check360() && winNav.userAgent.indexOf('Safari') > -1,
  93. // 遨游
  94. isMaxthon = winNav.userAgent.indexOf('Maxthon') > -1,
  95. // 是否为2345浏览器
  96. is2345Explorer = winNav.userAgent.includes('2345Explorer'),
  97. // 世界之窗
  98. isTheWorld = winNav.userAgent.indexOf('TheWorld') > -1,
  99. // 猎豹
  100. isLiebao = winNav.userAgent.indexOf('LBBROWSER') > -1;
  101. // console.log(isQQBriwser, isSouggou, is360, isMaxthon, is2345Explorer, isTheWorld, isLiebao)
  102. if (isIOSChrome) {
  103. return true;
  104. } else if (
  105. isChromium !== null &&
  106. typeof isChromium !== 'undefined' &&
  107. vendorName === 'Google Inc.' &&
  108. isOpera === false &&
  109. isIEedge === false &&
  110. isQQBriwser === false &&
  111. isSouggou === false &&
  112. is360 === false &&
  113. isMaxthon === false &&
  114. is2345Explorer === false &&
  115. isTheWorld === false &&
  116. isLiebao === false
  117. ) {
  118. return true;
  119. } else {
  120. return false;
  121. }
  122. };
  123. // 获取谷歌版本
  124. const getChromeVersion = () => {
  125. const arr = navigator.userAgent.split(' ');
  126. let chromeVersion = '' as any;
  127. for (let i = 0; i < arr.length; i++) {
  128. if (/chrome/i.test(arr[i])) chromeVersion = arr[i];
  129. }
  130. if (chromeVersion) {
  131. return Number(chromeVersion.split('/')[1].split('.')[0]);
  132. } else {
  133. return false;
  134. }
  135. };
  136. const isChromeFlag = isChrome();
  137. // console.log('isChromeFlag', isChromeFlag);
  138. if (isChromeFlag) {
  139. const chromeVersion = getChromeVersion();
  140. if (!chromeVersion || (chromeVersion && chromeVersion < 100)) {
  141. showModalMsg.value =
  142. '您当前的chrome版本过低,为了保证您的用户体验请升级后使用';
  143. // showModal.value = true;
  144. }
  145. // if (chromeVersion) {
  146. // return Number(chromeVersion.split('/')[1].split('.')[0]);
  147. // } else {
  148. // return false;
  149. // }
  150. } else {
  151. showModalMsg.value = '为了保证您的用户体验,请使用chrome打开,点击确定下载';
  152. // showModal.value = true;
  153. console.log('---');
  154. }
  155. const submitCallback = () => {
  156. window.open('https://www.google.cn/intl/zh-CN/chrome/');
  157. };
  158. const handleOpen = (e: MessageEvent) => {
  159. if (e.data?.api === 'onLogin') {
  160. const userStore = useUserStore();
  161. const router = useRouter();
  162. const documentDom: any = document;
  163. documentDom.exitFullscreen
  164. ? documentDom.exitFullscreen()
  165. : documentDom.mozCancelFullScreen
  166. ? documentDom.mozCancelFullScreen()
  167. : documentDom.webkitExitFullscreen
  168. ? documentDom.webkitExitFullscreen()
  169. : '';
  170. userStore.logout();
  171. history.go(0);
  172. }
  173. };
  174. onMounted(() => {
  175. window.addEventListener('message', handleOpen);
  176. // 禁用右键菜单
  177. document.addEventListener('contextmenu', function (event) {
  178. event.preventDefault();
  179. });
  180. // 禁用浏览器快捷键
  181. document.addEventListener('keydown', function (event) {
  182. // 屏蔽 F12 和 Ctrl+Shift+I
  183. if (
  184. event.key === 'F12' ||
  185. (event.ctrlKey && event.shiftKey && event.key === 'I') ||
  186. (event.metaKey && event.altKey && event.key === 'I')
  187. ) {
  188. event.preventDefault();
  189. }
  190. });
  191. // const intervalMS = 60 * 60 * 1000;
  192. // console.log(useRegisterSW, '1');
  193. const updateServiceWorker = useRegisterSW({
  194. onRegistered(r: any) {
  195. console.log(r, 'registered');
  196. r &&
  197. setInterval(() => {
  198. // console.log('registered interval:', r);
  199. r.update();
  200. }, 30000);
  201. }
  202. });
  203. // console.log('app - onounted - test interval');
  204. if ('serviceWorker' in navigator) {
  205. navigator.serviceWorker.getRegistrations().then(registrations => {
  206. for (const registration of registrations) {
  207. if (registration.scope.startsWith(`https://${location.host}/`)) {
  208. registration.unregister().then(() => {
  209. console.log(
  210. `Service Worker unregistered for https://${location.host}/`
  211. );
  212. });
  213. }
  214. }
  215. });
  216. }
  217. });
  218. onUnmounted(() => {
  219. window.removeEventListener('message', handleOpen);
  220. });
  221. // 卸载 pwa
  222. unregister();
  223. return () => (
  224. <>
  225. <NConfigProvider
  226. locale={zhCN}
  227. themeOverrides={getThemeOverrides.value}
  228. // :theme="getDarkTheme"
  229. // :theme-overrides="getThemeOverrides"
  230. dateLocale={dateZhCN}>
  231. <AppProvider>
  232. <RouterView />
  233. <RouterError />
  234. </AppProvider>
  235. </NConfigProvider>
  236. {/* <NModal
  237. show={showModal.value}
  238. closeOnEsc={false}
  239. closable={false}
  240. maskClosable={false}
  241. preset="dialog"
  242. title="确认"
  243. content={showModalMsg.value}
  244. positive-text="确认"
  245. onPositiveClick={submitCallback}></NModal> */}
  246. </>
  247. );
  248. }
  249. });