refactor: 标准化项目结构 frontend/ + backend/ + SQLite + run.sh
- 目录重构: app/ -> frontend/,与 backend/ 并列 - 数据库: 默认 SQLite(零配置),修复 DSN() bug - run.sh: 一键启动前后端,支持 start/stop/restart/status - Makefile: install/dev/build/lint/clean 快捷命令 - vite.config.ts: 配置 dev server 端口 5173 + API 代理到 8080 - config.yaml: SQLite 默认配置,开箱即用 - docs/: 完整开发文档(项目结构/API/数据库/规范/部署) - 修复: GORM foreign key 关联声明 - 修复: go get gorm.io/driver/sqlite 依赖
This commit is contained in:
1 parent
7d6674bddd
commit
97c4207ff8
132 files changed
+1572
-34
No files matched your search
@@ -0,0 +1,456 @@
|
||||
// API Service for AIOps Platform
|
||||
import * as mockData from '@/mocks/data';
|
||||
|
||||
// Mock API delay
|
||||
const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
||||
|
||||
// SQL Audit API
|
||||
export const sqlAuditApi = {
|
||||
getRecords: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.sqlAuditRecords as any };
|
||||
},
|
||||
getRules: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.sqlAuditRules as any };
|
||||
},
|
||||
analyzeSQL: async (data: { sql: string }) => {
|
||||
await delay(500);
|
||||
return { data: { id: Date.now().toString(), riskLevel: 'medium', rules: ['规则1'] } };
|
||||
},
|
||||
approve: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
reject: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
execute: async (id: string) => {
|
||||
await delay(500);
|
||||
return { success: true };
|
||||
},
|
||||
toggleRule: async (ruleId: string, enabled: boolean) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// Ansible API
|
||||
export const ansibleApi = {
|
||||
getPlaybooks: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.ansiblePlaybooks as any };
|
||||
},
|
||||
getJobs: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.ansibleJobs as any };
|
||||
},
|
||||
getInventories: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.ansibleInventories as any };
|
||||
},
|
||||
createPlaybook: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
deletePlaybook: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
executePlaybook: async (id: string, config: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { jobId: Date.now().toString() } };
|
||||
}
|
||||
};
|
||||
|
||||
// Logs API
|
||||
export const logsApi = {
|
||||
query: async (query: any) => {
|
||||
await delay(400);
|
||||
return { data: mockData.logMonitorEntries as any };
|
||||
},
|
||||
getSources: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.logSources as any };
|
||||
},
|
||||
export: async (query: any) => {
|
||||
await delay(500);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// Alert Center API
|
||||
export const alertCenterApi = {
|
||||
getAlerts: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.alertCenterAlerts as any };
|
||||
},
|
||||
getRules: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.alertCenterRules as any };
|
||||
},
|
||||
getChannels: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.notificationChannels as any };
|
||||
},
|
||||
acknowledge: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
resolve: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
silence: async (id: string, duration: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
toggleRule: async (ruleId: string, enabled: boolean) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// Trace API
|
||||
export const traceApi = {
|
||||
getTraces: async (params: any) => {
|
||||
await delay(400);
|
||||
return { data: mockData.traces as any };
|
||||
},
|
||||
getServices: async (timeRange: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.serviceMetrics as any };
|
||||
},
|
||||
getTraceDetail: async (traceId: string) => {
|
||||
await delay(400);
|
||||
return { data: { spans: mockData.traceSpans as any } };
|
||||
}
|
||||
};
|
||||
|
||||
// Dashboard API
|
||||
export const dashboardApi = {
|
||||
getDashboards: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.grafanaDashboards as any };
|
||||
},
|
||||
getDatasources: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.datasources as any };
|
||||
},
|
||||
createDashboard: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
updateDashboard: async (id: string, data: any) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
},
|
||||
deleteDashboard: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
createDatasource: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
}
|
||||
};
|
||||
|
||||
// AI Assistant API
|
||||
export const aiAssistantApi = {
|
||||
chat: async (message: string, history: any[]) => {
|
||||
await delay(1000);
|
||||
return {
|
||||
data: {
|
||||
reply: `我收到了您的问题: "${message}"。作为AIOps智能助手,我可以帮您分析告警、诊断问题、生成报告等。`,
|
||||
suggestions: ['分析当前告警', '查看性能趋势', '生成运维报告']
|
||||
}
|
||||
};
|
||||
},
|
||||
analyzeAlert: async (alertId: string) => {
|
||||
await delay(1500);
|
||||
return {
|
||||
data: {
|
||||
analysis: '根据告警信息分析,可能是由于数据库连接池耗尽导致的。建议检查数据库连接配置和当前连接数。',
|
||||
recommendations: ['增加连接池大小', '检查慢查询', '重启应用服务']
|
||||
}
|
||||
};
|
||||
},
|
||||
generateReport: async (params: any) => {
|
||||
await delay(2000);
|
||||
return { data: { report: '运维报告已生成...' } };
|
||||
}
|
||||
};
|
||||
|
||||
// Pipeline API
|
||||
export const pipelineApi = {
|
||||
getPipelines: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.pipelines as any };
|
||||
},
|
||||
getPipelineDetail: async (id: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.pipelines.find((p: any) => p.id === id) };
|
||||
},
|
||||
createPipeline: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
executePipeline: async (id: string) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { executionId: Date.now().toString() } };
|
||||
},
|
||||
getExecutions: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.pipelineExecutions as any };
|
||||
}
|
||||
};
|
||||
|
||||
// Release API
|
||||
export const releaseApi = {
|
||||
getReleases: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.releases as any };
|
||||
},
|
||||
createRelease: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
approveRelease: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
rejectRelease: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
rollbackRelease: async (id: string) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// CronJob API
|
||||
export const cronJobApi = {
|
||||
getJobs: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.cronJobsList as any };
|
||||
},
|
||||
createJob: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
updateJob: async (id: string, data: any) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
},
|
||||
deleteJob: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
executeJob: async (id: string) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
},
|
||||
toggleJob: async (id: string, enabled: boolean) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
getExecutions: async (jobId: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.cronJobExecutions as any };
|
||||
}
|
||||
};
|
||||
|
||||
// K8s API
|
||||
export const k8sApi = {
|
||||
getClusters: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.k8sClusters as any };
|
||||
},
|
||||
getClusterDetail: async (id: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.k8sClusters.find((c: any) => c.id === id) };
|
||||
},
|
||||
getDeployments: async (clusterId: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.k8sDeployments as any };
|
||||
},
|
||||
getServices: async (clusterId: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.k8sServices as any };
|
||||
},
|
||||
getIngresses: async (clusterId: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.k8sIngresses as any };
|
||||
},
|
||||
getPods: async (clusterId: string, namespace?: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.k8sPods as any };
|
||||
},
|
||||
scaleDeployment: async (clusterId: string, namespace: string, name: string, replicas: number) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
},
|
||||
restartDeployment: async (clusterId: string, namespace: string, name: string) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
},
|
||||
deletePod: async (clusterId: string, namespace: string, name: string) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// Server API
|
||||
export const serverApi = {
|
||||
getServers: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.servers as any };
|
||||
},
|
||||
getServerDetail: async (id: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.servers.find((s: any) => s.id === id) };
|
||||
},
|
||||
createServer: async (data: any) => {
|
||||
await delay(300);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
updateServer: async (id: string, data: any) => {
|
||||
await delay(300);
|
||||
return { success: true };
|
||||
},
|
||||
deleteServer: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
importFromCloud: async (provider: string, credentials: any) => {
|
||||
await delay(1000);
|
||||
return { success: true, data: { imported: 5 } };
|
||||
},
|
||||
importFromExcel: async (file: File) => {
|
||||
await delay(1000);
|
||||
return { success: true, data: { imported: 10 } };
|
||||
},
|
||||
getMetrics: async (id: string) => {
|
||||
await delay(300);
|
||||
return { data: mockData.serverMetrics as any };
|
||||
}
|
||||
};
|
||||
|
||||
// Dashboard Stats API
|
||||
export const dashboardStatsApi = {
|
||||
getStats: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.dashboardStats as any };
|
||||
},
|
||||
getAlerts: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.recentAlerts as any };
|
||||
},
|
||||
getTopCPU: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.topCPU as any };
|
||||
},
|
||||
getTopMemory: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.topMemory as any };
|
||||
},
|
||||
getTopDisk: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.topDisk as any };
|
||||
},
|
||||
getCostStats: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.costStats as any };
|
||||
},
|
||||
getCertExpiry: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.certExpiry as any };
|
||||
}
|
||||
};
|
||||
|
||||
// Cloud API
|
||||
export const cloudApi = {
|
||||
getProviders: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.cloudProvidersList as any };
|
||||
},
|
||||
getAccounts: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.cloudAccountsList as any };
|
||||
},
|
||||
getRegions: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.cloudRegionsList as any };
|
||||
},
|
||||
getDomains: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.domainsList as any };
|
||||
}
|
||||
};
|
||||
|
||||
// Navigation API
|
||||
export const navigationApi = {
|
||||
getLinks: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.navigationLinks as any };
|
||||
},
|
||||
createLink: async (data: any) => {
|
||||
await delay(200);
|
||||
return { success: true, data: { id: Date.now().toString() } };
|
||||
},
|
||||
updateLink: async (id: string, data: any) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
deleteLink: async (id: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// Approval API
|
||||
export const approvalApi = {
|
||||
getFlows: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.approvalFlows as any };
|
||||
},
|
||||
getPendingApprovals: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.pendingApprovals as any };
|
||||
},
|
||||
approve: async (id: string, comment?: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
reject: async (id: string, comment?: string) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
|
||||
// User API
|
||||
export const userApi = {
|
||||
login: async (username: string, password: string) => {
|
||||
await delay(500);
|
||||
return {
|
||||
data: {
|
||||
token: 'mock-jwt-token',
|
||||
user: mockData.currentUser
|
||||
}
|
||||
};
|
||||
},
|
||||
getProfile: async () => {
|
||||
await delay(200);
|
||||
return { data: mockData.currentUser };
|
||||
},
|
||||
updateProfile: async (data: any) => {
|
||||
await delay(200);
|
||||
return { success: true };
|
||||
},
|
||||
getUsers: async () => {
|
||||
await delay(300);
|
||||
return { data: mockData.users as any };
|
||||
}
|
||||
};
|
||||
Reference in new issue
Block a user