Sfoglia il codice sorgente

优化 router & stores 调用顺序

cc12458 1 mese fa
parent
commit
bb9a2274ee
6 ha cambiato i file con 23 aggiunte e 12 eliminazioni
  1. 2 2
      src/App.vue
  2. 6 0
      src/loader/index.ts
  3. 0 2
      src/loader/launch.loader.ts
  4. 10 6
      src/request/alova.ts
  5. 0 1
      src/router/index.ts
  6. 5 1
      src/stores/index.ts

+ 2 - 2
src/App.vue

@@ -4,8 +4,8 @@ const theme = ref<'light' | 'dark'>('dark');
 </script>
 <template>
   <van-config-provider :theme>
-    <router-view class="page-container" v-slot="{ Component }">
-      <component :is="Component" />
+    <router-view class="page-container" v-slot="{ Component, route }">
+      <component :is="Component" :key="route.path" />
     </router-view>
   </van-config-provider>
 </template>

+ 6 - 0
src/loader/index.ts

@@ -4,8 +4,14 @@ import { createApp } from 'vue';
 import { Toast } from '@/platform/toast.ui';
 import { getApplicationMethod } from '@/request/api';
 
+import router from '@/router';
+import pinia from '@/stores';
+
 export default async function Loader(component: Component, ...loader: DEV.Loader[]) {
   const app = createApp(component);
+  app.use(router);
+  app.use(pinia);
+
   const toast = Toast.loading(500);
 
   try {

+ 0 - 2
src/loader/launch.loader.ts

@@ -5,8 +5,6 @@ const components = import.meta.glob('@/pages/**/*.vue');
 
 export default function launchLoader(container = '#app'): DEV.Loader {
   return async function (app, config) {
-    app.use(router);
-    app.use(pinia);
 
     let currentRoute = router.currentRoute.value.fullPath;
     if (currentRoute === '/') currentRoute = '/screen';

+ 10 - 6
src/request/alova.ts

@@ -1,18 +1,18 @@
-import adapterMock                                  from '@/request/mock';
-import pinia, { useAccountStore, usePlatformStore } from '@/stores';
-
 import { createAlova } from 'alova';
 import adapterFetch    from 'alova/fetch';
 import VueHook         from 'alova/vue';
+import adapterMock     from '@/request/mock';
 
+import { getPinia, useAccountStore, usePlatformStore } from '@/stores';
+import router from '@/router';
 
 export default createAlova({
   baseURL: import.meta.env.SIX_REQUEST_BASE ?? '/',
   statesHook: VueHook,
   requestAdapter: import.meta.env.DEV ? adapterMock() : adapterFetch(),
   async beforeRequest(method) {
-    const store = usePlatformStore(pinia);
-    method.config.headers.warrant ??= store.serialNumber;
+    const pinia = getPinia();
+    method.config.headers.warrant ??= usePlatformStore(pinia).serialNumber;
     if ( !method.config.meta?.ignoreToken ) method.config.headers.Authorization ??= useAccountStore(pinia).token;
   },
   responded: {
@@ -25,7 +25,11 @@ export default createAlova({
         /* 接口修正 code */
         if ( result.success === true || result.code === 200 ) result.code = 0;
         const { success = false, code = success ? 0 : -1, data, msg: message = '未知错误', ...props } = result;
-        if ( code === 0 ) { return data; } else {}
+        if ( code === 0 ) { return data; }
+        else if (code === 401) {
+          useAccountStore(getPinia()).$reset();
+          await router.replace({ name: 'login', replace: true });
+        }
         throw { ...props, message: `${ message }` };
       } catch ( e: any ) {
         if ( !method.meta?.ignoreException ) {

+ 0 - 1
src/router/index.ts

@@ -1,6 +1,5 @@
 import { createRouter, createWebHistory } from 'vue-router';
 
-
 const router = createRouter({
   history: createWebHistory(import.meta.env.BASE_URL),
   routes: [

+ 5 - 1
src/stores/index.ts

@@ -1,4 +1,4 @@
-import { createPinia }          from 'pinia';
+import { createPinia, getActivePinia, type Pinia } from 'pinia';
 import { createPersistedState } from 'pinia-plugin-persistedstate';
 
 
@@ -16,3 +16,7 @@ export { usePlatformStore }     from './platform.store';
 export { useAccountStore }      from './account.store';
 export { useFlowStore }         from './flow.store';
 export { useVisitor }     from './visitor.store';
+
+export function getPinia() {
+  return getActivePinia() ?? pinia;
+}