App.tsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. return {
  44. common: {
  45. primaryColor: appTheme,
  46. primaryColorHover: lightenStr,
  47. primaryColorPressed: lightenStr
  48. },
  49. LoadingBar: {
  50. colorLoading: appTheme
  51. }
  52. };
  53. });
  54. // const showModal = ref(false);
  55. const showModalMsg = ref('');
  56. // 判断浏览器
  57. // 是否是360
  58. const check360 = () => {
  59. const result = false;
  60. for (const key in navigator.plugins) {
  61. // np-mswmp.dll只在360浏览器下存在
  62. if (navigator.plugins[key].filename == 'internal-nacl-plugin') {
  63. return !result;
  64. }
  65. }
  66. return result;
  67. };
  68. //
  69. const isChrome = () => {
  70. const isChromium = window.chrome,
  71. winNav = window.navigator,
  72. vendorName = winNav.vendor,
  73. isOpera = winNav.userAgent.indexOf('OPR') > -1,
  74. isIEedge = winNav.userAgent.indexOf('Edge') > -1,
  75. isIOSChrome = winNav.userAgent.match('CriOS'),
  76. // QQ
  77. isQQBriwser =
  78. winNav.userAgent.indexOf('QQBrowser') > -1 ||
  79. winNav.userAgent.indexOf('QQ') > -1,
  80. // 搜狗
  81. isSouggou =
  82. winNav.userAgent.indexOf('se 2.x') > -1 ||
  83. winNav.userAgent.indexOf('MetaSr') > -1,
  84. // 360
  85. is360 = check360() && winNav.userAgent.indexOf('Safari') > -1,
  86. // 遨游
  87. isMaxthon = winNav.userAgent.indexOf('Maxthon') > -1,
  88. // 是否为2345浏览器
  89. is2345Explorer = winNav.userAgent.includes('2345Explorer'),
  90. // 世界之窗
  91. isTheWorld = winNav.userAgent.indexOf('TheWorld') > -1,
  92. // 猎豹
  93. isLiebao = winNav.userAgent.indexOf('LBBROWSER') > -1;
  94. // console.log(isQQBriwser, isSouggou, is360, isMaxthon, is2345Explorer, isTheWorld, isLiebao)
  95. if (isIOSChrome) {
  96. return true;
  97. } else if (
  98. isChromium !== null &&
  99. typeof isChromium !== 'undefined' &&
  100. vendorName === 'Google Inc.' &&
  101. isOpera === false &&
  102. isIEedge === false &&
  103. isQQBriwser === false &&
  104. isSouggou === false &&
  105. is360 === false &&
  106. isMaxthon === false &&
  107. is2345Explorer === false &&
  108. isTheWorld === false &&
  109. isLiebao === false
  110. ) {
  111. return true;
  112. } else {
  113. return false;
  114. }
  115. };
  116. // 获取谷歌版本
  117. const getChromeVersion = () => {
  118. const arr = navigator.userAgent.split(' ');
  119. let chromeVersion = '' as any;
  120. for (let i = 0; i < arr.length; i++) {
  121. if (/chrome/i.test(arr[i])) chromeVersion = arr[i];
  122. }
  123. if (chromeVersion) {
  124. return Number(chromeVersion.split('/')[1].split('.')[0]);
  125. } else {
  126. return false;
  127. }
  128. };
  129. const isChromeFlag = isChrome();
  130. // console.log('isChromeFlag', isChromeFlag);
  131. if (isChromeFlag) {
  132. const chromeVersion = getChromeVersion();
  133. if (!chromeVersion || (chromeVersion && chromeVersion < 100)) {
  134. showModalMsg.value =
  135. '您当前的chrome版本过低,为了保证您的用户体验请升级后使用';
  136. // showModal.value = true;
  137. }
  138. // if (chromeVersion) {
  139. // return Number(chromeVersion.split('/')[1].split('.')[0]);
  140. // } else {
  141. // return false;
  142. // }
  143. } else {
  144. showModalMsg.value = '为了保证您的用户体验,请使用chrome打开,点击确定下载';
  145. // showModal.value = true;
  146. console.log('---');
  147. }
  148. const submitCallback = () => {
  149. window.open('https://www.google.cn/intl/zh-CN/chrome/');
  150. };
  151. const handleOpen = (e: MessageEvent) => {
  152. if (e.data?.api === 'onLogin') {
  153. const userStore = useUserStore();
  154. const router = useRouter();
  155. const documentDom: any = document;
  156. documentDom.exitFullscreen
  157. ? documentDom.exitFullscreen()
  158. : documentDom.mozCancelFullScreen
  159. ? documentDom.mozCancelFullScreen()
  160. : documentDom.webkitExitFullscreen
  161. ? documentDom.webkitExitFullscreen()
  162. : '';
  163. userStore.logout();
  164. history.go(0);
  165. }
  166. };
  167. onMounted(() => {
  168. window.addEventListener('message', handleOpen);
  169. // 禁用右键菜单
  170. document.addEventListener('contextmenu', function (event) {
  171. event.preventDefault();
  172. });
  173. // 禁用浏览器快捷键
  174. document.addEventListener('keydown', function (event) {
  175. // 屏蔽 F12 和 Ctrl+Shift+I
  176. if (
  177. event.key === 'F12' ||
  178. (event.ctrlKey && event.shiftKey && event.key === 'I') ||
  179. (event.metaKey && event.altKey && event.key === 'I')
  180. ) {
  181. event.preventDefault();
  182. }
  183. });
  184. // const intervalMS = 60 * 60 * 1000;
  185. // console.log(useRegisterSW, '1');
  186. // const updateServiceWorker =
  187. // useRegisterSW({
  188. // onRegistered(r: any) {
  189. // console.log(r, 'registered');
  190. // r &&
  191. // setInterval(() => {
  192. // console.log('registered interval:', r);
  193. // r.update();
  194. // }, 30000);
  195. // }
  196. // });
  197. });
  198. onUnmounted(() => {
  199. window.removeEventListener('message', handleOpen);
  200. });
  201. // 卸载 pwa
  202. unregister();
  203. return () => (
  204. <>
  205. <NConfigProvider
  206. locale={zhCN}
  207. themeOverrides={getThemeOverrides.value}
  208. // :theme="getDarkTheme"
  209. // :theme-overrides="getThemeOverrides"
  210. dateLocale={dateZhCN}>
  211. <AppProvider>
  212. <RouterView />
  213. <RouterError />
  214. </AppProvider>
  215. </NConfigProvider>
  216. {/* <NModal
  217. show={showModal.value}
  218. closeOnEsc={false}
  219. closable={false}
  220. maskClosable={false}
  221. preset="dialog"
  222. title="确认"
  223. content={showModalMsg.value}
  224. positive-text="确认"
  225. onPositiveClick={submitCallback}></NModal> */}
  226. </>
  227. );
  228. }
  229. });