"use client" import { useState } from "react" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Input } from "@/components/ui/input" import { GitBranch, Search, ZoomIn, ZoomOut, Maximize2, Database, Table, ArrowRight, Filter, Download, } from "lucide-react" // 第二部分:数据接入 - 数据血缘 export default function DataLineagePage() { const [searchQuery, setSearchQuery] = useState("") const [selectedNode, setSelectedNode] = useState(null) // 数据血缘节点 const lineageNodes = [ // 数据源层 { id: "source-1", type: "source", name: "存客宝-MySQL", level: 0, x: 50, y: 100 }, { id: "source-2", type: "source", name: "触客宝-MySQL", level: 0, x: 50, y: 200 }, { id: "source-3", type: "source", name: "数智员工-API", level: 0, x: 50, y: 300 }, // 原始表层 { id: "raw-1", type: "table", name: "raw_users", level: 1, x: 250, y: 100 }, { id: "raw-2", type: "table", name: "raw_transactions", level: 1, x: 250, y: 200 }, { id: "raw-3", type: "table", name: "raw_behaviors", level: 1, x: 250, y: 300 }, // 清洗层 { id: "clean-1", type: "table", name: "clean_users", level: 2, x: 450, y: 150 }, { id: "clean-2", type: "table", name: "clean_transactions", level: 2, x: 450, y: 250 }, // 标签层 { id: "tag-1", type: "table", name: "user_tags", level: 3, x: 650, y: 150 }, { id: "tag-2", type: "table", name: "user_portraits", level: 3, x: 650, y: 250 }, // 输出层 { id: "output-1", type: "output", name: "流量包-高价值用户", level: 4, x: 850, y: 150 }, { id: "output-2", type: "output", name: "API-用户画像", level: 4, x: 850, y: 250 }, ] // 血缘关系 const lineageEdges = [ { from: "source-1", to: "raw-1" }, { from: "source-1", to: "raw-2" }, { from: "source-2", to: "raw-3" }, { from: "source-3", to: "raw-1" }, { from: "raw-1", to: "clean-1" }, { from: "raw-2", to: "clean-2" }, { from: "raw-3", to: "clean-1" }, { from: "clean-1", to: "tag-1" }, { from: "clean-2", to: "tag-1" }, { from: "clean-1", to: "tag-2" }, { from: "tag-1", to: "output-1" }, { from: "tag-2", to: "output-2" }, ] const getNodeColor = (type: string) => { switch (type) { case "source": return "bg-blue-100 border-blue-300 text-blue-700" case "table": return "bg-green-100 border-green-300 text-green-700" case "output": return "bg-purple-100 border-purple-300 text-purple-700" default: return "bg-gray-100 border-gray-300 text-gray-700" } } const getNodeIcon = (type: string) => { switch (type) { case "source": return case "table": return case "output": return default: return } } return (
{/* 顶部标题 */}

数据血缘

可视化展示数据从源头到输出的完整流转路径

setSearchQuery(e.target.value)} className="pl-9 w-64 bg-white" />
{/* 图例 */}
数据源
数据表
输出服务
{/* 血缘图 */}
血缘关系图
{/* SVG连线 */} {lineageEdges.map((edge, index) => { const fromNode = lineageNodes.find((n) => n.id === edge.from) const toNode = lineageNodes.find((n) => n.id === edge.to) if (!fromNode || !toNode) return null return ( ) })} {/* 节点 */} {lineageNodes.map((node) => (
setSelectedNode(node.id)} >
{getNodeIcon(node.type)} {node.name}
))} {/* 层级标签 */} {[ { label: "数据源", x: 50 }, { label: "原始层", x: 250 }, { label: "清洗层", x: 450 }, { label: "标签层", x: 650 }, { label: "输出层", x: 850 }, ].map((level, index) => (
{level.label}
))}
{/* 节点详情 */} {selectedNode && ( 节点详情 - {lineageNodes.find((n) => n.id === selectedNode)?.name}

上游依赖

{lineageEdges .filter((e) => e.to === selectedNode) .map((edge, index) => ( {lineageNodes.find((n) => n.id === edge.from)?.name} ))} {lineageEdges.filter((e) => e.to === selectedNode).length === 0 && ( 无上游依赖 )}

下游影响

{lineageEdges .filter((e) => e.from === selectedNode) .map((edge, index) => ( {lineageNodes.find((n) => n.id === edge.to)?.name} ))} {lineageEdges.filter((e) => e.from === selectedNode).length === 0 && ( 无下游影响 )}

更新信息

最后更新:2分钟前

记录数:1,234,567

)}
) }