main.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // +----------------------------------------------------------------------
  2. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  3. // +----------------------------------------------------------------------
  4. // | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
  5. // +----------------------------------------------------------------------
  6. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  7. // +----------------------------------------------------------------------
  8. // | Author: CRMEB Team <admin@crmeb.com>
  9. // +----------------------------------------------------------------------
  10. import Vue from 'vue';
  11. import '@babel/polyfill';
  12. import '@/theme/index.scss';
  13. import '@/styles/index.scss'; // global css
  14. import 'normalize.css/normalize.css'; // a modern alternative to CSS resets
  15. import '@/assets/iconfont/iconfont.css';
  16. import '@/assets/iconfont/iconfont-weapp-icon.css';
  17. import Element from 'element-ui';
  18. import '@/theme/element-variables.scss';
  19. import 'vue-ydui/dist/ydui.base.css';
  20. import Cookies from 'js-cookie';
  21. import Debounce from './libs/debounce.js'; //防抖自定义指令
  22. Vue.use(Element, {
  23. size: Cookies.get('size') || 'small', // set element-ui default size
  24. });
  25. import VueAwesomeSwiper from 'vue-awesome-swiper';
  26. import 'swiper/dist/css/swiper.css';
  27. // 懒加载
  28. import VueLazyload from 'vue-lazyload';
  29. Vue.prototype.bus = new Vue();
  30. Vue.config.devtools = true;
  31. import App from './App';
  32. import store from './store';
  33. import router from './router';
  34. import base from '@/components/base/index'; // 公共组件
  35. import uploadPicture from './components/uploadFrom';
  36. import goodListFrom from './components/goodList/goodListFrom';
  37. import activityProduct from './components/activityProduct/goodListFrom';
  38. import couponFrom from './components/couponList/couponFrom';
  39. import { loadScriptQueue } from '@/components/FormGenerator/utils/loadScript';
  40. import './icons'; // icon
  41. import './permission'; // permission control
  42. import './utils/error-log'; // error integralLog
  43. import * as filters from './filters'; // global filters
  44. import { parseQuery, inputLimt } from '@/utils';
  45. import SettingMer from '@/utils/settingMer';
  46. import plugins from './plugins';
  47. import directive from './directive'; //directive
  48. import libs from './libs/index.js'; // 全局函数
  49. Vue.directive('inputLimit', inputLimt);
  50. Vue.use(VueLazyload, {
  51. preLoad: 1.3,
  52. error: require('./assets/imgs/no.png'),
  53. loading: require('./assets/imgs/moren.jpg'),
  54. attempt: 1,
  55. listenEvents: ['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend', 'touchmove'],
  56. });
  57. Vue.use(uploadPicture);
  58. Vue.use(goodListFrom);
  59. Vue.use(activityProduct);
  60. Vue.use(couponFrom);
  61. Vue.use(VueAwesomeSwiper);
  62. Vue.use(plugins);
  63. Vue.use(directive);
  64. Vue.use(libs);
  65. Vue.use(base);
  66. let cookieName = 'VCONSOLE';
  67. let query = parseQuery();
  68. let urlSpread = query['spread'];
  69. let vconsole = query[cookieName.toLowerCase()];
  70. let md5Crmeb = 'b14d1e9baeced9bb7525ab19ee35f2d2'; //CRMEB MD5 加密开启vconsole模式
  71. let md5UnCrmeb = '3dca2162c4e101b7656793a1af20295c'; //UN_CREMB MD5 加密关闭vconsole模式
  72. if (vconsole !== undefined) {
  73. if (vconsole === md5UnCrmeb && Cookies.has(cookieName)) Cookies.remove(cookieName);
  74. } else vconsole = Cookies.get(cookieName);
  75. if (vconsole !== undefined && vconsole === md5Crmeb) {
  76. Cookies.set(cookieName, md5Crmeb, 3600);
  77. const module = () => import('vconsole');
  78. module().then((Module) => {
  79. new Module.default();
  80. });
  81. }
  82. // 自定义实现String 类型的replaceAll方法
  83. String.prototype.replaceAll = function (s1, s2) {
  84. return this.replace(new RegExp(s1, 'gm'), s2);
  85. };
  86. // register global utility filters
  87. Object.keys(filters).forEach((key) => {
  88. Vue.filter(key, filters[key]);
  89. });
  90. Vue.config.productionTip = false;
  91. const $previewApp = document.getElementById('previewApp');
  92. const childAttrs = {
  93. file: '',
  94. dialog: ' width="600px" class="dialog-width" v-if="visible" :visible.sync="visible" :modal-append-to-body="false" ',
  95. };
  96. window.addEventListener('message', init, false);
  97. function buildLinks(links) {
  98. let strs = '';
  99. links.forEach((url) => {
  100. strs += `<link href="${url}" rel="stylesheet">`;
  101. });
  102. return strs;
  103. }
  104. function init(event) {
  105. if (event.data.type === 'refreshFrame') {
  106. const code = event.data.data;
  107. const attrs = childAttrs[code.generateConf.type];
  108. let links = '';
  109. if (Array.isArray(code.links) && code.links.length > 0) {
  110. links = buildLinks(code.links);
  111. }
  112. $previewApp.innerHTML = `${links}<style>${code.css}</style><div id="app"></div>`;
  113. if (Array.isArray(code.scripts) && code.scripts.length > 0) {
  114. loadScriptQueue(code.scripts, () => {
  115. newVue(attrs, code.js, code.html);
  116. });
  117. } else {
  118. newVue(attrs, code.js, code.html);
  119. }
  120. }
  121. }
  122. //防抖指令
  123. import { throttle } from '@/libs/throttle';
  124. Vue.directive('throttle', throttle);
  125. /**
  126. * 防抖 防止重复点击
  127. * 传参:v-debounceClick="() =>{handleFun(arg)},表格内防抖不建议使用"
  128. * 不传参:v-debounceClick="handleFun"
  129. * delayTime:延迟的时间,只执行最后一次
  130. */
  131. Vue.directive('debounceClick', {
  132. bind(el, binding, vnode, oldvnode) {},
  133. inserted: function (el, binding) {
  134. let delayTime = el.getAttribute('delay-time') || 1000;
  135. el.onclick = Debounce(function () {
  136. binding.value();
  137. }, delayTime);
  138. },
  139. });
  140. //element ui 中的单选框组件 el-radio-group 在近期使用中 报错(有关标签属性-aria-hidden),经测试chrome浏览器会出现这个问题。(在Edge浏览器和360浏览器上均无报错现象)
  141. //原理就是移除 其 aria-hidden 报错属性,因为这个属性是后来运行过程中 给标签自动添加上去的,与实际功能无关,移除后不影响功能,并解决报错问题。
  142. Vue.directive('removeAriaHidden', {
  143. bind(el, binding) {
  144. let ariaEls = el.querySelectorAll('.el-radio__original');
  145. ariaEls.forEach((item) => {
  146. item.removeAttribute('aria-hidden');
  147. });
  148. },
  149. });
  150. function newVue(attrs, main, html) {
  151. // eslint-disable-next-line no-eval
  152. main = eval(`(${main})`);
  153. main.template = `<div>${html}</div>`;
  154. new Vue({
  155. components: {
  156. child: main,
  157. },
  158. data() {
  159. return {
  160. visible: true,
  161. };
  162. },
  163. template: `<div><child ${attrs}/></div>`,
  164. }).$mount('#app');
  165. }
  166. String.prototype.replaceAll = function (s1, s2) {
  167. return this.replace(new RegExp(s1, 'gm'), s2);
  168. };
  169. new Vue({
  170. el: '#app',
  171. router,
  172. store,
  173. render: (h) => h(App),
  174. });