Просмотр исходного кода

feat(http): 优化HTTP配置管理实现全局环境配置缓存

- 添加全局环境配置缓存机制,避免在请求拦截器中重复调用store
- 实现updateHttpConfig函数用于动态更新HTTP配置
- 在main.ts中添加应用配置初始化逻辑
- 通过IPC获取应用配置并设置对应的API环境
- 在应用挂载后自动初始化应用配置
- 添加错误处理机制确保配置获取失败时使用默认环境
panqiuyao 1 день назад
Родитель
Сommit
a1fa80d7ef
2 измененных файлов с 51 добавлено и 7 удалено
  1. 30 0
      frontend/src/main.ts
  2. 21 7
      frontend/src/utils/http.ts

+ 30 - 0
frontend/src/main.ts

@@ -9,6 +9,33 @@ import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 import { lissenLog, log } from './utils/log'
 import useUserInfo from './stores/modules/user'
 import { startGenerateServer } from './utils/generateServer'
+import { updateHttpConfig } from './utils/http'
+import client from './stores/modules/client'
+import icpList from './utils/ipc'
+
+// 初始化应用配置
+function initializeAppConfig() {
+    try {
+        // 获取应用配置
+        const clientStore = client();
+        clientStore.ipc.send(icpList.utils.getAppConfig);
+        clientStore.ipc.once(icpList.utils.getAppConfig, (event, result) => {
+            console.log('应用配置已加载:', result);
+
+            // 设置HTTP配置
+            if (result && (result as any).env) {
+                updateHttpConfig((result as any).env);
+            } else {
+                // 如果没有配置,使用默认环境
+                updateHttpConfig('prod');
+            }
+        });
+    } catch (error) {
+        console.warn('获取应用配置失败,使用默认配置:', error);
+        // 使用默认环境
+        updateHttpConfig('prod');
+    }
+}
 
 const app = createApp(App)
 app.use(ElementPlus)
@@ -24,6 +51,9 @@ log(router)
 
 app.mount('#app')
 
+// 应用挂载后初始化应用配置
+initializeAppConfig()
+
 // 刷新后根据会话标记显示登录弹窗
 try {
     const flag = sessionStorage.getItem('NEED_LOGIN_MODAL')

+ 21 - 7
frontend/src/utils/http.ts

@@ -76,21 +76,35 @@ const service = axios.create({
 });
 console.log('__API__');
 
+// 全局环境配置缓存,避免在请求拦截器中调用store
+let cachedEnv = 'prod'; // 默认环境
+let cachedBaseURL = null;
+
+// 更新环境配置的函数
+export function updateHttpConfig(env: string) {
+    cachedEnv = env;
+    const apiConfig = ENV_CONFIG[env];
+    if (apiConfig?.api) {
+        cachedBaseURL = apiConfig.api;
+        console.log(`HTTP配置已更新: 环境=${env}, API地址=${cachedBaseURL}`);
+    }
+}
+
 // 请求拦截器
 service.interceptors.request.use(
     (config: AxiosRequestConfig) => {
 
-        // 动态设置baseURL
-        const appConfig = pinia.state.value.config?.appConfig;
-        let env = appConfig?.env || 'prod'; // 默认环境
-        if (env) {
-            // 从ENV_CONFIG获取对应环境的API地址
-            const apiConfig = ENV_CONFIG[env];
+        // 使用缓存的环境配置设置baseURL
+        if (cachedBaseURL) {
+            config.baseURL = cachedBaseURL;
+        } else {
+            // 如果缓存中没有,则尝试从ENV_CONFIG获取默认环境的地址
+            const apiConfig = ENV_CONFIG[cachedEnv];
             if (apiConfig?.api) {
                 config.baseURL = apiConfig.api;
             }
         }
-        console.log(`使用环境: ${env}, API地址: ${config.baseURL || '__API__'}`);
+        console.log(`使用环境: ${cachedEnv}, API地址: ${config.baseURL || '__API__'}`);
 
         // 在发送请求之前做些什么,例如添加 token
         const tokenInfoStore = tokenInfo();