feat: 新增日志中心、功能优化与代码重构

- 新增 log_datasource.go / log_proxy.go / user_api_token.go 后端控制器
- 新增 log_datasource.go model
- 新增 monitor/log-center.ts API 模块
- 新增 LogCenter 前端组件及页面
- 重构 deployment 相关组件 (HPDA/UpdateImageModal/bundle-yaml 等)
- 新增 ResetPasswordDialog / code-snippet-block / copy-button 等 UI 组件
- 重构多个 k8s 相关组件 (TopologyView/ResourceVisualEditor/PodFileBrowser 等)
- 更新多个 API 和工具函数 (auth.ts/monitor/index.ts/request.ts 等)
- 更新静态资源 (index.html + 新 JS/CSS bundle)
- 删除废弃静态资源文件
This commit is contained in:
Logan committed 2026-06-26 23:18:05 +08:00
1 parent 5ca0e6d83a
commit 8d46e8f352
197 files changed
+5014 -815

No files matched your search

@@ -33,12 +33,15 @@ export function AlertRuleDialog({
editingRule,
notifyChannels,
onSaved,
defaultType = 'metric',
}: {
open: boolean;
onOpenChange: (open: boolean) => void;
editingRule: any;
notifyChannels: any[];
onSaved: () => void;
/** 新建时默认规则类型 // Logan.Li */
defaultType?: 'metric' | 'log' | 'event';
}) {
const [ruleForm, setRuleForm] = useState({ ...emptyRuleForm });
const [ruleSaving, setRuleSaving] = useState(false);
@@ -58,9 +61,13 @@ export function AlertRuleDialog({
notify_channels: parseChannels(editingRule.notify_channels),
});
} else {
setRuleForm({ ...emptyRuleForm });
const base = { ...emptyRuleForm, type: defaultType };
if (defaultType === 'log') {
base.source = 'loki';
}
setRuleForm(base);
}
}, [open, editingRule]);
}, [open, editingRule, defaultType]);
const toggleNotifyChannel = (channel: string) => {
setRuleForm((prev) => ({
@@ -138,7 +145,11 @@ export function AlertRuleDialog({
<Label className="text-slate-300">规则类型</Label>
<select
value={ruleForm.type}
onChange={(e) => setRuleForm({ ...ruleForm, type: e.target.value })}
onChange={(e) => {
const type = e.target.value;
const source = type === 'log' ? 'loki' : 'prometheus';
setRuleForm({ ...ruleForm, type, source });
}}
className="w-full h-9 px-3 rounded-md bg-slate-800/50 border border-slate-700 text-slate-200 text-sm"
>
<option value="metric">指标监控</option>
@@ -153,9 +164,18 @@ export function AlertRuleDialog({
onChange={(e) => setRuleForm({ ...ruleForm, source: e.target.value })}
className="w-full h-9 px-3 rounded-md bg-slate-800/50 border border-slate-700 text-slate-200 text-sm"
>
<option value="prometheus">Prometheus</option>
<option value="zabbix">Zabbix</option>
<option value="custom">自定义</option>
{ruleForm.type === 'log' ? (
<>
<option value="loki">Loki</option>
<option value="elasticsearch">Elasticsearch</option>
</>
) : (
<>
<option value="prometheus">Prometheus</option>
<option value="zabbix">Zabbix</option>
<option value="custom">自定义</option>
</>
)}
</select>
</div>
</div>
@@ -165,10 +185,14 @@ export function AlertRuleDialog({
<Input
value={ruleForm.expression}
onChange={(e) => setRuleForm({ ...ruleForm, expression: e.target.value })}
placeholder="如:cpu_usage > 80"
placeholder={ruleForm.type === 'log' ? '{app="api"} |= "error"' : 'cpu_usage > 80'}
className="bg-slate-800/50 border-slate-700 text-slate-200 placeholder:text-slate-600 font-mono text-sm"
/>
<p className="text-xs text-slate-600">PromQL 或指标表达式,例如 cpu_usage &gt; 80</p>
<p className="text-xs text-slate-600">
{ruleForm.type === 'log'
? (ruleForm.source === 'loki' ? 'LogQL 查询或 count_over_time 表达式' : 'Elasticsearch Lucene 查询')
: 'PromQL 或指标表达式,例如 cpu_usage > 80'}
</p>
</div>
<div className="grid grid-cols-2 gap-3">