import axios, { AxiosInstance, AxiosError } from 'axios' import type { ApiResponse } from '../types' import { getToken, setToken, removeToken } from '../utils' import { wsManager } from './websocket' /** * API 基础配置 */ const apiClient: AxiosInstance = axios.create({ baseURL: '/api', timeout: 30000, headers: { 'Content-Type': 'application/json' } }) /** * 请求拦截器 */ apiClient.interceptors.request.use( (config) => { // 从 localStorage 读取 token 并添加到请求头 const token = getToken() if (token) { config.headers.Authorization = `Bearer ${token}` } return config }, (error) => { return Promise.reject(error) } ) /** * 响应拦截器 */ apiClient.interceptors.response.use( (response) => { // 检查响应头中是否有新的 token(自动刷新) const newToken = response.headers['x-new-token'] if (newToken) { setToken(newToken) } return response }, (error: AxiosError>) => { if (error.response) { const response = error.response const data = response.data // 检查是否是认证错误(2001-2999) if (data && data.code >= 2001 && data.code < 3000) { // 清除 token removeToken() // 断开 WebSocket 连接 wsManager.disconnect() // 跳转到登录页(避免循环跳转) if (window.location.pathname !== '/login' && window.location.pathname !== '/reset-password') { window.location.href = '/login' } } console.error('API 错误:', data) } else if (error.request) { console.error('网络错误:', error.request) } else { console.error('请求错误:', error.message) } return Promise.reject(error) } ) /** * API 服务 */ export const apiService = { /** * 用户管理 API */ users: { /** * 获取用户列表 */ list: () => apiClient.post>('/users/list', {}), /** * 创建用户 */ create: (data: { username: string; password: string }) => apiClient.post>('/users/create', data), /** * 更新用户密码 */ updatePassword: (data: { userId: number; newPassword: string }) => apiClient.post>('/users/update-password', data), /** * 删除用户 */ delete: (data: { userId: number }) => apiClient.post>('/users/delete', data), /** * 用户修改自己的密码 */ updateOwnPassword: (data: { newPassword: string }) => apiClient.post>('/users/update-own-password', data) }, /** * 认证 API */ auth: { /** * 登录 */ login: (data: { username: string; password: string }) => apiClient.post>('/auth/login', data), /** * 重置密码 */ resetPassword: (data: { resetKey: string; username: string; newPassword: string }) => apiClient.post>('/auth/reset-password', data), /** * 检查是否首次使用 */ checkFirstUse: () => apiClient.post>('/auth/check-first-use', {}) }, /** * 账户管理 API */ accounts: { /** * 导入账户 */ import: (data: any) => apiClient.post>('/copy-trading/accounts/import', data), /** * 更新账户 */ update: (data: any) => apiClient.post>('/copy-trading/accounts/update', data), /** * 删除账户 */ delete: (data: { accountId: number }) => apiClient.post>('/copy-trading/accounts/delete', data), /** * 查询账户列表 */ list: () => apiClient.post>('/copy-trading/accounts/list', {}), /** * 查询账户详情 */ detail: (data: { accountId?: number }) => apiClient.post>('/copy-trading/accounts/detail', data), /** * 查询账户余额 */ balance: (data: { accountId?: number }) => apiClient.post>('/copy-trading/accounts/balance', data), /** * 设置默认账户 */ setDefault: (data: { accountId: number }) => apiClient.post>('/copy-trading/accounts/set-default', data), /** * 查询所有账户的仓位列表 */ positionsList: () => apiClient.post>('/copy-trading/accounts/positions/list', {}), /** * 卖出仓位 */ sellPosition: (data: any) => apiClient.post>('/copy-trading/accounts/positions/sell', data), /** * 获取可赎回仓位统计 */ getRedeemableSummary: (data: { accountId?: number }) => apiClient.post>('/copy-trading/accounts/positions/redeemable-summary', data), /** * 赎回仓位 */ redeemPositions: (data: any) => apiClient.post>('/copy-trading/accounts/positions/redeem', data), }, /** * 市场数据 API */ markets: { /** * 获取市场价格(通过 Gamma API) */ getMarketPrice: (data: { marketId: string }) => apiClient.post>('/copy-trading/markets/price', data), /** * 获取最新价(从订单表获取,供前端下单时显示) */ getLatestPrice: (data: { tokenId: string }) => apiClient.post>('/copy-trading/markets/latest-price', data) }, /** * Leader 管理 API */ leaders: { /** * 添加 Leader */ add: (data: { leaderAddress: string; leaderName?: string; category?: string }) => apiClient.post>('/copy-trading/leaders/add', data), /** * 更新 Leader */ update: (data: { leaderId: number; leaderName?: string; category?: string }) => apiClient.post>('/copy-trading/leaders/update', data), /** * 删除 Leader */ delete: (data: { leaderId: number }) => apiClient.post>('/copy-trading/leaders/delete', data), /** * 查询 Leader 列表 */ list: (data: { category?: string } = {}) => apiClient.post>('/copy-trading/leaders/list', data), /** * 查询 Leader 详情 */ detail: (data: { leaderId: number }) => apiClient.post>('/copy-trading/leaders/detail', data) }, /** * 跟单模板管理 API(子菜单:跟单模板) */ templates: { /** * 创建模板 */ create: (data: any) => apiClient.post>('/copy-trading/templates/create', data), /** * 更新模板 */ update: (data: any) => apiClient.post>('/copy-trading/templates/update', data), /** * 删除模板 */ delete: (data: { templateId: number }) => apiClient.post>('/copy-trading/templates/delete', data), /** * 复制模板 */ copy: (data: any) => apiClient.post>('/copy-trading/templates/copy', data), /** * 查询模板列表 */ list: () => apiClient.post>('/copy-trading/templates/list', {}), /** * 查询模板详情 */ detail: (data: { templateId: number }) => apiClient.post>('/copy-trading/templates/detail', data) }, /** * 跟单配置管理 API(子菜单:跟单配置) */ copyTrading: { /** * 创建跟单 */ create: (data: { accountId: number; templateId: number; leaderId: number; enabled?: boolean }) => apiClient.post>('/copy-trading/create', data), /** * 查询跟单列表 */ list: (data: { accountId?: number; templateId?: number; leaderId?: number; enabled?: boolean } = {}) => apiClient.post>('/copy-trading/list', data), /** * 更新跟单状态 */ updateStatus: (data: { copyTradingId: number; enabled: boolean }) => apiClient.post>('/copy-trading/update-status', data), /** * 删除跟单 */ delete: (data: { copyTradingId: number }) => apiClient.post>('/copy-trading/delete', data), /** * 查询钱包绑定的模板 */ getAccountTemplates: (data: { accountId: number }) => apiClient.post>('/copy-trading/account-templates', data) }, /** * 订单管理 API */ orders: { /** * 查询跟单订单列表 */ list: (data: any) => apiClient.post>('/copy-trading/orders/list', data), /** * 取消跟单订单 */ cancel: (data: { copyOrderId: number }) => apiClient.post>('/copy-trading/orders/cancel', data) }, /** * 统计 API */ statistics: { /** * 获取全局统计 */ global: (data: { startTime?: number; endTime?: number } = {}) => apiClient.post>('/copy-trading/statistics/global', data), /** * 获取 Leader 统计 */ leader: (data: { leaderId: number; startTime?: number; endTime?: number }) => apiClient.post>('/copy-trading/statistics/leader', data), /** * 获取分类统计 */ category: (data: { category: string; startTime?: number; endTime?: number }) => apiClient.post>('/copy-trading/statistics/category', data), /** * 获取跟单关系统计详情 */ detail: (data: { copyTradingId: number }) => apiClient.post>('/copy-trading/statistics/detail', data) }, /** * 订单跟踪 API */ orderTracking: { /** * 查询订单列表(买入/卖出/匹配) */ list: (data: any) => apiClient.post>('/copy-trading/orders/tracking', data) } } export default apiClient