feat: 定时任务编辑入口全栈打通 + 修复ApprovalFlow编译错误 + 完成大文件拆分重构

- CronJobManager: 编辑按钮接通 onClick → openEdit(job),弹出编辑对话框预填数据,
  复用新建/编辑共用 Dialog(editingId 区分模式),标题/按钮文案动态切换,
  保存时根据 editingId 调用 createJob 或 updateJob — 消除占位按钮
- ApprovalFlow: 修复 API 方法名不匹配导致 tsc -b 编译失败
  (getInstances→getProcesses, getMyApprovals→getProcesses({status:'pending'}),
   approveInstance→approveProcess, rejectInstance→rejectProcess)
  + 添加 ApprovalFlowManager 导出别名兼容 App.tsx 导入
- 合并已完成的大文件拆分重构: automation.go→automation_cron/script/playbook,
  ldap.go→ldap_ou/ldap_users, server.go→cloud_accounts/domain/platform/region,
  user.go→user_admin; 前端 Dashboard/K8s/Server/Approval/Monitor 子组件拆分
  // Logan.Li
This commit is contained in:
attacker committed 2026-06-15 01:09:49 +08:00
1 parent 8be63ac168
commit a7e2351ad2
37 files changed
+7374 -4891

No files matched your search

@@ -0,0 +1,70 @@
import { Card, CardContent } from '@/components/ui/card';
import { TrendingUp, TrendingDown } from 'lucide-react';
// 统计卡片组件
export function StatCard({
title,
value,
description,
icon: Icon,
trend,
trendValue,
color,
onClick,
}: {
title: string;
value: string | number;
description?: string;
icon: React.ElementType;
trend?: 'up' | 'down' | 'neutral';
trendValue?: string;
color: string;
onClick?: () => void;
}) {
const colorClasses: Record<string, { bg: string; text: string }> = {
blue: { bg: 'bg-blue-500/10', text: 'text-blue-400' },
emerald: { bg: 'bg-emerald-500/10', text: 'text-emerald-400' },
amber: { bg: 'bg-amber-500/10', text: 'text-amber-400' },
rose: { bg: 'bg-rose-500/10', text: 'text-rose-400' },
purple: { bg: 'bg-purple-500/10', text: 'text-purple-400' },
cyan: { bg: 'bg-cyan-500/10', text: 'text-cyan-400' },
orange: { bg: 'bg-orange-500/10', text: 'text-orange-400' },
};
const colors = colorClasses[color];
return (
<Card
className="bg-slate-900 border-slate-800 hover:border-slate-700 transition-all cursor-pointer"
onClick={onClick}
>
<CardContent className="p-6">
<div className="flex items-start justify-between">
<div className="space-y-2">
<p className="text-sm font-medium text-slate-400">{title}</p>
<div className="flex items-baseline gap-2">
<h3 className="text-2xl font-bold text-slate-100">{value}</h3>
{trend && trendValue && (
<span
className={`flex items-center text-xs font-medium ${
trend === 'up' ? 'text-emerald-400' : trend === 'down' ? 'text-red-400' : 'text-slate-400'
}`}
>
{trend === 'up' ? (
<TrendingUp className="h-3 w-3 mr-0.5" />
) : trend === 'down' ? (
<TrendingDown className="h-3 w-3 mr-0.5" />
) : null}
{trendValue}
</span>
)}
</div>
{description && <p className="text-xs text-slate-500">{description}</p>}
</div>
<div className={`p-3 rounded-lg ${colors.bg} ${colors.text}`}>
<Icon className="h-5 w-5" />
</div>
</div>
</CardContent>
</Card>
);
}