Files
huihuiSquare/frontend/src/api/index.js
T
stefanfeng b7f8ac203b feat: add avatar photo upload via Huihui filecenter
- Add POST /avatars/{id}/upload-photo endpoint
- Use Huihui platform's filecenter API for image upload (same signing mechanism as news_service)
- Add upload button in avatar list table
- Frontend: handleUploadPhoto function with el-upload component
- Updates avatar photo_url in SQLite after successful upload
2026-08-07 14:28:22 +08:00

99 lines
4.6 KiB
JavaScript

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 } })
// Avatars (数字分身管理)
export const getAvatars = (params) => request.get('/avatars', { params })
export const getAvatarDetail = (id) => request.get(`/avatars/${id}`)
export const updateAvatarStatus = (id, status) => request.put(`/avatars/${id}/status`, { status })
export const uploadAvatarPhoto = (id, formData) => request.post(`/avatars/${id}/upload-photo`, formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
export default request
export const uploadAvatar = (userId, formData) => request.post(`/users/${userId}/upload-avatar`, formData, { headers: { "Content-Type": "multipart/form-data" } })