/** * API配置文件 * 统一管理所有API地址,方便部署时修改 * 支持环境变量覆盖配置 */ // 环境配置类型 interface ApiConfig { // 主API基础URL baseUrl: string; // 文档服务URL documentUrl: string; // 文档上传API URL uploadUrl: string; // OAuth2.0配置 oauth: { // IDaaS服务器地址 serverUrl: string; // OAuth2应用Client ID clientId: string; // OAuth2应用Client Secret clientSecret: string; // 回调地址 redirectUri: string; // 应用ID(用于登出) appId: string; }; } // 不同环境的默认配置 // 由于合同模板的上传,后续的的uploadUrl都不需要/upload,直接写/admin/documents,由程序自动添加/upload或/upload_contract_template const configs: Record = { // 开发环境 development: { // baseUrl: '/api', // 改为相对路径,让nginx处理 baseUrl: 'http://172.16.0.55:8008', // baseUrl: 'http://nas.7bm.co:3000', documentUrl: 'http://172.16.0.55:8008/docauditai/', // documentUrl: '/api/docauditai/', // uploadUrl: '/api/admin/documents', // 改为相对路径 uploadUrl: 'http://172.16.0.55:8008/admin/documents', oauth: { serverUrl: 'http://10.79.112.85', // IDaaS服务器地址 clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', // 需要替换为实际的Client Secret redirectUri: 'http://10.79.97.17/callback', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 } }, // 测试环境 testing: { baseUrl: 'http://nas.7bm.co:3000', documentUrl: 'http://nas.7bm.co:9000/docauditai/', uploadUrl: 'http://172.16.0.58:8008/admin/documents/upload', oauth: { serverUrl: 'http://10.79.112.85', // IDaaS服务器地址 clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', // 需要替换为实际的Client ID clientSecret: 'your_client_secret', // 需要替换为实际的Client Secret redirectUri: 'http://nas.7bm.co:3000/callback', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 } }, // 生产环境 production: { // postgrest baseUrl: 'http://10.79.97.17:8000', // minio documentUrl: 'http://10.76.244.156:9000/docauditai/', // 文件上传 uploadUrl: 'http://10.79.97.17:8000/admin/documents', oauth: { serverUrl: 'http://10.79.112.85', // IDaaS服务器地址 clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', // 需要替换为实际的Client Secret redirectUri: 'http://10.79.97.17/callback', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 } }, // 备用配置 (可以根据需要添加更多环境) staging: { baseUrl: 'http://172.16.0.119:9000/admin', documentUrl: 'http://nas.7bm.co:9000/docauditai/', uploadUrl: 'http://172.16.0.119:8000/admin/documents/upload', oauth: { serverUrl: 'http://10.79.112.85', // IDaaS服务器地址 clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', // 需要替换为实际的Client ID clientSecret: 'your_client_secret', // 需要替换为实际的Client Secret redirectUri: 'http://172.16.0.119:3000/callback', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 } } }; // 客户端特定配置 - 支持多客户端部署 // 根据环境自动选择配置 const getClientConfigs = (env: string): Record> => { if (env === 'development') { // 开发环境 - 本地nginx代理配置 return { 'client-a': { baseUrl: '/api', // 改为相对路径,让nginx处理 uploadUrl: '/api/admin/documents', // 改为相对路径 documentUrl: '/api/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://172.16.0.34:5174/callback', appId: 'idaasoauth2' } }, 'client-b': { baseUrl: '/api', // 改为相对路径,让nginx处理 uploadUrl: '/api/admin/documents', // 改为相对路径 documentUrl: '/api/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://172.16.0.34:5175/callback', appId: 'idaasoauth2' } }, 'client-c': { baseUrl: '/api', // 改为相对路径,让nginx处理 uploadUrl: '/api/admin/documents', // 改为相对路径 documentUrl: '/api/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://172.16.0.34:5176/callback', appId: 'idaasoauth2' } }, 'client-d': { baseUrl: '/api', // 改为相对路径,让nginx处理 uploadUrl: '/api/admin/documents', // 改为相对路径 documentUrl: '/api/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://172.16.0.34:5177/callback', appId: 'idaasoauth2' } } }; } else { // 生产环境 - 服务器配置 return { 'provincial': { baseUrl: 'http://10.79.97.17:51704', uploadUrl: 'http://10.79.97.17:51704/admin/documents', documentUrl: 'http://10.76.244.156:9000/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://10.79.97.17/callback', appId: 'idaasoauth2' } }, 'meizhou': { baseUrl: 'http://10.79.97.17:51705', uploadUrl: 'http://10.79.97.17:51705/admin/documents', documentUrl: 'http://10.76.244.156:9000/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://10.79.97.17/callback', appId: 'idaasoauth2' } }, 'jieyang': { baseUrl: 'http://10.79.97.17:51706', uploadUrl: 'http://10.79.97.17:51706/admin/documents', documentUrl: 'http://10.76.244.156:9000/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://10.79.97.17/callback', appId: 'idaasoauth2' } }, 'yunfu': { baseUrl: 'http://10.79.97.17:51707', uploadUrl: 'http://10.79.97.17:51707/admin/documents', documentUrl: 'http://10.76.244.156:9000/docauditai/', oauth: { serverUrl: 'http://10.79.112.85', clientId: '54d2a619fe5c81ae1250434c441fccccqMtKwh7H4fO', clientSecret: 'VYk1AC5XIJEfnEXwyq0u9JEY3fi3byCfSD58zANGeb', redirectUri: 'http://10.79.97.17/callback', appId: 'idaasoauth2' } } }; } }; // 获取当前环境,默认为development const getCurrentEnvironment = (): string => { // 优先使用环境变量,然后使用 NODE_ENV return process.env.NEXT_PUBLIC_API_ENV || process.env.NODE_ENV || 'development'; }; // 获取客户端ID - 支持从请求头动态获取 const getClientId = (request?: Request): string => { // SSR: 通过请求头的 host 判断 if (request && typeof window === 'undefined') { // 1. 优先 X-Client-ID const clientIdFromHeader = request.headers.get('X-Client-ID'); if (clientIdFromHeader) return clientIdFromHeader; // 2. 通过 host 端口判断 const host = request.headers.get('host'); // 例如 172.24.238.60:5177 if (host) { const port = host.split(':')[1]; const portToClient: Record = { '5174': 'client-a', '5175': 'client-b', '5176': 'client-c', '5177': 'client-d' }; if (port && portToClient[port]) { return portToClient[port]; } } } // 浏览器端 if (typeof window !== 'undefined') { const port = window.location.port; const portToClient: Record = { '5174': 'client-a', '5175': 'client-b', '5176': 'client-c', '5177': 'client-d' }; if (port && portToClient[port]) { console.log(`🎯 浏览器端检测到客户端ID: ${portToClient[port]} (端口: ${port})`); return portToClient[port]; } } // 回退到环境变量 return process.env.CLIENT_ID || process.env.NEXT_PUBLIC_CLIENT_ID || 'main'; }; // 从环境变量获取配置,如果环境变量不存在则使用默认配置 const getConfigFromEnv = (defaultConfig: ApiConfig): ApiConfig => { return { baseUrl: process.env.NEXT_PUBLIC_API_BASE_URL || defaultConfig.baseUrl, documentUrl: process.env.NEXT_PUBLIC_DOCUMENT_URL || defaultConfig.documentUrl, uploadUrl: process.env.NEXT_PUBLIC_UPLOAD_URL || defaultConfig.uploadUrl, oauth: { serverUrl: process.env.NEXT_PUBLIC_OAUTH_SERVER_URL || defaultConfig.oauth.serverUrl, clientId: process.env.NEXT_PUBLIC_OAUTH_CLIENT_ID || defaultConfig.oauth.clientId, clientSecret: process.env.NEXT_PUBLIC_OAUTH_CLIENT_SECRET || defaultConfig.oauth.clientSecret, redirectUri: process.env.NEXT_PUBLIC_OAUTH_REDIRECT_URI || defaultConfig.oauth.redirectUri, appId: process.env.NEXT_PUBLIC_OAUTH_APP_ID || defaultConfig.oauth.appId } }; }; // 获取当前配置 - 支持客户端特定配置 const getCurrentConfig = (request?: Request): ApiConfig => { const env = getCurrentEnvironment(); const clientId = getClientId(request); const defaultConfig = configs[env] || configs.development; // 获取当前环境的客户端特定配置 const clientConfigs = getClientConfigs(env); const clientConfig = clientConfigs[clientId]; // 合并默认配置和客户端特定配置 let finalConfig = defaultConfig; if (clientConfig) { finalConfig = { ...defaultConfig, ...clientConfig, oauth: { ...defaultConfig.oauth, ...clientConfig.oauth } }; } // 如果是浏览器环境,尝试从环境变量覆盖配置 if (typeof window !== 'undefined' || process.env.NEXT_PUBLIC_API_BASE_URL) { return getConfigFromEnv(finalConfig); } return finalConfig; }; // 导出当前环境的配置(静态,用于兼容性) export const apiConfig = getCurrentConfig(); // 导出动态配置获取函数(支持从请求头获取客户端ID) export const getApiConfig = (request?: Request): ApiConfig => { return getCurrentConfig(request); }; // 导出具体的配置项,方便使用(现在是真正动态的) // 使用getter函数实现动态获取,避免ES模块中exports未定义的问题 export const API_BASE_URL = { get value() { return getCurrentConfig().baseUrl; } }; export const DOCUMENT_URL = { get value() { return getCurrentConfig().documentUrl; } }; export const UPLOAD_URL = { get value() { return getCurrentConfig().uploadUrl; } }; export const OAUTH_CONFIG = { get value() { return getCurrentConfig().oauth; } }; // 动态获取配置项的函数 export const getApiBaseUrl = (request?: Request): string => { return getApiConfig(request).baseUrl; }; export const getUploadUrl = (request?: Request): string => { return getApiConfig(request).uploadUrl; }; export const getOAuthConfig = (request?: Request) => { return getApiConfig(request).oauth; }; // 导出所有配置,供调试使用 export { configs }; // 工具函数:设置环境(主要用于测试) export const setEnvironment = (env: string): ApiConfig => { return configs[env] || configs.development; }; // 调试信息(仅在开发环境显示) // if (process.env.NODE_ENV === 'development') { // console.log('📦 API配置信息:', { // environment: getCurrentEnvironment(), // config: apiConfig // }); // }