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,4 @@
import{g as kt,j as t,X as m,ab as U,_ as x,aU as rt,r as A,o as ot,A as wt,G as Rt,k as le,B as se,a2 as nt,T as ct,t as Be,a7 as Ke,q as Ae,s as Se,x as At,J as St}from"./index-DfyorCky.js";import{d as pe}from"./dashboard-BjQPIG2G.js";import{s as Ot}from"./server-CjDPBaTN.js";import{k as _t}from"./kubernetes-J8O09fK7.js";import{C as I,a as F,b as z,c as V,d as q}from"./card-C55cvSHg.js";import{T as Pt}from"./trending-up-CdusV6gc.js";import{T as Et}from"./trending-down-BGTWG_dA.js";import{M as Tt}from"./minus-UVrx3jLc.js";import{B as $}from"./badge-xNW8x0G1.js";import{H as Lt}from"./hard-drive-BbPmnARR.js";import{b as C,r as dt,s as $t,t as it,v as It,n as Z,w as Ie,x as B,L,y as lt,z as Fe,E as ht,D as Ft,c as Mt,e as ae,o as Y,S as Bt,A as Kt,F as Ut,d as Ue,j as zt,i as Q,l as Vt,u as qt,G as Ht,H as ue,I as Wt,a as pt,J as Gt,K as me,M as ze,g as Zt,N as Xt,R as Oe,C as mt,X as xt,Y as ut,T as _e,B as Jt}from"./generateCategoricalChart-6v9BPbG2.js";import{A as Yt,a as ke}from"./AreaChart-B2zlWfdX.js";import{B as Qt}from"./BarChart-DlFprovY.js";import{M as ea}from"./memory-stick-QMV-0CnU.js";import{A as he}from"./arrow-right-DyIltvNZ.js";import{C as ta}from"./circle-DOZr6_68.js";const aa=[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]],sa=kt("dollar-sign",aa),Ve={blue:{bg:"bg-[var(--dg-blue)]/10",icon:"text-[var(--dg-blue)]",glow:"shadow-[var(--dg-blue)]/10"},emerald:{bg:"bg-[var(--dg-green)]/10",icon:"text-[var(--dg-green)]",glow:"shadow-[var(--dg-green)]/10"},amber:{bg:"bg-[var(--dg-yellow)]/10",icon:"text-[var(--dg-yellow)]",glow:"shadow-[var(--dg-yellow)]/10"},rose:{bg:"bg-[var(--dg-red)]/10",icon:"text-[var(--dg-red)]",glow:"shadow-[var(--dg-red)]/10"},purple:{bg:"bg-[var(--dg-purple)]/10",icon:"text-[var(--dg-purple)]",glow:"shadow-[var(--dg-purple)]/10"},cyan:{bg:"bg-[var(--dg-cyan)]/10",icon:"text-[var(--dg-cyan)]",glow:"shadow-[var(--dg-cyan)]/10"},orange:{bg:"bg-[var(--dg-orange)]/10",icon:"text-[var(--dg-orange)]",glow:"shadow-[var(--dg-orange)]/10"}};function xe({title:a,value:s,description:r,icon:e,trend:o,trendValue:n,color:c,onClick:d,loading:l=!1}){const i=Ve[c]||Ve.blue;if(l)return t.jsx(I,{"code-path":"src/components/dashboard/DashboardStats.tsx:53:7",className:"dg-card overflow-hidden",children:t.jsxs(F,{"code-path":"src/components/dashboard/DashboardStats.tsx:54:9",className:"p-6 space-y-4",children:[t.jsxs("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:55:11",className:"flex items-start justify-between",children:[t.jsxs("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:56:13",className:"space-y-3 flex-1",children:[t.jsx("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:57:15",className:"dg-skeleton h-4 w-24 rounded"}),t.jsx("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:58:15",className:"dg-skeleton h-8 w-16 rounded"})]}),t.jsx("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:60:13",className:"dg-skeleton h-10 w-10 rounded-lg"})]}),t.jsx("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:62:11",className:"dg-skeleton h-3 w-32 rounded"})]})});const p=o==="up"?Pt:o==="down"?Et:Tt,u=o==="up"?"text-[var(--dg-green)]":o==="down"?"text-[var(--dg-red)]":"text-[var(--dg-text-muted)]";return t.jsx(I,{"code-path":"src/components/dashboard/DashboardStats.tsx:76:5",className:m("dg-card dg-card-hover cursor-pointer overflow-hidden",d&&"cursor-pointer"),onClick:d,children:t.jsx(F,{"code-path":"src/components/dashboard/DashboardStats.tsx:83:7",className:"p-6",children:t.jsxs("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:84:9",className:"flex items-start justify-between gap-4",children:[t.jsxs("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:85:11",className:"space-y-3 min-w-0 flex-1",children:[t.jsx("p",{"code-path":"src/components/dashboard/DashboardStats.tsx:86:13",className:"text-sm font-medium text-[var(--dg-text-secondary)] truncate",children:a}),t.jsxs("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:89:13",className:"flex items-baseline gap-2 flex-wrap",children:[t.jsx("h3",{"code-path":"src/components/dashboard/DashboardStats.tsx:90:15",className:"text-2xl font-bold text-[var(--dg-text-primary)] tracking-tight",children:s}),o&&n&&t.jsxs("span",{"code-path":"src/components/dashboard/DashboardStats.tsx:94:17",className:m("flex items-center text-xs font-semibold gap-0.5",u),children:[t.jsx(p,{"code-path":"src/components/dashboard/DashboardStats.tsx:95:19",className:"h-3.5 w-3.5"}),n]})]}),r&&t.jsx("p",{"code-path":"src/components/dashboard/DashboardStats.tsx:101:15",className:"text-xs text-[var(--dg-text-muted)]",children:r})]}),t.jsx("div",{"code-path":"src/components/dashboard/DashboardStats.tsx:104:11",className:m("p-3 rounded-xl flex-shrink-0",i.bg,i.icon),children:t.jsx(e,{"code-path":"src/components/dashboard/DashboardStats.tsx:111:13",className:"h-5 w-5"})})]})})})Line truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function da(a,s){if(a){if(typeof a=="string")return Pe(a,s);var r=Object.prototype.toString.call(a).slice(8,-1);if(r==="Object"&&a.constructor&&(r=a.constructor.name),r==="Map"||r==="Set")return Array.from(a);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Pe(a,s)}}function ia(a){if(typeof Symbol<"u"&&a[Symbol.iterator]!=null||a["@@iterator"]!=null)return Array.from(a)}function la(a){if(Array.isArray(a))return Pe(a)}function Pe(a,s){(s==null||s>a.length)&&(s=a.length);for(var r=0,e=new Array(s);r<s;r++)e[r]=a[r];return e}var He=function(s){return s&&s.x===+s.x&&s.y===+s.y},ha=function(){var s=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],r=[[]];return s.forEach(function(e){He(e)?r[r.length-1].push(e):r[r.length-1].length>0&&r.push([])}),He(s[0])&&r[r.length-1].push(s[0]),r[r.length-1].length<=0&&(r=r.slice(0,-1)),r},de=function(s,r){var e=ha(s);r&&(e=[e.reduce(function(n,c){return[].concat(qe(n),qe(c))},[])]);var o=e.map(function(n){return n.reduce(function(c,d,l){return"".concat(c).concat(l===0?"M":"L").concat(d.x,",").concat(d.y)},"")}).join("");return e.length===1?"".concat(o,"Z"):o},pa=function(s,r,e){var o=de(s,e);return"".concat(o.slice(-1)==="Z"?o.slice(0,-1):o,"L").concat(de(r.reverse(),e).slice(1))},ma=function(s){var r=s.points,e=s.className,o=s.baseLinePoints,n=s.connectNulls,c=oa(s,ra);if(!r||!r.length)return null;var d=U("recharts-polygon",e);if(o&&o.length){var l=c.stroke&&c.stroke!=="none",i=pa(r,o,n);return x.createElement("g",{className:d},x.createElement("path",ee({},C(c,!0),{fill:i.slice(-1)==="Z"?c.fill:"none",stroke:"none",d:i})),l?x.createElement("path",ee({},C(c,!0),{fill:"none",d:de(r,n)})):null,l?x.createElement("path",ee({},C(c,!0),{fill:"none",d:de(o,n)})):null)}var p=de(r,n);return x.createElement("path",ee({},C(c,!0),{fill:p.slice(-1)==="Z"?c.fill:"none",className:d,d:p}))},we,We;function xa(){if(We)return we;We=1;var a=dt(),s=$t(),r=it();function e(o,n){return o&&o.length?a(o,r(n,2),s):void 0}return we=e,we}var ua=xa();const ba=rt(ua);var Re,Ge;function fa(){if(Ge)return Re;Ge=1;var a=dt(),s=it(),r=It();function e(o,n){return o&&o.length?a(o,s(n,2),r):void 0}return Re=e,Re}var ga=fa();const va=rt(ga);var ya=["cx","cy","angle","ticks","axisLine"],ja=["ticks","tick","angle","tickFormatter","stroke"];function re(a){"@babel/helpers - typeof";return re=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(s){return typeof s}:function(s){return s&&typeof Symbol=="function"&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},re(a)}function ie(){return ie=Object.assign?Object.assign.bind():function(a){for(var s=1;s<arguments.length;s++){var r=arguments[s];for(var e in r)Object.prototype.hasOwnProperty.call(r,e)&&(a[e]=r[e])}return a},ie.apply(this,arguments)}function Ze(a,s){var r=Object.keys(a);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(a);s&&(e=e.filter(function(o){return Object.getOwnPropertyDescriptor(a,o).enumerable})),r.push.apply(r,e)}return r}function W(a){for(var s=1;s<arguments.length;s++){var r=arguments[s]!=null?arguments[s]:{};s%2?Ze(Object(r),!0).forEach(function(e){je(a,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(r)):Ze(Object(r)).forEach(function(e){Object.defineProperty(a,e,Object.getOwnPropertyDescriptor(r,e))})}return a}function Xe(a,s){if(a==null)return{};var r=Da(a,s),e,o;if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);for(o=0;o<n.length;o++)e=n[o],!(s.indexOf(e)>=0)&&Object.prototype.propertyIsEnumerable.call(a,e)&&(r[e]=a[e])}return r}function Da(a,s){if(a==null)return{};var r={};for(var e in a)if(Object.prototype.hasOwnProperty.call(a,e)){if(s.indexOf(e)>=0)continue;r[e]=a[e]}return r}function Na(a,s){if(!(a instanceof s))throw new TypeError("Cannot call a class as a function")}function Je(a,s){for(var r=0;r<s.length;r++){var e=s[r];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(a,ft(e.key),e)}}function Ca(a,s,r){return s&&Je(a.prototype,s),r&&Je(a,r),Object.defineProperty(a,"prototype",{writable:!1}),a}function ka(a,s,r){return s=ge(s),wa(a,bt()?Reflect.construct(s,r||[],ge(a).constructor):s.apply(a,r))}function wa(a,s){if(s&&(re(s)==="object"||typeof s=="function"))return s;if(s!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Ra(a)}function Ra(a){if(a===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return a}function bt(){try{var a=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(bt=function(){return!!a})()}function ge(a){return ge=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(r){return r.__proto__||Object.getPrototypeOf(r)},ge(a)}function Aa(a,s){if(typeof s!="function"&&s!==null)throw new TypeError("Supe Line truncated
the props "valueKey" will be deprecated in 1.1.0`),y="value"):ae(i)&&(ze(!1,`Use "dataKey" to specify the value of pie,
the props "valueKey" will be deprecated in 1.1.0`),y=u);var j=o.filter(function(N){return Y(N,y,0)!==0}).length,k=(v>=360?j:j-1)*l,w=v-j*D-k,S=o.reduce(function(N,O){var P=Y(O,y,0);return N+(Q(P)?P:0)},0),_;if(S>0){var M;_=o.map(function(N,O){var P=Y(N,y,0),J=Y(N,p,O),H=(Q(P)?P:0)/S,T;O?T=M.endAngle+ue(h)*l*(P!==0?1:0):T=c;var ce=T+ue(h)*((P!==0?D:0)+H*w),R=(T+ce)/2,Me=(f.innerRadius+f.outerRadius)/2,Nt=[{name:J,value:P,payload:N,dataKey:y,type:b}],Ct=B(f.cx,f.cy,Me,R);return M=g(g(g({percent:H,cornerRadius:n,name:J,tooltipPayload:Nt,midAngle:R,middleRadius:Me,tooltipPosition:Ct},N),f),{},{value:Y(N,y),startAngle:T,endAngle:ce,payload:N,paddingAngle:ue(h)*l}),M})}return g(g({},f),{},{sectors:_,data:o})});var qa=Zt({chartName:"PieChart",GraphicalChild:K,validateTooltipEventTypes:["item"],defaultTooltipEventType:"item",legendContent:"children",axisComponents:[{axisType:"angleAxis",AxisComp:Ce},{axisType:"radiusAxis",AxisComp:De}],formatAxisMap:Xt,defaultProps:{layout:"centric",startAngle:0,endAngle:360,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}});const Ha={阿里云:"#ff6a00",aliyun:"#ff6a00",AWS:"#ff9900",aws:"#ff9900",腾讯云:"#006eff",tencent:"#006eff",华为云:"#ff0000",huawei:"#ff0000",Azure:"#0078d4",azure:"#0078d4"},st=["#ff6a00","#ff9900","#006eff","#ff0000","#0078d4","#10b981","#a855f7","#ec4899"];function Dt(a){if(!a||a.length<2)return{pct:0,label:"暂无数据",direction:"neutral"};const s=Number(a[a.length-1].cost??0),r=Number(a[a.length-2].cost??0);if(r===0)return{pct:0,label:s>0?"新增费用":"持平",direction:"neutral"};const e=(s-r)/r*100,o=e>.05?"up":e<-.05?"down":"neutral",n=`${e>0?"+":""}${e.toFixed(1)}% 较上月`;return{pct:e,label:n,direction:o}}function Wa(a,s,r,e=24){const o=[];for(let n=e-1;n>=0;n--){const c=new Date(Date.now()-n*60*60*1e3);o.push({time:`${c.getHours().toString().padStart(2,"0")}:00`,cpu:Number(Math.max(0,Math.min(100,a+(Math.random()-.5)*15)).toFixed(1)),memory:Number(Math.max(0,Math.min(100,s+(Math.random()-.5)*10)).toFixed(1)),disk:Number(Math.max(0,Math.min(100,r+(Math.random()-.5)*5)).toFixed(1))})}return o}function Ga(a,s){if(!a||a.length===0)return[];const r={};for(const e of a){const o=e.timestamp;if(!o)continue;const c=`${new Date(o).getHours().toString().padStart(2,"0")}:00`;r[c]||(r[c]={}),e.name==="cpu"&&(r[c].cpu=Number(e.value)||0),e.name==="memory"&&(r[c].memory=Number(e.value)||0)}return Object.entries(r).sort((e,o)=>e[0].localeCompare(o[0])).map(([e,o])=>({time:e,cpu:Number((o.cpu??0).toFixed(1)),memory:Number((o.memory??0).toFixed(1)),disk:Number(s.toFixed(1))}))}function $e({active:a,payload:s,label:r}){return!a||!s?null:t.jsxs("div",{"code-path":"src/components/dashboard/DashboardCharts.tsx:94:5",className:"chart-tooltip px-3 py-2",children:[t.jsx("p",{"code-path":"src/components/dashboard/DashboardCharts.tsx:95:7",className:"text-xs font-medium mb-1.5",style:{color:"var(--dg-text-secondary)"},children:r}),s.map((e,o)=>t.jsxs("div",{"code-path":"src/components/dashboard/DashboardCharts.tsx:97:9",className:"flex items-center gap-2 text-xs",children:[t.jsx("span",{"code-path":"src/components/dashboard/DashboardCharts.tsx:98:11",className:"w-2 h-2 rounded-full",style:{backgroundColor:e.color}}),t.jsxs("span",{"code-path":"src/components/dashboard/DashboardCharts.tsx:99:11",style:{color:"var(--dg-text-muted)"},children:[e.name,":"]}),t.jsx("span",{"code-path":"src/components/dashboard/DashboardCharts.tsx:100:11",className:"font-medium",style:{color:"var(--dg-text-primary)"},children:typeof e.value=="number"?`${e.value}%`:e.value})]},o))]})}function Za({costStats:a}){const s=a?.cloud_costs??[],r=a?.month_trend??[],e=s.map((d,l)=>({name:d.cloud,value:d.cost,color:Ha[d.cloud]||st[l%st.length]})),o=r.map(d=>({month:d.month,cost:d.cost})),n=a?.total_cost??e.reduce((d,l)=>d+l.value,0),c=Dt(r);return t.jsxs(I,{"code-path":"src/components/dashboard/DashboardCharts.tsx:123:5",className:"dg-card dg-card-hover",children:[t.jsx(z,{"code-path":"src/components/dashboard/DashboardCharts.tsx:124:7",className:"pb-2",children:t.jsxs("div",{"code-path":"src/components/dashboard/DashboardCharts.tsx:125:9",className:"flex items-center justify-between",children:[t.jsxs("div",{"code-path":"src/components/dashboard/DashboardCharts.tsx:126:11",children:[t.jsx(V,{"code-path":"src/components/dashboard/DashboardCharts.tsx:127:13",className:"text-[var(--dg-text-primary)]",children:"云成本概览"}),t.jsx(q,{"code-path":"src/components/dashboard/DashboardCharts.tsx:128:13",className:"text-[var(--dg-text-muted)]",children:"本月各云平台费用支出"})]}),t.jsxs("div",{"code-path":"src/components/dashboard/DashboardCharts.tsx:130:11",className:"text-right",children:[t.jsxs("p",{"code-path":"src/components/dashboard/DashboardCharts.tsx:131:13",className:"text-2xl font-bold text-[var(--dg-text-primary)] tracking-tight",children:["¥",Number(n).toLocaleString()]}),t.jsx("p",{"code-path":"src/components/dashboard/DashboardCharts.tsx:134:13",className:m("text-xs Line truncated