import axios from 'axios' import { ElMessage } from 'element-plus' const request = axios.create({ baseURL: '/api', timeout: 30000, }) // 递归把响应里所有 +00:00 时区标识替换为 +08:00(数据库存北京时间,后端误标为 UTC) function fixDatetimeTZ(obj) { if (typeof obj === 'string') { return obj.replace(/T(\d{2}:\d{2}:\d{2})\+00:00/g, 'T$1+08:00') } if (Array.isArray(obj)) return obj.map(fixDatetimeTZ) if (obj && typeof obj === 'object') { const result = {} for (const k in obj) result[k] = fixDatetimeTZ(obj[k]) return result } return obj } request.interceptors.response.use( res => { const data = fixDatetimeTZ(res.data) if (data.code && data.code !== 200) { ElMessage.error(data.message || '请求失败') return Promise.reject(new Error(data.message)) } return data }, err => { const msg = err.response?.data?.detail || err.response?.data?.message || err.message || '网络错误' ElMessage.error(msg) return Promise.reject(err) } ) // Dashboard export const getDashboard = () => request.get('/dashboard') export const getTokenTrend = (days = 30) => request.get('/dashboard/token-trend', { params: { days } }) export const getMonthlyTokenTrend = () => request.get('/dashboard/monthly-token-trend') // Users export const getUsers = (params) => request.get('/users', { params }) export const createUser = (data) => request.post('/users', data) export const updateUser = (id, data) => request.put(`/users/${id}`, data) export const deleteUser = (id) => request.delete(`/users/${id}`) export const batchUserAction = (data) => request.post('/users/batch/action', data) export const loginUser = (id) => request.post(`/users/${id}/login`) export const logoutUser = (id) => request.post(`/users/${id}/logout`) export const generatePersonality = (id) => request.post(`/users/${id}/personality/generate`) export const updatePersonality = (id, data) => request.put(`/users/${id}/personality`, data) export const importUsers = (formData) => request.post('/users/excel/import', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) export const downloadTemplate = () => request.get('/users/excel/template', { responseType: 'blob' }) export const exportUsers = () => request.get('/users/excel/export', { responseType: 'blob' }) export const deduplicateUsers = () => request.post('/users/deduplicate') export const clearAllUsers = () => request.post('/users/clear-all') export const loginAllUsers = () => request.post('/users/login-all') export const syncAllProfiles = () => request.post('/users/sync-all-profiles') export const cancelInteraction = (id) => request.post(`/interactions/${id}/cancel`) export const runInteractionNow = () => request.post('/system/interaction/run-now') // Interactions export const getInteractions = (params) => request.get('/interactions', { params }) export const retryInteraction = (id) => request.post(`/interactions/${id}/retry`) export const exportInteractions = (params) => request.get('/interactions/export', { params, responseType: 'blob' }) // AI Models export const getAIModels = () => request.get('/ai-models') export const createAIModel = (data) => request.post('/ai-models', data) export const updateAIModel = (id, data) => request.put(`/ai-models/${id}`, data) export const deleteAIModel = (id) => request.delete(`/ai-models/${id}`) export const testAIModel = (data) => request.post('/ai-models/test', data) // System export const getSystemConfigs = () => request.get('/system/configs') export const updateSystemConfigs = (data) => request.put('/system/configs', data) export const toggleScheduler = (enabled) => request.post('/system/scheduler/toggle', { enabled }) export const resetAllSessions = () => request.post('/system/sessions/reset-all') // Logs export const getLoginLogs = (params) => request.get('/logs/login', { params }) export const getLogFiles = () => request.get('/logs/files') export const tailLogFile = (filename, lines = 100) => request.get(`/logs/files/${filename}/tail`, { params: { lines } }) export default request export const uploadAvatar = (userId, formData) => request.post(`/users/${userId}/upload-avatar`, formData, { headers: { "Content-Type": "multipart/form-data" } })