|
@@ -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;
|