refactor(frontend): P0 API 层收口与 http 统一

- 统一 http.ts baseURL:get/post/download/upload 均走 resolveApiUrl
- agentUtils 下沉至 lib/agent-utils,API 层移除对 components 的依赖
- 扩展 metricsApi/snmpApi/prometheusProxyApi/zabbixProxyApi
- 扩展 pipelineApi/credentialApi 覆盖流水线与凭证场景
- 14 个组件/页面禁止直连 http,统一走 @/services/api
This commit is contained in:
Logan.Li committed 2026-06-25 23:49:46 +08:00
1 parent bfd6431b9d
commit 7fb2236b4d
27 files changed
+194 -150

No files matched your search

+9 -18
View File
@@ -7,7 +7,7 @@ import {
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { toast } from 'sonner';
import { http } from '@/services/http';
import { approvalWorkflowApi, userApi } from '@/services/api';
/* ------------------------------------------------------------------ */
/* Types */
@@ -80,16 +80,7 @@ const STEP_TYPES = [
{ value: 'execute' as const, label: '执行阶段', desc: '执行人员操作' },
];
// API helpers
const workflowApi = {
list: (params?: { category?: string }) => http.get('/approval-workflows', params),
get: (id: number) => http.get(`/approval-workflows/${id}`),
create: (data: any) => http.post('/approval-workflows', data),
update: (id: number, data: any) => http.put(`/approval-workflows/${id}`, data),
delete: (id: number) => http.delete(`/approval-workflows/${id}`),
setDefault: (id: number) => http.put(`/approval-workflows/${id}/default`),
};
const userListApi = () => http.get('/admin/users');
/* ------------------------------------------------------------------ */
/* UserSelectInline */
@@ -299,9 +290,9 @@ function WorkflowEditorModal({ workflow, users, onClose, onSaved }: EditorProps)
})),
};
if (isEdit && workflow) {
await workflowApi.update(workflow.id, payload);
await approvalWorkflowApi.update(workflow.id, payload);
} else {
await workflowApi.create(payload);
await approvalWorkflowApi.create(payload);
}
onSaved();
} catch (e: unknown) {
@@ -459,7 +450,7 @@ export default function ApprovalWorkflowPage() {
try {
setLoading(true);
setError(null);
const res: any = await workflowApi.list();
const res: any = await approvalWorkflowApi.list();
const data = Array.isArray(res?.list) ? res.list : (Array.isArray(res) ? res : []);
const normalized = data.map((w: any) => ({ ...w, steps: w.steps || [] }));
setItems(normalized);
@@ -472,7 +463,7 @@ export default function ApprovalWorkflowPage() {
const fetchUsers = useCallback(async () => {
try {
const res: any = await userListApi();
const res: any = await userApi.getUsers();
const data = Array.isArray(res?.list) ? res.list : (Array.isArray(res) ? res : []);
// Normalize: extract role code from roles array
const normalized = data.map((u: any) => ({
@@ -490,7 +481,7 @@ export default function ApprovalWorkflowPage() {
const toggleActive = useCallback(async (wf: WorkflowItem) => {
try {
await workflowApi.update(wf.id, { is_active: !wf.is_active });
await approvalWorkflowApi.update(wf.id, { is_active: !wf.is_active });
setItems((prev) => prev.map((w) => (w.id === wf.id ? { ...w, is_active: !w.is_active } : w)));
toast.success(wf.is_active ? '已停用' : '已启用');
} catch { toast.error('操作失败'); }
@@ -499,7 +490,7 @@ export default function ApprovalWorkflowPage() {
const handleDelete = useCallback(async (id: number, name: string) => {
if (!window.confirm(`确定删除审批流程「${name}」?删除后不可恢复。`)) return;
try {
await workflowApi.delete(id);
await approvalWorkflowApi.delete(id);
setItems((prev) => prev.filter((w) => w.id !== id));
toast.success('已删除');
} catch { toast.error('删除失败'); }
@@ -507,7 +498,7 @@ export default function ApprovalWorkflowPage() {
const setDefault = useCallback(async (id: number) => {
try {
await workflowApi.setDefault(id);
await approvalWorkflowApi.setDefault(id);
setItems((prev) => prev.map((w) => ({ ...w, is_default: w.id === id })));
toast.success('已设为默认');
} catch { toast.error('操作失败'); }