App.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <template>
  2. <div id="app">
  3. <div v-if="loading" id="loader-wrapper">
  4. <div id="loader"></div>
  5. <div class="loader-section section-left"></div>
  6. <div class="loader-section section-right"></div>
  7. <div class="load_title">{{ loadingText }}</div>
  8. </div>
  9. <router-view />
  10. <theme-picker />
  11. </div>
  12. </template>
  13. <script>
  14. import ThemePicker from "@/components/ThemePicker";
  15. import { refreshToken } from "@/api/login";
  16. import { getToken } from "@/utils/auth";
  17. export default {
  18. name: "App",
  19. components: { ThemePicker },
  20. data() {
  21. return {
  22. timer: null,
  23. loading: true,
  24. loadingText: '正在加载系统资源,请耐心等待'
  25. };
  26. },
  27. methods: {
  28. async startTokenRefresh() {
  29. if (this.timer) {
  30. clearInterval(this.timer);
  31. }
  32. let outTime = 5 * 60 * 60 * 1000;
  33. this.timer = setInterval(async () => {
  34. try {
  35. if (!getToken()) return;
  36. const response = await refreshToken();
  37. console.log(object);
  38. } catch (error) {
  39. console.error("token刷新失败:", error);
  40. }
  41. }, outTime);
  42. },
  43. },
  44. mounted() {
  45. this.startTokenRefresh();
  46. },
  47. beforeDestroy() {
  48. if (this.timer) {
  49. clearInterval(this.timer);
  50. }
  51. },
  52. metaInfo() {
  53. // 获取cookie中的language值,默认为zh_CN
  54. const getLanguage = () => {
  55. const value = `; ${document.cookie}`;
  56. const parts = value.split(`; language=`);
  57. if (parts.length === 2) return parts.pop().split(';').shift();
  58. return 'zh_CN';
  59. };
  60. const language = getLanguage();
  61. console.log('language',language)
  62. const isChinese = language === 'zh_CN';
  63. const loadingTexts = {
  64. 'zh_CN': '正在加载系统资源,请耐心等待',
  65. 'en_US': 'Loading system resources, please wait'
  66. };
  67. this.loadingText = loadingTexts[language] || loadingTexts['zh_CN'];
  68. // 模拟加载完成
  69. setTimeout(() => {
  70. this.loading = false;
  71. }, 800);
  72. // 根据语言选择标题
  73. const mainTitle = isChinese
  74. ? process.env.VUE_APP_TITLE_ZH
  75. : process.env.VUE_APP_TITLE_EN;
  76. const pageTitle = this.$store.state.settings.dynamicTitle
  77. ? this.$store.state.settings.title
  78. : null;
  79. return {
  80. title: pageTitle,
  81. titleTemplate: (title) => {
  82. return title ? `${title} - ${mainTitle}` : mainTitle;
  83. },
  84. };
  85. },
  86. };
  87. </script>
  88. <style>
  89. #app .theme-picker {
  90. display: none;
  91. }
  92. #loader-wrapper {
  93. position: fixed;
  94. top: 0;
  95. left: 0;
  96. width: 100%;
  97. height: 100%;
  98. z-index: 999999;
  99. }
  100. #loader {
  101. display: block;
  102. position: relative;
  103. left: 50%;
  104. top: 50%;
  105. width: 150px;
  106. height: 150px;
  107. margin: -75px 0 0 -75px;
  108. border-radius: 50%;
  109. border: 3px solid transparent;
  110. border-top-color: #FFF;
  111. -webkit-animation: spin 2s linear infinite;
  112. -ms-animation: spin 2s linear infinite;
  113. -moz-animation: spin 2s linear infinite;
  114. -o-animation: spin 2s linear infinite;
  115. animation: spin 2s linear infinite;
  116. z-index: 1001;
  117. }
  118. #loader:before {
  119. content: "";
  120. position: absolute;
  121. top: 5px;
  122. left: 5px;
  123. right: 5px;
  124. bottom: 5px;
  125. border-radius: 50%;
  126. border: 3px solid transparent;
  127. border-top-color: #FFF;
  128. -webkit-animation: spin 3s linear infinite;
  129. -moz-animation: spin 3s linear infinite;
  130. -o-animation: spin 3s linear infinite;
  131. -ms-animation: spin 3s linear infinite;
  132. animation: spin 3s linear infinite;
  133. }
  134. #loader:after {
  135. content: "";
  136. position: absolute;
  137. top: 15px;
  138. left: 15px;
  139. right: 15px;
  140. bottom: 15px;
  141. border-radius: 50%;
  142. border: 3px solid transparent;
  143. border-top-color: #FFF;
  144. -moz-animation: spin 1.5s linear infinite;
  145. -o-animation: spin 1.5s linear infinite;
  146. -ms-animation: spin 1.5s linear infinite;
  147. -webkit-animation: spin 1.5s linear infinite;
  148. animation: spin 1.5s linear infinite;
  149. }
  150. @-webkit-keyframes spin {
  151. 0% {
  152. -webkit-transform: rotate(0deg);
  153. -ms-transform: rotate(0deg);
  154. transform: rotate(0deg);
  155. }
  156. 100% {
  157. -webkit-transform: rotate(360deg);
  158. -ms-transform: rotate(360deg);
  159. transform: rotate(360deg);
  160. }
  161. }
  162. @keyframes spin {
  163. 0% {
  164. -webkit-transform: rotate(0deg);
  165. -ms-transform: rotate(0deg);
  166. transform: rotate(0deg);
  167. }
  168. 100% {
  169. -webkit-transform: rotate(360deg);
  170. -ms-transform: rotate(360deg);
  171. transform: rotate(360deg);
  172. }
  173. }
  174. #loader-wrapper .loader-section {
  175. position: fixed;
  176. top: 0;
  177. width: 51%;
  178. height: 100%;
  179. background: #7171C6;
  180. z-index: 1000;
  181. -webkit-transform: translateX(0);
  182. -ms-transform: translateX(0);
  183. transform: translateX(0);
  184. }
  185. #loader-wrapper .loader-section.section-left {
  186. left: 0;
  187. }
  188. #loader-wrapper .loader-section.section-right {
  189. right: 0;
  190. }
  191. .loaded #loader-wrapper .loader-section.section-left {
  192. -webkit-transform: translateX(-100%);
  193. -ms-transform: translateX(-100%);
  194. transform: translateX(-100%);
  195. -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
  196. transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
  197. }
  198. .loaded #loader-wrapper .loader-section.section-right {
  199. -webkit-transform: translateX(100%);
  200. -ms-transform: translateX(100%);
  201. transform: translateX(100%);
  202. -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
  203. transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
  204. }
  205. .loaded #loader {
  206. opacity: 0;
  207. -webkit-transition: all 0.3s ease-out;
  208. transition: all 0.3s ease-out;
  209. }
  210. .loaded #loader-wrapper {
  211. visibility: hidden;
  212. -webkit-transform: translateY(-100%);
  213. -ms-transform: translateY(-100%);
  214. transform: translateY(-100%);
  215. -webkit-transition: all 0.3s 1s ease-out;
  216. transition: all 0.3s 1s ease-out;
  217. }
  218. #loader-wrapper .load_title {
  219. font-family: 'Open Sans';
  220. color: #FFF;
  221. font-size: 19px;
  222. width: 100%;
  223. text-align: center;
  224. z-index: 9999999999999;
  225. position: absolute;
  226. top: 60%;
  227. opacity: 1;
  228. line-height: 30px;
  229. }
  230. </style>