main.js 9.3 KB

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