From 7b3c222b24ea3f8e6f2dce1ba0df1fecf87d1a57 Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 15 Jan 2026 21:12:33 -0800 Subject: [PATCH] fix(admin-web): use dedicated trading client with correct base URL Trading API was incorrectly routed through mining-admin baseURL in production, causing 404 errors. Created independent tradingClient with /api/trading baseURL to properly route requests through Next.js rewrites to Kong -> trading-service. Co-Authored-By: Claude Opus 4.5 --- .../src/features/trading/api/trading.api.ts | 51 ++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/frontend/mining-admin-web/src/features/trading/api/trading.api.ts b/frontend/mining-admin-web/src/features/trading/api/trading.api.ts index e5c1fbdd..b5dea7e4 100644 --- a/frontend/mining-admin-web/src/features/trading/api/trading.api.ts +++ b/frontend/mining-admin-web/src/features/trading/api/trading.api.ts @@ -1,4 +1,41 @@ -import { apiClient } from '@/lib/api/client'; +import axios from 'axios'; + +// Trading API 需要独立的 baseURL,因为它走不同的路由 +// 生产环境: 通过 Next.js rewrite /api/trading/* -> Kong -> trading-service +// 开发环境: 通过 Next.js rewrite /api/trading/* -> trading-service +const tradingBaseURL = '/api/trading'; + +const tradingClient = axios.create({ + baseURL: tradingBaseURL, + timeout: 30000, + headers: { + 'Content-Type': 'application/json', + }, +}); + +tradingClient.interceptors.request.use( + (config) => { + const token = typeof window !== 'undefined' ? localStorage.getItem('admin_token') : null; + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => Promise.reject(error) +); + +tradingClient.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('admin_token'); + if (typeof window !== 'undefined' && !window.location.pathname.includes('/login')) { + window.location.href = '/login'; + } + } + return Promise.reject(error); + } +); export interface TradingStatus { initialized: boolean; @@ -41,26 +78,26 @@ export interface BurnRecordsResponse { export const tradingApi = { // 获取交易系统状态 getTradingStatus: async (): Promise => { - const response = await apiClient.get('/trading/admin/trading/status'); + const response = await tradingClient.get('/admin/trading/status'); // 后端返回 { success, data, timestamp } return response.data.data || response.data; }, // 激活交易系统 activateTrading: async (): Promise<{ success: boolean; message: string; activatedAt?: string }> => { - const response = await apiClient.post('/trading/admin/trading/activate'); + const response = await tradingClient.post('/admin/trading/activate'); return response.data; }, // 关闭交易系统 deactivateTrading: async (): Promise<{ success: boolean; message: string }> => { - const response = await apiClient.post('/trading/admin/trading/deactivate'); + const response = await tradingClient.post('/admin/trading/deactivate'); return response.data; }, // 获取销毁状态 getBurnStatus: async (): Promise => { - const response = await apiClient.get('/trading/burn/status'); + const response = await tradingClient.get('/burn/status'); // 后端返回 { success, data, timestamp } return response.data.data || response.data; }, @@ -78,7 +115,7 @@ export const tradingApi = { if (sourceType) { params.append('sourceType', sourceType); } - const response = await apiClient.get(`/trading/burn/records?${params.toString()}`); + const response = await tradingClient.get(`/burn/records?${params.toString()}`); // 后端返回 { data: [...], total: number } return response.data; }, @@ -95,7 +132,7 @@ export const tradingApi = { burnTarget: string; burnProgress: string; }> => { - const response = await apiClient.get('/trading/asset/market'); + const response = await tradingClient.get('/asset/market'); // 后端返回 { success, data, timestamp } return response.data.data; },