feat: AI虚拟用户新闻互动系统 v1.3.0 初始提交

- 虚拟用户管理(昵称/头像/性别/简介/邮箱同步到目标平台)
- AI互动调度(点赞/收藏/评论/转发)
- 日志时间改为北京时间
- 评论达上限后继续执行点赞收藏转发
- 一键登出全部功能
- 浅色主题UI
This commit is contained in:
stefanfeng
2026-03-31 10:20:57 +08:00
commit 0cfc9bf9c8
53 changed files with 8457 additions and 0 deletions

76
frontend/src/api/index.js Normal file
View File

@@ -0,0 +1,76 @@
import axios from 'axios'
import { ElMessage } from 'element-plus'
const request = axios.create({
baseURL: '/api',
timeout: 30000,
})
request.interceptors.response.use(
res => {
const data = 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" } })