main.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * 项目启动入口方法
  3. *
  4. * @Author: DCCloud
  5. * @Date: 2022-09-06 20:59:23
  6. */
  7. import { createApp } from 'vue';
  8. import VantUi from 'vant'
  9. import "vant/lib/index.css";
  10. import Antd, { message } from 'ant-design-vue';
  11. import * as antIcons from '@ant-design/icons-vue';
  12. import lodash from 'lodash';
  13. import JsonViewer from 'vue3-json-viewer';
  14. import 'vue3-json-viewer/dist/index.css';
  15. import App from './App.vue';
  16. import { smartSentry } from '/@/lib/smart-sentry';
  17. import { loginApi } from '/src/api/system/login-api';
  18. import constantsInfo from '/@/constants/index';
  19. import { privilegeDirective, loadingDirective } from '/@/directives/privilege';
  20. import i18n from '/@/i18n/index';
  21. import privilegePlugin from '/@/plugins/privilege-plugin';
  22. import smartEnumPlugin from '/@/plugins/smart-enums-plugin';
  23. import { buildRoutes, router } from '/@/router';
  24. import { store } from '/@/store';
  25. import { useUserStore } from '/@/store/modules/system/user';
  26. import 'ant-design-vue/dist/reset.css';
  27. import 'vue3-tabs-chrome/dist/vue3-tabs-chrome.css';
  28. import '/@/theme/index.less';
  29. import { localRead } from '/@/utils/local-util.js';
  30. import LocalStorageKeyConst from '/@/constants/local-storage-key-const.js';
  31. import '/@/assets/iconfont/iconfont.js';
  32. // 导入样式
  33. import "/@/views/flow/stFormDesign/styles/form-design.less";
  34. // 导出本地iconfont
  35. import "/@/views/flow/stFormDesign/static/icons/iconfont";
  36. // 引入表单设计器
  37. import { StFormDesign, StFormMobileDesign } from "/@/views/flow/stFormDesign/packages/index.js";
  38. import StFormBuild from "/@/views/flow/stFormDesign/packages/StFormBuild/index.js";
  39. // 引入vxe-table
  40. import VxeUI from 'vxe-pc-ui'
  41. import 'vxe-pc-ui/lib/style.css'
  42. import VxeUITable from 'vxe-table'
  43. import 'vxe-table/lib/style.css'
  44. import '/@/components/BsUi/Render/index.js'
  45. import BsUi from "/@/components/BsUi"
  46. // 引入common-table
  47. import CommonTable from './components/common/common-table/index.vue';
  48. // 引入common-drawer
  49. import CommonDrawer from './components/common/common-drawer/index.vue';
  50. // 引入common-card
  51. import CommonCard from './components/common/common-card/index.vue';
  52. // 引入无分页common-table
  53. import CommonNoPageTable from './components/common/common-table-no-page/index.vue';
  54. /*
  55. * -------------------- ※ 着重 解释说明下main.js的初始化逻辑 begin ※ --------------------
  56. *
  57. * 1、在main.js里很多框架都是 直接调用初始化的vue方法,创建vue实例,然后挂载路由router、状态管理store等等,但是关于router这块是有问题的;
  58. * 2、因为现在大部分路由都是从后端接口返回的,如若直接初始化挂载路由,这时前端还没有从后端请求路由的数据,所以只能写到路由拦截器里,这样很绕很不清晰;
  59. * 正确的做法流程应该是:
  60. * 2.1)如果存在登录信息,则先ajax请求用户的所有路由,然后加载,再去创建vue实例和挂载路由
  61. * 2.2)如果不存在路由信息,则创建vue实例和挂载路由(此时的路由应该只有login页面,因为用户拥有哪些路由是登录之后才知道的)
  62. * 3、以上,在main.js里两个方法,一个是 获取登录信息getLoginInfo,另一个初始化vue: initVue,在最下的if操作里
  63. *
  64. * -------------------- ※ 着重 解释说明下main.js的初始化逻辑 end ※ --------------------
  65. */
  66. /**
  67. * 获取用户信息和用户权限对应的路由,构建动态路由
  68. */
  69. async function getLoginInfo() {
  70. try {
  71. //获取登录用户信息
  72. const res = await loginApi.getLoginInfo();
  73. //构建系统的路由
  74. let menuRouterList = res.data.menuList.filter((e) => e.path || e.frameUrl);
  75. buildRoutes(menuRouterList);
  76. initVue();
  77. //更新用户信息到pinia
  78. useUserStore().setUserLoginInfo(res.data);
  79. } catch (e) {
  80. message.error(e.data ? e.data.msg : e.message);
  81. smartSentry.captureError(e);
  82. initVue();
  83. }
  84. }
  85. function initVue() {
  86. let vueApp = createApp(App);
  87. let app = vueApp.use(router).use(store).use(i18n).use(Antd).use(smartEnumPlugin, constantsInfo).use(privilegePlugin).use(JsonViewer);
  88. app.use(VxeUI).use(VxeUITable);
  89. app.use(StFormDesign);
  90. app.use(StFormMobileDesign);
  91. app.use(StFormBuild);
  92. app.component('CommonTable', CommonTable);
  93. app.component('CommonDrawer', CommonDrawer);
  94. app.component('CommonCard', CommonCard);
  95. app.component('CommonNoPageTable', CommonNoPageTable);
  96. app.use(VantUi);
  97. //注入权限
  98. app.directive('privilege', {
  99. mounted(el, binding) {
  100. privilegeDirective(el, binding);
  101. },
  102. });
  103. //注入loading
  104. app.directive('loading', {
  105. updated(el, binding) {
  106. loadingDirective(el, binding);
  107. }
  108. });
  109. // 注册图标组件
  110. Object.keys(antIcons).forEach((key) => {
  111. app.component(key, antIcons[key]);
  112. });
  113. // 注册BsUi组件
  114. app.use(BsUi);
  115. //全局
  116. app.config.globalProperties.$antIcons = antIcons;
  117. app.config.globalProperties.$lodash = lodash;
  118. //挂载
  119. app.mount('#app');
  120. }
  121. //不需要获取用户信息、用户菜单、用户菜单动态路由,直接初始化vue即可
  122. let token = localRead(LocalStorageKeyConst.USER_TOKEN);
  123. if (!token) {
  124. initVue();
  125. } else {
  126. getLoginInfo();
  127. }