feat(audit): F1+F2 告警静默规则标记完成 + 审计日志CSV导出实现

F1 告警静默规则 [done]:
- 后端 alert_silence.go: CRUD + Toggle (onetime/daily/weekly 三模式)
- 告警引擎 isSilenced 集成 (alert_engine.go)
- 前端 SilenceRuleTab + SilenceDialog
- 路由 /alerts/silences 已注册

F2 审计日志导出 [done]:
- 重写 ExportAuditLogs: 真正的 CSV 导出 (encoding/csv + UTF-8 BOM)
- 支持 module/action/username/startTime/endTime 筛选
- 导出限制 10000 条防溢出,自动记录审计日志
- JSON 格式向后兼容 (format=json)
- 前端 exportLogs 传递查询参数

同时包含累积的前期工作:
- 目录重构 internal/ -> controller/model/router (v0.55-v0.57)
- 后端分层架构 dto/repository/service/utils
- 审计模块全功能 (终端审计/操作审计/登录日志)
- asciicast v2 录制格式
- SFTP 文件浏览器
- StatStrip 紧凑统计条
- 在线会话自动刷新
- LiveMonitor WebSocket 诊断修复

验证: go build ✅ | npm run build ✅ | Docker 部署 ✅ | 10 回归端点 ✅ | CSV 导出 ✅ | 静默 CRUD ✅
This commit is contained in:
attacker committed 2026-06-25 20:16:30 +08:00
1 parent e57718998a
commit 77c234b060
314 files changed
+10050 -4065

No files matched your search

@@ -0,0 +1 @@
import{r as t,j as e,B as A,L as y,S as P,I as V,q as W}from"./index-DfyorCky.js";import{C,a as S}from"./card-C55cvSHg.js";import{B as x}from"./badge-xNW8x0G1.js";import{S as $,a as B,b as R,c as T,d as u}from"./select-D5qUzdAs.js";import{T as H,a as U,b,c as o,d as q,e as r}from"./table-5sHV4Akp.js";import{k as M}from"./kubernetes-J8O09fK7.js";import{R as z}from"./refresh-cw-DUB_tAG-.js";import"./index-CWVNW_qu.js";function ee(){const[L,i]=t.useState([]),[c,N]=t.useState(""),[a,k]=t.useState([]),[p,j]=t.useState(!1),[K,_]=t.useState(""),[m,E]=t.useState("all"),g=t.useCallback(async()=>{try{const n=(await M.getClusters())?.list||[];i(n),n.length>0&&!c&&N(String(n[0].id))}catch{i([])}},[]);t.useEffect(()=>{g()},[g]);const h=t.useCallback(async()=>{if(c){j(!0);try{const s=await M.getNodes(c);k(Array.isArray(s)?s:s?.list||[])}catch{k([])}finally{j(!1)}}},[c]);t.useEffect(()=>{h()},[h]);const f=a.filter(s=>(s.name||"").toLowerCase().includes(K.toLowerCase())&&(m==="all"||s.role===m)),F=s=>s==="master"?e.jsx(x,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:52:9",className:"bg-blue-500/20 text-blue-400 border-blue-500/30",children:"Master"}):e.jsx(x,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:53:9",className:"bg-emerald-500/20 text-emerald-400 border-emerald-500/30",children:"Worker"}),I=s=>s==="Ready"?e.jsx(x,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:57:9",className:"bg-emerald-500/20 text-emerald-400 border-emerald-500/30",children:s}):e.jsx(x,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:58:9",variant:"destructive",children:s||"Unknown"});return e.jsxs("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:61:5",className:"space-y-6",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:62:7",className:"flex items-center justify-between",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:63:9",children:[e.jsx("h1",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:64:11",className:"text-2xl font-bold text-slate-100",children:"节点管理"}),e.jsx("p",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:65:11",className:"text-sm text-slate-500 mt-1",children:"Kubernetes 集群工作节点状态与资源"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:67:9",className:"flex items-center gap-2",children:[e.jsxs($,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:68:11",value:c,onValueChange:N,children:[e.jsx(B,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:69:13",className:"w-48 h-9 bg-slate-800/50 border-slate-700 text-slate-200",children:e.jsx(R,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:70:15",placeholder:"选择集群"})}),e.jsx(T,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:72:13",className:"bg-slate-800 border-slate-700",children:L.map(s=>e.jsx(u,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:74:17",value:String(s.id),children:s.name},s.id))})]}),e.jsx(A,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:78:11",variant:"outline",size:"icon",className:"h-9 w-9 border-slate-700 text-slate-400",onClick:h,disabled:p,children:p?e.jsx(y,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:79:24",className:"h-4 w-4 animate-spin"}):e.jsx(z,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:79:71",className:"h-4 w-4"})})]})]}),e.jsx("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:84:7",className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[{label:"总节点",value:a.length,color:"text-blue-400"},{label:"Master",value:a.filter(s=>s.role==="master").length,color:"text-purple-400"},{label:"Worker",value:a.filter(s=>s.role==="worker").length,color:"text-emerald-400"},{label:"就绪",value:a.filter(s=>s.status==="Ready").length,color:"text-cyan-400"}].map(s=>e.jsx(C,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:91:11",className:"bg-slate-900 border-slate-800",children:e.jsxs(S,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:92:13",className:"p-4",children:[e.jsx("p",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:93:15",className:"text-sm text-slate-500",children:s.label}),e.jsx("p",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:94:15",className:`text-2xl font-bold ${s.color}`,children:s.value})]})},s.label))}),e.jsxs("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:100:7",className:"flex items-center gap-3",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:101:9",className:"relative w-56",children:[e.jsx(P,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:102:11",className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-slate-500"}),e.jsx(V,{"code-path":"src/components/kubernetes/KubernetesNodes.tsx:103:11",placeholder:"搜索节点...",value:K,onChange:s=>_(s.target.value),className:"pl-9 h-9 bg-slate-800/50 borLine truncated