main.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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 http from './plugins/http';
  11. import colors from './plugins/colors';
  12. // import ElementUI from 'element-ui';
  13. // import 'element-ui/lib/theme-chalk/index.css';
  14. import PageTitle from './components/PageTitle';
  15. import LikeButton from './components/LikeButton.vue';
  16. import Driver from './components/Driver.vue';
  17. import common from './mixins/common';
  18. import VueClipboard from 'vue-clipboard2';
  19. import queryString from 'query-string';
  20. import PageBar from './components/PageBar';
  21. import eruda from 'eruda';
  22. import mitt from 'mitt';
  23. import dayjs from 'dayjs';
  24. import relativeTime from 'dayjs/plugin/relativeTime';
  25. import calendar from 'dayjs/plugin/calendar';
  26. import duration from 'dayjs/plugin/duration';
  27. import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
  28. import customParseFormat from 'dayjs/plugin/customParseFormat';
  29. import { Toast, Dialog } from 'vant';
  30. Toast.setDefaultOptions('loading', { duration: 0 });
  31. require('dayjs/locale/zh-cn');
  32. const emitter = mitt();
  33. dayjs.locale('zh-cn');
  34. dayjs.extend(relativeTime);
  35. dayjs.extend(calendar);
  36. dayjs.extend(duration);
  37. dayjs.extend(isSameOrBefore);
  38. dayjs.extend(customParseFormat);
  39. let showConsole = localStorage.getItem('showConsole');
  40. if (showConsole && parseInt(showConsole) > new Date().getTime()) {
  41. eruda.init();
  42. }
  43. store.commit('setFirstUrl', location.href);
  44. import ImgContent from './components/ImgContent.vue';
  45. const app = createApp(App)
  46. .use(Vant)
  47. .use(http)
  48. .use(colors)
  49. // .use(ElementUI)
  50. .use(ConfigProvider)
  51. .use(VueClipboard)
  52. .mixin(common)
  53. .component('page-title', PageTitle)
  54. .component('like-button', LikeButton)
  55. .component('driver', Driver)
  56. // .component('van-image', ImgContent)
  57. .component('page-bar', PageBar)
  58. .use(store)
  59. .use(router);
  60. app.config.globalProperties.emitter = emitter;
  61. app.config.globalProperties.dayjs = dayjs;
  62. let query = queryString.parse(location.search);
  63. if (query.code) {
  64. http.http.post('/user/code2openId', { code: query.code }).then(res => {
  65. localStorage.setItem('openId', res);
  66. });
  67. } else {
  68. if (/micromessenger/i.test(navigator.userAgent) && !/localhost|(192\.168)/i.test(location.host)) {
  69. // document.location.replace(location.origin + '/wx/redirect?redirectUrl=' + location.href);
  70. }
  71. }
  72. // store.dispatch('getTime');
  73. if (query.invitor) {
  74. store.commit('setInvitor', query.invitor);
  75. if (query.id) {
  76. store.commit('setProductId', query.id);
  77. }
  78. }
  79. if (query.from) {
  80. store.commit('setFrom', query.from);
  81. }
  82. if (query.inviteCode) {
  83. store.commit('setInviteCode', query.inviteCode);
  84. }
  85. if (query.review === 'true' || query.review === true) {
  86. store.commit('setReview', true);
  87. }
  88. if (query.reviewPay === 'true' || query.reviewPay === true || sessionStorage.getItem('reviewPay')) {
  89. store.commit('setReviewPay', true);
  90. sessionStorage.setItem('reviewPay', true);
  91. }
  92. const style = document.documentElement.style;
  93. style.setProperty('--safe-top', 'env(safe-area-inset-top)');
  94. style.setProperty('--safe-bottom', 'env(safe-area-inset-bottom)');
  95. style.setProperty('--safe-left', 'env(safe-area-inset-left)');
  96. style.setProperty('--safe-right', 'env(safe-area-inset-right)');
  97. const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
  98. const loadSplash = (onload, onerror) =>
  99. new Promise((resolve, reject) => {
  100. let isHide = false;
  101. function hideSplash() {
  102. if (isHide) return;
  103. isHide = true;
  104. splash.style.opacity = 0;
  105. setTimeout(() => {
  106. // document.body.removeChild(splash);
  107. }, 800);
  108. resolve();
  109. }
  110. const splash = document.createElement('img');
  111. splash.className = 'splash-screen';
  112. splash.onload = () => {
  113. onload && onload();
  114. setTimeout(() => {
  115. hideSplash();
  116. }, 2000);
  117. };
  118. splash.onerror = () => {
  119. hideSplash();
  120. onerror && onerror();
  121. };
  122. setTimeout(() => {
  123. hideSplash();
  124. }, 5000);
  125. splash.src = 'https://nanjingnft.oss-cn-hangzhou.aliyuncs.com/font/splash.jpg?ts=' + new Date().getTime();
  126. // document.body.append(splash);
  127. });
  128. if (navigator.userAgent.includes('#cordova#')) {
  129. document.addEventListener(
  130. 'deviceready',
  131. function () {
  132. StatusBar.overlaysWebView(true);
  133. window.$vm = app.mount('#app');
  134. loadSplash(
  135. () => {
  136. setTimeout(() => {
  137. navigator.splashscreen.hide();
  138. }, 100);
  139. },
  140. () => {
  141. navigator.splashscreen.hide();
  142. }
  143. ).then(res => {
  144. StatusBar.overlaysWebView(false);
  145. StatusBar.backgroundColorByHexString('#F5F7FA');
  146. StatusBar.styleDefault();
  147. });
  148. if (/iphone|ipad|ipod/i.test(navigator.userAgent)) {
  149. style.setProperty('--safe-top', 'env(safe-area-inset-top)');
  150. style.setProperty('--safe-bottom', 'env(safe-area-inset-bottom)');
  151. style.setProperty('--safe-left', 'env(safe-area-inset-left)');
  152. style.setProperty('--safe-right', 'env(safe-area-inset-right)');
  153. } else {
  154. if (window.AndroidNotch) {
  155. window.AndroidNotch.getInsetTop(
  156. px => {
  157. style.setProperty('--safe-top', px + 'px');
  158. },
  159. err => console.error('Failed to get insets top:', err)
  160. );
  161. window.AndroidNotch.getInsetRight(
  162. px => {
  163. style.setProperty('--safe-right', px + 'px');
  164. },
  165. err => console.error('Failed to get insets right:', err)
  166. );
  167. window.AndroidNotch.getInsetBottom(
  168. px => {
  169. style.setProperty('--safe-bottom', px + 'px');
  170. },
  171. err => console.error('Failed to get insets bottom:', err)
  172. );
  173. window.AndroidNotch.getInsetLeft(
  174. px => {
  175. style.setProperty('--safe-left', px + 'px');
  176. },
  177. err => console.error('Failed to get insets left:', err)
  178. );
  179. }
  180. }
  181. let t = 0;
  182. document.addEventListener(
  183. 'backbutton',
  184. e => {
  185. if (window.$vm.$route.matched.find(i => i.name === 'index')) {
  186. e.preventDefault();
  187. let t1 = new Date().getTime();
  188. console.log(t1 - t);
  189. if (t1 - t < 1000) {
  190. navigator.app.exitApp();
  191. } else {
  192. t = t1;
  193. window.$vm.$toast('再按一次退出');
  194. }
  195. } else {
  196. window.$vm.$router.go(-1);
  197. }
  198. },
  199. false
  200. );
  201. // if (!(/.+\.raex\.vip/.test(location.host) || /192\.168/.test(location.host))) {
  202. // if (!/iphone|ipad|ipod|Macintosh/i.test(navigator.userAgent)) {
  203. // window.$vm.$dialog.alert({
  204. // message: '检测到新版本,请下载更新',
  205. // confirmButtonText: '下载更新',
  206. // beforeClose(action, done) {
  207. // console.log(action);
  208. // if (/iphone|ipad|ipod|Macintosh/i.test(navigator.userAgent)) {
  209. // //location.href = 'https://apps.apple.com/cn/app/id1598469798';
  210. // } else {
  211. // location.href = 'http://download.raex.vip';
  212. // }
  213. // }
  214. // });
  215. // }
  216. // }
  217. if (window.store && /iphone|ipad|ipod|Macintosh/i.test(navigator.userAgent)) {
  218. window.store.register({
  219. id: '358',
  220. alias: '358',
  221. type: window.store.CONSUMABLE
  222. });
  223. window.store.error(function (error) {
  224. console.log('ERROR ' + error.code + ': ' + error.message);
  225. });
  226. window.store
  227. .when('358')
  228. .updated(product => {
  229. emitter.emit('iapEvent', { event: 'updated', product });
  230. })
  231. .requested(product => {
  232. emitter.emit('iapEvent', { event: 'requested', product });
  233. })
  234. .initiated(product => {
  235. emitter.emit('iapEvent', { event: 'initiated', product });
  236. })
  237. .cancelled(product => {
  238. emitter.emit('iapEvent', { event: 'cancelled', product });
  239. })
  240. .approved(product => {
  241. product.finish();
  242. emitter.emit('iapEvent', { event: 'approved', product });
  243. })
  244. .verified(product => {
  245. emitter.emit('iapEvent', { event: 'verified', product });
  246. })
  247. .finished(product => {
  248. emitter.emit('iapEvent', { event: 'finished', product });
  249. });
  250. window.store.refresh();
  251. }
  252. },
  253. false
  254. );
  255. } else {
  256. loadSplash().then(res => {
  257. window.$vm = app.mount('#app');
  258. });
  259. }