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:
attacker committed 2026-06-13 23:34:23 +08:00
1 parent 7d6674bddd
commit 97c4207ff8
132 files changed
+1572 -34

No files matched your search

+456
View File
@@ -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 };
}
};