main.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import Vue from "vue";
  2. import App from "./App.vue";
  3. import ElementUI from "element-ui";
  4. import store from "./store";
  5. import router from "./router";
  6. import axios from "axios";
  7. import api from "./http/api";
  8. import "./http/common/base";
  9. import { debounce } from "./utils/common";
  10. import * as echarts from "echarts";
  11. import "@/styles/element-variables.scss";
  12. // 引入vxe-table
  13. import VXETable from 'vxe-table';
  14. import 'vxe-table/lib/style.css';
  15. import "@/styles/common.scss";
  16. import "font-awesome/css/font-awesome.min.css";
  17. import './styles/XueKeWangQuestionStyles.css'
  18. import './assets/font2/iconfont.css'
  19. Vue.use(VXETable);
  20. // 解决el-radio报错
  21. Vue.directive('removeAriaHidden', {
  22. bind(el, binding) {
  23. let ariaEls = el.querySelectorAll('.el-radio__original');
  24. ariaEls.forEach((item) => {
  25. item.removeAttribute('aria-hidden');
  26. });
  27. }
  28. });
  29. import Header from "@/views/layout/components/Header.vue";
  30. import Footer from "@/views/layout/components/Footer.vue";
  31. Vue.component("Header", Header);
  32. Vue.component("Footer", Footer);
  33. import InfiniteLoading from "vue-infinite-loading";
  34. import lottie from "vue-lottie";
  35. import global from "@/utils/global.js";
  36. import envFeature from "@/utils/envFeature.js";
  37. Vue.prototype.$global = global;
  38. // 环境显隐:组件内无需 import,直接用 this.$feature.isShow() / isHide()
  39. Vue.prototype.$feature = envFeature;
  40. Vue.use(InfiniteLoading);
  41. Vue.component("lottie", lottie);
  42. const _ResizeObserver = window.ResizeObserver;
  43. ElementUI.Dialog.props.closeOnClickModal.default = false;
  44. window.ResizeObserver = class ResizeObserver extends _ResizeObserver {
  45. constructor(callback) {
  46. callback = debounce(callback, 16);
  47. super(callback);
  48. }
  49. };
  50. Vue.config.productionTip = false;
  51. Vue.use(ElementUI, {
  52. table: {
  53. resizable: false,
  54. },
  55. });
  56. Vue.prototype.$axios = axios;
  57. Vue.prototype.$api = api;
  58. Vue.prototype.$echarts = echarts;
  59. //=======从pad App接收消息 start
  60. window.receiveAppMsg = function(payload) {
  61. console.log('【网页收到壳消息】', payload)
  62. if (!payload || !payload.type) return
  63. switch (payload.type) {
  64. case 'setToken':
  65. window.__IS_PAD_APP__ = true;
  66. window.__PAD_APP_TOKEN__ = payload.token;// 保存token到全局变量
  67. const rootEl = document.querySelector('#app') // vue项目根容器
  68. const cls = 'pad_container_layout';// pad容器样式
  69. if (rootEl && !rootEl.classList.contains(cls)) {
  70. rootEl.classList.add(cls)
  71. }
  72. // if (payload.token) {
  73. // axios.defaults.headers.common['Authorization'] = `${payload.token}`
  74. // }
  75. // 触发自定义事件,通知登录页面token准备好了!
  76. const tokenReadyEvent = new CustomEvent('padAppTokenReady', {
  77. detail: { token: payload.token }
  78. })
  79. window.dispatchEvent(tokenReadyEvent)
  80. break
  81. case 'goPage':
  82. router.push(payload.path)
  83. break
  84. case 'openHeaderDropdown':
  85. // 通知 Header 组件打开用户下拉(el-dropdown)弹框
  86. window.dispatchEvent(new CustomEvent('openHeaderDropdown'))
  87. break
  88. default:
  89. // console.log('未知消息类型', payload)
  90. break
  91. }
  92. }
  93. // H5 iframe监听壳消息
  94. window.addEventListener('message', function(e) {
  95. // console.log('【收到壳消息】', JSON.stringify(e.data))
  96. // ==========重点:APP‑PLUS环境直接退出,不要处理postMessage消息==========
  97. // uni-app webview中,window.plus 存在代表是安卓/ios app环境
  98. if(window.plus){
  99. console.log("【APP环境,跳过postMessage消息】")
  100. return
  101. }
  102. // 过滤webpack内部热更新消息
  103. if (e.data?.type === 'webpackWarnings' || e.data?.type === 'webpackHotUpdate') {
  104. return
  105. }
  106. // 白名单,只允许这些域名发送消息
  107. const baseUrl = process.env.VUE_APP_BASE;
  108. const allowOrigin = [
  109. 'http://localhost:8080',
  110. 'http://192.168.1.18:8080',
  111. baseUrl
  112. ];
  113. if (!allowOrigin.includes(e.origin)) return
  114. const data = e.data;
  115. if (!data || !data.type) return
  116. window.receiveAppMsg(data)
  117. })
  118. //=======从pad App接收消息 end
  119. new Vue({
  120. el: "#app",
  121. router,
  122. store,
  123. render: (h) => h(App),
  124. });