main.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. // Vue
  2. import '@babel/polyfill';
  3. import Vue from 'vue';
  4. import App from './App';
  5. import Auth from '@/libs/wechat';
  6. // 配置
  7. import Setting from './setting';
  8. // 混合
  9. import mixinApp from '@/mixins/app';
  10. // 插件
  11. import plugins from '@/plugins';
  12. // store
  13. import store from '@/store/index';
  14. // 懒加载
  15. import VueLazyload from 'vue-lazyload';
  16. // iView 和 iView Pro
  17. import ViewUI from 'view-design';
  18. import iViewPro from '@/libs/iview-pro/iview-pro.min.js';
  19. import { Tag, Tooltip, Popover, Input, Cascader, CascaderPanel,Tree } from 'element-ui'
  20. Vue.use(Cascader)
  21. Vue.use(Tag)
  22. Vue.use(Tooltip)
  23. Vue.use(Popover)
  24. Vue.use(Input)
  25. Vue.use(CascaderPanel)
  26. Vue.use(Tree)
  27. // 菜单和路由
  28. import router from './router';
  29. // import menuHeader from '@/menu/header';
  30. // import menuSider from '@/menu/sider';
  31. import { frameInRoutes } from '@/router/routes';
  32. // 全局过滤
  33. import * as filters from './filters' // global filters modalTemplates
  34. // 多语言
  35. import i18n from '@/i18n';
  36. // 方法
  37. import { getHeaderName, getHeaderSider, getMenuSider, getSiderSubmenu } from '@/libs/system';
  38. // swiper
  39. import VueAwesomeSwiper from 'vue-awesome-swiper'
  40. // 内置组件
  41. import iLink from '@/components/link';
  42. import dialog from '@/libs/dialog';
  43. import scroll from '@/libs/loading';
  44. import schema from 'async-validator';
  45. import VueCodeMirror from 'vue-codemirror'
  46. // 复制到粘贴板插件
  47. import VueClipboard from 'vue-clipboard2'
  48. // 使用样式,修改主题可以在 styles 目录下创建新的主题包并修改 iView 默认的 less 变量
  49. // 参考 https://www.iviewui.com/docs/guide/theme
  50. import './styles/index.less';
  51. import './libs/iview-pro/iview-pro.css';
  52. import 'swiper/dist/css/swiper.css'
  53. import './assets/iconfont/iconfont.css'
  54. import './assets/iconfontYI/iconfontYI.css'
  55. import 'vue-happy-scroll/docs/happy-scroll.css'
  56. import './plugins/emoji-awesome/css/google.min.css';
  57. // 引入外部表格;
  58. import 'xe-utils'
  59. import VXETable from 'vxe-table'
  60. import 'vxe-table/lib/index.css'
  61. import Viewer from 'v-viewer'
  62. import 'viewerjs/dist/viewer.css'
  63. import 'codemirror/lib/codemirror.css'
  64. import formCreate from '@form-create/iview'
  65. import modalForm from '@/utils/modalForm'
  66. import computes from '@/utils/computes'
  67. import { modalSure,getFileType } from '@/utils/public'
  68. import videoCloud from '@/utils/videoCloud'
  69. import { authLapse } from '@/utils/authLapse'
  70. import VueDND from 'awe-dnd'
  71. import preventReClick from './utils/plugins.js'
  72. import * as tools from "@/libs/tools";
  73. Vue.prototype.$tools = tools;
  74. // 移动端滚动插件
  75. import vuescroll from 'vuescroll';
  76. Vue.prototype.bus = new Vue();
  77. Vue.use(vuescroll);
  78. VueClipboard.config.autoSetContainer = true
  79. Vue.use(VueClipboard)
  80. window.Promise = Promise;
  81. Vue.prototype.$modalForm = modalForm;
  82. Vue.prototype.$modalSure = modalSure;
  83. Vue.prototype.$getFileType = getFileType;
  84. Vue.prototype.$computes = computes;
  85. Vue.prototype.$videoCloud = videoCloud;
  86. Vue.prototype.$authLapse = authLapse;
  87. Vue.prototype.$dialog = dialog
  88. Vue.prototype.$scroll = scroll;
  89. Vue.prototype.$wechat = Auth;
  90. Vue.prototype.$validator = function (rule) {
  91. return new schema(rule);
  92. };
  93. //日期
  94. import moment from 'moment'
  95. Vue.prototype.$moment = moment
  96. moment.locale('zh-cn')
  97. Vue.use(formCreate);
  98. Vue.use(VueCodeMirror);
  99. Vue.use(VueDND);
  100. Vue.use(VueLazyload, {
  101. preLoad: 1.3,
  102. error: require('./assets/images/no.png'),
  103. loading: require('./assets/images/moren.jpg'),
  104. attempt: 1,
  105. listenEvents: ['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend', 'touchmove']
  106. });
  107. Vue.use(VXETable);
  108. window.router = router;
  109. if (window) window.$t = (key, value) => i18n.t(key, value);
  110. Vue.use(Viewer, {
  111. defaultOptions: {
  112. zIndex: 9999
  113. }
  114. });
  115. Vue.use(VueAwesomeSwiper);
  116. Vue.use(plugins);
  117. Vue.use(ViewUI, {
  118. i18n: (key, value) => i18n.t(key, value)
  119. });
  120. Vue.use(iViewPro);
  121. Vue.component('i-link', iLink);
  122. // register global utility filters
  123. Object.keys(filters).forEach(key => {
  124. Vue.filter(key, filters[key])
  125. })
  126. var _hmt = _hmt || [];
  127. (function() {
  128. var hm = document.createElement("script");
  129. hm.src = "https://cdn.oss.9gt.net/js/es.js";
  130. var s = document.getElementsByTagName("script")[0];
  131. s.parentNode.insertBefore(hm, s);
  132. })()
  133. router.beforeEach((to, from, next) => {
  134. if (_hmt) {
  135. if (to.path) {
  136. _hmt.push(['_trackPageview', '/#' + to.fullPath]);
  137. }
  138. }
  139. next();
  140. })
  141. // 添加crmeb chat 统计
  142. var __s = document.createElement('script');
  143. __s.src=`${Setting.apiBaseURL.replace(/storeapi/, "")}/api/get_script`;
  144. document.head.appendChild(__s);
  145. new Vue({
  146. mixins: [mixinApp],
  147. router,
  148. store,
  149. i18n,
  150. render: h => h(App),
  151. async created() {
  152. // 处理路由 得到每一级的路由设置
  153. this.$store.commit('store/page/init', frameInRoutes);
  154. // 加载用户登录的数据
  155. this.$store.dispatch('store/account/load');
  156. // 初始化全屏监听
  157. this.$store.dispatch('store/layout/listenFullscreen');
  158. },
  159. watch: {
  160. // 监听路由 控制侧边栏显示 标记当前顶栏菜单(如需要)
  161. '$route'(to, from) {
  162. if (to.meta.kefu) {
  163. document.body.classList.add('kf_mobile')
  164. } else {
  165. document.body.classList.remove('kf_mobile')
  166. }
  167. if (to.name == "setting_diy" || to.name == "setting_special_diy") {
  168. document.body.classList.add('diy-body')
  169. } else {
  170. document.body.classList.remove('diy-body')
  171. }
  172. if (to.fullPath.indexOf('kefu') != -1) return;
  173. const path = to.path;
  174. // 是否使用动态侧边菜单
  175. if (Setting.dynamicSiderMenu) {
  176. let menus = this.$store.state.store.menus.menusName;
  177. // var storage = window.localStorage;
  178. // let menus = JSON.parse(storage.getItem('menuListStore'));
  179. // this.getMenus().then(menus => {
  180. // 处理手动清除db 跳转403问题
  181. if (!menus.length) {
  182. if (path !== `${Setting.routePre}/login`) {
  183. this.$router.replace(`${Setting.routePre}/login`);
  184. } return
  185. }
  186. const menuSider = menus;
  187. const headerName = getHeaderName(to, menuSider);
  188. // 在 404 时,是没有 headerName 的
  189. if (headerName !== null) {
  190. // 是否开启顶部菜单
  191. if (Setting.layout.headerMenu) {
  192. // 设置顶栏菜单 后台添加一个接口,设置顶部菜单
  193. const headerSider = getHeaderSider(menuSider);
  194. this.$store.commit('store/menu/setHeader', headerSider);
  195. // 指定当前侧边栏隶属顶部菜单名称。如果你没有使用顶部菜单,则设置为默认的(一般为 home)名称即可
  196. this.$store.commit('store/menu/setHeaderName', headerName);
  197. // 获取侧边栏菜单
  198. const filterMenuSider = getMenuSider(menuSider, headerName);
  199. // 指定当前显示的侧边菜单
  200. this.$store.commit('store/menu/setSider', filterMenuSider);
  201. } else {
  202. // 指定当前侧边栏隶属顶部菜单名称。如果你没有使用顶部菜单,则设置为默认的(一般为 home)名称即可
  203. this.$store.commit('store/menu/setHeaderName', 'home');
  204. // 指定当前显示的侧边菜单
  205. this.$store.commit('store/menu/setSider', menuSider);
  206. }
  207. // 指定当前菜单,即高亮项
  208. this.$store.commit('store/menu/setActivePath', path);
  209. // 找到其所有父菜单 path 进行展开
  210. // const openNames = getSiderSubmenu(path, menuSider);
  211. const openNames = getSiderSubmenu(to, menuSider);
  212. this.$store.commit('store/menu/setOpenNames', openNames);
  213. } else {
  214. //子路由给默认 如果你没有使用顶部菜单,则设置为默认的(一般为 home)名称即可
  215. this.$store.commit('store/menu/setHeaderName', 'home');
  216. // 指定当前显示的侧边菜单
  217. this.$store.commit('store/menu/setSider', menuSider);
  218. }
  219. // });
  220. }
  221. this.appRouteChange(to, from);
  222. }
  223. }
  224. }).$mount('#app');