feat(q1): 前端类型安全治理完成 — any 83→40, P0 全部 done
- types/monitor.ts: 新增 6 个运行时记录类型(AlertEventRecord/AlertRuleRecord/ AgentHostRecord/CronJobRecord/CertExpiryRecord/ApprovalWorkflowStepRecord) - types/common.ts: 新增 OptionItem 通用下拉类型 - 组件级 any 清理 43 处: - AlertEventsTab/AlertRulesTab/AlertChannelDialog/alertShared (19处) - AuditOperationsTab normalizeLog + 筛选器 (8处) - CronJobManager 任务列表/编辑/操作 (6处) - AgentMonitor 主机列表/命令执行 (5处) - DashboardRecent 5 张卡片组件 (5处) - AlertManager 状态类型对齐 (联动修复) - Dashboard.tsx 调用端类型对齐 (联动修复) - AlertChannel 接口新增 test_status 字段 - ESLint any: 83→40 (<50 目标达成) - tsc -b / tsc --noEmit: 零错误 - npm run build: ✓ built in 17.11s - 9/9 核心 API 回归通过
This commit is contained in:
1 parent
0535f30c87
commit
bb2b91ebe0
15 files changed
+259
-93
No files matched your search
@@ -13,8 +13,14 @@ import {
|
||||
ServerStatusCard,
|
||||
KubernetesClusterCard,
|
||||
} from './DashboardRecent';
|
||||
import type {
|
||||
DashboardRelease,
|
||||
DashboardServer,
|
||||
DashboardCluster,
|
||||
} from './DashboardRecent';
|
||||
import { SkeletonDashboard } from '@/components/layout/SkeletonCard';
|
||||
import type { JsonData } from '@/types/common';
|
||||
import type { AlertEventRecord, CertExpiryRecord } from '@/types';
|
||||
|
||||
/**
|
||||
* Dashboard - 优化后的仪表盘页面
|
||||
@@ -32,11 +38,11 @@ export function Dashboard() {
|
||||
const [initialLoading, setInitialLoading] = useState(true);
|
||||
const [refreshing, setRefreshing] = useState(false);
|
||||
const [stats, setStats] = useState<JsonData>(null);
|
||||
const [servers, setServers] = useState<JsonData[]>([]);
|
||||
const [clusters, setClusters] = useState<JsonData[]>([]);
|
||||
const [alerts, setAlerts] = useState<JsonData[]>([]);
|
||||
const [releases, setReleases] = useState<JsonData[]>([]);
|
||||
const [expCerts, setExpCerts] = useState<JsonData[]>([]);
|
||||
const [servers, setServers] = useState<DashboardServer[]>([]);
|
||||
const [clusters, setClusters] = useState<DashboardCluster[]>([]);
|
||||
const [alerts, setAlerts] = useState<AlertEventRecord[]>([]);
|
||||
const [releases, setReleases] = useState<DashboardRelease[]>([]);
|
||||
const [expCerts, setExpCerts] = useState<CertExpiryRecord[]>([]);
|
||||
const [metrics, setMetrics] = useState<JsonData[]>([]);
|
||||
|
||||
const refreshData = useCallback(async () => {
|
||||
|
||||
@@ -13,6 +13,38 @@ import {
|
||||
Circle,
|
||||
} from 'lucide-react';
|
||||
import { cn } from '@/lib/utils';
|
||||
import type { AlertEventRecord, CertExpiryRecord } from '@/types';
|
||||
|
||||
/** 仪表盘卡片数据类型 — 与 Dashboard API 响应对齐 */
|
||||
export interface DashboardRelease {
|
||||
id: number | string;
|
||||
status: string;
|
||||
app_name: string;
|
||||
version: string;
|
||||
environment?: string;
|
||||
commit_id?: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
export interface DashboardServer {
|
||||
id: number | string;
|
||||
status: string;
|
||||
hostname?: string;
|
||||
ip?: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
export interface DashboardCluster {
|
||||
id: number | string;
|
||||
code?: string;
|
||||
name: string;
|
||||
status: string;
|
||||
cpu_usage?: number;
|
||||
memory_usage?: number;
|
||||
node_count?: number;
|
||||
pod_count?: number;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* DashboardRecent - 优化后的仪表盘底部卡片组件
|
||||
@@ -56,7 +88,7 @@ function SeverityBadge({ severity }: { severity: string }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function AlertMessagesCard({ alerts }: { alerts: any[] }) {
|
||||
export function AlertMessagesCard({ alerts }: { alerts: AlertEventRecord[] }) {
|
||||
const navigate = useNavigate();
|
||||
const recentAlerts = alerts.filter((a) => a.status === 'firing').slice(0, 8);
|
||||
|
||||
@@ -119,7 +151,7 @@ export function AlertMessagesCard({ alerts }: { alerts: any[] }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function CertificateExpiryCard({ expCerts }: { expCerts: any[] }) {
|
||||
export function CertificateExpiryCard({ expCerts }: { expCerts: CertExpiryRecord[] }) {
|
||||
const expiringDomains = (expCerts ?? [])
|
||||
.map((d) => ({
|
||||
...d,
|
||||
@@ -209,7 +241,7 @@ export function CertificateExpiryCard({ expCerts }: { expCerts: any[] }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function ReleaseHistoryCard({ releases }: { releases: any[] }) {
|
||||
export function ReleaseHistoryCard({ releases }: { releases: DashboardRelease[] }) {
|
||||
const navigate = useNavigate();
|
||||
const releaseList = releases?.slice(0, 5) ?? [];
|
||||
|
||||
@@ -299,7 +331,7 @@ export function ReleaseHistoryCard({ releases }: { releases: any[] }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function ServerStatusCard({ servers }: { servers: any[] }) {
|
||||
export function ServerStatusCard({ servers }: { servers: DashboardServer[] }) {
|
||||
const navigate = useNavigate();
|
||||
const runningServers = servers.filter((s) => s.status === 'running').length;
|
||||
const stoppedServers = servers.filter((s) => s.status === 'stopped').length;
|
||||
@@ -382,7 +414,7 @@ export function ServerStatusCard({ servers }: { servers: any[] }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function KubernetesClusterCard({ clusters }: { clusters: any[] }) {
|
||||
export function KubernetesClusterCard({ clusters }: { clusters: DashboardCluster[] }) {
|
||||
const navigate = useNavigate();
|
||||
|
||||
return (
|
||||
|
||||
Reference in new issue
Block a user