Browse Source

feat:理由模块拦截

叶静 5 days ago
parent
commit
c799d1979c
3 changed files with 123 additions and 7 deletions
  1. 21 6
      .env.development
  2. 96 0
      src/sheep/config/api-routing.js
  3. 6 1
      src/sheep/request/index.js

+ 21 - 6
.env.development

@@ -7,17 +7,32 @@ SHEEP_BASE_URL = /
  SHEEP_DEV_BASE_URL = http://124.222.152.234:8501
 
 
-# 开发环境上传文件接口域名
- SHEEP_UPLOAD_BASE_URL = /operating
-
-
 # 开发模式端口号
 SHEEP_DEV_PORT = 3001
 # 预览模式端口号
-SHEEP_PREVIEW_PORT = 3002RR
+SHEEP_PREVIEW_PORT = 3002
 
 # 缓存前缀 使用localStorage
 SHEEP_CACHE_PREFIX = _SHEEP_
 
 # Mock 服务配置
-SHEEP_USE_MOCK = 
+SHEEP_USE_MOCK = false
+
+##### API路由配置
+# API路由功能总开关
+SHEEP_API_ROUTING_ENABLED = true
+
+# 各模块域名配置
+SHEEP_API_COMMON_BASE_URL = http://124.222.152.234:8501
+SHEEP_API_MALL_BASE_URL = http://124.222.152.234:8501
+SHEEP_API_CIF_BASE_URL = http://124.222.152.234:8501
+SHEEP_API_OPERATING_BASE_URL = http://124.222.152.234:8501
+
+# 各模块前缀替换配置(可选,不配置则不替换)
+# SHEEP_API_MALL_PREFIX = newmall
+# SHEEP_API_CIF_PREFIX = newcif
+# SHEEP_API_OPERATING_PREFIX = newoperating
+# SHEEP_API_COMMON_PREFIX = api
+
+# 兜底域名(路由匹配失败时使用)
+SHEEP_API_FALLBACK_BASE_URL = http://124.222.152.234:8501

+ 96 - 0
src/sheep/config/api-routing.js

@@ -0,0 +1,96 @@
+/**
+ * API路由配置管理器
+ * 支持多域名路由和前缀替换功能
+ */
+import { baseURL } from './index';
+
+class ApiRoutingManager {
+  constructor() {
+    // 功能开关
+    this.enabled = import.meta.env.SHEEP_API_ROUTING_ENABLED === 'true';
+
+    // 模块配置映射
+    this.moduleConfigs = {
+      '/mall': {
+        baseUrl: import.meta.env.SHEEP_API_MALL_BASE_URL,
+        prefix: import.meta.env.SHEEP_API_MALL_PREFIX,
+      },
+      '/cif': {
+        baseUrl: import.meta.env.SHEEP_API_CIF_BASE_URL,
+        prefix: import.meta.env.SHEEP_API_CIF_PREFIX,
+      },
+      '/operating': {
+        baseUrl: import.meta.env.SHEEP_API_OPERATING_BASE_URL,
+        prefix: import.meta.env.SHEEP_API_OPERATING_PREFIX,
+      },
+    };
+
+    // 通用接口配置(没有特定前缀的接口)
+    this.commonConfig = {
+      baseUrl: import.meta.env.SHEEP_API_COMMON_BASE_URL,
+      prefix: import.meta.env.SHEEP_API_COMMON_PREFIX,
+    };
+
+    // 兜底域名
+    this.fallbackBaseUrl = import.meta.env.SHEEP_API_FALLBACK_BASE_URL || baseURL;
+  }
+
+  /**
+   * 处理请求配置
+   * @param {Object} config - axios请求配置
+   * @returns {Object} 处理后的配置
+   */
+  processRequest(config) {
+    if (!this.enabled) return config;
+
+    const originalUrl = config.url;
+    let processedUrl = originalUrl;
+    let targetBaseUrl = this.fallbackBaseUrl;
+    let matchedModule = null;
+
+    // 标准化URL(确保以/开头)
+    const normalizedUrl = originalUrl.startsWith('/') ? originalUrl : `/${originalUrl}`;
+
+    // 查找匹配的模块配置
+    for (const [modulePrefix, moduleConfig] of Object.entries(this.moduleConfigs)) {
+      if (normalizedUrl.startsWith(modulePrefix)) {
+        matchedModule = modulePrefix;
+        // 设置目标域名
+        targetBaseUrl = moduleConfig.baseUrl || this.fallbackBaseUrl;
+
+        // 处理前缀替换
+        if (moduleConfig.prefix) {
+          processedUrl = normalizedUrl.replace(modulePrefix, `/${moduleConfig.prefix}`);
+        } else {
+          processedUrl = normalizedUrl;
+        }
+
+        break;
+      }
+    }
+
+    // 如果没有匹配到特定模块,检查是否配置了通用接口
+    if (!matchedModule && this.commonConfig.baseUrl) {
+      targetBaseUrl = this.commonConfig.baseUrl;
+
+      // 处理通用接口前缀替换
+      if (this.commonConfig.prefix) {
+        processedUrl = `/${this.commonConfig.prefix}${normalizedUrl}`;
+      } else {
+        processedUrl = normalizedUrl;
+      }
+
+      matchedModule = 'common';
+    }
+
+    return {
+      ...config,
+      url: processedUrl,
+      baseURL: targetBaseUrl,
+    };
+  }
+}
+
+// 导出单例实例
+export const apiRouting = new ApiRoutingManager();
+export default apiRouting;

+ 6 - 1
src/sheep/request/index.js

@@ -5,6 +5,7 @@ import $storage from '@/sheep/utils/storage';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { isNil } from 'lodash';
 import { baseURL } from '@/sheep/config';
+import { apiRouting } from '@/sheep/config/api-routing';
 
 const options = {
   // 显示操作成功消息 默认不显示
@@ -58,7 +59,11 @@ request.interceptors.request.use(
     $store('app').setRequestCounter(1);
     const token = $storage.get('token');
     if (token) config.headers['Accesstoken'] = token;
-    return config;
+
+    // 🔑 API路由处理
+    const processedConfig = apiRouting.processRequest(config);
+
+    return processedConfig;
   },
   (error) => {
     $store('app').setRequestCounter(-1);