App.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <!--
  2. * @Author: PoJun
  3. * @Date: 2023-08-18 14:01:44
  4. * @LastEditors: PoJun
  5. * @LastEditTime: 2024-01-11 15:02:34
  6. * @Message: Nothing
  7. -->
  8. <template>
  9. <a-config-provider :locale="locale" :get-popup-container="popContainer">
  10. <router-view />
  11. </a-config-provider>
  12. </template>
  13. <script>
  14. import { enquireScreen } from "./utils/util";
  15. import { mapState, mapMutations, mapGetters } from "vuex";
  16. import themeUtil from "@/utils/themeUtil";
  17. import { getI18nKey } from "@/utils/routerUtil";
  18. import { getSysInfo } from "@/api/index.js";
  19. export default {
  20. name: "App",
  21. data() {
  22. return {
  23. locale: {},
  24. };
  25. },
  26. created() {
  27. // 1. 首次加载页面的空白时间
  28. // 2. 动态路由的加载与渲染造成的白屏
  29. const dom = document.getElementById("pageInitLoading");
  30. if (dom) {
  31. document.body.removeChild(document.getElementById("pageInitLoading"));
  32. }
  33. getSysInfo().then(res => {
  34. this.setSystemInfo(res);
  35. });
  36. this.setHtmlTitle();
  37. this.setLanguage(this.lang);
  38. enquireScreen(isMobile => this.setDevice(isMobile));
  39. },
  40. mounted() {
  41. this.setWeekModeTheme(this.weekMode);
  42. },
  43. watch: {
  44. weekMode(val) {
  45. this.setWeekModeTheme(val);
  46. },
  47. lang(val) {
  48. this.setLanguage(val);
  49. this.setHtmlTitle();
  50. },
  51. $route() {
  52. this.setHtmlTitle();
  53. },
  54. "theme.mode": function (val) {
  55. let closeMessage = this.$message.loading(`您选择了主题模式 ${val}, 正在切换...`);
  56. themeUtil.changeThemeColor(this.theme.color, val).then(closeMessage);
  57. },
  58. "theme.color": function (val) {
  59. let closeMessage = this.$message.loading(`您选择了主题色 ${val}, 正在切换...`);
  60. themeUtil.changeThemeColor(val, this.theme.mode).then(closeMessage);
  61. },
  62. layout: function () {
  63. window.dispatchEvent(new Event("resize"));
  64. },
  65. sysLogo(val) {
  66. val && document.querySelector('link[rel="icon"]').setAttribute("href", val);
  67. },
  68. },
  69. computed: {
  70. ...mapState("setting", ["layout", "theme", "weekMode", "lang"]),
  71. ...mapGetters("setting", ["sysLogo"]),
  72. },
  73. methods: {
  74. ...mapMutations("setting", ["setDevice", "setSystemInfo"]),
  75. setWeekModeTheme(weekMode) {
  76. if (weekMode) {
  77. document.body.classList.add("week-mode");
  78. } else {
  79. document.body.classList.remove("week-mode");
  80. }
  81. },
  82. setLanguage(lang) {
  83. this.$i18n.locale = lang;
  84. switch (lang) {
  85. case "CN":
  86. this.locale = require("ant-design-vue/es/locale-provider/zh_CN").default;
  87. break;
  88. case "HK":
  89. this.locale = require("ant-design-vue/es/locale-provider/zh_TW").default;
  90. break;
  91. case "US":
  92. default:
  93. this.locale = require("ant-design-vue/es/locale-provider/en_US").default;
  94. break;
  95. }
  96. },
  97. setHtmlTitle() {
  98. const route = this.$route;
  99. const key = route.path === "/" ? "home.name" : getI18nKey(route.matched[route.matched.length - 1].path);
  100. document.title = this.$t(key);
  101. },
  102. popContainer() {
  103. return document.getElementById("popContainer");
  104. },
  105. },
  106. };
  107. </script>
  108. <style lang="less">
  109. body,
  110. html {
  111. overflow: hidden;
  112. }
  113. </style>