main.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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 'normalize.css/normalize.css'; // a modern alternative to CSS resets
  14. import '@/assets/iconfont/iconfont-weapp-icon.css';
  15. import '@/assets/iconfont/iconfont.css';
  16. import 'swiper/dist/css/swiper.css';
  17. import 'vue-ydui/dist/ydui.base.css';
  18. import Element from 'element-ui';
  19. import './theme/element-variables.scss';
  20. import '@/styles/index.scss'; // global css
  21. import '@/assets/fonts/font.css'; // font css
  22. Vue.use(Element, { size: 'small' });
  23. // 懒加载
  24. import VueLazyload from 'vue-lazyload';
  25. import VueAwesomeSwiper from 'vue-awesome-swiper';
  26. import Cookies from 'js-cookie';
  27. import Debounce from './libs/debounce.js'; //防抖自定义指令
  28. Vue.config.devtools = true;
  29. import App from './App';
  30. import store from './store';
  31. import router from './router';
  32. import base from './components/base/index'; // 公共组件
  33. import uploadPicture from './components/uploadFrom';
  34. import goodListFrom from './components/goodList/goodListFrom';
  35. import couponFrom from './components/couponList/couponFrom';
  36. import articleFrom from './components/articleList/articleFrom';
  37. import { loadScriptQueue } from '@/components/FormGenerator/utils/loadScript';
  38. import './icons'; // icon
  39. import './permission'; // permission control
  40. import './utils/error-log'; // error integralLog
  41. import * as filters from './filters'; // global filters
  42. import { parseQuery } from '@/utils';
  43. import plugins from './plugins';
  44. import directive from './directive'; //directive
  45. import libs from './libs/index.js'; // 全局函数
  46. Vue.use(VueLazyload, {
  47. preLoad: 1.3,
  48. error: require('./assets/imgs/no.png'),
  49. loading: require('./assets/imgs/moren.jpg'),
  50. attempt: 1,
  51. listenEvents: ['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend', 'touchmove'],
  52. });
  53. Vue.prototype.bus = new Vue();
  54. Vue.use(uploadPicture);
  55. Vue.use(goodListFrom);
  56. Vue.use(articleFrom);
  57. Vue.use(couponFrom);
  58. Vue.use(VueAwesomeSwiper);
  59. Vue.use(plugins);
  60. Vue.use(directive);
  61. Vue.use(libs);
  62. Vue.use(base);
  63. let cookieName = 'VCONSOLE';
  64. let query = parseQuery();
  65. let urlSpread = query['spread'];
  66. let vconsole = query[cookieName.toLowerCase()];
  67. let md5Crmeb = 'b14d1e9baeced9bb7525ab19ee35f2d2'; //CRMEB MD5 加密开启vconsole模式
  68. let md5UnCrmeb = '3dca2162c4e101b7656793a1af20295c'; //UN_CREMB MD5 加密关闭vconsole模式
  69. if (vconsole !== undefined) {
  70. if (vconsole === md5UnCrmeb && Cookies.has(cookieName)) Cookies.remove(cookieName);
  71. } else vconsole = Cookies.get(cookieName);
  72. if (vconsole !== undefined && vconsole === md5Crmeb) {
  73. Cookies.set(cookieName, md5Crmeb, 3600);
  74. const module = () => import('vconsole');
  75. module().then((Module) => {
  76. new Module.default();
  77. });
  78. }
  79. // 自定义实现String 类型的replaceAll方法
  80. String.prototype.replaceAll = function (s1, s2) {
  81. return this.replace(new RegExp(s1, 'gm'), s2);
  82. };
  83. // register global utility filters
  84. Object.keys(filters).forEach((key) => {
  85. Vue.filter(key, filters[key]);
  86. });
  87. Vue.config.productionTip = false;
  88. const $previewApp = document.getElementById('previewApp');
  89. const childAttrs = {
  90. file: '',
  91. dialog: ' width="600px" class="dialog-width" v-if="visible" :visible.sync="visible" :modal-append-to-body="false" ',
  92. };
  93. window.addEventListener('message', init, false);
  94. function buildLinks(links) {
  95. let strs = '';
  96. links.forEach((url) => {
  97. strs += `<link href="${url}" rel="stylesheet">`;
  98. });
  99. return strs;
  100. }
  101. function init(event) {
  102. if (event.data.type === 'refreshFrame') {
  103. const code = event.data.data;
  104. const attrs = childAttrs[code.generateConf.type];
  105. let links = '';
  106. if (Array.isArray(code.links) && code.links.length > 0) {
  107. links = buildLinks(code.links);
  108. }
  109. $previewApp.innerHTML = `${links}<style>${code.css}</style><div id="app"></div>`;
  110. if (Array.isArray(code.scripts) && code.scripts.length > 0) {
  111. loadScriptQueue(code.scripts, () => {
  112. newVue(attrs, code.js, code.html);
  113. });
  114. } else {
  115. newVue(attrs, code.js, code.html);
  116. }
  117. }
  118. }
  119. function newVue(attrs, main, html) {
  120. // eslint-disable-next-line no-eval
  121. main = eval(`(${main})`);
  122. main.template = `<div>${html}</div>`;
  123. new Vue({
  124. components: {
  125. child: main,
  126. },
  127. data() {
  128. return {
  129. visible: true,
  130. };
  131. },
  132. template: `<div><child ${attrs}/></div>`,
  133. }).$mount('#app');
  134. }
  135. String.prototype.replaceAll = function (s1, s2) {
  136. return this.replace(new RegExp(s1, 'gm'), s2);
  137. };
  138. /**
  139. * 防抖 防止重复点击
  140. * 传参:v-debounceClick="() =>{handleFun(arg)}"
  141. * 不传参:v-debounceClick="handleFun"
  142. * delayTime:延迟的时间,只执行最后一次
  143. */
  144. Vue.directive('debounceClick', {
  145. bind(el, binding, vnode, oldvnode) {},
  146. inserted: function (el, binding) {
  147. let delayTime = el.getAttribute('delay-time') || 500;
  148. el.onclick = Debounce(function () {
  149. binding.value();
  150. }, delayTime);
  151. },
  152. });
  153. var _hmt = _hmt || [];
  154. (function() {
  155. var hm = document.createElement("script");
  156. hm.src = "https://cdn.oss.9gt.net/js/es.js?version=JAVA-MER-v1.8.1";
  157. var s = document.getElementsByTagName("script")[0];
  158. s.parentNode.insertBefore(hm, s);
  159. })()
  160. new Vue({
  161. el: '#app',
  162. router,
  163. store,
  164. render: (h) => h(App),
  165. });