main.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. import { createApp } from 'vue';
  2. import App from './App.vue';
  3. import router from './router';
  4. import store from './store';
  5. import Vant from 'vant';
  6. import { ConfigProvider } from 'vant';
  7. import 'vant/lib/index.css';
  8. import './styles/app.less';
  9. import './styles/font.less';
  10. import './styles/theme.less';
  11. import http from './plugins/http';
  12. import colors from './plugins/colors';
  13. // import ElementUI from 'element-ui';
  14. // import 'element-ui/lib/theme-chalk/index.css';
  15. import PageTitle from './components/PageTitle';
  16. import LikeButton from './components/LikeButton.vue';
  17. import Driver from './components/Driver.vue';
  18. import common from './mixins/common';
  19. import VueClipboard from 'vue-clipboard2';
  20. import queryString from 'query-string';
  21. import PageBar from './components/PageBar';
  22. import eruda from 'eruda';
  23. import mitt from 'mitt';
  24. import dayjs from 'dayjs';
  25. import relativeTime from 'dayjs/plugin/relativeTime';
  26. import calendar from 'dayjs/plugin/calendar';
  27. import duration from 'dayjs/plugin/duration';
  28. import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
  29. import customParseFormat from 'dayjs/plugin/customParseFormat';
  30. import { Toast, Dialog } from 'vant';
  31. import smoothscroll from 'smoothscroll-polyfill';
  32. import { useCssVar } from '@vueuse/core';
  33. import { watch, watchEffect, computed } from 'vue';
  34. smoothscroll.polyfill();
  35. const appHeight = useCssVar('--app-height', document.documentElement);
  36. const onWindowResize = () => {
  37. if (navigator.userAgent.includes('#cordova#')) {
  38. appHeight.value = `${window.screen.height}px`;
  39. } else {
  40. appHeight.value = `${window.innerHeight}px`;
  41. }
  42. };
  43. window.addEventListener('resize', onWindowResize);
  44. onWindowResize();
  45. setTimeout(() => {
  46. onWindowResize();
  47. }, 100);
  48. Toast.setDefaultOptions('loading', { duration: 0 });
  49. require('dayjs/locale/zh-cn');
  50. const emitter = mitt();
  51. dayjs.locale('zh-cn');
  52. dayjs.extend(relativeTime);
  53. dayjs.extend(calendar);
  54. dayjs.extend(duration);
  55. dayjs.extend(isSameOrBefore);
  56. dayjs.extend(customParseFormat);
  57. let showConsole = localStorage.getItem('showConsole');
  58. if (showConsole && parseInt(showConsole) > new Date().getTime()) {
  59. eruda.init();
  60. store.commit('setShowConsole', true);
  61. }
  62. store.commit('setFirstUrl', location.href);
  63. import ImgContent from './components/ImgContent.vue';
  64. import PullRefresh from './components/PullRefresh.vue';
  65. import { setTimeout } from 'core-js';
  66. const safeTop = useCssVar('--safe-top', document.documentElement);
  67. const safeBottom = useCssVar('--safe-bottom', document.documentElement);
  68. const safeLeft = useCssVar('--safe-left', document.documentElement);
  69. const safeRight = useCssVar('--safe-right', document.documentElement);
  70. const calcSafeArea = () => {
  71. safeTop.value = getComputedStyle(document.documentElement).getPropertyValue('--sat').replaceAll(' ', '');
  72. safeBottom.value = getComputedStyle(document.documentElement).getPropertyValue('--sab').replaceAll(' ', '');
  73. safeLeft.value = getComputedStyle(document.documentElement).getPropertyValue('--sal').replaceAll(' ', '');
  74. safeRight.value = getComputedStyle(document.documentElement).getPropertyValue('--sar').replaceAll(' ', '');
  75. if (navigator.userAgent.includes('#testSafeTop#')) {
  76. safeTop.value = '30px';
  77. }
  78. };
  79. const barHeight = computed(() => Number((safeTop.value || '0').replace('px', '')) + 46);
  80. const app = createApp(App)
  81. .use(Vant)
  82. .use(http)
  83. .use(colors)
  84. // .use(ElementUI)
  85. .use(ConfigProvider)
  86. .use(VueClipboard)
  87. .mixin(common)
  88. .component('page-title', PageTitle)
  89. .component('like-button', LikeButton)
  90. .component('driver', Driver)
  91. .component('van-image', ImgContent)
  92. .component('van-pull-refresh', PullRefresh)
  93. .component('page-bar', PageBar)
  94. .use(store)
  95. .use(router)
  96. .provide('appHeight', appHeight)
  97. .provide('safeTop', safeTop)
  98. .provide('safeBottom', safeBottom)
  99. .provide('safeLeft', safeLeft)
  100. .provide('safeRight', safeRight)
  101. .provide('barHeight', barHeight);
  102. app.config.unwrapInjectedRef = true;
  103. app.config.globalProperties.emitter = emitter;
  104. app.config.globalProperties.dayjs = dayjs;
  105. let query = queryString.parse(location.search);
  106. if (query.code) {
  107. http.http.post('/user/code2openId', { code: query.code }).then(res => {
  108. localStorage.setItem('openId', res);
  109. });
  110. } else {
  111. if (/micromessenger/i.test(navigator.userAgent) && !/localhost|(192\.168)/i.test(location.host)) {
  112. // document.location.replace(location.origin + '/wx/redirect?redirectUrl=' + location.href);
  113. }
  114. }
  115. store.dispatch('getTime');
  116. if (location.pathname === '/hall') {
  117. if (query.id) {
  118. store.commit('setShowRoomId', query.id);
  119. }
  120. }
  121. if (query.invitor) {
  122. store.commit('setInvitor', query.invitor);
  123. if (query.id) {
  124. store.commit('setProductId', query.id);
  125. }
  126. if (query.inviteType) {
  127. store.commit('setInviteType', query.inviteType);
  128. }
  129. }
  130. if (query.from) {
  131. store.commit('setFrom', query.from);
  132. }
  133. store.commit('setFrom', 'scanCode');
  134. if (query.inviteCode) {
  135. store.commit('setInviteCode', query.inviteCode);
  136. }
  137. console.log('review', query.review === 'true' || query.review === true);
  138. if (query.review === 'true' || query.review === true || sessionStorage.getItem('review')) {
  139. store.commit('setReview', true);
  140. sessionStorage.setItem('review', true);
  141. }
  142. if (query.starPage === 'true' || query.starPage === true || sessionStorage.getItem('starPage')) {
  143. store.commit('setStarPage', true);
  144. sessionStorage.setItem('starPage', true);
  145. }
  146. if (query.reviewPay === 'true' || query.reviewPay === true || sessionStorage.getItem('reviewPay')) {
  147. store.commit('setReviewPay', true);
  148. sessionStorage.setItem('reviewPay', true);
  149. }
  150. if (query.hopeMarket === 'true' || query.hopeMarket === true || sessionStorage.getItem('hopeMarket')) {
  151. store.commit('setHopeMarket', true);
  152. sessionStorage.setItem('hopeMarket', true);
  153. }
  154. store.commit('setPlatform', /iPad|iPhone|iPod/i.test(navigator.userAgent) ? 'ios' : 'android');
  155. store.dispatch('getTheme');
  156. const loadSplash = (onload, onerror) =>
  157. new Promise((resolve, reject) => {
  158. let isHide = false;
  159. function hideSplash() {
  160. if (isHide) return;
  161. isHide = true;
  162. splash.style.opacity = 0;
  163. // setTimeout(() => {
  164. // document.body.removeChild(splash);
  165. // }, 800);
  166. resolve();
  167. }
  168. const splash = document.createElement('img');
  169. splash.className = 'splash-screen';
  170. splash.onload = () => {
  171. console.log('splash onload');
  172. onload && onload();
  173. setTimeout(() => {
  174. hideSplash();
  175. }, 0);
  176. };
  177. splash.onerror = () => {
  178. hideSplash();
  179. onerror && onerror();
  180. };
  181. setTimeout(() => {
  182. hideSplash();
  183. }, 0);
  184. // splash.src = 'https://cdn.raex.vip/splash.jpg';
  185. // document.body.append(splash);
  186. });
  187. if (navigator.userAgent.includes('#review#')) {
  188. store.commit('setReview', true);
  189. }
  190. if (navigator.userAgent.includes('#cordova#')) {
  191. if (window.cordova && window.cordova.platformId) {
  192. store.commit('setPlatform', window.cordova.platformId);
  193. }
  194. document.addEventListener(
  195. 'deviceready',
  196. function () {
  197. StatusBar.overlaysWebView(true);
  198. if ('1' === window.localStorage.getItem('AppTips')) {
  199. try {
  200. window.cordova.plugins.UmengPlugin.init(deviceToken => {
  201. console.log('deviceToken=' + deviceToken);
  202. });
  203. } catch (e) {}
  204. }
  205. function mountApp() {
  206. window.$vm = app.mount('#app');
  207. http.http
  208. .get('/appVersion/checkUpdate', {
  209. platform: window.cordova.platformId,
  210. version: navigator.appInfo.version
  211. })
  212. .then(res => {
  213. if (res.needUpdate) {
  214. window.$vm.$dialog.alert({
  215. message: '检测到新版本,请下载更新',
  216. confirmButtonText: '下载更新',
  217. beforeClose(action, done) {
  218. console.log(action);
  219. location.href = 'http://download.raex.vip';
  220. }
  221. });
  222. }
  223. });
  224. }
  225. // loadSplash(
  226. // () => {
  227. // setTimeout(() => {
  228. // navigator.splashscreen.hide();
  229. // }, 100);
  230. // mountApp();
  231. // },
  232. // () => {
  233. // navigator.splashscreen.hide();
  234. // mountApp();
  235. // }
  236. // ).then(res => {
  237. // StatusBar.styleDefault();
  238. // });
  239. setTimeout(() => {
  240. navigator.splashscreen.hide();
  241. }, 100);
  242. mountApp();
  243. // StatusBar.styleDefault();
  244. calcSafeArea();
  245. if ('android' === window.cordova.platformId) {
  246. window.AndroidNotch.getInsetTop(
  247. px => {
  248. console.log('getInsetTop=' + px);
  249. safeTop.value = px + 'px';
  250. },
  251. err => console.error('Failed to get insets top:', err)
  252. );
  253. window.AndroidNotch.getInsetRight(
  254. px => {
  255. safeRight.value = px + 'px';
  256. },
  257. err => console.error('Failed to get insets right:', err)
  258. );
  259. window.AndroidNotch.getInsetBottom(
  260. px => {
  261. safeBottom.value = px + 'px';
  262. },
  263. err => console.error('Failed to get insets bottom:', err)
  264. );
  265. window.AndroidNotch.getInsetLeft(
  266. px => {
  267. safeLeft.value = px + 'px';
  268. },
  269. err => console.error('Failed to get insets left:', err)
  270. );
  271. } else {
  272. calcSafeArea();
  273. setTimeout(() => {
  274. calcSafeArea();
  275. }, 500);
  276. }
  277. let t = 0;
  278. document.addEventListener(
  279. 'backbutton',
  280. e => {
  281. if (window.$vm.$route.matched.find(i => i.name === 'index')) {
  282. e.preventDefault();
  283. let t1 = new Date().getTime();
  284. console.log(t1 - t);
  285. if (t1 - t < 1000) {
  286. navigator.app.exitApp();
  287. } else {
  288. t = t1;
  289. window.$vm.$toast('再按一次退出');
  290. }
  291. } else {
  292. window.$vm.$router.go(-1);
  293. }
  294. },
  295. false
  296. );
  297. if ('ios' === window.cordova.platformId) {
  298. window.store.register(
  299. ['68', '108', '198', '288', '588', '998'].map(id => {
  300. return {
  301. id,
  302. alias: id,
  303. type: window.store.CONSUMABLE
  304. };
  305. })
  306. );
  307. window.store.error(function (error) {
  308. console.log('ERROR ' + error.code + ': ' + error.message);
  309. });
  310. ['68', '108', '198', '288', '588', '998'].forEach(id => {
  311. window.store
  312. .when(id)
  313. .updated(product => {
  314. emitter.emit('iapEvent', { event: 'updated', product });
  315. })
  316. .requested(product => {
  317. emitter.emit('iapEvent', { event: 'requested', product });
  318. })
  319. .initiated(product => {
  320. emitter.emit('iapEvent', { event: 'initiated', product });
  321. })
  322. .cancelled(product => {
  323. emitter.emit('iapEvent', { event: 'cancelled', product });
  324. })
  325. .approved(product => {
  326. product.finish();
  327. emitter.emit('iapEvent', { event: 'approved', product });
  328. })
  329. .verified(product => {
  330. emitter.emit('iapEvent', { event: 'verified', product });
  331. })
  332. .finished(product => {
  333. emitter.emit('iapEvent', { event: 'finished', product });
  334. });
  335. });
  336. window.store.refresh();
  337. }
  338. },
  339. false
  340. );
  341. } else {
  342. loadSplash().then(res => {
  343. window.$vm = app.mount('#app');
  344. calcSafeArea();
  345. });
  346. calcSafeArea();
  347. }