初始提交: Qihu-AIFlow v2.0.1 完整项目
- 前端 React+TypeScript (源码+构建产物) - 后端 Python FastAPI - 数据库迁移 001-015 - Docker部署配置 - 微信ClawBot API频道绑定 - 项目文档 README.md
This commit is contained in:
commit
78ff261b5a
199 files changed
+69126
No files matched your search
@@ -0,0 +1,507 @@
|
||||
/**
|
||||
* AIFlow API 客户端
|
||||
* 统一管理所有前后端API请求
|
||||
*/
|
||||
const API_BASE = '/app/api';
|
||||
|
||||
// 从localStorage获取token
|
||||
function getToken(): string | null {
|
||||
return localStorage.getItem('aiflow_token');
|
||||
}
|
||||
|
||||
// 通用请求方法
|
||||
async function request<T>(
|
||||
endpoint: string,
|
||||
options: RequestInit = {}
|
||||
): Promise<{ code: number; data: T; message: string }> {
|
||||
const token = getToken();
|
||||
const headers: Record<string, string> = {
|
||||
'Content-Type': 'application/json',
|
||||
...(options.headers as Record<string, string> || {}),
|
||||
};
|
||||
if (token) {
|
||||
headers['Authorization'] = `Bearer ${token}`;
|
||||
}
|
||||
const res = await fetch(`${API_BASE}${endpoint}`, {
|
||||
...options,
|
||||
headers,
|
||||
});
|
||||
if (res.status === 401) {
|
||||
// 登录接口的401需要精确提示(用户名不存在 / 密码错误)
|
||||
if (endpoint === '/auth/login') {
|
||||
const err = await res.json().catch(() => ({ detail: '登录失败' }));
|
||||
const error: any = new Error(err.detail || '登录失败');
|
||||
error.status = 401;
|
||||
error.detail = err.detail;
|
||||
throw error;
|
||||
}
|
||||
// 其他接口的401 = token过期/未登录,清除状态并跳转
|
||||
localStorage.removeItem('aiflow_token');
|
||||
localStorage.removeItem('aiflow_user');
|
||||
window.location.hash = '#/login';
|
||||
throw new Error('未登录');
|
||||
}
|
||||
if (!res.ok) {
|
||||
const err = await res.json().catch(() => ({ detail: '请求失败' }));
|
||||
const error: any = new Error(err.detail || err.message || '请求失败');
|
||||
error.status = res.status;
|
||||
error.response = { status: res.status, data: err };
|
||||
error.detail = err.detail;
|
||||
throw error;
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
// GET请求
|
||||
function get<T>(endpoint: string): Promise<{ code: number; data: T; message: string }> {
|
||||
return request<T>(endpoint);
|
||||
}
|
||||
|
||||
// POST请求
|
||||
function post<T>(endpoint: string, body?: any): Promise<{ code: number; data: T; message: string }> {
|
||||
return request<T>(endpoint, {
|
||||
method: 'POST',
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
});
|
||||
}
|
||||
|
||||
// PUT请求
|
||||
function put<T>(endpoint: string, body?: any): Promise<{ code: number; data: T; message: string }> {
|
||||
return request<T>(endpoint, {
|
||||
method: 'PUT',
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
});
|
||||
}
|
||||
|
||||
// DELETE请求
|
||||
function del<T>(endpoint: string): Promise<{ code: number; data: T; message: string }> {
|
||||
return request<T>(endpoint, { method: 'DELETE' });
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 认证相关API
|
||||
// ============================================================
|
||||
export const authAPI = {
|
||||
login: (username: string, password: string) =>
|
||||
post<any>('/auth/login', { username, password }),
|
||||
register: (data: { username: string; password: string; email?: string; phone?: string }) =>
|
||||
post<any>('/auth/register', data),
|
||||
getMe: () => get<any>('/auth/me'),
|
||||
logout: () => post<any>('/auth/logout'),
|
||||
getSettings: () => get<any>('/auth/settings'),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 聊天相关API
|
||||
// ============================================================
|
||||
export const chatAPI = {
|
||||
getConversations: (status?: string) =>
|
||||
get<any[]>(`/chat/conversations${status ? `?status=${status}` : ''}`),
|
||||
createConversation: (data: { title: string; model_id?: string }) =>
|
||||
post<any>('/chat/conversations', data),
|
||||
updateConversation: (id: string, data: any) =>
|
||||
put<any>(`/chat/conversations/${id}`, data),
|
||||
deleteConversation: (id: string) =>
|
||||
del<any>(`/chat/conversations/${id}`),
|
||||
getMessages: (convId: string) =>
|
||||
get<any[]>(`/chat/conversations/${convId}/messages`),
|
||||
sendMessage: (convId: string, data: { content: string; model_id?: string; agent_ids?: string[]; skill_ids?: string[]; knowledge_ids?: string[]; use_tools?: boolean }) =>
|
||||
post<any>(`/chat/conversations/${convId}/messages`, data),
|
||||
clearContext: (convId: string) =>
|
||||
post<any>(`/chat/conversations/${convId}/clear`),
|
||||
convertToKnowledgeGraph: (convId: string) =>
|
||||
post<any>(`/chat/conversations/${convId}/to-knowledge-graph`),
|
||||
getModels: () => get<any[]>('/chat/models'),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 频道相关API
|
||||
// ============================================================
|
||||
export const channelAPI = {
|
||||
getChannels: () => get<any[]>('/channels/'),
|
||||
createChannel: (data: any) => post<any>('/channels/', data),
|
||||
getChannel: (id: string) => get<any>(`/channels/${id}`),
|
||||
updateChannel: (id: string, data: any) => put<any>(`/channels/${id}`, data),
|
||||
deleteChannel: (id: string) => del<any>(`/channels/${id}`),
|
||||
connectChannel: (id: string) => post<any>(`/channels/${id}/connect`),
|
||||
disconnectChannel: (id: string) => post<any>(`/channels/${id}/disconnect`),
|
||||
getPlatformConfigs: () => get<any>('/channels/platforms/config'),
|
||||
webhookMessage: (id: string, data: { from_user: string; content: string; message_type?: string }) =>
|
||||
post<any>(`/channels/${id}/webhook`, data),
|
||||
getMembers: (id: string) => get<any[]>(`/channels/${id}/members`),
|
||||
addMember: (id: string, userId: string) => post<any>(`/channels/${id}/members`, { user_id: userId }),
|
||||
removeMember: (id: string, userId: string) => del<any>(`/channels/${id}/members/${userId}`),
|
||||
getMessages: (id: string, params?: { limit?: number; offset?: number }) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params?.limit) sp.set('limit', String(params.limit));
|
||||
if (params?.offset) sp.set('offset', String(params.offset));
|
||||
const qs = sp.toString();
|
||||
return get<any[]>(`/channels/${id}/messages${qs ? `?${qs}` : ''}`);
|
||||
},
|
||||
sendMessage: (id: string, content: string) => post<any>(`/channels/${id}/messages`, { content }),
|
||||
authorize: (platform: string) => post<any>('/channels/authorize', { platform }),
|
||||
scanAuthorize: (platform: string, credentials?: Record<string, string>) => post<any>(`/channels/authorize/scan?platform=${platform}`, credentials ? { credentials } : {}),
|
||||
scanAuthorizeStatus: (platform: string) => post<any>(`/channels/authorize/scan/status?platform=${platform}`),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 知识库相关API
|
||||
// ============================================================
|
||||
export const knowledgeAPI = {
|
||||
getBases: () => get<any[]>('/knowledge/bases'),
|
||||
createBase: (data: any) => post<any>('/knowledge/bases', data),
|
||||
getBase: (id: string) => get<any>(`/knowledge/bases/${id}`),
|
||||
updateBase: (id: string, data: any) => put<any>(`/knowledge/bases/${id}`, data),
|
||||
deleteBase: (id: string) => del<any>(`/knowledge/bases/${id}`),
|
||||
getDocuments: (baseId: string) => get<any>(`/knowledge/bases/${baseId}/documents`),
|
||||
getDocument: (baseId: string, docId: string) => get<any>(`/knowledge/bases/${baseId}/documents/${docId}`),
|
||||
uploadDocument: (baseId: string, data: any) => post<any>(`/knowledge/bases/${baseId}/documents`, data),
|
||||
deleteDocument: (baseId: string, docId: string) => del<any>(`/knowledge/bases/${baseId}/documents/${docId}`),
|
||||
getDirectories: () => get<any[]>('/knowledge/directories'),
|
||||
createDirectory: (data: any) => post<any>('/knowledge/directories', data),
|
||||
buildGraph: (baseId: string) => post<any>(`/knowledge/bases/${baseId}/build-graph`),
|
||||
getGraph: (baseId: string) => get<any>(`/knowledge/bases/${baseId}/graph`),
|
||||
searchQA: (baseId: string, question: string) => post<any>('/knowledge/qa', { base_id: baseId, question }),
|
||||
searchDocuments: (baseId: string, keyword: string) => get<any[]>(`/knowledge/bases/${baseId}/search?keyword=${encodeURIComponent(keyword)}`),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 应用市场相关API
|
||||
// ============================================================
|
||||
export const marketAPI = {
|
||||
getApps: (params?: { type?: string; source?: string; search?: string; page?: number; page_size?: number }) => {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.type) searchParams.set('type', params.type);
|
||||
if (params?.source) searchParams.set('source', params.source);
|
||||
if (params?.search) searchParams.set('search', params.search);
|
||||
if (params?.page) searchParams.set('page', String(params.page));
|
||||
if (params?.page_size) searchParams.set('page_size', String(params.page_size));
|
||||
const qs = searchParams.toString();
|
||||
return get<any>(`/market/apps${qs ? `?${qs}` : ''}`);
|
||||
},
|
||||
getApp: (id: string) => get<any>(`/market/apps/${id}`),
|
||||
createApp: (data: any) => post<any>('/market/apps', data),
|
||||
purchaseApp: (id: string) => post<any>(`/market/apps/${id}/purchase`),
|
||||
installApp: (id: string) => post<any>(`/market/apps/${id}/install`),
|
||||
uninstallApp: (id: string) => del<any>(`/market/apps/${id}/uninstall`),
|
||||
reviewApp: (id: string, data: { rating: number; content?: string }) =>
|
||||
post<any>(`/market/apps/${id}/review`, data),
|
||||
getMyApps: () => get<any[]>('/market/my-apps'),
|
||||
getReviews: (appId: string) => get<any[]>(`/market/reviews/${appId}`),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// Token相关API
|
||||
// ============================================================
|
||||
export const tokenAPI = {
|
||||
getOverview: () => get<any>('/token/overview'),
|
||||
getRankings: () => get<any>('/token/rankings'),
|
||||
getLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
const qs = sp.toString();
|
||||
return get<any[]>(`/token/logs${qs ? `?${qs}` : ''}`);
|
||||
},
|
||||
getBalance: () => get<any>('/token/balance'),
|
||||
recharge: (amount: number) => post<any>('/token/recharge', { amount }),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 付费相关API
|
||||
// ============================================================
|
||||
export const paymentAPI = {
|
||||
getPlans: () => get<any[]>('/payment/plans'),
|
||||
createOrder: (data: any) => post<any>('/payment/orders', data),
|
||||
getOrders: (status?: string) => get<any[]>(`/payment/orders${status ? `?status=${status}` : ''}`),
|
||||
getOrder: (id: string) => get<any>(`/payment/orders/${id}`),
|
||||
payOrder: (id: string, method?: string) => post<any>(`/payment/orders/${id}/pay`, { payment_method: method }),
|
||||
getCoupons: () => get<any[]>('/payment/coupons'),
|
||||
useCoupon: (code: string) => post<any>('/payment/coupons/use', { code }),
|
||||
getServices: () => get<any[]>('/payment/services'),
|
||||
createCustomOrder: (data: any) => post<any>('/payment/custom-services', data),
|
||||
createServiceRequest: (data: any) => post<any>('/payment/service-requests', data),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 个人中心相关API
|
||||
// ============================================================
|
||||
export const profileAPI = {
|
||||
getProfile: () => get<any>('/profile/'),
|
||||
updateProfile: (data: any) => put<any>('/profile/', data),
|
||||
updatePassword: (data: { old_password: string; new_password: string }) =>
|
||||
put<any>('/profile/password', data),
|
||||
getLoginLogs: () => get<any[]>('/profile/login-logs'),
|
||||
getApiKeys: () => get<any[]>('/profile/api-keys'),
|
||||
createApiKey: (name?: string) => post<any>('/profile/api-keys', { name }),
|
||||
updateApiKey: (id: string, status: string) => put<any>(`/profile/api-keys/${id}`, { status }),
|
||||
getMembership: () => get<any>('/profile/membership'),
|
||||
getPurchasedApps: () => get<any[]>('/profile/purchased-apps'),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 通知相关API
|
||||
// ============================================================
|
||||
export const notificationAPI = {
|
||||
getNotifications: (params?: { type?: string; page?: number }) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params?.type) sp.set('type', params.type);
|
||||
if (params?.page) sp.set('page', String(params.page));
|
||||
const qs = sp.toString();
|
||||
return get<any[]>(`/notifications/${qs ? `?${qs}` : ''}`);
|
||||
},
|
||||
markRead: (id: string) => put<any>(`/notifications/${id}/read`),
|
||||
markAllRead: () => put<any>('/notifications/read-all'),
|
||||
getUnreadCount: () => get<any>('/notifications/unread-count'),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 资产管理相关API
|
||||
// ============================================================
|
||||
export const assetsAPI = {
|
||||
getAssets: (category?: string) =>
|
||||
get<any[]>(`/assets/${category ? `?category=${category}` : ''}`),
|
||||
createAsset: (data: any) => post<any>('/assets/', data),
|
||||
getAsset: (id: string) => get<any>(`/assets/${id}`),
|
||||
updateAsset: (id: string, data: any) => put<any>(`/assets/${id}`, data),
|
||||
deleteAsset: (id: string) => del<any>(`/assets/${id}`),
|
||||
getCategories: () => get<any[]>('/assets/categories'),
|
||||
getNovelChapters: (novelId: string) => get<any[]>(`/assets/novels/${novelId}/chapters`),
|
||||
addChapter: (novelId: string, data: any) => post<any>(`/assets/novels/${novelId}/chapters`, data),
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// 后台管理API
|
||||
// ============================================================
|
||||
export const adminAPI = {
|
||||
// 仪表盘
|
||||
getStats: () => get<any>('/admin/dashboard/stats'),
|
||||
getRecentLogs: () => get<any[]>('/admin/dashboard/recent-logs'),
|
||||
getRecentAudit: () => get<any[]>('/admin/dashboard/recent-audit'),
|
||||
// 用户管理
|
||||
getUsers: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/users/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
getUser: (id: string) => get<any>(`/admin/users/${id}`),
|
||||
banUser: (id: string) => put<any>(`/admin/users/${id}/ban`),
|
||||
unbanUser: (id: string) => put<any>(`/admin/users/${id}/unban`),
|
||||
getRegisterSettings: () => get<any>('/admin/users/register-settings'),
|
||||
updateRegisterSettings: (data: any) => put<any>('/admin/users/register-settings', data),
|
||||
// 模型管理
|
||||
getProviders: () => get<any[]>('/admin/models/providers'),
|
||||
addProvider: (data: any) => post<any>('/admin/models/providers', data),
|
||||
updateProvider: (id: string, data: any) => put<any>(`/admin/models/providers/${id}`, data),
|
||||
deleteProvider: (id: string) => del<any>(`/admin/models/providers/${id}`),
|
||||
fetchModels: (id: string) => post<any>(`/admin/models/providers/${id}/fetch-models`),
|
||||
addModels: (id: string, modelIds: string[]) => post<any>(`/admin/models/providers/${id}/add-models`, { model_ids: modelIds }),
|
||||
getProtocols: () => get<any[]>('/admin/models/protocols'),
|
||||
getAdminModels: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any>(`/admin/models/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
addModel: (data: any) => post<any>('/admin/models/', data),
|
||||
updateModel: (id: string, data: any) => put<any>(`/admin/models/${id}`, data),
|
||||
deleteModel: (id: string) => del<any>(`/admin/models/${id}`),
|
||||
toggleModel: (id: string, isEnabled: boolean) => put<any>(`/admin/models/${id}/toggle?is_enabled=${isEnabled}`),
|
||||
setDefaultModel: (id: string) => put<any>(`/admin/models/${id}/set-default`),
|
||||
getModelStats: () => get<any>('/admin/models/stats'),
|
||||
// 网站设置
|
||||
getSiteSettings: () => get<any>('/admin/settings/site'),
|
||||
updateSiteSettings: (data: any) => put<any>('/admin/settings/site', data),
|
||||
getEmailConfig: () => get<any>('/admin/settings/email'),
|
||||
updateEmailConfig: (data: any) => put<any>('/admin/settings/email', data),
|
||||
testEmail: (params?: { test_to?: string; test_subject?: string; test_body?: string }) => {
|
||||
const qs = new URLSearchParams();
|
||||
if (params?.test_to) qs.set('test_to', params.test_to);
|
||||
if (params?.test_subject) qs.set('test_subject', params.test_subject);
|
||||
if (params?.test_body) qs.set('test_body', params.test_body);
|
||||
const qstr = qs.toString();
|
||||
return post<any>(`/admin/settings/email/test${qstr ? `?${qstr}` : ''}`);
|
||||
},
|
||||
generateEmailContent: (topic: string) => post<any>(`/admin/settings/email/generate-content?topic=${encodeURIComponent(topic)}`),
|
||||
getSmsConfig: () => get<any>('/admin/settings/sms'),
|
||||
updateSmsConfig: (data: any) => put<any>('/admin/settings/sms', data),
|
||||
testSms: () => post<any>('/admin/settings/sms/test'),
|
||||
// 支付配置
|
||||
getPaymentConfigs: () => get<any[]>('/admin/payment/configs'),
|
||||
updatePaymentConfig: (id: string, data: any) => put<any>(`/admin/payment/configs/${id}`, data),
|
||||
getAdminOrders: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/payment/orders${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
refundOrder: (id: string) => put<any>(`/admin/payment/orders/${id}/refund`),
|
||||
// 增值服务
|
||||
getServices: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/services/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
addService: (data: any) => post<any>('/admin/services/', data),
|
||||
updateService: (id: string, data: any) => put<any>(`/admin/services/${id}`, data),
|
||||
deleteService: (id: string) => del<any>(`/admin/services/${id}`),
|
||||
getCustomOrders: (status?: string) => get<any[]>(`/admin/services/custom-orders${status ? `?status=${status}` : ''}`),
|
||||
updateCustomOrder: (id: string, data: any) => put<any>(`/admin/services/custom-orders/${id}`, data),
|
||||
getCustomRequests: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/services/custom-requests${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
updateCustomRequest: (id: string, data: any) => put<any>(`/admin/services/custom-requests/${id}`, data),
|
||||
getAvailableAgents: () => get<any[]>('/admin/services/agents'),
|
||||
assignAgentToService: (id: string, agentId: string) => put<any>(`/admin/services/${id}/agent?agent_id=${agentId}`),
|
||||
// 会员管理
|
||||
getPlans: () => get<any[]>('/admin/membership/plans'),
|
||||
addPlan: (data: any) => post<any>('/admin/membership/plans', data),
|
||||
updatePlan: (id: string, data: any) => put<any>(`/admin/membership/plans/${id}`, data),
|
||||
deletePlan: (id: string) => del<any>(`/admin/membership/plans/${id}`),
|
||||
getSubscriptions: () => get<any[]>('/admin/membership/subscriptions'),
|
||||
getAutomationRules: () => get<any>('/admin/membership/automation-rules'),
|
||||
// 广告管理
|
||||
getAds: () => get<any[]>('/admin/ads/'),
|
||||
addAd: (data: any) => post<any>('/admin/ads/', data),
|
||||
updateAd: (id: string, data: any) => put<any>(`/admin/ads/${id}`, data),
|
||||
deleteAd: (id: string) => del<any>(`/admin/ads/${id}`),
|
||||
toggleAd: (id: string) => put<any>(`/admin/ads/${id}/toggle`),
|
||||
// 应用市场审核
|
||||
getPendingApps: () => get<any[]>('/admin/market/apps/pending'),
|
||||
approveApp: (id: string) => put<any>(`/admin/market/apps/${id}/approve`),
|
||||
rejectApp: (id: string) => put<any>(`/admin/market/apps/${id}/reject`),
|
||||
getAdminApps: () => get<any[]>('/admin/market/apps'),
|
||||
updateApp: (id: string, data: any) => put<any>(`/admin/market/apps/${id}`, data),
|
||||
getCoupons: () => get<any[]>('/admin/market/coupons'),
|
||||
addCoupon: (data: any) => post<any>('/admin/market/coupons', data),
|
||||
updateCoupon: (id: string, data: any) => put<any>(`/admin/market/coupons/${id}`, data),
|
||||
deleteCoupon: (id: string) => del<any>(`/admin/market/coupons/${id}`),
|
||||
assignCoupon: (id: string, userId: string) => post<any>(`/admin/market/coupons/${id}/assign`, { user_id: userId }),
|
||||
// 日志与风控
|
||||
getOperationLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/logs/operations${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
getTokenLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/logs/token-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
getPaymentLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/logs/payment-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
getAuditLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any[]>(`/admin/logs/audit-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
// 新增:日志统计
|
||||
getLogStats: () => get<any>('/admin/logs/stats'),
|
||||
// 新增:API调用统计
|
||||
getApiStats: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any>(`/admin/logs/api-stats${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
// 新增:慢请求记录
|
||||
getSlowRequests: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any>(`/admin/logs/slow-requests${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
// 新增:操作类型枚举
|
||||
getActionTypes: () => get<any>('/admin/logs/action-types'),
|
||||
// 新增:审计日志导出
|
||||
exportAuditLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any>(`/admin/logs/export/audit-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
exportOperationLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any>(`/admin/logs/export/operations${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
exportTokenLogs: (params?: any) => {
|
||||
const sp = new URLSearchParams();
|
||||
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
||||
return get<any>(`/admin/logs/export/token-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
||||
},
|
||||
getRiskRules: () => get<any[]>('/admin/logs/risk-rules'),
|
||||
addRiskRule: (data: any) => post<any>('/admin/logs/risk-rules', data),
|
||||
updateRiskRule: (id: string, data: any) => put<any>(`/admin/logs/risk-rules/${id}`, data),
|
||||
deleteRiskRule: (id: string) => del<any>(`/admin/logs/risk-rules/${id}`),
|
||||
};
|
||||
|
||||
// ===== AI自进化API =====
|
||||
export const evolutionAPI = {
|
||||
// 驾驶舱面板
|
||||
getSkillTree: () => get<import('@/types').SkillTreeData>('/evolution/dashboard/skill-tree'),
|
||||
getTimeline: (eventType?: string) =>
|
||||
get<import('@/types').EvolutionEvent[]>('/evolution/dashboard/timeline' + (eventType ? `?event_type=${eventType}` : '')),
|
||||
getStatistics: () => get<import('@/types').StatisticsData>('/evolution/dashboard/statistics'),
|
||||
getProfile: () => get<import('@/types').EvolutionProfile>('/evolution/dashboard/profile'),
|
||||
|
||||
// 技能管理
|
||||
getSkills: (params?: { state?: string; keyword?: string; sort_by?: string; order?: string }) => {
|
||||
const query = new URLSearchParams();
|
||||
if (params?.state) query.append('state', params.state);
|
||||
if (params?.keyword) query.append('keyword', params.keyword);
|
||||
if (params?.sort_by) query.append('sort_by', params.sort_by);
|
||||
if (params?.order) query.append('order', params.order);
|
||||
const qs = query.toString();
|
||||
return get<import('@/types').EvolutionSkill[]>('/evolution/skills' + (qs ? `?${qs}` : ''));
|
||||
},
|
||||
getSkillDetail: (name: string) => get<import('@/types').EvolutionSkill>(`/evolution/skills/${encodeURIComponent(name)}`),
|
||||
updateSkill: (name: string, data: { description?: string; tags?: string[]; category?: string }) =>
|
||||
put<import('@/types').EvolutionSkill>(`/evolution/skills/${encodeURIComponent(name)}`, data),
|
||||
deleteSkill: (name: string) => del(`/evolution/skills/${encodeURIComponent(name)}`),
|
||||
freezeSkill: (name: string) => post(`/evolution/skills/${encodeURIComponent(name)}/freeze`),
|
||||
unfreezeSkill: (name: string) => post(`/evolution/skills/${encodeURIComponent(name)}/unfreeze`),
|
||||
getSkillHistory: (name: string) => get<import('@/types').EvolutionEvent[]>(`/evolution/skills/${encodeURIComponent(name)}/history`),
|
||||
getSkillTrajectories: (name: string) => get<import('@/types').EvolutionTrajectory[]>(`/evolution/skills/${encodeURIComponent(name)}/trajectories`),
|
||||
|
||||
// 事件
|
||||
getEvents: (params?: { event_type?: string; skill_name?: string; limit?: number }) => {
|
||||
const query = new URLSearchParams();
|
||||
if (params?.event_type) query.append('event_type', params.event_type);
|
||||
if (params?.skill_name) query.append('skill_name', params.skill_name);
|
||||
if (params?.limit) query.append('limit', String(params.limit));
|
||||
const qs = query.toString();
|
||||
return get<import('@/types').EvolutionEvent[]>('/evolution/events' + (qs ? `?${qs}` : ''));
|
||||
},
|
||||
|
||||
// 轨迹提交
|
||||
submitTrajectory: (data: { conversation_id: string; messages: any[] }) =>
|
||||
post('/evolution/trajectory/submit', data),
|
||||
|
||||
// v2: 技能回滚
|
||||
rollbackSkill: (skillName: string, version: number) =>
|
||||
post<import('@/types').EvolutionSkill>(`/evolution/skills/${encodeURIComponent(skillName)}/rollback/${version}`),
|
||||
|
||||
// v2: 发布到市场
|
||||
publishSkill: (skillName: string, data: { price: number; market_description: string }) =>
|
||||
post(`/evolution/skills/${encodeURIComponent(skillName)}/publish`, data),
|
||||
|
||||
// v2: 团队共享
|
||||
shareToTeam: (skillName: string, teamId: string) =>
|
||||
post(`/evolution/skills/${encodeURIComponent(skillName)}/share-to-team`, { team_id: teamId }),
|
||||
|
||||
// v2: 流水线状态
|
||||
getPipelineStatus: () => get<import('@/types').PipelineStatus>('/evolution/pipeline/status'),
|
||||
|
||||
// v2: 手动触发流水线
|
||||
triggerPipeline: () => post('/evolution/pipeline/trigger'),
|
||||
|
||||
// v2: Watcher状态
|
||||
getWatcherStatus: () => get<import('@/types').WatcherStatus>('/evolution/watcher/status'),
|
||||
|
||||
// v2: 进化报告
|
||||
getReports: (reportType?: string) => {
|
||||
const qs = reportType ? `?report_type=${reportType}` : '';
|
||||
return get<import('@/types').EvolutionReport[]>(`/evolution/reports${qs}`);
|
||||
},
|
||||
getReportDetail: (reportId: string) => get<import('@/types').EvolutionReport>(`/evolution/reports/${reportId}`),
|
||||
};
|
||||
Reference in new issue
Block a user